diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000000..769aa0e77a --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,46 @@ +name: KG Deploy code +on: + push: + branches: + - master + - dev/alpha + - dev/beta + pull_request: + branches: + - master + - dev/alpha + - dev/beta + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Yarn setup + uses: DerYeger/yarn-setup-action@master + with: + node-version: 16 + + - name: Install dependencies + run: yarn + + - name: Lint + run: yarn lint + + - name: Test + run: yarn test + + deploy: + runs-on: ubuntu-latest + needs: build + steps: + - name: executing remote ssh commands using password + uses: appleboy/ssh-action@v1.0.0 + with: + username: ${{ secrets.KG_SSH_USER }} + host: ${{ secrets.KG_SSH_HOST }} + key: ${{ secrets.KG_SSH_KEY }} + script: /var/www/kittensgame.com/html/deploy.sh + + diff --git a/core.js b/core.js index 90adaa0750..70922682c0 100644 --- a/core.js +++ b/core.js @@ -707,19 +707,58 @@ dojo.declare("com.nuclearunicorn.game.ui.ButtonController", null, { model.handler.apply(this, [model, event]); }, + /* This is probably the most important function in the button's code--when you click the button, it does the thing. + * This function also handles logic such as "what if you click the button but can't afford it right now." + * The name "buy item" is somewhat misleading, as ALL buttons in the UI (at least, all that inherit from this class) + * use this function. Buttons like the "send hunters" button or the "reset game" button use their clickHandler to do the thing. + * Other buttons such as those for buildings or techs override the buyItem function to put their own custom logic in, but + * all implementations of buyItem follow the same principles. + * @param model Object. The model of this item. For those unfamiliar with the Kittens Game game engine, the model + * specifies data such as the name of the item, whether it's visible, whether it's enabled, its prices, + * its effects, the metadata associated with this building, etc. + * @param event (OPTIONAL) Object. If given, contains information such as whether the shift key was pressed. This is + * used by buildings to determine if we're buying 1, buying 10, buying all, etc. If null, uses default behavior. + * @param callback Function. This is how we communicate the results of trying to buy the item. The callback function is called + * with a single parameter, an object containing two fields: + * itemBought Boolean. True if one or more items were bought, false if nothing happened. + * reason String. Used as an enumeration encoding *why* the result happened the way it did. + * If itemBought is true, can be one of the following values: + * "paid-for" We met the requirements & bought the item legitimately. + * "dev-mode" We bought this item in dev mode ignoring the cost & requirements. + * "item-is-free" The item has no cost or requirements. + * If itemBought is false, can be one of the following values: + * "not-unlocked" The item is not unlocked yet. + * "already-bought" For one-time purchases, the item is already bought. + * For purchases with a limit, we are at that limit. + * "blocked" A conflicting item has already been bought. + * Also used by some policies to indicate additional unmet requirements. + * "player-denied" This item requires the player to confirm their choice, but + * the player decided not to confirm the purchase. + * "cannot-afford" The player can't afford the price of this item right now. + * "not-enabled" For some unspecified reason, this item is not available. + * If the callback function returns anything, the return value from that function is ignored. + * @return No return value. We communicate with the rest of the program using the callback function. + */ buyItem: function(model, event, callback){ - if (model.enabled && this.hasResources(model)) { - this.clickHandler(model, event); - - this.payPrice(model); - - if (model.priceRatio){ - this.adjustPrice(model.priceRatio); - } + if (!this.hasResources(model)) { + callback({ itemBought: false, reason: "cannot-afford" }); + return; + } + if (!model.enabled) { + callback({ itemBought: false, reason: "not-enabled" }); + return; + } + //Else, we meet all requirements to buy this item: + if (!event) { event = {}; /*event is an optional parameter*/ } + this.clickHandler(model, event); + this.payPrice(model); - callback(true); + if (model.priceRatio){ + this.adjustPrice(model.priceRatio); } - callback(false); + + //A lot of normal UI buttons that don't involve building things use this method, so check if things are free: + callback({ itemBought: true, reason: ((model.prices && model.prices.length) ? "paid-for" : "item-is-free") }); }, refund: function(model){ @@ -901,7 +940,7 @@ dojo.declare("com.nuclearunicorn.game.ui.Button", com.nuclearunicorn.core.Contro this.animate(); var self = this; this.controller.buyItem(this.model, event, function(result) { - if (result) { + if (typeof(result) == "object" && result.itemBought) { self.update(); } }); @@ -1268,8 +1307,9 @@ dojo.declare("com.nuclearunicorn.game.ui.ButtonModernController", com.nuclearuni ButtonModernHelper = { getTooltipHTML : function(controller, model){ + //Some aspects of the metadata may have changed, so fetch the latest version of the model: + model = controller.fetchModel(model.options); controller.fetchExtendedModel(model); - //throw "ButtonModern::getTooltipHTML must be implemented"; var tooltip = dojo.create("div", { className: "tooltip-inner" }, null); @@ -1560,7 +1600,7 @@ dojo.declare("com.nuclearunicorn.game.ui.BuildingBtnController", com.nuclearunic var nextEffectValue = underlying.effects[effectName]; underlying.on--; underlying.updateEffects(underlying, this.game); - //(cycleEffectsBasics is only relevant for space buildings & it will be applied at a later time so we skip it for now) + this.game.calendar.cycleEffectsBasics(underlying.effects, underlying.name); return nextEffectValue; }, @@ -1853,8 +1893,12 @@ dojo.declare("com.nuclearunicorn.game.ui.BuildingBtn", com.nuclearunicorn.game.u } var building = this.model.metadata; - if (building && building.val){ - + if (!building) { + //Everything else we want to do here depends on the building property. + //If we don't have that, then skip + return; + } + if (building.val){ // -------------- sell ---------------- if (this.sellHref){ dojo.style(this.sellHref.link, "display", (building.val > 0) ? "" : "none"); @@ -1879,10 +1923,10 @@ dojo.declare("com.nuclearunicorn.game.ui.BuildingBtn", com.nuclearunicorn.game.u if (this.add) { dojo.toggleClass(this.add["add1"].link, "enabled", building.on < building.val); } - this.updateLink(this.toggle, this.model.togglableOnOffLink); - this.updateLink(this.toggleAutomation, this.model.toggleAutomationLink); } + //Update this specific link even if there are 0 of the building in question: + this.updateLink(this.toggleAutomation, this.model.toggleAutomationLink); } }); @@ -1954,45 +1998,65 @@ dojo.declare("com.nuclearunicorn.game.ui.BuildingStackableBtnController", com.nu }, buyItem: function(model, event, callback) { - if (model.enabled && this.hasResources(model) || this.game.devMode) { + var isInDevMode = this.game.devMode; + if (!this.hasResources(model) && !isInDevMode) { + callback({ itemBought: false, reason: "cannot-afford" }); + return; + } + if (!model.enabled && !isInDevMode) { + //Give a more detailed reason of why we can't buy it at this time: + var whyArentWeEnabled = "not-enabled"; //(default reason--unspecified) var meta = model.metadata; - if (this.game.ironWill && meta.effects && meta.effects["maxKittens"] > 0 && this.game.science.get("archery").researched) { - var self = this; - this.game.ui.confirm("", $I("iron.will.break.confirmation.msg"), function() { - self._buyItem_step2(model, event, callback); - }, function() { - callback(false); - }); - } else { - this._buyItem_step2(model, event, callback); + if (typeof(meta.limitBuild) == "number" && meta.limitBuild <= meta.val) { + whyArentWeEnabled = "already-bought"; + } else if (meta.on && meta.noStackable){ + whyArentWeEnabled = "already-bought"; } + + callback({ itemBought: false, reason: whyArentWeEnabled }); + return; + } + //Else, we meet all the requirements for being able to buy this item: + var meta = model.metadata; + if (this.game.ironWill && meta.effects && meta.effects["maxKittens"] > 0 && this.game.science.get("archery").researched) { + //Show a confirmation message if we're building something that would break Iron Will mode. + var self = this; + this.game.ui.confirm("", $I("iron.will.break.confirmation.msg"), function() { + self._buyItem_step2(model, event, callback); + }, function() { + callback({ itemBought: false, reason: "player-denied" /*The player decided not to buy this after all.*/ }); + }); } else { - callback(false); + this._buyItem_step2(model, event, callback); } }, _buyItem_step2: function(model, event, callback) { + if (!event) { event = {}; /*event is an optional parameter*/ } + //This is what we pass to the callback function if we succeed: + var resultIfBuySuccessful = { itemBought: true, reason: (this.game.devMode ? "dev-mode" : "paid-for") }; + var meta = model.metadata; if (!meta.noStackable && event.shiftKey) { var maxBld = 10000; if (this.game.opts.noConfirm) { this.build(model, maxBld); - callback(true); + callback(resultIfBuySuccessful); } else { var self = this; this.game.ui.confirm($I("construct.all.confirmation.title"), $I("construct.all.confirmation.msg"), function() { self.build(model, maxBld); - callback(true); + callback(resultIfBuySuccessful); }, function() { - callback(false); + callback({ itemBought: false, reason: "player-denied" /*The player decided not to buy this after all.*/}); }); } } else if (!meta.noStackable && (event.ctrlKey || event.metaKey /*osx tears*/)) { this.build(model, this.game.opts.batchSize || 10); - callback(true); + callback(resultIfBuySuccessful); } else { this.build(model, 1); - callback(true); + callback(resultIfBuySuccessful); } }, @@ -2119,16 +2183,22 @@ dojo.declare("com.nuclearunicorn.game.ui.BuildingNotStackableBtnController", com }, buyItem: function(model, event, callback) { - if ((!model.metadata.researched && this.hasResources(model)) || this.game.devMode){ - this.payPrice(model); - - this.onPurchase(model); - - callback(true); - this.game.render(); + var isInDevMode = this.game.devMode; + if (model.metadata.researched && !isInDevMode) { + callback({ itemBought: false, reason: "already-bought" }); return; } - callback(false); + if (!this.hasResources(model) && !isInDevMode) { + callback({ itemBought: false, reason: "cannot-afford" }); + return; + } + //Else, we can buy it: + this.payPrice(model); + this.onPurchase(model); + + callback({ itemBought: true, reason: (isInDevMode ? "dev-mode" : "paid-for") }); + this.game.render(); + return; }, onPurchase: function(model){ diff --git a/game.js b/game.js index f84b9498d2..2d578f2ae3 100644 --- a/game.js +++ b/game.js @@ -1225,6 +1225,11 @@ dojo.declare("com.nuclearunicorn.game.EffectsManager", null, { type: "ratio" }, + "bskSattelitePenalty" : { + title: $I("effectsMgr.statics.bskSattelitePenalty.title"), + type: "ratio" + }, + "blsCorruptionRatio": { title: $I("effectsMgr.statics.blsCorruptionRatio.title"), type: "ratio" @@ -5132,6 +5137,9 @@ dojo.declare("com.nuclearunicorn.game.ui.GamePage", null, { } } } + + //Update caches again to include the latest changes: + this.updateCaches(); }, toggleFilters: function(){ diff --git a/js/buildings.js b/js/buildings.js index 092dd156b7..f6e6b2231b 100644 --- a/js/buildings.js +++ b/js/buildings.js @@ -2734,6 +2734,7 @@ dojo.declare("classes.managers.BuildingsManager", com.nuclearunicorn.core.TabMan this.game.render(); } else if (data.action == "deltagrade"){ //Generic term for upgrading/downgrading bldMetaRaw.stage = Math.max(0, bldMetaRaw.stage - amt); + this.game.time.queue.onDeltagrade(bld.name); //Update because it changed when we changed stages bld = new classes.BuildingMeta(bldMetaRaw).getMeta(); @@ -2763,7 +2764,7 @@ dojo.declare("classes.game.ui.GatherCatnipButtonController", com.nuclearunicorn. } this.game.bld.gatherCatnip(); - callback(true); + callback({ itemBought: true, reason: "item-is-free" /*It costs no resources to gather catnip, so we can't fail to buy it*/}); } }); @@ -2864,6 +2865,9 @@ dojo.declare("classes.ui.btn.BuildingBtnModernController", com.nuclearunicorn.ga build: function(model, opts){ var counter = this.inherited(arguments); + if (!counter) { + return; //Skip stats & undo if nothing was built + } //update stats this.game.stats.getStat("buildingsConstructed").val += counter; @@ -3009,14 +3013,16 @@ dojo.declare("classes.ui.btn.StagingBldBtnController", classes.ui.btn.BuildingBt }); this.sellInternal(model, 0, false /*requireSellLink*/); } - metadataRaw.stage += delta; - if (!metadataRaw.stage) {metadataRaw.stage = Math.max(0, delta);} + if (metadataRaw.stage) { metadataRaw.stage = Math.max(0, metadataRaw.stage + delta); } + else { metadataRaw.stage = Math.max(0, delta); } metadataRaw.val = 0; //TODO: fix by using separate value flags metadataRaw.on = 0; if (metadataRaw.calculateEffects){ metadataRaw.calculateEffects(metadataRaw, this.game); } + this.game.time.queue.onDeltagrade(model.options.building); + this.game.upgrade(metadataRaw.upgrades); this.game.render(); }, diff --git a/js/challenges.js b/js/challenges.js index 23410f4901..dc89c43faa 100644 --- a/js/challenges.js +++ b/js/challenges.js @@ -235,16 +235,20 @@ dojo.declare("classes.managers.ChallengesManager", com.nuclearunicorn.core.TabMa researched: false, unlocked: false, effects: { - "corruptionBoostRatioChallenge": 0.1 + "corruptionBoostRatioChallenge": 0.1, + "bskSattelitePenalty": 0 }, stackOptions: { - "corruptionBoostRatioChallenge": { LDRLimit: 2 } + "corruptionBoostRatioChallenge": { LDRLimit: 2 }, + "bskSattelitePenalty": { LDRLimit: 30 } }, calculateEffects: function(self, game){ if (self.active) { self.effects["corruptionBoostRatioChallenge"] = 0; + self.effects["bskSattelitePenalty"] = 0.1 * (game.ironWill ? 0 : (self.on || 0)); }else{ self.effects["corruptionBoostRatioChallenge"] = 0.1; + self.effects["bskSattelitePenalty"] = 0; } game.upgrade(self.upgrades); }, @@ -709,30 +713,8 @@ dojo.declare("classes.ui.ChallengeBtnController", com.nuclearunicorn.game.ui.Bui }, buyItem: function(model, event, callback) { - /*if (model.metadata.name == this.game.challenges.currentChallenge - || (!model.enabled && !this.game.devMode)) { - callback(false); - return; - } - - var game = this.game; - game.ui.confirm($I("challendge.btn.confirmation.title"), $I("challendge.btn.confirmation.msg"), function() { - // Set the challenge for after reset - game.challenges.currentChallenge = model.metadata.name == "ironWill" - ? null - : model.metadata.name; - // Reset with any benefit of chronosphere (resources, kittens, etc...) - game.bld.get("chronosphere").val = 0; - game.bld.get("chronosphere").on = 0; - game.time.getVSU("cryochambers").val = 0; - game.time.getVSU("cryochambers").on = 0; - game.resetAutomatic(); - callback(true); - }, function() { - callback(false); - });*/ - this.togglePending(model); + callback({ itemBought: true, reason: "item-is-free" /*We just toggled the pending state; simple, really*/}); }, togglePending: function(model){ diff --git a/js/jsx/queue.jsx.js b/js/jsx/queue.jsx.js index d63cecd275..6e21c2ad10 100644 --- a/js/jsx/queue.jsx.js +++ b/js/jsx/queue.jsx.js @@ -10,35 +10,47 @@ WQueueItem = React.createClass({ componentDidMount: function(){ this.attachTooltip(); }, + componentDidUpdate: function(prevProps, prevState){ + if (this.props.item !== prevProps.item) { + this.attachTooltip(); + } + }, render: function(){ var item = this.props.item; + var buttons = [ + $r("a", { + href: "#", + onClick: this.removeOne, + }, "[-]")]; - if (item.value){ - buttons = [ - $r("a", { - href: "#", - onClick: this.removeOne, - }, "[-]"), - $r("a", { - href: "#", - onClick: this.removeAll, - }, "[x]") - ] - } else { - buttons = [ - $r("a", { - href: "#", - onClick: this.removeOne, - }, "[x]") - ] + if (item.value) { + buttons.push($r("a", { + href: "#", + onClick: this.removeAll, + }, "[x]")); } + if (!this.props.isLast) { + buttons.push($r("a", { + href: "#", + onClick: this.pushBack, + }, "[↓]")); + } + + if (this.props.index > 0) { + buttons.push($r("a", { + href: "#", + onClick: this.pushFront, + }, "[↑]")); + } + + //TODO: red indicator when can't process //TODO: attach tooltip as if it is a button return $r("div", {}, [ - "[" + item.type + "][" + item.name + "] - ", + "[" + item.type + "] - ", $r("span", {ref:"itemLabel", className:"queue-label"}, item.label), ( item.value ? (" " + item.value ) : "" @@ -46,6 +58,16 @@ WQueueItem = React.createClass({ ].concat(buttons)); }, + pushBack: function(){ + var i = this.props.index; + this.props.queueManager.pushBack(i); + }, + + pushFront: function(){ + var i = this.props.index; + this.props.queueManager.pushFront(i); + }, + removeOne: function(){ var i = this.props.index; this.props.queueManager.remove(i, 1); @@ -61,19 +83,13 @@ WQueueItem = React.createClass({ var game = this.props.game; var node = React.findDOMNode(this.refs.itemLabel); - //TODO: extract controller and model - //TBD - if (item.type != "buildings"){ + //Extract the correct type of controller & its model for this specific item: + var controllerAndModel = game.time.queue.getQueueElementControllerAndModel(item); + if (!controllerAndModel) { return; } - - var controller = new classes.ui.btn.BuildingBtnModernController(game); - var model = controller.fetchModel({ - building: item.name, - key: item.name, - }); - UIUtils.attachTooltip(game, node, 0, 200, dojo.partial(ButtonModernHelper.getTooltipHTML, controller, model)); + UIUtils.attachTooltip(game, node, 0, 200, dojo.partial(ButtonModernHelper.getTooltipHTML, controllerAndModel.controller, controllerAndModel.model)); } }); @@ -165,9 +181,22 @@ WQueue = React.createClass({ var queueManager = self.state.game.time.queue; var queueItems = queueManager.queueItems; - for (var i in queueItems){ + for (var i = 0; i < queueItems.length; i++){ var item = queueItems[i]; - items.push($r(WQueueItem, {item: item, index: i, queueManager: queueManager, game: game})); + + //null element safe switch + if (!item){ + items.push($r("div", {}, "")); + continue; + } + + items.push($r(WQueueItem, { + item: item, + index: i, + isLast: i == queueItems.length - 1, + queueManager: queueManager, + game: game + })); } return $r("div", {}, items diff --git a/js/prestige.js b/js/prestige.js index 981d9045ae..480e737b00 100644 --- a/js/prestige.js +++ b/js/prestige.js @@ -543,7 +543,7 @@ dojo.declare("classes.ui.PrestigeBtnController", com.nuclearunicorn.game.ui.Buil if (this.game.science.get("metaphysics").researched) { this.inherited(arguments); } else { - callback(false); + callback({ itemBought: false, reason: "not-unlocked" }); } }, diff --git a/js/religion.js b/js/religion.js index 853f5592b6..523be09974 100644 --- a/js/religion.js +++ b/js/religion.js @@ -1381,12 +1381,26 @@ dojo.declare("classes.ui.religion.TransformBtnController", com.nuclearunicorn.ga }, buyItem: function(model, event, callback) { - if (model.enabled && this.hasResources(model)) { - var batchSize = event.shiftKey ? 10000 : - event.ctrlKey || event.metaKey ? this.game.opts.batchSize : 1; - callback(this._transform(model, batchSize)); + if (!this.hasResources(model)) { + callback({ itemBought: false, reason: "cannot-afford" }); + return; + } + if (!model.enabled) { + //As far as I can tell, this shouldn't ever happen because being + //unable to afford it is the only reason for it to be disabled. + callback({ itemBought: false, reason: "not-enabled" }); + return; + } + if (!event) { event = {}; /*event is an optional parameter*/ } + var batchSize = event.shiftKey ? 10000 : + event.ctrlKey || event.metaKey ? this.game.opts.batchSize : 1; + var didWeSucceed = this._transform(model, batchSize); + if (didWeSucceed) { + callback({ itemBought: true, reason: "paid-for" }); + } else { + //_transform(model, amt) returns false if we can't afford it + callback({ itemBought: false, reason: "cannot-afford" }); } - callback(false); }, _canAfford: function(model) { @@ -1395,10 +1409,23 @@ dojo.declare("classes.ui.religion.TransformBtnController", com.nuclearunicorn.ga transform: function(model, divider, event, callback) { var amt = Math.floor(this._canAfford(model) / divider); - if (model.enabled && amt >= 1) { - callback(this._transform(model, amt)); + if (amt < 1) { + callback({ itemBought: false, reason: "cannot-afford" }); + return; + } + if (!model.enabled) { + //As far as I can tell, this shouldn't ever happen because being + //unable to afford it is the only reason for it to be disabled. + callback({ itemBought: false, reason: "not-enabled" }); + return; + } + var didWeSucceed = this._transform(model, amt); + if (didWeSucceed) { + callback({ itemBought: true, reason: "paid-for" }); + } else { + //_transform(model, amt) returns false if we can't afford it + callback({ itemBought: false, reason: "cannot-afford" }); } - callback(false); }, _transform: function(model, amt) { @@ -1470,7 +1497,7 @@ dojo.declare("classes.ui.religion.RefineTearsBtnController", com.nuclearunicorn. && self._canAfford(model, count) >= count, title: "x" + count, handler: function (event) { - self.buyItem(model, {}, this.update.bind(this), count); + self.buyItem(model, null, this.update.bind(this), count); } }; }, @@ -1480,25 +1507,32 @@ dojo.declare("classes.ui.religion.RefineTearsBtnController", com.nuclearunicorn. }, buyItem: function(model, event, callback, count){ - if (model.enabled && this.hasResources(model)) { - if (this.game.resPool.get("sorrow").value >= this.game.resPool.get("sorrow").maxValue){ - this.game.msg($I("religion.refineTearsBtn.refine.msg.failure")); - callback(false); - return; - } - - for (var batchSize = count || (event.ctrlKey ? this.game.opts.batchSize : 1); - batchSize > 0 - && this.hasResources(model) - && this.game.resPool.get("sorrow").value < this.game.resPool.get("sorrow").maxValue; - batchSize--) { - this.payPrice(model); - this.refine(); - } - - callback(true); + if (!this.hasResources(model)) { + callback({ itemBought: false, reason: "cannot-afford" }); + return; + } + if (!model.enabled) { + //As far as I can tell, this shouldn't ever happen because being + //unable to afford it is the only reason for it to be disabled. + callback({ itemBought: false, reason: "not-enabled" }); + return; + } + if (this.game.resPool.get("sorrow").value >= this.game.resPool.get("sorrow").maxValue){ + //We can't refine because we're at the limit. + this.game.msg($I("religion.refineTearsBtn.refine.msg.failure")); + callback({ itemBought: false, reason: "already-bought" }); + return; } - callback(false); + if (!event) { event = {}; /*event is an optional parameter*/ } + for (var batchSize = count || (event.ctrlKey ? this.game.opts.batchSize : 1); + batchSize > 0 + && this.hasResources(model) + && this.game.resPool.get("sorrow").value < this.game.resPool.get("sorrow").maxValue; + batchSize--) { + this.payPrice(model); + this.refine(); + } + callback({ itemBought: true, reason: "paid-for" }); }, refine: function(){ @@ -1595,15 +1629,16 @@ dojo.declare("classes.ui.PactsPanel", com.nuclearunicorn.game.ui.Panel, { buyItem: function(model, event, callback) { this.game.updateCaches(); this.updateEnabled(model); - if ((this.hasResources(model)) || this.game.devMode){ - if(!this.shouldBeBough(model, this.game)){ - callback(false); - return; - } - this._buyItem_step2(model, event, callback); - }else{ - callback(false); + + if (!this.hasResources(model) && !this.game.devMode) { + callback({ itemBought: false, reason: "cannot-afford" }); + return; + } + if(!this.shouldBeBough(model, this.game)){ + callback({ itemBought: false, reason: "already-bought" /*No more pacts available*/ }); + return; } + this._buyItem_step2(model, event, callback); }, build: function(model, maxBld){ diff --git a/js/resources.js b/js/resources.js index 51da3bca19..af80421ef8 100644 --- a/js/resources.js +++ b/js/resources.js @@ -686,7 +686,7 @@ dojo.declare("classes.managers.ResourceManager", com.nuclearunicorn.core.TabMana for (var i in this.resources){ var res = this.resources[i]; if (res.name == "sorrow"){ - res.maxValue = 16 + (game.getEffect("blsLimit") || 0); + res.maxValue = 17 + (game.getEffect("blsLimit") || 0); res.value = Math.min(res.value, res.maxValue); continue; } diff --git a/js/science.js b/js/science.js index 0acdffde5d..01499e0206 100644 --- a/js/science.js +++ b/js/science.js @@ -117,6 +117,9 @@ dojo.declare("classes.managers.ScienceManager", com.nuclearunicorn.core.TabManag description: $I("science.construction.desc"), effectDesc: $I("science.construction.effectDesc"), prices: [{name : "science", val: 1300}], + effects: { + "queueCap": 1 + }, unlocks: { buildings: ["logHouse", "warehouse", "lumberMill", "ziggurat"], tech: ["engineering"], @@ -1871,46 +1874,56 @@ dojo.declare("classes.ui.PolicyBtnController", com.nuclearunicorn.game.ui.Buildi } }, - shouldBeBough: function(model, game){ //fail checks: + //Returns an object with two fields: + // itemBought: Boolean. Are we able to buy this policy at this time? + // reason: String. If we can't buy it, why not? If we can buy it, returns + // "paid-for" regardless of whether we can actually afford it or not. + shouldBeBought: function(model, game){ //fail checks: if(this.game.village.leader && model.metadata.requiredLeaderJob && this.game.village.leader.job != model.metadata.requiredLeaderJob){ var jobTitle = this.game.village.getJob(model.metadata.requiredLeaderJob).title; this.game.msg($I("msg.policy.wrongLeaderJobForResearch", [model.metadata.label, jobTitle]), "important"); - return false; + return { itemBought: false, reason: "blocked" }; }else if(model.metadata.name == "transkittenism" && this.game.bld.getBuildingExt("aiCore").meta.effects["aiLevel"] >= 15){ this.game.msg($I("msg.policy.aiNotMerges"),"alert", "ai"); - return false; + return { itemBought: false, reason: "blocked" }; }else if(model.metadata.blocked != true) { for(var i = 0; i < model.metadata.blocks.length; i++){ if(this.game.science.getPolicy(model.metadata.blocks[i]).researched){ model.metadata.blocked = true; - return false; + return { itemBought: false, reason: "blocked" }; } } var confirmed = false; //confirmation: if(game.opts.noConfirm){ - return true; + return { itemBought: true, reason: "paid-for" }; } game.ui.confirm($I("policy.confirmation.title"), $I("policy.confirmation.title"), function() { confirmed = true; }); + return confirmed ? { itemBought: true, reason: "paid-for" } : { itemBought: false, reason: "player-denied" }; } - return confirmed; + //Else, the policy was blocked: + return { itemBought: false, reason: "blocked" }; }, buyItem: function(model, event, callback) { - if ((!model.metadata.researched && this.hasResources(model)) || this.game.devMode){ - if(!this.shouldBeBough(model, this.game)){ - callback(false); - return; - } - this.payPrice(model); - - this.onPurchase(model); - - callback(true); - this.game.render(); + var isInDevMode = this.game.devMode; + if (model.metadata.researched && !isInDevMode) { + callback({ itemBought: false, reason: "already-bought" }); + return; + } + if (!this.hasResources(model) && !isInDevMode) { + callback({ itemBought: false, reason: "cannot-afford" }); + return; + } + var result = this.shouldBeBought(model, this.game); + if(!result.itemBought){ + callback(result); //Tell them *why* we failed to buy the item. return; } - callback(false); + this.payPrice(model); + this.onPurchase(model); + callback({ itemBought: true, reason: (this.game.devMode ? "dev-mode" : "paid-for") }); + this.game.render(); }, onPurchase: function(model){ this.inherited(arguments); diff --git a/js/space.js b/js/space.js index 46ebc72eb9..c280b820bb 100644 --- a/js/space.js +++ b/js/space.js @@ -276,6 +276,11 @@ dojo.declare("classes.managers.SpaceManager", com.nuclearunicorn.core.TabManager else { self.effects["energyConsumption"] = 1; } + + if (game.challenges.isActive("blackSky")) { + self.effects['starchartPerTickBaseSpace'] *= 1 / (1 + game.getEffect('bskSattelitePenalty')); + } + game.upgrade(self.upgrades); //this way observatories won't have to use action }, upgrades: { @@ -1299,7 +1304,7 @@ dojo.declare("com.nuclearunicorn.game.ui.SpaceProgramBtnController", com.nuclear if (model.metadata.val == 0) { this.inherited(arguments); } else { - callback(false); + callback({ itemBought: false, reason: "already-bought" }); } }, diff --git a/js/time.js b/js/time.js index 059d33dddd..d8671aa365 100644 --- a/js/time.js +++ b/js/time.js @@ -137,6 +137,8 @@ dojo.declare("classes.managers.TimeManager", com.nuclearunicorn.core.TabManager, var bld = this.voidspaceUpgrades[i]; this.resetStateStackable(bld); } + + this.queue.resetState(); }, update: function(){ @@ -240,6 +242,7 @@ dojo.declare("classes.managers.TimeManager", com.nuclearunicorn.core.TabManager, daysOffset = offset; } if(this.game.getFeatureFlag("QUEUE_REDSHIFT")){ + //console.log( "Calculating queue redshift for the following queue:", this.queue.queueItems ); var result = this.queue.getFirstItemEtaDay(); var daysOffsetLeft = daysOffset; var redshiftQueueWorked = true; @@ -256,6 +259,13 @@ dojo.declare("classes.managers.TimeManager", com.nuclearunicorn.core.TabManager, } if (result[1] & redshiftQueueWorked){ var daysNeeded = result[0];// + 5; //let's have a little bit more days in case steamwork automation messes things up. + if (daysNeeded < 1) { + //There are legitimate cases in which the number of days needed would be less than 1. + //However, if we were to allow daysNeeded to be 0, there'd be risk of an infinite loop, + //so we set the minimum value to 1. + //console.log( "Estimated days needed for queue item", this.queue.queueItems[ 0 ], "is too small; setting to a minimum value." ); + daysNeeded = 1; + } daysNeeded /= (this.game.calendar.daysPerSeason * this.game.calendar.seasonsPerYear); daysNeeded = Math.ceil(daysNeeded); daysNeeded *= (this.game.calendar.daysPerSeason * this.game.calendar.seasonsPerYear); @@ -277,6 +287,7 @@ dojo.declare("classes.managers.TimeManager", com.nuclearunicorn.core.TabManager, } } numberEvents = this.game.calendar.fastForward(daysOffset); + //console.log( "Queue redshift calculations finished. This is the new queue:", this.queue.queueItems ); } else{ numberEvents = this.applyRedshift(daysOffset); @@ -975,19 +986,20 @@ dojo.declare("classes.ui.time.AccelerateTimeBtnController", com.nuclearunicorn.g tooltip: this.game.time.isAccelerated ? $I("time.AccelerateTimeBtn.tooltip.accelerated") : $I("time.AccelerateTimeBtn.tooltip.normal"), cssClass: this.game.time.isAccelerated ? "fugit-on" : "fugit-off", handler: function(btn, callback) { - if (self.game.resPool.get("temporalFlux").value <= 0) { - self.game.time.isAccelerated = false; - self.game.resPool.get("temporalFlux").value = 0; - } else { - self.game.time.isAccelerated = !self.game.time.isAccelerated; - } - callback(true); + self.buyItem(null, null, callback); } }; return model; }, - buyItem: function() { + buyItem: function(model, event, callback) { + if (self.game.resPool.get("temporalFlux").value <= 0) { + self.game.time.isAccelerated = false; + self.game.resPool.get("temporalFlux").value = 0; + } else { + self.game.time.isAccelerated = !self.game.time.isAccelerated; + } + callback({ itemBought: true, reason: "item-is-free" /*It costs flux, but you can still toggle it freely*/ }); } }); @@ -1190,15 +1202,22 @@ dojo.declare("classes.ui.time.ShatterTCBtnController", com.nuclearunicorn.game.u }, buyItem: function(model, event, callback){ - if (model.enabled && this.hasResources(model)) { - var price = this.getPrices(model); - for (var i in price){ - this.game.resPool.addResEvent(price[i].name, -price[i].val); - } - this.doShatter(model, 1); - callback(true); + if (!this.hasResources(model)) { + callback({ itemBought: false, reason: "cannot-afford" }); + return true; + } + if (!model.enabled) { + //As far as I can tell, this shouldn't ever happen because being + //unable to afford it is the only reason for it to be disabled. + callback({ itemBought: false, reason: "not-enabled" }); + return true; + } + var price = this.getPrices(model); + for (var i in price){ + this.game.resPool.addResEvent(price[i].name, -price[i].val); } - callback(false); + this.doShatter(model, 1); + callback({ itemBought: true, reason: "paid-for" }); return true; }, @@ -1366,11 +1385,20 @@ dojo.declare("classes.ui.time.FixCryochamberBtnController", com.nuclearunicorn.g }, buyItem: function(model, event, callback) { - if (!model.enabled) { - callback(false); + if (this.game.time.getVSU("usedCryochambers").val == 0) { + callback({ itemBought: false, reason: "already-bought" }); + return; + } + if (!model.visible) { + callback({ itemBought: false, reason: "not-unlocked" }); return; } + if (!this.hasResources(model)) { + callback({ itemBought: false, reason: "cannot-afford" }); + return; + } + if (!event) { event = {}; /*event is an optional parameter*/ } var fixCount = event.shiftKey ? 1000 : event.ctrlKey || event.metaKey /*osx tears*/ @@ -1386,8 +1414,10 @@ dojo.declare("classes.ui.time.FixCryochamberBtnController", com.nuclearunicorn.g if(fixHappened){ var cry = this.game.time.getVSU("cryochambers"); cry.calculateEffects(cry, this.game); + callback({ itemBought: true, reason: "paid-for" }); + } else { + callback({ itemBought: false, reason: "not-enabled" }); } - callback(fixHappened); }, doFixCryochamber: function(model){ @@ -1408,7 +1438,20 @@ dojo.declare("classes.ui.time.FixCryochamberBtnController", com.nuclearunicorn.g updateVisible: function(model) { model.visible = this.game.workshop.get("chronoforge").researched && this.game.time.getVSU("usedCryochambers").val != 0; - } + }, + + //This is a bit of a hack to get the correct description to appear in the queue tooltips... + getDescription: function(model) { + return $I("time.fixCryochambers.desc"); + }, + + getPrices: function(model) { + if (!model.prices) { + //Initialize model.prices if it hasn't been initialized already. + model.prices = this.game.time.getVSU("usedCryochambers").fixPrices; + } + return model.prices; + } }); dojo.declare("classes.ui.VoidSpaceWgt", [mixin.IChildrenAware, mixin.IGameAware], { @@ -1417,7 +1460,7 @@ dojo.declare("classes.ui.VoidSpaceWgt", [mixin.IChildrenAware, mixin.IGameAware] this.addChild(new com.nuclearunicorn.game.ui.ButtonModern({ name: $I("time.fixCryochambers.label"), description: $I("time.fixCryochambers.desc"), - prices: game.time.getVSU("usedCryochambers").fixPrices, + //The prices field will be set when getPrices is called. /*prices: [ {name: "temporalFlux", val: 3000}, {name: "timeCrystal", val: 100}, @@ -1593,6 +1636,11 @@ dojo.declare("classes.queue.manager", null,{ } var eta = 0; var element = this.queueItems[0]; + if (!element) { + //This is probably a null queue item. Treat it as if it were a valid building that can be built for free. + //Later on when we update the queue, this null item should be removed & we'll go on to the next. + return [0, true]; + } var modelElement = this.getQueueElementModel(element); var prices = modelElement.prices; var engineersConsumed = this.game.workshop.getConsumptionEngineers(); @@ -1600,17 +1648,20 @@ dojo.declare("classes.queue.manager", null,{ var price = prices[ind]; var res = this.game.resPool.get(price.name); if (res.value >= price.val){ + //We already have enough of this resource. continue; } if (res.maxValue < price.val){ + //We don't have enough storage space to ever be able to afford the price. return [eta, false]; } var resPerTick = this.game.getResourcePerTick(res.name, true); - if (!resPerTick) { - return [eta, false]; - } var engineersProduced = this.game.workshop.getEffectEngineer(res.name, true); var deltaPerTick = resPerTick + (engineersConsumed[res.name] || 0)+ engineersProduced; + if (deltaPerTick <= 0) { + //We are losing this resource over time (or not producing any), so we'll never be able to afford the price. + return [eta, false]; + } eta = Math.max(eta, (price.val - res.value) / (deltaPerTick) / this.game.calendar.ticksPerDay ); @@ -1691,6 +1742,14 @@ dojo.declare("classes.queue.manager", null,{ }, + resetState: function() { + this.cap = this.baseCap; + this.alphabeticalSort = true; + this.queueItems = []; + this.queueSources = dojo.clone(this.queueSourcesDefault); + this.queueSourcesArr = [{name: "buildings", label: $I("buildings.tabName")}]; + }, + /** * Get maximum amount if individual (not grouped) items in the queue (see #queueLength) */ @@ -1710,9 +1769,12 @@ dojo.declare("classes.queue.manager", null,{ * */ queueLength: function(){ var length = 0; - for (var i in this.queueItems){ - length += (this.queueItems[i].value || 1); - } + dojo.forEach(this.queueItems, function(item) { + if(item) { + length += item.value || 1; + } + //Else, the item is null or invalid, so don't count it. + }); return length; }, @@ -1727,12 +1789,13 @@ dojo.declare("classes.queue.manager", null,{ } //TODO: too complex logic, can we streamline it somehow? - if(this.queueItems.length > 0 && this.queueItems[this.queueItems.length - 1].name == name){ + var lastItem = this.queueItems[this.queueItems.length - 1]; + if(this.queueItems.length > 0 && lastItem && lastItem.name == name){ if(this.queueNonStackable.includes(type)){ return; } - var valOfItem = (this.queueItems[this.queueItems.length - 1].value || 1) + 1; - this.queueItems[this.queueItems.length - 1].value = valOfItem; + var valOfItem = (lastItem.value || 1) + 1; + lastItem.value = valOfItem; if (shiftKey){ while(this.queueLength() < this.cap){ @@ -1753,7 +1816,7 @@ dojo.declare("classes.queue.manager", null,{ value: 1 //always store size of the queue group, even if it is a single item }); - if (shiftKey && !this.queueNonStabkable.includes(type)){ + if (shiftKey && !this.queueNonStackable.includes(type)){ while(this.queueLength() < this.cap){ this.addToQueue(name, type, label, false); } @@ -1782,6 +1845,44 @@ dojo.declare("classes.queue.manager", null,{ return true; }, + /** + * Pushes item back in the queue based on the queue group number (index) + * @param {*} index + * + * @returns true if element was moved successfully and false otherwise + */ + pushBack: function(index){ + if (index < 0 || index >= this.queueItems.length - 1 ){ + console.warn("queue#remove - invalid index", index); + return false; + } + + var item = this.queueItems[index]; + this.queueItems[index] = this.queueItems[index + 1]; + this.queueItems[index + 1] = item; + + return true; + }, + + /** + * Pushes item to the front in the queue based on the queue group number (index) + * @param {*} index + * + * @returns true if element was moved successfully and false otherwise + */ + pushFront: function(index){ + if (index < 1 || index >= this.queueItems.length){ + console.warn("queue#remove - invalid index", index); + return false; + } + + var item = this.queueItems[index]; + this.queueItems[index] = this.queueItems[index - 1]; + this.queueItems[index - 1] = item; + + return true; + }, + /** * Return a list of sub-options for a building queue * in a form of [{ @@ -1909,10 +2010,14 @@ dojo.declare("classes.queue.manager", null,{ for (var i in voidSpaceUpgrades){ var building = voidSpaceUpgrades[i]; if(building.name == "usedCryochambers"){ - options.push({ - name: building.name, - label: $I("time.fixCryochambers.label") - }); + //ONLY allow queueing of Fix Cryochamber if we have unlocked that feature normally. + if (this.game.workshop.get("chronoforge").researched && building.val != 0) + { + options.push({ + name: building.name, + label: $I("time.fixCryochambers.label") + }); + } continue; } if (building.unlocked){ @@ -2024,7 +2129,13 @@ dojo.declare("classes.queue.manager", null,{ this.dropLastItem(); this.showList(); }, - getQueueElementModel: function(el){ + getQueueElementModel: function(el) { + var controllerAndModel = this.getQueueElementControllerAndModel(el); + if (controllerAndModel) { + return controllerAndModel.model; + } + }, + getQueueElementControllerAndModel: function(el){ var itemMetaRaw = this.game.getUnlockByName(el.name, el.type); if (!itemMetaRaw){ console.error("invalid queue item:", el); @@ -2082,51 +2193,42 @@ dojo.declare("classes.queue.manager", null,{ props.controller = new classes.ui.time.FixCryochamberBtnController(this.game); itemMetaRaw = this.game.getUnlockByName("cryochambers", el.type); model.prices = this.game.time.getVSU("usedCryochambers").fixPrices; - model.enabled = this.game.resPool.hasRes(model.prices); //check we actually have enough to do one fix! - console.log(model); + props.controller.updateVisible(model); + props.controller.updateEnabled(model); } break; case "zigguratUpgrades": props.controller = new com.nuclearunicorn.game.ui.ZigguratBtnController(this.game); - //var oldVal = itemMetaRaw.val; var model = props.controller.fetchModel(props); break; case "religion": props.controller = new com.nuclearunicorn.game.ui.ReligionBtnController(this.game); - //var oldVal = itemMetaRaw.val; var model = props.controller.fetchModel(props); break; case "transcendenceUpgrades": props.controller = new classes.ui.TranscendenceBtnController(this.game); - //var oldVal = itemMetaRaw.val; var model = props.controller.fetchModel(props); break; case "pacts": props.controller = new com.nuclearunicorn.game.ui.PactsBtnController(this.game); - //var oldVal = itemMetaRaw.val; var model = props.controller.fetchModel(props); break; case "upgrades": - //compare = "researched"; props.controller = new com.nuclearunicorn.game.ui.UpgradeButtonController(this.game); - //var oldVal = itemMetaRaw.researched; var model = props.controller.fetchModel(props); break; case "zebraUpgrades": - //compare = "researched"; props.controller = new com.nuclearunicorn.game.ui.ZebraUpgradeButtonController(this.game); - //var oldVal = itemMetaRaw.researched; var model = props.controller.fetchModel(props); break; } - //return props, model; - return model; + return { controller: props.controller, model: model }; }, update: function(){ this.cap = this.calculateCap(); @@ -2134,157 +2236,86 @@ dojo.declare("classes.queue.manager", null,{ return; } var el = this.queueItems[0]; - - var itemMetaRaw = this.game.getUnlockByName(el.name, el.type); - var compare = "val"; //we should do some sort of refractoring of the switch mechanism - - if (!itemMetaRaw){ - console.error("invalid queue item:", el); + if (!el){ + console.warn("null queue item, skipping"); + this.queueItems.shift(); + this.game._publish("ui/update", this.game); return; } - var props = { - id: itemMetaRaw.name - }; - var buyItem = true; - - switch (el.type){ - case "policies": - compare = ["researched", "blocked"]; - props.controller = new classes.ui.PolicyBtnController(this.game); - var oldVal = { - researched: itemMetaRaw.researched, - blocked: itemMetaRaw.blocked - }; - var model = props.controller.fetchModel(props); - break; - - case "tech": - compare = "researched"; - props.controller = new com.nuclearunicorn.game.ui.TechButtonController(this.game); - var oldVal = itemMetaRaw.researched; - var model = props.controller.fetchModel(props); - break; - - case "buildings": - var bld = new classes.BuildingMeta(itemMetaRaw).getMeta(); - oldVal = itemMetaRaw.val; - props = { - key: bld.name, - name: bld.label, - description: bld.description, - building: bld.name - }; - if (typeof(bld.stages) == "object"){ - props.controller = new classes.ui.btn.StagingBldBtnController(this.game); - } else { - props.controller = new classes.ui.btn.BuildingBtnModernController(this.game); - } - var model = props.controller.fetchModel(props); - props.controller.build(model, 1); - buyItem = false; - break; - - case "spaceMission": - compare = "reached"; - props.controller = new com.nuclearunicorn.game.ui.SpaceProgramBtnController(this.game); - var oldVal = itemMetaRaw.researched; - var model = props.controller.fetchModel(props); - break; - - case "spaceBuilding": - props.controller = new classes.ui.space.PlanetBuildingBtnController(this.game); - var oldVal = itemMetaRaw.val; - var model = props.controller.fetchModel(props); - break; - - case "chronoforge": - props.controller = new classes.ui.time.ChronoforgeBtnController(this.game); - var oldVal = itemMetaRaw.val; - var model = props.controller.fetchModel(props); - break; - - case "voidSpace": - props.controller = new classes.ui.time.VoidSpaceBtnController(this.game); - var oldVal = itemMetaRaw.val; - var model = props.controller.fetchModel(props); - if(el.name == "usedCryochambers"){ //a bunch of model black magic - props.controller = new classes.ui.time.FixCryochamberBtnController(this.game); - itemMetaRaw = this.game.getUnlockByName("cryochambers", el.type); - model.prices = this.game.time.getVSU("usedCryochambers").fixPrices; - model.enabled = this.game.resPool.hasRes(model.prices); //check we actually have enough to do one fix! - console.log(model); - } - break; - - case "zigguratUpgrades": - props.controller = new com.nuclearunicorn.game.ui.ZigguratBtnController(this.game); - var oldVal = itemMetaRaw.val; - var model = props.controller.fetchModel(props); - break; - - case "religion": - props.controller = new com.nuclearunicorn.game.ui.ReligionBtnController(this.game); - var oldVal = itemMetaRaw.val; - var model = props.controller.fetchModel(props); - break; - - case "transcendenceUpgrades": - props.controller = new classes.ui.TranscendenceBtnController(this.game); - var oldVal = itemMetaRaw.val; - var model = props.controller.fetchModel(props); - break; - - case "pacts": - props.controller = new com.nuclearunicorn.game.ui.PactsBtnController(this.game); - var oldVal = itemMetaRaw.val; - var model = props.controller.fetchModel(props); - break; - - case "upgrades": - compare = "researched"; - props.controller = new com.nuclearunicorn.game.ui.UpgradeButtonController(this.game); - var oldVal = itemMetaRaw.researched; - var model = props.controller.fetchModel(props); - break; - - case "zebraUpgrades": - compare = "researched"; - props.controller = new com.nuclearunicorn.game.ui.ZebraUpgradeButtonController(this.game); - var oldVal = itemMetaRaw.researched; - var model = props.controller.fetchModel(props); - break; - } - - if(!props.controller){ + var controllerAndModel = this.getQueueElementControllerAndModel(el); + if(!controllerAndModel || !controllerAndModel.controller || !controllerAndModel.model){ console.error(el.name + " of " + el.type + " queing is not supported!"); - var deletedElement = this.queueItems.shift(); + this.queueItems.shift(); this.game._publish("ui/update", this.game); + return; } - if(buyItem){ - props.controller.buyItem(model, 1, function(result) {}); - } - var changed = false; - if (Array.isArray(compare)){ - for (var i in compare){ - if (oldVal[compare[i]] != model.metadata[compare[i]]){ - changed = true; - } - } - }else{ - changed = oldVal != model.metadata[compare]; + + var resultOfBuyingItem = null; + controllerAndModel.controller.buyItem(controllerAndModel.model, null, function(args) { resultOfBuyingItem = args; }); + + if (typeof(resultOfBuyingItem) !== "object" || !resultOfBuyingItem) { + console.error("Invalid result after attempting to buy item via queue", resultOfBuyingItem); + return; } - if(changed){ + + var reason = resultOfBuyingItem.reason; //String explaining *why* we failed to buy the item + + //Depending on the result, do something different: + if (resultOfBuyingItem.itemBought){ + //Item successfully purchased! Remove it from the queue because we did it :D this.dropLastItem(); this.game._publish("ui/update", this.game); + //console.log("Successfully built " + el.name + " using the queue because " + reason); + } else { + if (this._isReasonToSkipItem(reason)) { + this.dropLastItem(); + this.game._publish("ui/update", this.game); + //console.log("Dropped " + el.name + " from the queue because " + reason); + } else { + //console.log("Tried to build " + el.name + " using the queue, but failed because " + reason); + } } + }, - if(compare == "research" || compare == "reached" && model.metadata[compare] == true - || (compare.includes("blocked") && model.metadata["blocked"] == true) || - (compare.includes("research") && model.metadata["research"] == true) - ){ - this.dropLastItem(); - this.game._publish("ui/update", this.game); + //Determines whether or not we should silently remove an item from the queue + //based on the reason WHY we can't buy it. + //@param reason String containing a code passed to the callback function + //@return Boolean. If true, the item should be removed from the queue. + // If false, the queue should wait until we are able to purchase the item. + _isReasonToSkipItem: function(reason) { + if (reason == "paid-for" || reason == "item-is-free" || reason == "dev-mode") { + //These are used as reasons why we DID purchase the item. + //If we DID purchase the item, of course we want it removed from the queue! + return true; + } + if (reason == "already-bought" || reason == "blocked" || reason == "player-denied") { + //These are good reasons the queue should skip over the item entirely. + return true; } + //Else, most likely we just can't afford the item yet. + return false; + }, + + //This function is to be called whenever a building is deltagraded. + //This function iterates through all queue items with the same internal ID as the + //deltagraded building & updates their labels to match the new version. + //@param itemName String. The ID of whichever building was deltagraded. + onDeltagrade: function(itemName) { + var buildingsManager = this.game.bld; + dojo.forEach(this.queueItems, function(item) { + if(!item || item.name !== itemName) { + return; + } + //Else, we have here a valid queue item matching the name of what was deltagraded. + if(item.type === "buildings") { + var building = buildingsManager.getBuildingExt(itemName).meta; + var newLabel = building.label; + if(building.stages){ + newLabel = building.stages[building.stage].label; + } + item.label = newLabel; + } + }); } }); \ No newline at end of file diff --git a/js/workshop.js b/js/workshop.js index 2ff298ae8d..9f8d04539e 100644 --- a/js/workshop.js +++ b/js/workshop.js @@ -2908,8 +2908,12 @@ dojo.declare("com.nuclearunicorn.game.ui.CraftButtonController", com.nuclearunic }, buyItem: function(model, event, callback) { - this.game.workshop.craft(model.craft.name, 1); - callback(true); + var wasCraftSuccessful = this.game.workshop.craft(model.craft.name, 1); + if (wasCraftSuccessful) { + callback({ itemBought: true, reason: "paid-for" }); + } else { + callback({ itemBought: false, reason: "cannot-afford" }); + } } }); diff --git a/res/i18n/crowdin/be.json b/res/i18n/crowdin/be.json index 085d71dd49..a35bb1502f 100644 --- a/res/i18n/crowdin/be.json +++ b/res/i18n/crowdin/be.json @@ -209,7 +209,6 @@ "buildings.workshop.desc": "Забяспечвае шырокі выбар мадэрнізацый. Паляпшае эфектыўнасць стварэння на 6%", "buildings.workshop.flavor": "Бясплатныя цацкі для рабочых", "buildings.zebraForge.label": "Кузня Зебр", - "buildings.zebraForge.desc": "Адкрывае стварэнне крывавых камянёў і т-міфрылу", "buildings.zebraOutpost.label": "Застава Зебр", "buildings.zebraOutpost.desc": "Забяспечвае базу для паляўнічых экспедыцый. Кожны ўзровень абнаўлення павышае эфектыўнасць экспедыцыі на 5%", "buildings.zebraWorkshop.label": "Майстэрня Зебр", @@ -258,6 +257,8 @@ "calendar.year.tooltip": "Год:", "challendge.panel.label": "Выклікі", "challendge.pending": "Чакае", + "challendge.reclaimReserves.label": "Адваяваць рэсурсы", + "challendge.reclaimReserves.desc": "Вярніце рэсурсы з-за грані светаў", "challendge.applyPending.label": "Прымяніць чаканыя змены ({0})", "challendge.applyPending.desc": "Неадкладна ўключыць выклікі/ўмовы, пазначаныя як чакаючыя", "challendge.1000Years.label": "1000 гадоў", @@ -279,12 +280,9 @@ "challendge.ironWill.label": "Жалезная Воля", "challendge.ironWill.desc": "Жалезная воля - гэта трохі схаваны выклік, і вам не трэба націскаць тут, каб уключыць яго: скіньце гульню і гуляйце без кацянят.", "challendge.ironWill.effect.desc": "Нічога", - "challendge.reclaimReserves.label": "Адваяваць рэсурсы", - "challendge.reclaimReserves.desc": "Вярніце рэсурсы з-за грані светаў", "challendge.winterIsComing.label": "Зіма прыйшла", "challendge.winterIsComing.desc": "Перазапусціце гульню толькі з зімовымі сезонамі. (Каціная мята не выйграе ад бонуса вытворчасці парагона)

Мэта: дабрацца да Геліяса", "challendge.winterIsComing.effect.desc": "Цёплы сезон больш верагодны, а халодны - менш.", - "challendge.btn.chronosphere.desc": " Вы не атрымаеце бонус скіду ад хранасфер.", "challendge.btn.chronosphere.with.ironWill.desc": " Вы не атрымаеце бонус скіду ад хранасфер.
УВАГА: бонус скіду ад хранасфер аўтаматычна адключае ЖВ.", "challendge.btn.confirmation.title": "Пацвярджэнне выкліку", "challendge.btn.confirmation.msg": "Вы ўпэўнены, што хочаце пачаць гэты выклiк, перазагрузіўшы гульню?", @@ -367,8 +365,8 @@ "effectsMgr.statics.factoryCostReduction.title": "Зніжэнне кошту фабрыкi", "effectsMgr.statics.factoryRefineRatio.title": "Бонус завадской дапрацоўкі", "effectsMgr.statics.faithRatioReligion.title": "Бонус веры", - "effectsMgr.statics.festivalRatio.title": "Фестывальныя эфекты", "effectsMgr.statics.festivalArrivalRatio.title": "Тэмп росту фестывалю", + "effectsMgr.statics.festivalRatio.title": "Фестывальныя эфекты", "effectsMgr.statics.gflopsConsumption.title": "Пераўтварэнне GFlops", "effectsMgr.statics.globalRelationsBonus.title": "Бонус за адносіны", "effectsMgr.statics.globalResourceRatio.title": "Максiмальны бонус рэсурсаў", @@ -398,7 +396,6 @@ "effectsMgr.statics.logHouseCostReduction.title": "Зніжэнне кошту зруба", "effectsMgr.statics.lumberMillRatio.title": "Бонус Лесазаводу", "effectsMgr.statics.lunarOutpostRatio.title": "Бонус Месяцовай заставы", - "effectsMgr.statics.luxuryConsuptionReduction.title": "Скарачэнне спажывання раскошы", "effectsMgr.statics.luxuryHappinessBonus.title": "Раскошны бонус шчасця", "effectsMgr.statics.magnetoBoostRatio.title": "Магнітнае ўзмацненне", "effectsMgr.statics.magnetoRatio.title": "Вытворчы бонус", @@ -475,9 +472,9 @@ "effectsMgr.statics.terraformingMaxKittens.title": "Бонус кацянят з Тэрафарміруючай станцыi", "effectsMgr.statics.theocracyFaithProductionBonus.title": "Бонус вытворчасці веры", "effectsMgr.statics.timeImpedance.title": "Часовая адтэрміноўка штрафу", + "effectsMgr.statics.timeRatio.title": "Бонус, звязаны з часам", "effectsMgr.statics.tradeCatpowerDiscount.title": "Гандлёвая скідка кацiнай сілы", "effectsMgr.statics.tradeGoldDiscount.title": "Гандлёвая скідка на золата", - "effectsMgr.statics.timeRatio.title": "Бонус, звязаны з часам", "effectsMgr.statics.tradeRatio.title": "Каэфіцыент гандлю", "effectsMgr.statics.umbraBoostRatio.title": "Бонус Камбайну (Радыяцыя Хокінга)", "effectsMgr.statics.unhappinessRatio.title": "Зніжэнне няшчасця", @@ -639,7 +636,6 @@ "policy.liberalism.label": "Лібералізм", "policy.liberalism.desc": "Мірнае і адкрытае грамадства. Наладжвае лепшыя адносіны з усімі гандлёвымі партнёрамі і прымушае будынкі патрабаваць менш золата.", "policy.liberty.label": "Свабода", - "policy.liberty.desc": "Добра для вялікіх, экспансіўных грамадстваў. Удвая памяншае штрафы насельніцтва. Гэта паўплывае на тое, якія палітыкі будуць даступныя ў будучыні!", "policy.militarizeSpace.label": "Мілітарызаваць космас", "policy.militarizeSpace.desc": "Паспрабуй захапіць неба. Твае навуковыя спадарожнікі да абсерваторый на 10% больш магутныя.", "policy.monarchy.label": "Манархія", @@ -653,7 +649,6 @@ "policy.outerSpaceTreaty.label": "Дагавор па касмічнай прасторы", "policy.outerSpaceTreaty.desc": "Пагадзіся, што космас - гэта вобласць усіх рас Кацiнай планеты, паляпшаючы адносіны з усімі гандлёвымі партнёрамі.", "policy.radicalXenophobia.label": "Радыкальная ксенафобія", - "policy.radicalXenophobia.desc": "Адмоўся ад злых іншапланецян і злых робатаў. Святы Генацыд удвая больш эфектыўны.", "policy.rationality.label": "Рацыянальнасць", "policy.rationality.desc": "Прымі пункт гледжання, што свет можна фундаментальна зразумець. Атрымай невялікі бонус да навукі і вытворчасці жалеза, хоць пазней ты можаш здавацца дурным.", "policy.republic.label": "Рэспубліка", @@ -663,7 +658,6 @@ "policy.spaceBasedTerraforming.label": "Касмічнае тэрафармаванне", "policy.spaceBasedTerraforming.desc": "Размясці гіганцкія люстэркі ў небе, падвысіўшы паслядоўнасць сонечных ферм. Адкрывае касмічныя люстэркі.", "policy.stoicism.label": "Стаіцызм", - "policy.stoicism.desc": "Стоікі вучаць, што мы павінны цярпець цяжкасці без нараканняў. Удвая скараціць спажыванне раскошных рэсурсаў.", "policy.stripMining.label": "Палосная здабыча", "policy.stripMining.desc": "Зраўняй з зямлёй пагоркі, імкнучыся палепшыць здабычу карысных выкапняў.", "policy.sustainability.label": "Устойлівасць", @@ -673,7 +667,6 @@ "policy.theocracy.label": "Ордэн Зорак", "policy.theocracy.desc": "Твае касманаўты бачылі жудасныя рэчы ў далёкім небе. Няхай святары возьмуць на сябе кантроль, павялічваючы вытворчасць веры.", "policy.tradition.label": "Традыцыя", - "policy.tradition.desc": "Добра для невялікіх культурна-арыентаваных таварыстваў. Зніжае кошт рукапісаў і павялічвае іх эфект. Гэта паўплывае на тое, якія палітыкі будуць даступныя ў будучыні!", "policy.transkittenism.label": "Транскацянiзм", "policy.transkittenism.desc": "Адмоўся ад кацiнай сутнасці і злійцеся з ШІ. Ядра штучнага інтэлекту стануць удвая больш эфектыўнымі, і няма ніякіх недахопаў на ўзроўні штучнага інтэлекту.", "policy.zebraRelationsAppeasement.label": "Адносiны з зебрамi: замірэнне", @@ -807,7 +800,6 @@ "religion.sacrificeBtn.desc": "Вярніце аднарогаў у вымярэнне аднарога. Вы атрымаеце адну Слязу аднарога за кожны зікурат, які ў вас ёсць.", "religion.sacrificeBtn.sacrifice.msg": "{0} аднарогаў былі прынесены ў ахвяру. У вас {1} слёзы аднарога!", "religion.transcend.confirmation.title": "Перасягнуць мяжу вядомага свету? ", - "religion.transcend.confirmation.msg": "Ты ўпэўнены, што хочаш адкінуць частку свайго Багаяўлення?\n\nТы можаш дасягнуць асаблівых узроўняў трансцэндэнтнасці, ахвяруючы часткай свайго Багаяўлення.\n\nКожны ўзровень павысіць эфектыўнасць пераўтварэння культу (Захапіцца зоркамі).\n\nКожны ўзровень патрабуе прапарцыянальна большай колькасці ахвяраванняў.\n\nГэты бонус будзе складацца і пераносіцца праз скіды.\n\nКЛIК НА ГЭТУЮ КНОПКУ СЦЯРЭ ЧАСТКУ ТВАЙГО БАГАЯЎЛЕННЯ І ПАМЕНЬШЫЦЬ ЭФЕКТЫЎНАСЦЬ ЎСХВАЛЕННЯ.", "religion.transcend.msg.failure": "На крок бліжэй: {0}%", "religion.transcend.msg.success": "Вы перасягнулі межы тленнага. Узровень Т: {0}", "religion.transcendBtn.label": "Перасягнуць мяжу вядомага свету", @@ -817,7 +809,6 @@ "religion.tu.blackCore.flavor": "Пабудаваны з костак кацiных ахвяр.", "religion.tu.blackLibrary.label": "Чорная бібліятэка", "religion.tu.blackLibrary.desc": "Кожная чорная бібліятэка паляпшае маштабаванне Codex Leviathanianus на 2%. Гэта значэнне яшчэ больш паляпшаецца дзякуючы могілкам аднарогаў.", - "religion.tu.blackLibary.flavor": "Можа, тут спецыяльна цёмна настолькі, каб было немагчыма чытаць.", "religion.tu.blackNexus.label": "Чорны нексус", "religion.tu.blackNexus.desc": "Паляпшае хуткасць перапрацоўкі крышталяў часу ў рэліквіі.
Кожны Чорны нексус павялічыць тваю эфектыўнасць Рэліктавай ачысткi на колькасць Чорных пiрамiд.
Гэты эфект таксама павышае эфектыўнасць Рэліктавых станцый", "religion.tu.blackNexus.flavor": "Вока ў небе.", @@ -834,7 +825,6 @@ "religion.tu.darkNova.desc": "Паляпшае сусветную вытворчасць энергіі на 2%", "religion.tu.darkNova.flavor": "Зоркі памерлі. Як нашы надзеі і мары.", "religion.tu.holyGenocide.label": "Святы генацыд", - "religion.tu.holyGenocide.desc": "І сляза не ўпадзе", "religion.tu.holyGenocide.flavor": "Мы жывём на ціхім востраве няведання пасярод чорных мораў бясконцасці, і не было задумана, што мы павінны плыць далёка.", "religion.tu.singularity.label": "Гарызонт падзей", "religion.tu.singularity.desc": "Палепшыць глабальныя ліміты рэсурсаў на 10%", @@ -987,12 +977,9 @@ "resources.zebras.title": "зебры", "resources.sorrow.full": "Чорны вадкi смутак", "resources.sorrow.short": "ЧВС", - "gift.get": "XOXOXO! Старэйшыя табе даслалі вам падарункавую скрынку!", - "gift.repaire": "Старэйшыя багі адрамантавалі тваю падарункавую скрынку", "gift.resources": "Атрымана {0} {1}!", "gift.apocrypha": "Бонус Апокрыфы павялічыўся на {0}%!", "gift.transcendence": "Узровень Трансцэндэнтнасцi павялічаны на 4!", - "gift.metaphysics": "Разблакавана {0}!", "save.export.msg": "Экспарт захаваны!", "save.import.confirmation.msg": "Ты ўпэўнены? Гэта перазапіша твае захаванне!", "save.import.msg": "Імпарт захаваны!", @@ -1325,7 +1312,6 @@ "time.cfu.ressourceRetrieval.label": "Пошук рэсурсаў", "time.cfu.ressourceRetrieval.desc": "Атрымлівай частку сваіх гадавых рэсурсаў, спальваючы КЧ", "time.cfu.temporalAccelerator.label": "Часовы паскаральнік", - "time.cfu.temporalAccelerator.desc": "Паляпшае выпрацоўку энергіі патоку на 5%", "time.cfu.temporalBattery.label": "Часовая батарэя", "time.cfu.temporalBattery.desc": "Паляпшае тваю энергетычную ёмістасць патоку на 25%", "time.cfu.temporalImpedance.label": "Імпеданс часу", @@ -1419,8 +1405,6 @@ "trade.bcoin.crash": "Раздражняй Нябачную чорную руку", "trade.bcoin.crash.desc": "Утвары крах рынку блэккойнаў", "trade.correct.bcoin": "Адбылася велізарная карэкцыя крыптарынку", - "trade.embassy.open": "Адкрытая амбасада", - "trade.embassy": "Узровень амбасады ({0})", "trade.embassy.desc": "Палепшы свае дыпламатычныя адносіны, адкрыўшы амбасаду", "trade.embassy.pinned": "Прышпiленае", "trade.embassy.unpinned": "Адшпiленае", @@ -1476,7 +1460,6 @@ "ui.option.hide.bgimage": "Схаваць фонавы малюнак (для каляровых схем, дзе гэта магчыма)", "ui.option.tooltips.right": "Перамясціць падказкі ў правы слупок", "ui.option.more": "Больш..", - "ui.option.no.confirm": "Не пацвярджаць пры ачыстцы ўсіх заданняў, вывучэнні палітыкі або пры куплі або продажы ўсяго (пстрыкніце, утрымліваючы Shift)", "ui.option.iw.smelter": "У рэжыме Жалезнай Волi заводы адключаюцца пры 95% макс", "ui.option.disable.telemetry": "Адключыць гульнявую тэлеметрыю", "ui.option.enable.redshift": "Уключыць пазасеткавы прагрэс", @@ -1521,7 +1504,6 @@ "console.filter.ivoryMeteor": "Метэоры са слановай косці", "console.filter.unicornRift": "Разломы Аднарогаў", "console.filter.alicornRift": "Разломы Алiкорнаў", - "console.filter.tc": "Крышталi часу", "console.filter.faith": "Вера", "village.bonus.desc.chemist": "Бонус за хімічныя вырабы", "village.bonus.desc.engineer": "Бонус стварэння", @@ -1758,7 +1740,6 @@ "workshop.barges.label": "Баржы", "workshop.barges.desc": "Гавані захоўваюць больш вугалю", "workshop.biofuel.label": "Апрацоўка Біяпаліва", - "workshop.biofuel.desc": "Бiялабараторыя будзе ператвараць каціную мяту ў нафту", "workshop.bolas.label": "Болас", "workshop.bolas.desc": "Кідальная зброя з цяжкіх каменных гір. Твае паляўнічыя ўдвая больш эфектыўныя", "workshop.bolas.flavor": "Узброеная пража", @@ -1990,7 +1971,6 @@ "workshop.spaceEngineers.label": "Касмічныя інжынеры", "workshop.spaceEngineers.desc": "Паляпшае эфектыўнасць інжынера", "workshop.spaceManufacturing.label": "Касмічная вытворчасць", - "workshop.spaceManufacturing.desc": "Заводы прадастаўляюць бонусы да касмічных ліфтаў і арбітальных сістэм", "workshop.starlink.label": "Старлінк", "workshop.starlink.desc": "Кожны цэнтр апрацоўкі дадзеных дасць дадатковы 1% бонус Бiялабараторыi", "workshop.stasisChambers.label": "Стазісныя камеры", diff --git a/res/i18n/crowdin/br.json b/res/i18n/crowdin/br.json index ec6dd2beed..7530c01021 100644 --- a/res/i18n/crowdin/br.json +++ b/res/i18n/crowdin/br.json @@ -209,7 +209,6 @@ "buildings.workshop.desc": "Permite desenvolver diversas melhorias. Aumenta a efetividade de fabricação em 6%.", "buildings.workshop.flavor": "Brinquedos de graça para trabalhadores", "buildings.zebraForge.label": "Forja das Zebras", - "buildings.zebraForge.desc": "Desbloqueia a fabricação de pedras de sangue e t-mitril", "buildings.zebraOutpost.label": "Entreposto de zebras", "buildings.zebraOutpost.desc": "Fornece uma base para as expedições de caça. Cada nível de melhoria melhora a eficácia da expedição em 5%", "buildings.zebraWorkshop.label": "Oficina de Zebras", @@ -258,6 +257,8 @@ "calendar.year.tooltip": "Ano:", "challendge.panel.label": "Desafios", "challendge.pending": "Pendente", + "challendge.reclaimReserves.label": "Recuperar reservas", + "challendge.reclaimReserves.desc": "Recuperar recursos do além", "challendge.applyPending.label": "Aplicar mudanças pendentes ({0})", "challendge.applyPending.desc": "Ativar Desafios/Condições marcadas como Pendentes imediatamente", "challendge.1000Years.label": "1000 anos", @@ -279,12 +280,9 @@ "challendge.ironWill.label": "Vontade de Ferro", "challendge.ironWill.desc": "Iron Will é um desafio escondido e você não precisa clicar aqui para habilitá-lo: recomece o jogo e jogue sem gatos.", "challendge.ironWill.effect.desc": "Nada", - "challendge.reclaimReserves.label": "Recuperar reservas", - "challendge.reclaimReserves.desc": "Recuperar recursos do além", "challendge.winterIsComing.label": "O inverno chegou", "challendge.winterIsComing.desc": "Recomeçar o jogo com a estação sempre sendo inverno.

Meta: Chegar a Helios.", "challendge.winterIsComing.effect.desc": "O clima é melhor no geral.", - "challendge.btn.chronosphere.desc": "Você não ganhará o bônus de recomeço das cronosferas", "challendge.btn.chronosphere.with.ironWill.desc": "Você não ganhará o bônus de recomeço das cronosferas.
ATENÇÃO: o bônus de cronosferas irá encerrar o modo Iron Will automaticamente.", "challendge.btn.confirmation.title": "Confirmação de Desafio", "challendge.btn.confirmation.msg": "Tem certeza que quer começar esse desafio recomeçando seu jogo?", @@ -367,8 +365,8 @@ "effectsMgr.statics.factoryCostReduction.title": "Redução de custo de fábrica", "effectsMgr.statics.factoryRefineRatio.title": "Bônus de refinamento da Fábrica", "effectsMgr.statics.faithRatioReligion.title": "Bônus de fé", - "effectsMgr.statics.festivalRatio.title": "Efeitos do Festival", "effectsMgr.statics.festivalArrivalRatio.title": "Taxa de crescimento do festival", + "effectsMgr.statics.festivalRatio.title": "Efeitos do Festival", "effectsMgr.statics.gflopsConsumption.title": "Consumo de GFlops", "effectsMgr.statics.globalRelationsBonus.title": "Bônus de relações", "effectsMgr.statics.globalResourceRatio.title": "Bônus de recursos máximo", @@ -398,7 +396,6 @@ "effectsMgr.statics.logHouseCostReduction.title": "Redução de custo de casa de madeira", "effectsMgr.statics.lumberMillRatio.title": "Bônus de Serraria", "effectsMgr.statics.lunarOutpostRatio.title": "Bônus de entreposto lunar", - "effectsMgr.statics.luxuryConsuptionReduction.title": "Redução de consumo de luxos", "effectsMgr.statics.luxuryHappinessBonus.title": "Bônus de felicidade por luxo", "effectsMgr.statics.magnetoBoostRatio.title": "Impulso magnético", "effectsMgr.statics.magnetoRatio.title": "Bônus de produção", @@ -471,9 +468,9 @@ "effectsMgr.statics.terraformingMaxKittens.title": "Bônus de gatinhos da Estação de Terraplenagem", "effectsMgr.statics.theocracyFaithProductionBonus.title": "Bônus de produção de fé", "effectsMgr.statics.timeImpedance.title": "Atraso da penalidade temporal", + "effectsMgr.statics.timeRatio.title": "Bônus de Fluxo Temporal", "effectsMgr.statics.tradeCatpowerDiscount.title": "Desconto de poder dos gatos para o comércio", "effectsMgr.statics.tradeGoldDiscount.title": "Desconto de ouro em trocas", - "effectsMgr.statics.timeRatio.title": "Bônus de Fluxo Temporal", "effectsMgr.statics.tradeRatio.title": "Proporção de Troca", "effectsMgr.statics.umbraBoostRatio.title": "Bônus de Colheitadeira HR", "effectsMgr.statics.unhappinessRatio.title": "Redução de infelicidade", @@ -631,7 +628,6 @@ "policy.liberalism.label": "Liberalismo", "policy.liberalism.desc": "Uma sociedade pacífica e aberta. Melhora as relações com todos os parceiros comerciais e faz com que os construções exijam menos ouro para serem erguidas.", "policy.liberty.label": "Liberdade", - "policy.liberty.desc": "Bom para sociedades grandes. Corta pela metade as penalidades de grandes populações. Isso afetará quais políticas estão disponíveis no futuro!", "policy.militarizeSpace.label": "Militarizar o espaço", "policy.militarizeSpace.desc": "Tentar tomar controle do céu. Seu bônus científico dos satélites para os observatórios ficará 10% mais forte.", "policy.monarchy.label": "Monarquia", @@ -644,7 +640,6 @@ "policy.outerSpaceTreaty.label": "Tratado do espaço externo", "policy.outerSpaceTreaty.desc": "Concorde que o espaço é do domínio de todas as raças do planeta, melhorando relações com todos os parceiros comerciais.", "policy.radicalXenophobia.label": "Xenofobia Radical", - "policy.radicalXenophobia.desc": "Rejeite os alienígenas do mal e os robôs do mal. Genocídio sagrado é duas vezes mais eficaz.", "policy.rationality.label": "Racionalidade", "policy.rationality.desc": "Aceitar a ideia de que o mundo pode ser fundamentalmente compreendido. Ganhe um pequeno bônus de ciência e produção de ferro, embora você possa parecer bobo mais tarde.", "policy.republic.label": "República", @@ -654,7 +649,6 @@ "policy.spaceBasedTerraforming.label": "Terraformação espacial", "policy.spaceBasedTerraforming.desc": "Coloque espelhos gigantes no céu, impulsionando a consistência de fazendas solares. Desbloqueia Espelhos Espaciais.", "policy.stoicism.label": "Estoicismo", - "policy.stoicism.desc": "A visão estoica ensina que deveríamos passar por dificuldades sem reclamar. Acaba cortando pela metade o consumo de recursos de luxo.", "policy.stripMining.label": "Minração a céu-aberto", "policy.stripMining.desc": "Destrua as colinas para melhorar sua produção mineral.", "policy.sustainability.label": "Sustentabilidade", @@ -664,7 +658,6 @@ "policy.theocracy.label": "Ordem das Estrelas", "policy.theocracy.desc": "Seus astronautas viram coisas horríveis nos céus distantes. Deixe os padres assumir o controle, aumentando a produção religiosa.", "policy.tradition.label": "Tradição", - "policy.tradition.desc": "Bom para as pequenas sociedades orientadas para a cultura. Reduz o preço do manuscrito e aumenta seu efeito. Isso afetará quais políticas estão disponíveis no futuro!", "policy.transkittenism.label": "Transfilhotismo", "policy.transkittenism.desc": "Desista de ser um gato e se junte com a IA. Núcleos de IA serão duas vezes mais potentes e não terá lado negativo para o nível de IA.", "policy.zebraRelationsAppeasement.label": "Relações com as zebras: Apaziguamento", @@ -780,7 +773,6 @@ "religion.sacrificeBtn.desc": "Devolve os unicórnios à Dimensão dos Unicórnios. Você recebe uma Lágrima de Unicórnio para cada Zigurate que tiver.", "religion.sacrificeBtn.sacrifice.msg": "{0} unicórnios foram sacrificados. Ganhou {1} lágrima(s)!", "religion.transcend.confirmation.title": "Transcender?", - "religion.transcend.confirmation.msg": "Tem certeza que quer descartar seu bônus de louvor?\n\nVocê pode alcançar um nível especial de transcendência ao sacrificar seu bônus se louvor.\n\nCada nível requer proporcionalmente mais bônus de fé para ser sacrificado.\n\nEste bônus se acumula e continua ativo entre recomeços.\n\nCLICAR NESTE BOTÃO APAGARÁ UMA PARTE DO BÔNUS DE FÉ EM LOUVOR.", "religion.transcend.msg.failure": "Chegando perto: {0}%", "religion.transcend.msg.success": "Você transcende os limites mortais. Nível-T: {0}", "religion.transcendBtn.label": "Transcender", @@ -789,7 +781,6 @@ "religion.tu.blackCore.desc": "Modifica e corrompe as leis da realidade num escala mínima.
Cada nível do Núcleo Negro aumenta o limite de BLS em 1%.", "religion.tu.blackCore.flavor": "Construído com os ossos de gatos sacrificados.", "religion.tu.blackLibrary.label": "Biblioteca Negra", - "religion.tu.blackLibary.flavor": "Parece que está escuro demais para ler de propósito.", "religion.tu.blackNexus.label": "Nexo Negro", "religion.tu.blackNexus.desc": "Aumenta o ritmo em que cristais do tempo se refinam em relíquias.
Cada Nexo Negro aumenta a eficiência de Refinamento de Relíquias para cada Pirâmide Negra.
Também melhora a eficiência das Estações de Relíquias", "religion.tu.blackNexus.flavor": "De olho no céu.", @@ -803,7 +794,6 @@ "religion.tu.darkNova.desc": "Aumenta a produção de energia global em 2%", "religion.tu.darkNova.flavor": "As estrelas estão mortas. Assim como nossos sonhos e esperanças.", "religion.tu.holyGenocide.label": "Santo Genocídio", - "religion.tu.holyGenocide.desc": "E a lágrima não cairá.", "religion.tu.holyGenocide.flavor": " Vivemos numa plácida ilha de ignorância em meio a negros mares de infinito, e não está escrito pela Providência que devemos viajar longe.", "religion.tu.singularity.label": "Horizonte de Evento", "religion.tu.singularity.desc": "Aumenta o limite de recursos globais em 10%", @@ -950,11 +940,8 @@ "resources.epiphany.title": "epifania", "resources.wrappingPaper.title": "papel de embrulho", "resources.zebras.title": "zebras", - "gift.get": "Beijos e abraços! Os Deuses anciões te mandaram um presente!", - "gift.repaire": "Os deuses anciões consertaram sua caixa de presente", "gift.resources": "Obteve {0} {1}!", "gift.transcendence": "Nível de Transcendência aumentou em 4!", - "gift.metaphysics": "Desbloqueado {0}!", "save.export.msg": "Exportação completa!", "save.import.confirmation.msg": "Tem certeza? Isso vai apagar seu jogo atual!", "save.import.msg": "Importação completa!", @@ -1274,7 +1261,6 @@ "time.cfu.ressourceRetrieval.label": "Recuperação de Recursos", "time.cfu.ressourceRetrieval.desc": "Recupera parte de seus recursos anuais quando queima Cristais de Tempo", "time.cfu.temporalAccelerator.label": "Acelerador Temporal", - "time.cfu.temporalAccelerator.desc": "Aumenta a geração de energia de fluxo em 5%", "time.cfu.temporalBattery.label": "Bateria Temporal", "time.cfu.temporalBattery.desc": "Aumenta sua capacidade de energia de fluxo em 25%", "time.cfu.temporalImpedance.label": "Impedância Temporal", @@ -1354,8 +1340,6 @@ "trade.bcoin.sell.msg": "Você ganhou {0} relíquias", "trade.bcoin.crash": "Encha o saco da mão negra invisível", "trade.bcoin.crash.desc": "Force que o mercado de moedas negras caia", - "trade.embassy.open": "Abrir Embaixada", - "trade.embassy": "Nível da embaixada ({0})", "trade.embassy.desc": "Melhore seus relacionamentos diplomáticos estabelecendo uma embaixada", "trade.embassy.pinned": "Fixado", "trade.embassy.unpinned": "Desafixado", @@ -1399,7 +1383,6 @@ "ui.option.hide.sell": "Esconder botões 'vender'", "ui.option.hide.bgimage": "Ocultar imagem de fundo (para esquemas de cor quando aplicável)", "ui.option.more": "Mais...", - "ui.option.no.confirm": "Não confirmar quando for tirar todos os trabalhos, quando pesquisar políticas ou quando for comprar ou vender tudo (Shift+clique)", "ui.option.iw.smelter": "Fornalhas desligam em 95% ferro máximo no modo Vontade de Ferro", "ui.option.disable.telemetry": "Desativar telemetria do jogo", "ui.option.enable.redshift": "Habilitar progressão offline", @@ -1440,7 +1423,6 @@ "console.filter.ivoryMeteor": "Meteoros de marfim", "console.filter.unicornRift": "Fendas de unicórnios", "console.filter.alicornRift": "Fendas de alicórnios", - "console.filter.tc": "Cristais Temporais", "console.filter.faith": "Fé", "village.bonus.desc.chemist": "Bônus de fabricação química", "village.bonus.desc.engineer": "Bônus de fabricação", @@ -1627,7 +1609,6 @@ "workshop.barges.label": "Barcas", "workshop.barges.desc": "Portos armazenam mais carvão", "workshop.biofuel.label": "Processamento de Biocombustível", - "workshop.biofuel.desc": "`Bio Laboratórios convertem erva de gato em óleo", "workshop.bolas.label": "Boleadeira", "workshop.bolas.desc": "Arma de atirar feita com pesos de pedra. Seus caçadores são duas vezes mais eficazes", "workshop.bolas.flavor": "Lã Armada", @@ -1851,7 +1832,6 @@ "workshop.spaceEngineers.label": "Engenheiros Espaciais", "workshop.spaceEngineers.desc": "Aumenta a eficiência dos engenheiros", "workshop.spaceManufacturing.label": "Produção Espacial", - "workshop.spaceManufacturing.desc": "Fábricas proporcionam um bônus aos Elevadores Espaciais e Matrizes Orbitais", "workshop.starlink.label": "Rede Estelar", "workshop.stasisChambers.label": "Câmaras de Estasis", "workshop.stasisChambers.desc": "Fendas de Energia são duas vezes mais eficientes", diff --git a/res/i18n/crowdin/cz.json b/res/i18n/crowdin/cz.json index b368b672fa..3cebb93ff7 100644 --- a/res/i18n/crowdin/cz.json +++ b/res/i18n/crowdin/cz.json @@ -209,7 +209,6 @@ "buildings.workshop.desc": "Poskytuje mnoho vylepšení. Zvyšuje účinnost výroby o 6 %", "buildings.workshop.flavor": "Hračky pro dělníky", "buildings.zebraForge.label": "Zebří kovárna", - "buildings.zebraForge.desc": "Odemkne výrobu krvavých kamenů a t-mythrilu", "buildings.zebraOutpost.label": "Zebří základna", "buildings.zebraOutpost.desc": "Poskytuje základnu loveským výpravám. Každý další stupeň vylepšení zvýší efektivitu výprav o 5 %", "buildings.zebraWorkshop.label": "Zebří Dílna", @@ -258,6 +257,8 @@ "calendar.year.tooltip": "Rok:", "challendge.panel.label": "Výzvy", "challendge.pending": "Čekající", + "challendge.reclaimReserves.label": "Navrácení zásob", + "challendge.reclaimReserves.desc": "Navrácení zásob z dálav", "challendge.applyPending.label": "Použít čekající změny ({0})", "challendge.applyPending.desc": "Bezprostředně zapne výzvy/podmínky označené jako čekající", "challendge.1000Years.label": "1000 let", @@ -279,12 +280,9 @@ "challendge.ironWill.label": "Železná vůle", "challendge.ironWill.desc": "Železná vůle je trochu skrytá výzva, kterou nemusíš ani nijak aktivovat: restartuj hru a hraj bez koťat.", "challendge.ironWill.effect.desc": "Nic", - "challendge.reclaimReserves.label": "Navrácení zásob", - "challendge.reclaimReserves.desc": "Navrácení zásob z dálav", "challendge.winterIsComing.label": "Obrňte se - zima přišla", "challendge.winterIsComing.desc": "Restartuj hru jen se zimním obdobím. (Šanta nebude mít žádný bonus z paragonů)

Cíl: Dostaň se na Helios.", "challendge.winterIsComing.effect.desc": "Teplá fronta je častější a ta studená zase méně častější.", - "challendge.btn.chronosphere.desc": " Nezískáš bonus za restart z chronosfér.", "challendge.btn.chronosphere.with.ironWill.desc": " Nezískáš bonus za restart z chronosfér.
POZOR: bonus za restart z chronosfér automaticky vypne železnou vůli.", "challendge.btn.confirmation.title": "Potvrzení výzvy", "challendge.btn.confirmation.msg": "Jseš si jistý/á, že chceš resetovat hru s touto výzvou?", @@ -367,8 +365,8 @@ "effectsMgr.statics.factoryCostReduction.title": "Snížení nákladů na továrnu", "effectsMgr.statics.factoryRefineRatio.title": "Bonus k továrnímu rafinování", "effectsMgr.statics.faithRatioReligion.title": "Bonus k víře", - "effectsMgr.statics.festivalRatio.title": "Účinky masopustu", "effectsMgr.statics.festivalArrivalRatio.title": "Míra růstu masopustu", + "effectsMgr.statics.festivalRatio.title": "Účinky masopustu", "effectsMgr.statics.gflopsConsumption.title": "Přeměna GFlopů", "effectsMgr.statics.globalRelationsBonus.title": "Bonus k vztahům", "effectsMgr.statics.globalResourceRatio.title": "Bonus k maximálnímu skladování surovin", @@ -398,7 +396,6 @@ "effectsMgr.statics.logHouseCostReduction.title": "Snížení nákladů na chatu", "effectsMgr.statics.lumberMillRatio.title": "Bonus k pilám", "effectsMgr.statics.lunarOutpostRatio.title": "Bonus k měsíčním základnám", - "effectsMgr.statics.luxuryConsuptionReduction.title": "Snižování spotřeby luxusních materiálů", "effectsMgr.statics.luxuryHappinessBonus.title": "Bonus za luxusní spokojenost", "effectsMgr.statics.magnetoBoostRatio.title": "Zesílení účinku Dynam", "effectsMgr.statics.magnetoRatio.title": "Bonus k výrobě", @@ -588,7 +585,6 @@ "policy.fascism.desc": "Libanonské! Postihy ke štěstí za nadpopulaci jsou zrušeny a chaty stojí polovinu nákladů.", "policy.isolationism.label": "Izolacionismus", "policy.knowledgeSharing.desc": "Vědci budou cestovat do cizích zemí, čímž mírně zvýší produkci vědy.", - "policy.liberty.desc": "Dobrý pro velké, rozpínavé společnosti. Penalizace za populaci je poloviční. Toto ovlivní zásady dostupné v budoucnu!", "policy.militarizeSpace.desc": "Zkus vládnout nebesům. Tvůj vědecký bonus satelitů observatořím bude o 10% silnější.", "policy.mysticism.desc": "Přijmi názor, že existují síly mimo chápání koťat. Získej malý bonus k produkci kultury a víry, ačkoli můžeš chvíli působit trochu pošetile.", "policy.necrocracy.desc": "Tvá společnost nabízí samu sebe starším, převezmou moc a přinesou temné časy, ale dostaneš produkční bonus ze ŽČT.", @@ -596,7 +592,6 @@ "policy.socialism.desc": "Nemá žádný účinek", "policy.spaceBasedTerraforming.desc": "Umístí obrovská zrcadla na nebe, zvýší konzistenci výkonu solárních farem. Odemkne vesmírná zrcadla.", "policy.theocracy.desc": "Vaši astronauti viděli příšerné věci na vzdálených oblohách. Nechte kněze převzít moc, zvyšujíce tak produkci víry.", - "policy.tradition.desc": "Dobrý pro malé společnosti orientované na kulturu. Snižuje cenu rukopisu a zvyšuje jeho účinek. Toto ovlivní, jaké zásady jsou v budoucnu k dispozici!", "prestige.panel.label": "Metafyzika", "prestige.adjustmentBureau.label": "Úřad úprav", "prestige.adjustmentBureau.desc": "Odemyká další herní výzvy.", @@ -705,7 +700,6 @@ "religion.sacrificeBtn.desc": "Vrať Jednorožce do Jednorožčí Dimenze. Dostaneš jednu jedinou slzu za každý Zikkurat, který máš.", "religion.sacrificeBtn.sacrifice.msg": "{0} jednorožců bylo obětováno. Dostal jsi {1} jednorožčích slz!", "religion.transcend.confirmation.title": "Transcendovat?", - "religion.transcend.confirmation.msg": "Opravdu chceš odstranit část zjevení?\n\nMůžeš dosáhnout speciálních úrovní transcendence tím, že obětuješ část tvého zjevení.\n\nKaždá úroveň zlepší účinnost převodu pobořnosti (Uctívat hvězdy).\n\nKaždá úroveň vyžaduje obětovat proporčně více zjevení.\n\nTento bonus se postupně sčítá a přetrvává mezi resety hry.\n\nKLIKNUTÍ NA TOTO TLAČÍTKO ODSTRANÍ ČÁST TVÉHO ZJEVENÍ A ÚČINNOST UCTÍVÁNÍ.", "religion.transcend.msg.failure": "O krok blíže: {0}%", "religion.transcend.msg.success": "Překonal jsi smrtelné limity. Úroveň Transcendence: {0}", "religion.transcendBtn.label": "Transcendovat", @@ -727,7 +721,6 @@ "religion.tu.darkNova.desc": "Zlepšuje glovální produkci energie o 2%", "religion.tu.darkNova.flavor": "Všechny hvězdy jsou mrtvé. Stejně jako naše naděje a sny.", "religion.tu.holyGenocide.label": "Svatá Genocida", - "religion.tu.holyGenocide.desc": "A slza neklesne", "religion.tu.holyGenocide.flavor": "Žijeme na poklidném ostrůvku nevědomosti uprostřed černých moří nekonečna a neočekává se, že se budeme vydávat daleko od břehů. (H.P.L.)", "religion.tu.singularity.label": "Horizont Události", "religion.tu.singularity.desc": "Zlepši globální limity skladování surovin o 10%", @@ -1164,7 +1157,6 @@ "time.cfu.ressourceRetrieval.label": "Zisk Zásob", "time.cfu.ressourceRetrieval.desc": "Získej zpět část tvých zásob když spaluješ ČK", "time.cfu.temporalAccelerator.label": "Časový Urychlovač", - "time.cfu.temporalAccelerator.desc": "Zlepšuje produkci Fluxové energie o 5%", "time.cfu.temporalBattery.label": "Časová Baterie", "time.cfu.temporalBattery.desc": "Zlepšuje tvoji kapacity Fluxové energie o 25%", "time.cfu.temporalImpedance.label": "Časová Impendance", @@ -1283,7 +1275,6 @@ "console.filter.ivoryMeteor": "Meteory slonoviny", "console.filter.unicornRift": "Jednorožčí trhliny", "console.filter.alicornRift": "Křídlorožčí trhliny", - "console.filter.tc": "Časové Krystaly", "village.bonus.desc.chemist": "Bonus na chemickou výrobu", "village.bonus.desc.engineer": "Výrobní bonus", "village.bonus.desc.manager": "Lovecký bonus", @@ -1508,7 +1499,6 @@ "workshop.barges.label": "Nákladní čluny", "workshop.barges.desc": "Přístavy budou skladovat více uhlí", "workshop.biofuel.label": "Zpracovávání Biopaliv", - "workshop.biofuel.desc": "Biolaboratoře budou zpracovávat šantu na ropu", "workshop.bolas.label": "Bola", "workshop.bolas.desc": "Házecí zbraň z těžkých kamenných vah. Tvoji lovci jsou dvakrát tak efektivní", "workshop.bolas.flavor": "Nazbrojená příze", @@ -1740,7 +1730,6 @@ "workshop.spaceEngineers.label": "Kosmičtí inženýři", "workshop.spaceEngineers.desc": "Zlepšuje výkonnost inženýrů", "workshop.spaceManufacturing.label": "Vesmírná výroba", - "workshop.spaceManufacturing.desc": "Továrny poskytují bonus vesmírným výtahům a orbitálním polím", "workshop.starlink.label": "Starlink", "workshop.starlink.desc": "Každé datové centrum poskytuje další 1% bonus k biolaboratořím", "workshop.stasisChambers.label": "Stázové komory", diff --git a/res/i18n/crowdin/de.json b/res/i18n/crowdin/de.json index 6740cabdca..dc4b1acad2 100644 --- a/res/i18n/crowdin/de.json +++ b/res/i18n/crowdin/de.json @@ -209,7 +209,6 @@ "buildings.workshop.desc": "Bietet eine große Anzahl an Verbesserungen.
Jeder Ausbau verbessert die Effektivität der Herstellung um 6%.", "buildings.workshop.flavor": "Gratis-Spielzeuge für Arbeiter", "buildings.zebraForge.label": "Zebraschmiede", - "buildings.zebraForge.desc": "Schaltet die Herstellung von Blutsteinen und T-Mythril frei", "buildings.zebraOutpost.label": "Zebra-Außenposten", "buildings.zebraOutpost.desc": "Bietet einen Stützpunkt für Jagdexpeditionen. Jedes Upgrade verbessert die Effektivität der Expeditionen um 5%", "buildings.zebraWorkshop.label": "Zebra-Werkstatt", @@ -258,6 +257,8 @@ "calendar.year.tooltip": "Jahr:", "challendge.panel.label": "Herausforderungen", "challendge.pending": "Ausstehend", + "challendge.reclaimReserves.label": "Reserven zurückfordern", + "challendge.reclaimReserves.desc": "Ressourcen aus dem Jenseits zurückholen", "challendge.applyPending.label": "Ausstehende Änderungen anwenden ({0})", "challendge.applyPending.desc": "Als ausstehend markierte Herausforderungen/Bedingungen sofort einschalten", "challendge.1000Years.label": "1000 Jahre", @@ -279,12 +280,9 @@ "challendge.ironWill.label": "Eiserner Wille", "challendge.ironWill.desc": "Eiserner Wille ist eine versteckte Herausforderung. Du musst nicht hier klicken, um sie zu starten, du kannst auch neustarten und keine Häuser bauen.", "challendge.ironWill.effect.desc": "Nichts", - "challendge.reclaimReserves.label": "Reserven zurückfordern", - "challendge.reclaimReserves.desc": "Ressourcen aus dem Jenseits zurückholen", "challendge.winterIsComing.label": "Der Winter naht!", "challendge.winterIsComing.desc": "Starte das Spiel neu. Es gibt nur die Winterjahreszeit.

Ziel: Erreiche Helios.", "challendge.winterIsComing.effect.desc": "Das Wetter ist insgesamt besser.", - "challendge.btn.chronosphere.desc": "Du erhältst keinen Bonus nach Neustart durch Chronosphären.", "challendge.btn.chronosphere.with.ironWill.desc": "Du erhältst keinen Bonus nach Neustart durch Chronosphären.
Achtung: Der Bonus nach Neustart durch Chronosphären deaktivert automatisch den eisernen Willen.", "challendge.btn.confirmation.title": "Challenge-Bestätigung", "challendge.btn.confirmation.msg": "Bist du sicher, dass du diese Challenge starten möchtest, indem du das Spiel zurücksetzt?", @@ -367,8 +365,8 @@ "effectsMgr.statics.factoryCostReduction.title": "Reduzierung der Fabrikkosten", "effectsMgr.statics.factoryRefineRatio.title": "Factory-Raffinierungsbonus", "effectsMgr.statics.faithRatioReligion.title": "Glaubensbonus", - "effectsMgr.statics.festivalRatio.title": "Festivaleffekte", "effectsMgr.statics.festivalArrivalRatio.title": "Festival wachstums Rate", + "effectsMgr.statics.festivalRatio.title": "Festivaleffekte", "effectsMgr.statics.gflopsConsumption.title": "GFlops Konsum", "effectsMgr.statics.globalRelationsBonus.title": "Beziehungsbonus", "effectsMgr.statics.globalResourceRatio.title": "Max. Ressourcenbonus", @@ -398,7 +396,6 @@ "effectsMgr.statics.logHouseCostReduction.title": "Blockhaus Kosten Reduktion", "effectsMgr.statics.lumberMillRatio.title": "Sägewerkbonus", "effectsMgr.statics.lunarOutpostRatio.title": "Lunarer-Außenpostensbonus", - "effectsMgr.statics.luxuryConsuptionReduction.title": "Luxusgutkonsumreduktion", "effectsMgr.statics.luxuryHappinessBonus.title": "Luxus Glücklichkeitsbonus", "effectsMgr.statics.magnetoBoostRatio.title": "Magneto-Produktionsbonus", "effectsMgr.statics.magnetoRatio.title": "Magneto-Produktionsbonus", @@ -475,9 +472,9 @@ "effectsMgr.statics.terraformingMaxKittens.title": "Kätzchen-Bonus Terraforming-Station", "effectsMgr.statics.theocracyFaithProductionBonus.title": "Glaubensproduktionsbonus", "effectsMgr.statics.timeImpedance.title": "Zeitliche Strafverzögerung", + "effectsMgr.statics.timeRatio.title": "Zeitlicher-Flux-Bonus", "effectsMgr.statics.tradeCatpowerDiscount.title": "Katzenkraft-Handelsrabatt", "effectsMgr.statics.tradeGoldDiscount.title": "Gold-Handelsrabatt", - "effectsMgr.statics.timeRatio.title": "Zeitlicher-Flux-Bonus", "effectsMgr.statics.tradeRatio.title": "Handelsverhältnis", "effectsMgr.statics.umbraBoostRatio.title": "HR-Ernter Bonus", "effectsMgr.statics.unhappinessRatio.title": "Reduzierung Unzufriedenheit", @@ -639,7 +636,6 @@ "policy.liberalism.label": "Liberalismus", "policy.liberalism.desc": "Eine friedliche und offene Gesellschaft. Verbessert die Beziehungen zu allen Handelspartnern und benötigt weniger Gold für Bauwerke.", "policy.liberty.label": "Freiheit", - "policy.liberty.desc": "Gut für große und umfangreiche Gesellschaften. Halbiert die Strafen für Bevölkerung. Wirkt sich auf zukünftige Leitlinien aus!", "policy.militarizeSpace.label": "Weltraum militarisieren", "policy.militarizeSpace.desc": "Versuche, den Himmel zu erobern. Der Wissenschaftsbonus deiner Satelliten für Observatorien ist um 10% höher.", "policy.monarchy.label": "Monarchie", @@ -653,7 +649,6 @@ "policy.outerSpaceTreaty.label": "Weltraumabkommen", "policy.outerSpaceTreaty.desc": "Stimme zu, das der Weltraum die Domäne von allen Cath-Rassen ist; dadurch verbessert sich die Beziehungen zu allen Handels-Partnern.", "policy.radicalXenophobia.label": "Radikale Xenophobie", - "policy.radicalXenophobia.desc": "Weißt beide, böse Aliens und böse Roboter, zurück. Der Heilige Genozid ist doppelt so effektiv.", "policy.rationality.label": "Vernunft", "policy.rationality.desc": "Akzeptiere die Ansicht, dass die Welt grundsätzlich verstanden werden kann. Erhalte einen kleinen Bonus für Wissenschaft und Eisenerzeugung, obwohl du später vielleicht dumm aussiehst.", "policy.republic.label": "Republik", @@ -663,7 +658,6 @@ "policy.spaceBasedTerraforming.label": "Weltraumbasiertes Terraforming", "policy.spaceBasedTerraforming.desc": "Hänge riesige Spiegel in den Himmel, um die Leistungsstetigkeit der Solarparks zu erhöhen. Schaltet Weltraumspiegel frei.", "policy.stoicism.label": "Stoizismus", - "policy.stoicism.desc": "Die Stoiker lehrten, die Not zu ertragen, ohne zu klagen. Halbiert den Verbrauch von Luxusgütern.", "policy.stripMining.label": "Tagebau", "policy.stripMining.desc": "Hügel abtragen, um die Mineralienproduktion zu verbessern.", "policy.sustainability.label": "Nachhaltigkeit", @@ -673,7 +667,6 @@ "policy.theocracy.label": "Orden der Sterne", "policy.theocracy.desc": "Deine Astronauten haben schreckliche Dinge am fernen Himmel gesehen. Lass die Priester übernehmen. Erhöht die Glaubensproduktion.", "policy.tradition.label": "Tradition", - "policy.tradition.desc": "Gut für kleine, kulturorientierte Gesellschaften. Reduziert den Preis für Manuskripte und erhöht deren Wirkung. Das wird Auswirkungen haben, welche Richtlinien zukünftig verfügbar werden!", "policy.transkittenism.label": "Transkatzenismus", "policy.transkittenism.desc": "Gib das Kätzchensein auf und verbinde dich mit der KI. KI-Kerne werden doppelt so effektiv und es gibt keine Nachteile für das KI-Level.", "policy.zebraRelationsAppeasement.label": "Zebra-Beziehungen: Besänftigung", @@ -807,7 +800,6 @@ "religion.sacrificeBtn.desc": "Schicke die Einhörner in die Einhorn-Dimension zurück. Du erhältst für jedes Zikkurat das du besitzt eine Einhorn-Träne.", "religion.sacrificeBtn.sacrifice.msg": "{0} Einhörner wurden geopfert. Du erhältst {1} Einhorn-Tränen!", "religion.transcend.confirmation.title": "Transzendieren?", - "religion.transcend.confirmation.msg": "Bist du sicher, dass du einen Teil deiner Epiphanie ablegen willst?\n\nDu kannst spezielle Transzendenzstufen erreichen, indem du einen Teil deiner Epiphanie opferst.\n\nJede Stufe erhöht die Wirksamkeit der Anbetungsumwandlung (Anbetung der Sterne).\n\nFür jede Stufe muss proportional mehr Epiphanie geopfert werden.\n\nDieser Bonus ist stapelbar und wird durch Rücksetzungen übertragen.\n\nWENN DU AUF DIESE SCHALTFLÄCHE KLICKST, WIRD EIN TEIL DEINER EPIPHANIE UND DEINER ANBETUNGSEFFIZIENZ GELÖSCHT.", "religion.transcend.msg.failure": "Ein Schritt näher am Ziel: {0} ({1}%)", "religion.transcend.msg.success": "Du hast die Grenzen der Sterblichkeit überschritten. T-level: {0}", "religion.transcendBtn.label": "Transzendieren", @@ -817,7 +809,6 @@ "religion.tu.blackCore.flavor": "Gebaut aus den Knochen von geopferten Kätzchen.", "religion.tu.blackLibrary.label": "Schwarze Bibliothek", "religion.tu.blackLibrary.desc": "Jede Schwarze Bibliothek verbessert die Skalierung des Codex Leviathanianus um 2%. Dieser Wert wird durch Einhorn-Friedhöfe weiter verbessert.", - "religion.tu.blackLibary.flavor": "Vielleicht ist es absichtlich zu dunkel zum Lesen.", "religion.tu.blackNexus.label": "Schwarzer Nexus", "religion.tu.blackNexus.desc": "Improves the rate you refine time crystals into relics.
Every Black Nexus will increase your Relic Refine efficiency by the number of Black Pyramid.
This effect also boosts the effectiveness of Relic Stations", "religion.tu.blackNexus.flavor": "Auge im Himmel.", @@ -834,7 +825,6 @@ "religion.tu.darkNova.desc": "Verbessert globale Energieproduktion um 2%", "religion.tu.darkNova.flavor": "Die Sterne sind Tot. Genauso wie unsere Hoffnungen und Träume.", "religion.tu.holyGenocide.label": "Heiliger Genozid", - "religion.tu.holyGenocide.desc": "Und keine Träne wird niederfallen.", "religion.tu.holyGenocide.flavor": "Wir leben auf einer stillen Insel der Ignoranz in der mitte des schwarzen Sees der Unendlichkeit und es war nicht beabsichtigt dass wir weit reisen.", "religion.tu.singularity.label": "Ereignishorizont", "religion.tu.singularity.desc": "Erhöht globale Resourcenlimits um 10%", @@ -987,12 +977,9 @@ "resources.zebras.title": "Zebras", "resources.sorrow.full": "Schwarzer flüssiger Kummer", "resources.sorrow.short": "BLS", - "gift.get": "XOXOXO! Die Alten Götter haben dir ein Geschenk geschickt!", - "gift.repaire": "Die Alten Götter haben deine Geschenkbox repariert", "gift.resources": "{0} {1} erhalten!", "gift.apocrypha": "Apokryphen-Bonus um {0}% erhöht!", "gift.transcendence": "Transzendenzstufe um 4 erhöht!", - "gift.metaphysics": "{0} freigeschaltet!", "save.export.msg": "Speicherstand export erfolgreih!", "save.import.confirmation.msg": "Sicher? Dein Speicherstand wird überschrieben!", "save.import.msg": "Speicherstand import erfolgreich!", @@ -1325,7 +1312,6 @@ "time.cfu.ressourceRetrieval.label": "Ressourcen Rückgewinnung", "time.cfu.ressourceRetrieval.desc": "Bekomme einen Teil deiner jährlichen Ressourcenproduktion wenn du Zeitkristalle Zerschmetterst", "time.cfu.temporalAccelerator.label": "Zeitlicher Beschleuniger", - "time.cfu.temporalAccelerator.desc": "Verbessert Fluxgeneration um 5%", "time.cfu.temporalBattery.label": "Zeitliche Batterie", "time.cfu.temporalBattery.desc": "Erhöht deine Fluxkapazität um 25%", "time.cfu.temporalImpedance.label": "Zeit Impedanz", @@ -1419,8 +1405,6 @@ "trade.bcoin.crash": "Verärgere die unsichtbare Schwarze Hand", "trade.bcoin.crash.desc": "Blackcoin Marktabsturz erzwingen", "trade.correct.bcoin": "Es gab eine riesige Krypto-Marktkorrektur", - "trade.embassy.open": "Botschaft eröffnen", - "trade.embassy": "Botschaft Stufe ({0})", "trade.embassy.desc": "Verbessere deine diplomatischen Beziehungen mit dem Errichten einer Botschaft", "trade.embassy.pinned": "Angepinnt", "trade.embassy.unpinned": "Gelöst", @@ -1476,7 +1460,6 @@ "ui.option.hide.bgimage": "Hintergrundbild ausblenden (für Farbschemas sofern zutreffend)", "ui.option.tooltips.right": "Tooltips für die rechte Spalte verschieben", "ui.option.more": "Mehr...", - "ui.option.no.confirm": "Bestätigen Sie nicht, wenn Sie alle Jobs löschen, Richtlinien recherchieren oder alle kaufen oder verkaufen (Umschalt-Klick)", "ui.option.iw.smelter": "Schmelzhütten schalten sich bei 95% der maximalen Eisenkapazität im Modus „Eiserner Wille“ ab", "ui.option.disable.telemetry": "Spieltelemetrie deaktivieren", "ui.option.enable.redshift": "Offlinefortschritt aktivieren", @@ -1521,7 +1504,6 @@ "console.filter.ivoryMeteor": "Elfenbeinmeteore", "console.filter.unicornRift": "Einhorn Kluft", "console.filter.alicornRift": "Alicorn-Risse", - "console.filter.tc": "Zeitkristall", "console.filter.faith": "Glaube", "village.bonus.desc.chemist": "Bonus für chemische Herstellung", "village.bonus.desc.engineer": "Herstellungsbonus", @@ -1758,7 +1740,6 @@ "workshop.barges.label": "Lastkähne", "workshop.barges.desc": "Häfen lagern mehr Kohle", "workshop.biofuel.label": "Biofuel processing", - "workshop.biofuel.desc": "Biolabs will convert catnip into oil", "workshop.bolas.label": "Bolas", "workshop.bolas.desc": "Wurfwaffe aus schweren Steingewichten. Deine Jäger sind doppelt so effektiv", "workshop.bolas.flavor": "Waffengarn", @@ -1990,7 +1971,6 @@ "workshop.spaceEngineers.label": "Weltraumingenieure", "workshop.spaceEngineers.desc": "Verbessert Effektivität der Ingenieure", "workshop.spaceManufacturing.label": "Weltraumproduktion", - "workshop.spaceManufacturing.desc": "Fabriken bieten Weltraumaufzügen und Orbitalen Anordnungen eine Steigerung des Produktionsbonus", "workshop.starlink.label": "Starlink", "workshop.starlink.desc": "Jedes Datenzentrum gibt einen zusätzlichen 1% bonus für Bio-Labore", "workshop.stasisChambers.label": "Stasis-Kammer", diff --git a/res/i18n/crowdin/el.json b/res/i18n/crowdin/el.json index e1ae9ee86d..13c4feb33e 100644 --- a/res/i18n/crowdin/el.json +++ b/res/i18n/crowdin/el.json @@ -209,7 +209,6 @@ "buildings.workshop.desc": "Παρέχει μια ποικιλία αναβαθμίσεων. Βελτιώνει την αποτελεσματικότητα των μαστορεμάτων 6%", "buildings.workshop.flavor": "Δωρεάν παιχνίδια για τους εργάτες", "buildings.zebraForge.label": "Σιδηρουργείο των Ζέβρων", - "buildings.zebraForge.desc": "Ξεκλειδώνει το μαστόρεμα για αιματόλιθους και τ-μίθριλ", "buildings.zebraOutpost.label": "Φυλάκιο Ζέβρων", "buildings.zebraOutpost.desc": "Παρέχει βάση για τις αποστολές κυνηγιού. Κάθε επίπεδο αναβάθμισης βελτιώνει την αποτελεσματικότητα αποστολής 5%", "buildings.zebraWorkshop.label": "Βιοτεχνία Ζέβρων", @@ -258,6 +257,8 @@ "calendar.year.tooltip": "Έτος:", "challendge.panel.label": "Προκλήσεις", "challendge.pending": "Εκκρεμεί", + "challendge.reclaimReserves.label": "Ανάκτηση αποθεμάτων", + "challendge.reclaimReserves.desc": "Ανάκτηση αποθεμάτων από το υπερπέραν", "challendge.applyPending.label": "Εφαρμογή Εκκρεμών Αλλαγών ({0})", "challendge.applyPending.desc": "Ενεργοποιήστε αμέσως τις Προκλήσεις/Συνθήκες που επισημάνθηκαν ως εκκρεμείς", "challendge.1000Years.label": "1000 έτη", @@ -279,12 +280,9 @@ "challendge.ironWill.label": "Σιδερένια Θέληση", "challendge.ironWill.desc": "Η Σιδερένια Θέληση είναι λίγο κρυμμένη πρόκληση. Δε χρειάζεται να κάνετε κλικ εδώ για να την ενεργοποιήσετε: επαναφέρετε το παιχνίδι και παίξτε χωρίς γατάκια.", "challendge.ironWill.effect.desc": "Τίποτα", - "challendge.reclaimReserves.label": "Ανάκτηση αποθεμάτων", - "challendge.reclaimReserves.desc": "Ανάκτηση αποθεμάτων από το υπερπέραν", "challendge.winterIsComing.label": "Ο χειμώνας ήρθε", "challendge.winterIsComing.desc": "Επανεκκινήστε το παιχνίδι μόνο με χειμερινές σεζόν. (Το γατόχορτο δεν επωφελείται από τους πόντους επαναφοράς)

Στόχος: Φτάστε στον Ήλιο.", "challendge.winterIsComing.effect.desc": "Οι ζεστές εποχές είναι πιθανότερες και οι ψυχρές λιγότερο πιθανές.", - "challendge.btn.chronosphere.desc": " Δε θα κερδίσετε μπόνους επαναφοράς από τις χρονόσφαιρες.", "challendge.btn.chronosphere.with.ironWill.desc": " Δε θα κερδίσετε μπόνους επαναφοράς από τις χρονόσφαιρες.
ΠΡΟΕΙΔΟΠΟΙΗΣΗ: το μπόνους επαναφοράς από τις χρονόσφαιρες θα απενεργοποιήσει αυτόματα τη Σιδερένια Θέληση.", "challendge.btn.confirmation.title": "Επιβεβαίωση πρόκλησης", "challendge.btn.confirmation.msg": "Είστε βέβαιοι ότι θέλετε να ξεκινήσετε αυτήν την πρόκληση επαναφέροντας το παιχνίδι;", @@ -364,8 +362,8 @@ "effectsMgr.statics.factoryCostReduction.title": "Μείωση του κόστους του εργοστασίου", "effectsMgr.statics.factoryRefineRatio.title": "Μπόνους διύλισης εργοστασίου", "effectsMgr.statics.faithRatioReligion.title": "Μπόνους Πίστης", - "effectsMgr.statics.festivalRatio.title": "Επίδραση Φεστιβάλ", "effectsMgr.statics.festivalArrivalRatio.title": "Ρυθμός ανάπτυξης Φεστιβάλ", + "effectsMgr.statics.festivalRatio.title": "Επίδραση Φεστιβάλ", "effectsMgr.statics.globalResourceRatio.title": "Μέγιστο μπόνους πόρων", "effectsMgr.statics.goldMaxRatio.title": "Μέγιστο μπόνους χρυσού", "effectsMgr.statics.happiness.title": "Ευτυχία", @@ -374,7 +372,6 @@ "effectsMgr.statics.heatMax.title": "Μέγιστη θερμοκρασία", "effectsMgr.statics.heatMaxExpansion.title": "Μέγιστη επέκταση θερμότητας", "effectsMgr.statics.hrHarvester-energyProduction.title": "Συγκομιδή A.X. - Παραγωγή ενέργειας", - "effectsMgr.statics.luxuryConsuptionReduction.title": "Μείωση της κατανάλωσης σπάνιων πόρων", "effectsMgr.statics.luxuryHappinessBonus.title": "Μπόνους ευτυχίας από σπάνιους πόρους", "effectsMgr.statics.maxKittens.title": "Γατάκια", "effectsMgr.statics.moonOutpost-unobtainiumPerTickSpace.title": "Φυλάκιο Φεγγαριού - Μετατροπή Ανομπτένιουμ", @@ -415,7 +412,6 @@ "policy.openWoodlands.label": "Ανοιχτές Δασικές Εκτάσεις", "policy.openWoodlands.desc": "Επιτρέψτε κάποια ανάπτυξη των κοντινών εδαφών, αυξάνοντας την παραγωγή ξύλου και ορυκτών.", "policy.spaceBasedTerraforming.label": "Διαστημική εδαφομορφοποίηση", - "policy.stoicism.desc": "Οι στωικοί διδάσκουν ότι πρέπει να υποστούμε ταλαιπωρίες χωρίς παράπονα. -50% στην κατανάλωση σπάνιων πόρων.", "policy.stripMining.label": "Αποψίλωση", "policy.stripMining.desc": "Αποψιλώστε τα βουνά για να βελτιώσετε την παραγωγή ορυκτών.", "policy.sustainability.desc": "Ξεκινήστε να παίρνετε τις συμβουλές των περιβαλλοντολόγων, αφαιρώντας το πρόστιμο ευτυχίας από τη εξόρυξη/αποψίλωση, βελτιώνοντας το βιώσιμο μέλλον.", @@ -513,7 +509,6 @@ "space.terminusMission.desc": "Ο Τέρμινους είναι ένας γίγαντας πάγου στο άκρο του ηλιακού συστήματος Χίλιος.", "tab.name.workshop": "Βιοτεχνία", "time.cfu.blastFurnace.desc": "Λειτουργεί με χρονοθερμότητα. Αυξάνει το μέγιστο όριο θερμότητας κατά 100.", - "time.cfu.temporalAccelerator.desc": "Βελτιώνει τη ροή παραγωγής ενέργειας ροής 5%", "time.cfu.temporalBattery.desc": "Βελτιώνει την ικανότητα ροής ενέργειας 25%", "time.shatter.tc.desc": "Καταστρέψτε χρονοκρυστάλλους και απελευθερώστε την αποθηκευμένη ενέργεια χρόνου.
Θα μεταφερθείτε ένα χρόνο στο μέλλον. Η τιμή μπορεί να αυξηθεί με την πάροδο του χρόνου.", "time.tc.shatter": "Απελευθερώθηκε ενέργεια χρόνου, παραλείφθηκαν {0} χρόνια", @@ -521,8 +516,6 @@ "time.vsu.voidHoover.desc": "Αυξήστε το μέγιστο κενό που αποκτάται ανά ημέρα κατά τη διάρκεια του Χρονικού Παράδοξου", "time.vsu.voidRift.desc": "Αύξηση του μέγιστου αποθηκευτικού χώρου 2%", "trade.leviathans.energy": "Ενέργεια: ", - "trade.embassy.open": "Πρεσβεία χωρίς σύνορα", - "trade.embassy": "Επίπεδο πρεσβείας ({0})", "trade.embassy.desc": "Βελτιώστε τις διπλωματικές σας σχέσεις εγκαθιδρύοντας μία πρεσβεία", "trade.embassy.pinned": "Καρφιτσωμένο", "trade.embassy.unpinned": "Ξεκαρφιτσωμένο", @@ -630,7 +623,6 @@ "workshop.reactorVessel.desc": "Κάθε αντιδραστήρας βελτιώνει το δυναμικό του πλοίου 5%", "workshop.reinforcedBarns.desc": "80% περισσότερος αποθηκευτικός χώρος ξύλο και σίδερο", "workshop.relicStation.desc": "Προσθέστε στους Φάρους Διαστήματος ερευνητικούς σταθμούς Κειμηλίων. Κάθε Φάρος Διαστήματος παράγει 0,01 Κειμήλια την ημέρα", - "workshop.spaceManufacturing.desc": "Τα εργοστάσια παρέχουν μπόνους στα Ασανσέρ Διαστήματος και στις Τροχιακές Συστοιχίες", "workshop.steelAxe.desc": "Πολύ αιχμηρά και ανθεκτικά τσεκούρια. 50% αποτελεσματικότεροι Ξυλοκόποι", "workshop.stoneBarns.desc": "75% περισσότερος αποθηκευτικός χώρος για ξύλο και σίδερο", "workshop.thoriumReactors.label": "Αντιδραστήρες Θορίου", diff --git a/res/i18n/crowdin/eo.json b/res/i18n/crowdin/eo.json index ec42d3e448..1b94688d1a 100644 --- a/res/i18n/crowdin/eo.json +++ b/res/i18n/crowdin/eo.json @@ -274,7 +274,6 @@ "policy.knowledgeSharing.desc": "Viaj sciencistoj vojaĝos fremdajn landojn, preskaŭe pliigos sciencan elproduktadon.", "policy.liberalism.label": "Liberalismo", "policy.liberty.label": "Libereco", - "policy.liberty.desc": "Bono por larĝaj disvastiĝaj socioj. Duonigos popolajn punojn. Tio afektos kiojn politikojn ebliĝantajn estonte!", "policy.militarizeSpace.label": "Militigi Kosmon", "policy.monarchy.label": "Monarĥio", "policy.openWoodlands.label": "Malfermaj Lignlandoj", @@ -284,7 +283,6 @@ "policy.stripMining.label": "Stria Minado", "policy.theocracy.label": "Ordo de la Steloj", "policy.tradition.label": "Tradicio", - "policy.tradition.desc": "Good for culture-oriented societies. Reduces manuscript price and increases their effect. This will affect what policies are available in the future!", "policy.transkittenism.label": "Transkatetismo", "prestige.panel.label": "Metafiziko", "prestige.ascoh.label": "SKDĈ", @@ -362,7 +360,6 @@ "resources.sorrow.full": "Nigra likva ploro", "resources.sorrow.short": "NLP", "gift.resources": "Atingis {0} {1}'(j)n!", - "gift.metaphysics": "Malŝlosita {0}!", "save.export.msg": "Konservo alŝutado sukcesa!", "save.import.confirmation.msg": "Ĉu vi certas? Tio ago skribos sur vian konservon!", "save.import.msg": "Konservo elŝutado sukcesa!", @@ -422,7 +419,6 @@ "tab.name.trade": "Tradi", "tab.name.workshop": "Designejo", "time.AccelerateTimeBtn.desc": "Akceli kaj malrapidigi tempon dum via volo (+50% pli rapido)", - "time.cfu.temporalAccelerator.desc": "Plibonigos tempaj efektivoj per 5%", "time.reset.title": "Rekomenciĝi", "time.reset.zebra": "Zebraj Ĉasistoj", "trade.attitude.friendly": "amikaj", @@ -496,7 +492,6 @@ "console.filter.trade": "Tradoj", "console.filter.meteor": "Falitsteloj", "console.filter.ivoryMeteor": "Eburaj Falitsteloj", - "console.filter.tc": "Tempaj Kristaloj", "village.bonus.desc.engineer": "Designada plibonigo", "village.bonus.desc.manager": "Ĉasa pliigo", "village.bonus.desc.merchant": "Tradada plibonigo", diff --git a/res/i18n/crowdin/es.json b/res/i18n/crowdin/es.json index 15d0d20dcc..53f348ce04 100644 --- a/res/i18n/crowdin/es.json +++ b/res/i18n/crowdin/es.json @@ -1,9 +1,9 @@ { - "console.intro": "Eres un gatito en un bosque de hierba gatera.", + "console.intro": "Eres un gatito en un bosque de gavilán", "console.intro.zebra": "Eres una cebra en una sabana llena de minas de titanio.", "achievements.header": "Logros: {0} de {1}", - "achievements.msg.unlock": "Logro desbloqueado: ¡{0}!", - "achievements.msg.starUnlock": "Estrella de logro desbloqueada: ¡{0}!", + "achievements.msg.unlock": "Logro desbloqueado: {0}!", + "achievements.msg.starUnlock": "Estrella de logro desbloqueada: {0}!", "achievements.anachronox.title": "Anachronox", "achievements.anachronox.desc": "Por favor, pare", "achievements.atlasUnmeowed.title": "Atlas sin Miau", @@ -16,7 +16,7 @@ "achievements.heartOfDarkness.title": "Corazón de la oscuridad", "achievements.heartOfDarkness.desc": "Conviértete en el jefe de una tribu de Zebras. (¿Cómo es esto posible?)", "achievements.hundredYearsSolitude.title": "Cien años de soledad", - "achievements.hundredYearsSolitude.desc": "¿Cuán lejos es demasiado lejos?", + "achievements.hundredYearsSolitude.desc": "¿Qué tan lejos es demasiado lejos?", "achievements.ironWill.title": "Voluntad de hierro", "achievements.ironWill.desc": "Realmente te lo mereces", "achievements.jupiterAscending.title": "Júpiter ascendiendo", @@ -34,9 +34,9 @@ "achievements.shadowOfTheColossus.desc": "Construye un Ziggurat teniendo solo un gatito", "achievements.sinsOfEmpire.title": "Pecados de un Imperio Solar", "achievements.sinsOfEmpire.desc": "Espera, ¿en serio?", - "achievements.soilUptuned.title": "Campos roturados", - "achievements.soilUptuned.desc": "Ten 45 pasturas en modo Voluntad de hierro", - "achievements.spaceOddity.title": "Rareza espacial", + "achievements.soilUptuned.title": "Tierras vírgenes vueltas hacia arriba", + "achievements.soilUptuned.desc": "Tener 45 pasturas en modo Voluntad de hierro", + "achievements.spaceOddity.title": "Singularidad Espacial", "achievements.spaceOddity.desc": "Completa un programa lunar en modo Voluntad de hierro", "achievements.spaceOddity.starDesc": "Obtener el programa de la luna en IW sin ningún punto de parangón", "achievements.sunGod.title": "Dios Sol", @@ -49,95 +49,95 @@ "achievements.theElderLegacy.desc": "Sé el primer jugador en probar Kittens Game Móvil", "achievements.uberkatzhen.title": "Uberkatzchen", "achievements.uberkatzhen.desc": "Lo que no te mata te hace más fuerte", - "achievements.uniception.title": "El uniorigen", - "achievements.uniception.desc": "Descubre la conspiración dentro de la conspiración", - "achievements.unicornConspiracy.title": "Uniconspiración", - "achievements.unicornConspiracy.desc": "¡Desvela la conspiración de los unicornios!", + "achievements.uniception.title": "Unicepción", + "achievements.uniception.desc": "Encuentra la conspiración dentro de la conspiración", + "achievements.unicornConspiracy.title": "Conspiración de unicornios", + "achievements.unicornConspiracy.desc": "¡Levanta la mortaja de la conspiración Unicornio!", "achievements.utopiaProject.title": "Proyecto Utopía", - "achievements.utopiaProject.desc": "Obtén una felicidad total de más de 150 %", - "achievements.utopiaProject.starDesc": "Obtén una felicidad todal de más de 500 %", - "achievements.winterIsComing.title": "El invierno se acerca", - "achievements.winterIsComing.desc": "Deja morir a 10 gatitos", - "achievements.youMonster.title": "Cómo pudiste", - "achievements.youMonster.desc": "Pobres gatitos.", - "ai.apocalypse.msg": "IA ha destruido el {0} % de tus recursos", - "bld.msg.automation": "Activando automatización del taller", - "bld.msg.automation.beams": "Gastaste {0} maderas, ¡vigas +{1}!", - "bld.msg.automation.plates": "Gastaste {0} hierros, ¡placas +{1}!", - "bld.msg.automation.skip": "Omitiendo automatización del taller...", - "bld.msg.automation.slabs": "Gastaste {0} minerales, ¡losas +{1}!", - "btn.all": "Todo", - "btn.all.minor": "todo", + "achievements.utopiaProject.desc": "Obtenga una felicidad total de más del 150%", + "achievements.utopiaProject.starDesc": "Obtenga una felicidad total de más del 500%", + "achievements.winterIsComing.title": "Se acerca el invierno", + "achievements.winterIsComing.desc": "Muere 10 gatitos", + "achievements.youMonster.title": "Tú, monstruo", + "achievements.youMonster.desc": "Pobres gatitos", + "ai.apocalypse.msg": "AI ha destruido {0}% de tus recursos", + "bld.msg.automation": "Activación de la automatización del taller", + "bld.msg.automation.beams": "¡Gastado {0} madera, + {1} vigas!", + "bld.msg.automation.plates": "¡Gastado {0} planchas de hierro, + {1}!", + "bld.msg.automation.skip": "Saltarse la automatización del taller ...", + "bld.msg.automation.slabs": "¡Gastado {0} minerales, + {1} losas!", + "btn.all": "Todos", + "btn.all.minor": "todos", "btn.all.assign": "[+todo]", - "btn.all.unassign": "[-all]", + "btn.all.unassign": "[-todo]", "btn.aoff.tooltip": "Automatización desactivada", - "btn.aon.tooltip": "Automatización habilitada", + "btn.aon.tooltip": "Automatización activada", "btn.build": "Construir", "btn.challenge": "Iniciar desafío", - "btn.complete": "(terminado)", - "btn.complete.capital": "(Terminado)", - "btn.craft": "Fabricar", + "btn.complete": "(completo)", + "btn.complete.capital": "(Completo)", + "btn.craft": "Artesanía", "btn.feed": "Alimentar", - "btn.fix.cryo": "Reparar criocámara", + "btn.fix.cryo": "Reparar Criocámara", "btn.leader": "Líder", "btn.nextPage": "Página siguiente", "btn.off.minor": "apagado", "btn.off.tooltip": "Edificio desactivado", "btn.on.minor": "encendido", - "btn.on.tooltip": "Edificio habilitado", - "btn.precraft": "Prefabricar", + "btn.on.tooltip": "Edificio activado", + "btn.precraft": "Precraftear", "btn.prevPage": "Página anterior", "btn.promote": "Promover", - "btn.refine": "Refinar", - "btn.research": "Investigar", + "btn.refine": "Refineria", + "btn.research": "Investigación", "btn.reset": "Restablecer", "btn.sell": "Vender", "btn.sell.minor": "vender", - "btn.trade": "Cambiar", + "btn.trade": "Comercio", "btn.blocked.capital": "(Bloqueado)", - "sell.all.confirmation.msg": "¿Seguro que quieres vender todo?", + "sell.all.confirmation.msg": "¿Estás seguro de que quieres vender todo?", "construct.all.confirmation.title": "Construir todo", - "construct.all.confirmation.msg": "¿Seguro que quieres construir todos los edificios?", + "construct.all.confirmation.msg": "¿Estás seguro de que deseas construir todos los edificios?", "construct.all.msg": "{0} x{1} construido.", "buildings.academy.label": "Academia", - "buildings.academy.desc": "Mejora tu tasa de investigación y la velocidad de crecimiento de las habilidades de tus gatitos. Cada nivel de mejora aumenta tu producción científica en un 20 %", - "buildings.academy.flavor": "La curiosidad es la base de la ciencia. Sus felinas muertes fueron nobles", + "buildings.academy.desc": "Mejora tu ratio de investigación y la velocidad de crecimiento de tus habilidades con los gatitos. Cada nivel de mejora mejora tu producción científica en un 20%", + "buildings.academy.flavor": "La curiosidad es la base de la ciencia. Nuestros gatos murieron noblemente", "buildings.accelerator.label": "Acelerador", - "buildings.accelerator.desc": "Convierte titanio en uranio", - "buildings.accelerator.flavor": "Gran Colisionador de Gatrones", + "buildings.accelerator.desc": "Convierte titanio en uranio (sic)", + "buildings.accelerator.flavor": "Gran Colisionador Catron", "buildings.aicore.label": "Núcleo de IA", - "buildings.aicore.desc": "FelinOS, una inteligencia artificial de última generación. Absolutamente inofensiva. Cada nivel de mejora aumenta el consumo de energía del núcleo en un 75 %.", - "buildings.aicore.flavor": "Es hora de hacer a un lado nuestras diferencias, prrrrr la ciencia.", + "buildings.aicore.desc": "FelineOS, una inteligencia artificial de última generación. Absolutamente inofensivo. Cada nivel de actualización aumentará el consumo de energía central en un 75%", + "buildings.aicore.flavor": "Es hora de poner nuestras diferencias a un lado para la ciencia", "buildings.aicore.attemptsell": "Acceso denegado.", "buildings.amphitheatre.label": "Anfiteatro", - "buildings.amphitheatre.desc": "Reduce los efectos negativos de la sobrepoblación en un 5 %. El efecto es acumulativo, pero sus beneficios serán cada vez menores. Genera cultura.", - "buildings.amphitheatre.flavor": "Proyectando \"Todos los perros van al cielo\" de lunes a domingo", + "buildings.amphitheatre.desc": "Reduce los efectos negativos de la superpoblación en un 5%. Este efecto se acumula pero tiene un rendimiento decreciente. Produce cultura", + "buildings.amphitheatre.flavor": "Todos los días 'Todos los perros van a las exhibiciones del cielo'", "buildings.aqueduct.label": "Acueducto", - "buildings.aqueduct.desc": "+3 % en producción de hierba gatera", - "buildings.aqueduct.flavor": "Prohibido nadar", + "buildings.aqueduct.desc": "+ 3% a la producción de catnip", + "buildings.aqueduct.flavor": "No nadar", "buildings.barn.label": "Granero", - "buildings.barn.desc": "Proporciona un espacio para almacenar tus recursos.", + "buildings.barn.desc": "Proporciona un espacio para almacenar sus recursos.", "buildings.barn.flavor": "¡Las ratas no son un problema para nosotros!", - "buildings.biolab.label": "Lab. biológico", - "buildings.biolab.desc": "Mejora la efectividad del refinamiento de hierba gatera en un 10 %. Potenciado es aún más efectivo.", - "buildings.biolab.flavor": "Nuevos puestos de posdoctorado disponibles.", + "buildings.biolab.label": "Laboratorio biológico", + "buildings.biolab.desc": "Mejora la efectividad del refinamiento de catnip en un 10%. Más eficaz si está alimentado.", + "buildings.biolab.flavor": "Nuevas posiciones postdoctorado disponibles.", "buildings.broadcasttower.label": "Torre de transmisión", - "buildings.broadcasttower.desc": "Genera cultura y felicidad. Con una alta producción energética es aún más efectiva.", - "buildings.calciner.label": "Horno de calcinación", - "buildings.calciner.desc": "Una fuente muy efectiva de metal. Consume 1,5 minerales y 0,02 petróleo por punto. Produce hierro y algo de titanio", + "buildings.broadcasttower.desc": "Genera cultura y felicidad. Más efectivo con producción de alta energía", + "buildings.calciner.label": "Calcinador", + "buildings.calciner.desc": "Una fuente de metal muy efectiva. Consume 1,5 minerales y 0,02 de aceite por tick. Produce hierro y una pequeña cantidad de titanio", "buildings.chapel.label": "Capilla", - "buildings.chapel.desc": "Genera algo de cultura y fe por punto. Puede perfeccionarse con mejoras religiosas", - "buildings.chronosphere.label": "Cronósfera", - "buildings.chronosphere.desc": "Reubica una pequeña cantidad de recursos a través del tiempo. Se puede mejorar. Cada cronósfera aumenta las posibilidades de paradoja temporal.", + "buildings.chapel.desc": "Produce un poco de cultura y fe por tick. Puede mejorarse con actualizaciones religiosas", + "buildings.chronosphere.label": "Cronoesfera", + "buildings.chronosphere.desc": "Reubica una pequeña cantidad de recursos a través del tiempo. Se puede actualizar aún más. Cada Cronoesfera aumenta las posibilidades de Paradoja Temporal", "buildings.dataCenter.label": "Centro de datos", - "buildings.dataCenter.desc": "Aumenta el efecto total de los compedios en tu ciencia máxima", + "buildings.dataCenter.desc": "Incremento total del efecto del compendio en tu almacén máximo de ciencia", "buildings.factory.label": "Fábrica", - "buildings.factory.desc": "Mejora la efectividad de lo que fabriques", - "buildings.field.label": "Campo de hierba gatera", - "buildings.field.desc": "Planta algo de hierba gatera para que crezca en la aldea. Los campos tienen +50 % de producción en primavera y -75 % de producción en invierno", - "buildings.field.flavor": "Hierba gatera hasta donde llega la vista.", - "buildings.gatherCatnip.label": "Recolectar hierba gatera", - "buildings.gatherCatnip.desc": "Recolecta hierba gatera en el bosque", + "buildings.factory.desc": "Mejora la efectividad de las artesanías", + "buildings.field.label": "Campo de Catnip", + "buildings.field.desc": "Planta algo de catnip para crecer en la aldea. Los campos tienen una producción de +50% en primavera y -75% de producción en invierno", + "buildings.field.flavor": "'Catnip hasta donde alcanza la vista.", + "buildings.gatherCatnip.label": "Reunir catnip", + "buildings.gatherCatnip.desc": "Recoge un catnip en el bosque", "buildings.harbor.label": "Puerto", "buildings.harbor.desc": "Proporciona un espacio para almacenar sus recursos", "buildings.harbor.flavor": "¡Ahoy, marineros!", @@ -158,22 +158,22 @@ "buildings.magneto.label": "Magneto", "buildings.magneto.desc": "Mejora tu producción total de recursos en un 2%. Cada Steamworks aumentará este efecto en un 15%. Consume petróleo.", "buildings.mansion.label": "Mansión", - "buildings.mansion.desc": "Una espaciosa mansión (cabe 1 gatito)", - "buildings.mansion.flavor": "El mejor contenedor disponible", + "buildings.mansion.desc": "Una mansión espaciosa (cada una tiene un espacio para 1 gatito)", + "buildings.mansion.flavor": "El mejor contenedor de envío disponible", "buildings.mine.label": "Mina", - "buildings.mine.desc": "Desbloquea el trabajo: minero. Cada nivel de mejora aumenta tu producción de mineral en 20 %", - "buildings.mine.flavor": "Los gatitos no le temen a la oscuridad", - "buildings.mint.label": "Casa de Moneda", - "buildings.mint.desc": "Produce recursos de lujo proporcionales a tu fuerza felina. Consume fuerza felina y algo de oro.", + "buildings.mine.desc": "Desbloquea el trabajo de minero. Cada nivel mejora tu producción de mineral en un 20%", + "buildings.mine.flavor": "100 días sin diggor mortis", + "buildings.mint.label": "Casa de la moneda", + "buildings.mint.desc": "Produce recursos de lujo proporcionales a su potencia máxima de transmisión. Consume potencia y un poco de oro", "buildings.observatory.label": "Observatorio", - "buildings.observatory.desc": "Aumenta la probabilidad de eventos astronómicos en 0,2 %", - "buildings.observatory.flavor": "Para algún día atrapar esa hadita de luz roja", - "buildings.oilWell.label": "Pozo petrolero", - "buildings.oilWell.desc": "Produce algo de petróleo y aumenta en 1500 el límite máximo de petróleo", - "buildings.oilWell.flavor": "Levantarse temprano, trabajar hasta tarde y encontrar petróleo.", - "buildings.pasture.label": "Pastizal", - "buildings.pasture.desc": "Proporciona una fuente de alimento alternativa que reduce el consumo de hierba gatera.", - "buildings.pasture.flavor": "¡Tómese una pinta de leche, señor!", + "buildings.observatory.desc": "Aumenta las posibilidades de eventos astronómicos en 0.2%", + "buildings.observatory.flavor": "Anhelando un día atrapar al hada de luz roja", + "buildings.oilWell.label": "Pozo de petróleo", + "buildings.oilWell.desc": "Produce un poco de aceite, +1500 al límite máximo de aceite", + "buildings.oilWell.flavor": "Levántese temprano, trabaje duro, golpee el petróleo", + "buildings.pasture.label": "Pasto", + "buildings.pasture.desc": "Proporciona una fuente alternativa de alimentos, que reduce el consumo de catnip", + "buildings.pasture.flavor": "¡Toma una pinta de leche, señor!", "buildings.quarry.label": "Cantera", "buildings.quarry.desc": "Las canteras mejoran su eficiencia minera en un 35% y producen un poco de carbón", "buildings.quarry.flavor": "¡Está lleno de ratones! Espera, 'cantera' equivocada", diff --git a/res/i18n/crowdin/he.json b/res/i18n/crowdin/he.json index ab5e3445c2..d872bcf603 100644 --- a/res/i18n/crowdin/he.json +++ b/res/i18n/crowdin/he.json @@ -208,7 +208,6 @@ "buildings.workshop.desc": "מספק מגוון רחב של שדרוגים. משפר יעילות מלאכה ב6%", "buildings.workshop.flavor": "צעצועים בחינם לעובדים", "buildings.zebraForge.label": "מפחת זברות", - "buildings.zebraForge.desc": "מאפשר יצירת אבני דם וט-מיתריל", "buildings.zebraOutpost.label": "מוצב זברות", "buildings.zebraOutpost.desc": "משמש כבסיס למשלחות ציד. כל שלב משפר את יעילות המשלחת ב5%", "buildings.zebraWorkshop.label": "סדנת זברות", @@ -257,6 +256,8 @@ "calendar.year.tooltip": "שנה:", "challendge.panel.label": "אתגרים", "challendge.pending": "ממתינים", + "challendge.reclaimReserves.label": "אסוף מצבורים", + "challendge.reclaimReserves.desc": "אסוף מצבורים מהעולם הבא", "challendge.applyPending.label": "החל שינויים ממתינים ({0})", "challendge.applyPending.desc": "הפעל מיידית אתגרים/תנאים המסומנים כממתינים", "challendge.1000Years.label": "1000 שנים", @@ -278,12 +279,9 @@ "challendge.ironWill.label": "רצון ברזך", "challendge.ironWill.desc": "רצון ברזל הוא מעין אתגר חבוי ואין צורך ללחוץ כאן כדי לאפשרו: אתחל את המשחק ושחק ללא חתלתולים.", "challendge.ironWill.effect.desc": "כלום", - "challendge.reclaimReserves.label": "אסוף מצבורים", - "challendge.reclaimReserves.desc": "אסוף מצבורים מהעולם הבא", "challendge.winterIsComing.label": "החורף מגיע", "challendge.winterIsComing.desc": "אתחל את המשק עם חורף כהעונה היחידה. (מופת לא תיטיב ייצור נפית.)

מטרה: הגעה להליוס.", "challendge.winterIsComing.effect.desc": "עונות חמימות יהיו תדירות יותר, ועונות קרות תדירות פחות.", - "challendge.btn.chronosphere.desc": " לא תשיג תוספת אתחול מגלגלי הזמן.", "challendge.btn.chronosphere.with.ironWill.desc": " לא תשיג תוספת אתחול מגלגלי הזמן.
*אזהרה*: תוספת האתחול מגלגלי הזמן יבטלו אוטומטית את ר\"ב.", "challendge.btn.confirmation.title": "אישור אתגר", "challendge.btn.confirmation.msg": "האם אתה בטוח שאתה רוצה להתחיל אתגר זה על ידי אתחול המשחק?", @@ -424,8 +422,6 @@ "policy.openWoodlands.label": "יערות משגשגים", "policy.openWoodlands.desc": "מאפשר פיתוח מוגבל של אדמות, יגדיל את ייצור העץ והמינרלים.", "policy.republic.desc": "מיטיב עבור חברות גדולות. מנהיגתלתולים בדרגות גבוהות ייטיבו את תפוקתם של כלל החתלתולים.", - "policy.stoicism.desc": "הסטואים מלמדים שעלינו לנשוא קשיים ללא תלונה. חוצה את הצריכה של משאבי יוקרה.", - "policy.tradition.desc": "טוב לחברות קטנות המבוססות על תרבות. מוריד את המחיר של כתבי יד ומשפר את השפעתם. ישפיע על אילו מדינויות יתאפשרו בעתיד!", "policy.transkittenism.label": "טרנסתוליות", "policy.transkittenism.desc": "וותר על חתוליות והתאחד עם ה-AI. ליבות AI יהיו יעילות כפליים, ולא ולרמת AI לא תהיה מגרעה.", "policy.zebraRelationsAppeasement.desc": "נסה לחבור על הזברות, למרות שהן שונאות אותך. תנאי השחר יהיו פחות קשוחים, אבל הכנסת הזהב תונמך במעט.", @@ -465,7 +461,6 @@ "religion.sacrificeBtn.label": "הקרב חדי קרן", "religion.sacrificeBtn.desc": "מחזיר חדי קרן למימד חדי הקרן. תקבל דמעת חד קרן אחת עבור כל זיקורת שברשותך.", "religion.sacrificeBtn.sacrifice.msg": "הוקרבו {0} חדי קרן. השגת {1} דמעות חדי קרן!", - "religion.transcend.confirmation.msg": "האם אתה בטוח שאתה רוצה לאבד חלק מהגילוי שלך?\n\nאתה תוכל להגיע לרמות עילוי מיוחדות על ידי הקרבת חלק מהגילוי שלך. \n\nכל רמה תשפר את יעילות המרת השבח (הערץ את הכוכבים).\n\nכל רמה צורכת כמות הקרבה גדלה יחסית של שבח.\n\nתוספת זו נערמת ועוברת בין אתחולים.\n\n*ללחוץ על כפתור זה ימחק חלק מהשבח שלך ויעילות הילול*.", "religion.tu.blackCore.desc": "הטה והשחת קלות את חוקי המציאות עצמה.
כל רמה של ליבה שחורה תעלה את תקרת הצנ\"ש ב1%.", "religion.tu.blackCore.flavor": "עשוי מעצמותיהן של חתלתולים שהוקרבו.", "religion.tu.blackNexus.desc": "משפר את קצב זיקוק גבישי הזמן לשרידים.
כל כל קשר שחור יגדיל את יעילות זיקוק השרידים ככמות פירמידות השחור.
השפעה זו גם תגדיל את יעילותן של תחנות השרידים", @@ -564,7 +559,6 @@ "stats.unicorns": "חדי קרן שהוקרבו", "tab.name.trade": "סחר", "tab.name.workshop": "סדנא", - "time.cfu.temporalAccelerator.desc": "משפר ייצור שצף אנרגיה ב-5%", "time.cfu.temporalBattery.desc": "משפר את קיבולת אנרגיית השצף ב-25%", "time.chronoheat": "חום זמני מיוצר על ידי שבירת גביש הזמן ויפחת לאורך זמן. כל יחידת חום מעל הגבול תגדיל את מחיר שבירת גבישי הזמן ב1%
", "time.fixCryochambers.label": "תקן תאי קריו", @@ -635,7 +629,6 @@ "console.filter.workshopAutomation": "אוטומציית סדנה", "console.filter.unicornRift": "קרעי חדי קרן", "console.filter.alicornRift": "קרעי מכונפי קרן", - "console.filter.tc": "גבישי זמן", "village.bonus.desc.chemist": "הטבת ייצור כימי", "village.bonus.desc.engineer": "הטבת ייצור", "village.bonus.desc.manager": "הטבת ציד", @@ -771,7 +764,6 @@ "workshop.astrophysicists.desc": "כל מלומד עכשיו ייצר מפות כוכבים.", "workshop.automatedPlants.desc": "מפעלי פלדה משופרים ב-25% מיחס היצירה", "workshop.biofuel.label": "עיבוד דלק ביולוגי", - "workshop.biofuel.desc": "מעבדות ימירו נפית לנפט", "workshop.cadSystems.desc": "כל הבניינים המדעיים ישפרו את יעילות יצירת תרשימים", "workshop.caravanserai.desc": "לתחנות הסחר תהיה השפעה קטנה על מעמד בין המינים", "workshop.cargoShips.desc": "כל ספינה תוסיף 1% לקיבלת המספנות", diff --git a/res/i18n/crowdin/it.json b/res/i18n/crowdin/it.json index 15df7665e6..1bee6df73b 100644 --- a/res/i18n/crowdin/it.json +++ b/res/i18n/crowdin/it.json @@ -209,7 +209,6 @@ "buildings.workshop.desc": "Fornisce una grande varietà di potenziamenti. Aumenta l'efficacia di creazione del 6%", "buildings.workshop.flavor": "Giocattoli gratis per i dipendenti", "buildings.zebraForge.label": "Fucina delle zebre", - "buildings.zebraForge.desc": "Sblocca la produzione di eliotropio e t-mythril", "buildings.zebraOutpost.label": "Avamposto delle zebre", "buildings.zebraOutpost.desc": "Fornisce una base per le spedizioni di caccia. Ogni livello di potenziamento migliora l' efficacia delle spedizioni del 5%", "buildings.zebraWorkshop.label": "Officina delle zebre", @@ -258,6 +257,8 @@ "calendar.year.tooltip": "Anno:", "challendge.panel.label": "Sfide", "challendge.pending": "In attesa", + "challendge.reclaimReserves.label": "Recupera le risorse", + "challendge.reclaimReserves.desc": "Recupera le risorse dall'aldilà", "challendge.applyPending.label": "Applica Modifiche in sospeso ({0})", "challendge.applyPending.desc": "Attiva Sfide/Condizioni contrassegnate come in sospeso immediatamente", "challendge.1000Years.label": "1000 anni", @@ -279,12 +280,9 @@ "challendge.ironWill.label": "Volontà Ferrea", "challendge.ironWill.desc": "Iron Will è una sfida un po' nascosta e non c'è bisogno di cliccare qui per attivarlo: resetta il gioco e gioca senza gattini.", "challendge.ironWill.effect.desc": "Niente", - "challendge.reclaimReserves.label": "Recupera le risorse", - "challendge.reclaimReserves.desc": "Recupera le risorse dall'aldilà", "challendge.winterIsComing.label": "L'inverno è arrivato", "challendge.winterIsComing.desc": "Ricomincia il gioco con solo stagioni invernali (i punti paragon non influiranno sulla produzione d'erba gatta).

Obiettivo: raggiungi Helios.", "challendge.winterIsComing.effect.desc": "Le stagioni calde sono più frequenti, quelle fredde più rare.", - "challendge.btn.chronosphere.desc": " Non otterrai un bonus di nuovo inizio dalle cronosfere.", "challendge.btn.chronosphere.with.ironWill.desc": " Non otterrai un bonus di nuovo inizio dalle cronosfere.
ATTENZIONE: il bonus dalle cronosfere disattiverà automaticamente la Volontà Ferrea.", "challendge.btn.confirmation.title": "Conferma la sfida", "challendge.btn.confirmation.msg": "Sei sicuro di voler iniziare questa sfida ripristinando il gioco?", @@ -367,8 +365,8 @@ "effectsMgr.statics.factoryCostReduction.title": "Riduzione del costo delle fabbriche", "effectsMgr.statics.factoryRefineRatio.title": "Bonus raffinazione fabbrica", "effectsMgr.statics.faithRatioReligion.title": "Bonus fede", - "effectsMgr.statics.festivalRatio.title": "Effetti del Festival", "effectsMgr.statics.festivalArrivalRatio.title": "Tasso di crescita del festival", + "effectsMgr.statics.festivalRatio.title": "Effetti del Festival", "effectsMgr.statics.gflopsConsumption.title": "Conversione GFlops", "effectsMgr.statics.globalRelationsBonus.title": "Bonus Relazioni", "effectsMgr.statics.globalResourceRatio.title": "Bonus risorse massime", @@ -398,7 +396,6 @@ "effectsMgr.statics.logHouseCostReduction.title": "Riduzione costo baite", "effectsMgr.statics.lumberMillRatio.title": "Bonus Segheria", "effectsMgr.statics.lunarOutpostRatio.title": "Bonus Avamposto Lunare", - "effectsMgr.statics.luxuryConsuptionReduction.title": "Riduzione dei consumi di lusso", "effectsMgr.statics.luxuryHappinessBonus.title": "Bonus felicità da materiali di lusso", "effectsMgr.statics.magnetoBoostRatio.title": "Bonus alternatore", "effectsMgr.statics.magnetoRatio.title": "Bonus alla produzione", @@ -474,9 +471,9 @@ "effectsMgr.statics.terraformingMaxKittens.title": "Bonus gattini Stazione Terraformazione", "effectsMgr.statics.theocracyFaithProductionBonus.title": "Bonus produzione dovuto alla religione", "effectsMgr.statics.timeImpedance.title": "Ritardo della penalità Temporale", + "effectsMgr.statics.timeRatio.title": "Temporal flux bonus", "effectsMgr.statics.tradeCatpowerDiscount.title": "Sconto sul costo di potere del gatto per il commercio", "effectsMgr.statics.tradeGoldDiscount.title": "Sconto sul costo in Oro nello scambio", - "effectsMgr.statics.timeRatio.title": "Temporal flux bonus", "effectsMgr.statics.tradeRatio.title": "Rapporto di scambio", "effectsMgr.statics.umbraBoostRatio.title": "Bonus Mietitore HR", "effectsMgr.statics.unhappinessRatio.title": "Riduzione dell'infelicità", @@ -634,7 +631,6 @@ "policy.technocracy.label": "Tecnocrazia", "policy.technocracy.desc": "Gli scienziati prendono il controllo del governo, aumentando la capacità massima di scienza.", "policy.tradition.label": "Tradizione", - "policy.tradition.desc": "Buona per piccole società orientate alla cultura. Riduce il costo dei manoscritti e ne aumenta l'effetto. Questo influenzerà quali politiche saranno disponibili in futuro!", "policy.transkittenism.label": "Transgattinismo", "policy.transkittenism.desc": "Rinuncia al gattinismo e fonditi con l'AI. I nuclei AI saranno il doppio più efficienti e non ci saranno alcune penalità per il livello dell'AI.", "policy.zebraRelationsAppeasement.desc": "Cerca di fare amicizia con le zebre, anche se ti odiano. I termini di scambio saranno meno duri, ma il guadagno in oro sarà leggermente inferiore.", @@ -828,8 +824,6 @@ "resources.zebras.title": "zebre", "resources.sorrow.full": "Disperazione nera liquida", "resources.sorrow.short": "ORL", - "gift.repaire": "Gli Dei Anziani hanno riparato la tua confezione regalo", - "gift.metaphysics": "Sbloccato {0}!", "save.export.msg": "Esportazione salvataggio riuscita!", "save.import.confirmation.msg": "Sei sicuro? Questo sovrascriverà il tuo salvataggio!", "science.acoustics.label": "Acustico", @@ -1050,7 +1044,6 @@ "time.cfu.blastFurnace.label": "Cronofornace", "time.cfu.blastFurnace.desc": "Opera basandosi sul cronocalore. Aumenta il massimo di calore di 100.", "time.cfu.ressourceRetrieval.label": "Recupero risorse", - "time.cfu.temporalAccelerator.desc": "Migliora la generazione del flusso di energia di 5%", "time.cfu.temporalBattery.desc": "Migliora la capacità del tuo flusso di energia del 25%", "time.cfu.temporalImpedance.desc": "Suppress effect of Dark Future temporal penalty by 1000 years.", "time.cfu.timeBoiler.desc": "Espande la capacità termica dei forni Chrono.", @@ -1100,8 +1093,6 @@ "trade.bcoin.buy.msg": "Hai comprato {0} blackcoin", "trade.bcoin.sell.desc": "Vendi i tuoi blackcoin e riprenditi le reliquie", "trade.bcoin.crash": "Infastidisci l'Invisibile Mano Nera", - "trade.embassy.open": "Apri ambasciata", - "trade.embassy": "Livello ambasciata ({0})", "trade.embassy.desc": "Migliora le tue relazioni diplomatiche istituendo un'ambasciata", "trade.embassy.pinned": "Appuntato", "trade.embassy.unpinned": "Sbloccato", @@ -1326,7 +1317,6 @@ "workshop.astrophysicists.desc": "Ogni studioso ora genererà anche carte celesti.", "workshop.automatedPlants.desc": "Le acciaierie hanno un bonus del 25% del tuo tasso di produzione", "workshop.biofuel.label": "Biofuel processing", - "workshop.biofuel.desc": "Biolabs will convert catnip into oil", "workshop.bolas.desc": "Arma da lancio costituita da pesi di pietra. I tuoi cacciatori sarano efficaci il doppio", "workshop.bolas.flavor": "Patata dolce trasformata in arma da lancio", "workshop.cadSystems.desc": "Tutti gli edifici scientifici miglioreranno l'efficacia della creazione di progetti", @@ -1472,7 +1462,6 @@ "workshop.spaceEngineers.label": "Ingegneri spaziali", "workshop.spaceEngineers.desc": "Migliora l'efficacia dell'ingegnere", "workshop.spaceManufacturing.label": "Produzione Spaziale", - "workshop.spaceManufacturing.desc": "Le Fabbriche offrono un bonus a Ascensori Spaziali e Schieramenti Orbitali", "workshop.starlink.label": "Starlink", "workshop.starlink.desc": "Ogni data center fornirà un ulteriore 1% di bonus ai Bio Labs", "workshop.stasisChambers.label": "Camere di stasi", diff --git a/res/i18n/crowdin/ja.json b/res/i18n/crowdin/ja.json index 0981a8d041..e749577a4a 100644 --- a/res/i18n/crowdin/ja.json +++ b/res/i18n/crowdin/ja.json @@ -209,7 +209,6 @@ "buildings.workshop.desc": "非常に多くのアップグレードを提供します。クラフトの効率が6%上昇します。", "buildings.workshop.flavor": "労働者向けの無料のおもちゃ", "buildings.zebraForge.label": "シマウマ鍛冶場", - "buildings.zebraForge.desc": "ブラッドストーンとT-ミスリルの作成をアンロックします。", "buildings.zebraOutpost.label": "シマウマ族の前哨基地", "buildings.zebraOutpost.desc": "狩猟遠征の拠点を提供します。アップグレードする度に遠征の有効性が5%向上します。", "buildings.zebraWorkshop.label": "シマウマ工房", @@ -258,6 +257,8 @@ "calendar.year.tooltip": "年:", "challendge.panel.label": "チャレンジ", "challendge.pending": "保留", + "challendge.reclaimReserves.label": "備蓄を取り戻す", + "challendge.reclaimReserves.desc": "彼方から資源を回収します", "challendge.applyPending.label": "保留中の変更を適用 ({0})", "challendge.applyPending.desc": "直ちに保留としてマークされたチャレンジ/条件を有効にする", "challendge.1000Years.label": "1000年", @@ -279,12 +280,9 @@ "challendge.ironWill.label": "Iron Will", "challendge.ironWill.desc": "Iron Willはすこし隠されたチャレンジであなたはここをクリックする必要はありません。: ゲームをリセットして子猫たちなしでプレイしてください。", "challendge.ironWill.effect.desc": "何もなし", - "challendge.reclaimReserves.label": "備蓄を取り戻す", - "challendge.reclaimReserves.desc": "彼方から資源を回収します", "challendge.winterIsComing.label": "冬がきた", "challendge.winterIsComing.desc": "季節が冬期のみでゲームがリスタートします。

目標: ヘリオスに到着する。", "challendge.winterIsComing.effect.desc": "全体的に天気が良くなります。", - "challendge.btn.chronosphere.desc": "クロノスフィアによるリセットボーナスは得られません。", "challendge.btn.chronosphere.with.ironWill.desc": " クロノスフィアによるリセットボーナスは得られません。
警告: クロノスフィアからのリセットボーナスは Iron Wii を自動的に無効にします。", "challendge.btn.confirmation.title": "チャレンジの確認", "challendge.btn.confirmation.msg": "本当にゲームをリセットしてこのチャレンジを始めたいですか?", @@ -367,8 +365,8 @@ "effectsMgr.statics.factoryCostReduction.title": "工場のコスト削減", "effectsMgr.statics.factoryRefineRatio.title": "工場精製ボーナス", "effectsMgr.statics.faithRatioReligion.title": "信仰ボーナス", - "effectsMgr.statics.festivalRatio.title": "フェスティバルの効果", "effectsMgr.statics.festivalArrivalRatio.title": "フェスティバルの成長率", + "effectsMgr.statics.festivalRatio.title": "フェスティバルの効果", "effectsMgr.statics.gflopsConsumption.title": "ギガフロップ変換", "effectsMgr.statics.globalRelationsBonus.title": "同盟ボーナス", "effectsMgr.statics.globalResourceRatio.title": "最大資源ボーナス", @@ -398,7 +396,6 @@ "effectsMgr.statics.logHouseCostReduction.title": "ログハウスのコストを下げる", "effectsMgr.statics.lumberMillRatio.title": "木材加工場ボーナス", "effectsMgr.statics.lunarOutpostRatio.title": "月前哨基地ボーナス", - "effectsMgr.statics.luxuryConsuptionReduction.title": "贅沢品の消費減少", "effectsMgr.statics.luxuryHappinessBonus.title": "贅沢品の幸福ボーナス", "effectsMgr.statics.magnetoBoostRatio.title": "マグネトーブースト", "effectsMgr.statics.magnetoRatio.title": "生産ボーナス", @@ -475,9 +472,9 @@ "effectsMgr.statics.terraformingMaxKittens.title": "テラフォーミングステーションの子猫ボーナス", "effectsMgr.statics.theocracyFaithProductionBonus.title": "信仰値の生産ボーナス", "effectsMgr.statics.timeImpedance.title": "時間ペナルティ遅延", + "effectsMgr.statics.timeRatio.title": "時に関係したボーナス", "effectsMgr.statics.tradeCatpowerDiscount.title": "交易時キャットパワー割引", "effectsMgr.statics.tradeGoldDiscount.title": "交易時ゴールド割引", - "effectsMgr.statics.timeRatio.title": "時に関係したボーナス", "effectsMgr.statics.tradeRatio.title": "交易比率", "effectsMgr.statics.umbraBoostRatio.title": "ホーキング放射ハーベスターボーナス", "effectsMgr.statics.unhappinessRatio.title": "不幸度減少", @@ -639,7 +636,6 @@ "policy.liberalism.label": "自由主義", "policy.liberalism.desc": "平和で開放的な社会。すべての貿易パートナーとの関係を改善し、建物に必要なゴールドを少なくします。", "policy.liberty.label": "自由", - "policy.liberty.desc": "大規模で広範な社会に適しています。人口ペナルティを半減させます。これは将来利用可能なポリシーに影響します!", "policy.militarizeSpace.label": "宇宙の軍事化", "policy.militarizeSpace.desc": "空の占領を試みます。天文台の人工衛星による科学ボーナスが10%強化されます。", "policy.monarchy.label": "君主制", @@ -653,7 +649,6 @@ "policy.outerSpaceTreaty.label": "宇宙条約", "policy.outerSpaceTreaty.desc": "宇宙はCathの全種族共有の領域であることに合意します。 すべての貿易相手国との関係を強化します。", "policy.radicalXenophobia.label": "急進的排異種族主義", - "policy.radicalXenophobia.desc": "悪の宇宙人と悪のロボットの両方を拒絶する。聖なる虐殺の効果が2倍になります。", "policy.rationality.label": "合理主義", "policy.rationality.desc": "世界は根本的に理解可能であるという見解を受け入れましょう。科学力と鉄の生産に少しのボーナスを得ます。後で馬鹿に見えるかもしれませんが。", "policy.republic.label": "共和制", @@ -663,7 +658,6 @@ "policy.spaceBasedTerraforming.label": "宇宙基盤テラフォーミング", "policy.spaceBasedTerraforming.desc": "宇宙に巨大な鏡を置き、太陽光発電所の効率を高める宇宙鏡をアンロックします。", "policy.stoicism.label": "ストア派", - "policy.stoicism.desc": "禁欲主義者は、苦難には文句を言わずに耐えるべきだと教えています。贅沢品の消費を半減させます。", "policy.stripMining.label": "露天掘り", "policy.stripMining.desc": "あなたの鉱物生産を向上させるために丘を更地にします。", "policy.sustainability.label": "サスティナビリティ", @@ -673,7 +667,6 @@ "policy.theocracy.label": "星の理", "policy.theocracy.desc": "宇宙飛行士たちは空の向こうにておぞましいものを目撃してしまいました。聖職者たちがそれを引き受けることで、信仰生産を上昇させます。", "policy.tradition.label": "伝統", - "policy.tradition.desc": "小さな文化志向の社会に適しています。原稿価格を下げ、その効果を高めます。これは将来どのような政策が利用できるかに影響します!", "policy.transkittenism.label": "超子猫主義", "policy.transkittenism.desc": "子猫の身体を捨てAIと統合します。AIコアは2倍の効率を発揮し、AIレベルに悪影響はありません。", "policy.zebraRelationsAppeasement.label": "シマウマ族関係:融和政策", @@ -807,7 +800,6 @@ "religion.sacrificeBtn.desc": "ユニコーンを彼らの次元へ戻します。ジグラートの所持数に応じてユニコーンの涙を受け取ります。", "religion.sacrificeBtn.sacrifice.msg": "{0} 頭のユニコーンが生贄にされた。あなたは {1} 滴のユニコーンの涙を手に入れた!", "religion.transcend.confirmation.title": "超越しますか?", - "religion.transcend.confirmation.msg": "本当に悟りを捨てますか?\n\n悟りを捧げて特別な超越レベルに達することができます。\n\nレベルごとに、崇拝の変換 (銀河を崇拝する) 効率がアップします。\n\nレベルが上がるにつれ、より多くの悟りが必要です。\n\nこのボーナスはリセット後も蓄積され、受け継がれます。\n\nこのボタンをクリックすると、悟りとそれによる祈りの効率アップの効果が一部失われます。", "religion.transcend.msg.failure": "次のステップへの進捗: {0}%", "religion.transcend.msg.success": "あなたは死の淵を超越した T-level: {0}", "religion.transcendBtn.label": "超越する", @@ -817,7 +809,6 @@ "religion.tu.blackCore.flavor": "子猫が生贄にした骨で造られた。", "religion.tu.blackLibrary.label": "黒の図書館", "religion.tu.blackLibrary.desc": "すべての黒い図書館はリヴァイアシアヌス経典を2%向上させます。この値は、ユニコーンの墓場によってさらに改善されます。", - "religion.tu.blackLibary.flavor": "わざと暗くして書物を読めないようにしているのかもしれません。", "religion.tu.blackNexus.label": "黒い連鎖", "religion.tu.blackNexus.desc": "時間結晶からレリックを精製する比率を向上させます。
各黒い連鎖は、黒いピラミッドの数に応じてレリックの精製効率を増加させます。
レリックステーションの効果も上昇します。", "religion.tu.blackNexus.flavor": "空から見る目", @@ -834,7 +825,6 @@ "religion.tu.darkNova.desc": "全体のエネルギー生産を2%向上させます。", "religion.tu.darkNova.flavor": "星々は死に絶えた。我々の希望と夢もまた...", "religion.tu.holyGenocide.label": "聖なる虐殺", - "religion.tu.holyGenocide.desc": "そして涙はこぼれ落ちない", "religion.tu.holyGenocide.flavor": "私たちは無限の黒い海の真ん中にある静かな無知の島で生き続けており、遥かな航海に乗り出すべくいわれも無かった。", "religion.tu.singularity.label": "事象の地平面", "religion.tu.singularity.desc": "全体の資源最大値を10%向上させます。", @@ -987,12 +977,9 @@ "resources.zebras.title": "シマウマ族", "resources.sorrow.full": "悲哀の黒い水", "resources.sorrow.short": "悲哀の黒い水", - "gift.get": "ホッホッホッ! 古の神々からギフトボックスが届きました!", - "gift.repaire": "古の神々によりギフトボックスが修復された。", "gift.resources": "{0} {1} を手に入れた!", "gift.apocrypha": "アポクリファボーナスが {0}%増加!", "gift.transcendence": "超越レベルが4上がった!", - "gift.metaphysics": "{0} が解放されました!", "save.export.msg": "セーブデータのエクスポートに成功しました!", "save.import.confirmation.msg": "保存しますか? データは上書きされてしまいます!", "save.import.msg": "セーブデータのインポートに成功しました!", @@ -1325,7 +1312,6 @@ "time.cfu.ressourceRetrieval.label": "資源回復", "time.cfu.ressourceRetrieval.desc": "時間結晶を砕いた時、1年間の資源一部を取り戻します。", "time.cfu.temporalAccelerator.label": "時空加速器", - "time.cfu.temporalAccelerator.desc": "変位エネルギーの生成を5%向上させます。", "time.cfu.temporalBattery.label": "時空電池", "time.cfu.temporalBattery.desc": "変位エネルギーの最大値を25%向上させます。", "time.cfu.temporalImpedance.label": "タイム インピーダンス", @@ -1419,8 +1405,6 @@ "trade.bcoin.crash": "黒の見えざる手をからかう", "trade.bcoin.crash.desc": "ブラックコイン市場の暴落を強制する", "trade.correct.bcoin": "巨大な暗号市場の是正が行われました。", - "trade.embassy.open": "大使館を開設", - "trade.embassy": "大使館レベル ({0})", "trade.embassy.desc": "大使館を建てることで外交関係を向上させます。", "trade.embassy.pinned": "固定", "trade.embassy.unpinned": "固定解除", @@ -1476,7 +1460,6 @@ "ui.option.hide.bgimage": "背景画像を非表示にする (テーマによって使用されている場合のみ)", "ui.option.tooltips.right": "ツールチップを右の列に移動", "ui.option.more": "もっと表示...", - "ui.option.no.confirm": "すべてのジョブをクリアする際、ポリシーの調査、またはすべてを購入/売却する(Shift-click) 際に確認しない", "ui.option.iw.smelter": "Iron Willモードの際、鉄の最大値の95%に達した際に溶鉱炉を自動的にOFFにする", "ui.option.disable.telemetry": "ゲームのテレメトリを無効にする", "ui.option.enable.redshift": "オフライン中の進行を有効にする", @@ -1521,7 +1504,6 @@ "console.filter.ivoryMeteor": "象牙隕石", "console.filter.unicornRift": "ユニコーンリフト", "console.filter.alicornRift": "アリコーンリフト", - "console.filter.tc": "時間結晶", "console.filter.faith": "信仰値", "village.bonus.desc.chemist": "化学クラフトボーナス", "village.bonus.desc.engineer": "クラフトボーナス", @@ -1758,7 +1740,6 @@ "workshop.barges.label": "荷船", "workshop.barges.desc": "港がより多くの石炭を貯蔵します。", "workshop.biofuel.label": "バイオ燃料加工", - "workshop.biofuel.desc": "生物学研究所がキャットニップをオイルに変換するようになります。", "workshop.bolas.label": "ボーラ", "workshop.bolas.desc": "石の錘でできた投擲武器です。狩人は2倍効果が上がります。", "workshop.bolas.flavor": "仕込み編み糸だ", @@ -1990,7 +1971,6 @@ "workshop.spaceEngineers.label": "宇宙技術者", "workshop.spaceEngineers.desc": "技術者の効果を向上させます。", "workshop.spaceManufacturing.label": "宇宙製造業", - "workshop.spaceManufacturing.desc": "工場が宇宙エレベーターと軌道上施設にボーナスを与えます。", "workshop.starlink.label": "スターリンク", "workshop.starlink.desc": "すべてのデータセンターは、生物学研究所に追加の1%ボーナスを提供します", "workshop.stasisChambers.label": "ステイシスチャンバー", diff --git a/res/i18n/crowdin/ko.json b/res/i18n/crowdin/ko.json index 8d3de6f00b..df866452d7 100644 --- a/res/i18n/crowdin/ko.json +++ b/res/i18n/crowdin/ko.json @@ -209,7 +209,6 @@ "buildings.workshop.desc": "기술 개발 및 제작을 담당하는 건물. 제작 효율을 6%p 증가시킵니다.", "buildings.workshop.flavor": "첫 출근 시 무료 장난감 증정", "buildings.zebraForge.label": "얼룩말 대장간", - "buildings.zebraForge.desc": "블러드 스톤의 공예와 T-미스릴을 해금합니다.", "buildings.zebraOutpost.label": "얼룩말 전초기지", "buildings.zebraOutpost.desc": "사냥 탐사를 위한 기지를 제공합니다. 매 레벨 당 탐사 효율이 5% 증가합니다.", "buildings.zebraWorkshop.label": "얼룩말 제작소", @@ -258,6 +257,8 @@ "calendar.year.tooltip": "연도:", "challendge.panel.label": "도전", "challendge.pending": "대기중", + "challendge.reclaimReserves.label": "예비금 회수", + "challendge.reclaimReserves.desc": "저 너머에서의 자원 회수", "challendge.applyPending.label": "대기중인 변경점들 적용하기 ({0})", "challendge.applyPending.desc": "보류로 표시한 도전 과제/조건들을 즉시 켜기", "challendge.1000Years.label": "1000년", @@ -279,12 +280,9 @@ "challendge.ironWill.label": "철묘 모드", "challendge.ironWill.desc": "철묘 모드는 조금 숨겨져있는 느낌의 도전과제이며 여길 눌러서 활성화할 필요는 없습니다. 게임을 초기화하고 고양이 없이 플레이하세요.", "challendge.ironWill.effect.desc": "아무것도 없음.", - "challendge.reclaimReserves.label": "예비금 회수", - "challendge.reclaimReserves.desc": "저 너머에서의 자원 회수", "challendge.winterIsComing.label": "겨울이 왔다", "challendge.winterIsComing.desc": "일년 내내 겨울인 상태로 게임을 재시작합니다. (캣닢 생산에 파라곤 보너스 또한 적용되지 않습니다.)

목표: 헬리오스 도달.", "challendge.winterIsComing.effect.desc": "날씨가 따듯해질 확률이 올라가고 추워질 확률이 낮아집니다.", - "challendge.btn.chronosphere.desc": " 시간 구체의 초기화 보너스를 획득하지 못합니다.", "challendge.btn.chronosphere.with.ironWill.desc": "시간 구체의 초기화 보너스를 획득하지 못합니다.
경고: 시간 구체의 초기화 보너스는 자동으로 철묘 모드를 비활성화합니다.", "challendge.btn.confirmation.title": "도전 확인", "challendge.btn.confirmation.msg": "게임을 초기화하고 도전을 시작하시겠습니까?", @@ -367,8 +365,8 @@ "effectsMgr.statics.factoryCostReduction.title": "공장 비용 감소", "effectsMgr.statics.factoryRefineRatio.title": "공장 정제 보너스", "effectsMgr.statics.faithRatioReligion.title": "신앙 보너스", - "effectsMgr.statics.festivalRatio.title": "축제 효과", "effectsMgr.statics.festivalArrivalRatio.title": "축제 성장률", + "effectsMgr.statics.festivalRatio.title": "축제 효과", "effectsMgr.statics.gflopsConsumption.title": "GFlops 변환", "effectsMgr.statics.globalRelationsBonus.title": "관계 보너스", "effectsMgr.statics.globalResourceRatio.title": "자원 한도 보너스", @@ -398,7 +396,6 @@ "effectsMgr.statics.logHouseCostReduction.title": "통나무집 비용 감소", "effectsMgr.statics.lumberMillRatio.title": "제제소 보너스", "effectsMgr.statics.lunarOutpostRatio.title": "달 전초기지 보너스", - "effectsMgr.statics.luxuryConsuptionReduction.title": "사치품 소비량 감소", "effectsMgr.statics.luxuryHappinessBonus.title": "사치품 행복도 보너스", "effectsMgr.statics.magnetoBoostRatio.title": "마그네토 부스트", "effectsMgr.statics.magnetoRatio.title": "제작 보너스", @@ -475,9 +472,9 @@ "effectsMgr.statics.terraformingMaxKittens.title": "테라포밍 정거장 고양이 보너스", "effectsMgr.statics.theocracyFaithProductionBonus.title": "신앙 생산력 보너스", "effectsMgr.statics.timeImpedance.title": "시간 페널티 지연", + "effectsMgr.statics.timeRatio.title": "시간 흐름 보너스", "effectsMgr.statics.tradeCatpowerDiscount.title": "무역 필요 묘력 감소", "effectsMgr.statics.tradeGoldDiscount.title": "무역 필요 금 감소", - "effectsMgr.statics.timeRatio.title": "시간 흐름 보너스", "effectsMgr.statics.tradeRatio.title": "거래 비율", "effectsMgr.statics.umbraBoostRatio.title": "호킹 방사선 수집기 보너스", "effectsMgr.statics.unhappinessRatio.title": "불행함 감소", @@ -639,7 +636,6 @@ "policy.liberalism.label": "자유주의", "policy.liberalism.desc": "평화롭고 개방된 사회입니다. 모든 무역 부족과 더 좋은 관계를 맺는 동시에 건설에 필요한 금이 감소합니다.", "policy.liberty.label": "자유", - "policy.liberty.desc": "크고 값진 사회를 구성하는데 좋습니다. 인구 패널티가 반감됩니다. 이 정책을 선택하면 미래에 영향을 끼칠 수 있습니다!", "policy.militarizeSpace.label": "우주 파병", "policy.militarizeSpace.desc": "이제부터 하늘은 우리가 점령한다. 인공위성의 천문대 과학력 보너스가 10% 증가합니다.", "policy.monarchy.label": "군주제", @@ -653,7 +649,6 @@ "policy.outerSpaceTreaty.label": "외우주 조약", "policy.outerSpaceTreaty.desc": "캣스의 모든 종족이 우주를 공유하는 데에 동의합니다. 모든 종족과의 관계가 향상됩니다.", "policy.radicalXenophobia.label": "급진적 이종족혐오", - "policy.radicalXenophobia.desc": "사악한 외계인과 사악한 로봇을 거부합니다. 거룩한 학살의 효과가 두 배로 적용됩니다.", "policy.rationality.label": "합리주의", "policy.rationality.desc": "세상의 근본 법칙을 이해할 수 있다는 관점을 받아들입니다. 나중에는 우습게 보일 수 있지만 어쨌든 철과 과학력의 생산량에 약간의 보너스를 획득합니다.", "policy.republic.label": "공화국", @@ -663,7 +658,6 @@ "policy.spaceBasedTerraforming.label": "우주 기반 테라포밍", "policy.spaceBasedTerraforming.desc": "하늘에 거대한 거울을 매달아 태양광 발전기의 효과를 상승시킵니다. 우주 거울을 해금합니다.", "policy.stoicism.label": "금욕주의", - "policy.stoicism.desc": "우리 스토아 학파는 불만 없이 고난을 받아들여야 한다고 가르칩니다. 사치 자원의 소비량이 절반으로 감소합니다.", "policy.stripMining.label": "노천 채굴", "policy.stripMining.desc": "광물 생산량을 향상시키기 위해 언덕을 갈아엎습니다.", "policy.sustainability.label": "환경 지속 가능성", @@ -673,7 +667,6 @@ "policy.theocracy.label": "별의 통치", "policy.theocracy.desc": "당신의 우주 비행사들은 먼 하늘에서 끔찍한 것들을 목격했습니다. 성직자들에게 맡겨, 신앙 생산량을 증가시킵니다.", "policy.tradition.label": "전통", - "policy.tradition.desc": "소규모의 문화 기반 사회에 적합합니다. 원고의 가격을 낮추고 효과를 증가시킵니다. 이후 채택 가능한 정책에 영향을 미칩니다.", "policy.transkittenism.label": "초묘(超猫)주의", "policy.transkittenism.desc": "고양이의 삶을 포기하고 인공지능과 병합합니다. 인공지능 코어의 효과가 두 배로 증가하고, 인공지능 레벨에 따른 단점이 사라집니다.", "policy.zebraRelationsAppeasement.label": "얼룩말 관계: 회유", @@ -807,7 +800,6 @@ "religion.sacrificeBtn.desc": "유니콘을 유니콘 차원으로 보냅니다. 유니콘 눈물은 지구라트 하나 당 하나를 얻습니다.", "religion.sacrificeBtn.sacrifice.msg": "{0} 마리의 유니콘이 희생되었습니다. {1} 개의 유니콘 눈물을 얻었습니다!", "religion.transcend.confirmation.title": "초월?", - "religion.transcend.confirmation.msg": "정말 통찰의 일부를 버리시겠습니까?\n\n당신은 통찰의 일부를 희생함으로써 특별한 초월 단계에 이를 수 있습니다.\n\n각 단계마다 숭배 전환의 효과가 높아질 것입니다(별을 숭배).\n\n모든 레벨에서 희생에 더 많은 비율의 통찰을 요구합니다.\n\n이 보너스는 누적되며 초기화 과정을 거칩니다.\n\n\"이 버튼을 누르면 통찰의 일부와 찬양 효과가 제거됩니다.\"", "religion.transcend.msg.failure": "한 걸음 더 가까이: {0}%", "religion.transcend.msg.success": "고양이의 한계를 초월하였습니다. 초월 단계: {0}", "religion.transcendBtn.label": "초월", @@ -817,7 +809,6 @@ "religion.tu.blackCore.flavor": "희생된 고양이의 뼈로 지어졌습니다.", "religion.tu.blackLibrary.label": "검은 도서관", "religion.tu.blackLibrary.desc": "검은 도서관 하나당 고문서 레비아타니아우스의 효과를 2% 증가시킵니다. 이 효과는 유니콘 묘지에 의해 증폭될 수 있습니다.", - "religion.tu.blackLibary.flavor": "아마 너무 어두워서 마음대로 못 읽을 걸.", "religion.tu.blackNexus.label": "검은 연결체", "religion.tu.blackNexus.desc": "시간 결정을 유물로 정제하는 비율을 향상시킵니다.
모든 검은 연결체는 검은 피라미드 개수만큼 유물 정제 효과를 증가시킵니다.
이 효과는 유물 정거장의 효과 또한 높입니다.", "religion.tu.blackNexus.flavor": "하늘의 눈", @@ -834,7 +825,6 @@ "religion.tu.darkNova.desc": "전체 전력 생산량을 2% 증가시킵니다", "religion.tu.darkNova.flavor": "이 별은 죽었습니다. 우리의 꿈과 희망처럼요.", "religion.tu.holyGenocide.label": "거룩한 학살", - "religion.tu.holyGenocide.desc": "그리고 눈물은 흘러내리지 않을 것입니다.", "religion.tu.holyGenocide.flavor": "우리는 무한한 가능성의 검은 대양을 두고도 무지한 섬에서 살아가고 있다. 우리는 장막 너머를 들여다보려 하지 않았다.", "religion.tu.singularity.label": "사건의 지평선", "religion.tu.singularity.desc": "보편적인 자원 제한 10% 증가하다", @@ -987,12 +977,9 @@ "resources.zebras.title": "얼룩말", "resources.sorrow.full": "검은 비애", "resources.sorrow.short": "검정색 액화 비애", - "gift.get": "XOXOXO! 고대신이 당신에게 선물 상자를 보냈습니다!", - "gift.repaire": "고대신이 당신의 선물 박스를 수리했습니다.", "gift.resources": "{0} {1} 획득!", "gift.apocrypha": "아포크리파 보너스가 {0}% 상승했습니다!", "gift.transcendence": "초월 단계가 4 상승했습니다!", - "gift.metaphysics": "{0} 잠금 해제!", "save.export.msg": "세이브 내보내기 성공!", "save.import.confirmation.msg": "데이터를 기존 데이터에 덮어씌워집니다. 진행합니까?", "save.import.msg": "세이브 불러오기 성공!", @@ -1325,7 +1312,6 @@ "time.cfu.ressourceRetrieval.label": "자원 수집기", "time.cfu.ressourceRetrieval.desc": "시간 결정을 연소할 때 연간 획득한 자원량의 일부를 복구합니다.", "time.cfu.temporalAccelerator.label": "시간 가속기", - "time.cfu.temporalAccelerator.desc": "시간 에너지 생산량이 5% 증가합니다.", "time.cfu.temporalBattery.label": "시간 전지", "time.cfu.temporalBattery.desc": "시간 에너지 저장 용량이 25% 증가합니다.", "time.cfu.temporalImpedance.label": "시간 저항", @@ -1419,8 +1405,6 @@ "trade.bcoin.crash": "\"보이지 않는 검은 손\"을 약올리기", "trade.bcoin.crash.desc": "강제로 흑전 시장을 붕괴", "trade.correct.bcoin": "거대한 비밀 시장의 정리가 있었습니다", - "trade.embassy.open": "대사관 개관", - "trade.embassy": "대사관 레벨 ({0})", "trade.embassy.desc": "대사관을 설립하여 외교 관계를 개선합니다.", "trade.embassy.pinned": "고정", "trade.embassy.unpinned": "고정", @@ -1476,7 +1460,6 @@ "ui.option.hide.bgimage": "배경 이미지 (해당되는 색상 구성표의 경우)", "ui.option.tooltips.right": "툴팁 우측 열로 옮기기", "ui.option.more": "자세히..", - "ui.option.no.confirm": "모든 직업 해제, 정책 연구, 전부 구매/판매 시 확인 안 함(Shift-클릭)", "ui.option.iw.smelter": "철묘 모드에서 철이 최대치의 95%가 되면 용광로를 정지함", "ui.option.disable.telemetry": "게임 원격 측정 끄기", "ui.option.enable.redshift": "오프라인 진행 사용", @@ -1521,7 +1504,6 @@ "console.filter.ivoryMeteor": "상아 운석", "console.filter.unicornRift": "유니콘 균열", "console.filter.alicornRift": "알리콘 균열", - "console.filter.tc": "시간 결정", "console.filter.faith": "신앙", "village.bonus.desc.chemist": "화학물 제작 보너스", "village.bonus.desc.engineer": "제작 보너스", @@ -1758,7 +1740,6 @@ "workshop.barges.label": "바지선", "workshop.barges.desc": "항구가 석탄을 더 많이 저장합니다", "workshop.biofuel.label": "바이오연료 가공", - "workshop.biofuel.desc": "생물연구소가 캣닢을 석유로 가공합니다", "workshop.bolas.label": "사냥돌", "workshop.bolas.desc": "돌이 무게추가 되는 투척 무기. 사냥꾼이 두 배 효율적이게 합니다", "workshop.bolas.flavor": "무기화한 실뭉치", @@ -1990,7 +1971,6 @@ "workshop.spaceEngineers.label": "우주 기술자", "workshop.spaceEngineers.desc": "기술자들의 효율이 증가합니다.", "workshop.spaceManufacturing.label": "우주 제조 기술", - "workshop.spaceManufacturing.desc": "공장이 우주 엘리베이터와 궤도 배열기에 보너스를 제공합니다.", "workshop.starlink.label": "스타 링크", "workshop.starlink.desc": "데이터 센터가 생체 연구소에 보너스를 1% 제공합니다.", "workshop.stasisChambers.label": "정체실", diff --git a/res/i18n/crowdin/nl.json b/res/i18n/crowdin/nl.json index b7a9840702..91c089a76b 100644 --- a/res/i18n/crowdin/nl.json +++ b/res/i18n/crowdin/nl.json @@ -209,7 +209,6 @@ "buildings.workshop.desc": "Zorgt voor een uitgebreid assortiment aan verbeteringen. Verbetert bouw effectiviteit met 6%", "buildings.workshop.flavor": "Gratis speeltjes voor de arbeiders", "buildings.zebraForge.label": "Zebra Smederij", - "buildings.zebraForge.desc": "Ontgrendelt het ambacht van bloedstenen en t-mythril", "buildings.zebraOutpost.label": "Zebra Uitpost", "buildings.zebraOutpost.desc": "Biedt een basis voor de jachtexpedities. Elk niveau van de upgrade verbetert de expeditie met 5%", "buildings.zebraWorkshop.label": "Zebra Werkplaats", @@ -258,6 +257,7 @@ "calendar.year.tooltip": "Jaar:", "challendge.panel.label": "Uitdagingen", "challendge.pending": "In afwachting", + "challendge.reclaimReserves.label": "Terugvorderen reserves", "challendge.applyPending.label": "Wijzigingen in behandeling nemen ({0})", "challendge.applyPending.desc": "Schakel uitdagingen/voorwaarden die als in behandeling zijn gemarkeerd onmiddellijk in", "challendge.1000Years.label": "1000 jaar", @@ -279,7 +279,6 @@ "challendge.ironWill.label": "IJzeren Wil", "challendge.ironWill.desc": "Ijzeren Wil is een beetje verborgen uitdaging. Je hoeft niet hier te klikken om deze in te schakelen: reset het spel en speel zonder kittens.", "challendge.ironWill.effect.desc": "Niets", - "challendge.reclaimReserves.label": "Terugvorderen reserves", "challendge.winterIsComing.effect.desc": "Warme seizoenen zijn waarschijnlijker, en koude seizoenen zijn zeldzamer.", "challendge.btn.chronosphere.with.ironWill.desc": " You won't gain reset bonus from chronospheres.
WARNING: the reset bonus from chronospheres will automatically disable IW.", "challendge.btn.confirmation.msg": "Weet je het zeker dat je deze uitdaging wilt starten door de game te resetten?", @@ -350,8 +349,8 @@ "effectsMgr.statics.factoryCostReduction.title": "Vermindering kosten van Fabriek", "effectsMgr.statics.factoryRefineRatio.title": "Raffineerbonus van Fabriek", "effectsMgr.statics.faithRatioReligion.title": "Geloofsbonus", - "effectsMgr.statics.festivalRatio.title": "Festivaleffecten", "effectsMgr.statics.festivalArrivalRatio.title": "Festival groei factor", + "effectsMgr.statics.festivalRatio.title": "Festivaleffecten", "effectsMgr.statics.gflopsConsumption.title": "GFlops consumption", "effectsMgr.statics.globalRelationsBonus.title": "Relatie bonus", "effectsMgr.statics.globalResourceRatio.title": "Maximum grondstoffen bonus", @@ -381,7 +380,6 @@ "effectsMgr.statics.logHouseCostReduction.title": "Blokhut kosten reductie", "effectsMgr.statics.lumberMillRatio.title": "Houtzagerijbonus", "effectsMgr.statics.lunarOutpostRatio.title": "Maan buitenpost bonus", - "effectsMgr.statics.luxuryConsuptionReduction.title": "Vermindering van luxegoederen consumptie", "effectsMgr.statics.luxuryHappinessBonus.title": "Tevredenheidsbonus door luxegoederen", "effectsMgr.statics.magnetoBoostRatio.title": "Magneto boost", "effectsMgr.statics.magnetoRatio.title": "Productiebonus", @@ -412,8 +410,8 @@ "effectsMgr.statics.t3CraftRatio.title": "Klasse 3 ingenieur's vakkennis", "effectsMgr.statics.temporalParadoxDayBonus.title": "Dag in tijdsparadox", "effectsMgr.statics.theocracyFaithProductionBonus.title": "Geloof productie bonus", - "effectsMgr.statics.tradeCatpowerDiscount.title": "Katkracht handels korting", "effectsMgr.statics.timeRatio.title": "Chronomancy bonus", + "effectsMgr.statics.tradeCatpowerDiscount.title": "Katkracht handels korting", "effectsMgr.statics.unicornsGlobalRatio.title": "Eenhoornbonus", "effectsMgr.statics.unicornsRatioReligion.title": "Eenhoornbonus", "effectsMgr.statics.uplinkDCRatio.title": "Datacentrum synergiebonus", @@ -501,7 +499,6 @@ "policy.knowledgeSharing.desc": "Je wetenschappers zullen naar vreemde landen reizen, waardoor het wetenschapsinkomen lichtelijk stijgt.", "policy.liberalism.label": "Liberalisme", "policy.liberty.label": "Vrijheid", - "policy.liberty.desc": "Goed voor grote, uitgebreide samenlevingen. Halveert de bevolkingsstraf. Dit zal beïnvloeden welke soorten beleid er in de toekomst beschikbaar zijn!", "policy.monarchy.label": "Monarchie", "policy.mysticism.label": "Mysticisme", "policy.openWoodlands.label": "Open Bosland", @@ -512,7 +509,6 @@ "policy.socialism.desc": "Heeft geen effect", "policy.technocracy.label": "Technocratie", "policy.tradition.label": "Traditie", - "policy.tradition.desc": "Goed voor kleine, op cultuur georiënteerde samenlevingen. Vermindert de prijs voor manuscripten en verhoogt hun effect. Dit zal beïnvloeden welke beleidskeuzes in de toekomst beschikbaar zullen zijn!", "policy.transkittenism.label": "Transkittenisme", "policy.transkittenism.desc": "Geef je kittenheid op en word één met KI. KI kernen worden twee keer zo effectief, en er is geen minpunt aan KI level.", "policy.zebraRelationsBellicosity.desc": "Sta op tegen de zebra's, waardoor je handel met hen slechter wordt, maar je het respect verdient van andere rassen.", @@ -689,7 +685,6 @@ "resources.sorrow.full": "Zwart vloeibaar leed", "resources.sorrow.short": "BLS", "gift.resources": "Kreeg {0} {1}!", - "gift.metaphysics": "{0} ontgrendeld!", "science.toggleResearched.label": "Verstop onderzochte technologie", "science.acoustics.label": "Akoestiek", "science.acoustics.effectDesc": "Ontgrendelt kapellen", @@ -838,7 +833,6 @@ "tab.name.workshop": "Werkplaats", "time.AccelerateTimeBtn.tooltip.accelerated": "Versneld tijdsverloop", "time.cfu.ressourceRetrieval.desc": "Haal een gedeelte van jouw jaarlijkse middelen op wanneer je TC verbrandt", - "time.cfu.temporalAccelerator.desc": "Verbeterd flux energie generatie met 5%", "time.cfu.temporalImpedance.label": "Tijd impedantie", "time.cfu.temporalImpedance.desc": "Vertraag het effect van Donkere Toekomst penalty met 1000 jaar.", "time.cfu.timeBoiler.label": "Tijdboiler", @@ -897,8 +891,6 @@ "trade.bcoin.sell.desc": "Verkoop je blackcoins en krijg relikwieën terug", "trade.bcoin.sell.msg": "Je hebt {0} relikwieën", "trade.bcoin.crash": "Erger de Onzichtbare Zwarte Hand", - "trade.embassy.open": "Open ambassade", - "trade.embassy": "Ambassadeniveau ({0})", "trade.embassy.desc": "Verbeter je diplomatieke relaties door een ambassade op te richten", "trade.embassy.unpinned": "Losgemaakt", "ui.filter.available": "Beschikbaar", @@ -934,7 +926,6 @@ "console.filter.meteor": "Meteoren", "console.filter.ivoryMeteor": "Ivoormeteoren", "console.filter.alicornRift": "Alicorn Kloven", - "console.filter.tc": "Tijdskristallen", "village.bonus.desc.chemist": "Chemische bouw bonus", "village.bonus.desc.engineer": "Productiebonus", "village.bonus.desc.manager": "Jachtbonus", @@ -1069,7 +1060,6 @@ "workshop.astrophysicists.desc": "Elke geleerde zal nu sterrenkaarten genereren.", "workshop.barges.desc": "Havens slaan meer steenkool op", "workshop.biofuel.label": "Biobrandstof verwerking", - "workshop.biofuel.desc": "Biolabs will convert catnip into oil", "workshop.cargoShips.label": "Vergrote lading", "workshop.chronoEngineers.label": "Chrono-ingenieur", "workshop.chronoEngineers.desc": "Improves Engineer's effectiveness", diff --git a/res/i18n/crowdin/no.json b/res/i18n/crowdin/no.json index e1cdb66c19..946144b001 100644 --- a/res/i18n/crowdin/no.json +++ b/res/i18n/crowdin/no.json @@ -236,7 +236,6 @@ "challendge.winterIsComing.label": "Vinteren kjem", "challendge.winterIsComing.desc": "Nullstill spelet med berre vinter.

Mål: Nå Helios.", "challendge.winterIsComing.effect.desc": "Veret blir i snitt betre.", - "challendge.btn.chronosphere.desc": " Du får ikkje nullstillingsbonusar frå kronosfærar.", "challendge.btn.chronosphere.with.ironWill.desc": " Du får ikkje nullstillingsbonusar frå kronosfærar.
ÅTVARING: nullstillingsbonusen frå kronosfærar vil slå av jarnvilje.", "challendge.btn.desc": "
Tjen: {0}

Spelet ditt blir nullstillt for å starta denne utfordringa. {1}", "challendge.btn.log.message.on.complete": "Gratulerer! Du klarte utfordringa {0}.", @@ -935,7 +934,6 @@ "workshop.barges.label": "Flåter", "workshop.barges.desc": "Meir hamneplass for kol", "workshop.biofuel.label": "Biodrivstoff", - "workshop.biofuel.desc": "Bio-laboratorium kan laga kattemynte om til olje", "workshop.bolas.label": "Lasso", "workshop.cadSystems.label": "Digitalt design", "workshop.caravanserai.label": "Gjestegard", diff --git a/res/i18n/crowdin/pl.json b/res/i18n/crowdin/pl.json index 7d33c13c47..35a728c6cb 100644 --- a/res/i18n/crowdin/pl.json +++ b/res/i18n/crowdin/pl.json @@ -209,7 +209,6 @@ "buildings.workshop.desc": "Zapewnia szeroką gamę ulepszeń. Poprawia wydajność wytwarzania o 6%", "buildings.workshop.flavor": "Darmowe zabawki dla pracowników", "buildings.zebraForge.label": "Kuźnia Zebry", - "buildings.zebraForge.desc": "Odblokowuje tworzenie krwawych kamieni i t-mytrylu", "buildings.zebraOutpost.label": "Placówka Zebry", "buildings.zebraOutpost.desc": "Stanowi bazę dla wypraw myśliwskich. Każdy poziom ulepszenia poprawia skuteczność wyprawy o 5%", "buildings.zebraWorkshop.label": "Warsztaty Zebry", @@ -258,6 +257,8 @@ "calendar.year.tooltip": "Rok:", "challendge.panel.label": "Wyzwania", "challendge.pending": "Oczekujące", + "challendge.reclaimReserves.label": "Odzyskaj rezerwy", + "challendge.reclaimReserves.desc": "Odzyskaj zasoby z zaświatów", "challendge.applyPending.label": "Zastosuj Oczekujące Zmiany ({0})", "challendge.applyPending.desc": "Włącz Wyzwania/Warunki oznaczone jako Oczekujące natychmiast", "challendge.1000Years.label": "1000 lat", @@ -279,12 +280,9 @@ "challendge.ironWill.label": "Żelazna Wola", "challendge.ironWill.desc": "Żelazna Wola jest takim trochę ukrytym wyzwaniem i nie musisz nic klikać aby go aktywować: zrestartuj grę i graj bez kotków.", "challendge.ironWill.effect.desc": "Nic", - "challendge.reclaimReserves.label": "Odzyskaj rezerwy", - "challendge.reclaimReserves.desc": "Odzyskaj zasoby z zaświatów", "challendge.winterIsComing.label": "Nadchodzi zima", "challendge.winterIsComing.desc": "Zrestartuj grę z samymi zimami.

Cel: Dotarcie do Heliosa.", "challendge.winterIsComing.effect.desc": "Pogoda się globalnie polepsza.", - "challendge.btn.chronosphere.desc": " Nie będziesz otrzymywać bonusu z restartu od chronosfer.", "challendge.btn.chronosphere.with.ironWill.desc": " Nie będziesz otrzymywać bonusu z restartu od chronosfer.
OSTRZEŻENIE: bonus z restartu z chronosfer automatycznie wyłączy tryb Żelaznej Woli.", "challendge.btn.confirmation.title": "Potwierdzenie wyzwania", "challendge.btn.confirmation.msg": "Jesteś pewien że chcesz rozpocząć te wyzwanie restartując grę?", @@ -367,8 +365,8 @@ "effectsMgr.statics.factoryCostReduction.title": "Redukcja kosztów fabryk", "effectsMgr.statics.factoryRefineRatio.title": "Premia do rafinacji fabryk", "effectsMgr.statics.faithRatioReligion.title": "Premia do wiary", - "effectsMgr.statics.festivalRatio.title": "Efekty festiwalu", "effectsMgr.statics.festivalArrivalRatio.title": "Tempo wzrostu festiwalu", + "effectsMgr.statics.festivalRatio.title": "Efekty festiwalu", "effectsMgr.statics.gflopsConsumption.title": "Zużycie GFlops", "effectsMgr.statics.globalRelationsBonus.title": "Bonus relacji", "effectsMgr.statics.globalResourceRatio.title": "Premia za maksymalne zasoby", @@ -398,7 +396,6 @@ "effectsMgr.statics.logHouseCostReduction.title": "Redukcja kosztów Drewnianego Domu", "effectsMgr.statics.lumberMillRatio.title": "Premia do tartaku", "effectsMgr.statics.lunarOutpostRatio.title": "Premia do posterunku księżycowego", - "effectsMgr.statics.luxuryConsuptionReduction.title": "Redukcja zużycia materiałów luksusowych", "effectsMgr.statics.luxuryHappinessBonus.title": "Bonus szczęścia z towarów luksusowych", "effectsMgr.statics.magnetoBoostRatio.title": "Iskrownik podnieść", "effectsMgr.statics.magnetoRatio.title": "Premia produkcyjna", @@ -474,9 +471,9 @@ "effectsMgr.statics.terraformingMaxKittens.title": "Bonus Stacji Terra formacji kociąt", "effectsMgr.statics.theocracyFaithProductionBonus.title": "Bonus do produkcji wiary", "effectsMgr.statics.timeImpedance.title": "Kara czasowa", + "effectsMgr.statics.timeRatio.title": "Premia do przepływu czasowego", "effectsMgr.statics.tradeCatpowerDiscount.title": "Zniżka handlu siłą kociąt", "effectsMgr.statics.tradeGoldDiscount.title": "Zniżka handlu złotem", - "effectsMgr.statics.timeRatio.title": "Premia do przepływu czasowego", "effectsMgr.statics.tradeRatio.title": "Stosunek handlu", "effectsMgr.statics.umbraBoostRatio.title": "Bonus HR Żniwiarza", "effectsMgr.statics.unhappinessRatio.title": "Redukcja niezadowolenia", @@ -638,7 +635,6 @@ "policy.liberalism.label": "Liberalizm", "policy.liberalism.desc": "Pokojowe i otwarte społeczeństwo. Zyskujesz lepsze relacje handlowe z innymi cywilizacjami, a budynki wymagają mniej złota.", "policy.liberty.label": "Wolność", - "policy.liberty.desc": "Odpowiednie dla dużych, ekspansywnych społeczeństw. Zmniejsza karę za przeludnienie o połowę. Wpłynie na to, jakie doktryny będą dostępne w przyszłości!", "policy.militarizeSpace.label": "Zmilitaryzuj Kosmos", "policy.militarizeSpace.desc": "Spróbuj przejąć niebo. Bonus naukowy twoich satelit do obserwatoriów jest o 10% potężniejszy.", "policy.monarchy.label": "Monarchia", @@ -652,7 +648,6 @@ "policy.outerSpaceTreaty.label": "Traktat Przestrzeni Kosmicznej", "policy.outerSpaceTreaty.desc": "Przyznaj, że kosmos jest wspólną przestrzenią życiową wszystkich ras Cath, polepszając stosunki z partnerami handlowymi.", "policy.radicalXenophobia.label": "Radykalna Ksenofobia", - "policy.radicalXenophobia.desc": "Odrzuć zarówno złych kosmitów, jak i złe robotów. Święta wojna jest dwukrotnie skuteczniejsza.", "policy.rationality.label": "Racjonalizm", "policy.rationality.desc": "Zaakceptuj pogląd, że świat może być fundamentalnie zrozumiany. Zdobądź małą premię do nauki i produkcji żelaza, chociaż możesz wyglądać głupio później.", "policy.republic.label": "Republika", @@ -662,7 +657,6 @@ "policy.spaceBasedTerraforming.label": "Terraformacja oparta na kosmosie", "policy.spaceBasedTerraforming.desc": "Umieść olbrzymie lustra na niebie, zwiększając niezawodność farm słonecznych. Odblokowuje Lustra Kosmiczne.", "policy.stoicism.label": "Stoicyzm", - "policy.stoicism.desc": "Stoicy uczą że powinniśmy wytrzymywać trudności bez narzekania. Zmniejsza konsumpcję towarów luksusowych o połowę.", "policy.stripMining.label": "Kopalnictwo odkrywkowe", "policy.stripMining.desc": "Zrównaj pagórki z ziemią w wysiłku mającym na celu zwiększenie produkcji minerałów.", "policy.sustainability.label": "Zrównoważony rozwój", @@ -672,7 +666,6 @@ "policy.theocracy.label": "Zakon Gwiazd", "policy.theocracy.desc": "Twoi astronauci zobaczyli straszne rzeczy w odległych niebach. Niech księża przejmą władzę, zwiększając produkcję wiary.", "policy.tradition.label": "Tradycja", - "policy.tradition.desc": "Dobre dla małych społeczeństw zorientowanych na kulturę. Zmniejsza cenę manuskryptów i zwiększa ich efekt. To wpłynie na to, jakie polityki są dostępne w przyszłości!", "policy.transkittenism.label": "Transkocianizm", "policy.transkittenism.desc": "Wyrzeknij się kotowatości i zespól się ze sztuczną inteligencją. Wydajność rdzeni AI podwoi się, a poziom AI nie wywoła negatywnych skutków.", "policy.zebraRelationsAppeasement.label": "Relacje z Zebrami: Ugodowość", @@ -806,7 +799,6 @@ "religion.sacrificeBtn.desc": "Zwróć Jednorożce do ich wymiaru. Za każdy ziggurat otrzymasz jedną Łzę Jednorożca.", "religion.sacrificeBtn.sacrifice.msg": "{0} jednorożce zostały poświęcone. Masz {1} łzy jednorożca!", "religion.transcend.confirmation.title": "Przekroczyć?", - "religion.transcend.confirmation.msg": "Czy na pewno chcesz porzucić część premii epifanii?\n\nMożesz osiągnąć specjalne szczeble transcendencji poświęcając swój bonus epifanii.\n\nKażdy szczebel podniesie efektywność przekształcenia adoracji (Podziwiaj galaktykę).\n\nKażdy poziom wymaga poświęcenia proporcjonalnie więcej premii za wiarę.\n\nTa premia będzie się gromadzić i będzie zachowywana przez resety.\n\nKLIKNIĘCIE TEGO PRZYCISKU USUNIE CZĘŚĆ TWOJEJ EPIFANII ORAZ EFEKTYWNOŚCI MODLITW.", "religion.transcend.msg.failure": "Jeden krok bliżej: {0}%", "religion.transcend.msg.success": "Przekroczyłeś granice śmiertelności. Poziom T: {0}", "religion.transcendBtn.label": "Przekroczyć", @@ -816,7 +808,6 @@ "religion.tu.blackCore.flavor": "Zbudowany z kości ofiar kociąt.", "religion.tu.blackLibrary.label": "Czarna Biblioteka", "religion.tu.blackLibrary.desc": "Każda Czarna Biblioteka poprawia skalowanie Kodeksów Leviathanianus o 2%. Wartość ta jest dodatkowo ulepszana przez Cmentarze Jednorożców.", - "religion.tu.blackLibary.flavor": "Może nie bez powodu to jest zbyt ciemne by przeczytać", "religion.tu.blackNexus.label": "Czarny Nexus", "religion.tu.blackNexus.desc": "Poprawia tempo ulepszania kryształów czasu w relikwiach.
Każdy Czarny Nexus zwiększy efektywność Redukcji Reliktów o liczbę Czarnych Piramid.
Efekt ten zwiększa również efektywność Stacji Relikwii", "religion.tu.blackNexus.flavor": "Oko na niebie.", @@ -832,7 +823,6 @@ "religion.tu.darkNova.desc": "Poprawia globalną produkcję energii o 2%", "religion.tu.darkNova.flavor": "Gwiazdy są martwe. Tak jak nasze nadzieje i marzenia.", "religion.tu.holyGenocide.label": "Święte ludobójstwo", - "religion.tu.holyGenocide.desc": "I łza nie spadnie", "religion.tu.holyGenocide.flavor": "Żyjemy na łagodnej wyspie ignorancji pośród czarnych mórz nieskończoności i nie oznaczało to, że powinniśmy podróżować daleko.", "religion.tu.singularity.label": "Horyzont zdarzeń", "religion.tu.singularity.desc": "Popraw globalne limity zasobów o 10%", @@ -985,12 +975,9 @@ "resources.zebras.title": "Zebry", "resources.sorrow.full": "Smutek w postaci czarnego płynu", "resources.sorrow.short": "CPS", - "gift.get": "XOXOXO! Starzy Bogowie zesłali ci prezent!", - "gift.repaire": "Starsi Bogowie naprawili Twoją skrzynkę podarunkową", "gift.resources": "Masz {0} {1}!", "gift.apocrypha": "Premia z Apokryfów zwiększona o {0}%!", "gift.transcendence": "Poziom Transcendencji zwiększony o 4!", - "gift.metaphysics": "Odblokowano {0}!", "save.export.msg": "Exportowanie zapisu pomyślne!", "save.import.confirmation.msg": "Jesteś pewny? Spowoduje to zastąpienie Twojego zapisu!", "save.import.msg": "Importowanie zapisu pomyślne!", @@ -1319,7 +1306,6 @@ "time.cfu.ressourceRetrieval.label": "Odzyskiwanie Zasobów", "time.cfu.ressourceRetrieval.desc": "Odzyskaj część swoich rocznych zasobów kiedy spalasz KC", "time.cfu.temporalAccelerator.label": "Tymczasowy Akcelerator", - "time.cfu.temporalAccelerator.desc": "Poprawia generowanie energii strumienia o 5%", "time.cfu.temporalBattery.label": "Czasowa Bateria", "time.cfu.temporalBattery.desc": "Poprawia pojemność energetyczną strumienia o 25%", "time.cfu.temporalImpedance.label": "Impedancja czasu", @@ -1411,8 +1397,6 @@ "trade.bcoin.crash": "Denerwuj Niewidzialną Czarną Dłoń", "trade.bcoin.crash.desc": "Wywołaj zapaść rynku czarnogroszy", "trade.correct.bcoin": "Nastąpiła ogromna korekta na rynku kryptowalutowym", - "trade.embassy.open": "Otwórz ambasadę", - "trade.embassy": "Poziom ambasady ({0})", "trade.embassy.desc": "Załóż ambasadę i popraw dzięki niej stosunki dyplomatyczne", "trade.embassy.pinned": "Przypięte", "trade.embassy.unpinned": "Odpięte", @@ -1467,7 +1451,6 @@ "ui.option.hide.bgimage": "Ukryj obraz tła (dla schematów kolorów, gdy możliwe)", "ui.option.tooltips.right": "Przenieś podpowiedzi do prawej kolumny", "ui.option.more": "Więcej..", - "ui.option.no.confirm": "Nie pytaj o potwierdzenie przy zwalnianiu wszystkich miejsc pracy, wybieraniu doktryny ani przy zakupie lub sprzedaży wszystkiego (Shift+klik)", "ui.option.iw.smelter": "Huty wyłączają się przy 95% maksymalnego żelaza w trybie Żelaznej Woli", "ui.option.disable.telemetry": "Wyłącz telemetrię", "ui.option.enable.redshift": "Włącz postęp offline", @@ -1510,7 +1493,6 @@ "console.filter.ivoryMeteor": "Meteory Kości Słoniowej", "console.filter.unicornRift": "Szczeliny Jednorożców", "console.filter.alicornRift": "Szczeliny Skrzydłorożców", - "console.filter.tc": "Kryształy Czasu", "console.filter.faith": "Wiara", "village.bonus.desc.chemist": "Premia do wytwarzania chemikaliów", "village.bonus.desc.engineer": "Bonus do tworzenia", @@ -1746,7 +1728,6 @@ "workshop.barges.label": "Barki", "workshop.barges.desc": "Porty przechowują więcej węgla", "workshop.biofuel.label": "Przetwarzanie Biopaliw", - "workshop.biofuel.desc": "Biolaboratoria zamienią kocimiętkę w ropę", "workshop.bolas.label": "Bolas", "workshop.bolas.desc": "Broń do rzucania wykonana z ciężkich kamieni. Twoi myśliwi są dwa razy skuteczniejsi", "workshop.bolas.flavor": "Broń przędzona", @@ -1978,7 +1959,6 @@ "workshop.spaceEngineers.label": "Inżynierowie Kosmiczni", "workshop.spaceEngineers.desc": "Poprawia efektywność inżyniera", "workshop.spaceManufacturing.label": "Produkcja Kosmiczna", - "workshop.spaceManufacturing.desc": "Fabryki zapewniają bonus do wind kosmicznych i tablic orbitalnych", "workshop.starlink.label": "Gwiezdne łącze", "workshop.starlink.desc": "Każde Centrum Danych zapewni dodatkowy 1% bonus do Laboratoriów Biologicznych", "workshop.stasisChambers.label": "Komora Zastoju", diff --git a/res/i18n/crowdin/ro.json b/res/i18n/crowdin/ro.json index 513b119838..c620a3a252 100644 --- a/res/i18n/crowdin/ro.json +++ b/res/i18n/crowdin/ro.json @@ -125,7 +125,6 @@ "space.planet.yarn.terraformingStation.label": "Stație de Terraformare", "stats.buildings": "Clădirile au fost construite", "stats.trades.current": "Comerturi terminate", - "time.cfu.temporalAccelerator.desc": "Îmbunătățește generarea energiei de flux cu 5%", "trade.race.zebras": "Zebre", "village.btn.hunters": "Trimite vanatori", "village.census.lbl.happiness": "Fericire", diff --git a/res/i18n/crowdin/ru.json b/res/i18n/crowdin/ru.json index 96b0f8c696..b938826544 100644 --- a/res/i18n/crowdin/ru.json +++ b/res/i18n/crowdin/ru.json @@ -209,7 +209,6 @@ "buildings.workshop.desc": "Даёт доступ к мириаде улучшений. Плюс 6% к эффективности изготовления.", "buildings.workshop.flavor": "Работникам - бесплатные игрушки.", "buildings.zebraForge.label": "Печи зебр", - "buildings.zebraForge.desc": "Открывает создание кровавых камней и т-мифрила", "buildings.zebraOutpost.label": "Аванпост зебр", "buildings.zebraOutpost.desc": "Предоставляет базу для охотничьих экспедиций. Каждый уровень повышает эффективность экспедиции на 5%", "buildings.zebraWorkshop.label": "Мастерская зебр", @@ -258,6 +257,8 @@ "calendar.year.tooltip": "Год:", "challendge.panel.label": "Вызовы", "challendge.pending": "В процессе", + "challendge.reclaimReserves.label": "Восстановить запасы", + "challendge.reclaimReserves.desc": "Добывать ресурсы извне", "challendge.applyPending.desc": "Включите Вызовы/Условия, помеченные как Ожидающие решения", "challendge.1000Years.label": "1000 лет", "challendge.1000Years.desc": "Начни игру с половиной игрового времени.

Цель: Достичь года 1000", @@ -277,12 +278,9 @@ "challendge.ironWill.label": "Железная Воля", "challendge.ironWill.desc": "Железная Воля - это особый тип вызова. Его не нужно принимать здесь - просто играй без котят.", "challendge.ironWill.effect.desc": "Без эффекта", - "challendge.reclaimReserves.label": "Восстановить запасы", - "challendge.reclaimReserves.desc": "Добывать ресурсы извне", "challendge.winterIsComing.label": "Зима пришла", "challendge.winterIsComing.desc": "Начни партию с вечной зимой.

Цель: Доберись до Гелиоса.", "challendge.winterIsComing.effect.desc": "Погода в общем улучшится.", - "challendge.btn.chronosphere.desc": "Без бонусов от хроносфер", "challendge.btn.chronosphere.with.ironWill.desc": "Без бонусов от хроносфер.
ВНИМАНИЕ: бонус от хроносфер автоматически отменит Железную Волю", "challendge.btn.confirmation.title": "Подтверждение принятия вызова", "challendge.btn.confirmation.msg": "Принять этот вызов и начать новую партию?", @@ -362,8 +360,8 @@ "effectsMgr.statics.factoryCostReduction.title": "Снижение стоимости фабрик", "effectsMgr.statics.factoryRefineRatio.title": "Бонус к фабричной обработке нефти", "effectsMgr.statics.faithRatioReligion.title": "Бонус веры", - "effectsMgr.statics.festivalRatio.title": "Эффект фестиваля", "effectsMgr.statics.festivalArrivalRatio.title": "Скорость прибытия от фестиваля", + "effectsMgr.statics.festivalRatio.title": "Эффект фестиваля", "effectsMgr.statics.gflopsConsumption.title": "Переработка гигафлопов", "effectsMgr.statics.globalRelationsBonus.title": "Бонус отношений", "effectsMgr.statics.globalResourceRatio.title": "Бонус к максимуму ресурсов", @@ -393,7 +391,6 @@ "effectsMgr.statics.logHouseCostReduction.title": "Уменьшение цены хижин", "effectsMgr.statics.lumberMillRatio.title": "Бонус к лесопилке", "effectsMgr.statics.lunarOutpostRatio.title": "Бонус к лунным шахтам", - "effectsMgr.statics.luxuryConsuptionReduction.title": "Снижение потребления ресурсов роскоши", "effectsMgr.statics.luxuryHappinessBonus.title": "Бонус счастья ресурсов роскоши", "effectsMgr.statics.magnetoBoostRatio.title": "Генераторный бонус", "effectsMgr.statics.magnetoRatio.title": "Генераторный бонус к производству", @@ -465,9 +462,9 @@ "effectsMgr.statics.terraformingMaxKittens.title": "Бонус котятам при терраформации", "effectsMgr.statics.theocracyFaithProductionBonus.title": "Бонус производству веру", "effectsMgr.statics.timeImpedance.title": "Задержка временно́го штрафа", + "effectsMgr.statics.timeRatio.title": "Бонус к связанные со временем", "effectsMgr.statics.tradeCatpowerDiscount.title": "Скидка торгам в котосиле", "effectsMgr.statics.tradeGoldDiscount.title": "Скидка торгам в золоте", - "effectsMgr.statics.timeRatio.title": "Бонус к связанные со временем", "effectsMgr.statics.tradeRatio.title": "Коэффициент торговли", "effectsMgr.statics.umbraBoostRatio.title": "Бонус сборщикам ИХ", "effectsMgr.statics.unhappinessRatio.title": "Уменьшение недовольства", @@ -627,7 +624,6 @@ "policy.liberalism.label": "Либерализм", "policy.liberalism.desc": "Мирное и открытое общество. Улучшает отношения со всеми торговыми партнерами и здания стоят меньше золота.", "policy.liberty.label": "Свобода", - "policy.liberty.desc": "Подходит для больших, растущих обществ. Делит пополам пенальти от населения к счастью. Этот выбор повлияет на доступность дальнейших политик!", "policy.militarizeSpace.label": "Военизировать космос", "policy.militarizeSpace.desc": "Попытаться захватить небеса. Спутники дают на 10% больше бонуса к науке.", "policy.monarchy.label": "Монархия", @@ -641,7 +637,6 @@ "policy.outerSpaceTreaty.label": "Договор о космосе", "policy.outerSpaceTreaty.desc": "Согласиться что космос это общая территория всего населения Катта, улучшает отношения с торговыми партнерами.", "policy.radicalXenophobia.label": "Радикальная ксенофобия", - "policy.radicalXenophobia.desc": "Отвергнуть и злых чужих, и злых роботов. Святой геноцид эффективнее в два раза.", "policy.rationality.label": "Рациональность", "policy.rationality.desc": "Принять видение, что мир может быть фундаментально осознан. Получите небольшой бонус к производству науки и железа, однако будете выглядеть глупо в будущем.", "policy.republic.label": "Республика", @@ -651,7 +646,6 @@ "policy.spaceBasedTerraforming.label": "Космическое терраформирование", "policy.spaceBasedTerraforming.desc": "Запустите гигансткие зеркала в небо, улучшая стабильность работы солнечных панелей. Открывает космические зеркала.", "policy.stoicism.label": "Стоицизм", - "policy.stoicism.desc": "Стоики учат, что мы должны выдерживать испытания без жалоб. Потребление ресурсов роскоши уменьшено вдвое.", "policy.stripMining.label": "Открытое горное дело", "policy.stripMining.desc": "Срежьте горы в попытке улучшить производство минералов.", "policy.sustainability.label": "Устойчивость", @@ -661,7 +655,6 @@ "policy.theocracy.label": "Орден звёзд", "policy.theocracy.desc": "Ваши космонавты видели ужасающие вещи в далёких небесах. Позвольте жрецам захватить власть, с увеличением производства веры.", "policy.tradition.label": "Традиция", - "policy.tradition.desc": "Подходит для маленьких культурно-ориентированных обществ. Уменьшите стоимость рукописей и увеличьте их эффект. Этот выбор повлияет на доступность дальнейших политик!", "policy.transkittenism.label": "Транскошачество", "policy.transkittenism.desc": "Откажитесь от кошачества и слейтесь с ИИ. Ядра ИИ эффективнее в два раза, и у уровней ИИ нет негативных последствий.", "policy.zebraRelationsAppeasement.label": "Отношения с зебрами: успокоение", @@ -792,7 +785,6 @@ "religion.sacrificeBtn.desc": "Отправить единорогов обратно в их мир. Даёт слезу единорога за каждый зиккурат.", "religion.sacrificeBtn.sacrifice.msg": "{0} единорогов были пожертвованы. Получено слез единорога - {1}!", "religion.transcend.confirmation.title": "Взойти?", - "religion.transcend.confirmation.msg": "Отказаться от бонуса к молитвам?\n\nЭто приведет к росту уровня восхождения.\n\nКаждый следующий уровень требует пропорционально большего взноса.\n\nСброс не повлияет на уровни восхождения.\n\nНАЖАТИЕ НА ЭТУ КНОПКУ УБЕРЕТ ЧАСТЬ БОНУСА К МОЛИТВАМ.", "religion.transcend.msg.failure": "На шаг ближе: {0}%", "religion.transcend.msg.success": "Пределы смертных превзойдены. Уровень восхождения: {0}", "religion.transcendBtn.label": "Взойти", @@ -802,7 +794,6 @@ "religion.tu.blackCore.flavor": "Построено из костей жертвенных котят.", "religion.tu.blackLibrary.label": "Черная библиотека", "religion.tu.blackLibrary.desc": "Каждая черная библиотека улучшает эффект Кодекса Левиафанов на 2%. Это значение также улучшается кладбищами единорогов.", - "religion.tu.blackLibary.flavor": "Быть может, здесь специально слишком темно для чтения.", "religion.tu.blackNexus.label": "Чёрный Нексус", "religion.tu.blackNexus.desc": "Улучшает переработку кристаллов времени в реликвии.
Каждый черный фокус увеличит эффективность создания реликвий на количество черных пирамид.
Этот эффект также влияет на станции реликвий.", "religion.tu.blackNexus.flavor": "Глаз в небе.", @@ -819,7 +810,6 @@ "religion.tu.darkNova.desc": "Улучшит общее электрогенерацию на 2%", "religion.tu.darkNova.flavor": "Звезды мертвы. Как наши надежды и мечты.", "religion.tu.holyGenocide.label": "Святой Геноцид", - "religion.tu.holyGenocide.desc": "Не упадёт ни слезинки.", "religion.tu.holyGenocide.flavor": "Мы живём на тихом острове невежества среди чёрных морей безумия - и нам не предназначено заплывать далеко.", "religion.tu.singularity.label": "Горизонт событий", "religion.tu.singularity.desc": "Увеличивает все хранилища на 10%", @@ -971,12 +961,9 @@ "resources.zebras.title": "зебры", "resources.sorrow.full": "Чёрная жидкая печаль", "resources.sorrow.short": "Печаль", - "gift.get": "XOXOXO! Древние боги послали тебе подарок!", - "gift.repaire": "Древние боги починили твой подарок", "gift.resources": "Получен {0} {1}!", "gift.apocrypha": "Бонус апокрифе увеличен на {0}%!", "gift.transcendence": "Уровень восхождения увеличен на 4!", - "gift.metaphysics": "Разблокирован {0}!", "save.export.msg": "Экспорт удачен!", "save.import.confirmation.msg": "Точно? Это перезапишет твоё сохранение!", "save.import.msg": "Импорт удачен!", @@ -1309,7 +1296,6 @@ "time.cfu.ressourceRetrieval.label": "Восстановление ресурсов", "time.cfu.ressourceRetrieval.desc": "Восстановить часть годового запаса ресурсов при сжигании кристалла времени.", "time.cfu.temporalAccelerator.label": "Временно́й ускоритель", - "time.cfu.temporalAccelerator.desc": "Ускоряет генерацию временно́го потока на 5%", "time.cfu.temporalBattery.label": "Временнáя батарея", "time.cfu.temporalBattery.desc": "Улучшает хранилище временно́го потока на 25%", "time.cfu.temporalImpedance.label": "Сопротивление времени", @@ -1402,8 +1388,6 @@ "trade.bcoin.crash": "Разозлить Невидимую Чёрную Руку", "trade.bcoin.crash.desc": "Заставить рынок блэккоина рухнуть", "trade.correct.bcoin": "Произошла огромная коррекция на крипторынке", - "trade.embassy.open": "Открыть посольство", - "trade.embassy": "Уровень посольства ({0})", "trade.embassy.desc": "Улучшить ваши дипломатические отношения путём открытия посольства", "trade.embassy.pinned": "Закреплено", "trade.embassy.unpinned": "Откреплено", @@ -1459,7 +1443,6 @@ "ui.option.hide.bgimage": "Спрятать фоновое изображение (для цветовых схем где имеется)", "ui.option.tooltips.right": "Подсказки в правой части экрана", "ui.option.more": "Больше..", - "ui.option.no.confirm": "Без окон подтверждения для аврала, исследования политик или полной покупке/продаже (Shift-click)", "ui.option.iw.smelter": "Плавильни отключаются на 95% максимума в режиме Железной воли", "ui.option.disable.telemetry": "Отключить игровую телеметрию", "ui.option.enable.redshift": "Включить оффлайн прогресс", @@ -1500,7 +1483,6 @@ "console.filter.ivoryMeteor": "Костяные метеоры", "console.filter.unicornRift": "Порталы единорогов", "console.filter.alicornRift": "Порталы аликорнов", - "console.filter.tc": "Кристаллы времени", "console.filter.faith": "Вера", "village.bonus.desc.chemist": "Бонус к химическому изготовлению", "village.bonus.desc.engineer": "Бонус к изготовлению", @@ -1723,7 +1705,6 @@ "workshop.barges.label": "Баржи", "workshop.barges.desc": "Порты будут вмещать больше угля.", "workshop.biofuel.label": "Переработка биотоплива", - "workshop.biofuel.desc": "Биолаборатории станут конвертировать мяту в нефть.", "workshop.bolas.label": "Болеадорас", "workshop.bolas.desc": "Метательное оружие из тяжёлых камней. Охотники эффективнее в 2 раза.", "workshop.bolas.flavor": "Боевые клубки.", @@ -1954,7 +1935,6 @@ "workshop.spaceEngineers.label": "Космические инженеры", "workshop.spaceEngineers.desc": "Увеличивает эффективность инженеров.", "workshop.spaceManufacturing.label": "Космическое Производство", - "workshop.spaceManufacturing.desc": "Фабрики дают бонус космическим лифтам и орбитальным поясам.", "workshop.starlink.label": "Спутниковый канал связи", "workshop.starlink.desc": "Каждый ЦОД дает дополнительный 1% бонус биолабораториям", "workshop.stasisChambers.label": "Стазис-камеры", diff --git a/res/i18n/crowdin/tr.json b/res/i18n/crowdin/tr.json index cf32389a70..cba4adc14c 100644 --- a/res/i18n/crowdin/tr.json +++ b/res/i18n/crowdin/tr.json @@ -208,7 +208,6 @@ "buildings.workshop.desc": "Çok çeşitli geliştirme seçenekleri sunar. Dönüşüm verimliliğini %6 artırır", "buildings.workshop.flavor": "Çalışanlara ücretsiz oyuncak imkanı", "buildings.zebraForge.label": "Zebra demirhanesi", - "buildings.zebraForge.desc": "Kan taşı ve t-mitril üretiminin kilidini açar", "buildings.zebraOutpost.label": "Zebra karakolu", "buildings.zebraOutpost.desc": "Av gezileri için bir üs sağlar. Her geliştirme seviyesi gezi verimliliğini %5 arttırır", "buildings.zebraWorkshop.label": "Zebra atölyesi", @@ -257,6 +256,8 @@ "calendar.year.tooltip": "Yıl:", "challendge.panel.label": "Meydan okumalar", "challendge.pending": "Bekliyor", + "challendge.reclaimReserves.label": "Rezervleri geri al", + "challendge.reclaimReserves.desc": "Kaynakları öteden geri kazan", "challendge.applyPending.label": "Bekleyen değişiklikleri uygula ({0})", "challendge.applyPending.desc": "Bekleyen meydan okumaları/Durumları hemen uygula", "challendge.1000Years.label": "1000 yıl", @@ -277,12 +278,9 @@ "challendge.ironWill.label": "Demir İrade", "challendge.ironWill.desc": "Demir irade biraz gizli bir meydan okumadır ve aktif etmek için tıklamak gerekmez: Sadece oyunu sıfırla ve kediler olmadan oyna.", "challendge.ironWill.effect.desc": "Hiçbir şey", - "challendge.reclaimReserves.label": "Rezervleri geri al", - "challendge.reclaimReserves.desc": "Kaynakları öteden geri kazan", "challendge.winterIsComing.label": "Kış geldi", "challendge.winterIsComing.desc": "Oyunu sadece kış mevsimleriyle yeniden başlatın. (Kedi nanesi Paragon üretim bonusundan faydalanmayacak)

Hedef: Helios'a ulaş.", "challendge.winterIsComing.effect.desc": "Sıcak mevsimler daha olası ve soğuk mevsimler daha az olası.", - "challendge.btn.chronosphere.desc": " Kronosferden sıfırlama bonusu kazanamazsınız.", "challendge.btn.chronosphere.with.ironWill.desc": " Kronosferden sıfırlama bonusu kazanamazsınız.
DİKKAT: Kronosferlerin sıfırlama bonusu otomatik olarak devre dışıdır.", "challendge.btn.confirmation.title": "Meydan okuma onayı", "challendge.btn.confirmation.msg": "Oyunu sıfırlayarak bu meydan okumayı başlatmak istediğinize emin misiniz?", @@ -360,8 +358,8 @@ "effectsMgr.statics.factoryCostReduction.title": "Fabrika maliyet indirimi", "effectsMgr.statics.factoryRefineRatio.title": "Fabrika arıtma bonusu", "effectsMgr.statics.faithRatioReligion.title": "İnanç bonusu", - "effectsMgr.statics.festivalRatio.title": "Festival etkileri", "effectsMgr.statics.festivalArrivalRatio.title": "Şenlik büyüme oranı", + "effectsMgr.statics.festivalRatio.title": "Festival etkileri", "effectsMgr.statics.globalRelationsBonus.title": "İlişki bonusu", "effectsMgr.statics.globalResourceRatio.title": "Maks kaynaklar bonusu", "effectsMgr.statics.goldCostReduction.title": "Altın masrafında azalma", @@ -387,7 +385,6 @@ "effectsMgr.statics.logHouseCostReduction.title": "Kütük ev maliyet azalımı", "effectsMgr.statics.lumberMillRatio.title": "Odunhane bonusu", "effectsMgr.statics.lunarOutpostRatio.title": "Ay üssü bonusu", - "effectsMgr.statics.luxuryConsuptionReduction.title": "Lüks tüketim azalımı", "effectsMgr.statics.luxuryHappinessBonus.title": "Lüks mutluluk bonusu", "effectsMgr.statics.magnetoBoostRatio.title": "Manyeto etkisinde artış", "effectsMgr.statics.magnetoRatio.title": "Üretim bonusu", @@ -518,7 +515,6 @@ "religion.faithCount.bonus": "1", "religion.faithCount.pool": "Dua:{0}", "religion.tu.blackCore.flavor": "Yavru kedi kurbanlarının kemikleriyle inşa edildi.", - "religion.tu.holyGenocide.desc": "Ve yaş dökülmez", "religion.zu.marker.label": "İşaretleyici", "res.stack.sharedKnowledge": "Paylaşılan bilgi", "resources.alloy.title": "alaşım", diff --git a/res/i18n/crowdin/uk.json b/res/i18n/crowdin/uk.json index af80d6ee72..3377c81d6e 100644 --- a/res/i18n/crowdin/uk.json +++ b/res/i18n/crowdin/uk.json @@ -362,7 +362,6 @@ "resources.epiphany.title": "прозріння", "resources.wrappingPaper.title": "обгортковий папір", "resources.zebras.title": "зебри", - "gift.metaphysics": "Розблоковано {0}!", "save.export.msg": "Експорт збереження успішний!", "science.agriculture.label": "Сільське господарство", "science.animal.effectDesc": "牧草地のロックを解除", diff --git a/res/i18n/crowdin/zh.json b/res/i18n/crowdin/zh.json index 1a158c9613..a0b164920c 100644 --- a/res/i18n/crowdin/zh.json +++ b/res/i18n/crowdin/zh.json @@ -209,7 +209,6 @@ "buildings.workshop.desc": "提供大量的可升级项。工艺制作效率提升 6%", "buildings.workshop.flavor": "猫玩具供员工免费使用", "buildings.zebraForge.label": "斑马锻造", - "buildings.zebraForge.desc": "解锁使用血石和秘银的工艺", "buildings.zebraOutpost.label": "斑马前哨", "buildings.zebraOutpost.desc": "为狩猎探险的队伍提供基地。每一级使狩猎探险的效率提升 5%", "buildings.zebraWorkshop.label": "斑马工坊", @@ -258,6 +257,8 @@ "calendar.year.tooltip": "日历年:", "challendge.panel.label": "挑战", "challendge.pending": "选中", + "challendge.reclaimReserves.label": "收回储备金", + "challendge.reclaimReserves.desc": "从外部回收资源", "challendge.applyPending.label": "应用选中挑战 ({0})", "challendge.applyPending.desc": "立即重置时间线,开始选定的挑战", "challendge.1000Years.label": "千禧年", @@ -279,12 +280,9 @@ "challendge.ironWill.label": "钢铁意志", "challendge.ironWill.desc": "钢铁意志是一个有点隐藏的挑战,你不需要点击这里就能进行:重启游戏,在没有小猫的情况下进行游戏", "challendge.ironWill.effect.desc": "什么都没有", - "challendge.reclaimReserves.label": "收回储备金", - "challendge.reclaimReserves.desc": "从外部回收资源", "challendge.winterIsComing.label": "冬天来了", "challendge.winterIsComing.desc": "重启游戏,只有冬天:猫薄荷不会受到领导力的生产加成

目标: 到达太阳", "challendge.winterIsComing.effect.desc": "温暖季节出现的机会增加,寒冷季节出现的机会减少", - "challendge.btn.chronosphere.desc": "你将不能获得超时空传送仪的重置效果", "challendge.btn.chronosphere.with.ironWill.desc": "你将不能获得超时空传送仪的重置效果。
警告:超时空传送仪的重置效果将自动关闭钢铁意志模式。", "challendge.btn.confirmation.title": "确认挑战", "challendge.btn.confirmation.msg": "你确定要重置当前游戏并开始此挑战吗?", @@ -367,8 +365,8 @@ "effectsMgr.statics.factoryCostReduction.title": "工厂成本降低", "effectsMgr.statics.factoryRefineRatio.title": "工厂炼油加成", "effectsMgr.statics.faithRatioReligion.title": "信仰加成", - "effectsMgr.statics.festivalRatio.title": "节日效果", "effectsMgr.statics.festivalArrivalRatio.title": "节日增加比率", + "effectsMgr.statics.festivalRatio.title": "节日效果", "effectsMgr.statics.gflopsConsumption.title": "GFlops 转化", "effectsMgr.statics.globalRelationsBonus.title": "关系加成", "effectsMgr.statics.globalResourceRatio.title": "资源上限加成", @@ -398,7 +396,6 @@ "effectsMgr.statics.logHouseCostReduction.title": "木屋成本降低", "effectsMgr.statics.lumberMillRatio.title": "木材厂加成", "effectsMgr.statics.lunarOutpostRatio.title": "月球前哨加成", - "effectsMgr.statics.luxuryConsuptionReduction.title": "奢侈品消耗降低", "effectsMgr.statics.luxuryHappinessBonus.title": "奢侈品幸福度加成", "effectsMgr.statics.magnetoBoostRatio.title": "磁电机增幅", "effectsMgr.statics.magnetoRatio.title": "生产加成", @@ -475,9 +472,9 @@ "effectsMgr.statics.terraformingMaxKittens.title": "星球改造站猫口上限加成", "effectsMgr.statics.theocracyFaithProductionBonus.title": "信仰生产加成", "effectsMgr.statics.timeImpedance.title": "时间惩罚延迟", + "effectsMgr.statics.timeRatio.title": "时间科技加成", "effectsMgr.statics.tradeCatpowerDiscount.title": "贸易所需喵力减少", "effectsMgr.statics.tradeGoldDiscount.title": "贸易所需黄金减少", - "effectsMgr.statics.timeRatio.title": "时间科技加成", "effectsMgr.statics.tradeRatio.title": "贸易比率", "effectsMgr.statics.umbraBoostRatio.title": "HR收割机加成", "effectsMgr.statics.unhappinessRatio.title": "不幸福度减少", @@ -639,7 +636,6 @@ "policy.liberalism.label": "自由主义", "policy.liberalism.desc": "和平开放的社会,提升与所有贸易伙伴的关系,并降低建筑所需黄金", "policy.liberty.label": "自由", - "policy.liberty.desc": "适合大型、广阔的社会。使猫口惩罚减半。这会影响未来政策方向!", "policy.militarizeSpace.label": "太空军事化", "policy.militarizeSpace.desc": "尝试接管天空。卫星对天文台的加成提升 10%", "policy.monarchy.label": "君主制", @@ -653,7 +649,6 @@ "policy.outerSpaceTreaty.label": "外层空间条约", "policy.outerSpaceTreaty.desc": "同意太空是喵星所有种族的共同领土。改善与所有贸易伙伴的关系", "policy.radicalXenophobia.label": "激进排外", - "policy.radicalXenophobia.desc": "排斥邪恶的外星人和机器人。神圣灭绝的效果翻倍", "policy.rationality.label": "理性", "policy.rationality.desc": "接受可以从根本上理解世界的观点,尽管以后看起来可能很蠢。获得轻微科学和钢铁产量加成", "policy.republic.label": "共和", @@ -663,7 +658,6 @@ "policy.spaceBasedTerraforming.label": "天基星球改造", "policy.spaceBasedTerraforming.desc": "在太空中放置巨型反射镜,提高太阳能发电站的一致性。解锁空间反射镜", "policy.stoicism.label": "斯多葛主义", - "policy.stoicism.desc": "禁欲主义者告诉我们应当无怨苦行。奢侈品消耗减半", "policy.stripMining.label": "露天采矿", "policy.stripMining.desc": "剖开山丘,提升矿物产出", "policy.sustainability.label": "可持续发展", @@ -673,7 +667,6 @@ "policy.theocracy.label": "星球秩序", "policy.theocracy.desc": "宇航员在遥远的太空看见了可怕的事物。让牧师接管,增加信仰产出", "policy.tradition.label": "传统", - "policy.tradition.desc": "适合小型文化导向社会。降低手稿价格并提高其效果。这会影响未来政策方向!", "policy.transkittenism.label": "超猫主义", "policy.transkittenism.desc": "放弃猫身,与 AI 融合。AI 核心的效率翻倍,并且 AI 等级不再有不利影响", "policy.zebraRelationsAppeasement.label": "斑马关系: 绥靖政策", @@ -807,7 +800,6 @@ "religion.sacrificeBtn.desc": "使独角兽回归独角兽的维度。每级庙塔会收到一滴独角兽眼泪", "religion.sacrificeBtn.sacrifice.msg": "{0} 只独角兽被献祭。你获得了 {1} 滴独角兽眼泪!", "religion.transcend.confirmation.title": "要进行次元超越吗?", - "religion.transcend.confirmation.msg": "确定要舍弃部分顿悟吗?\n\n通过牺牲一部分顿悟可以提升到新的超越等级。\n\n每个超越等级都将提升信仰转化为虔诚的效率。\n\n每次提升超越等级都需要牺牲更多的顿悟。\n\n此加成可以累积并在游戏重置时保留。\n\n点击此按钮将移除一部分顿悟和祈祷效率。", "religion.transcend.msg.failure": "更近一步: {0}%", "religion.transcend.msg.success": "超越了猫类的极限。达到超越等级: {0}", "religion.transcendBtn.label": "次元超越", @@ -817,7 +809,6 @@ "religion.tu.blackCore.flavor": "以活祭之猫的骸骨建造", "religion.tu.blackLibrary.label": "黑图书馆", "religion.tu.blackLibrary.desc": "每级黑图书馆使利维坦法典的效能提升 2%,此加成可被独角兽墓园进一步增益", - "religion.tu.blackLibary.flavor": "也许是被故意弄成黑到没法看书", "religion.tu.blackNexus.label": "黑之连结", "religion.tu.blackNexus.desc": "提高时间水晶精炼为遗物的产率。
每级黑之连结都会通过黑金字塔的等级提高遗物的精炼产率。
这项加成同样提升遗物站的效率", "religion.tu.blackNexus.flavor": "天空中的眼睛", @@ -834,7 +825,6 @@ "religion.tu.darkNova.desc": "全局能源产出提高 2%", "religion.tu.darkNova.flavor": "那颗星已经死了,就像我们的希望和梦想。", "religion.tu.holyGenocide.label": "神圣灭绝", - "religion.tu.holyGenocide.desc": "眼泪再也无法落下", "religion.tu.holyGenocide.flavor": "我们居住在黑暗的无限之海中一座名为无知的平静小岛,而这并不意味着我们应该远航。", "religion.tu.singularity.label": "黑洞视界", "religion.tu.singularity.desc": "全局资源存储上限提升 10%", @@ -987,12 +977,9 @@ "resources.zebras.title": "斑马", "resources.sorrow.full": "黑色悲伤液体", "resources.sorrow.short": "悲伤", - "gift.get": "XOXOXO! 上古神送给你一个礼物盒!", - "gift.repaire": "上古神修好了你的礼物盒", "gift.resources": "获得 {1} 个 {0}!", "gift.apocrypha": "新月外传加成增加 {0}%!", "gift.transcendence": "超越等级增加 4!", - "gift.metaphysics": "解锁 {0}!", "save.export.msg": "存档导出成功!", "save.import.confirmation.msg": "确定吗?这样做会覆盖你当前游戏数据!", "save.import.msg": "存档导入成功!", @@ -1325,7 +1312,6 @@ "time.cfu.ressourceRetrieval.label": "资源回复", "time.cfu.ressourceRetrieval.desc": "燃烧时间水晶时获得一部分每年原应产出的资源", "time.cfu.temporalAccelerator.label": "时空加速器", - "time.cfu.temporalAccelerator.desc": "时间通量的产量提升 5%", "time.cfu.temporalBattery.label": "时间电池", "time.cfu.temporalBattery.desc": "时间通量的容量提升 25%", "time.cfu.temporalImpedance.label": "时间阻抗", @@ -1419,8 +1405,6 @@ "trade.bcoin.crash": "惹怒看不见的黑手", "trade.bcoin.crash.desc": "迫使黑币市场崩溃", "trade.correct.bcoin": "加密货币市场出现了巨大的调整", - "trade.embassy.open": "设立大使馆", - "trade.embassy": "大使馆等级 ({0})", "trade.embassy.desc": "设立大使馆,改善外交关系", "trade.embassy.pinned": "固定", "trade.embassy.unpinned": "取消固定", @@ -1476,7 +1460,6 @@ "ui.option.hide.bgimage": "隐藏背景图片", "ui.option.tooltips.right": "移动提示窗到右侧", "ui.option.more": "更多设置..", - "ui.option.no.confirm": "清除所有工作或全部出售时无需确认(Shift+单击)", "ui.option.iw.smelter": "钢铁意志模式下,铁储量不足95%时关闭熔炉", "ui.option.disable.telemetry": "禁用游戏遥测", "ui.option.enable.redshift": "启用离线进度", @@ -1521,7 +1504,6 @@ "console.filter.ivoryMeteor": "象牙流星", "console.filter.unicornRift": "独角兽裂隙", "console.filter.alicornRift": "天角兽裂隙", - "console.filter.tc": "时间水晶", "console.filter.faith": "信仰", "village.bonus.desc.chemist": "化学工艺制作加成", "village.bonus.desc.engineer": "工艺制作加成", @@ -1758,7 +1740,6 @@ "workshop.barges.label": "驳船", "workshop.barges.desc": "港口可以储存更多的煤", "workshop.biofuel.label": "生物燃料加工", - "workshop.biofuel.desc": "生物实验室将猫薄荷转化为石油", "workshop.bolas.label": "投石索", "workshop.bolas.desc": "用沉重的石块制作的投掷武器。猎人的狩猎效率增至 2 倍", "workshop.bolas.flavor": "变成武器的毛线团", @@ -1990,7 +1971,6 @@ "workshop.spaceEngineers.label": "空间工程师", "workshop.spaceEngineers.desc": "提高工程师的工作效率", "workshop.spaceManufacturing.label": "太空制造", - "workshop.spaceManufacturing.desc": "工厂为太空电梯和轨道阵列提供加成", "workshop.starlink.label": "星链", "workshop.starlink.desc": "每级数据中心为生物实验室提供额外 1% 的加成", "workshop.stasisChambers.label": "静止室", diff --git a/res/i18n/crowdin/zht.json b/res/i18n/crowdin/zht.json index ec08dc2b17..82dfff9764 100644 --- a/res/i18n/crowdin/zht.json +++ b/res/i18n/crowdin/zht.json @@ -209,7 +209,6 @@ "buildings.workshop.desc": "提供大量的可升級項目。工藝製作效率提升 6%", "buildings.workshop.flavor": "貓玩具提供給員工免費使用", "buildings.zebraForge.label": "斑馬鍛造", - "buildings.zebraForge.desc": "解鎖使用血石和秘銀的工藝", "buildings.zebraOutpost.label": "斑馬前哨", "buildings.zebraOutpost.desc": "為狩獵探險的隊伍提供基地。每一級使狩獵探險的效率提升 5%", "buildings.zebraWorkshop.label": "斑馬工坊", @@ -258,6 +257,8 @@ "calendar.year.tooltip": "年份:", "challendge.panel.label": "挑戰", "challendge.pending": "選中", + "challendge.reclaimReserves.label": "取回存儲資源", + "challendge.reclaimReserves.desc": "從外部回收資源", "challendge.applyPending.label": "应用选中的变更 ({0})", "challendge.applyPending.desc": "立即重置時間線,開始選定的挑戰", "challendge.1000Years.label": "千禧年", @@ -279,12 +280,9 @@ "challendge.ironWill.label": "鋼鐵意志", "challendge.ironWill.desc": "鋼鐵意志是一個有點隱藏的挑戰,你不需要點擊這裡就能進行:重置遊戲,在沒有小貓的情況下進行遊戲。", "challendge.ironWill.effect.desc": "什麼都沒有", - "challendge.reclaimReserves.label": "取回存儲資源", - "challendge.reclaimReserves.desc": "從外部回收資源", "challendge.winterIsComing.label": "冬天來了", "challendge.winterIsComing.desc": "重置遊戲,只有冬天(貓薄荷不會受到領導力的加成)。

目標:到達太陽。", "challendge.winterIsComing.effect.desc": "溫暖季節出現的機會增加,寒冷季節出現的機會減少。", - "challendge.btn.chronosphere.desc": " 你將不能獲得超時空傳送儀的重置效果。", "challendge.btn.chronosphere.with.ironWill.desc": " 你將不能獲得超時空傳送儀的重置效果。
警告:超時空傳送儀的重置效果將自動關閉鋼鐵意志模式。", "challendge.btn.confirmation.title": "確認挑戰", "challendge.btn.confirmation.msg": "你確定要重置當前遊戲並開始此挑戰嗎?", @@ -367,8 +365,8 @@ "effectsMgr.statics.factoryCostReduction.title": "工廠成本降低", "effectsMgr.statics.factoryRefineRatio.title": "工廠提煉加成", "effectsMgr.statics.faithRatioReligion.title": "信仰加成", - "effectsMgr.statics.festivalRatio.title": "節日效果", "effectsMgr.statics.festivalArrivalRatio.title": "節日增加比率", + "effectsMgr.statics.festivalRatio.title": "節日效果", "effectsMgr.statics.gflopsConsumption.title": "GFlops轉化", "effectsMgr.statics.globalRelationsBonus.title": "關係加成", "effectsMgr.statics.globalResourceRatio.title": "資源上限加成", @@ -398,7 +396,6 @@ "effectsMgr.statics.logHouseCostReduction.title": "木屋成本降低", "effectsMgr.statics.lumberMillRatio.title": "伐木場加成", "effectsMgr.statics.lunarOutpostRatio.title": "月球前哨加成", - "effectsMgr.statics.luxuryConsuptionReduction.title": "奢侈品消耗降低", "effectsMgr.statics.luxuryHappinessBonus.title": "奢侈品幸福度加成", "effectsMgr.statics.magnetoBoostRatio.title": "磁電機增幅", "effectsMgr.statics.magnetoRatio.title": "生產加成", @@ -475,9 +472,9 @@ "effectsMgr.statics.terraformingMaxKittens.title": "星球改造站貓口上限加成", "effectsMgr.statics.theocracyFaithProductionBonus.title": "信仰生產加成", "effectsMgr.statics.timeImpedance.title": "時間懲罰延遲", + "effectsMgr.statics.timeRatio.title": "時間科技加成", "effectsMgr.statics.tradeCatpowerDiscount.title": "貿易所需喵力減少", "effectsMgr.statics.tradeGoldDiscount.title": "貿易所需黃金減少", - "effectsMgr.statics.timeRatio.title": "時間科技加成", "effectsMgr.statics.tradeRatio.title": "貿易比率", "effectsMgr.statics.umbraBoostRatio.title": "HR收割機加成", "effectsMgr.statics.unhappinessRatio.title": "不幸福度減少", @@ -639,7 +636,6 @@ "policy.liberalism.label": "自由主義", "policy.liberalism.desc": "和平開放的社會,提升與所有貿易夥伴的關係,並降低建築所需黃金。", "policy.liberty.label": "自由", - "policy.liberty.desc": "適合大型、廣闊的社會。使貓口懲罰減半。這會影響未來政策方向!", "policy.militarizeSpace.label": "太空軍事化", "policy.militarizeSpace.desc": "嘗試接管天空。衛星對天文台的加成提升 10%", "policy.monarchy.label": "君主制", @@ -653,7 +649,6 @@ "policy.outerSpaceTreaty.label": "外太空條約", "policy.outerSpaceTreaty.desc": "同意太空是喵星所有種族的共同領土。改善與所有貿易夥伴的關係。", "policy.radicalXenophobia.label": "激進排外", - "policy.radicalXenophobia.desc": "排斥邪惡的外星人和機器人。神聖滅絕的效果翻倍。", "policy.rationality.label": "理性", "policy.rationality.desc": "接受可以從根本上理解世界的觀點,儘管以後看起來可能很蠢。獲得輕微科學和鋼鐵產量加成。", "policy.republic.label": "共和", @@ -663,7 +658,6 @@ "policy.spaceBasedTerraforming.label": "天基星球改造", "policy.spaceBasedTerraforming.desc": "在太空中放置巨型反射鏡,提高太陽能發電站的一致性。解鎖空間反射鏡。", "policy.stoicism.label": "斯多葛主義", - "policy.stoicism.desc": "禁慾主義者告訴我們應當無怨苦行。奢侈品消耗減半。", "policy.stripMining.label": "露天採礦", "policy.stripMining.desc": "開墾山丘,提升礦物產出。", "policy.sustainability.label": "可持續發展", @@ -673,7 +667,6 @@ "policy.theocracy.label": "星球秩序", "policy.theocracy.desc": "宇航員在遙遠的太空看見了可怕的事物。讓牧師接管,增加信仰產出。", "policy.tradition.label": "傳統", - "policy.tradition.desc": "適合小型文化導向社會。降低手稿價格並提高其效果。這會影響未來政策方向!", "policy.transkittenism.label": "超貓主義", "policy.transkittenism.desc": "放棄貓身,與 AI 融合。 AI 核心的效率翻倍,並且 AI 等級不再有不利影響。", "policy.zebraRelationsAppeasement.label": "斑馬關係:綏靖政策", @@ -807,7 +800,6 @@ "religion.sacrificeBtn.desc": "讓獨角獸回歸獨角獸的維度。 每個廟塔會讓你收到一滴獨角獸眼淚。", "religion.sacrificeBtn.sacrifice.msg": "{0} 隻獨角獸被獻祭,你獲得了 {1} 份獨角獸眼淚!", "religion.transcend.confirmation.title": "要進行次元超越嗎?", - "religion.transcend.confirmation.msg": "確定要捨棄部分頓悟嗎?\n\n通過犧牲一部分頓悟可以提升到新的超越等級。\n\n每個超越等級都將提升信仰轉化為虔誠的效率。\n\n每次提升超越等級都需要犧牲更多的頓悟。\n\n此加成可以累積並在遊戲重置時保留。\n\n點擊此按鈕將移除一部分頓悟和祈禱效率。", "religion.transcend.msg.failure": "更近一步:{0} %", "religion.transcend.msg.success": "超越了貓族的極限。達到超越等級:{0}", "religion.transcendBtn.label": "次元超越", @@ -817,7 +809,6 @@ "religion.tu.blackCore.flavor": "以被活祭的貓之骸骨建造。", "religion.tu.blackLibrary.label": "黑圖書館", "religion.tu.blackLibrary.desc": "每級黑圖書館使利維坦法典的效能提升 2%,此加成可被獨角獸墓園進一步增益。", - "religion.tu.blackLibary.flavor": "也許是被故意弄成黑到沒法看書。", "religion.tu.blackNexus.label": "黑之連結", "religion.tu.blackNexus.desc": "提高時間水晶提煉為遺物的產量。
每級黑之連結都會通過黑金字塔的等級提高遺物的提煉產量。
這項加成同樣提升遺物站的效率", "religion.tu.blackNexus.flavor": "天空中的眼睛", @@ -834,7 +825,6 @@ "religion.tu.darkNova.desc": "全域能源產出提高 2%", "religion.tu.darkNova.flavor": "星星們都死了。就像我們的希望和夢想。", "religion.tu.holyGenocide.label": "神聖滅絕", - "religion.tu.holyGenocide.desc": "眼淚再也不會落下", "religion.tu.holyGenocide.flavor": "我們居住在黑暗的無限之海中一座名為無知的平靜小島,而這並不意味著我們應該遠航。", "religion.tu.singularity.label": "黑洞視界", "religion.tu.singularity.desc": "全局資源存儲上限提升 10%", @@ -987,12 +977,9 @@ "resources.zebras.title": "斑馬", "resources.sorrow.full": "黑色悲傷液體", "resources.sorrow.short": "黑色液體悲傷(BLS)", - "gift.get": "XOXOXO! 上古神送給你一個禮物盒!", - "gift.repaire": "上古神修好了你的禮物盒", "gift.resources": "獲得 {1} 個 {0}!", "gift.apocrypha": "新約外傳獎勵增加 {0}%!", "gift.transcendence": "超越等級增加 4!", - "gift.metaphysics": "解鎖 {0}!", "save.export.msg": "匯出存檔成功!", "save.import.confirmation.msg": "確定嗎?這樣做會覆蓋你目前的遊戲存檔!", "save.import.msg": "導入存檔成功!", @@ -1325,7 +1312,6 @@ "time.cfu.ressourceRetrieval.label": "資源恢復", "time.cfu.ressourceRetrieval.desc": "當你燃燒TC的時候恢復你的年度資源的一部分,", "time.cfu.temporalAccelerator.label": "時間加速器", - "time.cfu.temporalAccelerator.desc": "時間通量的產量提升 5%", "time.cfu.temporalBattery.label": "時間電池", "time.cfu.temporalBattery.desc": "時間通量的容量提升 25%", "time.cfu.temporalImpedance.label": "時間阻抗", @@ -1692,7 +1678,6 @@ "workshop.barges.label": "駁船", "workshop.barges.desc": "港口可以儲存更多的煤炭", "workshop.biofuel.label": "生物燃料製作", - "workshop.biofuel.desc": "生物實驗室能夠將貓薄荷轉化為石油", "workshop.bolas.label": "套牛繩", "workshop.bolas.desc": "由沉重的石頭組成的投擲武器. 獵人效率提升至 兩倍", "workshop.bolas.flavor": "線繩製成的武器", @@ -1923,7 +1908,6 @@ "workshop.spaceEngineers.label": "太空工程師", "workshop.spaceEngineers.desc": "提高工程師的有效性", "workshop.spaceManufacturing.label": "太空製造業", - "workshop.spaceManufacturing.desc": "工廠向空間電梯和軌道陣列提供加成", "workshop.starlink.label": "星鏈", "workshop.starlink.desc": "每級數據中心為生物實驗室提供額外 1% 的加成", "workshop.stasisChambers.label": "停滯間", diff --git a/res/i18n/en.json b/res/i18n/en.json index 5604953c4f..46a4be4c8b 100644 --- a/res/i18n/en.json +++ b/res/i18n/en.json @@ -364,6 +364,7 @@ "effectsMgr.statics.boostFromLeader.title": "Boost From Leader", "effectsMgr.statics.breweryConsumptionRatio.title": "Brewery consumption ratio", "effectsMgr.statics.broadcastTowerRatio.title": "Broadcast Tower bonus", + "effectsMgr.statics.bskSattelitePenalty.title": "Satellite base penalty", "effectsMgr.statics.cadBlueprintCraftRatio.title": "Blueprint craft bonus", "effectsMgr.statics.calcinerRatio.title": "Calciner bonus", "effectsMgr.statics.calcinerSteelCraftRatio.title": "Steel Plants's Calciner bonus", diff --git a/test/challenges.test.js b/test/challenges.test.js index 12cb5b7804..5975b0f9b9 100644 --- a/test/challenges.test.js +++ b/test/challenges.test.js @@ -34,16 +34,23 @@ afterEach(() => { //-------------------------------- test("Winter Challenge--Effects should have correct values", () => { //TODO: implement tests to make sure the cold chance works correctly. I wasn't sure how to write a test for it given that it's non-deterministic. - var winterChallenge = game.challenges.getChallenge("winterIsComing"); + + //Save constant references to objects we're going to be accessing frequently: + const winterChallenge = game.challenges.getChallenge("winterIsComing"); + const calendar = game.calendar; + const solarFarm = game.bld.get("pasture").stages[1]; + const catnipResource = game.resPool.get("catnip"); + + //Helper functions: + const catnipModifier = function() { return calendar.getWeatherMod(catnipResource); }; + const calculateWhatIsRelevant = function() { game.upgrade({ challenges: ["winterIsComing"]}); }; + winterChallenge.researched = false; winterChallenge.on = 0; winterChallenge.active = false; - var solarFarm = game.bld.get("pasture").stages[1]; - game.calendar.season = 0; //We will conduct this entire test in spring (which transforms into Winter I during the Winter Challenge) - //Helper function: - var catnipModifier = function() { return game.calendar.getWeatherMod(game.resPool.get("catnip")); } - - game.calculateAllEffects(); + calendar.season = 0; //We will conduct this entire test in spring (which transforms into Winter I during the Winter Challenge) + + calculateWhatIsRelevant(); //With 0 Winter Challenges attempted/completed, Solar Farms should produce 2/2.666667/2/1.5 energy. expect(solarFarm.calculateEnergyProduction(game, 0 /*Spring*/)).toBe(2); expect(solarFarm.calculateEnergyProduction(game, 1 /*Summer*/)).toBeCloseTo(2.666667); @@ -51,148 +58,148 @@ test("Winter Challenge--Effects should have correct values", () => { expect(solarFarm.calculateEnergyProduction(game, 3 /*Winter*/)).toBeCloseTo(1.5); //Catnip production in spring should be +50% by default, ±15% for weather. - game.calendar.weather = "cold"; + calendar.weather = "cold"; expect(catnipModifier()).toBeCloseTo(1.35); - game.calendar.weather = "warm"; + calendar.weather = "warm"; expect(catnipModifier()).toBeCloseTo(1.65); - game.calendar.weather = null; //Normal weather + calendar.weather = null; //Normal weather expect(catnipModifier()).toBeCloseTo(1.5); //Activate the first Winter Challenge -> endless winter winterChallenge.active = true; - game.calculateAllEffects(); + calculateWhatIsRelevant(); expect(solarFarm.calculateEnergyProduction(game, 0 /*Winter I*/)).toBeCloseTo(1.5); expect(solarFarm.calculateEnergyProduction(game, 1 /*Winter II*/)).toBeCloseTo(1.5); expect(solarFarm.calculateEnergyProduction(game, 2 /*Winter III*/)).toBeCloseTo(1.5); expect(solarFarm.calculateEnergyProduction(game, 3 /*Winter IV*/)).toBeCloseTo(1.5); //Catnip production in Winter I should be -75% by default, ±15% for weather. - game.calendar.weather = "cold"; + calendar.weather = "cold"; expect(catnipModifier()).toBeCloseTo(0.1); - game.calendar.weather = "warm"; + calendar.weather = "warm"; expect(catnipModifier()).toBeCloseTo(0.4); - game.calendar.weather = null; //Normal weather + calendar.weather = null; //Normal weather expect(catnipModifier()).toBeCloseTo(0.25); //Complete the first Winter Challenge -> 5% more energy in summer winterChallenge.researched = true; winterChallenge.on = 1; winterChallenge.active = false; - game.calculateAllEffects(); + calculateWhatIsRelevant(); expect(solarFarm.calculateEnergyProduction(game, 0 /*Spring*/)).toBe(2); expect(solarFarm.calculateEnergyProduction(game, 1 /*Summer*/)).toBeCloseTo(1.05 * 2.666667); expect(solarFarm.calculateEnergyProduction(game, 2 /*Autumn*/)).toBe(2); expect(solarFarm.calculateEnergyProduction(game, 3 /*Winter*/)).toBeCloseTo(1.5); //With 1 Winter Challenge completion, catnip is boosted by 5% - game.calendar.weather = "cold"; + calendar.weather = "cold"; expect(catnipModifier()).toBeCloseTo(1.05 * 1.35); - game.calendar.weather = "warm"; + calendar.weather = "warm"; expect(catnipModifier()).toBeCloseTo(1.05 * 1.65); - game.calendar.weather = null; //Normal weather + calendar.weather = null; //Normal weather expect(catnipModifier()).toBeCloseTo(1.05 * 1.5); winterChallenge.on = 5; //5 completions -> 25% more energy in summer - game.calculateAllEffects(); + calculateWhatIsRelevant(); expect(solarFarm.calculateEnergyProduction(game, 0 /*Spring*/)).toBe(2); expect(solarFarm.calculateEnergyProduction(game, 1 /*Summer*/)).toBeCloseTo(1.25 * 2.666667); expect(solarFarm.calculateEnergyProduction(game, 2 /*Autumn*/)).toBe(2); expect(solarFarm.calculateEnergyProduction(game, 3 /*Winter*/)).toBeCloseTo(1.5); //With 5 completions we can expect a 25% bonus. - game.calendar.weather = "cold"; + calendar.weather = "cold"; expect(catnipModifier()).toBeCloseTo(1.25 * 1.35); - game.calendar.weather = "warm"; + calendar.weather = "warm"; expect(catnipModifier()).toBeCloseTo(1.25 * 1.65); - game.calendar.weather = null; //Normal weather + calendar.weather = null; //Normal weather expect(catnipModifier()).toBeCloseTo(1.25 * 1.5); winterChallenge.active = true; - game.calculateAllEffects(); + calculateWhatIsRelevant(); expect(solarFarm.calculateEnergyProduction(game, 0 /*Winter I*/)).toBeCloseTo(1.5); //Cold harshness affects catnip, not solar power expect(solarFarm.calculateEnergyProduction(game, 1 /*Winter II*/)).toBeCloseTo(1.5); expect(solarFarm.calculateEnergyProduction(game, 2 /*Winter III*/)).toBeCloseTo(1.5); expect(solarFarm.calculateEnergyProduction(game, 3 /*Winter IV*/)).toBeCloseTo(1.5); //We can expect cold weather to be 10% harsher - game.calendar.weather = "cold"; + calendar.weather = "cold"; expect(catnipModifier()).toBeCloseTo(0.9 * 0.1); - game.calendar.weather = "warm"; + calendar.weather = "warm"; expect(catnipModifier()).toBeCloseTo(0.4); - game.calendar.weather = null; //Normal weather + calendar.weather = null; //Normal weather expect(catnipModifier()).toBeCloseTo(0.25); winterChallenge.on = 37; //We should not yet be into LDR for cold harshness - game.calculateAllEffects(); - game.calendar.weather = "cold"; + calculateWhatIsRelevant(); + calendar.weather = "cold"; expect(catnipModifier()).toBeCloseTo(0.26 * 0.1); //-74% - game.calendar.weather = "warm"; + calendar.weather = "warm"; expect(catnipModifier()).toBeCloseTo(0.4); - game.calendar.weather = null; //Normal weather + calendar.weather = null; //Normal weather expect(catnipModifier()).toBeCloseTo(0.25); winterChallenge.on = 38; //That puts us into LDR for cold harshness. - game.calculateAllEffects(); - game.calendar.weather = "cold"; + calculateWhatIsRelevant(); + calendar.weather = "cold"; expect(catnipModifier()).toBeCloseTo((1 - game.getLimitedDR(0.76,1)) * 0.1); - game.calendar.weather = "warm"; + calendar.weather = "warm"; expect(catnipModifier()).toBeCloseTo(0.4); - game.calendar.weather = null; //Normal weather + calendar.weather = null; //Normal weather expect(catnipModifier()).toBeCloseTo(0.25); //With 30 Winter completions we are back out of LDR for cold harshness. winterChallenge.on = 30; - game.calculateAllEffects(); - game.calendar.weather = "cold"; + calculateWhatIsRelevant(); + calendar.weather = "cold"; expect(catnipModifier()).toBeCloseTo(0.4 * 0.1); //-60% - game.calendar.weather = "warm"; + calendar.weather = "warm"; expect(catnipModifier()).toBeCloseTo(0.4); - game.calendar.weather = null; //Normal weather + calendar.weather = null; //Normal weather expect(catnipModifier()).toBeCloseTo(0.25); winterChallenge.active = false; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //30 completions -> 150% more energy in summer //We should be 1 completion away from entering LDR expect(solarFarm.calculateEnergyProduction(game, 0 /*Spring*/)).toBe(2); expect(solarFarm.calculateEnergyProduction(game, 1 /*Summer*/)).toBeCloseTo(2.5 * 2.666667); expect(solarFarm.calculateEnergyProduction(game, 2 /*Autumn*/)).toBe(2); expect(solarFarm.calculateEnergyProduction(game, 3 /*Winter*/)).toBeCloseTo(1.5); - game.calendar.weather = "cold"; + calendar.weather = "cold"; expect(catnipModifier()).toBeCloseTo(2.5 * 1.35); //Also 150% more catnip in spring - game.calendar.weather = "warm"; + calendar.weather = "warm"; expect(catnipModifier()).toBeCloseTo(2.5 * 1.65); - game.calendar.weather = null; //Normal weather + calendar.weather = null; //Normal weather expect(catnipModifier()).toBeCloseTo(2.5 * 1.5); winterChallenge.on = 31; //31 completions -> more than 150% more energy, but less than 155% - game.calculateAllEffects(); + calculateWhatIsRelevant(); //We should be just entering LDR territory now - var theBonus = 1 + game.getLimitedDR(1.55,2); + let theBonus = 1 + game.getLimitedDR(1.55,2); expect(solarFarm.calculateEnergyProduction(game, 0 /*Spring*/)).toBe(2); expect(solarFarm.calculateEnergyProduction(game, 1 /*Summer*/)).toBeCloseTo(theBonus * 2.666667); expect(solarFarm.calculateEnergyProduction(game, 2 /*Autumn*/)).toBe(2); expect(solarFarm.calculateEnergyProduction(game, 3 /*Winter*/)).toBeCloseTo(1.5); - game.calendar.weather = "cold"; + calendar.weather = "cold"; expect(catnipModifier()).toBeCloseTo(theBonus * 1.35); - game.calendar.weather = "warm"; + calendar.weather = "warm"; expect(catnipModifier()).toBeCloseTo(theBonus * 1.65); - game.calendar.weather = null; //Normal weather + calendar.weather = null; //Normal weather expect(catnipModifier()).toBeCloseTo(theBonus * 1.5); winterChallenge.on = 100; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //Well into LDR territory theBonus = 1 + game.getLimitedDR(5,2); expect(solarFarm.calculateEnergyProduction(game, 0 /*Spring*/)).toBe(2); expect(solarFarm.calculateEnergyProduction(game, 1 /*Summer*/)).toBeCloseTo((1 + game.getLimitedDR(5,2)) * 2.666667); expect(solarFarm.calculateEnergyProduction(game, 2 /*Autumn*/)).toBe(2); expect(solarFarm.calculateEnergyProduction(game, 3 /*Winter*/)).toBeCloseTo(1.5); - game.calendar.weather = "cold"; + calendar.weather = "cold"; expect(catnipModifier()).toBeCloseTo(theBonus * 1.35); - game.calendar.weather = "warm"; + calendar.weather = "warm"; expect(catnipModifier()).toBeCloseTo(theBonus * 1.65); - game.calendar.weather = null; //Normal weather + calendar.weather = null; //Normal weather expect(catnipModifier()).toBeCloseTo(theBonus * 1.5); }); @@ -200,89 +207,94 @@ test("Winter Challenge--Effects should have correct values", () => { // Anarchy Challenge //-------------------------------- test("Anarchy Challenge--Effects should have correct values", () => { + //Save constant references to objects we're going to be accessing frequently: + const anarchyChallenge = game.challenges.getChallenge("anarchy"); + const village = game.village; + + //Helper functions: + const masterSkill = function() { return village.getValueModifierPerSkill(9001); }; + const calculateWhatIsRelevant = function() { game.upgrade({ challenges: ["anarchy"]}); }; + //Let's add 300 kittens for testing purposes: //300 is a lot but we need the precision for some LDR checks. - for (var i = 0; i < 300; i++){ - game.village.sim.addKitten(); + for (let i = 0; i < 300; i++){ + village.sim.addKitten(); } - expect(game.village.getKittens()).toBe(300); + expect(village.getKittens()).toBe(300); - var anarchyChallenge = game.challenges.getChallenge("anarchy"); anarchyChallenge.researched = false; anarchyChallenge.on = 0; anarchyChallenge.active = false; - game.calculateAllEffects(); - - var masterSkill = function() { return game.village.getValueModifierPerSkill(9001); }; + calculateWhatIsRelevant(); //0 Anarchy Challenges attempted, 0 completed should leave 300 kittens available for work: //Master skill effect should be unchanged: - expect(game.village.getFreeKittens()).toBe(300); + expect(village.getFreeKittens()).toBe(300); expect(masterSkill()).toBeCloseTo(0.1875); //Start the first Anarchy Challenge: anarchyChallenge.active = true; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //Half of all kittens should be lazy: - expect(game.village.getFreeKittens()).toBe(150); + expect(village.getFreeKittens()).toBe(150); expect(masterSkill()).toBe(0); //Skills have no effect in Anarchy //With 1 Anarchy Challenges completed, 5% more kittens should be lazy: anarchyChallenge.researched = true; anarchyChallenge.on = 1; - game.calculateAllEffects(); - expect(game.village.getFreeKittens()).toBe(135); + calculateWhatIsRelevant(); + expect(village.getFreeKittens()).toBe(135); expect(masterSkill()).toBe(0); //Skills have no effect in Anarchy anarchyChallenge.on = 2; //2 completions - game.calculateAllEffects(); - expect(game.village.getFreeKittens()).toBe(120); + calculateWhatIsRelevant(); + expect(village.getFreeKittens()).toBe(120); expect(masterSkill()).toBe(0); //Skills have no effect in Anarchy anarchyChallenge.on = 3; //3 completions - game.calculateAllEffects(); - expect(game.village.getFreeKittens()).toBe(105); + calculateWhatIsRelevant(); + expect(village.getFreeKittens()).toBe(105); expect(masterSkill()).toBe(0); //Skills have no effect in Anarchy anarchyChallenge.on = 4; //4 completions - game.calculateAllEffects(); + calculateWhatIsRelevant(); //We should be getting to the very beginning of LDR - expect(game.village.getFreeKittens()).toBe(Math.round(90.625)); //i.e. 91 kittens + expect(village.getFreeKittens()).toBe(Math.round(90.625)); //i.e. 91 kittens expect(masterSkill()).toBe(0); //Skills have no effect in Anarchy anarchyChallenge.on = 5; //5 completions - game.calculateAllEffects(); + calculateWhatIsRelevant(); //LDR is active - expect(game.village.getFreeKittens()).toBe(Math.round(84.375)); //i.e. 84 kittens + expect(village.getFreeKittens()).toBe(Math.round(84.375)); //i.e. 84 kittens expect(masterSkill()).toBe(0); //Skills have no effect in Anarchy anarchyChallenge.on = 40; //40 completions - game.calculateAllEffects(); - expect(game.village.getFreeKittens()).toBe(Math.round(75.625)); //i.e. 76 kittens + calculateWhatIsRelevant(); + expect(village.getFreeKittens()).toBe(Math.round(75.625)); //i.e. 76 kittens expect(masterSkill()).toBe(0); //Skills have no effect in Anarchy //With Anarchy Challenge inactive, no kittens should be lazy: anarchyChallenge.active = false; - game.calculateAllEffects(); - expect(game.village.getFreeKittens()).toBe(300); + calculateWhatIsRelevant(); + expect(village.getFreeKittens()).toBe(300); //Now test the Master skill effect at 40 completions: expect(masterSkill()).toBeCloseTo(0.1875 * (1 + game.getLimitedDR(8,4))); anarchyChallenge.on = 20; //20 completions - game.calculateAllEffects(); + calculateWhatIsRelevant(); expect(masterSkill()).toBeCloseTo(0.1875 * (1 + game.getLimitedDR(4,4))); anarchyChallenge.on = 15; //15 completions - game.calculateAllEffects(); + calculateWhatIsRelevant(); //We're outisde of LDR now: expect(masterSkill()).toBeCloseTo(0.1875 * 4); anarchyChallenge.on = 10; //10 completions - game.calculateAllEffects(); + calculateWhatIsRelevant(); expect(masterSkill()).toBeCloseTo(0.1875 * 3); anarchyChallenge.on = 1; //1 completion - game.calculateAllEffects(); + calculateWhatIsRelevant(); expect(masterSkill()).toBeCloseTo(0.1875 * 1.2); }); @@ -290,98 +302,107 @@ test("Anarchy Challenge--Effects should have correct values", () => { // Energy Challenge //-------------------------------- test("Energy Challenge--Effects should have correct values", () => { - var energyChallenge = game.challenges.getChallenge("energy"); + //Save constant references to objects we're going to be accessing frequently: + const energyChallenge = game.challenges.getChallenge("energy"); + const resPool = game.resPool; + + //Helper function: + const calculateWhatIsRelevant = function() { game.upgrade({ challenges: ["energy"]}); }; + energyChallenge.researched = false; energyChallenge.active = false; energyChallenge.on = 0; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //With 0 Energy Challenges completed & the Challenge inactive, there should be no effect: - expect(game.resPool.getEnergyConsumptionRatio()).toBe(1); + expect(resPool.getEnergyConsumptionRatio()).toBe(1); energyChallenge.active = true; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //With Energy Challenge active, but 0 completions, energy consumption should be doubled: - expect(game.resPool.getEnergyConsumptionRatio()).toBe(2); + expect(resPool.getEnergyConsumptionRatio()).toBe(2); game.challenges.researchChallenge("energy"); - game.calculateAllEffects(); + calculateWhatIsRelevant(); //Energy Challenge should be inactive, researched, & have 1 completion for a 0.98 energy consumption value: expect(energyChallenge.researched).toBe(true); expect(energyChallenge.active).toBe(false); expect(energyChallenge.on).toBe(1); - expect(game.resPool.getEnergyConsumptionRatio()).toBeCloseTo(0.98); + expect(resPool.getEnergyConsumptionRatio()).toBeCloseTo(0.98); energyChallenge.active = true; energyChallenge.on = 1; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //With Energy Challenge active, but 1 completion, energy consumption increase should be 10%, then consumption is doubled. expect(game.challenges.getChallenge("energy")).toBe(energyChallenge); - expect(game.resPool.getEnergyConsumptionRatio()).toBeCloseTo(1.1 * 2); + expect(resPool.getEnergyConsumptionRatio()).toBeCloseTo(1.1 * 2); game.challenges.researchChallenge("energy"); - game.calculateAllEffects(); + calculateWhatIsRelevant(); //Energy Challenge should be inactive, researched, & have 2 completions for a 0.96 energy consumption value: expect(energyChallenge.researched).toBe(true); expect(energyChallenge.active).toBe(false); expect(energyChallenge.on).toBe(2); - expect(game.resPool.getEnergyConsumptionRatio()).toBeCloseTo(0.96); + expect(resPool.getEnergyConsumptionRatio()).toBeCloseTo(0.96); energyChallenge.active = true; energyChallenge.on = 100; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //With Energy Challenge active, but 100 completions, energy consumption increase should be 10%*100 = 1000% = ×11 expect(game.challenges.getChallenge("energy")).toBe(energyChallenge); - expect(game.resPool.getEnergyConsumptionRatio()).toBeCloseTo(11 * 2); + expect(resPool.getEnergyConsumptionRatio()).toBeCloseTo(11 * 2); energyChallenge.active = false; energyChallenge.on = 10; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //With Energy Challenge inactive & 10 completions at 2% reduction per level we should have -20% consumption: - expect(game.resPool.getEnergyConsumptionRatio()).toBeCloseTo(0.8); + expect(resPool.getEnergyConsumptionRatio()).toBeCloseTo(0.8); energyChallenge.on = 37; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //With 37 completions at 2% reduction per level we should have -74% consumption; LDR hasn't kicked in yet: - expect(game.resPool.getEnergyConsumptionRatio()).toBeCloseTo(0.26); + expect(resPool.getEnergyConsumptionRatio()).toBeCloseTo(0.26); energyChallenge.on = 38; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //With 38 completions at 2% reduction per level we should have -76% consumption; beginnings of LDR: - expect(game.resPool.getEnergyConsumptionRatio()).toBeCloseTo(1 + game.getLimitedDR(-0.76,1)); + expect(resPool.getEnergyConsumptionRatio()).toBeCloseTo(1 + game.getLimitedDR(-0.76,1)); energyChallenge.on = 100; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //With 100 completions at 2% reduction per level we should be well into LDR: - expect(game.resPool.getEnergyConsumptionRatio()).toBeCloseTo(1 + game.getLimitedDR(-2,1)); + expect(resPool.getEnergyConsumptionRatio()).toBeCloseTo(1 + game.getLimitedDR(-2,1)); energyChallenge.on = 10000; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //With 10k completions at 2% reduction per level we should be well into LDR: - expect(game.resPool.getEnergyConsumptionRatio()).toBeCloseTo(1 + game.getLimitedDR(-200,1)); + expect(resPool.getEnergyConsumptionRatio()).toBeCloseTo(1 + game.getLimitedDR(-200,1)); }); //-------------------------------- // Atheism Challenge //-------------------------------- test("Atheism Challenge--Solar Revolution limit should have correct value", () => { - var solarRevolutionUpgrade = game.religion.getRU("solarRevolution"); //We need to enable SR to calculate its bonus. + //Save constant references to objects we're going to be accessing frequently: + const religionManager = game.religion; + const solarRevolutionUpgrade = religionManager.getRU("solarRevolution"); + const atheismChallenge = game.challenges.getChallenge("atheism"); + + //Helper functions: + const getSR = function() { return religionManager.getSolarRevolutionRatio(); }; + const calculateWhatIsRelevant = function() { game.upgrade({ challenges: ["atheism"]}); }; + + //We need to enable SR to calculate its bonus. solarRevolutionUpgrade.on = 1; solarRevolutionUpgrade.val = 1; - var blackObelisk = game.religion.getTU("blackObelisk"); //Get rid of all Black Obelisks for the purposes of this test. - blackObelisk.on = 0; - blackObelisk.val = 0; - //game.religion.faith is the amount of Worship you have; set it to a really big number so it's very close to the limits. - game.religion.faith = Math.pow(10,50); - game.religion.transcendenceTier = 15; - var atheismChallenge = game.challenges.getChallenge("atheism"); + + //religionManager.faith is the amount of worship you have; set it to a really big number so it's very close to the limits. + religionManager.faith = Math.pow(10,50); + religionManager.transcendenceTier = 15; atheismChallenge.on = 0; atheismChallenge.researched = false; atheismChallenge.active = false; - game.calculateAllEffects(); - - //Utility function to make life easier: - var getSR = function() {return game.religion.getSolarRevolutionRatio();}; + calculateWhatIsRelevant(); //Test that with 0 Atheism completions the SR limit is at 1000%. expect(getSR()).toBeCloseTo(10); @@ -389,42 +410,42 @@ test("Atheism Challenge--Solar Revolution limit should have correct value", () = //Test that with 1 Atheism completion the SR limit is boosted by 100% per TT, then multiplicatively by 10%. atheismChallenge.on = 1; atheismChallenge.researched = true; - game.calculateAllEffects(); + calculateWhatIsRelevant(); expect(getSR()).toBeCloseTo(25 * 1.1); //Test that with 2 Atheism completions the SR limit is boosted by 100% per TT, then multiplicatively by 20%. atheismChallenge.on = 2; - game.calculateAllEffects(); + calculateWhatIsRelevant(); expect(getSR()).toBeCloseTo(25 * 1.2); //Test that with 15 Atheism completions the SR limit is boosted by 100% per TT, then multiplicatively by 150%. atheismChallenge.on = 15; - game.calculateAllEffects(); + calculateWhatIsRelevant(); expect(getSR()).toBeCloseTo(25 * 2.5); //Test that it really is 100% per TT. - game.religion.transcendenceTier = 3; - game.calculateAllEffects(); + religionManager.transcendenceTier = 3; + calculateWhatIsRelevant(); expect(getSR()).toBeCloseTo(13 * 2.5); //Test that with 30 Atheism completions the SR limit is boosted by 100% per TT, then multiplicatively by 300%. atheismChallenge.on = 30; - game.calculateAllEffects(); + calculateWhatIsRelevant(); expect(getSR()).toBeCloseTo(13 * 4); //Test that with 31 Atheism completions we start dipping into LDR. atheismChallenge.on = 31; - game.calculateAllEffects(); + calculateWhatIsRelevant(); expect(getSR()).toBeCloseTo(13 * (1 + game.getLimitedDR(3.1,4))); //Test that with 70 Atheism completions we really are into LDR. atheismChallenge.on = 70; - game.calculateAllEffects(); + calculateWhatIsRelevant(); expect(getSR()).toBeCloseTo(13 * (1 + game.getLimitedDR(7,4))); //Test that with infinite Atheism completions we reach the LDR cap. atheismChallenge.on = Infinity; - game.calculateAllEffects(); + calculateWhatIsRelevant(); expect(getSR()).toBeCloseTo(13 * 5); }); @@ -432,15 +453,20 @@ test("Atheism Challenge--Solar Revolution limit should have correct value", () = // Black Sky Challenge //-------------------------------- test("Black Sky Challenge--Corruption bonus should have correct value", () => { - var CORRUPTION_FROM_1_MARKER = 0.000001; //Copied directly from religion.js - var markers = game.religion.getZU("marker"); //The religion building that is affected by BSK corruption bonus + //Save constant references to objects we're going to be accessing frequently: + const bskChallenge = game.challenges.getChallenge("blackSky"); + const markers = game.religion.getZU("marker"); //The religion building that is affected by BSK corruption bonus + const CORRUPTION_FROM_1_MARKER = 0.000001; //Copied directly from religion.js + + //Helper function: + const calculateWhatIsRelevant = function() { game.upgrade({ challenges: ["blackSky"], zigguratUpgrades: ["marker"]}); }; + markers.val = 1; markers.on = 1; - var bskChallenge = game.challenges.getChallenge("blackSky"); bskChallenge.on = 0; - bskChallenge.researhed = false; + bskChallenge.researched = false; bskChallenge.active = false; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //With 0 BSK attempts & completions, markers' effective value should be 1, & corruption ratio should be unchanged: expect(markers.effects["corruptionRatio"]).toBe(CORRUPTION_FROM_1_MARKER); @@ -449,21 +475,21 @@ test("Black Sky Challenge--Corruption bonus should have correct value", () => { //Try with 1 BSK completion: bskChallenge.on = 1; bskChallenge.researched = true; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //Numbers should be boosted by 10%: expect(markers.effects["corruptionRatio"]).toBeCloseTo(1.1 * CORRUPTION_FROM_1_MARKER); expect(markers.getEffectiveValue(game)).toBe(1.1); //5 BSK completions: bskChallenge.on = 5; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //Expect a 50% bonus: expect(markers.effects["corruptionRatio"]).toBeCloseTo(1.5 * CORRUPTION_FROM_1_MARKER); expect(markers.getEffectiveValue(game)).toBe(1.5); //Try BSK active with 5 previous completions: bskChallenge.active = true; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //Bonus should be disabled while Challenge is active: expect(markers.effects["corruptionRatio"]).toBe(CORRUPTION_FROM_1_MARKER); expect(markers.getEffectiveValue(game)).toBe(1); @@ -471,28 +497,28 @@ test("Black Sky Challenge--Corruption bonus should have correct value", () => { //15 BSK completions, Challenge completed: bskChallenge.on = 15; bskChallenge.active = false; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //Expect a 150% bonus because we aren't into LDR yet: expect(markers.effects["corruptionRatio"]).toBeCloseTo(2.5 * CORRUPTION_FROM_1_MARKER); expect(markers.getEffectiveValue(game)).toBe(2.5); //16 BSK completions: bskChallenge.on = 16; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //Beginnings of LDR: expect(markers.effects["corruptionRatio"]).toBeCloseTo((1 + game.getLimitedDR(1.6,2)) * CORRUPTION_FROM_1_MARKER); expect(markers.getEffectiveValue(game)).toBe(1 + game.getLimitedDR(1.6,2)); //99 BSK completions: bskChallenge.on = 99; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //Well into LDR: expect(markers.effects["corruptionRatio"]).toBeCloseTo((1 + game.getLimitedDR(9.9,2)) * CORRUPTION_FROM_1_MARKER); expect(markers.getEffectiveValue(game)).toBe(1 + game.getLimitedDR(9.9,2)); //Infinitely many BSK completions: bskChallenge.on = Infinity; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //Completely to the end of LDR: expect(markers.effects["corruptionRatio"]).toBeCloseTo(3 * CORRUPTION_FROM_1_MARKER); expect(markers.getEffectiveValue(game)).toBe(3); @@ -502,12 +528,17 @@ test("Black Sky Challenge--Corruption bonus should have correct value", () => { // Pacifism Challenge //-------------------------------- test("Pacifism Challenge--Weapon upgrades should have correct values", () => { - var pacifismChallenge = game.challenges.getChallenge("pacifism"); - var weaponUpgrades = [game.workshop.get("compositeBow"), game.workshop.get("crossbow"), game.workshop.get("railgun")]; + //Save constant references to objects we're going to be accessing frequently: + const pacifismChallenge = game.challenges.getChallenge("pacifism"); + const weaponUpgrades = [game.workshop.get("compositeBow"), game.workshop.get("crossbow"), game.workshop.get("railgun")]; + + //Helper function: + const calculateWhatIsRelevant = function() { game.upgrade({ challenges: ["pacifism"], upgrades: ["compositeBow", "crossbow", "railgun"]}); }; + pacifismChallenge.on = 500; pacifismChallenge.researched = true; pacifismChallenge.active = false; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //With Pacifism inactive, the number of completions shouldn't matter for weapon upgrades: expect(weaponUpgrades[0].effects["manpowerJobRatio"]).toBe(0.5); @@ -515,7 +546,7 @@ test("Pacifism Challenge--Weapon upgrades should have correct values", () => { expect(weaponUpgrades[2].effects["manpowerJobRatio"]).toBe(0.25); pacifismChallenge.on = 2; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //Test that the number of completions actually doesn't matter by checking with a different number of completions: expect(weaponUpgrades[0].effects["manpowerJobRatio"]).toBe(0.5); expect(weaponUpgrades[1].effects["manpowerJobRatio"]).toBe(0.25); @@ -525,7 +556,7 @@ test("Pacifism Challenge--Weapon upgrades should have correct values", () => { pacifismChallenge.on = 0; pacifismChallenge.researched = false; pacifismChallenge.active = true; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //We expect numbers to be unchanged: expect(weaponUpgrades[0].effects["manpowerJobRatio"]).toBe(0.5); expect(weaponUpgrades[1].effects["manpowerJobRatio"]).toBe(0.25); @@ -534,7 +565,7 @@ test("Pacifism Challenge--Weapon upgrades should have correct values", () => { //How about the 2nd Pacifism run? pacifismChallenge.on = 1; pacifismChallenge.researched = true; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //Weapon efficency should be diminished by 10%: expect(weaponUpgrades[0].effects["manpowerJobRatio"]).toBeCloseTo(0.9 * 0.5); //Use toBeCloseTo because we might have floating-point rounding errorrs expect(weaponUpgrades[1].effects["manpowerJobRatio"]).toBeCloseTo(0.9 * 0.25); @@ -542,7 +573,7 @@ test("Pacifism Challenge--Weapon upgrades should have correct values", () => { //7th Pacifism run: pacifismChallenge.on = 7; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //Weapon efficency should be diminished by 70%: expect(weaponUpgrades[0].effects["manpowerJobRatio"]).toBeCloseTo(0.3 * 0.5); expect(weaponUpgrades[1].effects["manpowerJobRatio"]).toBeCloseTo(0.3 * 0.25); @@ -550,21 +581,21 @@ test("Pacifism Challenge--Weapon upgrades should have correct values", () => { //10th Pacifism run: pacifismChallenge.on = 10; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //No LDR on the effect "weaponEfficency" (yes, it's misspelled) so we're at -100%: expect(weaponUpgrades[0].effects["manpowerJobRatio"]).toBe(0); expect(weaponUpgrades[1].effects["manpowerJobRatio"]).toBe(0); expect(weaponUpgrades[2].effects["manpowerJobRatio"]).toBe(0); pacifismChallenge.on = 11; - game.calculateAllEffects(); + calculateWhatIsRelevant(); //But it doesn't go below 0: expect(weaponUpgrades[0].effects["manpowerJobRatio"]).toBe(0); expect(weaponUpgrades[1].effects["manpowerJobRatio"]).toBe(0); expect(weaponUpgrades[2].effects["manpowerJobRatio"]).toBe(0); pacifismChallenge.on = 134769; //If you can correctly guess what this number is a reference to, I'll be impressed. - game.calculateAllEffects(); + calculateWhatIsRelevant(); //Still, effect shouldn't dip below 0: expect(weaponUpgrades[0].effects["manpowerJobRatio"]).toBe(0); expect(weaponUpgrades[1].effects["manpowerJobRatio"]).toBe(0); diff --git a/test/game.test.js b/test/game.test.js index f6c23f223f..7efc572cee 100644 --- a/test/game.test.js +++ b/test/game.test.js @@ -575,6 +575,32 @@ test("Queue should correctly add and remove items", () => { expect(queue.queueItems[1].value).toBe(11); }); +test("Queue should correctly skip one-time purchases if already bought", () => { + let queue = game.time.queue; + + //The queue should skip techs that are already researched: + game.science.get("calendar").researched = true; + game.resPool.get("science").value = 30; //Enough to purchase the Calendar tech. + queue.addToQueue("calendar", "tech", "N/A"); + expect(queue.queueLength()).toBe(1); + queue.update(); + expect(queue.queueLength()).toBe(0); + expect(game.resPool.get("science").value).toBe(30); //We didn't spend any science because we skipped the item + + //The queue should skip both researched & blocked policies: + game.science.getPolicy("liberty").researched = true; + game.science.getPolicy("tradition").blocked = true; + game.resPool.get("culture").value = 150; //Enough to purchase either policy. + queue.addToQueue("liberty", "policies", "N/A"); + queue.addToQueue("tradition", "policies", "N/A"); + expect(queue.queueLength()).toBe(2); + queue.update(); + expect(queue.queueLength()).toBe(1); + queue.update(); + expect(queue.queueLength()).toBe(0); + expect(game.resPool.get("culture").value).toBe(150); +}); + //-------------------------------- // Spaceport test //-------------------------------- @@ -604,3 +630,366 @@ test("Spaceports should be unlocked correctly and have a custom price logic appl //starchart price should skyroket due to the custom price ratio expect(Math.round(_get("warehouse").prices.find(price => price.name == "starchart").val)).toBe(8134223); }); + +//-------------------------------- +// buyItem internals +//-------------------------------- +test("buyItem internals should work properly for Resource Retrieval", () => { + const controller = new classes.ui.time.ChronoforgeBtnController(game); + const model = controller.fetchModel({ id: "ressourceRetrieval" }); + let callbackResult = null; + const callbackFunction = function(result) { callbackResult = result; }; + + //Before we get started, this test assumes certain things about Resource Retrievals: + //We assume there is a limit of 100. + //We assume the first one costs 1000 time crystals (TCs). + //We assume the price ratio is 1.3. + //Resource Retrievals should be representative of most buildings in the game, plus it has the unique limitBuild feature. + + //Try buying an item, but we have 0 TCs so it should fail: + controller.updateEnabled(model); + controller.buyItem(model, null, callbackFunction); + expect(model.metadata.on).toBe(0); + expect(model.metadata.val).toBe(0); + expect(callbackResult).toHaveProperty("itemBought", false); + expect(callbackResult).toHaveProperty("reason", "cannot-afford"); + + //Enter dev mode: + game.devMode = true; + controller.updateEnabled(model); + controller.buyItem(model, null, callbackFunction); + expect(model.metadata.on).toBe(1); + expect(model.metadata.val).toBe(1); + expect(callbackResult).toHaveProperty("itemBought", true); + expect(callbackResult).toHaveProperty("reason", "dev-mode"); + + //Now exit dev mode & try to buy the next building legitimately. + game.devMode = false; + game.resPool.get("timeCrystal").value = 1350; //Enough for 1, with some spare change + controller.updateEnabled(model); //After we gain the resources, there'd usually be a UI update that calls this + controller.buyItem(model, null, callbackFunction); + expect(game.resPool.get("timeCrystal").value).toBe(50); + expect(model.metadata.on).toBe(2); + expect(model.metadata.val).toBe(2); + expect(callbackResult).toHaveProperty("itemBought", true); + expect(callbackResult).toHaveProperty("reason", "paid-for"); + + //Test that holding the CTRL key builds batchSize of the item. + //Along the way, we'll test that the price updated properly. + game.opts.batchSize = 6; + game.resPool.get("timeCrystal").value = 100000; //Way more than needed + controller.updateEnabled(model); + controller.buyItem(model, { ctrlKey: true, shiftKey: false }, callbackFunction); + expect(game.resPool.get("timeCrystal").value).toBeCloseTo(78442.3093, 4); + expect(model.metadata.on).toBe(8); + expect(model.metadata.val).toBe(8); + expect(callbackResult).toHaveProperty("itemBought", true); + expect(callbackResult).toHaveProperty("reason", "paid-for"); + + //Test that holding the SHIFT key builds as many of the item as you can afford & overrides CTRL key. + game.opts.noConfirm = true; + game.resPool.get("timeCrystal").value = 1000000; //Enough to go from 8 to 21 buildings. + controller.updateEnabled(model); + controller.buyItem(model, { ctrlKey: true, shiftKey: true }, callbackFunction); + expect(model.metadata.on).toBe(21); + expect(model.metadata.val).toBe(21); + expect(game.resPool.get("timeCrystal").value).toBeCloseTo(203642.5938, 4); + expect(callbackResult).toHaveProperty("itemBought", true); + expect(callbackResult).toHaveProperty("reason", "paid-for"); + + //Test that we get the same result no matter the event parameters if we can't afford any. + //We'll test each combination of 2 Boolean parameters for a total of 2^2 = 4 combinations + controller.updateEnabled(model); + controller.buyItem(model, { ctrlKey: true, shiftKey: true }, callbackFunction); //11 + expect(callbackResult).toHaveProperty("itemBought", false); + expect(callbackResult).toHaveProperty("reason", "cannot-afford"); + controller.updateEnabled(model); + controller.buyItem(model, { ctrlKey: false, shiftKey: true }, callbackFunction); //01 + expect(callbackResult).toHaveProperty("itemBought", false); + expect(callbackResult).toHaveProperty("reason", "cannot-afford"); + controller.updateEnabled(model); + controller.buyItem(model, { ctrlKey: true, shiftKey: false }, callbackFunction); //10 + expect(callbackResult).toHaveProperty("itemBought", false); + expect(callbackResult).toHaveProperty("reason", "cannot-afford"); + controller.updateEnabled(model); + controller.buyItem(model, { ctrlKey: false, shiftKey: false }, callbackFunction); //00 + expect(callbackResult).toHaveProperty("itemBought", false); + expect(callbackResult).toHaveProperty("reason", "cannot-afford"); + + //Double-check that nothing was built in any of those 4 tests: + expect(model.metadata.on).toBe(21); + expect(model.metadata.val).toBe(21); + + //Test that if we have unlimited resources, we only build up to the limit. + game.resPool.get("timeCrystal").value = Infinity; + controller.updateEnabled(model); + controller.buyItem(model, { ctrlKey: false, shiftKey: true }, callbackFunction); + expect(model.metadata.on).toBe(100); + expect(model.metadata.val).toBe(100); + expect(callbackResult).toHaveProperty("itemBought", true); + expect(callbackResult).toHaveProperty("reason", "paid-for"); + + //Test that we can't buy any more even if we have unlimited resources. + controller.updateEnabled(model); + controller.buyItem(model, null, callbackFunction); + expect(model.metadata.on).toBe(100); + expect(model.metadata.val).toBe(100); + expect(callbackResult).toHaveProperty("itemBought", false); + expect(callbackResult).toHaveProperty("reason", "already-bought"); +}); + +test("buyItem internals should work properly for Calendar", () => { + const controller = new com.nuclearunicorn.game.ui.TechButtonController(game); + const model = controller.fetchModel({ id: "calendar" }); + let callbackResult = null; + const callbackFunction = function(result) { callbackResult = result; }; + + //Before we get started, this test assumes certain things about Calendar: + //We assume it costs 30 science. + //Calendar should be representative of most techs & upgrades in the game. + + //Try buying an item, but we have 0 science so it should fail: + controller.updateEnabled(model); + controller.buyItem(model, null, callbackFunction); + expect(model.metadata.researched).toBe(false); + expect(callbackResult).toHaveProperty("itemBought", false); + expect(callbackResult).toHaveProperty("reason", "cannot-afford"); + + //Give ourselves plenty of science & try again; this time it should succeed: + game.resPool.get("science").value = 100; + controller.updateEnabled(model); + controller.buyItem(model, null, callbackFunction); + expect(model.metadata.researched).toBe(true); + expect(callbackResult).toHaveProperty("itemBought", true); + expect(callbackResult).toHaveProperty("reason", "paid-for"); + expect(game.resPool.get("science").value).toBe(70); + + //Try again; this time it should fail because already bought: + controller.updateEnabled(model); + controller.buyItem(model, null, callbackFunction); + expect(model.metadata.researched).toBe(true); + expect(callbackResult).toHaveProperty("itemBought", false); + expect(callbackResult).toHaveProperty("reason", "already-bought"); + expect(game.resPool.get("science").value).toBe(70); +}); + +test("buyItem internals should work properly for Liberty & Tradition", () => { + const controller = new classes.ui.PolicyBtnController(game); + let model = controller.fetchModel({ id: "liberty" }); + let callbackResult = null; + const callbackFunction = function(result) { callbackResult = result; }; + + //Before we get started, this test assumes certain things about Liberty: + //We assume it costs 150 culture. + //Liberty should be representative of most policies in the game. + //Some policies have special conditions under which they're blocked; I won't test those here. + + game.opts.noConfirm = true; + + //Try buying an item, but we have 0 culture so it should fail: + controller.updateEnabled(model); + controller.buyItem(model, null, callbackFunction); + expect(model.metadata.researched).toBe(false); + expect(callbackResult).toHaveProperty("itemBought", false); + expect(callbackResult).toHaveProperty("reason", "cannot-afford"); + + //Give ourselves plenty of culture & try again; this time it should succeed: + game.resPool.get("culture").value = 500; + controller.updateEnabled(model); + controller.buyItem(model, null, callbackFunction); + expect(model.metadata.researched).toBe(true); + expect(callbackResult).toHaveProperty("itemBought", true); + expect(callbackResult).toHaveProperty("reason", "paid-for"); + expect(game.resPool.get("culture").value).toBe(350); + + //Try again; this time it should fail because already bought: + controller.updateEnabled(model); + controller.buyItem(model, null, callbackFunction); + expect(model.metadata.researched).toBe(true); + expect(callbackResult).toHaveProperty("itemBought", false); + expect(callbackResult).toHaveProperty("reason", "already-bought"); + expect(game.resPool.get("culture").value).toBe(350); + + //Now test that Tradition is correctly blocked. + model = controller.fetchModel({ id: "tradition" }); + expect(model.metadata.blocked).toBe(true); + controller.updateEnabled(model); + controller.buyItem(model, null, callbackFunction); + expect(model.metadata.researched).toBe(false); + expect(callbackResult).toHaveProperty("itemBought", false); + expect(callbackResult).toHaveProperty("reason", "blocked"); + expect(game.resPool.get("culture").value).toBe(350); +}); + +test("buyItem internals should work properly for Fix Cryochamber", () => { + const controller = new classes.ui.time.FixCryochamberBtnController(game); + let model = controller.fetchModel({}); + let callbackResult = null; + const callbackFunction = function(result) { callbackResult = result; }; + const cryochambers = game.time.getVSU("cryochambers"); + const usedCryochambers = game.time.getVSU("usedCryochambers"); + + //Fixing a Cryochamber should fail when we don't have any Used Cryochambers. + controller.updateEnabled(model); + controller.updateVisible(model); + controller.buyItem(model, null, callbackFunction); + expect(callbackResult).toHaveProperty("itemBought", false); + expect(callbackResult).toHaveProperty("reason", "already-bought"); + expect(cryochambers.val).toBe(0); + expect(usedCryochambers.val).toBe(0); + + usedCryochambers.val = 5; + usedCryochambers.on = 5; + + //Fixing a Cryochamber should fail when it's not unlocked yet. + controller.updateEnabled(model); + controller.updateVisible(model); + controller.buyItem(model, null, callbackFunction); + expect(callbackResult).toHaveProperty("itemBought", false); + expect(callbackResult).toHaveProperty("reason", "not-unlocked"); + expect(cryochambers.val).toBe(0); + expect(usedCryochambers.val).toBe(5); + + game.workshop.get("chronoforge").researched = true; + + //Fixing a Cryochamber should fail when we can't afford it. + controller.updateEnabled(model); + controller.updateVisible(model); + controller.buyItem(model, null, callbackFunction); + expect(callbackResult).toHaveProperty("itemBought", false); + expect(callbackResult).toHaveProperty("reason", "cannot-afford"); + expect(cryochambers.val).toBe(0); + expect(usedCryochambers.val).toBe(5); + + for(const res of usedCryochambers.fixPrices) { + game.resPool.addResEvent(res.name, res.val + 1 /*Give us a little extra to check the price is correct*/); + } + + //Fixing a Cryochamber should succeed this time. + controller.updateEnabled(model); + controller.updateVisible(model); + controller.buyItem(model, null, callbackFunction); + expect(callbackResult).toHaveProperty("itemBought", true); + expect(callbackResult).toHaveProperty("reason", "paid-for"); + expect(cryochambers.val).toBe(1); + expect(usedCryochambers.val).toBe(4); + + //Now check that it should have cost us the correct amount of resources: + for(const res of usedCryochambers.fixPrices) { + expect(game.resPool.get(res.name).value).toBe(1); + } +}); + +test("buyItem internals should work properly for crafting steel", () => { + const controller = new com.nuclearunicorn.game.ui.CraftButtonController(game); + const model = controller.fetchModel({ craft: "steel" }); + let callbackResult = null; + const callbackFunction = function(result) { callbackResult = result; }; + + //Before we get started, this test assumes certain things about crafting steel: + //We assume it costs 100 iron, 100 coal per craft. + + //We should start out with no resources: + expect(game.resPool.get("steel").value).toBe(0); + expect(game.resPool.get("iron").value).toBe(0); + expect(game.resPool.get("coal").value).toBe(0); + + //Crafting should fail when we can't afford it: + controller.buyItem(model, null, callbackFunction); + expect(callbackResult).toHaveProperty("itemBought", false); + expect(game.resPool.get("steel").value).toBe(0); + expect(callbackResult).toHaveProperty("itemBought", false); + expect(callbackResult).toHaveProperty("reason", "cannot-afford"); + + //Crafting should succeed when we can afford it: + game.resPool.addResEvent("iron", 199); + game.resPool.addResEvent("coal", 199); + controller.buyItem(model, null, callbackFunction); + expect(game.resPool.get("steel").value).toBe(1); + expect(callbackResult).toHaveProperty("itemBought", true); + expect(callbackResult).toHaveProperty("reason", "paid-for"); + + //Crafting should fail again because we consumed resources & don't have enough anymore: + controller.buyItem(model, null, callbackFunction); + expect(game.resPool.get("steel").value).toBe(1); + expect(game.resPool.get("iron").value).toBe(99); + expect(game.resPool.get("coal").value).toBe(99); + expect(callbackResult).toHaveProperty("itemBought", false); + expect(callbackResult).toHaveProperty("reason", "cannot-afford"); +}); + +test("buyItem internals should work properly for shattering time crystals", () => { + const controller = new classes.ui.time.ShatterTCBtnController(game); + const model = controller.fetchModel({ prices: [{name: "timeCrystal", val: 1}] }); + let callbackResult = null; + const callbackFunction = function(result) { callbackResult = result; }; + + //For shattering TCs, we'll watch what happens with the calendar year: + expect(game.calendar.year).toBe(0); + + //Shattering should fail when we can't afford it: + controller.updateEnabled(model); + controller.buyItem(model, null, callbackFunction); + expect(game.calendar.year).toBe(0); + expect(callbackResult).toHaveProperty("itemBought", false); + expect(callbackResult).toHaveProperty("reason", "cannot-afford"); + + game.resPool.addResEvent("timeCrystal", 3); + + //Shattering should succeed when we can afford it: + controller.updateEnabled(model); + controller.buyItem(model, null, callbackFunction); + expect(game.calendar.year).toBe(1); + expect(callbackResult).toHaveProperty("itemBought", true); + expect(callbackResult).toHaveProperty("reason", "paid-for"); + + //Shattering should have cost us the correct amount of time crystals. + expect(game.resPool.get("timeCrystal").value).toBe(2); +}); + +test("buyItem internals should work properly for items with no cost", () => { + let callbackResult = null; + const callbackFunction = function(result) { callbackResult = result; }; + let handlerResult = null; + const handlerFunction = function(model) { handlerResult = model.name; }; + let controller = new com.nuclearunicorn.game.ui.ButtonModernController(game); + let model = controller.fetchModel({ name: "A", prices: [], handler: handlerFunction }); + + //If we force-disable the model, we shouldn't be able to buy it: + model.enabled = false; + controller.buyItem(model, null, callbackFunction); + expect(callbackResult).toHaveProperty("itemBought", false); + expect(callbackResult).toHaveProperty("reason", "not-enabled"); + expect(handlerResult).toBe(null); //Proof that the handler wasn't called + + //Buying a free item should be free & call the handler: + model.enabled = true; + controller.buyItem(model, null, callbackFunction); + expect(callbackResult).toHaveProperty("itemBought", true); + expect(callbackResult).toHaveProperty("reason", "item-is-free"); + expect(handlerResult).toBe("A"); + + controller = new classes.game.ui.GatherCatnipButtonController(game); + model = controller.fetchModel({}); //We don't really need any properties in the model for this one + + //Gathering catnip should be free & always succeed: + expect(game.resPool.get("catnip").value).toBe(0); + controller.buyItem(model, null, callbackFunction); + expect(callbackResult).toHaveProperty("itemBought", true); + expect(callbackResult).toHaveProperty("reason", "item-is-free"); + expect(game.resPool.get("catnip").value).toBe(1); + + controller = new classes.ui.ChallengeBtnController(game); + model = controller.fetchModel({ id: "pacifism" }); + + //Toggle pending challenge should be free & always succeed: + expect(model.metadata.pending).toBe(false); + controller.buyItem(model, null, callbackFunction); + expect(callbackResult).toHaveProperty("itemBought", true); + expect(callbackResult).toHaveProperty("reason", "item-is-free"); + expect(model.metadata.pending).toBe(true); + controller.buyItem(model, null, callbackFunction); + expect(callbackResult).toHaveProperty("itemBought", true); + expect(callbackResult).toHaveProperty("reason", "item-is-free"); + expect(model.metadata.pending).toBe(false); +}); diff --git a/test/setup.js b/test/setup.js index 044d5db2dd..62091e1004 100644 --- a/test/setup.js +++ b/test/setup.js @@ -22,7 +22,7 @@ console.log("==== starting jest bootloader ===="); */ try { global.React = require("../lib/react.min.js"); - require("../lib/jQuery"); + global.$ = require("../lib/jQuery"); //todo: make portable dojo for jest bootloader var createNamespace = require("./declare"); @@ -47,7 +47,11 @@ try { predicate(array[i]); } }, - clone: function(mixin){return Object.assign({}, mixin);}, + clone: function(mixin){ + if(mixin instanceof Array) { //Recursively deep-copying arrays? What could go wrong? + return mixin.map(function(elem) { return global.dojo.clone(elem); }); + } + return Object.assign({}, mixin);}, hitch: function(ctx, method){ return method.bind(ctx, arguments);}, connect: function(){}, publish: function(){}, @@ -59,9 +63,10 @@ try { done: function(){return this}, fail: function(){return this}, } - global.$ = { + /*global.$ = { ajax: function(){ return xhrMock; } - } + }*/ + global.$.ajax = function(){ return xhrMock; }; global.LZString = require("../lib/lz-string.js"); require("../lib/dropbox_v2.js");