From 9117d556c2773e1c2cc29de37b871031f0a93c76 Mon Sep 17 00:00:00 2001 From: Itamea <63111187+Itamea@users.noreply.github.com> Date: Mon, 22 Jun 2020 00:51:24 +0200 Subject: [PATCH 01/38] Started Translation to Swedish Translated until line 667 --- translations/base-sv.yaml | 580 +++++++++++++++++++------------------- 1 file changed, 290 insertions(+), 290 deletions(-) diff --git a/translations/base-sv.yaml b/translations/base-sv.yaml index 8ce591dd..c3f697b4 100644 --- a/translations/base-sv.yaml +++ b/translations/base-sv.yaml @@ -21,7 +21,7 @@ steamPage: # This is the short text appearing on the steam page - shortText: shapez.io is a game about building factories to automate the creation and combination of increasingly complex shapes within an infinite map. + shortText: shapez.io är ett spel som går ut på att automatisera skapandet av former med ökande komplexitet inom den oändligt stora världen. # This is the long description for the steam page - It is contained here so you can help to translate it, and I will regulary update the store page. # NOTICE: @@ -30,49 +30,49 @@ steamPage: longText: >- [img]{STEAM_APP_IMAGE}/extras/store_page_gif.gif[/img] - shapez.io is a game about building factories to automate the creation and combination of shapes. Deliver the requested, increasingly complex shapes to progress within the game and unlock upgrades to speed up your factory. + shapez.io är ett spel som går ut på att automatisera skapandet av former. Leverera de efterfrågade, alltmer komplexa formerna för att utvecklas genom spelet och skaffa uppgraderingar för att öka hastigheten i fabriken. - Since the demand raises you will have to scale up your factory to fit the needs - Don't forget about resources though, you will have to expand in the [b]infinite map[/b]! + Eftersom efterfrågan ökar behöver du bygga ut fabriken för att möta behoven - Glöm bara inte bort resurserna, du kommer behöva expadera fabriken över den [b]oändligt stora världen[/b]! - Since shapes can get boring soon you need to mix colors and paint your shapes with it - Combine red, green and blue color resources to produce different colors and paint shapes with it to satisfy the demand. + Eftersom former kan bli tråkiga kommer du behöva blanda färger och måla dina former med dem - Kombinera röd, grön, och blå för att producera olika färger och måla former med dem för att tillfredställa efterfrågan. - This game features 18 levels (Which should keep you busy for hours already!) but I'm constantly adding new content - There is a lot planned! + Detta spel innehåller just nu 18 nivåer (Vilket borde hålla dig upptagen i några timmar!) men jag lägger konstant till fler saker - Det finns mycket planerat! - [b]Standalone Advantages[/b] + [b]Fristående Fördelar[/b] [list] [*] Waypoints - [*] Unlimited Savegames - [*] Dark Mode - [*] More settings - [*] Allow me to further develop shapez.io ❤️ - [*] More features in the future! + [*] Oändligt antal sparfiler + [*] Mörkt tema + [*] Fler inställningar + [*] Tillåter mig att vidare utveckla shapez.io ❤️ + [*] Fler funktioner i framtiden! [/list] - [b]Planned features & Community suggestions[/b] + [b]Planerade tillägg & Gruppförslag[/b] - This game is open source - Anybody can contribute! Besides of that, I listen [b]a lot[/b] to the community! I try to read all suggestions and take as much feedback into account as possible. + Detta spel är open source - Vem som helst kan hjälpa! Förutom det lyssnar jag [b]ofta[/b] på min community! Jag försöker läsa alla förslag och ta till mig så mycket feedback som möjligt. [list] - [*] Story mode where buildings cost shapes - [*] More levels & buildings (standalone exclusive) - [*] Different maps, and maybe map obstacles - [*] Configurable map creation (Edit number and size of patches, seed, and more) - [*] More types of shapes - [*] More performance improvements (Although the game already runs pretty good!) - [*] Color blind mode - [*] And much more! + [*] Story mode däri byggnader kostar former + [*] Fler nivåer & och byggnader (exklusivt för den fristående versionen) + [*] Olika världar, och kanske världshinder + [*] Konfigurerbar världskapande (Ändra antal och storlek på resursfläckar, seed, med mera) + [*] Fler sorters former + [*] Fler prestandaförbättringar (Även om spelet redan spelar ganska väl!) + [*] Färgblint läge + [*] Och mycket mer! [/list] - Be sure to check out my trello board for the full roadmap! https://trello.com/b/ISQncpJP/shapezio + Se till att kolla min trello för en full framtidskarta! https://trello.com/b/ISQncpJP/shapezio global: - loading: Loading + loading: Laddar error: Error # How big numbers are rendered, e.g. "10,000" - thousandsDivider: "," + thousandsDivider: "." # The suffix for large numbers, e.g. 1.3k, 400.2M, etc. suffix: @@ -86,21 +86,21 @@ global: time: # Used for formatting past time dates - oneSecondAgo: one second ago - xSecondsAgo: seconds ago - oneMinuteAgo: one minute ago - xMinutesAgo: minutes ago - oneHourAgo: one hour ago - xHoursAgo: hours ago - oneDayAgo: one day ago - xDaysAgo: days ago + oneSecondAgo: för en sekund sedan + xSecondsAgo: för sekunder sedan + oneMinuteAgo: för en minut sedan + xMinutesAgo: för minuter sedan + oneHourAgo: för en timme sedan + xHoursAgo: för timmar sedan + oneDayAgo: för en dag sedan + xDaysAgo: för dagar sedan # Short formats for times, e.g. '5h 23m' secondsShort: s minutesAndSecondsShort: m s - hoursAndMinutesShort: h s + hoursAndMinutesShort: t s - xMinutes: minutes + xMinutes: minuter keys: tab: TAB @@ -108,229 +108,229 @@ global: alt: ALT escape: ESC shift: SHIFT - space: SPACE + space: MELLANSLAG demoBanners: # This is the "advertisement" shown in the main menu and other various places title: Demo Version intro: >- - Get the standalone to unlock all features! + Skaffa den fristående versionen för att låsa upp alla funktioner! mainMenu: - play: Play + play: Spela changelog: Changelog - importSavegame: Import - openSourceHint: This game is open source! - discordLink: Official Discord Server - helpTranslate: Help translate! + importSavegame: Importera + openSourceHint: Detta spel är open source! + discordLink: Officiell Discord Server + helpTranslate: Hjälp till att översätta! # This is shown when using firefox and other browsers which are not supported. browserWarning: >- - Sorry, but the game is known to run slow on your browser! Get the standalone version or download chrome for the full experience. + Förlåt, men det är känt att spelet spelar långsamt på din browser! Skaffa den fristående versionen eller ladda ner chrome för den fulla upplevelsen. - savegameLevel: Level - savegameLevelUnknown: Unknown Level + savegameLevel: Nivå + savegameLevelUnknown: Okänd Nivå contests: contest_01_03062020: - title: "Contest #01" - desc: Win $25 for the coolest base! + title: "Tävling #01" + desc: Vinn $25 för den coolaste fabriken! longDesc: >- - To give something back to you, I thought it would be cool to make weekly contests! + För att ge något åter till dig, tänkte jag att det skulle vara coolt att skapa veckovisa tävlingar!

- This weeks topic: Build the coolest base! + Denna veckas tema: Bygg den coolaste fabriken!

- Here's the deal:
+ Så här går det till:
    -
  • Submit a screenshot of your base to contest@shapez.io
  • -
  • Bonus points if you share it on social media!
  • -
  • I will choose 5 screenshots and propose it to the discord community to vote.
  • -
  • The winner gets $25 (Paypal, Amazon Gift Card, whatever you prefer)
  • +
  • Skicka in en skärmdump av din fabrik till contest@shapez.io
  • +
  • Bonuspoäng om du delar den på sociala medier!
  • +
  • Jag kommer välja 5 skärmdumpar och framföra dem tilldiscordgruppen och låta dem rösta.
  • +
  • Vinnaren får $25 (Paypal, Amazon Gift Card, Vilket du än föredrar)
  • Deadline: 07.06.2020 12:00 AM CEST

- I'm looking forward to seeing your awesome creations! + Jag ser fram emot att se era grymma skapelser! - showInfo: View - contestOver: This contest has ended - Join the discord to get noticed about new contests! - continue: Continue - newGame: New Game - madeBy: Made by + showInfo: Se + contestOver: Tävlingen är avslutad - Gå med i discordservern för att bli notifierad kring nya tävlingar! + continue: Fortsätt + newGame: Nytt spel + madeBy: Skapad av dialogs: buttons: ok: OK - delete: Delete + delete: Radera cancel: Cancel - later: Later - restart: Restart - reset: Reset - getStandalone: Get Standalone - deleteGame: I know what I do - viewUpdate: View Update - showUpgrades: Show Upgrades - showKeybindings: Show Keybindings + later: Senare + restart: Starta om + reset: Återställ + getStandalone: Skaffa fristående + deleteGame: Jag vet vad jag måste göra + viewUpdate: Se uppdateringar + showUpgrades: Visa uppgraderingar + showKeybindings: Visa tangentbindingar importSavegameError: - title: Import Error + title: Importfel text: >- - Failed to import your savegame: + Kunde inte importera sparfil: importSavegameSuccess: - title: Savegame Imported + title: Sparfil importerad text: >- - Your savegame has been successfully imported. + Din sparfil har blivit importerad. gameLoadFailure: - title: Game is broken + title: Spel är brutet text: >- - Failed to load your savegame: + Kunde inte ladda sparfil: confirmSavegameDelete: - title: Confirm deletion + title: Bekräfta radering text: >- - Are you sure you want to delete the game? + Är du säker på att du vill radera spelet? savegameDeletionError: - title: Failed to delete + title: Kunde inte radera text: >- - Failed to delete the savegame: + Kunde inte radera sparfil: restartRequired: - title: Restart required + title: Omstart krävs text: >- - You need to restart the game to apply the settings. + Du behöver starta om spelet för att applicera inställningar. editKeybinding: - title: Change Keybinding - desc: Press the key or mouse button you want to assign, or escape to cancel. + title: Ändra tangentbindningar + desc: Tryck ned tangenten eller musknappen du vill tillsätta, eller escape för att avbryta. resetKeybindingsConfirmation: - title: Reset keybindings - desc: This will reset all keybindings to their default values. Please confirm. + title: Återställ tangentbindningar + desc: Detta kommer att återställa alla tangentbindningar till deras standardtangenter. Var snäll och bekräfta. keybindingsResetOk: - title: Keybindings reset - desc: The keybindings have been reset to their respective defaults! + title: Återställning av tangentbindningar + desc: Tangentbindningar har återställts! featureRestriction: - title: Demo Version - desc: You tried to access a feature () which is not available in the demo. Consider to get the standalone for the full experience! + title: Demoversion + desc: Du försökte nå en funktion () som inte är tillgänglig i demversionen. Överväg att skaffa den fristående versionen för den fulla upplevelsen! oneSavegameLimit: - title: Limited savegames - desc: You can only have one savegame at a time in the demo version. Please remove the existing one or get the standalone! + title: Limiterad mängd sparfiler + desc: Du kan bara ha en sparfil åt gången i demoversionen. Var snäll och ta bort det existerande eller skaffa den fristående versionen! updateSummary: - title: New update! + title: Ny uppdatering! desc: >- - Here are the changes since you last played: + Här är ändringarna sen du sist spelade: upgradesIntroduction: - title: Unlock Upgrades + title: Lås upp Uppgraderingar desc: >- - All shapes you produce can be used to unlock upgrades - Don't destroy your old factories! - The upgrades tab can be found on the top right corner of the screen. + Alla former du producerar kan användas för att låsa upp uppgraderingar - Förstör inte dina gamla fabriker! + Uppgraderingsmenyn kan finnas i det övre högra hörnet på skärmen. massDeleteConfirm: - title: Confirm delete + title: Bekräfta borttagning desc: >- - You are deleting a lot of buildings ( to be exact)! Are you sure you want to do this? + Du tar nu bort ganska många byggnader ( för att vara exakt)! Är du säker på att du vill göra detta? blueprintsNotUnlocked: - title: Not unlocked yet + title: Inte än upplåst desc: >- - Blueprints have not been unlocked yet! Complete more levels to unlock them. + Ritningar är inte än upplåsta! Klara fler nivåer för att låsa upp dem. keybindingsIntroduction: - title: Useful keybindings + title: Användbara tangentbindningar desc: >- - This game has a lot of keybindings which make it easier to build big factories. - Here are a few, but be sure to check out the keybindings!

- CTRL + Drag: Select area to copy / delete.
- SHIFT: Hold to place multiple of one building.
- ALT: Invert orientation of placed belts.
+ Detta spel använder en stor mängd tangentbindningar so gör det lättare att bygga stora fabriker. + Här är några men se till att kolla in tangentbindningarna!

+ CTRL + Dra: Välj en yta att kopiera / radera.
+ SHIFT: Håll ned för att placera flera av samma byggnad.
+ ALT: Invertera orientationen av placerade rullband.
createMarker: - title: New Marker - desc: Give it a meaningful name, you can also include a short key of a shape (Which you can generate here) + title: Ny Markör + desc: Ge den ett meningsfullt namn, du kan också inkludera en kort kod av en form (Vilket du kan generera här ) markerDemoLimit: - desc: You can only create two custom markers in the demo. Get the standalone for unlimited markers! + desc: Du kan bara skapa två markörer i demoversionen. Skaffa den fristående versionen för ett oändligt antal! massCutConfirm: - title: Confirm cut + title: Bekräfta Klipp desc: >- - You are cutting a lot of buildings ( to be exact)! Are you sure you - want to do this? + Du klipper en stor mängd byggnader ( för att vara exakt)! + Är du säker på att du vill göra detta? exportScreenshotWarning: - title: Export screenshot + title: Exportera skärmdump desc: >- - You requested to export your base as a screenshot. Please note that this can - be quite slow for a big base and even crash your game! + Du efterfrågade att exportera din fabrik som en skärmdump. + Var snäll och notera att detta kan ta ett tag för en stor bas och i vissa fall till och med krascha ditt spel ingame: # This is shown in the top left corner and displays useful keybindings in # every situation keybindingsOverlay: - moveMap: Move - selectBuildings: Select area - stopPlacement: Stop placement - rotateBuilding: Rotate building - placeMultiple: Place multiple - reverseOrientation: Reverse orientation - disableAutoOrientation: Disable auto orientation + moveMap: Flytta + selectBuildings: Välj yta + stopPlacement: Avsluta placering + rotateBuilding: Rotera byggnader + placeMultiple: Placera flera + reverseOrientation: Vänd orientation + disableAutoOrientation: Stäng av automatisk orientation toggleHud: Toggle HUD - placeBuilding: Place building - createMarker: Create Marker - delete: Destroy - pasteLastBlueprint: Paste last blueprint - lockBeltDirection: Enable belt planner - plannerSwitchSide: Flip planner side + placeBuilding: Placera byggnad + createMarker: Skapa markör + delete: Förstör + pasteLastBlueprint: Infoga senaste ritningen + lockBeltDirection: Sätt på rullbandsplannerare + plannerSwitchSide: Vänd plannerarsida # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) buildingPlacement: # Buildings can have different variants which are unlocked at later levels, # and this is the hint shown when there are multiple variants available. - cycleBuildingVariants: Press to cycle variants. + cycleBuildingVariants: Tryck ned För att cykla igenom varianter. # Shows the hotkey in the ui, e.g. "Hotkey: Q" hotkeyLabel: >- Hotkey: infoTexts: - speed: Speed - range: Range - storage: Storage - oneItemPerSecond: 1 item / second - itemsPerSecond: items / s + speed: Hastighet + range: Räckvidd + storage: Förvaring + oneItemPerSecond: 1 obejekt / sekund + itemsPerSecond: obejekt / s itemsPerSecondDouble: (x2) - tiles: tiles + tiles: plattor # The notification when completing a level levelCompleteNotification: # is replaced by the actual level, so this gets 'Level 03' for example. - levelTitle: Level - completed: Completed - unlockText: Unlocked ! - buttonNextLevel: Next Level + levelTitle: Nivå + completed: Avklarad + unlockText: Upplåst ! + buttonNextLevel: Nästa Nivå # Notifications on the lower right notifications: - newUpgrade: A new upgrade is available! - gameSaved: Your game has been saved. + newUpgrade: En ny uppgradering är tillgänglig! + gameSaved: Ditt spel har sparats. # Mass select information, this is when you hold CTRL and then drag with your mouse # to select multiple buildings massSelect: - infoText: Press to cut, to copy, to remove and to cancel. + infoText: Tryck för att klippa, för att kopiera, för att ta bort och för att avbryta. # The "Upgrades" window shop: - title: Upgrades - buttonUnlock: Upgrade + title: Upgraderingar + buttonUnlock: Upgradera # Gets replaced to e.g. "Tier IX" tier: Tier @@ -338,333 +338,333 @@ ingame: # The roman number for each tier tierLabels: [I, II, III, IV, V, VI, VII, VIII, IX, X] - maximumLevel: MAXIMUM LEVEL (Speed x) + maximumLevel: MAXNIVÅ (Hastighet x) # The "Statistics" window statistics: - title: Statistics + title: Statistik dataSources: stored: - title: Stored - description: Displaying amount of stored shapes in your central building. + title: Förvarade + description: Visar mängd förvarade former i din centrala byggnad. produced: - title: Produced - description: Displaying all shapes your whole factory produces, including intermediate products. + title: Producerade + description: Visar alla former din fabrik producerar, detta inkluderar mellanhandsprodukter. delivered: - title: Delivered - description: Displaying shapes which are delivered to your central building. - noShapesProduced: No shapes have been produced so far. + title: Levererade + description: Visar former som levereras till din centrala byggnad. + noShapesProduced: Inga former har hitils producerats. # Displays the shapes per minute, e.g. '523 / m' shapesPerMinute: / m # Settings menu, when you press "ESC" settingsMenu: - playtime: Playtime + playtime: Speltid - buildingsPlaced: Buildings - beltsPlaced: Belts + buildingsPlaced: Byggnader + beltsPlaced: Rullband buttons: - continue: Continue - settings: Settings - menu: Return to menu + continue: Fortsätt + settings: Inställningar + menu: Återvänd till meny # Bottom left tutorial hints tutorialHints: - title: Need help? - showHint: Show hint - hideHint: Close + title: Behöver hjälp? + showHint: Visa tips + hideHint: Stäng # When placing a blueprint blueprintPlacer: - cost: Cost + cost: Kostnad # Map markers waypoints: - waypoints: Markers + waypoints: Markörer hub: HUB - description: Left-click a marker to jump to it, right-click to delete it.

Press to create a marker from the current view, or right-click to create a marker at the selected location. - creationSuccessNotification: Marker has been created. + description: Vänsterklicka en markör för att hoppa till den, högerklicka för att ta bort den.

Tryck för att skapa en markör från nuvarande position, eller högerklicka för att skapa en markör vid vald plats. + creationSuccessNotification: Markör har skapats. # Interactive tutorial interactiveTutorial: title: Tutorial hints: - 1_1_extractor: Place an extractor on top of a circle shape to extract it! + 1_1_extractor: Placera en extraktor över en cirkel för att extrahera den! 1_2_conveyor: >- - Connect the extractor with a conveyor belt to your hub!

Tip: Click and drag the belt with your mouse! + Koppla extraktorn med ettrullband till din hub!

Tips: Clicka och dra rullbandet med musen! 1_3_expand: >- - This is NOT an idle game! Build more extractors and belts to finish the goal quicker.

Tip: Hold SHIFT to place multiple extractors, and use R to rotate them. + Detta är INTE ett idle-spel! Bygg fler extraktörer för att klara målet snabbare.

Tips: Håll SHIFT för att placera flera extraktörer, och använd R för att rotera dem. # All shop upgrades shopUpgrades: belt: - name: Belts, Distributor & Tunnels - description: Speed x → x + name: Rullband, Distributörer & Tunnlar + description: hastighet x → x miner: - name: Extraction - description: Speed x → x + name: Extraktion + description: Hastighet x → x processors: - name: Cutting, Rotating & Stacking - description: Speed x → x + name: Klippning, Rotationg & Stapling + description: Hastighet x → x painting: - name: Mixing & Painting - description: Speed x → x + name: Blandning & Färgning + description: hastighet x → x # Buildings and their name / description buildings: belt: default: - name: &belt Conveyor Belt - description: Transports items, hold and drag to place multiple. + name: &belt Rullband + description: Transporterar obejekt, håll in och dra för att placera flera. miner: # Internal name for the Extractor default: - name: &miner Extractor - description: Place over a shape or color to extract it. + name: &miner Extraktor + description: Placera över en form eller färg för att extrahera den. chainable: - name: Extractor (Chain) - description: Place over a shape or color to extract it. Can be chained. + name: Extraktor (kedja) + description: Placera över en form eller färg för att extrahera den. Kan kedjas. underground_belt: # Internal name for the Tunnel default: name: &underground_belt Tunnel - description: Allows to tunnel resources under buildings and belts. + description: Låter dig tunnla under byggnader och rullband. tier2: name: Tunnel Tier II - description: Allows to tunnel resources under buildings and belts. + description: Låter dig tunnla resurser under byggnader och rullband. splitter: # Internal name for the Balancer default: - name: &splitter Balancer - description: Multifunctional - Evenly distributes all inputs onto all outputs. + name: &splitter balancer + description: Multifunktionell - Distribuerar alla inputs och outputs jämt. compact: - name: Merger (compact) - description: Merges two conveyor belts into one. + name: Sammanslagare (kompakt) + description: Slår ihop två rullband till ett. compact-inverse: - name: Merger (compact) - description: Merges two conveyor belts into one. + name: Sammanslagare (kompakt) + description: Slår ihop två rullband till ett. cutter: default: - name: &cutter Cutter - description: Cuts shapes from top to bottom and outputs both halfs. If you use only one part, be sure to destroy the other part or it will stall! + name: &cutter Klippare + description: Klipper former från topp till botten och outputtar båda halver.Om du bara använder en halva, se till att förstöra den andra, annars kommer den uppehålla fabrkien! quad: - name: Cutter (Quad) - description: Cuts shapes into four parts. If you use only one part, be sure to destroy the other part or it will stall! + name: Klippare (Quad) + description: Klipper former i fyra delar. Om du bara använder en del, se till att förstöra de andra, annars kommer de uppehålla fabrkien! rotater: default: - name: &rotater Rotate - description: Rotates shapes clockwise by 90 degrees. + name: &rotater Rotatör + description: Roterar former 90 grader. ccw: - name: Rotate (CCW) - description: Rotates shapes counter clockwise by 90 degrees. + name: Rotatör (CCW) + description: Roterar former 90 motsols. stacker: default: - name: &stacker Stacker - description: Stacks both items. If they can not be merged, the right item is placed above the left item. + name: &stacker Staplare + description: Staplar båda obejekt. Om de inte kan slås ihop, placeras det högra obejektet över det vänstra. mixer: default: - name: &mixer Color Mixer - description: Mixes two colors using additive blending. + name: &mixer Färgblandare + description: Blandar två färger genom additiv blandning. painter: default: - name: &painter Painter - description: &painter_desc Colors the whole shape on the left input with the color from the right input. + name: &painter Färgläggare + description: &painter_desc Färgar hela formen på den vänstra inputten med färgen från den högra. double: - name: Painter (Double) - description: Colors the shapes on the left inputs with the color from the top input. + name: Färgläggare (Dubbel) + description: Färgar formerna på de vänstra inputterna med färgen från den högra. quad: - name: Painter (Quad) - description: Allows to color each quadrant of the shape with a different color. + name: Färgläggare (Quad) + description: Låter dig färglägga varje hörn av formen med olika färger. mirrored: name: *painter description: *painter_desc trash: default: - name: &trash Trash - description: Accepts inputs from all sides and destroys them. Forever. + name: &trash Skräphantering + description: Tar in inputs från alla sidor och förstår dem. För alltid. storage: - name: Storage - description: Stores excess items, up to a given capacity. Can be used as an overflow gate. + name: Förvaring + description: Förvarar överskottliga obejekt, till kapacitet. Kan användas somöverflödsport. hub: - deliver: Deliver - toUnlock: to unlock + deliver: Leverera + toUnlock: att låsa upp levelShortcut: LVL storyRewards: # Those are the rewards gained from completing the store reward_cutter_and_trash: - title: Cutting Shapes - desc: You just unlocked the cutter - it cuts shapes half from top to bottom regardless of its orientation!

Be sure to get rid of the waste, or otherwise it will stall - For this purpose I gave you a trash, which destroys everything you put into it! + title: Att klippa former + desc: Du låste just upp klipparen - den klipper former på hälften från topp till botten oavsett dess orientation!

Se till att ta bort allt överskott, annars kommer det att skapa uppehåll - Av denna anledning gav jag dig skräphantering, vilket förstör allt du inputtar! reward_rotater: - title: Rotating - desc: The rotater has been unlocked! It rotates shapes clockwise by 90 degrees. + title: Rotation + desc: Rotatorn har blivit upplåst! Den roterar former 90 grader medsols. reward_painter: - title: Painting + title: Måleri desc: >- - The painter has been unlocked - Extract some color veins (just as you do with shapes) and combine it with a shape in the painter to color them!

PS: If you are colorblind, I'm working on a solution already! + Färgläggaren har blivit upplåst - Extrahera färg (precis som du gör med former) och kombinera dem med former för att färglägga dem!

PS: Om du är färgblind, jag jobbar redan på en lösning! reward_mixer: - title: Color Mixing - desc: The mixer has been unlocked - Combine two colors using additive blending with this building! + title: Färgblandning + desc: Färgblandaren har blivit upplåst - Kombinera två färger genom additiv färgblandning med denna byggnad! reward_stacker: - title: Combiner - desc: You can now combine shapes with the combiner! Both inputs are combined, and if they can be put next to each other, they will be fused. If not, the right input is stacked on top of the left input! + title: Kombinera + desc: Du kan nu kombinera former medstaplaren! Båda inputs blir combinerade och om de kan sättas brevid varandra kommer de att sättas ihop. Om inte kommer den högra staplas över den vänstra! reward_splitter: - title: Splitter/Merger - desc: The multifunctional balancer has been unlocked - It can be used to build bigger factories by splitting and merging items onto multiple belts!

+ title: Delning/Sammanslagning + desc: Den multifunktiionella balancer har blivit upplåst - Den kan användas för att bygga större fabriker genom att dela eller slå ihop obejekt till flera rullband!

reward_tunnel: title: Tunnel - desc: The tunnel has been unlocked - You can now pipe items through belts and buildings with it! + desc: Tunneln blivit upplåst- Du kan nu transportera saker under rullband och byggnader med den! reward_rotater_ccw: - title: CCW Rotating - desc: You have unlocked a variant of the rotater - It allows to rotate counter clockwise! To build it, select the rotater and press 'T' to cycle its variants! + title: Motsols rotation + desc: Du har låst upp en variant av rotatorn - Den låter dig rotera saker motsols! För att bygga den, välj rotatorn och tryck ned 'T' för att cykla genom dess varianter! reward_miner_chainable: - title: Chaining Extractor - desc: You have unlocked the chaining extractor! It can forward its resources to other extractors so you can more efficiently extract resources! + title: Kedjeextraktor + desc: Du har låst upp Kedjeextraktorn! Den kan föra sina resurser framåt till andra extraktorerså att du kan mer effektivt extrahera resurser! reward_underground_belt_tier_2: title: Tunnel Tier II - desc: You have unlocked a new variant of the tunnel - It has a bigger range, and you can also mix-n-match those tunnels now! + desc: Du har låst upp en ny variant av tunneln - Den har en större räckvidd, och du kan också mix-matcha tunnlarna nu! reward_splitter_compact: - title: Compact Balancer + title: Kompakt Balancer desc: >- - You have unlocked a compact variant of the balancer - It accepts two inputs and merges them into one! + Du har låst upp en ny veriant av balancer - Den accepterar två input och gör dem till en! reward_cutter_quad: - title: Quad Cutting - desc: You have unlocked a variant of the cutter - It allows you to cut shapes in four parts instead of just two! + title: Quad Klippning + desc: Du har låst upp en ny variant av klipparen - Den låter dig klippa former i fyra delar istället för bara två! reward_painter_double: - title: Double Painting - desc: You have unlocked a variant of the painter - It works as the regular painter but processes two shapes at once consuming just one color instead of two! + title: Dubbelfärgläggning + desc: Du har låst upp en ny variant av Färgläggaren - Den fungerar som en vanlig färgläggare fast den färglägger två former åt gången och använder bara en färg istället för två! reward_painter_quad: - title: Quad Painting - desc: You have unlocked a variant of the painter - It allows to paint each part of the shape individually! + title: Quad Färgläggning + desc: Du har låst upp en ny variant av Färgläggaren - Den tillåter dig att färglägga varje del av formen individuellt! reward_storage: - title: Storage Buffer - desc: You have unlocked a variant of the trash - It allows to store items up to a given capacity! + title: Förvaringsbuffert + desc: Du har låst upp en ny variant av skräphantering - Den tillåter dig att förvara obejekt upp till en viss kapacitet! reward_freeplay: - title: Freeplay - desc: You did it! You unlocked the free-play mode! This means that shapes are now randomly generated! (No worries, more content is planned for the standalone!) + title: Friläge + desc: Du gjorde det! Du låste upp friläge! Det betyder att former är nu slumpmässigt genererade! (oroa dig inte, mer innehåll är planerat för den fristående versionen!) reward_blueprints: - title: Blueprints - desc: You can now copy and paste parts of your factory! Select an area (Hold CTRL, then drag with your mouse), and press 'C' to copy it.

Pasting it is not free, you need to produce blueprint shapes to afford it! (Those you just delivered). + title: Ritningar + desc: Du kan nu kopiera och klistra in delar av din fabrik! Välj ett område (håll in CTRL, dra sedan med musen), och tryck 'C' för att kopiera det.

Att klistra in ärinte gratis, du behöver produvera ritningsformer för att ha råd med det! (De du just levererade). # Special reward, which is shown when there is no reward actually no_reward: - title: Next level + title: Nästa nivå desc: >- - This level gave you no reward, but the next one will!

PS: Better don't destroy your existing factory - You need all those shapes later again to unlock upgrades! + Denna nivå har ingen belöning, men nästa kommer!

PS: Se till att inte förstöra din redan existerande fabrik - Du behöver alla dom där formerna igen för att låsa upp uppgraderignar! no_reward_freeplay: - title: Next level + title: Nästa nivå desc: >- - Congratulations! By the way, more content is planned for the standalone! + Grattis! Föresten, mer spelinnehåll är planerat för den fristående versionen! settings: - title: Settings + title: Inställningar categories: - game: Game - app: Application + game: Spelinställningar + app: Applikation versionBadges: - dev: Development - staging: Staging - prod: Production - buildDate: Built + dev: Utveckling + staging: Iscensättning + prod: Produktion + buildDate: Skapad labels: uiScale: - title: Interface scale + title: Gränssnittsskala description: >- - Changes the size of the user interface. The interface will still scale based on your device resolution, but this setting controls the amount of scale. + Ändrar storleken på gränssnittet. gränssnittet kommer fortförande baseras på skrärmupplåsning, men denna inställning kontrollerar mängdskala. scales: - super_small: Super small - small: Small - regular: Regular - large: Large - huge: Huge + super_small: Superliten + small: Liten + regular: Normal + large: Stor + huge: Enorm scrollWheelSensitivity: - title: Zoom sensitivity + title: Zoomkänslighet description: >- - Changes how sensitive the zoom is (Either mouse wheel or trackpad). + Ändrar hur känslig zoomen är (Mushjul eller styrplatta). sensitivity: - super_slow: Super slow - slow: Slow - regular: Regular - fast: Fast - super_fast: Super fast + super_slow: Superlångsam + slow: långsam + regular: Normal + fast: Snabb + super_fast: Supersnabb language: - title: Language + title: Språk description: >- - Change the language. All translations are user contributed and might be incomplete! + Ändra språk. Alla språk är användarbidragna och kan vara inkompletta! fullscreen: - title: Fullscreen + title: Fullskärm description: >- - It is recommended to play the game in fullscreen to get the best experience. Only available in the standalone. + Det är rekomenderat att spela i fullskärm för bästa upplevelse. Endast tillgänglig i den fristående versionen. soundsMuted: - title: Mute Sounds + title: Dämpa Ljud description: >- - If enabled, mutes all sound effects. + Om på, stänger av alla ljud. musicMuted: - title: Mute Music + title: Dämpa Musik description: >- - If enabled, mutes all music. + Om på, stänger av all musik. theme: - title: Game theme + title: Spelutseende description: >- - Choose the game theme (light / dark). + Välj spelutseende (ljust / mörkt). themes: - dark: Dark - light: Light + dark: Mörkt + light: Ljust refreshRate: - title: Simulation Target + title: Simulationsmål description: >- - If you have a 144hz monitor, change the refresh rate here so the game will properly simulate at higher refresh rates. This might actually decrease the FPS if your computer is too slow. + Om du har en 144hz skärm, ändra uppdateringshastigheten här så kommer spelet simulera vid en högre uppdateringshastighet. Detta kan dock sänka FPS om din dator är lågsam. alwaysMultiplace: - title: Multiplace + title: Flerplacering description: >- - If enabled, all buildings will stay selected after placement until you cancel it. This is equivalent to holding SHIFT permanently. + Om på, alla byggnader kommer fortsätta vara valda efter placering. Att ha detta på är som att konstant hålla ned SHIFT. offerHints: - title: Hints & Tutorials + title: Tips & Tutorials description: >- - Whether to offer hints and tutorials while playing. Also hides certain UI elements onto a given level to make it easier to get into the game. + Om tips och tutorials ska synas under spelets gång. Gömmer också vissa delar av UI tills senare i spelet för att göra det lättare att komma in i spelet. movementSpeed: title: Movement speed @@ -752,7 +752,7 @@ keybindings: exportScreenshot: Export whole Base as Image mapMoveFaster: Move Faster lockBeltDirection: Enable belt planner - switchDirectionLockSide: 'Planner: Switch side' + switchDirectionLockSide: "Planner: Switch side" about: title: About this Game From d452234c72ded57585b08bc4195d12556d856ff5 Mon Sep 17 00:00:00 2001 From: tobspr Date: Mon, 22 Jun 2020 12:38:14 +0200 Subject: [PATCH 02/38] Fix keybinding for pipette showing while pasting blueprints --- src/js/changelog.js | 1 + src/js/game/hud/parts/keybinding_overlay.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/changelog.js b/src/js/changelog.js index 36ac0ab4..20fdba5a 100644 --- a/src/js/changelog.js +++ b/src/js/changelog.js @@ -8,6 +8,7 @@ export const CHANGELOG = [ "Add setting to disable cut/delete warnings (by hexy)", "Fix bug where belts in blueprints don't orient correctly (by hexy)", "Fix camera moving weird after dragging and holding (by hexy)", + "Fix keybinding for pipette showing while pasting blueprints", "Update tutorial image for tier 2 tunnels to explain mix/match (by jimmyshadow1)", "Prevent default actions on all keybindings in the web version so you don't accidentally use builtin browser shortcuts", ], diff --git a/src/js/game/hud/parts/keybinding_overlay.js b/src/js/game/hud/parts/keybinding_overlay.js index 5b7f4a9d..63208b19 100644 --- a/src/js/game/hud/parts/keybinding_overlay.js +++ b/src/js/game/hud/parts/keybinding_overlay.js @@ -168,7 +168,7 @@ export class HUDKeybindingOverlay extends BaseHUDPart { // Pipette label: T.ingame.keybindingsOverlay.pipette, keys: [k.placement.pipette], - condition: () => !this.mapOverviewActive, + condition: () => !this.mapOverviewActive && !this.blueprintPlacementActive, }, { From f204189fdbbe8f07d729e2ca5c8a8048468738a5 Mon Sep 17 00:00:00 2001 From: tobspr Date: Mon, 22 Jun 2020 12:48:35 +0200 Subject: [PATCH 03/38] Refactor smart underground belt logic --- src/js/changelog.js | 1 + src/js/game/systems/underground_belt.js | 41 ++++++++++++++++++------- src/js/profile/application_settings.js | 8 ++++- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/src/js/changelog.js b/src/js/changelog.js index 20fdba5a..95553f19 100644 --- a/src/js/changelog.js +++ b/src/js/changelog.js @@ -4,6 +4,7 @@ export const CHANGELOG = [ date: "unreleased", entries: [ "Allow configuring autosave interval and disabling it in the settings", + "The smart-tunnel placement has been reworked to properly replace belts. Thus the setting has been turned on again by default", "The soundtrack now has a higher quality on the standalone version than the web version", "Add setting to disable cut/delete warnings (by hexy)", "Fix bug where belts in blueprints don't orient correctly (by hexy)", diff --git a/src/js/game/systems/underground_belt.js b/src/js/game/systems/underground_belt.js index 5b308e25..0456638a 100644 --- a/src/js/game/systems/underground_belt.js +++ b/src/js/game/systems/underground_belt.js @@ -77,6 +77,7 @@ export class UndergroundBeltSystem extends GameSystemWithFilter { const tier = undergroundComp.tier; const range = globalConfig.undergroundBeltMaxTilesByTier[tier]; + // FIND ENTRANCE // Search for the entrance which is furthes apart (this is why we can't reuse logic here) let matchingEntrance = null; for (let i = 0; i < range; ++i) { @@ -104,31 +105,49 @@ export class UndergroundBeltSystem extends GameSystemWithFilter { return; } - // Remove any belts between entrance and exit which have the same direction + // DETECT OBSOLETE BELTS BETWEEN + // Remove any belts between entrance and exit which have the same direction, + // but only if they *all* have the right direction currentPos = tile.copy(); + let allBeltsMatch = true; for (let i = 0; i < matchingEntrance.range; ++i) { currentPos.addInplace(offset); const contents = this.root.map.getTileContent(currentPos); if (!contents) { - continue; + allBeltsMatch = false; + break; } const contentsStaticComp = contents.components.StaticMapEntity; const contentsBeltComp = contents.components.Belt; + if (!contentsBeltComp) { + allBeltsMatch = false; + break; + } - if (contentsBeltComp) { - // It's a belt - if ( - contentsBeltComp.direction === enumDirection.top && - enumAngleToDirection[contentsStaticComp.rotation] === direction - ) { - // It's same rotation, drop it - this.root.logic.tryDeleteBuilding(contents); - } + // It's a belt + if ( + contentsBeltComp.direction !== enumDirection.top || + enumAngleToDirection[contentsStaticComp.rotation] !== direction + ) { + allBeltsMatch = false; + break; } } + currentPos = tile.copy(); + if (allBeltsMatch) { + // All belts between this are obsolete, so drop them + for (let i = 0; i < matchingEntrance.range; ++i) { + currentPos.addInplace(offset); + const contents = this.root.map.getTileContent(currentPos); + assert(contents, "Invalid smart underground belt logic"); + this.root.logic.tryDeleteBuilding(contents); + } + } + + // REMOVE OBSOLETE TUNNELS // Remove any double tunnels, by checking the tile plus the tile above currentPos = tile.copy().add(offset); for (let i = 0; i < matchingEntrance.range - 1; ++i) { diff --git a/src/js/profile/application_settings.js b/src/js/profile/application_settings.js index 1aa2b604..83aa21fb 100644 --- a/src/js/profile/application_settings.js +++ b/src/js/profile/application_settings.js @@ -468,7 +468,7 @@ export class ApplicationSettings extends ReadWriteProxy { } getCurrentVersion() { - return 15; + return 16; } /** @param {{settings: SettingsStorage, version: number}} data */ @@ -530,6 +530,12 @@ export class ApplicationSettings extends ReadWriteProxy { data.version = 15; } + if (data.version < 16) { + // RE-ENABLE this setting, it already existed + data.settings.enableTunnelSmartplace = true; + data.version = 16; + } + return ExplainedResult.good(); } } From 9a67115ba7ed3ad30206f00bb6411a8f85c78eef Mon Sep 17 00:00:00 2001 From: tobspr Date: Mon, 22 Jun 2020 14:32:24 +0200 Subject: [PATCH 04/38] Color blind mode --- res/ui/icons/info_button.png | Bin 0 -> 577 bytes res_raw/sounds/sfx/destroy_building.wav | 3 + src/css/ingame_hud/color_blind_helper.scss | 18 +++ src/css/ingame_hud/pinned_shapes.scss | 18 +++ src/css/ingame_hud/shape_viewer.scss | 131 ++++++++++++++++++ src/css/ingame_hud/shop.scss | 21 ++- src/css/main.scss | 4 + src/js/changelog.js | 4 + src/js/game/hud/hud.js | 19 ++- src/js/game/hud/parts/blueprint_placer.js | 3 +- .../game/hud/parts/building_placer_logic.js | 3 + src/js/game/hud/parts/color_blind_helper.js | 106 ++++++++++++++ src/js/game/hud/parts/pinned_shapes.js | 21 ++- src/js/game/hud/parts/shape_viewer.js | 109 +++++++++++++++ src/js/game/hud/parts/shop.js | 15 ++ src/js/game/shape_definition.js | 2 +- src/js/game/sound_proxy.js | 2 +- src/js/game/themes/dark.json | 5 +- src/js/game/themes/light.json | 5 +- src/js/platform/sound.js | 1 + src/js/profile/application_settings.js | 18 ++- translations/base-en.yaml | 21 +++ 22 files changed, 518 insertions(+), 11 deletions(-) create mode 100644 res/ui/icons/info_button.png create mode 100644 res_raw/sounds/sfx/destroy_building.wav create mode 100644 src/css/ingame_hud/color_blind_helper.scss create mode 100644 src/css/ingame_hud/shape_viewer.scss create mode 100644 src/js/game/hud/parts/color_blind_helper.js create mode 100644 src/js/game/hud/parts/shape_viewer.js diff --git a/res/ui/icons/info_button.png b/res/ui/icons/info_button.png new file mode 100644 index 0000000000000000000000000000000000000000..abdf2af993450f9045517427bfaba95e613a3878 GIT binary patch literal 577 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dH0CG7CJR*yM z^h*$C44EY24P;1`xJHx&=ckpFCl;kLl$V$5W#(lUCnpx9>g5-u&wghk1ys}?;1lBd z|Nnm=bHG9WlKGo~j?gIy@(X5QWar?Mkd)Q+Oh`;CuB>V4=$$lu#;g_VH*DT@@Wka? zw;w)!`tJRw&tJa&{&P_3>2ILEFP<)rAr_}wgRe6+8SwBd@R-}NwmYe?aq<8EwM<&R zI+v=wi!zP%7<6mYmS}mavVK13c7prvq6ZKCEjr%MdLYMcVRvRrYfi?ai=O2VM7I8% z`?2d|rSgII_w#;CFPAke(q(IAHF~_vKBWE~V}<3brSGOK?x~%-(VZ{uEdN<|dv}J# z>O~@U20=emJ@t+pba)ZRG2z$_zvH56?miP1^b~%Wwat9Sf(0(uDsu(BoG$Fvvf`?73_Lf5+|Id8M|Gu=T}yM;6aI#wqd8)RvP|E>S0ujx>+%T8=n7bx;PUHx3vIVCg!0GYG6f&c&j literal 0 HcmV?d00001 diff --git a/res_raw/sounds/sfx/destroy_building.wav b/res_raw/sounds/sfx/destroy_building.wav new file mode 100644 index 00000000..ffb38158 --- /dev/null +++ b/res_raw/sounds/sfx/destroy_building.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1dc8775fdf5155097d6e1d60a436f48916af56eec14fb9034e71b32ad3b6f1b0 +size 358896 diff --git a/src/css/ingame_hud/color_blind_helper.scss b/src/css/ingame_hud/color_blind_helper.scss new file mode 100644 index 00000000..027b781b --- /dev/null +++ b/src/css/ingame_hud/color_blind_helper.scss @@ -0,0 +1,18 @@ +#ingame_HUD_ColorBlindBelowTileHelper { + position: absolute; + + @include SuperSmallText; + color: #fff; + background: $ingameHudBg; + @include S(padding, 5px); + @include S(top, 20px); + left: 50%; + transform: translateX(-50%); + text-transform: uppercase; + + &:not(.visible) { + display: none; + } + + @include DarkThemeInvert; +} diff --git a/src/css/ingame_hud/pinned_shapes.scss b/src/css/ingame_hud/pinned_shapes.scss index 68cf7e16..60e9159e 100644 --- a/src/css/ingame_hud/pinned_shapes.scss +++ b/src/css/ingame_hud/pinned_shapes.scss @@ -72,6 +72,24 @@ grid-row: 1 / 2; } + > .infoButton { + @include S(width, 8px); + @include S(height, 8px); + background: uiResource("icons/info_button.png") center center / 95% no-repeat; + position: absolute; + opacity: 0.7; + @include S(top, 13px); + @include S(left, -7px); + @include DarkThemeInvert; + @include IncreasedClickArea(2px); + transition: opacity 0.12s ease-in-out; + z-index: 100; + + &:hover { + opacity: 0.8; + } + } + &.goal, &.blueprint { .amountLabel::after { diff --git a/src/css/ingame_hud/shape_viewer.scss b/src/css/ingame_hud/shape_viewer.scss new file mode 100644 index 00000000..5d2484f0 --- /dev/null +++ b/src/css/ingame_hud/shape_viewer.scss @@ -0,0 +1,131 @@ +#ingame_HUD_ShapeViewer { + .dialogInner { + @include S(width, 160px); + } + .content { + display: flex; + flex-direction: column; + width: 100%; + align-items: center; + justify-items: center; + + .seperator { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + } + + .layer { + position: relative; + background: #eee; + + @include DarkThemeOverride { + background: rgba(0, 10, 20, 0.2); + } + @include S(width, 150px); + @include S(height, 100px); + display: flex; + align-items: center; + justify-content: center; + + > canvas { + @include S(width, 50px); + @include S(height, 50px); + } + + .quad { + position: absolute; + width: 50%; + height: 50%; + display: flex; + justify-content: center; + align-items: center; + box-sizing: border-box; + + $arrowDims: 23px; + $spacing: 9px; + @include S(padding, 6px); + + .colorLabel { + text-transform: uppercase; + @include SuperSmallText; + @include S(font-size, 9px); + } + + .emptyLabel { + text-transform: uppercase; + @include SuperSmallText; + @include S(font-size, 9px); + } + + &::after { + content: " "; + background: rgba(0, 10, 20, 0.5); + @include S(width, $arrowDims); + @include S(height, 1px); + position: absolute; + transform: rotate(45deg); + transform-origin: 50% 50%; + } + @include DarkThemeOverride { + &::after { + background: rgba(255, 255, 255, 0.5); + } + } + + &.quad-0 { + right: 0; + top: 0; + align-items: flex-start; + justify-content: flex-end; + + &::after { + @include S(left, $spacing); + @include S(bottom, $arrowDims / 2 + $spacing); + transform: rotate(-45deg); + } + } + &.quad-1 { + bottom: 0; + right: 0; + + align-items: flex-end; + justify-content: flex-end; + + &::after { + @include S(left, $spacing); + @include S(top, $arrowDims / 2 + $spacing); + transform: rotate(45deg); + } + } + &.quad-2 { + bottom: 0; + left: 0; + + align-items: flex-end; + justify-content: flex-start; + + &::after { + @include S(right, $spacing); + @include S(top, $arrowDims / 2 + $spacing); + transform: rotate(135deg); + } + } + &.quad-3 { + top: 0; + left: 0; + + align-items: flex-start; + justify-content: flex-start; + + &::after { + @include S(right, $spacing); + @include S(bottom, $arrowDims / 2 + $spacing); + transform: rotate(225deg); + } + } + } + } + } +} diff --git a/src/css/ingame_hud/shop.scss b/src/css/ingame_hud/shop.scss index 26f5d759..d8cc8a86 100644 --- a/src/css/ingame_hud/shop.scss +++ b/src/css/ingame_hud/shop.scss @@ -195,6 +195,25 @@ } } + button.showInfo { + @include S(width, 11px); + @include S(height, 11px); + background: uiResource("icons/info_button.png") center center / 95% no-repeat; + position: absolute; + @include S(top, 17px); + @include S(right, 2.5px); + opacity: 0.5; + cursor: pointer; + pointer-events: all; + @include IncreasedClickArea(5px); + transition: opacity 0.12s ease-in-out; + @include DarkThemeInvert; + + &:hover { + opacity: 0.6; + } + } + canvas { @include S(width, 40px); @include S(height, 40px); @@ -241,7 +260,7 @@ &.complete { background-color: $colorGreenBright; - + @include DarkThemeOverride { background-color: $colorGreenBright; } diff --git a/src/css/main.scss b/src/css/main.scss index 178f398b..6b758e80 100644 --- a/src/css/main.scss +++ b/src/css/main.scss @@ -49,6 +49,8 @@ @import "ingame_hud/blueprint_placer"; @import "ingame_hud/waypoints"; @import "ingame_hud/interactive_tutorial"; +@import "ingame_hud/color_blind_helper"; +@import "ingame_hud/shape_viewer"; // prettier-ignore $elements: @@ -74,6 +76,7 @@ ingame_HUD_buildings_toolbar, ingame_HUD_BlueprintPlacer, ingame_HUD_Waypoints_Hint, ingame_HUD_Watermark, +ingame_HUD_ColorBlindBelowTileHelper, // Overlays ingame_HUD_BetaOverlay, @@ -81,6 +84,7 @@ ingame_HUD_BetaOverlay, // Dialogs ingame_HUD_Shop, ingame_HUD_Statistics, +ingame_HUD_ShapeViewer, ingame_HUD_UnlockNotification, ingame_HUD_SettingsMenu, ingame_HUD_ModalDialogs; diff --git a/src/js/changelog.js b/src/js/changelog.js index 95553f19..b654f0de 100644 --- a/src/js/changelog.js +++ b/src/js/changelog.js @@ -3,6 +3,8 @@ export const CHANGELOG = [ version: "1.1.17", date: "unreleased", entries: [ + "Color blind mode! You can now activate it in the settings and it will show you which color is below your cursor (Either resource or on the belt)", + "Add info buttons to all shapes so you can figure out how they are built! (And also, which colors they have)", "Allow configuring autosave interval and disabling it in the settings", "The smart-tunnel placement has been reworked to properly replace belts. Thus the setting has been turned on again by default", "The soundtrack now has a higher quality on the standalone version than the web version", @@ -10,6 +12,8 @@ export const CHANGELOG = [ "Fix bug where belts in blueprints don't orient correctly (by hexy)", "Fix camera moving weird after dragging and holding (by hexy)", "Fix keybinding for pipette showing while pasting blueprints", + "Improve visibility of shape background in dark mode", + "Added sound when destroying a building", "Update tutorial image for tier 2 tunnels to explain mix/match (by jimmyshadow1)", "Prevent default actions on all keybindings in the web version so you don't accidentally use builtin browser shortcuts", ], diff --git a/src/js/game/hud/hud.js b/src/js/game/hud/hud.js index c322c707..efbde2ab 100644 --- a/src/js/game/hud/hud.js +++ b/src/js/game/hud/hud.js @@ -34,7 +34,8 @@ import { HUDPartTutorialHints } from "./parts/tutorial_hints"; import { HUDWaypoints } from "./parts/waypoints"; import { HUDInteractiveTutorial } from "./parts/interactive_tutorial"; import { HUDScreenshotExporter } from "./parts/screenshot_exporter"; -import { Entity } from "../entity"; +import { HUDColorBlindHelper } from "./parts/color_blind_helper"; +import { HUDShapeViewer } from "./parts/shape_viewer"; export class GameHUD { /** @@ -68,6 +69,7 @@ export class GameHUD { debugInfo: new HUDDebugInfo(this.root), dialogs: new HUDModalDialogs(this.root), screenshotExporter: new HUDScreenshotExporter(this.root), + shapeViewer: new HUDShapeViewer(this.root), }; this.signals = { @@ -76,7 +78,8 @@ export class GameHUD { shapeUnpinRequested: /** @type {TypedSignal<[string]>} */ (new Signal()), notification: /** @type {TypedSignal<[string, enumNotificationType]>} */ (new Signal()), buildingsSelectedForCopy: /** @type {TypedSignal<[Array]>} */ (new Signal()), - pasteBlueprintRequested: new Signal(), + pasteBlueprintRequested: /** @type {TypedSignal<[]>} */ (new Signal()), + viewShapeDetailsRequested: /** @type {TypedSignal<[ShapeDefinition]>} */ (new Signal()), }; if (!IS_MOBILE) { @@ -100,6 +103,10 @@ export class GameHUD { this.parts.vignetteOverlay = new HUDVignetteOverlay(this.root); } + if (this.root.app.settings.getAllSettings().enableColorBlindHelper) { + this.parts.colorBlindHelper = new HUDColorBlindHelper(this.root); + } + const frag = document.createDocumentFragment(); for (const key in this.parts) { this.parts[key].createElements(frag); @@ -208,7 +215,13 @@ export class GameHUD { * @param {DrawParameters} parameters */ draw(parameters) { - const partsOrder = ["waypoints", "massSelector", "buildingPlacer", "blueprintPlacer"]; + const partsOrder = [ + "waypoints", + "massSelector", + "buildingPlacer", + "blueprintPlacer", + "colorBlindHelper", + ]; for (let i = 0; i < partsOrder.length; ++i) { if (this.parts[partsOrder[i]]) { diff --git a/src/js/game/hud/parts/blueprint_placer.js b/src/js/game/hud/parts/blueprint_placer.js index ef46f101..c98fbf2d 100644 --- a/src/js/game/hud/parts/blueprint_placer.js +++ b/src/js/game/hud/parts/blueprint_placer.js @@ -10,6 +10,7 @@ import { blueprintShape } from "../../upgrades"; import { BaseHUDPart } from "../base_hud_part"; import { DynamicDomAttach } from "../dynamic_dom_attach"; import { Blueprint } from "./blueprint"; +import { SOUNDS } from "../../../platform/sound"; export class HUDBlueprintPlacer extends BaseHUDPart { createElements(parent) { @@ -103,7 +104,7 @@ export class HUDBlueprintPlacer extends BaseHUDPart { if (blueprint.tryPlace(this.root, tile)) { const cost = blueprint.getCost(); this.root.hubGoals.takeShapeByKey(blueprintShape, cost); - + this.root.soundProxy.playUi(SOUNDS.placeBuilding); // This actually feels weird // if (!this.root.keyMapper.getBinding(KEYMAPPINGS.placementModifiers.placeMultiple).pressed) { // this.currentBlueprint.set(null); diff --git a/src/js/game/hud/parts/building_placer_logic.js b/src/js/game/hud/parts/building_placer_logic.js index 0da81d4a..c9b3bfb8 100644 --- a/src/js/game/hud/parts/building_placer_logic.js +++ b/src/js/game/hud/parts/building_placer_logic.js @@ -10,6 +10,7 @@ import { Entity } from "../../entity"; import { KEYMAPPINGS } from "../../key_action_mapper"; import { defaultBuildingVariant, MetaBuilding } from "../../meta_building"; import { BaseHUDPart } from "../base_hud_part"; +import { SOUNDS } from "../../../platform/sound"; /** * Contains all logic for the building placer - this doesn't include the rendering @@ -215,6 +216,7 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart { const contents = this.root.map.getTileContent(tile); if (contents) { this.root.logic.tryDeleteBuilding(contents); + this.root.soundProxy.playUi(SOUNDS.destroyBuilding); } } @@ -650,6 +652,7 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart { const contents = this.root.map.getTileContentXY(x0, y0); if (contents && !contents.queuedForDestroy && !contents.destroyed) { this.root.logic.tryDeleteBuilding(contents); + this.root.soundProxy.playUi(SOUNDS.destroyBuilding); } } else { this.tryPlaceCurrentBuildingAt(new Vector(x0, y0)); diff --git a/src/js/game/hud/parts/color_blind_helper.js b/src/js/game/hud/parts/color_blind_helper.js new file mode 100644 index 00000000..4e6a0229 --- /dev/null +++ b/src/js/game/hud/parts/color_blind_helper.js @@ -0,0 +1,106 @@ +import { BaseHUDPart } from "../base_hud_part"; +import { makeDiv } from "../../../core/utils"; +import { TrackedState } from "../../../core/tracked_state"; +import { enumColors } from "../../colors"; +import { ColorItem } from "../../items/color_item"; +import { DrawParameters } from "../../../core/draw_parameters"; +import { THEME } from "../../theme"; +import { globalConfig } from "../../../core/config"; +import { T } from "../../../translations"; + +export class HUDColorBlindHelper extends BaseHUDPart { + createElements(parent) { + this.belowTileIndicator = makeDiv(parent, "ingame_HUD_ColorBlindBelowTileHelper", []); + } + + initialize() { + this.trackedColorBelowTile = new TrackedState(this.onColorBelowTileChanged, this); + } + + /** + * Called when the color below the current tile changed + * @param {enumColors|null} color + */ + onColorBelowTileChanged(color) { + this.belowTileIndicator.classList.toggle("visible", !!color); + if (color) { + this.belowTileIndicator.innerText = T.ingame.colors[color]; + } + } + + /** + * Computes the color below the current tile + * @returns {enumColors} + */ + computeColorBelowTile() { + const mousePosition = this.root.app.mousePosition; + if (!mousePosition) { + // Not on screen + return null; + } + + const worldPos = this.root.camera.screenToWorld(mousePosition); + const tile = worldPos.toTileSpace(); + const contents = this.root.map.getTileContent(tile); + + if (contents && !contents.components.Miner) { + const beltComp = contents.components.Belt; + + // Check if the belt has a color item + if (beltComp) { + const firstItem = beltComp.sortedItems[0]; + if (firstItem && firstItem[1] instanceof ColorItem) { + return firstItem[1].color; + } + } + + // Check if we are ejecting an item, if so use that color + const ejectorComp = contents.components.ItemEjector; + if (ejectorComp) { + for (let i = 0; i < ejectorComp.slots.length; ++i) { + const slot = ejectorComp.slots[i]; + if (slot.item && slot.item instanceof ColorItem) { + return slot.item.color; + } + } + } + } else { + // We hovered a lower layer, show the color there + const lowerLayer = this.root.map.getLowerLayerContentXY(tile.x, tile.y); + if (lowerLayer && lowerLayer instanceof ColorItem) { + return lowerLayer.color; + } + } + + return null; + } + + update() { + this.trackedColorBelowTile.set(this.computeColorBelowTile()); + } + + /** + * Draws the currently selected tile + * @param {DrawParameters} parameters + */ + draw(parameters) { + const mousePosition = this.root.app.mousePosition; + if (!mousePosition) { + // Not on screen + return null; + } + + const below = this.computeColorBelowTile(); + if (below) { + // We have something below our tile + const worldPos = this.root.camera.screenToWorld(mousePosition); + const tile = worldPos.toTileSpace().toWorldSpace(); + + parameters.context.strokeStyle = THEME.map.colorBlindPickerTile; + parameters.context.lineWidth = 1; + parameters.context.beginPath(); + parameters.context.rect(tile.x, tile.y, globalConfig.tileSize, globalConfig.tileSize); + parameters.context.stroke(); + } + } +} diff --git a/src/js/game/hud/parts/pinned_shapes.js b/src/js/game/hud/parts/pinned_shapes.js index 62afff25..3f935a0b 100644 --- a/src/js/game/hud/parts/pinned_shapes.js +++ b/src/js/game/hud/parts/pinned_shapes.js @@ -26,7 +26,8 @@ export class HUDPinnedShapes extends BaseHUDPart { * amountLabel: HTMLElement, * lastRenderedValue: string, * element: HTMLElement, - * detector?: ClickDetector + * detector?: ClickDetector, + * infoDetector?: ClickDetector * }>} */ this.handles = []; @@ -155,6 +156,10 @@ export class HUDPinnedShapes extends BaseHUDPart { if (detector) { detector.cleanup(); } + const infoDetector = this.handles[i].infoDetector; + if (infoDetector) { + infoDetector.cleanup(); + } } this.handles = []; @@ -198,12 +203,24 @@ export class HUDPinnedShapes extends BaseHUDPart { detector = new ClickDetector(element, { consumeEvents: true, preventDefault: true, + targetOnly: true, }); detector.click.add(() => this.unpinShape(key)); } else { element.classList.add("marked"); } + // Show small info icon + const infoButton = document.createElement("button"); + infoButton.classList.add("infoButton"); + element.appendChild(infoButton); + const infoDetector = new ClickDetector(infoButton, { + consumeEvents: true, + preventDefault: true, + targetOnly: true, + }); + infoDetector.click.add(() => this.root.hud.signals.viewShapeDetailsRequested.dispatch(definition)); + const amountLabel = makeDiv(element, null, ["amountLabel"], ""); const goal = this.findGoalValueForShape(key); @@ -216,6 +233,8 @@ export class HUDPinnedShapes extends BaseHUDPart { element, amountLabel, lastRenderedValue: "", + detector, + infoDetector, }); } diff --git a/src/js/game/hud/parts/shape_viewer.js b/src/js/game/hud/parts/shape_viewer.js new file mode 100644 index 00000000..fa083793 --- /dev/null +++ b/src/js/game/hud/parts/shape_viewer.js @@ -0,0 +1,109 @@ +import { BaseHUDPart } from "../base_hud_part"; +import { makeDiv, removeAllChildren } from "../../../core/utils"; +import { T } from "../../../translations"; +import { defaultBuildingVariant } from "../../meta_building"; +import { ShapeDefinition } from "../../shape_definition"; +import { KEYMAPPINGS, KeyActionMapper } from "../../key_action_mapper"; +import { InputReceiver } from "../../../core/input_receiver"; +import { DynamicDomAttach } from "../dynamic_dom_attach"; + +export class HUDShapeViewer extends BaseHUDPart { + createElements(parent) { + this.background = makeDiv(parent, "ingame_HUD_ShapeViewer", ["ingameDialog"]); + + // DIALOG Inner / Wrapper + this.dialogInner = makeDiv(this.background, null, ["dialogInner"]); + this.title = makeDiv(this.dialogInner, null, ["title"], T.ingame.shapeViewer.title); + this.closeButton = makeDiv(this.title, null, ["closeButton"]); + this.trackClicks(this.closeButton, this.close); + this.contentDiv = makeDiv(this.dialogInner, null, ["content"]); + } + + initialize() { + this.root.hud.signals.viewShapeDetailsRequested.add(this.renderForShape, this); + + this.domAttach = new DynamicDomAttach(this.root, this.background, { + attachClass: "visible", + }); + + this.inputReciever = new InputReceiver("shape_viewer"); + this.keyActionMapper = new KeyActionMapper(this.root, this.inputReciever); + + this.keyActionMapper.getBinding(KEYMAPPINGS.general.back).add(this.close, this); + + this.close(); + } + + /** + * Closes the dialog + */ + close() { + this.visible = false; + document.body.classList.remove("ingameDialogOpen"); + this.root.app.inputMgr.makeSureDetached(this.inputReciever); + this.update(); + } + + /** + * Shows the viewer for a given definition + * @param {ShapeDefinition} definition + */ + renderForShape(definition) { + this.visible = true; + document.body.classList.add("ingameDialogOpen"); + this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever); + + removeAllChildren(this.contentDiv); + + const layers = definition.layers; + for (let i = 0; i < layers.length; ++i) { + const layerElem = makeDiv(this.contentDiv, null, ["layer", "layer-" + i]); + + let fakeLayers = []; + for (let k = 0; k < i; ++k) { + fakeLayers.push([null, null, null, null]); + } + fakeLayers.push(layers[i]); + + const thisLayerOnly = new ShapeDefinition({ layers: fakeLayers }); + const thisLayerCanvas = thisLayerOnly.generateAsCanvas(160); + layerElem.appendChild(thisLayerCanvas); + + for (let quad = 0; quad < 4; ++quad) { + const quadElem = makeDiv(layerElem, null, ["quad", "quad-" + quad]); + + const contents = layers[i][quad]; + if (contents) { + const colorLabelElem = makeDiv( + quadElem, + null, + ["colorLabel"], + T.ingame.colors[contents.color] + ); + } else { + const emptyLabelElem = makeDiv( + quadElem, + null, + ["emptyLabel"], + T.ingame.shapeViewer.empty + ); + } + } + + if (i < layers.length - 1) { + makeDiv(this.contentDiv, null, ["seperator"], "+"); + } + } + } + + /** + * Cleans up everything + */ + cleanup() { + document.body.classList.remove("ingameDialogOpen"); + } + + update() { + this.domAttach.update(this.visible); + } +} diff --git a/src/js/game/hud/parts/shop.js b/src/js/game/hud/parts/shop.js index 912fb3f1..a57b5d81 100644 --- a/src/js/game/hud/parts/shop.js +++ b/src/js/game/hud/parts/shop.js @@ -79,6 +79,7 @@ export class HUDShop extends BaseHUDPart { const requiredHandle = handle.requireIndexToElement[i]; requiredHandle.container.remove(); requiredHandle.pinDetector.cleanup(); + requiredHandle.infoDetector.cleanup(); } // Cleanup @@ -122,6 +123,10 @@ export class HUDShop extends BaseHUDPart { pinButton.classList.add("pin"); container.appendChild(pinButton); + const viewInfoButton = document.createElement("button"); + viewInfoButton.classList.add("showInfo"); + container.appendChild(viewInfoButton); + const currentGoalShape = this.root.hubGoals.currentGoal.definition.getHash(); if (shape === currentGoalShape) { pinButton.classList.add("isGoal"); @@ -145,6 +150,14 @@ export class HUDShop extends BaseHUDPart { } }); + const infoDetector = new ClickDetector(viewInfoButton, { + consumeEvents: true, + preventDefault: true, + }); + infoDetector.click.add(() => + this.root.hud.signals.viewShapeDetailsRequested.dispatch(shapeDef) + ); + handle.requireIndexToElement.push({ container, progressLabel, @@ -152,6 +165,7 @@ export class HUDShop extends BaseHUDPart { definition: shapeDef, required: amount, pinDetector, + infoDetector, }); }); } @@ -202,6 +216,7 @@ export class HUDShop extends BaseHUDPart { const requiredHandle = handle.requireIndexToElement[i]; requiredHandle.container.remove(); requiredHandle.pinDetector.cleanup(); + requiredHandle.infoDetector.cleanup(); } handle.requireIndexToElement = []; } diff --git a/src/js/game/shape_definition.js b/src/js/game/shape_definition.js index d785f6ab..8644e353 100644 --- a/src/js/game/shape_definition.js +++ b/src/js/game/shape_definition.js @@ -333,7 +333,7 @@ export class ShapeDefinition extends BasicSerializableObject { const quadrantSize = 10; const quadrantHalfSize = quadrantSize / 2; - context.fillStyle = "rgba(40, 50, 65, 0.1)"; + context.fillStyle = THEME.items.circleBackground; context.beginCircle(0, 0, quadrantSize * 1.15); context.fill(); diff --git a/src/js/game/sound_proxy.js b/src/js/game/sound_proxy.js index d0f4c660..0408586d 100644 --- a/src/js/game/sound_proxy.js +++ b/src/js/game/sound_proxy.js @@ -8,7 +8,7 @@ import { SOUNDS } from "../platform/sound"; const avgSoundDurationSeconds = 0.25; const maxOngoingSounds = 2; -const maxOngoingUiSounds = 25; +const maxOngoingUiSounds = 10; // Proxy to the application sound instance export class SoundProxy { diff --git a/src/js/game/themes/dark.json b/src/js/game/themes/dark.json index ef707663..a544b399 100644 --- a/src/js/game/themes/dark.json +++ b/src/js/game/themes/dark.json @@ -12,6 +12,8 @@ "directionLock": "rgb(74, 237, 134)", "directionLockTrack": "rgba(74, 237, 134, 0.2)", + "colorBlindPickerTile": "rgba(255, 255, 255, 0.5)", + "resources": { "shape": "#3d3f4a", "red": "#4a3d3f", @@ -26,6 +28,7 @@ "items": { "outline": "#111418", - "outlineWidth": 0.75 + "outlineWidth": 0.75, + "circleBackground": "rgba(20, 30, 40, 0.3)" } } diff --git a/src/js/game/themes/light.json b/src/js/game/themes/light.json index c5eead32..58231fa0 100644 --- a/src/js/game/themes/light.json +++ b/src/js/game/themes/light.json @@ -12,6 +12,8 @@ "directionLock": "rgb(74, 237, 134)", "directionLockTrack": "rgba(74, 237, 134, 0.2)", + "colorBlindPickerTile": "rgba(50, 50, 50, 0.4)", + "resources": { "shape": "#eaebec", "red": "#ffbfc1", @@ -27,6 +29,7 @@ "items": { "outline": "#55575a", - "outlineWidth": 0.75 + "outlineWidth": 0.75, + "circleBackground": "rgba(40, 50, 65, 0.1)" } } diff --git a/src/js/platform/sound.js b/src/js/platform/sound.js index dc6b073f..60d472f8 100644 --- a/src/js/platform/sound.js +++ b/src/js/platform/sound.js @@ -22,6 +22,7 @@ export const SOUNDS = { levelComplete: "level_complete", + destroyBuilding: "destroy_building", placeBuilding: "place_building", placeBelt: "place_belt", }; diff --git a/src/js/profile/application_settings.js b/src/js/profile/application_settings.js index 83aa21fb..16ec4cbd 100644 --- a/src/js/profile/application_settings.js +++ b/src/js/profile/application_settings.js @@ -172,6 +172,15 @@ export const allApplicationSettings = [ (app, value) => app.sound.setMusicMuted(value) ), + new BoolSetting( + "enableColorBlindHelper", + categoryApp, + /** + * @param {Application} app + */ + (app, value) => null + ), + // GAME new BoolSetting("offerHints", categoryGame, (app, value) => {}), @@ -269,6 +278,8 @@ class SettingsStorage { this.compactBuildingInfo = false; this.disableCutDeleteWarnings = false; + this.enableColorBlindHelper = false; + /** * @type {Object.} */ @@ -468,7 +479,7 @@ export class ApplicationSettings extends ReadWriteProxy { } getCurrentVersion() { - return 16; + return 17; } /** @param {{settings: SettingsStorage, version: number}} data */ @@ -536,6 +547,11 @@ export class ApplicationSettings extends ReadWriteProxy { data.version = 16; } + if (data.version < 17) { + data.settings.enableColorBlindHelper = false; + data.version = 17; + } + return ExplainedResult.good(); } } diff --git a/translations/base-en.yaml b/translations/base-en.yaml index a3d73ddf..d0a743ab 100644 --- a/translations/base-en.yaml +++ b/translations/base-en.yaml @@ -290,6 +290,17 @@ ingame: clearSelection: Clear Selection pipette: Pipette + # Names of the colors, used for the color blind mode + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) buildingPlacement: @@ -384,6 +395,11 @@ ingame: description: Left-click a marker to jump to it, right-click to delete it.

Press to create a marker from the current view, or right-click to create a marker at the selected location. creationSuccessNotification: Marker has been created. + # Shape viewer + shapeViewer: + title: Layers + empty: Empty + # Interactive tutorial interactiveTutorial: title: Tutorial @@ -652,6 +668,11 @@ settings: description: >- Change the language. All translations are user contributed and might be incomplete! + enableColorBlindHelper: + title: Color Blind Mode + description: >- + Enables various tools which allow to play the game if you are color blind. + fullscreen: title: Fullscreen description: >- From 116de7a1668e0e612b54aad1f581d56a724017ad Mon Sep 17 00:00:00 2001 From: Killgaru Date: Mon, 22 Jun 2020 15:43:58 +0300 Subject: [PATCH 05/38] Update --- res/ui/icons/info_button.png | Bin 0 -> 577 bytes src/css/ingame_hud/color_blind_helper.scss | 18 +++ src/css/ingame_hud/pinned_shapes.scss | 18 +++ src/css/ingame_hud/shape_viewer.scss | 131 ++++++++++++++++++ src/css/ingame_hud/shop.scss | 21 ++- src/css/main.scss | 4 + src/js/changelog.js | 4 + src/js/game/hud/hud.js | 19 ++- src/js/game/hud/parts/blueprint_placer.js | 3 +- .../game/hud/parts/building_placer_logic.js | 3 + src/js/game/hud/parts/color_blind_helper.js | 106 ++++++++++++++ src/js/game/hud/parts/pinned_shapes.js | 21 ++- src/js/game/hud/parts/shape_viewer.js | 109 +++++++++++++++ src/js/game/hud/parts/shop.js | 15 ++ src/js/game/shape_definition.js | 2 +- src/js/game/sound_proxy.js | 2 +- src/js/game/themes/dark.json | 5 +- src/js/game/themes/light.json | 5 +- src/js/platform/sound.js | 1 + src/js/profile/application_settings.js | 18 ++- translations/base-en.yaml | 21 +++ 21 files changed, 515 insertions(+), 11 deletions(-) create mode 100644 res/ui/icons/info_button.png create mode 100644 src/css/ingame_hud/color_blind_helper.scss create mode 100644 src/css/ingame_hud/shape_viewer.scss create mode 100644 src/js/game/hud/parts/color_blind_helper.js create mode 100644 src/js/game/hud/parts/shape_viewer.js diff --git a/res/ui/icons/info_button.png b/res/ui/icons/info_button.png new file mode 100644 index 0000000000000000000000000000000000000000..abdf2af993450f9045517427bfaba95e613a3878 GIT binary patch literal 577 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dH0CG7CJR*yM z^h*$C44EY24P;1`xJHx&=ckpFCl;kLl$V$5W#(lUCnpx9>g5-u&wghk1ys}?;1lBd z|Nnm=bHG9WlKGo~j?gIy@(X5QWar?Mkd)Q+Oh`;CuB>V4=$$lu#;g_VH*DT@@Wka? zw;w)!`tJRw&tJa&{&P_3>2ILEFP<)rAr_}wgRe6+8SwBd@R-}NwmYe?aq<8EwM<&R zI+v=wi!zP%7<6mYmS}mavVK13c7prvq6ZKCEjr%MdLYMcVRvRrYfi?ai=O2VM7I8% z`?2d|rSgII_w#;CFPAke(q(IAHF~_vKBWE~V}<3brSGOK?x~%-(VZ{uEdN<|dv}J# z>O~@U20=emJ@t+pba)ZRG2z$_zvH56?miP1^b~%Wwat9Sf(0(uDsu(BoG$Fvvf`?73_Lf5+|Id8M|Gu=T}yM;6aI#wqd8)RvP|E>S0ujx>+%T8=n7bx;PUHx3vIVCg!0GYG6f&c&j literal 0 HcmV?d00001 diff --git a/src/css/ingame_hud/color_blind_helper.scss b/src/css/ingame_hud/color_blind_helper.scss new file mode 100644 index 00000000..027b781b --- /dev/null +++ b/src/css/ingame_hud/color_blind_helper.scss @@ -0,0 +1,18 @@ +#ingame_HUD_ColorBlindBelowTileHelper { + position: absolute; + + @include SuperSmallText; + color: #fff; + background: $ingameHudBg; + @include S(padding, 5px); + @include S(top, 20px); + left: 50%; + transform: translateX(-50%); + text-transform: uppercase; + + &:not(.visible) { + display: none; + } + + @include DarkThemeInvert; +} diff --git a/src/css/ingame_hud/pinned_shapes.scss b/src/css/ingame_hud/pinned_shapes.scss index 68cf7e16..60e9159e 100644 --- a/src/css/ingame_hud/pinned_shapes.scss +++ b/src/css/ingame_hud/pinned_shapes.scss @@ -72,6 +72,24 @@ grid-row: 1 / 2; } + > .infoButton { + @include S(width, 8px); + @include S(height, 8px); + background: uiResource("icons/info_button.png") center center / 95% no-repeat; + position: absolute; + opacity: 0.7; + @include S(top, 13px); + @include S(left, -7px); + @include DarkThemeInvert; + @include IncreasedClickArea(2px); + transition: opacity 0.12s ease-in-out; + z-index: 100; + + &:hover { + opacity: 0.8; + } + } + &.goal, &.blueprint { .amountLabel::after { diff --git a/src/css/ingame_hud/shape_viewer.scss b/src/css/ingame_hud/shape_viewer.scss new file mode 100644 index 00000000..5d2484f0 --- /dev/null +++ b/src/css/ingame_hud/shape_viewer.scss @@ -0,0 +1,131 @@ +#ingame_HUD_ShapeViewer { + .dialogInner { + @include S(width, 160px); + } + .content { + display: flex; + flex-direction: column; + width: 100%; + align-items: center; + justify-items: center; + + .seperator { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + } + + .layer { + position: relative; + background: #eee; + + @include DarkThemeOverride { + background: rgba(0, 10, 20, 0.2); + } + @include S(width, 150px); + @include S(height, 100px); + display: flex; + align-items: center; + justify-content: center; + + > canvas { + @include S(width, 50px); + @include S(height, 50px); + } + + .quad { + position: absolute; + width: 50%; + height: 50%; + display: flex; + justify-content: center; + align-items: center; + box-sizing: border-box; + + $arrowDims: 23px; + $spacing: 9px; + @include S(padding, 6px); + + .colorLabel { + text-transform: uppercase; + @include SuperSmallText; + @include S(font-size, 9px); + } + + .emptyLabel { + text-transform: uppercase; + @include SuperSmallText; + @include S(font-size, 9px); + } + + &::after { + content: " "; + background: rgba(0, 10, 20, 0.5); + @include S(width, $arrowDims); + @include S(height, 1px); + position: absolute; + transform: rotate(45deg); + transform-origin: 50% 50%; + } + @include DarkThemeOverride { + &::after { + background: rgba(255, 255, 255, 0.5); + } + } + + &.quad-0 { + right: 0; + top: 0; + align-items: flex-start; + justify-content: flex-end; + + &::after { + @include S(left, $spacing); + @include S(bottom, $arrowDims / 2 + $spacing); + transform: rotate(-45deg); + } + } + &.quad-1 { + bottom: 0; + right: 0; + + align-items: flex-end; + justify-content: flex-end; + + &::after { + @include S(left, $spacing); + @include S(top, $arrowDims / 2 + $spacing); + transform: rotate(45deg); + } + } + &.quad-2 { + bottom: 0; + left: 0; + + align-items: flex-end; + justify-content: flex-start; + + &::after { + @include S(right, $spacing); + @include S(top, $arrowDims / 2 + $spacing); + transform: rotate(135deg); + } + } + &.quad-3 { + top: 0; + left: 0; + + align-items: flex-start; + justify-content: flex-start; + + &::after { + @include S(right, $spacing); + @include S(bottom, $arrowDims / 2 + $spacing); + transform: rotate(225deg); + } + } + } + } + } +} diff --git a/src/css/ingame_hud/shop.scss b/src/css/ingame_hud/shop.scss index 26f5d759..d8cc8a86 100644 --- a/src/css/ingame_hud/shop.scss +++ b/src/css/ingame_hud/shop.scss @@ -195,6 +195,25 @@ } } + button.showInfo { + @include S(width, 11px); + @include S(height, 11px); + background: uiResource("icons/info_button.png") center center / 95% no-repeat; + position: absolute; + @include S(top, 17px); + @include S(right, 2.5px); + opacity: 0.5; + cursor: pointer; + pointer-events: all; + @include IncreasedClickArea(5px); + transition: opacity 0.12s ease-in-out; + @include DarkThemeInvert; + + &:hover { + opacity: 0.6; + } + } + canvas { @include S(width, 40px); @include S(height, 40px); @@ -241,7 +260,7 @@ &.complete { background-color: $colorGreenBright; - + @include DarkThemeOverride { background-color: $colorGreenBright; } diff --git a/src/css/main.scss b/src/css/main.scss index 178f398b..6b758e80 100644 --- a/src/css/main.scss +++ b/src/css/main.scss @@ -49,6 +49,8 @@ @import "ingame_hud/blueprint_placer"; @import "ingame_hud/waypoints"; @import "ingame_hud/interactive_tutorial"; +@import "ingame_hud/color_blind_helper"; +@import "ingame_hud/shape_viewer"; // prettier-ignore $elements: @@ -74,6 +76,7 @@ ingame_HUD_buildings_toolbar, ingame_HUD_BlueprintPlacer, ingame_HUD_Waypoints_Hint, ingame_HUD_Watermark, +ingame_HUD_ColorBlindBelowTileHelper, // Overlays ingame_HUD_BetaOverlay, @@ -81,6 +84,7 @@ ingame_HUD_BetaOverlay, // Dialogs ingame_HUD_Shop, ingame_HUD_Statistics, +ingame_HUD_ShapeViewer, ingame_HUD_UnlockNotification, ingame_HUD_SettingsMenu, ingame_HUD_ModalDialogs; diff --git a/src/js/changelog.js b/src/js/changelog.js index 95553f19..b654f0de 100644 --- a/src/js/changelog.js +++ b/src/js/changelog.js @@ -3,6 +3,8 @@ export const CHANGELOG = [ version: "1.1.17", date: "unreleased", entries: [ + "Color blind mode! You can now activate it in the settings and it will show you which color is below your cursor (Either resource or on the belt)", + "Add info buttons to all shapes so you can figure out how they are built! (And also, which colors they have)", "Allow configuring autosave interval and disabling it in the settings", "The smart-tunnel placement has been reworked to properly replace belts. Thus the setting has been turned on again by default", "The soundtrack now has a higher quality on the standalone version than the web version", @@ -10,6 +12,8 @@ export const CHANGELOG = [ "Fix bug where belts in blueprints don't orient correctly (by hexy)", "Fix camera moving weird after dragging and holding (by hexy)", "Fix keybinding for pipette showing while pasting blueprints", + "Improve visibility of shape background in dark mode", + "Added sound when destroying a building", "Update tutorial image for tier 2 tunnels to explain mix/match (by jimmyshadow1)", "Prevent default actions on all keybindings in the web version so you don't accidentally use builtin browser shortcuts", ], diff --git a/src/js/game/hud/hud.js b/src/js/game/hud/hud.js index c322c707..efbde2ab 100644 --- a/src/js/game/hud/hud.js +++ b/src/js/game/hud/hud.js @@ -34,7 +34,8 @@ import { HUDPartTutorialHints } from "./parts/tutorial_hints"; import { HUDWaypoints } from "./parts/waypoints"; import { HUDInteractiveTutorial } from "./parts/interactive_tutorial"; import { HUDScreenshotExporter } from "./parts/screenshot_exporter"; -import { Entity } from "../entity"; +import { HUDColorBlindHelper } from "./parts/color_blind_helper"; +import { HUDShapeViewer } from "./parts/shape_viewer"; export class GameHUD { /** @@ -68,6 +69,7 @@ export class GameHUD { debugInfo: new HUDDebugInfo(this.root), dialogs: new HUDModalDialogs(this.root), screenshotExporter: new HUDScreenshotExporter(this.root), + shapeViewer: new HUDShapeViewer(this.root), }; this.signals = { @@ -76,7 +78,8 @@ export class GameHUD { shapeUnpinRequested: /** @type {TypedSignal<[string]>} */ (new Signal()), notification: /** @type {TypedSignal<[string, enumNotificationType]>} */ (new Signal()), buildingsSelectedForCopy: /** @type {TypedSignal<[Array]>} */ (new Signal()), - pasteBlueprintRequested: new Signal(), + pasteBlueprintRequested: /** @type {TypedSignal<[]>} */ (new Signal()), + viewShapeDetailsRequested: /** @type {TypedSignal<[ShapeDefinition]>} */ (new Signal()), }; if (!IS_MOBILE) { @@ -100,6 +103,10 @@ export class GameHUD { this.parts.vignetteOverlay = new HUDVignetteOverlay(this.root); } + if (this.root.app.settings.getAllSettings().enableColorBlindHelper) { + this.parts.colorBlindHelper = new HUDColorBlindHelper(this.root); + } + const frag = document.createDocumentFragment(); for (const key in this.parts) { this.parts[key].createElements(frag); @@ -208,7 +215,13 @@ export class GameHUD { * @param {DrawParameters} parameters */ draw(parameters) { - const partsOrder = ["waypoints", "massSelector", "buildingPlacer", "blueprintPlacer"]; + const partsOrder = [ + "waypoints", + "massSelector", + "buildingPlacer", + "blueprintPlacer", + "colorBlindHelper", + ]; for (let i = 0; i < partsOrder.length; ++i) { if (this.parts[partsOrder[i]]) { diff --git a/src/js/game/hud/parts/blueprint_placer.js b/src/js/game/hud/parts/blueprint_placer.js index ef46f101..c98fbf2d 100644 --- a/src/js/game/hud/parts/blueprint_placer.js +++ b/src/js/game/hud/parts/blueprint_placer.js @@ -10,6 +10,7 @@ import { blueprintShape } from "../../upgrades"; import { BaseHUDPart } from "../base_hud_part"; import { DynamicDomAttach } from "../dynamic_dom_attach"; import { Blueprint } from "./blueprint"; +import { SOUNDS } from "../../../platform/sound"; export class HUDBlueprintPlacer extends BaseHUDPart { createElements(parent) { @@ -103,7 +104,7 @@ export class HUDBlueprintPlacer extends BaseHUDPart { if (blueprint.tryPlace(this.root, tile)) { const cost = blueprint.getCost(); this.root.hubGoals.takeShapeByKey(blueprintShape, cost); - + this.root.soundProxy.playUi(SOUNDS.placeBuilding); // This actually feels weird // if (!this.root.keyMapper.getBinding(KEYMAPPINGS.placementModifiers.placeMultiple).pressed) { // this.currentBlueprint.set(null); diff --git a/src/js/game/hud/parts/building_placer_logic.js b/src/js/game/hud/parts/building_placer_logic.js index 0da81d4a..c9b3bfb8 100644 --- a/src/js/game/hud/parts/building_placer_logic.js +++ b/src/js/game/hud/parts/building_placer_logic.js @@ -10,6 +10,7 @@ import { Entity } from "../../entity"; import { KEYMAPPINGS } from "../../key_action_mapper"; import { defaultBuildingVariant, MetaBuilding } from "../../meta_building"; import { BaseHUDPart } from "../base_hud_part"; +import { SOUNDS } from "../../../platform/sound"; /** * Contains all logic for the building placer - this doesn't include the rendering @@ -215,6 +216,7 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart { const contents = this.root.map.getTileContent(tile); if (contents) { this.root.logic.tryDeleteBuilding(contents); + this.root.soundProxy.playUi(SOUNDS.destroyBuilding); } } @@ -650,6 +652,7 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart { const contents = this.root.map.getTileContentXY(x0, y0); if (contents && !contents.queuedForDestroy && !contents.destroyed) { this.root.logic.tryDeleteBuilding(contents); + this.root.soundProxy.playUi(SOUNDS.destroyBuilding); } } else { this.tryPlaceCurrentBuildingAt(new Vector(x0, y0)); diff --git a/src/js/game/hud/parts/color_blind_helper.js b/src/js/game/hud/parts/color_blind_helper.js new file mode 100644 index 00000000..4e6a0229 --- /dev/null +++ b/src/js/game/hud/parts/color_blind_helper.js @@ -0,0 +1,106 @@ +import { BaseHUDPart } from "../base_hud_part"; +import { makeDiv } from "../../../core/utils"; +import { TrackedState } from "../../../core/tracked_state"; +import { enumColors } from "../../colors"; +import { ColorItem } from "../../items/color_item"; +import { DrawParameters } from "../../../core/draw_parameters"; +import { THEME } from "../../theme"; +import { globalConfig } from "../../../core/config"; +import { T } from "../../../translations"; + +export class HUDColorBlindHelper extends BaseHUDPart { + createElements(parent) { + this.belowTileIndicator = makeDiv(parent, "ingame_HUD_ColorBlindBelowTileHelper", []); + } + + initialize() { + this.trackedColorBelowTile = new TrackedState(this.onColorBelowTileChanged, this); + } + + /** + * Called when the color below the current tile changed + * @param {enumColors|null} color + */ + onColorBelowTileChanged(color) { + this.belowTileIndicator.classList.toggle("visible", !!color); + if (color) { + this.belowTileIndicator.innerText = T.ingame.colors[color]; + } + } + + /** + * Computes the color below the current tile + * @returns {enumColors} + */ + computeColorBelowTile() { + const mousePosition = this.root.app.mousePosition; + if (!mousePosition) { + // Not on screen + return null; + } + + const worldPos = this.root.camera.screenToWorld(mousePosition); + const tile = worldPos.toTileSpace(); + const contents = this.root.map.getTileContent(tile); + + if (contents && !contents.components.Miner) { + const beltComp = contents.components.Belt; + + // Check if the belt has a color item + if (beltComp) { + const firstItem = beltComp.sortedItems[0]; + if (firstItem && firstItem[1] instanceof ColorItem) { + return firstItem[1].color; + } + } + + // Check if we are ejecting an item, if so use that color + const ejectorComp = contents.components.ItemEjector; + if (ejectorComp) { + for (let i = 0; i < ejectorComp.slots.length; ++i) { + const slot = ejectorComp.slots[i]; + if (slot.item && slot.item instanceof ColorItem) { + return slot.item.color; + } + } + } + } else { + // We hovered a lower layer, show the color there + const lowerLayer = this.root.map.getLowerLayerContentXY(tile.x, tile.y); + if (lowerLayer && lowerLayer instanceof ColorItem) { + return lowerLayer.color; + } + } + + return null; + } + + update() { + this.trackedColorBelowTile.set(this.computeColorBelowTile()); + } + + /** + * Draws the currently selected tile + * @param {DrawParameters} parameters + */ + draw(parameters) { + const mousePosition = this.root.app.mousePosition; + if (!mousePosition) { + // Not on screen + return null; + } + + const below = this.computeColorBelowTile(); + if (below) { + // We have something below our tile + const worldPos = this.root.camera.screenToWorld(mousePosition); + const tile = worldPos.toTileSpace().toWorldSpace(); + + parameters.context.strokeStyle = THEME.map.colorBlindPickerTile; + parameters.context.lineWidth = 1; + parameters.context.beginPath(); + parameters.context.rect(tile.x, tile.y, globalConfig.tileSize, globalConfig.tileSize); + parameters.context.stroke(); + } + } +} diff --git a/src/js/game/hud/parts/pinned_shapes.js b/src/js/game/hud/parts/pinned_shapes.js index 62afff25..3f935a0b 100644 --- a/src/js/game/hud/parts/pinned_shapes.js +++ b/src/js/game/hud/parts/pinned_shapes.js @@ -26,7 +26,8 @@ export class HUDPinnedShapes extends BaseHUDPart { * amountLabel: HTMLElement, * lastRenderedValue: string, * element: HTMLElement, - * detector?: ClickDetector + * detector?: ClickDetector, + * infoDetector?: ClickDetector * }>} */ this.handles = []; @@ -155,6 +156,10 @@ export class HUDPinnedShapes extends BaseHUDPart { if (detector) { detector.cleanup(); } + const infoDetector = this.handles[i].infoDetector; + if (infoDetector) { + infoDetector.cleanup(); + } } this.handles = []; @@ -198,12 +203,24 @@ export class HUDPinnedShapes extends BaseHUDPart { detector = new ClickDetector(element, { consumeEvents: true, preventDefault: true, + targetOnly: true, }); detector.click.add(() => this.unpinShape(key)); } else { element.classList.add("marked"); } + // Show small info icon + const infoButton = document.createElement("button"); + infoButton.classList.add("infoButton"); + element.appendChild(infoButton); + const infoDetector = new ClickDetector(infoButton, { + consumeEvents: true, + preventDefault: true, + targetOnly: true, + }); + infoDetector.click.add(() => this.root.hud.signals.viewShapeDetailsRequested.dispatch(definition)); + const amountLabel = makeDiv(element, null, ["amountLabel"], ""); const goal = this.findGoalValueForShape(key); @@ -216,6 +233,8 @@ export class HUDPinnedShapes extends BaseHUDPart { element, amountLabel, lastRenderedValue: "", + detector, + infoDetector, }); } diff --git a/src/js/game/hud/parts/shape_viewer.js b/src/js/game/hud/parts/shape_viewer.js new file mode 100644 index 00000000..fa083793 --- /dev/null +++ b/src/js/game/hud/parts/shape_viewer.js @@ -0,0 +1,109 @@ +import { BaseHUDPart } from "../base_hud_part"; +import { makeDiv, removeAllChildren } from "../../../core/utils"; +import { T } from "../../../translations"; +import { defaultBuildingVariant } from "../../meta_building"; +import { ShapeDefinition } from "../../shape_definition"; +import { KEYMAPPINGS, KeyActionMapper } from "../../key_action_mapper"; +import { InputReceiver } from "../../../core/input_receiver"; +import { DynamicDomAttach } from "../dynamic_dom_attach"; + +export class HUDShapeViewer extends BaseHUDPart { + createElements(parent) { + this.background = makeDiv(parent, "ingame_HUD_ShapeViewer", ["ingameDialog"]); + + // DIALOG Inner / Wrapper + this.dialogInner = makeDiv(this.background, null, ["dialogInner"]); + this.title = makeDiv(this.dialogInner, null, ["title"], T.ingame.shapeViewer.title); + this.closeButton = makeDiv(this.title, null, ["closeButton"]); + this.trackClicks(this.closeButton, this.close); + this.contentDiv = makeDiv(this.dialogInner, null, ["content"]); + } + + initialize() { + this.root.hud.signals.viewShapeDetailsRequested.add(this.renderForShape, this); + + this.domAttach = new DynamicDomAttach(this.root, this.background, { + attachClass: "visible", + }); + + this.inputReciever = new InputReceiver("shape_viewer"); + this.keyActionMapper = new KeyActionMapper(this.root, this.inputReciever); + + this.keyActionMapper.getBinding(KEYMAPPINGS.general.back).add(this.close, this); + + this.close(); + } + + /** + * Closes the dialog + */ + close() { + this.visible = false; + document.body.classList.remove("ingameDialogOpen"); + this.root.app.inputMgr.makeSureDetached(this.inputReciever); + this.update(); + } + + /** + * Shows the viewer for a given definition + * @param {ShapeDefinition} definition + */ + renderForShape(definition) { + this.visible = true; + document.body.classList.add("ingameDialogOpen"); + this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever); + + removeAllChildren(this.contentDiv); + + const layers = definition.layers; + for (let i = 0; i < layers.length; ++i) { + const layerElem = makeDiv(this.contentDiv, null, ["layer", "layer-" + i]); + + let fakeLayers = []; + for (let k = 0; k < i; ++k) { + fakeLayers.push([null, null, null, null]); + } + fakeLayers.push(layers[i]); + + const thisLayerOnly = new ShapeDefinition({ layers: fakeLayers }); + const thisLayerCanvas = thisLayerOnly.generateAsCanvas(160); + layerElem.appendChild(thisLayerCanvas); + + for (let quad = 0; quad < 4; ++quad) { + const quadElem = makeDiv(layerElem, null, ["quad", "quad-" + quad]); + + const contents = layers[i][quad]; + if (contents) { + const colorLabelElem = makeDiv( + quadElem, + null, + ["colorLabel"], + T.ingame.colors[contents.color] + ); + } else { + const emptyLabelElem = makeDiv( + quadElem, + null, + ["emptyLabel"], + T.ingame.shapeViewer.empty + ); + } + } + + if (i < layers.length - 1) { + makeDiv(this.contentDiv, null, ["seperator"], "+"); + } + } + } + + /** + * Cleans up everything + */ + cleanup() { + document.body.classList.remove("ingameDialogOpen"); + } + + update() { + this.domAttach.update(this.visible); + } +} diff --git a/src/js/game/hud/parts/shop.js b/src/js/game/hud/parts/shop.js index 912fb3f1..a57b5d81 100644 --- a/src/js/game/hud/parts/shop.js +++ b/src/js/game/hud/parts/shop.js @@ -79,6 +79,7 @@ export class HUDShop extends BaseHUDPart { const requiredHandle = handle.requireIndexToElement[i]; requiredHandle.container.remove(); requiredHandle.pinDetector.cleanup(); + requiredHandle.infoDetector.cleanup(); } // Cleanup @@ -122,6 +123,10 @@ export class HUDShop extends BaseHUDPart { pinButton.classList.add("pin"); container.appendChild(pinButton); + const viewInfoButton = document.createElement("button"); + viewInfoButton.classList.add("showInfo"); + container.appendChild(viewInfoButton); + const currentGoalShape = this.root.hubGoals.currentGoal.definition.getHash(); if (shape === currentGoalShape) { pinButton.classList.add("isGoal"); @@ -145,6 +150,14 @@ export class HUDShop extends BaseHUDPart { } }); + const infoDetector = new ClickDetector(viewInfoButton, { + consumeEvents: true, + preventDefault: true, + }); + infoDetector.click.add(() => + this.root.hud.signals.viewShapeDetailsRequested.dispatch(shapeDef) + ); + handle.requireIndexToElement.push({ container, progressLabel, @@ -152,6 +165,7 @@ export class HUDShop extends BaseHUDPart { definition: shapeDef, required: amount, pinDetector, + infoDetector, }); }); } @@ -202,6 +216,7 @@ export class HUDShop extends BaseHUDPart { const requiredHandle = handle.requireIndexToElement[i]; requiredHandle.container.remove(); requiredHandle.pinDetector.cleanup(); + requiredHandle.infoDetector.cleanup(); } handle.requireIndexToElement = []; } diff --git a/src/js/game/shape_definition.js b/src/js/game/shape_definition.js index d785f6ab..8644e353 100644 --- a/src/js/game/shape_definition.js +++ b/src/js/game/shape_definition.js @@ -333,7 +333,7 @@ export class ShapeDefinition extends BasicSerializableObject { const quadrantSize = 10; const quadrantHalfSize = quadrantSize / 2; - context.fillStyle = "rgba(40, 50, 65, 0.1)"; + context.fillStyle = THEME.items.circleBackground; context.beginCircle(0, 0, quadrantSize * 1.15); context.fill(); diff --git a/src/js/game/sound_proxy.js b/src/js/game/sound_proxy.js index d0f4c660..0408586d 100644 --- a/src/js/game/sound_proxy.js +++ b/src/js/game/sound_proxy.js @@ -8,7 +8,7 @@ import { SOUNDS } from "../platform/sound"; const avgSoundDurationSeconds = 0.25; const maxOngoingSounds = 2; -const maxOngoingUiSounds = 25; +const maxOngoingUiSounds = 10; // Proxy to the application sound instance export class SoundProxy { diff --git a/src/js/game/themes/dark.json b/src/js/game/themes/dark.json index ef707663..a544b399 100644 --- a/src/js/game/themes/dark.json +++ b/src/js/game/themes/dark.json @@ -12,6 +12,8 @@ "directionLock": "rgb(74, 237, 134)", "directionLockTrack": "rgba(74, 237, 134, 0.2)", + "colorBlindPickerTile": "rgba(255, 255, 255, 0.5)", + "resources": { "shape": "#3d3f4a", "red": "#4a3d3f", @@ -26,6 +28,7 @@ "items": { "outline": "#111418", - "outlineWidth": 0.75 + "outlineWidth": 0.75, + "circleBackground": "rgba(20, 30, 40, 0.3)" } } diff --git a/src/js/game/themes/light.json b/src/js/game/themes/light.json index c5eead32..58231fa0 100644 --- a/src/js/game/themes/light.json +++ b/src/js/game/themes/light.json @@ -12,6 +12,8 @@ "directionLock": "rgb(74, 237, 134)", "directionLockTrack": "rgba(74, 237, 134, 0.2)", + "colorBlindPickerTile": "rgba(50, 50, 50, 0.4)", + "resources": { "shape": "#eaebec", "red": "#ffbfc1", @@ -27,6 +29,7 @@ "items": { "outline": "#55575a", - "outlineWidth": 0.75 + "outlineWidth": 0.75, + "circleBackground": "rgba(40, 50, 65, 0.1)" } } diff --git a/src/js/platform/sound.js b/src/js/platform/sound.js index dc6b073f..60d472f8 100644 --- a/src/js/platform/sound.js +++ b/src/js/platform/sound.js @@ -22,6 +22,7 @@ export const SOUNDS = { levelComplete: "level_complete", + destroyBuilding: "destroy_building", placeBuilding: "place_building", placeBelt: "place_belt", }; diff --git a/src/js/profile/application_settings.js b/src/js/profile/application_settings.js index 83aa21fb..16ec4cbd 100644 --- a/src/js/profile/application_settings.js +++ b/src/js/profile/application_settings.js @@ -172,6 +172,15 @@ export const allApplicationSettings = [ (app, value) => app.sound.setMusicMuted(value) ), + new BoolSetting( + "enableColorBlindHelper", + categoryApp, + /** + * @param {Application} app + */ + (app, value) => null + ), + // GAME new BoolSetting("offerHints", categoryGame, (app, value) => {}), @@ -269,6 +278,8 @@ class SettingsStorage { this.compactBuildingInfo = false; this.disableCutDeleteWarnings = false; + this.enableColorBlindHelper = false; + /** * @type {Object.} */ @@ -468,7 +479,7 @@ export class ApplicationSettings extends ReadWriteProxy { } getCurrentVersion() { - return 16; + return 17; } /** @param {{settings: SettingsStorage, version: number}} data */ @@ -536,6 +547,11 @@ export class ApplicationSettings extends ReadWriteProxy { data.version = 16; } + if (data.version < 17) { + data.settings.enableColorBlindHelper = false; + data.version = 17; + } + return ExplainedResult.good(); } } diff --git a/translations/base-en.yaml b/translations/base-en.yaml index a3d73ddf..d0a743ab 100644 --- a/translations/base-en.yaml +++ b/translations/base-en.yaml @@ -290,6 +290,17 @@ ingame: clearSelection: Clear Selection pipette: Pipette + # Names of the colors, used for the color blind mode + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) buildingPlacement: @@ -384,6 +395,11 @@ ingame: description: Left-click a marker to jump to it, right-click to delete it.

Press to create a marker from the current view, or right-click to create a marker at the selected location. creationSuccessNotification: Marker has been created. + # Shape viewer + shapeViewer: + title: Layers + empty: Empty + # Interactive tutorial interactiveTutorial: title: Tutorial @@ -652,6 +668,11 @@ settings: description: >- Change the language. All translations are user contributed and might be incomplete! + enableColorBlindHelper: + title: Color Blind Mode + description: >- + Enables various tools which allow to play the game if you are color blind. + fullscreen: title: Fullscreen description: >- From 231a3c81f452cc776624219cf9839641dd6a4757 Mon Sep 17 00:00:00 2001 From: tobspr Date: Mon, 22 Jun 2020 14:44:47 +0200 Subject: [PATCH 06/38] Fix typo --- src/js/game/hub_goals.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/game/hub_goals.js b/src/js/game/hub_goals.js index ef7797a9..9f65dc4c 100644 --- a/src/js/game/hub_goals.js +++ b/src/js/game/hub_goals.js @@ -275,7 +275,7 @@ export class HubGoals extends BasicSerializableObject { * @param {string} upgradeId * @returns {boolean} */ - tryUnlockUgprade(upgradeId) { + tryUnlockUpgrade(upgradeId) { if (!this.canUnlockUpgrade(upgradeId)) { return false; } From c5613f6eeed63ea3d1079c4adf16dafd02693f2f Mon Sep 17 00:00:00 2001 From: tobspr Date: Mon, 22 Jun 2020 14:46:33 +0200 Subject: [PATCH 07/38] Regression --- src/js/changelog.js | 1 - src/js/core/input_distributor.js | 12 +++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/js/changelog.js b/src/js/changelog.js index b654f0de..7650814b 100644 --- a/src/js/changelog.js +++ b/src/js/changelog.js @@ -15,7 +15,6 @@ export const CHANGELOG = [ "Improve visibility of shape background in dark mode", "Added sound when destroying a building", "Update tutorial image for tier 2 tunnels to explain mix/match (by jimmyshadow1)", - "Prevent default actions on all keybindings in the web version so you don't accidentally use builtin browser shortcuts", ], }, { diff --git a/src/js/core/input_distributor.js b/src/js/core/input_distributor.js index a59f4fbc..03ad8e0c 100644 --- a/src/js/core/input_distributor.js +++ b/src/js/core/input_distributor.js @@ -191,7 +191,17 @@ export class InputDistributor { */ handleKeyMouseDown(event) { const keyCode = event instanceof MouseEvent ? event.button + 1 : event.keyCode; - event.preventDefault(); + if ( + keyCode === 4 || // MB4 + keyCode === 5 || // MB5 + keyCode === 9 || // TAB + keyCode === 16 || // SHIFT + keyCode === 17 || // CTRL + keyCode === 18 || // ALT + (keyCode >= 112 && keyCode < 122) // F1 - F10 + ) { + event.preventDefault(); + } const isInitial = !this.keysDown.has(keyCode); this.keysDown.add(keyCode); From 829d1e1790d1fee2f14661ec33b7ceaa69f908ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pascal=20Gross=C3=A9?= Date: Mon, 22 Jun 2020 14:53:02 +0200 Subject: [PATCH 08/38] French translation is up to date --- translations/base-fr.yaml | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/translations/base-fr.yaml b/translations/base-fr.yaml index e9e37720..a0bb35d2 100644 --- a/translations/base-fr.yaml +++ b/translations/base-fr.yaml @@ -212,7 +212,7 @@ dialogs: keybindingsResetOk: title: Réinitialisation des contrôles - desc: Les contrôles ont été réinitialisés par leur état par défaut respectifs ! + desc: Les contrôles ont été réinitialisés dans leur état par défaut respectifs ! featureRestriction: title: Version démo @@ -236,7 +236,7 @@ dialogs: massDeleteConfirm: title: Confirmation de suppression desc: >- - Vous allez supprimer pas mal de bâtiments ( pour être exact) ! Etes vous certains de vouloir faire cela ? + Vous allez supprimer pas mal de bâtiments ( pour être exact) ! Êtes vous certains de vouloir faire cela ? massCutConfirm: title: Confirmer la coupure @@ -247,7 +247,7 @@ dialogs: blueprintsNotUnlocked: title: Pas encore débloqué desc: >- - Les patrons n'ont pas encore étés débloqués ! Terminez encore quelques niveaux pour les débloquer. + Les patrons n'ont pas encore étés débloqués ! Terminez encore quelques niveaux pour y avoir accès. keybindingsIntroduction: title: Raccourcis utiles @@ -288,9 +288,9 @@ ingame: pasteLastBlueprint: Copier le dernier patron lockBeltDirection: Utiliser le plannificateur de convoyeurs plannerSwitchSide: Échanger la direction du plannificateur - cutSelection: Cut - copySelection: Copy - clearSelection: Clear Selection + cutSelection: Couper + copySelection: Copier + clearSelection: Effacer la sélection pipette: Pipette # Everything related to placing buildings (I.e. as soon as you selected a building @@ -691,27 +691,24 @@ settings: Permet l'affichage de l'effet de vignette qui assombrit les coins de l'écran afin de rendre le texte plus facile à lire. autosaveInterval: - title: Autosave Interval + title: Fréquence des sauvegardes automatiques description: >- - Controls how often the game saves automatically. You can also disable it - entirely here. + Contrôle avec quelle fréquence le jeu sera sauvegardé automatiquement. Vous pouvez aussi entièrement désactiver cette fonctionnalité ici. intervals: one_minute: 1 Minute two_minutes: 2 Minutes five_minutes: 5 Minutes ten_minutes: 10 Minutes twenty_minutes: 20 Minutes - disabled: Disabled + disabled: Désactivé compactBuildingInfo: - title: Compact Building Infos + title: Informations réduites sur les bâtiments description: >- - Shortens info boxes for buildings by only showing their ratios. Otherwise a - description and image is shown. + Raccourcit les panneaux d'information sur les bâtiments en n'affichant que les ratios. Dans le cas contraire, une description et une imagine sont présentés. disableCutDeleteWarnings: - title: Disable Cut/Delete Warnings + title: Désactive les avertissement pour Couper/Effacer description: >- - Disable the warning dialogs brought up when cutting/deleting more than 100 - entities. + Désactive la boîte de dialogue qui s'affiche lorsque vous vous apprêtez à couper/effacer plus de 100 entités. keybindings: title: Contrôles From e9581c653f91e2101426df45b99051052bd33088 Mon Sep 17 00:00:00 2001 From: tobspr Date: Mon, 22 Jun 2020 14:55:43 +0200 Subject: [PATCH 09/38] Fix main menu rendering --- src/css/states/main_menu.scss | 6 ++++++ src/js/states/main_menu.js | 31 +++++++++++++------------------ 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/css/states/main_menu.scss b/src/css/states/main_menu.scss index fa9d430c..7812de62 100644 --- a/src/css/states/main_menu.scss +++ b/src/css/states/main_menu.scss @@ -224,6 +224,12 @@ width: 100%; box-sizing: border-box; + .buttons { + display: flex; + flex-direction: column; + align-items: center; + } + .browserWarning { @include S(margin-bottom, 10px); background-color: $colorRedBright; diff --git a/src/js/states/main_menu.js b/src/js/states/main_menu.js index 8665b80e..29677686 100644 --- a/src/js/states/main_menu.js +++ b/src/js/states/main_menu.js @@ -9,6 +9,7 @@ import { waitNextFrame, isSupportedBrowser, makeButton, + removeAllChildren, } from "../core/utils"; import { ReadWriteProxy } from "../core/read_write_proxy"; import { HUDModalDialogs } from "../game/hud/parts/modal_dialogs"; @@ -72,6 +73,7 @@ export class MainMenuState extends GameState { ? "" : `
${T.mainMenu.browserWarning}
` } +
@@ -148,6 +150,7 @@ export class MainMenuState extends GameState { T.dialogs.importSavegameSuccess.text ); + this.renderMainMenu(); this.renderSavegames(); }, err => { @@ -255,6 +258,10 @@ export class MainMenuState extends GameState { } renderMainMenu() { + const buttonContainer = this.htmlElement.querySelector(".mainContainer .buttons"); + removeAllChildren(buttonContainer); + + // Import button const importButtonElement = makeButtonElement( ["importButton", "styledButton"], T.mainMenu.importSavegame @@ -262,14 +269,15 @@ export class MainMenuState extends GameState { this.trackClicks(importButtonElement, this.requestImportSavegame); if (this.savedGames.length > 0) { + // Continue game const continueButton = makeButton( - this.htmlElement.querySelector(".mainContainer"), + buttonContainer, ["continueButton", "styledButton"], T.mainMenu.continue ); this.trackClicks(continueButton, this.onContinueButtonClicked); - const outerDiv = makeDiv(this.htmlElement.querySelector(".mainContainer"), null, ["outer"], null); + const outerDiv = makeDiv(buttonContainer, null, ["outer"], null); outerDiv.appendChild(importButtonElement); const newGameButton = makeButton( this.htmlElement.querySelector(".mainContainer .outer"), @@ -277,24 +285,11 @@ export class MainMenuState extends GameState { T.mainMenu.newGame ); this.trackClicks(newGameButton, this.onPlayButtonClicked); - - const oldPlayButton = this.htmlElement.querySelector(".mainContainer .playButton"); - if (oldPlayButton) oldPlayButton.remove(); } else { - const playBtn = makeButton( - this.htmlElement.querySelector(".mainContainer"), - ["playButton", "styledButton"], - T.mainMenu.play - ); + // New game + const playBtn = makeButton(buttonContainer, ["playButton", "styledButton"], T.mainMenu.play); this.trackClicks(playBtn, this.onPlayButtonClicked); - - this.htmlElement.querySelector(".mainContainer").appendChild(importButtonElement); - - const outerDiv = this.htmlElement.querySelector(".mainContainer .outer"); - if (outerDiv) { - outerDiv.remove(); - this.htmlElement.querySelector(".mainContainer .continueButton").remove(); - } + buttonContainer.appendChild(importButtonElement); } } From 28b2dc008c933a6815d8d890c17000a0ecc44809 Mon Sep 17 00:00:00 2001 From: tobspr Date: Mon, 22 Jun 2020 15:21:47 +0200 Subject: [PATCH 10/38] Add more links to main menu --- res/ui/main_menu/changelog.svg | 2 + res/ui/main_menu/reddit.svg | 1 + res/ui/main_menu/translate.svg | 2 + src/css/states/main_menu.scss | 74 +++++++++++++++++++++++++++------- src/js/core/config.js | 1 + src/js/states/main_menu.js | 16 ++++++-- translations/base-en.yaml | 1 + 7 files changed, 79 insertions(+), 18 deletions(-) create mode 100644 res/ui/main_menu/changelog.svg create mode 100644 res/ui/main_menu/reddit.svg create mode 100644 res/ui/main_menu/translate.svg diff --git a/res/ui/main_menu/changelog.svg b/res/ui/main_menu/changelog.svg new file mode 100644 index 00000000..f12bff7b --- /dev/null +++ b/res/ui/main_menu/changelog.svg @@ -0,0 +1,2 @@ + + diff --git a/res/ui/main_menu/reddit.svg b/res/ui/main_menu/reddit.svg new file mode 100644 index 00000000..46310cbf --- /dev/null +++ b/res/ui/main_menu/reddit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/res/ui/main_menu/translate.svg b/res/ui/main_menu/translate.svg new file mode 100644 index 00000000..e38b3392 --- /dev/null +++ b/res/ui/main_menu/translate.svg @@ -0,0 +1,2 @@ + + diff --git a/src/css/states/main_menu.scss b/src/css/states/main_menu.scss index 7812de62..f14cfc8b 100644 --- a/src/css/states/main_menu.scss +++ b/src/css/states/main_menu.scss @@ -343,33 +343,42 @@ } .footer { - display: flex; + display: grid; flex-grow: 1; justify-content: center; align-items: flex-end; width: 100%; + grid-template-columns: auto auto auto 1fr; + @include S(padding, 10px); + box-sizing: border-box; + @include S(grid-gap, 5px); .author { flex-grow: 1; text-align: right; - @include S(padding-right, 10px); + @include PlainText; + color: #888a8f; + a { + color: #333438; + } } @include S(padding, 15px); - > a { + + > .boxLink { display: grid; align-items: center; grid-template-columns: 1fr auto; justify-content: center; - background: #fafafa; + background: #fdfdfd; @include S(padding, 5px); @include S(padding-left, 10px); @include S(border-radius, $globalBorderRadius); - @include S(margin-left, 10px); @include SuperSmallText(); font-weight: bold; + box-sizing: border-box; text-transform: uppercase; color: #616266; @@ -377,19 +386,11 @@ transition-property: background-color, transform; pointer-events: all; @include S(width, 120px); - @include S(height, 50px); + @include S(height, 60px); + cursor: pointer; &:hover { background-color: #fff; - transform: scale(1.01); - } - - &:not(.boxLink) { - align-self: flex-end; - justify-self: flex-end; - height: unset; - width: unset; - @include S(padding, 3px); } .thirdpartyLogo { @@ -406,6 +407,49 @@ } } } + + > .sidelinks { + display: grid; + align-items: flex-start; + justify-content: flex-start; + grid-template-rows: 1fr 1fr 1fr; + @include S(grid-gap, 2px); + @include S(height, 60px); + + > a { + color: #616266; + background: #fdfdfd; + height: 100%; + + &:hover { + background-color: #fff; + } + @include SuperSmallText; + text-transform: uppercase; + width: 100%; + @include S(padding, 2px, 10px); + display: flex; + align-items: center; + justify-content: flex-start; + + @include S(padding-left, 25px); + box-sizing: border-box; + font-weight: bold; + background-position: #{D(5px)} center; + background-size: #{D(12px)}; + background-repeat: no-repeat; + + &.redditLink { + background-image: uiResource("main_menu/reddit.svg"); + } + &.changelog { + background-image: uiResource("main_menu/changelog.svg"); + } + &.helpTranslate { + background-image: uiResource("main_menu/translate.svg"); + } + } + } } @include DarkThemeOverride { diff --git a/src/js/core/config.js b/src/js/core/config.js index aad3d245..62e5d87d 100644 --- a/src/js/core/config.js +++ b/src/js/core/config.js @@ -19,6 +19,7 @@ const smoothCanvas = true; export const THIRDPARTY_URLS = { discord: "https://discord.gg/HN7EVzV", github: "https://github.com/tobspr/shapez.io", + reddit: "https://www.reddit.com/r/shapezio", standaloneStorePage: "https://store.steampowered.com/app/1318690/shapezio/", }; diff --git a/src/js/states/main_menu.js b/src/js/states/main_menu.js index 29677686..8f7d4a93 100644 --- a/src/js/states/main_menu.js +++ b/src/js/states/main_menu.js @@ -91,10 +91,14 @@ export class MainMenuState extends GameState { - ${T.changelog.title} - - ${T.mainMenu.helpTranslate} + +
${T.mainMenu.madeBy.replace( "", 'Tobias Springer' @@ -215,6 +219,7 @@ export class MainMenuState extends GameState { this.trackClicks(qs(".settingsButton"), this.onSettingsButtonClicked); this.trackClicks(qs(".changelog"), this.onChangelogClicked); + this.trackClicks(qs(".redditLink"), this.onRedditClicked); this.trackClicks(qs(".languageChoose"), this.onLanguageChooseClicked); this.trackClicks(qs(".helpTranslate"), this.onTranslationHelpLinkClicked); @@ -307,6 +312,11 @@ export class MainMenuState extends GameState { this.moveToState("ChangelogState"); } + onRedditClicked() { + this.app.analytics.trackUiClick("main_menu_reddit_link"); + this.app.platformWrapper.openExternalLink(THIRDPARTY_URLS.reddit); + } + onContestClicked() { this.app.analytics.trackUiClick("contest_click"); diff --git a/translations/base-en.yaml b/translations/base-en.yaml index d0a743ab..2ad5ef07 100644 --- a/translations/base-en.yaml +++ b/translations/base-en.yaml @@ -121,6 +121,7 @@ mainMenu: continue: Continue newGame: New Game changelog: Changelog + subreddit: Reddit importSavegame: Import openSourceHint: This game is open source! discordLink: Official Discord Server From d5b9a5b56222972a0c8e306278e7ee1a3671f5ef Mon Sep 17 00:00:00 2001 From: tobspr Date: Mon, 22 Jun 2020 15:25:08 +0200 Subject: [PATCH 11/38] Main menu dark mode fixes --- src/css/states/main_menu.scss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/css/states/main_menu.scss b/src/css/states/main_menu.scss index f14cfc8b..e3f71bb2 100644 --- a/src/css/states/main_menu.scss +++ b/src/css/states/main_menu.scss @@ -473,8 +473,9 @@ } .footer { - > a { - background: darken($darkModeGameBackground, 10); + > a, + .sidelinks > a { + background-color: darken($darkModeGameBackground, 10); color: #eee; } From 0b95f3b208e075d73ba1996b4ffd896998555333 Mon Sep 17 00:00:00 2001 From: tobspr Date: Mon, 22 Jun 2020 15:26:49 +0200 Subject: [PATCH 12/38] Fix crash --- src/css/states/main_menu.scss | 4 ++++ src/js/game/hud/parts/shop.js | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/css/states/main_menu.scss b/src/css/states/main_menu.scss index e3f71bb2..be3bcce4 100644 --- a/src/css/states/main_menu.scss +++ b/src/css/states/main_menu.scss @@ -477,6 +477,10 @@ .sidelinks > a { background-color: darken($darkModeGameBackground, 10); color: #eee; + + &:hover { + background-color: darken($darkModeGameBackground, 8); + } } .author { diff --git a/src/js/game/hud/parts/shop.js b/src/js/game/hud/parts/shop.js index a57b5d81..f83cb89b 100644 --- a/src/js/game/hud/parts/shop.js +++ b/src/js/game/hud/parts/shop.js @@ -246,6 +246,6 @@ export class HUDShop extends BaseHUDPart { tryUnlockNextTier(upgradeId) { // Nothing - this.root.hubGoals.tryUnlockUgprade(upgradeId); + this.root.hubGoals.tryUnlockUpgrade(upgradeId); } } From cd0b43d4ffd31f0045e0ee55a94022bcfbea961a Mon Sep 17 00:00:00 2001 From: tobspr Date: Mon, 22 Jun 2020 15:34:36 +0200 Subject: [PATCH 13/38] Fix placement mode staying active --- src/js/game/hud/parts/building_placer_logic.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/js/game/hud/parts/building_placer_logic.js b/src/js/game/hud/parts/building_placer_logic.js index c9b3bfb8..6aee65b6 100644 --- a/src/js/game/hud/parts/building_placer_logic.js +++ b/src/js/game/hud/parts/building_placer_logic.js @@ -184,6 +184,13 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart { if (mousePos) { this.onMouseMove(mousePos); } + + // Make sure we have nothing selected while in overview mode + if (this.root.camera.getIsMapOverlayActive()) { + if (this.currentMetaBuilding.get()) { + this.currentMetaBuilding.set(null); + } + } } /** From 56f7e8b7f6e30bbc4e0b1a0d5ca6b2377c1da77f Mon Sep 17 00:00:00 2001 From: tobspr Date: Mon, 22 Jun 2020 15:37:03 +0200 Subject: [PATCH 14/38] Enable swedish translation --- src/js/changelog.js | 1 + src/js/languages.js | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/src/js/changelog.js b/src/js/changelog.js index 7650814b..b3ce06a3 100644 --- a/src/js/changelog.js +++ b/src/js/changelog.js @@ -14,6 +14,7 @@ export const CHANGELOG = [ "Fix keybinding for pipette showing while pasting blueprints", "Improve visibility of shape background in dark mode", "Added sound when destroying a building", + "Added swedish translation", "Update tutorial image for tier 2 tunnels to explain mix/match (by jimmyshadow1)", ], }, diff --git a/src/js/languages.js b/src/js/languages.js index 2d40037b..2747c24e 100644 --- a/src/js/languages.js +++ b/src/js/languages.js @@ -86,4 +86,10 @@ export const LANGUAGES = { code: "zh", region: "CN", }, + "sv": { + name: "Svenska", + data: require("./built-temp/base-sv.json"), + code: "sv", + region: "", + }, }; From 57504bc30126f0d5cb42bc90798c8a6522c30ee2 Mon Sep 17 00:00:00 2001 From: mini-bomba <55105495+mini-bomba@users.noreply.github.com> Date: Mon, 22 Jun 2020 15:38:16 +0200 Subject: [PATCH 15/38] New keys and minor changes (aka. polishing) --- translations/base-pl.yaml | 55 +++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/translations/base-pl.yaml b/translations/base-pl.yaml index cce4ec57..28faa382 100644 --- a/translations/base-pl.yaml +++ b/translations/base-pl.yaml @@ -159,7 +159,7 @@ mainMenu: showInfo: Wyświetl contestOver: Ten konkurs już się skończył - Dołącz do serwera Discord by nie przegapić kolejnych! - madeBy: Made by + madeBy: Gra wykonana przez dialogs: buttons: @@ -292,10 +292,10 @@ ingame: pasteLastBlueprint: Wklej ostatnio skopiowany obszar lockBeltDirection: Tryb planowania taśmociągu plannerSwitchSide: Obróć planowany taśmociąg - cutSelection: Cut - copySelection: Copy - clearSelection: Clear Selection - pipette: Pipette + cutSelection: Wytnij + copySelection: Skopiuj + clearSelection: Wyczyść zaznaczenie + pipette: Wybierz obiekt z mapy # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) @@ -698,37 +698,39 @@ settings: Oferuje porady i tutoriale podczas gry. Dodatkowo chowa pewne elementy interfejsu, by ułatwić poznanie gry. enableTunnelSmartplace: - title: Smart Tunnels + title: Inteligentne taśmociągi i tunele description: >- Gdy włączone, umieszczenie tunelu automatycznie usuwa zbędny taśmociąg. - Pozwala również budować tunele przez przeciąganie i nadmiarowe tunele zostają usunięte. + Pozwala również budować tunele przez przeciąganie, gdyż niepotrzebne tunele zostają usunięte. vignette: - title: Vignette + title: Winieta description: >- - Włącza winietowanie, które przyciemnia rogi ekranu i poprawia czytelność tekstu. + Włącza winietę - przyciemnia rogi ekranu, poprawiając czytelność tekstu. autosaveInterval: - title: Autosave Interval + title: Częstość auto-zapisu description: >- - Controls how often the game saves automatically. You can also disable it - entirely here. + Zmienia, jak często gra automatycznie zapisuje fabrykę. + Można tą funkcję również całkowicie wyłączyć. intervals: - one_minute: 1 Minute - two_minutes: 2 Minutes - five_minutes: 5 Minutes - ten_minutes: 10 Minutes - twenty_minutes: 20 Minutes - disabled: Disabled + one_minute: Co minutę + two_minutes: Co 2 minuty + five_minutes: Co 5 minut + ten_minutes: Co 10 minut + twenty_minutes: Co 20 minut + disabled: Wyłączone + compactBuildingInfo: - title: Compact Building Infos + title: Wyłącz opis budynków description: >- - Shortens info boxes for buildings by only showing their ratios. Otherwise a - description and image is shown. + Ukrywa opis i zdjęcie budynków w obszarze informacyjnym, pokazując jedynie + ich tytuł i specyfikacje techniczne. + disableCutDeleteWarnings: - title: Disable Cut/Delete Warnings + title: Wyłącz ostrzeżenia usuwania/wycinania description: >- - Disable the warning dialogs brought up when cutting/deleting more than 100 - entities. + Wyłącza ostrzeżenia wyświetlające się przy usuwaniu lub wycinaniu więcej niż + 100 budynków. keybindings: title: Klawiszologia @@ -793,8 +795,9 @@ keybindings: massSelectCut: Wytnij obszar exportScreenshot: Wyeksportuj całą fabrykę jako zrzut ekranu lockBeltDirection: Tryb planowania taśmociągu - switchDirectionLockSide: "Planowanie taśmociągu: Zmień stronę" - pipette: Pipette + switchDirectionLockSide: >- + Planowanie taśmociągu: Zmień stronę + pipette: Wybieranie obiektów z mapy about: title: O Grze From 4bf5adb89c7c72f6bf071ecd33165af46b5e1463 Mon Sep 17 00:00:00 2001 From: mini-bomba <55105495+mini-bomba@users.noreply.github.com> Date: Mon, 22 Jun 2020 15:46:36 +0200 Subject: [PATCH 16/38] Add new lang-keys for colourblind mode (base-pl) --- translations/base-pl.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/translations/base-pl.yaml b/translations/base-pl.yaml index 28faa382..b0ec80cb 100644 --- a/translations/base-pl.yaml +++ b/translations/base-pl.yaml @@ -297,6 +297,17 @@ ingame: clearSelection: Wyczyść zaznaczenie pipette: Wybierz obiekt z mapy + # Names of the colors, used for the color blind mode + colors: + red: Czerwony + green: Zielony + blue: Niebieski + yellow: Żółty + purple: Fioletowy + cyan: Cyjanowy + white: Biały + uncolored: Brak koloru + # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) buildingPlacement: @@ -394,6 +405,11 @@ ingame: description: Kliknij znacznik lewym przyciskiem myszy, by się do niego przenieść lub prawym, by go usunąć.

Naciśnij , by stworzyć marker na środku widoku lub prawy przycisk myszy, by stworzyć na wskazanej lokacji. creationSuccessNotification: Utworzono znacznik. + # Shape viewer + shapeViewer: + title: Poziomy + empty: Puste + # Interactive tutorial interactiveTutorial: title: Tutorial From 0f9e6445d27b586d6051f7e7e50f96615986cc48 Mon Sep 17 00:00:00 2001 From: tobspr Date: Mon, 22 Jun 2020 16:06:27 +0200 Subject: [PATCH 17/38] Set release date --- artwork/steam/announcement.png | Bin 17746 -> 18610 bytes artwork/steam/announcement.psd | 4 ++-- src/js/changelog.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/artwork/steam/announcement.png b/artwork/steam/announcement.png index 1aacc62e82392d1dbd962548936fc6408a526829..cc0861dbef9735727f8c8a2ab263781824fe6d68 100644 GIT binary patch literal 18610 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 literal 17746 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 diff --git a/artwork/steam/announcement.psd b/artwork/steam/announcement.psd index 30dce1e6..518a49ac 100644 --- a/artwork/steam/announcement.psd +++ b/artwork/steam/announcement.psd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ebde52e75e54d2f4add0cf498c85f059082a0745212a23c4de7328a7d78b00a5 -size 238170 +oid sha256:ae83b8805191eeba13016e40216fc4781ac3958e6886769ce8677ea28370d13e +size 239706 diff --git a/src/js/changelog.js b/src/js/changelog.js index b3ce06a3..9da13e2c 100644 --- a/src/js/changelog.js +++ b/src/js/changelog.js @@ -1,7 +1,7 @@ export const CHANGELOG = [ { version: "1.1.17", - date: "unreleased", + date: "22.06.2020", entries: [ "Color blind mode! You can now activate it in the settings and it will show you which color is below your cursor (Either resource or on the belt)", "Add info buttons to all shapes so you can figure out how they are built! (And also, which colors they have)", From 00ad1a0a5b047aba2bbcab486cb02f44956931f8 Mon Sep 17 00:00:00 2001 From: DerFeldspatz <57270769+DerFeldspatz@users.noreply.github.com> Date: Mon, 22 Jun 2020 16:11:25 +0200 Subject: [PATCH 18/38] Update base-de.yaml Translate new features. Shorten the long cycleBuildingVariants translation that bothered me for too long --- translations/base-de.yaml | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/translations/base-de.yaml b/translations/base-de.yaml index fee20525..a15cc4d5 100644 --- a/translations/base-de.yaml +++ b/translations/base-de.yaml @@ -286,7 +286,7 @@ ingame: plannerSwitchSide: "Planer: Seite wechseln" cutSelection: Ausschneiden copySelection: Kopieren - clearSelection: Leere Selektion + clearSelection: Auswahl aufheben pipette: Pipette # Everything related to placing buildings (I.e. as soon as you selected a building @@ -294,7 +294,7 @@ ingame: buildingPlacement: # Buildings can have different variants which are unlocked at later levels, # and this is the hint shown when there are multiple variants available. - cycleBuildingVariants: Drücke , um zwischen den Varianten zu wählen. + cycleBuildingVariants: Wechsle Variante # Shows the hotkey in the ui, e.g. "Hotkey: Q" hotkeyLabel: >- @@ -688,29 +688,28 @@ settings: und das Lesen der Textfelder vereinfacht. autosaveInterval: - title: Autosave Interval + title: Intervall für automatisches Speichern description: >- - Controls how often the game saves automatically. You can also disable it - entirely here. + Ändert das Intervall, in dem der Spielstand automatisch gespeichert wird. + Die Funktion kann hier auch deaktiviert werden. intervals: one_minute: 1 Minute - two_minutes: 2 Minutes - five_minutes: 5 Minutes - ten_minutes: 10 Minutes - twenty_minutes: 20 Minutes - disabled: Disabled + two_minutes: 2 Minuten + five_minutes: 5 Minuten + ten_minutes: 10 Minuten + twenty_minutes: 20 Minuten + disabled: Deaktiviert compactBuildingInfo: - title: Compact Building Infos + title: Kompakte Gebäudeinformationen description: >- - Shortens info boxes for buildings by only showing their ratios. Otherwise a - description and image is shown. + Reduziert die Infoboxen der Gebäude auf ihre Arbeitsgeschwindigkeit. Anderenfalls wird ein + Bild mit Beschreibung angezeigt. disableCutDeleteWarnings: - title: Disable Cut/Delete Warnings + title: Deaktiviere Warnungsdialog beim Löschen description: >- - Disable the warning dialogs brought up when cutting/deleting more than 100 - entities. + Deaktiviert die Warnung, die beim Löschen und Ausschneiden von mehr als 100 Feldern angezeigt wird. keybindings: title: Tastenbelegung From 3be0266d2048e44c06e895d3929fea3d8140ad1b Mon Sep 17 00:00:00 2001 From: Glenn Martin Jensen Date: Mon, 22 Jun 2020 16:43:30 +0200 Subject: [PATCH 19/38] Updated Norwegian Translations Updated Norwegian Translations --- translations/base-no.yaml | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/translations/base-no.yaml b/translations/base-no.yaml index cc12dc52..59fdd107 100644 --- a/translations/base-no.yaml +++ b/translations/base-no.yaml @@ -285,9 +285,9 @@ ingame: pasteLastBlueprint: Lim inn forrige blåkopi lockBeltDirection: Aktiver båndplanleggeren plannerSwitchSide: Flipp båndplanleggeren - cutSelection: Cut - copySelection: Copy - clearSelection: Clear Selection + cutSelection: Klipp Ut + copySelection: Kopier + clearSelection: Fjern Valgte pipette: Pipette # Everything related to placing buildings (I.e. as soon as you selected a building @@ -687,27 +687,27 @@ settings: å lese. autosaveInterval: - title: Autosave Interval + title: Autolagringsintervall description: >- - Controls how often the game saves automatically. You can also disable it - entirely here. + Jsuter hvor ofte spillet lagres automatisk. Du kan også + deaktivere det fullstendig. intervals: - one_minute: 1 Minute - two_minutes: 2 Minutes - five_minutes: 5 Minutes - ten_minutes: 10 Minutes - twenty_minutes: 20 Minutes - disabled: Disabled + one_minute: 1 Minutt + two_minutes: 2 Minutter + five_minutes: 5 Minutter + ten_minutes: 10 Minutter + twenty_minutes: 20 Minutter + disabled: Deaktivert compactBuildingInfo: - title: Compact Building Infos + title: Kompakt Bygningsinformasjon description: >- - Shortens info boxes for buildings by only showing their ratios. Otherwise a - description and image is shown. + Forkorter informasjonsboksen for bygninger ved å bare vise dems forhold. Ellers + vises en beskrivelse og bilde er vist. disableCutDeleteWarnings: - title: Disable Cut/Delete Warnings + title: Deaktiverer Kutt/Slette Advarsler description: >- - Disable the warning dialogs brought up when cutting/deleting more than 100 - entities. + Deaktiverer advarselsdialogen som kommer frem når du kutter/sletter mer enn 100 + bygninger. keybindings: title: Hurtigtaster @@ -773,7 +773,7 @@ keybindings: placeMultiple: Forbli i plasseringsmodus placeInverse: Inverter automatisk transportbånd orientering lockBeltDirection: Enable belt planner - switchDirectionLockSide: "Planner: Switch side" + switchDirectionLockSide: "Planlegger: Bytt side" pipette: Pipette about: From 59960aafec643807905eb014f04242800d76cc32 Mon Sep 17 00:00:00 2001 From: tobspr Date: Mon, 22 Jun 2020 17:05:53 +0200 Subject: [PATCH 20/38] Update translations to latest version --- translations/base-ar.yaml | 18 ++++++++++++++++++ translations/base-cz.yaml | 18 ++++++++++++++++++ translations/base-de.yaml | 20 +++++++++++++++++++- translations/base-el.yaml | 18 ++++++++++++++++++ translations/base-es.yaml | 19 +++++++++++++++++++ translations/base-fr.yaml | 18 ++++++++++++++++++ translations/base-hr.yaml | 18 ++++++++++++++++++ translations/base-hu.yaml | 18 ++++++++++++++++++ translations/base-it.yaml | 18 ++++++++++++++++++ translations/base-ja.yaml | 18 ++++++++++++++++++ translations/base-kor.yaml | 18 ++++++++++++++++++ translations/base-lt.yaml | 18 ++++++++++++++++++ translations/base-nl.yaml | 18 ++++++++++++++++++ translations/base-no.yaml | 18 ++++++++++++++++++ translations/base-pl.yaml | 7 ++++++- translations/base-pt-BR.yaml | 18 ++++++++++++++++++ translations/base-pt-PT.yaml | 18 ++++++++++++++++++ translations/base-ro.yaml | 18 ++++++++++++++++++ translations/base-ru.yaml | 18 ++++++++++++++++++ translations/base-sv.yaml | 26 ++++++++++++++++++++++---- translations/base-tr.yaml | 18 ++++++++++++++++++ translations/base-zh-CN.yaml | 27 +++++++++++++++++++-------- translations/base-zh-TW.yaml | 18 ++++++++++++++++++ 23 files changed, 409 insertions(+), 14 deletions(-) diff --git a/translations/base-ar.yaml b/translations/base-ar.yaml index 10a2e7e9..9edce612 100644 --- a/translations/base-ar.yaml +++ b/translations/base-ar.yaml @@ -156,6 +156,7 @@ mainMenu: continue: Continue newGame: New Game madeBy: Made by + subreddit: Reddit dialogs: buttons: @@ -397,6 +398,19 @@ ingame: 1_3_expand: >- This is NOT an idle game! Build more extractors and belts to finish the goal quicker.

Tip: Hold SHIFT to place multiple extractors, and use R to rotate them. + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -711,6 +725,10 @@ settings: Disable the warning dialogs brought up when cutting/deleting more than 100 entities. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Keybindings hint: >- diff --git a/translations/base-cz.yaml b/translations/base-cz.yaml index 3eb2bccd..a4e8c3a0 100644 --- a/translations/base-cz.yaml +++ b/translations/base-cz.yaml @@ -137,6 +137,7 @@ mainMenu: continue: Continue newGame: New Game madeBy: Made by + subreddit: Reddit dialogs: buttons: @@ -378,6 +379,19 @@ ingame: 1_3_expand: >- Toto NENÍ hra o čekání! Sestavte další extraktory a pásy, abyste dosáhli cíle rychleji.

Tip: Chcete-li umístit více extraktorů, podržte SHIFT. Pomocí R je můžete otočit. + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -693,6 +707,10 @@ settings: Disable the warning dialogs brought up when cutting/deleting more than 100 entities. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Klávesové zkratky hint: >- diff --git a/translations/base-de.yaml b/translations/base-de.yaml index a15cc4d5..cdce7f8d 100644 --- a/translations/base-de.yaml +++ b/translations/base-de.yaml @@ -155,6 +155,7 @@ mainMenu: continue: Fortsetzen newGame: Neues Spiel madeBy: Ein Spiel von + subreddit: Reddit dialogs: buttons: @@ -394,6 +395,19 @@ ingame: 1_3_expand: >- Dies ist KEIN Idle-Game! Baue mehr Extrahierer und Förderbänder, um das Ziel schneller zu erreichen.

Tipp: Halte UMSCH, um mehrere Gebäude zu platzieren und nutze R um sie zu rotieren. + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -703,7 +717,7 @@ settings: compactBuildingInfo: title: Kompakte Gebäudeinformationen description: >- - Reduziert die Infoboxen der Gebäude auf ihre Arbeitsgeschwindigkeit. Anderenfalls wird ein + Reduziert die Infoboxen der Gebäude auf ihre Arbeitsgeschwindigkeit. Anderenfalls wird ein Bild mit Beschreibung angezeigt. disableCutDeleteWarnings: @@ -711,6 +725,10 @@ settings: description: >- Deaktiviert die Warnung, die beim Löschen und Ausschneiden von mehr als 100 Feldern angezeigt wird. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Tastenbelegung hint: >- diff --git a/translations/base-el.yaml b/translations/base-el.yaml index d35810b2..19ab5a83 100644 --- a/translations/base-el.yaml +++ b/translations/base-el.yaml @@ -156,6 +156,7 @@ mainMenu: continue: Continue newGame: New Game madeBy: Made by + subreddit: Reddit dialogs: buttons: @@ -397,6 +398,19 @@ ingame: 1_3_expand: >- This is NOT an idle game! Build more extractors and belts to finish the goal quicker.

Tip: Hold SHIFT to place multiple extractors, and use R to rotate them. + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -712,6 +726,10 @@ settings: Disable the warning dialogs brought up when cutting/deleting more than 100 entities. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Keybindings hint: >- diff --git a/translations/base-es.yaml b/translations/base-es.yaml index 8b5566a6..40de327b 100644 --- a/translations/base-es.yaml +++ b/translations/base-es.yaml @@ -155,6 +155,7 @@ mainMenu: showInfo: Ver contestOver: El concurso ha terminado - Únete al discord para enterarte sobre nuevos concursos! + subreddit: Reddit dialogs: buttons: @@ -393,6 +394,20 @@ ingame: ¡Conecta el extractor con una cinta transportadora a tu edificio central!

Pista: Pulsa y arrastra la cinta transportadora con el ratón! 1_3_expand: >- ¡Esto NO es un "juego de esperar"! Construye más extractores y cintas transportadoras para completar el objetivo más rápido.

Pista: Mantén pulsado SHIFT para colocar varios extractores y usa R para rotarlos. + + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -702,6 +717,10 @@ settings: Disable the warning dialogs brought up when cutting/deleting more than 100 entities. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Atajos de Teclado hint: >- diff --git a/translations/base-fr.yaml b/translations/base-fr.yaml index a0bb35d2..fb2b25e1 100644 --- a/translations/base-fr.yaml +++ b/translations/base-fr.yaml @@ -157,6 +157,7 @@ mainMenu: continue: Continuer newGame: Nouvelle partie madeBy: Créé par + subreddit: Reddit dialogs: buttons: @@ -397,6 +398,19 @@ ingame: 1_3_expand: >- Ceci n'est PAS un jeu incrémental et inactif ! Construisez plus d'extracteurs et de convoyeurs pour atteindre plus vite votre votre but.

Astuce: Gardez SHIFT enfoncé pour placer plusieurs extracteurs, et utilisez R pour les faire pivoter. + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -710,6 +724,10 @@ settings: description: >- Désactive la boîte de dialogue qui s'affiche lorsque vous vous apprêtez à couper/effacer plus de 100 entités. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Contrôles hint: >- diff --git a/translations/base-hr.yaml b/translations/base-hr.yaml index 2e510a82..3ff34010 100644 --- a/translations/base-hr.yaml +++ b/translations/base-hr.yaml @@ -156,6 +156,7 @@ mainMenu: showInfo: View contestOver: This contest has ended - Join the discord to get noticed about new contests! + subreddit: Reddit dialogs: buttons: @@ -395,6 +396,19 @@ ingame: 1_3_expand: >- This is NOT an idle game! Build more extractors and belts to finish the goal quicker.

Tip: Hold SHIFT to place multiple extractors, and use R to rotate them. + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -710,6 +724,10 @@ settings: Disable the warning dialogs brought up when cutting/deleting more than 100 entities. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Keybindings hint: >- diff --git a/translations/base-hu.yaml b/translations/base-hu.yaml index f2cd8013..7d1bbc9e 100644 --- a/translations/base-hu.yaml +++ b/translations/base-hu.yaml @@ -156,6 +156,7 @@ mainMenu: continue: Continue newGame: New Game madeBy: Made by + subreddit: Reddit dialogs: buttons: @@ -397,6 +398,19 @@ ingame: 1_3_expand: >- This is NOT an idle game! Build more extractors and belts to finish the goal quicker.

Tip: Hold SHIFT to place multiple extractors, and use R to rotate them. + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -709,6 +723,10 @@ settings: Disable the warning dialogs brought up when cutting/deleting more than 100 entities. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Keybindings hint: >- diff --git a/translations/base-it.yaml b/translations/base-it.yaml index 8f3573e2..c434af7a 100644 --- a/translations/base-it.yaml +++ b/translations/base-it.yaml @@ -156,6 +156,7 @@ mainMenu: continue: Continue newGame: New Game madeBy: Made by + subreddit: Reddit dialogs: buttons: @@ -397,6 +398,19 @@ ingame: 1_3_expand: >- This is NOT an idle game! Build more extractors and belts to finish the goal quicker.

Tip: Hold SHIFT to place multiple extractors, and use R to rotate them. + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -710,6 +724,10 @@ settings: Disable the warning dialogs brought up when cutting/deleting more than 100 entities. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Keybindings hint: >- diff --git a/translations/base-ja.yaml b/translations/base-ja.yaml index 0e685752..f60eabec 100644 --- a/translations/base-ja.yaml +++ b/translations/base-ja.yaml @@ -156,6 +156,7 @@ mainMenu: continue: 続きから newGame: 新規ゲーム madeBy: Made by + subreddit: Reddit dialogs: buttons: @@ -396,6 +397,19 @@ ingame: 1_3_expand: >- このゲームは放置系のゲームではありません! もっと早く要件を満たせるように、追加の抽出機とベルトを設置しましょう。

Tip: SHIFT キーを押し続けると抽出機を連続配置できます。Rキーで設置方向を回転できます。 + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -708,6 +722,10 @@ settings: Disable the warning dialogs brought up when cutting/deleting more than 100 entities. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: キー設定 hint: >- diff --git a/translations/base-kor.yaml b/translations/base-kor.yaml index be220a41..a39225b1 100644 --- a/translations/base-kor.yaml +++ b/translations/base-kor.yaml @@ -156,6 +156,7 @@ mainMenu: continue: Continue newGame: New Game madeBy: Made by + subreddit: Reddit dialogs: buttons: @@ -397,6 +398,19 @@ ingame: 1_3_expand: >- 이것은 방치형 게임이 아닙니다! 추출기를 더 놓아 목표를 빨리 달성하세요.

팁: SHIFT를 눌러 여러 개의 추출기를 놓고 R로 회전 시키세요. + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -711,6 +725,10 @@ settings: Disable the warning dialogs brought up when cutting/deleting more than 100 entities. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: 키바인딩 hint: >- diff --git a/translations/base-lt.yaml b/translations/base-lt.yaml index f5686b97..6792283b 100644 --- a/translations/base-lt.yaml +++ b/translations/base-lt.yaml @@ -156,6 +156,7 @@ mainMenu: continue: Continue newGame: New Game madeBy: Made by + subreddit: Reddit dialogs: buttons: @@ -397,6 +398,19 @@ ingame: 1_3_expand: >- This is NOT an idle game! Build more extractors and belts to finish the goal quicker.

Tip: Hold SHIFT to place multiple extractors, and use R to rotate them. + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -709,6 +723,10 @@ settings: Disable the warning dialogs brought up when cutting/deleting more than 100 entities. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Keybindings hint: >- diff --git a/translations/base-nl.yaml b/translations/base-nl.yaml index ffec9737..b3694576 100644 --- a/translations/base-nl.yaml +++ b/translations/base-nl.yaml @@ -156,6 +156,7 @@ mainMenu: continue: Verder newGame: Nieuw Spel madeBy: Gemaakt door + subreddit: Reddit dialogs: buttons: @@ -395,6 +396,19 @@ ingame: 1_3_expand: >- Dit is GEEN nietsdoen-spel! bouw meer ontginners en lopende banden om het doel sneller te behalen.

Tip: Houd SHIFT ingedrukt om meerdere ontginners te plaatsen en gebruik R om ze te draaien. + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -707,6 +721,10 @@ settings: Disable the warning dialogs brought up when cutting/deleting more than 100 entities. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Sneltoetsen hint: >- diff --git a/translations/base-no.yaml b/translations/base-no.yaml index 59fdd107..07481e9e 100644 --- a/translations/base-no.yaml +++ b/translations/base-no.yaml @@ -156,6 +156,7 @@ mainMenu: continue: Fortsett newGame: Nytt Spill madeBy: Laget av + subreddit: Reddit dialogs: buttons: @@ -395,6 +396,19 @@ ingame: 1_3_expand: >- Dette er IKKE et idle-spill! Bygg flere utdragere og belter for å nå målet raskere.

Tips: Hold SHIFT for å plassere flere utdragere, og bruk R for å rotere dem. + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -709,6 +723,10 @@ settings: Deaktiverer advarselsdialogen som kommer frem når du kutter/sletter mer enn 100 bygninger. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Hurtigtaster hint: >- diff --git a/translations/base-pl.yaml b/translations/base-pl.yaml index b0ec80cb..815799a4 100644 --- a/translations/base-pl.yaml +++ b/translations/base-pl.yaml @@ -160,6 +160,7 @@ mainMenu: showInfo: Wyświetl contestOver: Ten konkurs już się skończył - Dołącz do serwera Discord by nie przegapić kolejnych! madeBy: Gra wykonana przez + subreddit: Reddit dialogs: buttons: @@ -409,7 +410,7 @@ ingame: shapeViewer: title: Poziomy empty: Puste - + # Interactive tutorial interactiveTutorial: title: Tutorial @@ -748,6 +749,10 @@ settings: Wyłącza ostrzeżenia wyświetlające się przy usuwaniu lub wycinaniu więcej niż 100 budynków. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Klawiszologia hint: >- diff --git a/translations/base-pt-BR.yaml b/translations/base-pt-BR.yaml index 86d29a07..30e9c30c 100644 --- a/translations/base-pt-BR.yaml +++ b/translations/base-pt-BR.yaml @@ -156,6 +156,7 @@ mainMenu: continue: Continue newGame: New Game madeBy: Made by + subreddit: Reddit dialogs: buttons: @@ -396,6 +397,19 @@ ingame: 1_3_expand: >- Este NÃO é um jogo inativo! Construa mais extratores e esteiras para concluir o objetivo mais rapidamente.

Dica, segure SHIFT para colocar vários extratores e use R para girá-los. + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -710,6 +724,10 @@ settings: Disable the warning dialogs brought up when cutting/deleting more than 100 entities. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Controles hint: >- diff --git a/translations/base-pt-PT.yaml b/translations/base-pt-PT.yaml index b11e1bf2..253dc37c 100644 --- a/translations/base-pt-PT.yaml +++ b/translations/base-pt-PT.yaml @@ -156,6 +156,7 @@ mainMenu: continue: Continuar newGame: Novo Jogo madeBy: Criado por + subreddit: Reddit dialogs: buttons: @@ -396,6 +397,19 @@ ingame: 1_3_expand: >- Isto NÃO é um jogo idle! Constrói mais extratores e tapetes para atingir o objetivo mais rapidamente.

Dica: Pressiona SHIFT para colocar vários extratores, e usa R para os rodar. + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -708,6 +722,10 @@ settings: Disable the warning dialogs brought up when cutting/deleting more than 100 entities. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Atalhos hint: >- diff --git a/translations/base-ro.yaml b/translations/base-ro.yaml index e383ce2c..aac39324 100644 --- a/translations/base-ro.yaml +++ b/translations/base-ro.yaml @@ -156,6 +156,7 @@ mainMenu: continue: Continue newGame: New Game madeBy: Made by + subreddit: Reddit dialogs: buttons: @@ -397,6 +398,19 @@ ingame: 1_3_expand: >- This is NOT an idle game! Build more extractors and belts to finish the goal quicker.

Tip: Hold SHIFT to place multiple extractors, and use R to rotate them. + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -709,6 +723,10 @@ settings: Disable the warning dialogs brought up when cutting/deleting more than 100 entities. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Keybindings hint: >- diff --git a/translations/base-ru.yaml b/translations/base-ru.yaml index 53c83519..5e721165 100644 --- a/translations/base-ru.yaml +++ b/translations/base-ru.yaml @@ -157,6 +157,7 @@ mainMenu: continue: Продолжить newGame: Новая Игра madeBy: Создал + subreddit: Reddit dialogs: buttons: @@ -399,6 +400,19 @@ ingame: 1_3_expand: >- Это НЕ idle-игра! Постройте больше экстракторов и конвейеров, чтобы достичь цели быстрее.

Подсказка: Удерживайте SHIFT чтобы разместить несколько экстракторов, а R чтобы вращать их. + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -710,6 +724,10 @@ settings: Disable the warning dialogs brought up when cutting/deleting more than 100 entities. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Настройки управления hint: >- diff --git a/translations/base-sv.yaml b/translations/base-sv.yaml index 41787d74..752a1fa8 100644 --- a/translations/base-sv.yaml +++ b/translations/base-sv.yaml @@ -156,6 +156,7 @@ mainMenu: continue: Fortsätt newGame: Nytt spel madeBy: Skapad av + subreddit: Reddit dialogs: buttons: @@ -260,13 +261,13 @@ dialogs: massCutConfirm: title: Bekräfta Klipp desc: >- - Du klipper en stor mängd byggnader ( för att vara exakt)! + Du klipper en stor mängd byggnader ( för att vara exakt)! Är du säker på att du vill göra detta? exportScreenshotWarning: title: Exportera skärmdump desc: >- - Du efterfrågade att exportera din fabrik som en skärmdump. + Du efterfrågade att exportera din fabrik som en skärmdump. Var snäll och notera att detta kan ta ett tag för en stor bas och i vissa fall till och med krascha ditt spel ingame: @@ -397,6 +398,19 @@ ingame: 1_3_expand: >- Detta är INTE ett idle-spel! Bygg fler extraktörer för att klara målet snabbare.

Tips: Håll SHIFT för att placera flera extraktörer, och använd R för att rotera dem. + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -683,7 +697,7 @@ settings: vignette: title: Vinjett description: >- - Sätter på vinjetten vilket gör skärmen mörkare i hörnen och + Sätter på vinjetten vilket gör skärmen mörkare i hörnen och gör text lättare att läsa autosaveInterval: @@ -706,9 +720,13 @@ settings: disableCutDeleteWarnings: title: Stäng av klipp/raderingsvarningar description: >- - Stänger av varningsdialogen som kommer upp då fler än 100 saker + Stänger av varningsdialogen som kommer upp då fler än 100 saker ska tas bort + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Tangentbindningar hint: >- diff --git a/translations/base-tr.yaml b/translations/base-tr.yaml index 0880ce04..6bd1b97a 100644 --- a/translations/base-tr.yaml +++ b/translations/base-tr.yaml @@ -156,6 +156,7 @@ mainMenu: continue: Continue newGame: New Game madeBy: Made by + subreddit: Reddit dialogs: buttons: @@ -397,6 +398,19 @@ ingame: 1_3_expand: >- This is NOT an idle game! Build more extractors and belts to finish the goal quicker.

Tip: Hold SHIFT to place multiple extractors, and use R to rotate them. + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -710,6 +724,10 @@ settings: Disable the warning dialogs brought up when cutting/deleting more than 100 entities. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Keybindings hint: >- diff --git a/translations/base-zh-CN.yaml b/translations/base-zh-CN.yaml index bd3f50bb..08708f35 100644 --- a/translations/base-zh-CN.yaml +++ b/translations/base-zh-CN.yaml @@ -187,6 +187,7 @@ mainMenu: continue: 继续游戏 newGame: 新游戏 madeBy: 作者: + subreddit: Reddit dialogs: buttons: @@ -283,12 +284,6 @@ dialogs: CTRL + 拖动:选择区域以复制或删除。
SHIFT: 按住以放置多个。
ALT: 反向放置传送带。
- # desc: >- - # This game has a lot of keybindings which make it easier to build big factories. - # Here are a few, but be sure to check out the keybindings!

- # CTRL + Drag: Select area to copy / delete.
- # SHIFT: Hold to place multiple of one building.
- # ALT: Invert orientation of placed belts.
createMarker: title: 创建地图标记 @@ -436,6 +431,19 @@ ingame: 这不是一个挂机游戏!建造更多的开采机和传送带来更快地完成目标。

提示:按住SHIFT键来放置多个开采机,用R键旋转它们。 + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -754,6 +762,10 @@ settings: Disable the warning dialogs brought up when cutting/deleting more than 100 entities. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: 按键设置 hint: >- @@ -812,10 +824,8 @@ keybindings: rotateInverseModifier: >- 修饰键: 改为逆时针旋转 cycleBuildingVariants: 选择建筑变体 - # cycleBuildingVariants: Cycle Variants confirmMassDelete: 确认批量删除 cycleBuildings: 选择建筑 - # cycleBuildings: Cycle Buildings massSelectStart: 开始批量选择 massSelectSelectMultiple: 选择多个区域 massSelectCopy: 复制 @@ -850,6 +860,7 @@ about: 最后,我想感谢我最好的朋友Niklas——如果没有与他的异星工厂(factorio)的游戏体验,shapez.io将不会存在。 + changelog: title: 版本日志 diff --git a/translations/base-zh-TW.yaml b/translations/base-zh-TW.yaml index e383ce2c..aac39324 100644 --- a/translations/base-zh-TW.yaml +++ b/translations/base-zh-TW.yaml @@ -156,6 +156,7 @@ mainMenu: continue: Continue newGame: New Game madeBy: Made by + subreddit: Reddit dialogs: buttons: @@ -397,6 +398,19 @@ ingame: 1_3_expand: >- This is NOT an idle game! Build more extractors and belts to finish the goal quicker.

Tip: Hold SHIFT to place multiple extractors, and use R to rotate them. + colors: + red: Red + green: Green + blue: Blue + yellow: Yellow + purple: Purple + cyan: Cyan + white: White + uncolored: No color + shapeViewer: + title: Layers + empty: Empty + # All shop upgrades shopUpgrades: belt: @@ -709,6 +723,10 @@ settings: Disable the warning dialogs brought up when cutting/deleting more than 100 entities. + enableColorBlindHelper: + title: Color Blind Mode + description: Enables various tools which allow to play the game if you are color blind. + keybindings: title: Keybindings hint: >- From 390f296b60d318c56e099df28788dd2829d57805 Mon Sep 17 00:00:00 2001 From: Killgaru <46816881+Killgaru@users.noreply.github.com> Date: Mon, 22 Jun 2020 18:08:15 +0300 Subject: [PATCH 21/38] Russian translation updated Translated new options. --- translations/base-ru.yaml | 40 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/translations/base-ru.yaml b/translations/base-ru.yaml index 53c83519..3a6d9f0f 100644 --- a/translations/base-ru.yaml +++ b/translations/base-ru.yaml @@ -289,10 +289,10 @@ ingame: pasteLastBlueprint: Вставить последний чертеж lockBeltDirection: Включить конвейерный планировщик plannerSwitchSide: Поменять местами стороны планировщика - cutSelection: Cut - copySelection: Copy - clearSelection: Clear Selection - pipette: Pipette + cutSelection: Вырезать + copySelection: Копировать + clearSelection: Отменить + pipette: Пипетка # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) @@ -688,27 +688,27 @@ settings: Включает виньетирование, которое затемняет углы экрана и облегчает чтение текста. autosaveInterval: - title: Autosave Interval + title: Интервал авто-сохранения description: >- - Controls how often the game saves automatically. You can also disable it - entirely here. + Управляет тем, как часто игра автоматически сохраняется. + А также здесь можно полностью отключить авто-сохранение. intervals: - one_minute: 1 Minute - two_minutes: 2 Minutes - five_minutes: 5 Minutes - ten_minutes: 10 Minutes - twenty_minutes: 20 Minutes - disabled: Disabled + one_minute: 1 Минута + two_minutes: 2 Минуты + five_minutes: 5 Минут + ten_minutes: 10 Минут + twenty_minutes: 20 Минут + disabled: Отключено compactBuildingInfo: - title: Compact Building Infos + title: Компактная Информация о Зданиях description: >- - Shortens info boxes for buildings by only showing their ratios. Otherwise a - description and image is shown. + Сокращает отображаемую информацию о зданиях, показывая только их множители. + Иначе информация отображается с описанием и изображением. disableCutDeleteWarnings: - title: Disable Cut/Delete Warnings + title: Отключить Предупреждение о Вырезании\Удалении description: >- - Disable the warning dialogs brought up when cutting/deleting more than 100 - entities. + Отключает диалоговые окна с предупреждениями, появляющиеся при + вырезании/удалении более 100 объектов. keybindings: title: Настройки управления @@ -775,7 +775,7 @@ keybindings: mapMoveFaster: Ускорение передвижения lockBeltDirection: Включает конвейерный планировщик switchDirectionLockSide: "Планировщик: Переключение сторон" - pipette: Pipette + pipette: Пипетка about: title: Об игре From 8bdb7e32b017c25df1db2a294c47cde442b1d173 Mon Sep 17 00:00:00 2001 From: Glenn Martin Jensen Date: Mon, 22 Jun 2020 17:09:18 +0200 Subject: [PATCH 22/38] Updated Norwegian Translations Updated Norwegian Translations --- translations/base-no.yaml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/translations/base-no.yaml b/translations/base-no.yaml index 07481e9e..687efc9c 100644 --- a/translations/base-no.yaml +++ b/translations/base-no.yaml @@ -397,17 +397,17 @@ ingame: Dette er IKKE et idle-spill! Bygg flere utdragere og belter for å nå målet raskere.

Tips: Hold SHIFT for å plassere flere utdragere, og bruk R for å rotere dem. colors: - red: Red - green: Green - blue: Blue - yellow: Yellow - purple: Purple + red: Rød + green: Grønn + blue: Blå + yellow: Gul + purple: Lilla cyan: Cyan - white: White - uncolored: No color + white: Hvit + uncolored: Ingen farge shapeViewer: - title: Layers - empty: Empty + title: Lag + empty: Tom # All shop upgrades shopUpgrades: @@ -724,8 +724,8 @@ settings: bygninger. enableColorBlindHelper: - title: Color Blind Mode - description: Enables various tools which allow to play the game if you are color blind. + title: Fargeblind Modus + description: Aktiverer forskjellige verktøy som lar deg spille spillet om du er fargeblind. keybindings: title: Hurtigtaster From 23b17467eac35c45607a6b767698ea1bc2bde0ba Mon Sep 17 00:00:00 2001 From: Wessel <66781896+Ryoncai@users.noreply.github.com> Date: Mon, 22 Jun 2020 17:18:37 +0200 Subject: [PATCH 23/38] Update base-nl.yaml Translated the newest additions --- translations/base-nl.yaml | 65 +++++++++++++++------------------------ 1 file changed, 24 insertions(+), 41 deletions(-) diff --git a/translations/base-nl.yaml b/translations/base-nl.yaml index b3694576..66e3168a 100644 --- a/translations/base-nl.yaml +++ b/translations/base-nl.yaml @@ -156,7 +156,6 @@ mainMenu: continue: Verder newGame: Nieuw Spel madeBy: Gemaakt door - subreddit: Reddit dialogs: buttons: @@ -284,12 +283,12 @@ ingame: createMarker: Plaats markering delete: Vernietig pasteLastBlueprint: Plak de laatst gekopiëerde blauwdruk - lockBeltDirection: Enable belt planner - plannerSwitchSide: Flip planner side - cutSelection: Cut - copySelection: Copy - clearSelection: Clear Selection - pipette: Pipette + lockBeltDirection: Maak gebruik van de lopende band planner + plannerSwitchSide: Draai de richting van de planner + cutSelection: Knip + copySelection: Kopieer + clearSelection: Cancel selectie + pipette: Pipet # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) @@ -396,19 +395,6 @@ ingame: 1_3_expand: >- Dit is GEEN nietsdoen-spel! bouw meer ontginners en lopende banden om het doel sneller te behalen.

Tip: Houd SHIFT ingedrukt om meerdere ontginners te plaatsen en gebruik R om ze te draaien. - colors: - red: Red - green: Green - blue: Blue - yellow: Yellow - purple: Purple - cyan: Cyan - white: White - uncolored: No color - shapeViewer: - title: Layers - empty: Empty - # All shop upgrades shopUpgrades: belt: @@ -533,7 +519,7 @@ storyRewards: reward_mixer: title: Kleuren mengen - desc: The mixer has been unlocked - Combine two colors using additive blending with this building! + desc: De menger is ontgrendeld - gebruik dit gebouw om twee kleuren te mengen via 'additive blending'! reward_stacker: title: Stapelaar @@ -701,29 +687,26 @@ settings: autosaveInterval: title: Autosave Interval description: >- - Controls how often the game saves automatically. You can also disable it - entirely here. + Bepaalt hoe vaak het spel automatisch opslaat. Je kan het hier ook volledig + mee uitschakelen. + intervals: - one_minute: 1 Minute - two_minutes: 2 Minutes - five_minutes: 5 Minutes - ten_minutes: 10 Minutes - twenty_minutes: 20 Minutes - disabled: Disabled + one_minute: 1 Minuut + two_minutes: 2 Minuten + five_minutes: 5 Minuten + ten_minutes: 10 Minuten + twenty_minutes: 20 Minuten + disabled: Uitgeschakeld compactBuildingInfo: - title: Compact Building Infos + title: Combacte gebouwinformatie description: >- - Shortens info boxes for buildings by only showing their ratios. Otherwise a - description and image is shown. + Informatie weergeven bij gebouwen wordt beperkt tot alleen hun ratios. Anders + zie je een beschrijving en een afbeelding. disableCutDeleteWarnings: - title: Disable Cut/Delete Warnings + title: Schakel knip/delete waarschuwingen uit. description: >- - Disable the warning dialogs brought up when cutting/deleting more than 100 - entities. - - enableColorBlindHelper: - title: Color Blind Mode - description: Enables various tools which allow to play the game if you are color blind. + Schakelt de waarschuwing uit die wordt weergegeven wanneer je meer dan 100 dingen probeert te + knippen/deleten. keybindings: title: Sneltoetsen @@ -789,8 +772,8 @@ keybindings: exportScreenshot: Exporteer volledige basis als afbeelding mapMoveFaster: Beweeg sneller lockBeltDirection: Schakel lopende band-planner in - switchDirectionLockSide: "Planner: Wissel van kant" - pipette: Pipette + switchDirectionLockSide: "Planner: Wissel van richting" + pipette: Pipet about: title: Over dit spel From 697e8e71ae7b2380dce38e9a36d570a447b23a74 Mon Sep 17 00:00:00 2001 From: Killgaru <46816881+Killgaru@users.noreply.github.com> Date: Mon, 22 Jun 2020 18:24:50 +0300 Subject: [PATCH 24/38] Russian translation updated --- translations/base-ru.yaml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/translations/base-ru.yaml b/translations/base-ru.yaml index ae78b6fe..732f0fc2 100644 --- a/translations/base-ru.yaml +++ b/translations/base-ru.yaml @@ -401,17 +401,17 @@ ingame: Это НЕ idle-игра! Постройте больше экстракторов и конвейеров, чтобы достичь цели быстрее.

Подсказка: Удерживайте SHIFT чтобы разместить несколько экстракторов, а R чтобы вращать их. colors: - red: Red - green: Green - blue: Blue - yellow: Yellow - purple: Purple - cyan: Cyan - white: White - uncolored: No color + red: Красный + green: Зеленый + blue: Синий + yellow: Желтый + purple: Фиолетовый + cyan: Бирюзовый + white: Белый + uncolored: Бесцветный shapeViewer: - title: Layers - empty: Empty + title: Слои + empty: Пусто # All shop upgrades shopUpgrades: @@ -725,8 +725,8 @@ settings: вырезании/удалении более 100 объектов. enableColorBlindHelper: - title: Color Blind Mode - description: Enables various tools which allow to play the game if you are color blind. + title: Режим Дальтоника + description: Включает различные инструменты, которые позволяют играть в игру дальтоникам. keybindings: title: Настройки управления From 6b87cd11421c6c0bc0ca47925ed8ffa5a6e18228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pascal=20Gross=C3=A9?= Date: Mon, 22 Jun 2020 17:25:12 +0200 Subject: [PATCH 25/38] Updated french translation --- translations/base-fr.yaml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/translations/base-fr.yaml b/translations/base-fr.yaml index fb2b25e1..716f3c78 100644 --- a/translations/base-fr.yaml +++ b/translations/base-fr.yaml @@ -399,17 +399,17 @@ ingame: Ceci n'est PAS un jeu incrémental et inactif ! Construisez plus d'extracteurs et de convoyeurs pour atteindre plus vite votre votre but.

Astuce: Gardez SHIFT enfoncé pour placer plusieurs extracteurs, et utilisez R pour les faire pivoter. colors: - red: Red - green: Green - blue: Blue - yellow: Yellow - purple: Purple + red: Rouge + green: Vert + blue: Bleu + yellow: Jaune + purple: Violet cyan: Cyan - white: White - uncolored: No color + white: Blanc + uncolored: Non coloré shapeViewer: - title: Layers - empty: Empty + title: Calques + empty: Vide # All shop upgrades shopUpgrades: @@ -725,8 +725,8 @@ settings: Désactive la boîte de dialogue qui s'affiche lorsque vous vous apprêtez à couper/effacer plus de 100 entités. enableColorBlindHelper: - title: Color Blind Mode - description: Enables various tools which allow to play the game if you are color blind. + title: Mode Daltonien + description: Active divers outils qui permettent de jouer à ce jeu si vous êtes daltonien. keybindings: title: Contrôles From ecaa2a83d7ef6423ff8ca7293cc3471b2ebe64e8 Mon Sep 17 00:00:00 2001 From: Wessel <66781896+Ryoncai@users.noreply.github.com> Date: Mon, 22 Jun 2020 17:31:15 +0200 Subject: [PATCH 26/38] Update base-nl.yaml Added some translations to text it said I had removed without having translated them. --- translations/base-nl.yaml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/translations/base-nl.yaml b/translations/base-nl.yaml index 66e3168a..bca1d76f 100644 --- a/translations/base-nl.yaml +++ b/translations/base-nl.yaml @@ -156,6 +156,7 @@ mainMenu: continue: Verder newGame: Nieuw Spel madeBy: Gemaakt door + Subreddit: Reddit dialogs: buttons: @@ -395,6 +396,22 @@ ingame: 1_3_expand: >- Dit is GEEN nietsdoen-spel! bouw meer ontginners en lopende banden om het doel sneller te behalen.

Tip: Houd SHIFT ingedrukt om meerdere ontginners te plaatsen en gebruik R om ze te draaien. + Colors: + red: Rood + green: Groen + blue: Blauw + yellow: Geel + purple: Paars + cyan: Cyaan + white: Wit + uncolored: Geen kleur + ShapeViewer: + title: Layers + empty: Empty + + + + # All shop upgrades shopUpgrades: belt: @@ -700,13 +717,16 @@ settings: compactBuildingInfo: title: Combacte gebouwinformatie description: >- - Informatie weergeven bij gebouwen wordt beperkt tot alleen hun ratios. Anders + Informatie weergeven bij gebouwen wordt beperkt tot alleen hun 'ratios'. Anders zie je een beschrijving en een afbeelding. disableCutDeleteWarnings: title: Schakel knip/delete waarschuwingen uit. description: >- Schakelt de waarschuwing uit die wordt weergegeven wanneer je meer dan 100 dingen probeert te knippen/deleten. + enableColorBlindHelper: + title: Kleurenblindmodus + description: Schakelt verschillende hulpmiddelen in zodat je het spel alsnog kunt spelen wanneer je kleurenblind bent. keybindings: title: Sneltoetsen From 1be4a75776774692b940192c4869852de2de4eef Mon Sep 17 00:00:00 2001 From: Wessel <66781896+Ryoncai@users.noreply.github.com> Date: Mon, 22 Jun 2020 17:33:10 +0200 Subject: [PATCH 28/38] Update base-nl.yaml --- translations/base-nl.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/translations/base-nl.yaml b/translations/base-nl.yaml index bca1d76f..ce22282f 100644 --- a/translations/base-nl.yaml +++ b/translations/base-nl.yaml @@ -406,8 +406,8 @@ ingame: white: Wit uncolored: Geen kleur ShapeViewer: - title: Layers - empty: Empty + title: Lagen + empty: Leeg From 878ba9e61647d60462515378afb443fe3104721e Mon Sep 17 00:00:00 2001 From: Wessel <66781896+Ryoncai@users.noreply.github.com> Date: Mon, 22 Jun 2020 17:33:43 +0200 Subject: [PATCH 29/38] Update base-nl.yaml --- translations/base-nl.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/translations/base-nl.yaml b/translations/base-nl.yaml index ce22282f..d92558a8 100644 --- a/translations/base-nl.yaml +++ b/translations/base-nl.yaml @@ -409,9 +409,6 @@ ingame: title: Lagen empty: Leeg - - - # All shop upgrades shopUpgrades: belt: From c23e05904de58f4326f8ff84a34ef730b0b114f1 Mon Sep 17 00:00:00 2001 From: DerFeldspatz <57270769+DerFeldspatz@users.noreply.github.com> Date: Mon, 22 Jun 2020 18:33:50 +0200 Subject: [PATCH 30/38] Update base-de.yaml Minor typos, new features translated. Translated About Me (not word-for-word). --- translations/base-de.yaml | 52 +++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/translations/base-de.yaml b/translations/base-de.yaml index cdce7f8d..f360b856 100644 --- a/translations/base-de.yaml +++ b/translations/base-de.yaml @@ -396,17 +396,17 @@ ingame: Dies ist KEIN Idle-Game! Baue mehr Extrahierer und Förderbänder, um das Ziel schneller zu erreichen.

Tipp: Halte UMSCH, um mehrere Gebäude zu platzieren und nutze R um sie zu rotieren. colors: - red: Red - green: Green - blue: Blue - yellow: Yellow - purple: Purple - cyan: Cyan - white: White - uncolored: No color + red: Rot + green: Grün + blue: Blau + yellow: Gelb + purple: Violett + cyan: Blaugrün + white: Weiß + uncolored: farblos shapeViewer: - title: Layers - empty: Empty + title: Ebenen + empty: Leer # All shop upgrades shopUpgrades: @@ -726,8 +726,8 @@ settings: Deaktiviert die Warnung, die beim Löschen und Ausschneiden von mehr als 100 Feldern angezeigt wird. enableColorBlindHelper: - title: Color Blind Mode - description: Enables various tools which allow to play the game if you are color blind. + title: Modus für Farbenblinde + description: Aktiviert verschiedene Werkzeuge, die dir das Spielen trotz Farbenblindheit ermöglichen. keybindings: title: Tastenbelegung @@ -756,7 +756,7 @@ keybindings: mapZoomIn: Hineinzoomen mapZoomOut: Herauszoomen - createMarker: Markeirung erstellen + createMarker: Markierung erstellen menuOpenShop: Upgrades menuOpenStats: Statistiken @@ -776,7 +776,7 @@ keybindings: rotateWhilePlacing: Rotieren rotateInverseModifier: >- - Modifier: stattdessen gegen UZS rotieren + Modifikator: stattdessen gegen UZS rotieren cycleBuildingVariants: Variante wählen confirmMassDelete: Massenlöschung bestätigen cycleBuildings: Gebäude rotieren @@ -799,22 +799,22 @@ keybindings: about: title: Über dieses Spiel body: >- - This game is open source and developed by Tobias Springer (this is me).

+ Dieses Spiel hat einen offenen Quellcode (Open Source) und wurde von Tobias Springer (Das bin ich) entwickelt.

- If you want to contribute, check out shapez.io on github.

+ Wenn du zum Spiel beitragen möchtest, dann schaue dir shapez.io auf GitHub an.

- This game wouldn't have been possible without the great discord community - around my games - You should really join the discord server!

+ Das Spiel wurde erst durch die großartige Discord-Community + um meine Spiele möglich gemacht. Komm doch einfach mal auf dem Discord-Server vorbei!

- The soundtrack was made by Peppsen - He's awesome.

+ Der Soundtrack wurde von Peppsen komponiert! Klasse Typ.

- Finally, huge thanks to my best friend Niklas - Without our - factorio sessions this game would never have existed. + Abschließend möchte ich meinem Kumpel Niklas danken! Ohne unsere + etlichen gemeinsamen Stunden in Factorio wäre dieses Projekt nie zustande gekommen. changelog: title: Änderungen From c25775f82a789e2459220b495a1f9ca2112124cf Mon Sep 17 00:00:00 2001 From: DerFeldspatz <57270769+DerFeldspatz@users.noreply.github.com> Date: Mon, 22 Jun 2020 19:12:58 +0200 Subject: [PATCH 31/38] Update base-de.yaml --- translations/base-de.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/translations/base-de.yaml b/translations/base-de.yaml index f360b856..762469eb 100644 --- a/translations/base-de.yaml +++ b/translations/base-de.yaml @@ -401,9 +401,9 @@ ingame: blue: Blau yellow: Gelb purple: Violett - cyan: Blaugrün + cyan: Cyan white: Weiß - uncolored: farblos + uncolored: Farblos shapeViewer: title: Ebenen empty: Leer From 85f38c8a6d7d82fc04a31bdfcdd70c69808cb35f Mon Sep 17 00:00:00 2001 From: tobspr Date: Mon, 22 Jun 2020 19:58:51 +0200 Subject: [PATCH 32/38] Minor translation update --- translations/base-de.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/translations/base-de.yaml b/translations/base-de.yaml index 762469eb..08bc12e4 100644 --- a/translations/base-de.yaml +++ b/translations/base-de.yaml @@ -800,9 +800,9 @@ about: title: Über dieses Spiel body: >- Dieses Spiel hat einen offenen Quellcode (Open Source) und wurde von Tobias Springer (Das bin ich) entwickelt.

+ target="_blank">Tobias Springer (das bin ich!) entwickelt.

- Wenn du zum Spiel beitragen möchtest, dann schaue dir shapez.io auf GitHub an.

Das Spiel wurde erst durch die großartige Discord-Community From d541f451bfbe18d2da4d9dd69b970e46e2b603bf Mon Sep 17 00:00:00 2001 From: rostaklein Date: Mon, 22 Jun 2020 22:43:12 +0200 Subject: [PATCH 33/38] Filled in missing Czech translations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Keep up doing this great job man! 😊 I filled in some of the missing 🇨🇿 translations. Hope everything is okay. --- translations/base-cz.yaml | 90 +++++++++++++++++++-------------------- 1 file changed, 44 insertions(+), 46 deletions(-) diff --git a/translations/base-cz.yaml b/translations/base-cz.yaml index a4e8c3a0..a79d5a66 100644 --- a/translations/base-cz.yaml +++ b/translations/base-cz.yaml @@ -134,9 +134,9 @@ mainMenu: showInfo: Zobrazit contestOver: Tato soutěž skončila - Připojte se na Discord a získejte informace o nových soutěžích! - continue: Continue - newGame: New Game - madeBy: Made by + continue: Pokračovat + newGame: Nová hra + madeBy: Vytvořil subreddit: Reddit dialogs: @@ -267,12 +267,12 @@ ingame: createMarker: Vytvořit značku delete: Zničit pasteLastBlueprint: Vložit poslední plán - lockBeltDirection: Enable belt planner - plannerSwitchSide: Flip planner side - cutSelection: Cut - copySelection: Copy - clearSelection: Clear Selection - pipette: Pipette + lockBeltDirection: Zamknout směr pásu + plannerSwitchSide: Otočit strany plánovače + cutSelection: Vyjmout + copySelection: Kopířovat + clearSelection: Zrušit výběr + pipette: Kapátko # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) @@ -380,17 +380,17 @@ ingame: Toto NENÍ hra o čekání! Sestavte další extraktory a pásy, abyste dosáhli cíle rychleji.

Tip: Chcete-li umístit více extraktorů, podržte SHIFT. Pomocí R je můžete otočit. colors: - red: Red - green: Green - blue: Blue - yellow: Yellow - purple: Purple - cyan: Cyan - white: White - uncolored: No color + red: Červená + green: Zelená + blue: Modrá + yellow: Žlutá + purple: Fialová + cyan: Tyrkysová + white: Bílá + uncolored: Bez barvy shapeViewer: - title: Layers - empty: Empty + title: Vrstvy + empty: Prázdné # All shop upgrades shopUpgrades: @@ -596,7 +596,7 @@ settings: labels: uiScale: - title: Škála UI + title: Škálování UI description: >- Změní velikost uživatelského rozhraní. Rozhraní se bude stále přizpůsobovoat rozlišení vaší obrazovky, toto nastavení pouze mění jeho škálu. scales: @@ -672,44 +672,42 @@ settings: super_fast: Hodně Rychlá extremely_fast: Extrémně Rychlá enableTunnelSmartplace: - title: Smart Tunnels + title: Chytré tunely description: >- - When enabled, placing tunnels will automatically remove unnecessary belts. - This also enables to drag tunnels and excess tunnels will get removed. + Pokládání tunelů po zapnutí bude samo odstraňovat nepotřebné pásy. + Umožňuje také potahování tunelů a nadbytečné tunely budou odstraněny. vignette: - title: Vignette + title: Viněta description: >- - Enables the vignette which darkens the screen corners and makes text easier - to read. + Zapne vinětu, která ztmaví rohy obrazovky, což umožňuje lepší čtení textu. autosaveInterval: - title: Autosave Interval + title: Interval automatického ukládání description: >- - Controls how often the game saves automatically. You can also disable it - entirely here. + Určuje jak často se hra automaticky ukládá. Lze ji zde také úplně zakázat. intervals: - one_minute: 1 Minute - two_minutes: 2 Minutes - five_minutes: 5 Minutes - ten_minutes: 10 Minutes - twenty_minutes: 20 Minutes - disabled: Disabled + one_minute: 1 minuta + two_minutes: 2 minuty + five_minutes: 5 minut + ten_minutes: 10 minut + twenty_minutes: 20 minut + disabled: Zrušeno compactBuildingInfo: - title: Compact Building Infos + title: Kompaktní informace o stavbách description: >- - Shortens info boxes for buildings by only showing their ratios. Otherwise a - description and image is shown. + Zkrátí informační políčka pro budovy tím, že pouze ukáže jejich koeficient. + V opačném případě zobrazí popis a obrázek. disableCutDeleteWarnings: - title: Disable Cut/Delete Warnings + title: Zakázat upozornění o vyjmutí nebo odstranění description: >- - Disable the warning dialogs brought up when cutting/deleting more than 100 - entities. + Deaktivujte varovná dialogová okna vyvolaná při vymutí/mazání více než 100 + entit. enableColorBlindHelper: - title: Color Blind Mode - description: Enables various tools which allow to play the game if you are color blind. + title: Režim pro barvoslepé + description: Zapné různé nástroje, které vám umožní hrát hru i pokud jste barvoslepí. keybindings: title: Klávesové zkratky @@ -774,9 +772,9 @@ keybindings: pasteLastBlueprint: Vložit poslední plán massSelectCut: Vyjmout oblast exportScreenshot: Exportovat celou základnu jako obrázek - lockBeltDirection: Enable belt planner - switchDirectionLockSide: "Planner: Switch side" - pipette: Pipette + lockBeltDirection: Zamknout směr pásu + switchDirectionLockSide: Otočit strany zámku plánovače + pipette: Kapátko about: title: O hře From bfc123a75dc84cc5e3ca95715a89723e51e1669f Mon Sep 17 00:00:00 2001 From: Wessel <66781896+Ryoncai@users.noreply.github.com> Date: Mon, 22 Jun 2020 22:47:35 +0200 Subject: [PATCH 34/38] Update base-nl.yaml Apologies for the mistake, should be good now. --- translations/base-nl.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/translations/base-nl.yaml b/translations/base-nl.yaml index d92558a8..d8917721 100644 --- a/translations/base-nl.yaml +++ b/translations/base-nl.yaml @@ -156,7 +156,7 @@ mainMenu: continue: Verder newGame: Nieuw Spel madeBy: Gemaakt door - Subreddit: Reddit + subreddit: Reddit dialogs: buttons: @@ -396,7 +396,7 @@ ingame: 1_3_expand: >- Dit is GEEN nietsdoen-spel! bouw meer ontginners en lopende banden om het doel sneller te behalen.

Tip: Houd SHIFT ingedrukt om meerdere ontginners te plaatsen en gebruik R om ze te draaien. - Colors: + colors: red: Rood green: Groen blue: Blauw @@ -405,7 +405,7 @@ ingame: cyan: Cyaan white: Wit uncolored: Geen kleur - ShapeViewer: + shapeViewer: title: Lagen empty: Leeg From 97b33ddcd092b37ef5620c5fa4f6da0c7d336b2f Mon Sep 17 00:00:00 2001 From: otougas <49008219+otougas@users.noreply.github.com> Date: Mon, 22 Jun 2020 20:31:42 -0400 Subject: [PATCH 35/38] ixed typo in norwegian translation --- translations/base-no.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translations/base-no.yaml b/translations/base-no.yaml index 687efc9c..f730a2bd 100644 --- a/translations/base-no.yaml +++ b/translations/base-no.yaml @@ -586,7 +586,7 @@ storyRewards: reward_blueprints: title: Blåkopier - desc: Du kan nå kopiere og lime inn deler av fabrikken din! Velg et område (Hold inne CTRL, så dra med musa), trykk så 'C' for å kopiere det.

Lime det inn er ikke graits, du må produsere blåkopi objekter for å få råd til det! (Det du nettop leverte). + desc: Du kan nå kopiere og lime inn deler av fabrikken din! Velg et område (Hold inne CTRL, så dra med musa), trykk så 'C' for å kopiere det.

Lime det inn er ikke gratis, du må produsere blåkopi objekter for å få råd til det! (Det du nettop leverte). # Special reward, which is shown when there is no reward actually no_reward: From a53a69096e089b60ad36295371c94fdc00163af6 Mon Sep 17 00:00:00 2001 From: K3rcus <38012836+K3rcus@users.noreply.github.com> Date: Tue, 23 Jun 2020 03:33:48 +0200 Subject: [PATCH 36/38] Update Spanish translation Translation of untranslated strings, and correction of some errors --- translations/base-es.yaml | 74 ++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 39 deletions(-) diff --git a/translations/base-es.yaml b/translations/base-es.yaml index 40de327b..f7381e13 100644 --- a/translations/base-es.yaml +++ b/translations/base-es.yaml @@ -57,7 +57,7 @@ steamPage: [*] Modo historia en el que los edificios cuesten figuras [*] Más niveles y edificios (exclusivos del juego completo) [*] Mapas diferentes y tal vez obstáculos en el mapa - [*] Configuración en la cración del mapa (Editar el número y tamaño de los recursos, la semilla, y más) + [*] Configuración en la creación del mapa (Editar el número y tamaño de los recursos, la semilla, y más) [*] Más tipos de formas [*] Mejoras de rendimiento (Aunque el juego ya funciona muy bien!) [*] Modo para daltónicos @@ -283,12 +283,12 @@ ingame: placeBuilding: Colocar edificio createMarker: Crear marca delete: Destruir - pasteLastBlueprint: Paste last blueprint - lockBeltDirection: Enable belt planner - plannerSwitchSide: Flip planner side - cutSelection: Cut - copySelection: Copy - clearSelection: Clear Selection + pasteLastBlueprint: Pegar último plano + lockBeltDirection: Activar planificador de cintas transportadoras + plannerSwitchSide: Invertir giro del planificador + cutSelection: Cortar + copySelection: Copiar + clearSelection: Limpiar Selección pipette: Pipette # Everything related to placing buildings (I.e. as soon as you selected a building @@ -396,17 +396,17 @@ ingame: ¡Esto NO es un "juego de esperar"! Construye más extractores y cintas transportadoras para completar el objetivo más rápido.

Pista: Mantén pulsado SHIFT para colocar varios extractores y usa R para rotarlos. colors: - red: Red - green: Green - blue: Blue - yellow: Yellow - purple: Purple - cyan: Cyan - white: White - uncolored: No color + red: Rojo + green: Verde + blue: Azul + yellow: Amarillo + purple: Morado + cyan: Cian + white: Blanco + uncolored: Sin color shapeViewer: - title: Layers - empty: Empty + title: Capas + empty: Vacio # All shop upgrades shopUpgrades: @@ -454,7 +454,7 @@ buildings: description: Multifuncional - Distribuye equitativamente todas las entradas a todas las salidas. compact: - name: fusionador (compacto) + name: Fusionador (compacto) description: Junta dos cintas transportadoras en una. compact-inverse: @@ -620,7 +620,7 @@ settings: huge: Enorme scrollWheelSensitivity: - title: Sensitividad del zoom + title: Sensibilidad del zoom description: >- Cambia como de sensible es el zoom (Tanto la ruedo del ratón como el trackpad) sensitivity: @@ -689,37 +689,33 @@ settings: Si está activado, colocar túneles automáticamente removerá las cintas transportadoras innecesarias. Esto también permite arrastrar con el ratón y los túneles excedentes serán removidos. vignette: - title: Vignette + title: Viñeta description: >- - Enables the vignette which darkens the screen corners and makes text easier - to read. + Activa el efecto viñeta que oscurece loas esquinas de la pantalla y hace el texto mas fácil de leer. autosaveInterval: - title: Autosave Interval + title: Intervalo de Autoguardado description: >- - Controls how often the game saves automatically. You can also disable it - entirely here. + Controla cada cuanto tiempo se guarda el juego automaticamente. Aquí tambien puedes deshabilitarlo por completo. intervals: - one_minute: 1 Minute - two_minutes: 2 Minutes - five_minutes: 5 Minutes - ten_minutes: 10 Minutes - twenty_minutes: 20 Minutes - disabled: Disabled + one_minute: 1 Minuto + two_minutes: 2 Minutos + five_minutes: 5 Minutos + ten_minutes: 10 Minutos + twenty_minutes: 20 Minutos + disabled: Deshabilitado compactBuildingInfo: - title: Compact Building Infos + title: Información Compacta de Edificios description: >- - Shortens info boxes for buildings by only showing their ratios. Otherwise a - description and image is shown. + Acorta la caja de información mostrando solo sus ratios. Si no, se mostrara una descripción y una imagen. disableCutDeleteWarnings: - title: Disable Cut/Delete Warnings + title: Deshabilitar las advertencias de Cortar/Eliminar description: >- - Disable the warning dialogs brought up when cutting/deleting more than 100 - entities. + Deshabilita los dialogos de advertencia que se muestran cuando se cortan/eliminan mas de 100 elementos. enableColorBlindHelper: - title: Color Blind Mode - description: Enables various tools which allow to play the game if you are color blind. + title: Modo para Daltonicos + description: Activa varias herramientas que permiten jugar si eres daltonico. keybindings: title: Atajos de Teclado From b62a1e2d400d5234ecbc65d18033e77d68787e2a Mon Sep 17 00:00:00 2001 From: kebhr <42484226+kebhr@users.noreply.github.com> Date: Tue, 23 Jun 2020 15:59:03 +0900 Subject: [PATCH 37/38] Update Japanese translation --- translations/base-ja.yaml | 61 +++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/translations/base-ja.yaml b/translations/base-ja.yaml index f60eabec..c4cb3536 100644 --- a/translations/base-ja.yaml +++ b/translations/base-ja.yaml @@ -287,10 +287,10 @@ ingame: pasteLastBlueprint: ブループリントの内容を設置 lockBeltDirection: ベルトプランナーを有効化 plannerSwitchSide: プランナーが通る側を反転 - cutSelection: Cut - copySelection: Copy - clearSelection: Clear Selection - pipette: Pipette + cutSelection: カット + copySelection: コピー + clearSelection: 選択範囲をクリア + pipette: ピペット # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) @@ -398,17 +398,17 @@ ingame: このゲームは放置系のゲームではありません! もっと早く要件を満たせるように、追加の抽出機とベルトを設置しましょう。

Tip: SHIFT キーを押し続けると抽出機を連続配置できます。Rキーで設置方向を回転できます。 colors: - red: Red - green: Green - blue: Blue - yellow: Yellow - purple: Purple - cyan: Cyan - white: White - uncolored: No color + red: 赤 + green: 緑 + blue: 青 + yellow: 黄 + purple: 紫 + cyan: シアン + white: 白 + uncolored: 無色 shapeViewer: - title: Layers - empty: Empty + title: レイヤー + empty: 空 # All shop upgrades shopUpgrades: @@ -700,31 +700,28 @@ settings: 画面の隅を暗くして文字を読みやすくするビネットを有効化します。 autosaveInterval: - title: Autosave Interval + title: オートセーブ間隔 description: >- - Controls how often the game saves automatically. You can also disable it - entirely here. + ゲームが自動的にセーブされる頻度を設定します。無効化することも可能です。 intervals: - one_minute: 1 Minute - two_minutes: 2 Minutes - five_minutes: 5 Minutes - ten_minutes: 10 Minutes - twenty_minutes: 20 Minutes - disabled: Disabled + one_minute: 1 分 + two_minutes: 2 分 + five_minutes: 5 分 + ten_minutes: 10 分 + twenty_minutes: 20 分 + disabled: 無効 compactBuildingInfo: - title: Compact Building Infos + title: コンパクトな建造物情報 description: >- - Shortens info boxes for buildings by only showing their ratios. Otherwise a - description and image is shown. + レートのみを表示することで、建造物の情報ボックスを短くします。選択しない場合は、説明文と画像も表示されます。 disableCutDeleteWarnings: - title: Disable Cut/Delete Warnings + title: カット/削除の警告を無効化 description: >- - Disable the warning dialogs brought up when cutting/deleting more than 100 - entities. + 100個以上のエンティティをカット/削除する際に表示される警告ダイアログを無効にします。 enableColorBlindHelper: - title: Color Blind Mode - description: Enables various tools which allow to play the game if you are color blind. + title: 色覚モード + description: 色覚異常を持っていてもゲームがプレイできるようにするための各種ツールを有効化します。 keybindings: title: キー設定 @@ -791,7 +788,7 @@ keybindings: mapMoveFaster: より速く移動 lockBeltDirection: ベルトプランナーを有効化 switchDirectionLockSide: "プランナー: 通る側を切り替え" - pipette: Pipette + pipette: ピペット about: title: このゲームについて From 40b159078179aa21ac3a89ddf8250a3c3f0d3315 Mon Sep 17 00:00:00 2001 From: Victor <67063010+senjorsalsa@users.noreply.github.com> Date: Tue, 23 Jun 2020 15:50:12 +0200 Subject: [PATCH 38/38] Swedish translation Typos and small fixes --- translations/base-sv.yaml | 114 +++++++++++++++++++------------------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/translations/base-sv.yaml b/translations/base-sv.yaml index 752a1fa8..e7c88eea 100644 --- a/translations/base-sv.yaml +++ b/translations/base-sv.yaml @@ -107,7 +107,7 @@ global: control: CTRL alt: ALT escape: ESC - shift: SHIFT + shift: SKIFT space: MELLANSLAG demoBanners: @@ -162,7 +162,7 @@ dialogs: buttons: ok: OK delete: Radera - cancel: Cancel + cancel: Avbryt later: Senare restart: Starta om reset: Återställ @@ -236,7 +236,7 @@ dialogs: massDeleteConfirm: title: Bekräfta borttagning desc: >- - Du tar nu bort ganska många byggnader ( för att vara exakt)! Är du säker på att du vill göra detta? + Du tar nu bort ganska många byggnader ( för att vara exakt)! Är du säker på att du vill göra detta? blueprintsNotUnlocked: title: Inte än upplåst @@ -246,7 +246,7 @@ dialogs: keybindingsIntroduction: title: Användbara tangentbindningar desc: >- - Detta spel använder en stor mängd tangentbindningar so gör det lättare att bygga stora fabriker. + Detta spel använder en stor mängd tangentbindningar som gör det lättare att bygga stora fabriker. Här är några men se till att kolla in tangentbindningarna!

CTRL + Dra: Välj en yta att kopiera / radera.
SHIFT: Håll ned för att placera flera av samma byggnad.
@@ -257,7 +257,7 @@ dialogs: desc: Ge den ett meningsfullt namn, du kan också inkludera en kort kod av en form (Vilket du kan generera här ) markerDemoLimit: - desc: Du kan bara skapa två markörer i demoversionen. Skaffa den fristående versionen för ett oändligt antal! + desc: Du kan endast skapa två markörer i demoversionen. Skaffa den fristående versionen för ett oändligt antal! massCutConfirm: title: Bekräfta Klipp desc: >- @@ -287,7 +287,7 @@ ingame: delete: Förstör pasteLastBlueprint: Klistra in ritning lockBeltDirection: Sätt på rullbandsplannerare - plannerSwitchSide: Vänd plannerarsidan + plannerSwitchSide: Vänd planerarsidan cutSelection: Klipp copySelection: Kopiera clearSelection: Rensa vald @@ -308,8 +308,8 @@ ingame: speed: Hastighet range: Räckvidd storage: Förvaring - oneItemPerSecond: 1 obejekt / sekund - itemsPerSecond: obejekt / s + oneItemPerSecond: 1 objekt / sekund + itemsPerSecond: objekt / s itemsPerSecondDouble: (x2) tiles: plattor @@ -353,7 +353,7 @@ ingame: delivered: title: Levererade description: Visar former som levereras till din centrala byggnad. - noShapesProduced: Inga former har hitils producerats. + noShapesProduced: Inga former har producerats än. # Displays the shapes per minute, e.g. '523 / m' shapesPerMinute: / m @@ -399,17 +399,17 @@ ingame: Detta är INTE ett idle-spel! Bygg fler extraktörer för att klara målet snabbare.

Tips: Håll SHIFT för att placera flera extraktörer, och använd R för att rotera dem. colors: - red: Red - green: Green - blue: Blue - yellow: Yellow - purple: Purple - cyan: Cyan - white: White - uncolored: No color + red: Röd + green: Grön + blue: Blå + yellow: Gul + purple: Lila + cyan: Turkos + white: Vit + uncolored: Ofärgad shapeViewer: - title: Layers - empty: Empty + title: Lager + empty: Tom # All shop upgrades shopUpgrades: @@ -474,10 +474,10 @@ buildings: rotater: default: - name: &rotater Rotatör + name: &rotater Roterare description: Roterar former 90 grader. ccw: - name: Rotatör (CCW) + name: Roterare (CCW) description: Roterar former 90 motsols. stacker: @@ -493,10 +493,10 @@ buildings: painter: default: name: &painter Färgläggare - description: &painter_desc Färgar hela formen på den vänstra inputten med färgen från den högra. + description: &painter_desc Färgar hela formen på den vänstra ingången med färgen från den högra. double: name: Färgläggare (Dubbel) - description: Färgar formerna på de vänstra inputterna med färgen från den högra. + description: Färgar formerna på de vänstra ingångarna med färgen från den högra. quad: name: Färgläggare (Quad) description: Låter dig färglägga varje hörn av formen med olika färger. @@ -507,14 +507,14 @@ buildings: trash: default: name: &trash Skräphantering - description: Tar in inputs från alla sidor och förstår dem. För alltid. + description: Tar in former från alla sidor och förstör dem. För alltid. storage: name: Förvaring - description: Förvarar överskottliga obejekt, till kapacitet. Kan användas somöverflödsport. + description: Förvarar överskottliga objekt, till kapacitet. Kan användas som överflödsport. hub: deliver: Leverera - toUnlock: att låsa upp + toUnlock: Att låsa upp levelShortcut: LVL storyRewards: @@ -525,7 +525,7 @@ storyRewards: reward_rotater: title: Rotation - desc: Rotatorn har blivit upplåst! Den roterar former 90 grader medsols. + desc: Roteraren har blivit upplåst! Den roterar former 90 grader medsols. reward_painter: title: Måleri @@ -538,11 +538,11 @@ storyRewards: reward_stacker: title: Kombinera - desc: Du kan nu kombinera former medstaplaren! Båda inputs blir combinerade och om de kan sättas brevid varandra kommer de att sättas ihop. Om inte kommer den högra staplas över den vänstra! + desc: Du kan nu kombinera former medstaplaren! Båda inputs blir kombinerade och om de kan sättas brevid varandra kommer de att sättas ihop. Om inte kommer den högra staplas över den vänstra! reward_splitter: title: Delning/Sammanslagning - desc: Den multifunktiionella balancer har blivit upplåst - Den kan användas för att bygga större fabriker genom att dela eller slå ihop obejekt till flera rullband!

+ desc: Den multifunktiionella balanseraren har blivit upplåst - Den kan användas för att bygga större fabriker genom att dela eller slå ihop objekt till flera rullband!

reward_tunnel: title: Tunnel @@ -550,20 +550,20 @@ storyRewards: reward_rotater_ccw: title: Motsols rotation - desc: Du har låst upp en variant av rotatorn - Den låter dig rotera saker motsols! För att bygga den, välj rotatorn och tryck ned 'T' för att cykla genom dess varianter! + desc: Du har låst upp en variant av roteraren - Den låter dig rotera saker motsols! För att bygga den, välj roteraren och tryck ned 'T' för att cykla genom dess varianter! reward_miner_chainable: title: Kedjeextraktor - desc: Du har låst upp Kedjeextraktorn! Den kan föra sina resurser framåt till andra extraktorerså att du kan mer effektivt extrahera resurser! + desc: Du har låst upp Kedjeextraktorn! Den kan föra sina resurser framåt till andra extraktorer så att du kan mer effektivt extrahera resurser! reward_underground_belt_tier_2: title: Tunnel Tier II desc: Du har låst upp en ny variant av tunneln - Den har en större räckvidd, och du kan också mix-matcha tunnlarna nu! reward_splitter_compact: - title: Kompakt Balancer + title: Kompakt Balanserare desc: >- - Du har låst upp en ny veriant av balancer - Den accepterar två input och gör dem till en! + Du har låst upp en ny variant av balanseraren - Den accepterar två input och gör dem till en! reward_cutter_quad: title: Quad Klippning @@ -575,11 +575,11 @@ storyRewards: reward_painter_quad: title: Quad Färgläggning - desc: Du har låst upp en ny variant av Färgläggaren - Den tillåter dig att färglägga varje del av formen individuellt! + desc: Du har låst upp en ny variant av Färgläggaren - Den tillåter dig att färglägga varje del av en form individuellt! reward_storage: title: Förvaringsbuffert - desc: Du har låst upp en ny variant av skräphantering - Den tillåter dig att förvara obejekt upp till en viss kapacitet! + desc: Du har låst upp en ny variant av skräphantering - Den tillåter dig att förvara objekt upp till en viss kapacitet! reward_freeplay: title: Friläge @@ -587,13 +587,13 @@ storyRewards: reward_blueprints: title: Ritningar - desc: Du kan nu kopiera och klistra in delar av din fabrik! Välj ett område (håll in CTRL, dra sedan med musen), och tryck 'C' för att kopiera det.

Att klistra in ärinte gratis, du behöver produvera ritningsformer för att ha råd med det! (De du just levererade). + desc: Du kan nu kopiera och klistra in delar av din fabrik! Välj ett område (håll in CTRL, dra sedan med musen), och tryck 'C' för att kopiera det.

Att klistra in ärinte gratis, du behöver producera ritningsformer för att ha råd med det! (De du just levererade). # Special reward, which is shown when there is no reward actually no_reward: title: Nästa nivå desc: >- - Denna nivå har ingen belöning, men nästa kommer!

PS: Se till att inte förstöra din redan existerande fabrik - Du behöver alla dom där formerna igen för att låsa upp uppgraderignar! + Denna nivå har ingen belöning, men nästa kommer!

PS: Se till att inte förstöra din redan existerande fabrik - Du behöver alla de där formerna igen för att låsa upp uppgraderingar! no_reward_freeplay: title: Nästa nivå @@ -616,7 +616,7 @@ settings: uiScale: title: Gränssnittsskala description: >- - Ändrar storleken på gränssnittet. gränssnittet kommer fortförande baseras på skrärmupplåsning, men denna inställning kontrollerar mängdskala. + Ändrar storleken på gränssnittet. gränssnittet kommer fortfarande baseras på skärmupplösning, men denna inställning kontrollerar mängdskala. scales: super_small: Superliten small: Liten @@ -630,7 +630,7 @@ settings: Ändrar hur känslig zoomen är (Mushjul eller styrplatta). sensitivity: super_slow: Superlångsam - slow: långsam + slow: Långsam regular: Normal fast: Snabb super_fast: Supersnabb @@ -643,7 +643,7 @@ settings: fullscreen: title: Fullskärm description: >- - Det är rekomenderat att spela i fullskärm för bästa upplevelse. Endast tillgänglig i den fristående versionen. + Det är rekommenderat att spela i fullskärm för bästa upplevelse. Endast tillgänglig i den fristående versionen. soundsMuted: title: Dämpa Ljud @@ -667,12 +667,12 @@ settings: refreshRate: title: Simulationsmål description: >- - Om du har en 144hz skärm, ändra uppdateringshastigheten här så kommer spelet simulera vid en högre uppdateringshastighet. Detta kan dock sänka FPS om din dator är lågsam. + Om du har en 144hz skärm, ändra uppdateringshastigheten här så kommer spelet simulera vid en högre uppdateringshastighet. Detta kan dock sänka FPS om din dator är långsam. alwaysMultiplace: title: Flerplacering description: >- - Om på, alla byggnader kommer fortsätta vara valda efter placering. Att ha detta på är som att konstant hålla ned SHIFT. + Om på, alla byggnader kommer fortsätta vara valda efter placering. Att ha detta på är som att konstant hålla ned SKIFT. offerHints: title: Tips & Tutorials @@ -684,9 +684,9 @@ settings: description: Ändrar hur snabbt kameran förflyttar sig när du använder tangentbordet för att flytta kameran. speeds: super_slow: Superlångsamt - slow: långsamt + slow: Långsamt regular: Normal - fast: snabbt + fast: Snabbt super_fast: Supersnabbt extremely_fast: Extremt snabbt enableTunnelSmartplace: @@ -713,7 +713,7 @@ settings: twenty_minutes: 20 Minuter disabled: Avstängd compactBuildingInfo: - title: Kompaktera byggnadsinfo + title: Kompakt byggnadsinfo description: >- Kortar ned infotexter för byggnader genom att endast visa dess storlek. Annars visas en beskrivning och bild. @@ -724,13 +724,13 @@ settings: ska tas bort enableColorBlindHelper: - title: Color Blind Mode - description: Enables various tools which allow to play the game if you are color blind. + title: Färgblint läge + description: Aktiverar olika verktyg som låter dig spela spelet om du är färbling. keybindings: title: Tangentbindningar hint: >- - Tips: Se till att använda CTRL, SHIFT, och ALT! De låter dig använda olika placeringslägen. + Tips: Se till att använda CTRL, SKIFT, och ALT! De låter dig använda olika placeringslägen. resetKeybindings: Återställ Tangentbindningar @@ -746,10 +746,10 @@ keybindings: mappings: confirm: Godkänn back: Tillbaka - mapMoveUp: Gå upp - mapMoveRight: Gå höger - mapMoveDown: Gå nedåt - mapMoveLeft: Gå vänster + mapMoveUp: Gå Upp + mapMoveRight: Gå Höger + mapMoveDown: Gå Nedåt + mapMoveLeft: Gå Vänster centerMap: Till mitten av världen mapZoomIn: Zooma in @@ -783,15 +783,15 @@ keybindings: massSelectSelectMultiple: Välj flera ytor massSelectCopy: Kopiera yta - placementDisableAutoOrientation: Stäng av automatisk orientation + placementDisableAutoOrientation: Stäng av automatisk orientering placeMultiple: Stanna kvar i placeringsläge - placeInverse: Invertera automatisk rullbandsorientation + placeInverse: Invertera automatisk rullbandsorientering pasteLastBlueprint: Klistra in ritning massSelectCut: Klipp yta exportScreenshot: Exportera hela fabriken som bild mapMoveFaster: Flytta dig snabbare - lockBeltDirection: Sätt på rullbandsplannerare - switchDirectionLockSide: "Plannerare: Byt sida" + lockBeltDirection: Sätt på rullbandsplanerare + switchDirectionLockSide: "Planerare: Byt sida" pipette: Pipett about: @@ -808,7 +808,7 @@ about: target="_blank">discord server!

Musiken skapades av Peppsen - Han är grymm!

+ target="_blank">Peppsen - Han är grym!

Och sist men inte minst, tack till min bästa vän Niklas - Utan våra