From 42675eb08eb409e0913797a3f35de10460fbfd68 Mon Sep 17 00:00:00 2001
From: Tendsty <137620092+Tendsty@users.noreply.github.com>
Date: Sat, 23 Nov 2024 18:20:45 +0100
Subject: [PATCH] 1.5.4 update
---
package-lock.json | 4 +-
package.json | 2 +-
public/version.txt | 2 +-
.../partial/event/SnowballFight.vue | 37 ++-
.../partial/event/SnowdownFighter.vue | 21 +-
.../partial/event/SnowdownInventory.vue | 2 +-
.../partial/event/SnowdownItemList.vue | 27 +-
src/components/partial/farm/CropCard.vue | 1 +
src/components/partial/gallery/Color.vue | 2 +-
src/gbPlugin.js | 3 +-
src/js/constants.js | 6 +-
src/js/init.js | 2 +-
src/js/modules/event.js | 38 ++-
src/js/modules/event/snowdown/item.js | 81 +++--
src/js/modules/event/snowdown/tick.js | 23 +-
src/js/modules/event/snowdown/upgrade.js | 43 +--
src/js/modules/gallery/idea.js | 26 +-
src/js/modules/gallery/upgradeShape.js | 42 +--
src/js/modules/horde/upgradePrestige.js | 3 +-
src/js/modules/meta.js | 2 +
src/js/modules/migration/v1_5_4.js | 43 +++
src/js/modules/patchnote/v1_5_4.js | 189 +++++++++++
src/js/modules/village.js | 19 +-
src/js/savefile.js | 4 +-
src/js/utils/format.js | 25 +-
src/lang/de.js | 52 ++--
src/lang/de/currency.js | 8 -
src/lang/de/mult.js | 5 +-
src/lang/de/patchnote.js | 31 ++
src/lang/de/upgrade.js | 3 -
src/lang/en.js | 52 ++--
src/lang/en/currency.js | 8 -
src/lang/en/mult.js | 5 +-
src/lang/en/patchnote.js | 31 ++
src/lang/en/upgrade.js | 3 -
src/store/farm.js | 5 +-
src/store/gallery.js | 25 +-
src/store/meta.js | 12 +-
src/store/snowdown.js | 293 +++++++++++++-----
src/store/system.js | 2 +-
40 files changed, 878 insertions(+), 304 deletions(-)
create mode 100644 src/js/modules/migration/v1_5_4.js
create mode 100644 src/js/modules/patchnote/v1_5_4.js
diff --git a/package-lock.json b/package-lock.json
index 9145239..498b9e0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "gooboo",
- "version": "1.4.0",
+ "version": "1.5.4",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "gooboo",
- "version": "1.4.0",
+ "version": "1.5.4",
"license": "GPL-3.0-or-later",
"dependencies": {
"@fontsource/caveat": "^4.5.9",
diff --git a/package.json b/package.json
index 72c5916..7564569 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gooboo",
- "version": "1.5.3",
+ "version": "1.5.4",
"description": "An idle game",
"author": "Tendsty",
"main": "main.js",
diff --git a/public/version.txt b/public/version.txt
index 8af85be..94fe62c 100644
--- a/public/version.txt
+++ b/public/version.txt
@@ -1 +1 @@
-1.5.3
+1.5.4
diff --git a/src/components/partial/event/SnowballFight.vue b/src/components/partial/event/SnowballFight.vue
index 735561b..3746ed9 100644
--- a/src/components/partial/event/SnowballFight.vue
+++ b/src/components/partial/event/SnowballFight.vue
@@ -3,7 +3,7 @@
{{ $vuetify.lang.t(`$vuetify.event.snowdown.fightCount`) }} #{{ fightsWon + 1 }}
-
+
@@ -13,6 +13,27 @@
{{ $vuetify.lang.t('$vuetify.event.snowdown.fightDescription') }}
+ {{ $vuetify.lang.t('$vuetify.event.snowdown.fightWin') }}:
+
+ - {{ $vuetify.lang.t('$vuetify.event.snowdown.fightWinProducer') }}
+ - {{ $vuetify.lang.t('$vuetify.event.snowdown.fightWinItem') }}
+
+
+
+
+
+
+
+ mdi-emoticon-angry
+
+ {{ $formatInt(revenge) }}
+
+
+
+
+ {{ $vuetify.lang.t('$vuetify.event.snowdown.revenge.description', $formatInt(revenge)) }}
+ {{ $vuetify.lang.t('$vuetify.event.snowdown.revenge.statsScaling', $formatNum(revengeCrit, true), $formatNum(revengeBlock, true), $formatNum(revengeStats * 100, true)) }}
+ {{ $vuetify.lang.t('$vuetify.event.snowdown.revenge.statsBase') }}
@@ -56,14 +77,26 @@ export default {
rewardProducer: state => state.snowdown.rewardProducer,
rewardItem: state => state.snowdown.rewardItem,
replayBase: state => state.snowdown.result,
+ revenge: state => state.snowdown.revenge,
snowball: state => state.currency.event_snowball.value
}),
...mapGetters({
playerStats: 'snowdown/playerStats',
- enemyStats: 'snowdown/enemyStats'
+ enemyStats: 'snowdown/enemyStats',
+ winTokenGain: 'snowdown/winTokenGain',
+ winItemGain: 'snowdown/winItemGain',
}),
snowballFightCost() {
return SNOWDOWN_FIGHT_COST;
+ },
+ revengeStats() {
+ return this.$store.getters['mult/get']('snowdownRevengeStats');
+ },
+ revengeCrit() {
+ return this.$store.getters['mult/get']('snowdownRevengeCrit');
+ },
+ revengeBlock() {
+ return this.$store.getters['mult/get']('snowdownRevengeBlock');
}
},
methods: {
diff --git a/src/components/partial/event/SnowdownFighter.vue b/src/components/partial/event/SnowdownFighter.vue
index f84db4c..367032f 100644
--- a/src/components/partial/event/SnowdownFighter.vue
+++ b/src/components/partial/event/SnowdownFighter.vue
@@ -38,7 +38,10 @@
-
{{ $vuetify.lang.t(`$vuetify.event.snowdown.fighter.${stats.name}`) }}
+
+ {{ playerName }}
+ {{ $vuetify.lang.t(`$vuetify.event.snowdown.fighter.${stats.name}`) }}
+
mdi-octagram-outline
{{ $formatNum(stats.stun) }}
@@ -71,7 +74,7 @@
mdi-exclamation-thick
- {{ $formatNum(critChance(stats.critRating) * 100) }}% +{{ $formatNum(Math.round(critDamage(stats.critRating))) }}
+ {{ $formatNum(critChance(stats.critRating) * 100) }}% +{{ $formatNum(Math.round(critDamage(stats.critRating) * critMult)) }}
{{ $vuetify.lang.t('$vuetify.event.snowdown.critDescription') }}
@@ -155,6 +158,20 @@ export default {
return null;
}
return this.$store.state.snowdown.pet[this.stats.name];
+ },
+ critMult() {
+ if (this.stats.critMult !== undefined) {
+ return this.stats.critMult;
+ } else if (this.stats.name === 'player') {
+ return this.$store.state.mult.items.snowdownAttack.multCache;
+ } else if (this.type === 'pet') {
+ return this.$store.state.mult.items.snowdownPetAttack.multCache;
+ } else {
+ return 1;
+ }
+ },
+ playerName() {
+ return this.$store.state.system.playerName ?? this.$vuetify.lang.t('$vuetify.info.statistics.defaultPlayerName');
}
}
}
diff --git a/src/components/partial/event/SnowdownInventory.vue b/src/components/partial/event/SnowdownInventory.vue
index 2898c2e..acf4af5 100644
--- a/src/components/partial/event/SnowdownInventory.vue
+++ b/src/components/partial/event/SnowdownInventory.vue
@@ -32,7 +32,7 @@ import PriceTag from '../../render/PriceTag.vue';
export default {
components: { Currency, PriceTag },
data: () => ({
- currencies: ['dough', 'cinnamon', 'sapling', 'water', 'snow', 'yarn', 'snowball', 'snowdownToken']
+ currencies: ['sapling', 'yarn', 'dough', 'snow', 'snowball', 'snowdownToken']
}),
computed: {
...mapState({
diff --git a/src/components/partial/event/SnowdownItemList.vue b/src/components/partial/event/SnowdownItemList.vue
index d329eb4..fb2d327 100644
--- a/src/components/partial/event/SnowdownItemList.vue
+++ b/src/components/partial/event/SnowdownItemList.vue
@@ -40,6 +40,20 @@
{{ $vuetify.lang.t('$vuetify.event.snowdown.buyItemDescription') }}
+
+
+
+
+
+
+ mdi-plus
+ {{ $vuetify.lang.t(`$vuetify.event.snowdown.buyItem`) }}
+
+
+
+ {{ $vuetify.lang.t('$vuetify.event.snowdown.buyItemDescription') }}
+
+
@@ -60,10 +74,12 @@ export default {
rewardProducer: state => state.snowdown.rewardProducer,
rewardItem: state => state.snowdown.rewardItem,
snowball: state => state.currency.event_snowball.value,
- snow: state => state.currency.event_snow.value
+ snow: state => state.currency.event_snow.value,
+ topaz: state => state.currency.gem_topaz.value,
}),
...mapGetters({
- itemSnowCost: 'snowdown/itemSnowCost'
+ itemSnowCost: 'snowdown/itemSnowCost',
+ itemTopazCost: 'snowdown/itemTopazCost',
}),
itemList() {
let arr = [];
@@ -98,7 +114,7 @@ export default {
this.rerollMode = !this.rerollMode;
},
rerollItem(name) {
- if (this.rerollMode && this.snowball >= this.rerollCost && this.rewardItem === null) {
+ if (this.rerollMode && this.snowball >= this.rerollCost && this.rewardItem === null && this.$store.state.snowdown.item[name].type !== 'producer') {
this.$store.dispatch('snowdown/rerollItem', name);
this.rerollMode = false;
}
@@ -107,6 +123,11 @@ export default {
if (this.snow >= this.itemSnowCost && this.rewardItem === null) {
this.$store.dispatch('snowdown/buySnowItem');
}
+ },
+ buyTopazItem() {
+ if (this.topaz >= this.itemTopazCost && this.rewardItem === null) {
+ this.$store.dispatch('snowdown/buyTopazItem');
+ }
}
}
}
diff --git a/src/components/partial/farm/CropCard.vue b/src/components/partial/farm/CropCard.vue
index bb3d89d..ca70b8c 100644
--- a/src/components/partial/farm/CropCard.vue
+++ b/src/components/partial/farm/CropCard.vue
@@ -135,6 +135,7 @@
{{ $vuetify.lang.t(`$vuetify.farm.expToLevelUp`, $formatNum(harvestsNeeded)) }}
+ {{ $vuetify.lang.t(`$vuetify.farm.prestige.increasedGLRequirement`) }}
diff --git a/src/components/partial/gallery/Color.vue b/src/components/partial/gallery/Color.vue
index 638799d..a240553 100644
--- a/src/components/partial/gallery/Color.vue
+++ b/src/components/partial/gallery/Color.vue
@@ -208,7 +208,7 @@ export default {
return [
{type: 'mult', name: `currencyGallery${ capitalize(this.name) }Gain`, before: level > 0 ? Math.pow(2, level) : null, after: Math.pow(2, nextLevel)},
{type: 'mult', name: `gallery${ capitalize(this.name) }Conversion`, before: level > 0 ? Math.pow(2, level) : null, after: Math.pow(2, nextLevel)},
- {type: 'base', name: `currencyGallery${ capitalize(this.name) }DrumCap`, before: level > 0 ? (25 * level) : null, after: 25 * nextLevel}
+ {type: 'base', name: `currencyGallery${ capitalize(this.name) }DrumCap`, before: level > 0 ? (10 * level) : null, after: 10 * nextLevel}
];
},
canvasUntilNext() {
diff --git a/src/gbPlugin.js b/src/gbPlugin.js
index d35b44c..5fbb43e 100644
--- a/src/gbPlugin.js
+++ b/src/gbPlugin.js
@@ -1,9 +1,10 @@
-const { formatNum, formatTime, formatRoman } = require("./js/utils/format");
+const { formatNum, formatTime, formatRoman, formatInt } = require("./js/utils/format");
export default {
install: function(Vue) {
Vue.prototype.$formatNum = formatNum;
Vue.prototype.$formatTime = formatTime;
Vue.prototype.$formatRoman = formatRoman;
+ Vue.prototype.$formatInt = formatInt;
}
}
diff --git a/src/js/constants.js b/src/js/constants.js
index b3e87bc..4659f97 100644
--- a/src/js/constants.js
+++ b/src/js/constants.js
@@ -108,8 +108,8 @@ export const WEATHER_CHAOS_BAIT_COST = 90;
export const NIGHT_HUNT_HINT_PENALTY = 0.1;
-export const SNOWDOWN_FIGHT_COST = 5;
-export const SNOWDOWN_REROLL_COST = 50;
-export const SNOWDOWN_BOOST_COST = 140;
+export const SNOWDOWN_FIGHT_COST = 8;
+export const SNOWDOWN_REROLL_COST = 30;
+export const SNOWDOWN_BOOST_COST = 55;
export const NIGHT_HUNT_GL_BOOST = 1.01;
diff --git a/src/js/init.js b/src/js/init.js
index 71a3cc4..6a61479 100644
--- a/src/js/init.js
+++ b/src/js/init.js
@@ -60,8 +60,8 @@ function loadGame(file, runPrepare = true) {
store.commit('system/updateKey', {key: 'currentDay', value: getDay(new Date(store.state.system.timestamp * 1000))});
store.commit('system/generatePlayerId');
- store.dispatch('farm/updateFieldCaches');
store.dispatch('farm/applyEarlyGameBuff');
+ store.dispatch('farm/updateFieldCaches');
store.dispatch('meta/globalLevelUnlocks');
advance();
diff --git a/src/js/modules/event.js b/src/js/modules/event.js
index d789a8f..ab2e200 100644
--- a/src/js/modules/event.js
+++ b/src/js/modules/event.js
@@ -172,18 +172,25 @@ export default {
// snowdown mults
snowdownAttack: {baseValue: 4},
snowdownHealth: {baseValue: 40, round: true},
- snowdownDefense: {},
+ snowdownDefense: {round: true},
snowdownCritRating: {},
snowdownBlockRating: {},
- snowdownLootRating: {},
snowdownPetAttack: {},
snowdownPetHealth: {round: true},
- snowdownPetDefense: {},
+ snowdownPetDefense: {round: true},
snowdownPetCritRating: {},
snowdownPetBlockRating: {},
snowdownAllAttack: {group: ['snowdownAttack', 'snowdownPetAttack']},
- snowdownAllHealth: {group: ['snowdownHealth', 'snowdownPetHealth']}
+ snowdownAllHealth: {group: ['snowdownHealth', 'snowdownPetHealth']},
+ snowdownAllDefense: {group: ['snowdownDefense', 'snowdownPetDefense']},
+ snowdownRevengeStats: {display: 'percent'},
+ snowdownRevengeCrit: {},
+ snowdownRevengeBlock: {},
+ snowdownResourceGain: {},
},
+ multGroup: [
+ {mult: 'snowdownResourceGain', name: 'currencyGain', subtype: 'snowdownResource'},
+ ],
currency: {
// cinders currencies
light: {type: 'cinders', color: 'yellow', icon: 'mdi-lightbulb-on', gainMult: {}},
@@ -248,12 +255,10 @@ export default {
feather: {type: 'nightHunt', color: 'skyblue', icon: 'mdi-feather'},
// snowdown currencies
- dough: {type: 'snowdown', color: 'beige', icon: 'mdi-liquid-spot'},
- cinnamon: {type: 'snowdown', color: 'brown', icon: 'mdi-script'},
- sapling: {type: 'snowdown', color: 'green', icon: 'mdi-sprout'},
- water: {type: 'snowdown', color: 'blue', icon: 'mdi-water'},
- snow: {type: 'snowdown', color: 'light-blue', icon: 'mdi-snowflake'},
- yarn: {type: 'snowdown', color: 'red', icon: 'mdi-link'},
+ sapling: {type: 'snowdown', subtype: 'snowdownResource', color: 'green', icon: 'mdi-sprout', gainMult: {display: 'perSecond'}, showGainMult: true, showGainTimer: true},
+ yarn: {type: 'snowdown', subtype: 'snowdownResource', color: 'red', icon: 'mdi-link', gainMult: {display: 'perSecond'}, showGainMult: true, showGainTimer: true},
+ dough: {type: 'snowdown', subtype: 'snowdownResource', color: 'beige', icon: 'mdi-liquid-spot', gainMult: {display: 'perSecond'}, showGainMult: true, showGainTimer: true},
+ snow: {type: 'snowdown', subtype: 'snowdownResource', color: 'light-blue', icon: 'mdi-snowflake', gainMult: {display: 'perSecond'}, showGainMult: true, showGainTimer: true},
// topaz drop replacement currencies
wax: {type: 'cinders', color: 'pale-yellow', icon: 'mdi-beehive-outline'},
@@ -541,6 +546,12 @@ export default {
if (store.state.snowdown.itemsBought > 0) {
obj.snowdown_itemsBought = store.state.snowdown.itemsBought;
}
+ if (store.state.snowdown.itemsBoughtTopaz > 0) {
+ obj.snowdown_itemsBoughtTopaz = store.state.snowdown.itemsBoughtTopaz;
+ }
+ if (store.state.snowdown.revenge > 0) {
+ obj.snowdown_revenge = store.state.snowdown.revenge;
+ }
let items = {};
let hasItems = false;
@@ -745,6 +756,13 @@ export default {
if (data.snowdown_itemsBought !== undefined) {
store.commit('snowdown/updateKey', {key: 'itemsBought', value: data.snowdown_itemsBought});
}
+ if (data.snowdown_itemsBoughtTopaz !== undefined) {
+ store.commit('snowdown/updateKey', {key: 'itemsBoughtTopaz', value: data.snowdown_itemsBoughtTopaz});
+ }
+ if (data.snowdown_revenge !== undefined) {
+ store.commit('snowdown/updateKey', {key: 'revenge', value: data.snowdown_revenge});
+ store.dispatch('snowdown/applyRevengeEffect');
+ }
if (data.snowdown_item !== undefined) {
for (const [key, elem] of Object.entries(data.snowdown_item)) {
store.commit('snowdown/updateItemKey', {name: key, key: 'amount', value: elem});
diff --git a/src/js/modules/event/snowdown/item.js b/src/js/modules/event/snowdown/item.js
index f413f2c..1a7cd34 100644
--- a/src/js/modules/event/snowdown/item.js
+++ b/src/js/modules/event/snowdown/item.js
@@ -1,28 +1,32 @@
export default {
// Producers
- rollingPin: {
- type: 'producer',
- icon: 'mdi-arrow-top-right-bottom-left-bold'
- },
forest: {
type: 'producer',
- icon: 'mdi-forest'
+ icon: 'mdi-forest',
+ effect: [
+ {name: 'currencyEventSaplingGain', type: 'base', value: lvl => Math.pow(2, lvl) * Math.pow(lvl + 1, 2) * 0.01}
+ ]
},
- spiceJar: {
+ shepherd: {
type: 'producer',
- icon: 'mdi-glass-mug'
+ icon: 'mdi-sheep',
+ effect: [
+ {name: 'currencyEventYarnGain', type: 'base', value: lvl => Math.pow(2, lvl) * Math.pow(lvl + 1, 2) * 0.01}
+ ]
},
- tap: {
+ rollingPin: {
type: 'producer',
- icon: 'mdi-water-pump'
+ icon: 'mdi-arrow-top-right-bottom-left-bold',
+ effect: [
+ {name: 'currencyEventDoughGain', type: 'base', value: lvl => Math.pow(2, lvl) * Math.pow(lvl + 1, 2) * 0.01}
+ ]
},
snowCannon: {
type: 'producer',
- icon: 'mdi-snowflake-alert'
- },
- shepherd: {
- type: 'producer',
- icon: 'mdi-sheep'
+ icon: 'mdi-snowflake-alert',
+ effect: [
+ {name: 'currencyEventSnowGain', type: 'base', value: lvl => Math.pow(2, lvl) * Math.pow(lvl + 1, 2) * 0.01}
+ ]
},
// Pets
@@ -60,29 +64,35 @@ export default {
// Pet boosts
animalTooth: {
type: 'petBoost',
- icon: 'mdi-tooth', effect: [
- {name: 'snowdownPetAttack', type: 'mult', value: lvl => lvl * 0.5 + 1}
+ icon: 'mdi-tooth',
+ effect: [
+ {name: 'snowdownPetAttack', type: 'base', value: lvl => lvl * 0.5},
+ {name: 'snowdownPetAttack', type: 'mult', value: lvl => lvl * 0.1 + 1},
]
},
collar: {
type: 'petBoost',
- icon: 'mdi-dog-service', effect: [
- {name: 'snowdownPetHealth', type: 'mult', value: lvl => lvl * 0.5 + 1}
+ icon: 'mdi-dog-service',
+ effect: [
+ {name: 'snowdownPetHealth', type: 'base', value: lvl => lvl * 5},
+ {name: 'snowdownPetHealth', type: 'mult', value: lvl => lvl * 0.1 + 1},
]
},
chili: {
type: 'petBoost',
- icon: 'mdi-chili-mild', effect: [
- {name: 'snowdownCritRating', type: 'base', value: lvl => lvl * 10},
- {name: 'snowdownPetCritRating', type: 'base', value: lvl => lvl * 20}
+ icon: 'mdi-chili-mild',
+ effect: [
+ {name: 'snowdownCritRating', type: 'base', value: lvl => lvl * 8},
+ {name: 'snowdownPetCritRating', type: 'base', value: lvl => lvl * 10},
]
},
drumstick: {
type: 'petBoost',
- icon: 'mdi-food-drumstick', effect: [
- {name: 'snowdownPetAttack', type: 'mult', value: lvl => lvl * 0.2 + 1},
- {name: 'snowdownPetHealth', type: 'mult', value: lvl => lvl * 0.2 + 1},
- {name: 'snowdownPetBlockRating', type: 'base', value: lvl => lvl * 5}
+ icon: 'mdi-food-drumstick',
+ effect: [
+ {name: 'snowdownPetAttack', type: 'mult', value: lvl => lvl * 0.1 + 1},
+ {name: 'snowdownPetHealth', type: 'mult', value: lvl => lvl * 0.1 + 1},
+ {name: 'snowdownPetBlockRating', type: 'base', value: lvl => lvl * 5},
]
},
mouse: {
@@ -192,42 +202,49 @@ export default {
// Filler items
sunShield: {
- icon: 'mdi-shield-sun', effect: [
+ icon: 'mdi-shield-sun',
+ effect: [
{name: 'snowdownDefense', type: 'base', value: lvl => lvl * 2}
]
},
moonShield: {
- icon: 'mdi-shield-moon', effect: [
+ icon: 'mdi-shield-moon',
+ effect: [
{name: 'snowdownDefense', type: 'base', value: lvl => lvl},
{name: 'snowdownBlockRating', type: 'base', value: lvl => lvl * 5}
]
},
fireplace: {
- icon: 'mdi-fireplace', effect: [
+ icon: 'mdi-fireplace',
+ effect: [
{name: 'snowdownHealth', type: 'base', value: lvl => lvl * 10},
{name: 'snowdownHealth', type: 'mult', value: lvl => lvl * 0.1 + 1}
]
},
specialSnowflake: {
- icon: 'mdi-snowflake-variant', effect: [
+ icon: 'mdi-snowflake-variant',
+ effect: [
{name: 'snowdownAttack', type: 'mult', value: lvl => lvl * 0.1 + 1},
{name: 'snowdownCritRating', type: 'base', value: lvl => lvl * 5}
]
},
candyCane: {
- icon: 'mdi-candycane', effect: [
+ icon: 'mdi-candycane',
+ effect: [
{name: 'snowdownHealth', type: 'base', value: lvl => lvl * 15},
{name: 'snowdownBlockRating', type: 'base', value: lvl => lvl * 5}
]
},
shovel: {
- icon: 'mdi-shovel', effect: [
+ icon: 'mdi-shovel',
+ effect: [
{name: 'snowdownAttack', type: 'base', value: lvl => lvl},
{name: 'snowdownAttack', type: 'mult', value: lvl => lvl * 0.1 + 1}
]
},
turkey: {
- icon: 'mdi-food-turkey', effect: [
+ icon: 'mdi-food-turkey',
+ effect: [
{name: 'snowdownAttack', type: 'base', value: lvl => lvl},
{name: 'snowdownHealth', type: 'mult', value: lvl => lvl * 0.1 + 1}
]
diff --git a/src/js/modules/event/snowdown/tick.js b/src/js/modules/event/snowdown/tick.js
index 9b0268b..ee12fa5 100644
--- a/src/js/modules/event/snowdown/tick.js
+++ b/src/js/modules/event/snowdown/tick.js
@@ -1,23 +1,10 @@
import store from "../../../../store";
-const producers = {
- rollingPin: 'dough',
- forest: 'sapling',
- spiceJar: 'cinnamon',
- tap: 'water',
- snowCannon: 'snow',
- shepherd: 'yarn'
-};
-
export default function(seconds) {
- for (const [key, elem] of Object.entries(producers)) {
- const amount = store.state.snowdown.item[key].amount;
- if (amount > 0) {
- store.dispatch('currency/gain', {
- feature: 'event',
- name: elem,
- amount: Math.pow(2, amount) * Math.pow(amount + 1, 2) * 0.01 * Math.pow(1.01, store.getters['meta/globalEventLevel']) * seconds
- });
+ ['sapling', 'yarn', 'dough', 'snow'].forEach(name => {
+ const gain = store.getters['mult/get'](store.getters['currency/gainMultName']('event', name));
+ if (gain > 0) {
+ store.dispatch('currency/gain', {feature: 'event', name, amount: gain * seconds});
}
- }
+ });
}
diff --git a/src/js/modules/event/snowdown/upgrade.js b/src/js/modules/event/snowdown/upgrade.js
index de3d299..343c6c4 100644
--- a/src/js/modules/event/snowdown/upgrade.js
+++ b/src/js/modules/event/snowdown/upgrade.js
@@ -1,44 +1,33 @@
export default {
pineTrees: {type: 'snowdown', price(lvl) {
- return {event_sapling: 250 * Math.pow(lvl + 1, 2) * Math.pow(2, lvl)};
+ return {event_sapling: 250 * Math.pow(lvl * 0.5 + 1, 2) * Math.pow(2, lvl)};
}, effect: [
- {name: 'snowdownAttack', type: 'base', value: lvl => lvl * 0.5}
+ {name: 'snowdownAllAttack', type: 'mult', value: lvl => Math.pow(1.02, lvl) * (lvl * 0.05 + 1)}
]},
woolHat: {type: 'snowdown', price(lvl) {
- return {event_yarn: 250 * Math.pow(lvl + 1, 2) * Math.pow(2, lvl)};
+ return {event_yarn: 250 * Math.pow(lvl * 0.5 + 1, 2) * Math.pow(2, lvl)};
}, effect: [
- {name: 'snowdownHealth', type: 'base', value: lvl => lvl * 5}
- ]},
- mulledWine: {type: 'snowdown', price(lvl) {
- return {event_cinnamon: 200 * Math.pow(lvl + 1, 2) * Math.pow(2 + lvl * 0.1, lvl)};
- }, effect: [
- {name: 'snowdownBlockRating', type: 'base', value: lvl => lvl * 2.5}
+ {name: 'snowdownAllHealth', type: 'mult', value: lvl => Math.pow(1.02, lvl) * (lvl * 0.05 + 1)},
+ {name: 'snowdownAllDefense', type: 'mult', value: lvl => Math.pow(1.02, lvl) * (lvl * 0.05 + 1)},
]},
cookies: {type: 'snowdown', price(lvl) {
- return {event_dough: 200 * Math.pow(lvl + 1, 2) * Math.pow(2 + lvl * 0.1, lvl)};
+ return {event_dough: 250 * Math.pow(lvl * 0.5 + 1, 2) * Math.pow(2, lvl)};
}, effect: [
- {name: 'snowdownCritRating', type: 'base', value: lvl => lvl * 5}
- ]},
- iceSculpture: {type: 'snowdown', price(lvl) {
- return {event_water: 250 * Math.pow(lvl + 1, 2) * Math.pow(2, lvl)};
- }, effect: [
- {name: 'snowdownLootRating', type: 'base', value: lvl => lvl * 2.5}
+ {name: 'snowdownRevengeStats', type: 'base', value: lvl => lvl * 0.0005},
+ {name: 'snowdownRevengeCrit', type: 'base', value: lvl => lvl * 0.06},
+ {name: 'snowdownRevengeBlock', type: 'base', value: lvl => lvl * 0.04},
]},
// topaz upgrades
- attackBoost: {type: 'snowdown', cap: 2, price(lvl) {
- return {gem_topaz: Math.pow(2, lvl) * 400};
+ attackBoost: {type: 'snowdown', price(lvl) {
+ return {gem_topaz: lvl * 50 + 150};
}, effect: [
- {name: 'snowdownAllAttack', type: 'mult', value: lvl => Math.pow(1.8, lvl)}
+ {name: 'snowdownAllAttack', type: 'mult', value: lvl => lvl * 0.5 + 1}
]},
- healthBoost: {type: 'snowdown', cap: 2, price(lvl) {
- return {gem_topaz: Math.pow(2, lvl) * 400};
+ healthBoost: {type: 'snowdown', price(lvl) {
+ return {gem_topaz: lvl * 40 + 100};
}, effect: [
- {name: 'snowdownAllHealth', type: 'mult', value: lvl => Math.pow(2, lvl)}
+ {name: 'snowdownAllHealth', type: 'mult', value: lvl => lvl * 0.5 + 1},
+ {name: 'snowdownAllDefense', type: 'mult', value: lvl => lvl * 0.5 + 1},
]},
- lootBoost: {type: 'snowdown', cap: 3, price(lvl) {
- return {gem_topaz: Math.pow(2, lvl) * 300};
- }, effect: [
- {name: 'snowdownLootRating', type: 'base', value: lvl => lvl * 6}
- ]}
}
diff --git a/src/js/modules/gallery/idea.js b/src/js/modules/gallery/idea.js
index 53a45b1..f779c77 100644
--- a/src/js/modules/gallery/idea.js
+++ b/src/js/modules/gallery/idea.js
@@ -3,7 +3,7 @@ import { getSequence } from "../../utils/math";
export default {
// Tier 1
makeItPretty: {tier: 1, owned: true, icon: 'mdi-image', color: 'deep-purple', effect: [
- {name: 'currencyGalleryBeautyGain', type: 'mult', value: lvl => lvl * 0.75 + 1},
+ {name: 'currencyGalleryBeautyGain', type: 'mult', value: lvl => lvl * 0.4 + getSequence(1, lvl) * 0.1 + 1},
]},
stompBerries: {tier: 1, owned: true, icon: 'mdi-fruit-grapes', color: 'red', effect: [
{name: 'currencyGalleryRedGain', type: 'mult', value: lvl => Math.pow(2, lvl)},
@@ -16,7 +16,7 @@ export default {
{name: 'currencyGalleryRedGain', type: 'mult', value: lvl => Math.pow(0.5, lvl / 2)},
]},
sortWaste: {tier: 1, icon: 'mdi-delete-variant', color: 'pale-light-green', effect: [
- {name: 'currencyGalleryConverterCap', type: 'mult', value: lvl => lvl * 0.5 + 1},
+ {name: 'currencyGalleryConverterGain', type: 'mult', value: lvl => getSequence(2, lvl) * 0.25 + 1},
]},
advertise: {tier: 1, icon: 'mdi-cash', color: 'green', effect: [
{name: 'currencyGalleryCashGain', type: 'mult', value: lvl => lvl * 0.1 + 1},
@@ -42,17 +42,17 @@ export default {
{name: 'currencyGalleryYellowGain', type: 'mult', value: lvl => Math.pow(0.5, lvl / 2)},
]},
buildComposter: {tier: 2, icon: 'mdi-archive-sync', color: 'brown', effect: [
- {name: 'currencyGalleryConverterGain', type: 'mult', value: lvl => getSequence(1, lvl) * 0.5 + 1},
- {name: 'currencyGalleryConverterCap', type: 'mult', value: lvl => lvl * 0.1 + 1},
+ {name: 'currencyGalleryConverterCap', type: 'mult', value: lvl => lvl * 0.5 + 1},
]},
observeRainbow: {tier: 2, icon: 'mdi-looks', color: 'babypink', effect: [
- {name: 'galleryColorGain', type: 'mult', value: lvl => lvl * 0.1 + 1},
+ {name: 'galleryColorGain', type: 'mult', value: lvl => lvl * 0.12 + 1},
]},
buildRedReservoir: {tier: 2, icon: 'mdi-hoop-house', color: 'red', effect: [
- {name: 'currencyGalleryRedDrumCap', type: 'mult', value: lvl => lvl * 0.25 + 1},
+ {name: 'currencyGalleryRedDrumCap', type: 'mult', value: lvl => lvl * 0.35 + 1},
]},
orderMassiveSafe: {tier: 2, icon: 'mdi-safe-square', color: 'dark-grey', effect: [
- {name: 'galleryColorDrumCap', type: 'base', value: lvl => getSequence(3, lvl)},
+ {name: 'galleryColorDrumCap', type: 'base', value: lvl => lvl * 2},
+ {name: 'galleryCanvasSpeed', type: 'mult', value: lvl => 1 - (lvl / (lvl + 10))},
]},
buyPen: {tier: 2, icon: 'mdi-pen', color: 'indigo', effect: [
{name: 'galleryShapeGain', type: 'mult', value: lvl => lvl * 0.12 + 1},
@@ -73,13 +73,13 @@ export default {
{name: 'galleryColorDrumChance', type: 'mult', value: lvl => lvl * 0.4 + 1},
]},
buildOrangeReservoir: {tier: 3, icon: 'mdi-hoop-house', color: 'orange', effect: [
- {name: 'currencyGalleryOrangeDrumCap', type: 'mult', value: lvl => lvl * 0.25 + 1},
+ {name: 'currencyGalleryOrangeDrumCap', type: 'mult', value: lvl => lvl * 0.35 + 1},
]},
thinkHarder: {tier: 3, icon: 'mdi-head-lightbulb', color: 'amber', effect: [
{name: 'galleryInspirationStart', type: 'base', value: lvl => lvl * 2},
]},
paintFaster: {tier: 3, icon: 'mdi-brush', color: 'orange-red', effect: [
- {name: 'galleryCanvasSpeed', type: 'mult', value: lvl => lvl * 0.15 + 1},
+ {name: 'galleryCanvasSpeed', type: 'mult', value: lvl => lvl * 0.25 + 1},
]},
buyBrush: {tier: 3, icon: 'mdi-brush-variant', color: 'beige', effect: [
{name: 'gallerySpecialShapeChance', type: 'base', value: lvl => lvl * 0.002},
@@ -98,7 +98,7 @@ export default {
{name: 'currencyGalleryDeep-orangeGain', type: 'mult', value: lvl => Math.pow(0.5, lvl / 2)},
]},
buildYellowReservoir: {tier: 4, icon: 'mdi-hoop-house', color: 'yellow', effect: [
- {name: 'currencyGalleryYellowDrumCap', type: 'mult', value: lvl => lvl * 0.25 + 1},
+ {name: 'currencyGalleryYellowDrumCap', type: 'mult', value: lvl => lvl * 0.35 + 1},
]},
paintForFun: {tier: 4, icon: 'mdi-emoticon-happy', color: 'pink', effect: [
{name: 'currencyGalleryBeautyGain', type: 'mult', value: lvl => Math.pow(4, lvl)},
@@ -127,10 +127,10 @@ export default {
{name: 'currencyGalleryLight-greenGain', type: 'mult', value: lvl => Math.pow(0.5, lvl / 2)},
]},
buildGreenReservoir: {tier: 5, icon: 'mdi-hoop-house', color: 'green', effect: [
- {name: 'currencyGalleryGreenDrumCap', type: 'mult', value: lvl => lvl * 0.25 + 1},
+ {name: 'currencyGalleryGreenDrumCap', type: 'mult', value: lvl => lvl * 0.35 + 1},
]},
beMysterious: {tier: 5, icon: 'mdi-wizard-hat', color: 'pale-purple', effect: [
- {name: 'currencyGalleryMysteryShapeGain', type: 'base', value: lvl => (lvl % 2 === 0) ? (getSequence(1, lvl / 2) * 2) : Math.pow((lvl + 1) / 2, 2)},
+ {name: 'currencyGalleryMysteryShapeGain', type: 'base', value: lvl => lvl},
]},
// Tier 6
@@ -145,6 +145,6 @@ export default {
{name: 'currencyGalleryLight-blueGain', type: 'mult', value: lvl => Math.pow(0.5, lvl / 2)},
]},
buildBlueReservoir: {tier: 6, icon: 'mdi-hoop-house', color: 'blue', effect: [
- {name: 'currencyGalleryBlueDrumCap', type: 'mult', value: lvl => lvl * 0.25 + 1},
+ {name: 'currencyGalleryBlueDrumCap', type: 'mult', value: lvl => lvl * 0.35 + 1},
]},
}
diff --git a/src/js/modules/gallery/upgradeShape.js b/src/js/modules/gallery/upgradeShape.js
index f60f374..cf10eb0 100644
--- a/src/js/modules/gallery/upgradeShape.js
+++ b/src/js/modules/gallery/upgradeShape.js
@@ -7,26 +7,26 @@ export default {
bigCircle: {type: 'shape', price(lvl) {
return {gallery_circle: Math.pow(lvl * 0.01 + 1.35, lvl) * 100};
}, effect: [
- {name: 'galleryShapeGain', type: 'mult', value: lvl => Math.pow(1.3, lvl)}
+ {name: 'galleryShapeGain', type: 'mult', value: lvl => Math.pow(1.25, lvl)}
]},
wellDrawnCircle: {type: 'shape', price(lvl) {
- return {gallery_circle: Math.pow(lvl * 0.05 + 1.75, lvl) * 5000};
+ return {gallery_circle: Math.pow(lvl * 0.05 + 2.25, lvl) * 5000};
}, effect: [
- {name: 'currencyGalleryRedGain', type: 'mult', value: lvl => getSequence(1, lvl + 4) * 0.01 + 1}
+ {name: 'currencyGalleryRedGain', type: 'mult', value: lvl => lvl * 0.02 + 1}
]},
bigRectangle: {type: 'shape', requirement() {
return store.state.gallery.shape.rectangle.unlocked;
}, price(lvl) {
return {gallery_rectangle: Math.pow(lvl * 0.1 + 1.75, lvl) * 1000};
}, effect: [
- {name: 'currencyGalleryMotivationCap', type: 'base', value: lvl => lvl * 3}
+ {name: 'currencyGalleryMotivationCap', type: 'base', value: lvl => lvl}
]},
wellDrawnRectangle: {type: 'shape', requirement() {
return store.state.gallery.shape.rectangle.unlocked;
}, price(lvl) {
- return {gallery_rectangle: Math.pow(lvl * 0.05 + 1.75, lvl) * 6500};
+ return {gallery_rectangle: Math.pow(lvl * 0.05 + 2.25, lvl) * 6500};
}, effect: [
- {name: 'currencyGalleryConverterCap', type: 'base', value: lvl => lvl * 100}
+ {name: 'currencyGalleryConverterCap', type: 'base', value: lvl => lvl * 40}
]},
creativity: {type: 'shape', requirement() {
return store.state.gallery.shape.triangle.unlocked;
@@ -46,14 +46,14 @@ export default {
{name: 'sparkles', type: 'galleryShape', value: lvl => lvl >= 4},
{name: 'hourglass', type: 'galleryShape', value: lvl => lvl >= 5},
{name: 'chest', type: 'galleryShape', value: lvl => lvl >= 6},
- {name: 'currencyGalleryMotivationGain', type: 'base', value: lvl => lvl >= 7 ? ((lvl - 6) * 0.01) : null}
+ {name: 'currencyGalleryMotivationGain', type: 'base', value: lvl => lvl >= 7 ? ((lvl - 6) * 0.005) : null}
]},
wellDrawnTriangle: {type: 'shape', requirement() {
return store.state.gallery.shape.triangle.unlocked;
}, price(lvl) {
- return {gallery_triangle: Math.pow(lvl * 0.05 + 1.75, lvl) * 8500};
+ return {gallery_triangle: Math.pow(lvl * 0.05 + 2.25, lvl) * 8500};
}, effect: [
- {name: 'currencyGalleryCashGain', type: 'mult', value: lvl => lvl * 0.02 + 1}
+ {name: 'currencyGalleryCashGain', type: 'mult', value: lvl => lvl * 0.01 + 1}
]},
luckyStar: {type: 'shape', requirement() {
return store.state.gallery.shape.star.unlocked;
@@ -65,7 +65,7 @@ export default {
wellDrawnStar: {type: 'shape', requirement() {
return store.state.gallery.shape.star.unlocked;
}, price(lvl) {
- return {gallery_star: Math.pow(lvl * 0.05 + 1.75, lvl) * buildNum(24, 'K')};
+ return {gallery_star: Math.pow(lvl * 0.05 + 2.25, lvl) * buildNum(24, 'K')};
}, effect: [
{name: 'currencyGalleryRedDrumCap', type: 'base', value: lvl => lvl * 3}
]},
@@ -79,7 +79,7 @@ export default {
wellDrawnEllipse: {type: 'shape', requirement() {
return store.state.gallery.shape.ellipse.unlocked;
}, price(lvl) {
- return {gallery_ellipse: Math.pow(lvl * 0.1 + 2.5, lvl) * buildNum(150, 'K')};
+ return {gallery_ellipse: Math.pow(lvl * 0.3 + 12.5, lvl) * buildNum(850, 'K')};
}, effect: [
{name: 'galleryColorDrumCap', type: 'base', value: lvl => lvl}
]},
@@ -89,14 +89,14 @@ export default {
return {gallery_heart: Math.pow(lvl + 8, lvl) * buildNum(2, 'M')};
}, effect: [
{name: 'galleryShapeGain', type: 'mult', value: lvl => Math.pow(2, lvl)},
- {name: 'currencyGalleryMotivationCap', type: 'base', value: lvl => lvl * 8}
+ {name: 'currencyGalleryMotivationCap', type: 'base', value: lvl => lvl * 2}
]},
wellDrawnHeart: {type: 'shape', requirement() {
return store.state.gallery.shape.heart.unlocked;
}, price(lvl) {
- return {gallery_heart: Math.pow(lvl * 0.05 + 1.75, lvl) * buildNum(600, 'K')};
+ return {gallery_heart: Math.pow(lvl * 0.05 + 2.25, lvl) * buildNum(600, 'K')};
}, effect: [
- {name: 'galleryColorGain', type: 'mult', value: lvl => lvl * 0.01 + 1}
+ {name: 'galleryColorGain', type: 'mult', value: lvl => lvl * 0.005 + 1}
]},
bigSquare: {type: 'shape', requirement() {
return store.state.gallery.shape.square.unlocked;
@@ -108,7 +108,7 @@ export default {
wellDrawnSquare: {type: 'shape', requirement() {
return store.state.gallery.shape.square.unlocked;
}, price(lvl) {
- return {gallery_square: Math.pow(lvl * 0.15 + 2.5, lvl) * buildNum(3.75, 'M')};
+ return {gallery_square: Math.pow(lvl * 0.15 + 3.5, lvl) * buildNum(3.75, 'M')};
}, effect: [
{name: 'currencyGalleryOrangeDrumCap', type: 'base', value: lvl => lvl * 3},
{name: 'currencyGalleryYellowDrumCap', type: 'base', value: lvl => lvl * 2},
@@ -126,9 +126,9 @@ export default {
wellDrawnOctagon: {type: 'shape', requirement() {
return store.state.gallery.shape.octagon.unlocked;
}, price(lvl) {
- return {gallery_octagon: Math.pow(lvl * 0.2 + 1.75, lvl) * buildNum(225, 'M')};
+ return {gallery_octagon: Math.pow(lvl * 0.2 + 2.25, lvl) * buildNum(225, 'M')};
}, effect: [
- {name: 'galleryInspirationBase', type: 'mult', value: lvl => 1 / (0.02 * lvl + 1)}
+ {name: 'galleryInspirationBase', type: 'mult', value: lvl => 1 / (0.01 * lvl + 1)}
]},
bigPentagon: {type: 'shape', requirement() {
return store.state.gallery.shape.pentagon.unlocked;
@@ -142,9 +142,9 @@ export default {
wellDrawnPentagon: {type: 'shape', requirement() {
return store.state.gallery.shape.pentagon.unlocked;
}, price(lvl) {
- return {gallery_pentagon: Math.pow(lvl * 0.1 + 1.75, lvl) * buildNum(13.5, 'B')};
+ return {gallery_pentagon: Math.pow(lvl * 0.1 + 2.25, lvl) * buildNum(13.5, 'B')};
}, effect: [
- {name: 'currencyGalleryPackageCap', type: 'base', value: lvl => lvl * 3}
+ {name: 'currencyGalleryPackageCap', type: 'base', value: lvl => lvl * 2}
]},
bigHexagon: {type: 'shape', requirement() {
return store.state.gallery.shape.hexagon.unlocked;
@@ -158,8 +158,8 @@ export default {
wellDrawnHexagon: {type: 'shape', requirement() {
return store.state.gallery.shape.hexagon.unlocked;
}, price(lvl) {
- return {gallery_hexagon: Math.pow(lvl * 0.1 + 1.75, lvl) * buildNum(2, 'T')};
+ return {gallery_hexagon: Math.pow(lvl * 0.1 + 2.25, lvl) * buildNum(2, 'T')};
}, effect: [
- {name: 'galleryCanvasSpeed', type: 'mult', value: lvl => lvl * 0.02 + 1}
+ {name: 'galleryCanvasSpeed', type: 'mult', value: lvl => lvl * 0.01 + 1}
]},
}
diff --git a/src/js/modules/horde/upgradePrestige.js b/src/js/modules/horde/upgradePrestige.js
index 18eb90b..48149ec 100644
--- a/src/js/modules/horde/upgradePrestige.js
+++ b/src/js/modules/horde/upgradePrestige.js
@@ -114,7 +114,8 @@ export default {
deepHatred: {type: 'prestige', cap: 30, requirementBase, requirementStat, requirementValue: 151, price(lvl) {
return {horde_soulEmpowered: Math.pow(lvl * 0.02 + 1.6, lvl) * buildNum(2.25, 'Sx')};
}, effect: [
- {name: 'hordeAttack', type: 'mult', value: lvl => Math.pow(1.1, lvl) * (lvl * 0.18 + 1)}
+ {name: 'hordeAttack', type: 'mult', value: lvl => Math.pow(1.06, lvl) * (lvl * 0.1 + 1)},
+ {name: 'hordeHealth', type: 'mult', value: lvl => Math.pow(1.03, lvl) * (lvl * 0.05 + 1)}
]},
spiritLure: {type: 'prestige', cap: 50, requirementBase, requirementStat, requirementValue: 181, price(lvl) {
return {horde_soulEmpowered: Math.pow(1.25, lvl) * buildNum(333, 'Sp')};
diff --git a/src/js/modules/meta.js b/src/js/modules/meta.js
index c632443..4c35ea9 100644
--- a/src/js/modules/meta.js
+++ b/src/js/modules/meta.js
@@ -23,6 +23,7 @@ import v1_4_2 from "./patchnote/v1_4_2";
import v1_5_1 from "./patchnote/v1_5_1";
import v1_5_2 from "./patchnote/v1_5_2";
import v1_5_3 from "./patchnote/v1_5_3";
+import v1_5_4 from "./patchnote/v1_5_4";
export default {
name: 'meta',
@@ -58,6 +59,7 @@ export default {
store.commit('system/initTheme', {name: key, ...elem});
}
for (const [key, elem] of Object.entries({
+ '1.5.4': v1_5_4,
'1.5.3': v1_5_3,
'1.5.2': v1_5_2,
'1.5.1': v1_5_1,
diff --git a/src/js/modules/migration/v1_5_4.js b/src/js/modules/migration/v1_5_4.js
new file mode 100644
index 0000000..9fac18f
--- /dev/null
+++ b/src/js/modules/migration/v1_5_4.js
@@ -0,0 +1,43 @@
+export default function(save) {
+ // Remove snowballs to prevent old version players from getting a massive advantage
+ if (save.currency.event_snowball !== undefined) {
+ delete save.currency.event_snowball;
+ }
+
+ // Convert tokens from the old to the new formula
+ let tokensExpected = 0;
+ const fights = save.event.snowdown_fight ?? 0;
+ for (let i = 0; i < fights; i++) {
+ tokensExpected += Math.floor(Math.pow(i * 0.35 + 1, 0.75) + 3);
+ }
+ if (save.stat.event_snowdownToken && save.currency.event_snowdownToken !== undefined) {
+ const tokenDiff = tokensExpected - save.stat.event_snowdownToken[0];
+ if (tokenDiff !== 0) {
+ save.currency.event_snowdownToken += tokenDiff;
+ if (tokenDiff > 0) {
+ save.stat.event_snowdownToken = [save.stat.event_snowdownToken[0] + tokenDiff, save.stat.event_snowdownToken[1] + tokenDiff];
+ }
+ }
+ }
+
+ // Convert removed producers
+ if (save.event.snowdown_item !== undefined) {
+ if (save.event.snowdown_item.spiceJar) {
+ save.event.snowdown_item.shepherd = (save.event.snowdown_item.shepherd ?? 0) + save.event.snowdown_item.spiceJar;
+ delete save.event.snowdown_item.spiceJar;
+ }
+ if (save.event.snowdown_item.tap) {
+ save.event.snowdown_item.forest = (save.event.snowdown_item.forest ?? 0) + save.event.snowdown_item.tap;
+ delete save.event.snowdown_item.tap;
+ }
+ }
+
+ // Convert levels of the well drawn ellipse upgrade
+ if (save.upgrade.gallery_wellDrawnEllipse) {
+ const newLvl = Math.ceil(save.upgrade.gallery_wellDrawnEllipse[1] / 2);
+ save.upgrade.gallery_wellDrawnEllipse[1] = newLvl;
+ save.upgrade.gallery_wellDrawnEllipse[2] = newLvl;
+ }
+
+ return save;
+}
diff --git a/src/js/modules/patchnote/v1_5_4.js b/src/js/modules/patchnote/v1_5_4.js
new file mode 100644
index 0000000..a409602
--- /dev/null
+++ b/src/js/modules/patchnote/v1_5_4.js
@@ -0,0 +1,189 @@
+export default {
+ day: '2024-11-23',
+ content: {
+ horde: [
+ {
+ unlock: 'hordeBrickTower',
+ type: 'balance',
+ text: '426'
+ },
+ ],
+ farm: [
+ {
+ type: 'bugfix',
+ text: '427'
+ },
+ {
+ unlock: 'farmCropExp',
+ type: 'balance',
+ text: '412'
+ },
+ {
+ unlock: 'farmCropExp',
+ type: 'balance',
+ text: '413'
+ },
+ ],
+ event: [
+ {
+ unlock: 'snowdownEvent',
+ type: 'new',
+ text: '415'
+ },
+ {
+ unlock: 'snowdownEvent',
+ type: 'change',
+ text: '416'
+ },
+ {
+ unlock: 'snowdownEvent',
+ type: 'new',
+ text: '417'
+ },
+ {
+ unlock: 'snowdownEvent',
+ type: 'change',
+ text: '418'
+ },
+ {
+ unlock: 'snowdownEvent',
+ type: 'balance',
+ text: '419',
+ balance: 'nerf',
+ before: '5',
+ after: '8'
+ },
+ {
+ unlock: 'snowdownEvent',
+ type: 'balance',
+ text: '420',
+ balance: 'buff',
+ before: '50',
+ after: '30'
+ },
+ {
+ unlock: 'snowdownEvent',
+ type: 'balance',
+ text: '421',
+ balance: 'buff',
+ before: '140',
+ after: '55'
+ },
+ {
+ unlock: 'snowdownEvent',
+ type: 'remove',
+ text: '422'
+ },
+ {
+ unlock: 'snowdownEvent',
+ type: 'change',
+ text: '423'
+ },
+ {
+ unlock: 'snowdownEvent',
+ type: 'new',
+ text: '424'
+ },
+ {
+ unlock: 'snowdownEvent',
+ type: 'clarity',
+ text: '425'
+ },
+ ],
+ gallery: [
+ {
+ unlock: 'galleryInspiration',
+ type: 'balance',
+ text: '402',
+ balance: 'change',
+ before: '+0.75x',
+ after: '+0.5x (+0.1x)'
+ },
+ {
+ unlock: 'galleryInspiration',
+ type: 'balance',
+ text: '403'
+ },
+ {
+ unlock: 'galleryInspiration',
+ type: 'balance',
+ text: '405',
+ balance: 'buff',
+ before: '+0.1x',
+ after: '+0.12x'
+ },
+ {
+ unlock: 'galleryDrums',
+ type: 'balance',
+ text: '399',
+ balance: 'nerf',
+ before: '+3 (+1)',
+ after: '+2'
+ },
+ {
+ unlock: 'galleryCanvas',
+ type: 'balance',
+ text: '400'
+ },
+ {
+ unlock: 'galleryDrums',
+ type: 'balance',
+ text: '401',
+ balance: 'buff',
+ before: '+0.25x',
+ after: '+0.35x'
+ },
+ {
+ unlock: 'galleryCanvas',
+ type: 'balance',
+ text: '404',
+ balance: 'buff',
+ before: '+0.18x',
+ after: '+0.25x'
+ },
+ {
+ unlock: 'galleryShape',
+ type: 'bugfix',
+ text: '406'
+ },
+ {
+ unlock: 'galleryShape',
+ type: 'context',
+ text: '411'
+ },
+ {
+ unlock: 'galleryShape',
+ type: 'balance',
+ text: '408'
+ },
+ {
+ unlock: 'galleryShape',
+ type: 'balance',
+ text: '409',
+ balance: 'nerf',
+ before: '180s (+7s)',
+ after: '30s (+3.7s)'
+ },
+ {
+ unlock: 'galleryShape',
+ type: 'balance',
+ text: '410'
+ },
+ {
+ unlock: 'galleryCanvas',
+ type: 'balance',
+ text: '407',
+ balance: 'nerf',
+ before: '+25',
+ after: '+10'
+ },
+ ],
+ village_1: [
+ {
+ unlock: 'villageSpecialIngredient',
+ type: 'qol',
+ text: '414'
+ },
+ ],
+ }
+}
diff --git a/src/js/modules/village.js b/src/js/modules/village.js
index 06871e4..cd55409 100644
--- a/src/js/modules/village.js
+++ b/src/js/modules/village.js
@@ -24,7 +24,16 @@ export default {
name: 'village',
tickspeed: 1,
unlockNeeded: 'villageFeature',
- tick(seconds, oldTime, newTime) {
+ forceTick(seconds, oldTime, newTime) {
+ // Get free boxes
+ if (store.state.unlock.villageSpecialIngredient.use) {
+ const dayDiff = Math.floor(newTime / (SECONDS_PER_DAY * 7)) - Math.floor(oldTime / (SECONDS_PER_DAY * 7));
+ if (dayDiff > 0) {
+ store.dispatch('consumable/gain', {name: 'village_ingredientBox', amount: dayDiff});
+ }
+ }
+ },
+ tick(seconds) {
store.commit('stat/add', {feature: 'village', name: 'timeSpent', value: seconds});
let diffs = {};
store.getters['currency/list']('village', 'regular').filter(elem => !['village_coin', 'village_joy'].includes(elem)).forEach(currency => {
@@ -193,14 +202,6 @@ export default {
});
}
}
-
- // Get free boxes
- if (store.state.unlock.villageSpecialIngredient.see) {
- const dayDiff = Math.floor(newTime / (SECONDS_PER_DAY * 7)) - Math.floor(oldTime / (SECONDS_PER_DAY * 7));
- if (dayDiff > 0) {
- store.dispatch('consumable/gain', {name: 'village_ingredientBox', amount: dayDiff});
- }
- }
},
unlock: [
'villageFeature',
diff --git a/src/js/savefile.js b/src/js/savefile.js
index 21b33ff..c2e2bcd 100644
--- a/src/js/savefile.js
+++ b/src/js/savefile.js
@@ -27,6 +27,7 @@ import { simpleHash } from "./utils/random";
import v1_5_0 from "./modules/migration/v1_5_0";
import v1_5_1 from "./modules/migration/v1_5_1";
import v1_5_3 from "./modules/migration/v1_5_3";
+import v1_5_4 from "./modules/migration/v1_5_4";
const migrations = {
'1.1.0': v1_1_0,
@@ -39,6 +40,7 @@ const migrations = {
'1.5.0': v1_5_0,
'1.5.1': v1_5_1,
'1.5.3': v1_5_3,
+ '1.5.4': v1_5_4,
};
export { checkLocal, saveLocal, loadFile, exportFile, cleanStore, getSavefile, getSavefileName, encodeFile, decodeFile }
@@ -500,7 +502,7 @@ function getSavefile() {
}
}
for (const [key, elem] of Object.entries(store.state.currency)) {
- if (elem.value > 0) {
+ if (elem.value !== 0) {
save.currency[key] = elem.value;
}
}
diff --git a/src/js/utils/format.js b/src/js/utils/format.js
index 6fc3876..ef6ff38 100644
--- a/src/js/utils/format.js
+++ b/src/js/utils/format.js
@@ -1,3 +1,5 @@
+import store from "../../store";
+
const numFormatters = [
'', 'K', 'M', 'B', 'T', 'Qa', 'Qi', 'Sx', 'Sp', 'O', 'N', 'D',
'UD', 'DD', 'TD', 'QaD', 'QiD', 'SxD', 'SpD', 'OD', 'ND', 'V',
@@ -13,7 +15,7 @@ const numFormatters = [
];
const numNegativeFormatters = ['m', 'µ', 'n', 'p', 'f', 'a', 'z', 'y'];
-export { numFormatters, numNegativeFormatters, formatNum, formatTime, formatGrade, formatRoman, buildNum, capitalize, decapitalize }
+export { numFormatters, numNegativeFormatters, formatNum, formatInt, formatTime, formatGrade, formatRoman, buildNum, capitalize, decapitalize }
function roundNear(num, decimals = 9) {
const numMod = Math.pow(10, decimals - Math.floor(Math.log10(num)));
@@ -65,6 +67,27 @@ function formatNum(amount, showDecimals = false) {
}
}
+/**
+ * Display a number with thousands separator
+ * @param {Number} num the number to show
+ * @returns {String}
+ */
+function formatInt(num) {
+ if (num < 10000) {
+ return num.toString();
+ }
+ let locale;
+ switch (store.state.system.settings.general.items.lang.value) {
+ case 'en':
+ locale = 'en-US';
+ break;
+ case 'de':
+ locale = 'de-DE';
+ break;
+ }
+ return num.toLocaleString(locale);
+}
+
/**
* Display time in a nice format
* @param {Number} seconds time in seconds
diff --git a/src/lang/de.js b/src/lang/de.js
index d6af6b2..ff7c627 100644
--- a/src/lang/de.js
+++ b/src/lang/de.js
@@ -841,21 +841,29 @@ export default {
name: 'Schneefall',
fightCount: 'Kampf',
fight: 'Kämpfen',
- fightDescription: 'Bekämpfe den gezeigten Gegner für ein paar Schneebälle. Beim Sieg erhältst du Schneebälle, Schneefall-Chips, einen Produzenten und eventuell einen Gegenstand. Den Gegenstand erhältst du garantiert für die ersten 5 Kämpfe. Deine Beutewertung erhöht die Chance auf einen Gegenstand und die Menge erhaltener Schneebälle und Schneefall-Chips.',
+ fightDescription: 'Bekämpfe den gezeigten Gegner für ein paar Schneebälle',
+ fightWin: 'Beim Sieg erhältst du',
+ fightWinProducer: 'einen Produzenten deiner Wahl',
+ fightWinItem: 'einen von drei zufälligen Gegenständen',
pickProducer: 'Wähle einen Produzenten',
pickItem: 'Wähle einen Gegenstand',
reroll: 'Neu würfeln',
- rerollDescription: 'Würfle einen Gegenstand im Besitz neu, dabei erhältst du einen neuen Gegenstand der selben Kategorie (Produzent oder Nicht-Produzent).',
+ rerollDescription: 'Würfle einen Gegenstand im Besitz neu',
buyItem: 'Gegenstand kaufen',
- buyItemDescription: 'Erhalte einen von drei zufälligen Nicht-Produzenten-Gegenständen',
- attackDescription: 'Menge an Schaden, den deine Angriffe anrichten. Der endgültige Schadenswert liegt zwischen 80% und 120% deines Angriffs.',
- healthDescription: 'Menge an Schaden, die einstecken kannst, bevor du einfrierst und kampfunfähig wirst.',
- defenseDescription: 'Reduziert eingehenden Schaden um einen flachen Wert.',
- critDescription: 'Erhöht die Chance auf einen kritischen Treffer um 1% pro Kritisch-Wertung. Kritische Treffer verursachen +10 Schaden. Über 25% erhältst du weniger kritische Chance pro Kritisch-Wertung, während die Chance sich 75% annähert. Für jedes 1% so verlorene kritische Chance erhältst du +0.2 kritischen Schaden.',
- blockDescription: 'Erhöht die Chance, eingehende Angriffe zu blockieren und keinen Schaden zu erleiden.',
+ buyItemDescription: 'Erhalte einen von drei zufälligen Gegenständen',
+ attackDescription: 'Menge an Schaden, den deine Angriffe anrichten. Der endgültige Schadenswert liegt zwischen 80% und 120% deines Angriffs',
+ healthDescription: 'Menge an Schaden, die einstecken kannst, bevor du einfrierst und kampfunfähig wirst',
+ defenseDescription: 'Reduziert eingehenden Schaden um einen flachen Wert',
+ critDescription: 'Erhöht die Chance auf einen kritischen Treffer um 1% pro Kritisch-Wertung. Kritische Treffer verursachen +10 Schaden. Über 25% erhältst du weniger kritische Chance pro Kritisch-Wertung, während die Chance sich 75% annähert. Für jedes 1% so verlorene kritische Chance erhältst du +0.2 kritischen Schaden. Multiplikative Angriffssteigerungen erhöhen auch den kritischen Schaden',
+ blockDescription: 'Erhöht die Chance, eingehende Angriffe zu blockieren und keinen Schaden zu erleiden',
boost: 'Erhalte sofort 1 Tag Fortschritt',
+ revenge: {
+ name: 'Rache',
+ description: 'Du hast {0} Schlacht(en) in Folge verloren. Dies erhöht deine Werte, bis du eine Schneeballschlacht gewinnst',
+ statsBase: 'Erhalte +5% Angriff und Leben, wenn du eine Schlacht verlierst',
+ statsScaling: 'Erhalte +5% Angriff und Leben, +{0} Kritisch-Wertung und +{1} Blockwertung, wenn du eine Schlacht verlierst. Außerdem bekommst du zusätzliche +{2}% Angriff und Leben pro verlorener Schlacht, wenn du eine Schlacht verlierst'
+ },
fighter: {
- player: 'Spieler',
snowOwl: 'Schneeeule',
dog: 'Hund',
cat: 'Katze',
@@ -865,38 +873,32 @@ export default {
toddler: 'Kleinkind',
babysitter: 'Babysitter',
kid: 'Kind',
- fatKid: 'Fettes Kind',
+ toughKid: 'Hartnäckiges Kind',
teenager: 'Teenager',
bully: 'Rowdy',
youngAdult: 'Jugendlicher',
hooligan: 'Hooligan',
adult: 'Erwachsener',
+ veteran: 'Veteran',
+ wallOfIce: 'Eiswand',
snowBot: 'Schnee-BOT'
},
item: {
rollingPin: {
name: 'Nudelholz',
- description: 'Produziert Teig, der zu Keksen gebacken werden kann und deine Kritisch-Wertung erhöht'
+ description: ''
},
forest: {
name: 'Wald',
- description: 'Produziert Setzlinge, welche zu Tannen wachsen können und so deinen Angriff steigern'
- },
- spiceJar: {
- name: 'Gewürzglas',
- description: 'Produziert Zimt, der für Glühwein gebraucht wird. Dadurch steigt deine Blockwertung'
- },
- tap: {
- name: 'Wasserhahn',
- description: 'Produziert Wasser, woraus Eisskulpturen entstehen, was deine Beutewertung aufbessert'
+ description: ''
},
snowCannon: {
name: 'Schneekanone',
- description: 'Produziert Schnee, womit Schneemänner gebaut werden, was dir zusätzliche Gegenstände gibt'
+ description: ''
},
shepherd: {
name: 'Schafhirte',
- description: 'Produziert Garn, woraus Wollmützen gemacht werden, was dein Leben erhöht'
+ description: ''
},
animalTooth: {
name: 'Tierzahn',
@@ -1299,6 +1301,7 @@ export default {
ritualPotionLevel: 'Trank-Stufe',
ritualHint: 'Gefundene Hinweise',
ritualIngredient: 'Bonuszutat',
+ snowdownRevenge: 'Rache',
interest: 'Zinsen',
multiplier: 'Multiplikator',
},
@@ -2112,7 +2115,8 @@ export default {
current: 'Deine aktuelle Prestige-Stufe ist {0}, was den Ertrag aller Pflanzen um x{1} erhöht.',
next: 'Ein Prestige dieser Pflanze erhöht die Prestige-Stufe um {0}. Dadurch steigt sie auf {1}, was den Ertrag aller Pflanzen auf x{2} erhöht.',
nextNoEffect: 'Die Stufe dieser Pflanze ist nicht höher als ihre Prestige-Stufe. Ein Prestige wird die Prestige-Stufe nicht anheben, aber trotzdem Stufe und Gene zurücksetzen.',
- cropOnField: 'Du kannst gerade keinen Prestige durchführen, da sich diese Pflanze noch auf dem Feld befindet'
+ cropOnField: 'Du kannst gerade keinen Prestige durchführen, da sich diese Pflanze noch auf dem Feld befindet',
+ increasedGLRequirement: 'Nach dem Erreichen von Stufe 10 erhöhen Pflanzen nur noch jede zweite Stufe die globale Stufe',
},
button: {
plantAll: 'Säe die ausgewählte Pflanze ({0}) auf allen leeren Feldern aus. Du kannst auch Saat auf ein einzelnes Feld legen, indem du es anklickst',
@@ -2305,7 +2309,7 @@ export default {
accelerator: 'Die 8 umliegenden Formen werden besonders gesammelt. Wenn alle 8 von ihnen gleich sind, wird sämtliche Motivation verbraucht um davon noch mehr Formen zu erhalten',
sparkles: 'Die 4 direkt anliegenden Formen werden regulär gesammelt (wenn möglich) und zählen als eine große Kombo',
hourglass: 'Erhalte sofort Konverter und Pakete, sammle Formen um die Zeit zu erhöhen',
- chest: '10 naheliegende Formen werden besonders gesammelt, die 8 umliegenden und die links und rechts daneben. Wenn alle 10 Formen verschieden sind, gibt es eine besondere Belohnung'
+ chest: '10 naheliegende Formen werden besonders gesammelt, die 8 umliegenden und die links und rechts daneben. Wenn alle 10 Formen verschieden sind, gibt es eine besondere Belohnung und der Multiplikator für besonderes Sammeln wird erneut mit dem Wurzelwert angewendet'
},
buyFor: {
0: 'Kaufe',
diff --git a/src/lang/de/currency.js b/src/lang/de/currency.js
index 84ca009..7eb4e51 100644
--- a/src/lang/de/currency.js
+++ b/src/lang/de/currency.js
@@ -281,18 +281,10 @@ export default {
name: 'Teig',
description: 'Warum Kekse essen wenn man auch gleich den Teig essen kann?'
},
- event_cinnamon: {
- name: 'Zimt',
- description: 'Was wäre ein Winter nur ohne Zimt?'
- },
event_sapling: {
name: 'Setzling',
description: 'Gewöhnliche Tannensetzlinge. Mit genug Zeit können daraus riesige Tannen werden'
},
- event_water: {
- name: 'Wasser',
- description: 'Sauberes und kaltes Wasser aus dem Hahn'
- },
event_snow: {
name: 'Schnee',
description: 'Er ist kalt, überall, und mit genug davon kann man ganze Schneemänner bauen'
diff --git a/src/lang/de/mult.js b/src/lang/de/mult.js
index 7a7ae67..c679db8 100644
--- a/src/lang/de/mult.js
+++ b/src/lang/de/mult.js
@@ -237,7 +237,6 @@ export default {
snowdownDefense: 'Abwehr',
snowdownCritRating: 'Kritisch-Wertung',
snowdownBlockRating: 'Blockwertung',
- snowdownLootRating: 'Beutewertung',
snowdownPetAttack: 'Haustier-Angriff',
snowdownPetHealth: 'Haustier-Leben',
snowdownPetDefense: 'Haustier-Abwehr',
@@ -245,4 +244,8 @@ export default {
snowdownPetBlockRating: 'Haustier-Blockwertung',
snowdownAllAttack: 'Gesamter Angriff',
snowdownAllHealth: 'Gesamte Leben',
+ snowdownAllDefense: 'Gesamte Abwehr',
+ snowdownRevengeStats: 'Rachewerte',
+ snowdownRevengeCrit: 'Rache-Kritisch-Wertung',
+ snowdownRevengeBlock: 'Rache-Blockwertung',
};
diff --git a/src/lang/de/patchnote.js b/src/lang/de/patchnote.js
index 2afcf32..707e5ce 100644
--- a/src/lang/de/patchnote.js
+++ b/src/lang/de/patchnote.js
@@ -485,6 +485,37 @@ export default {
396: 'Ein Fehler wurde behoben, bei dem Opfergaben nicht mehr funktionieren, wenn man gewisse Versionen überspringt',
397: 'Eventschätze werden jetzt korrekt im Shop angezeigt',
398: 'Ein Fehler wurde behoben, wo manche Meilensteine die falsche Belohnung angezeigt haben',
+
+ // v1.5.4
+ 399: '"Massiven Safe bestellen"-Effekt',
+ 400: '"Massiven Safe bestellen" senkt nun das Leinwandtempo',
+ 401: 'Reservoir-Farbtrommel-Kapazität',
+ 402: '"Mach\' es hübsch"-Schönheit-Einkommen',
+ 403: 'Die Effekte von "Abfall sortieren" und "Komposthaufen anlegen" wurden vertauscht und die Stärke der Effekte wurde an die neuen Ideenstufen angepasst',
+ 404: '"Schneller malen"-Leinwandtempo',
+ 405: '"Regenbogen beobachten"-Farbeinkommen',
+ 406: 'Der Effekt von "Mysteriös sein" wird nun korrekt angewendet',
+ 407: 'Farbtrommel-Kapazität pro Leinwandstufe',
+ 408: 'Die Stärke der meisten Formverbesserungen wurde gesenkt',
+ 409: 'Stundenglas-Effekt',
+ 410: 'Die Truhe erhöht nun die Menge an gesammelten Formen, wenn die Bedingung erfüllt ist',
+ 411: 'Das Formen-Minispiel hat zwar das Ziel von aktivem Gameplay zum Beschleunigen des Spiels erfüllt, die Effekte waren aber etwas zu stark. Das ging so weit, dass sich Spieler gezwungen gefühlt haben, mit dieser Mechanik zu interagieren, um die starken Boni zu erhalten. Deshalb werden die Belohnungen gesenkt',
+ 412: 'Die benötigte Erfahrungsmenge von späteren Pflanzen wurde auf den alten Stand zurückgesetzt',
+ 413: 'Du erhältst nun weniger globale Stufe von Pflanzen über Stufe 10',
+ 414: 'Du erhältst nun auch dann Zutatenkisten, wenn das Dorf eingefroren ist',
+ 415: 'Mehr Kämpfe hinzugefügt',
+ 416: 'Die Effekte aller Schneefall-Verbesserungen wurden überarbeitet',
+ 417: 'Rache-Mechanik',
+ 418: 'Produzenten können nicht mehr neu gewürfelt werden',
+ 419: 'Kampf-Schneeballkosten',
+ 420: 'Neu-würfeln-Schneeballkosten',
+ 421: 'Boost-Schneeballkosten',
+ 422: 'Du bekommst keine Schneebälle mehr für das Gewinnen von Schneeballschlachten',
+ 423: 'Gegenstände werden nun an gewissen Kämpfen verteilt, anstatt Zufall zu benutzen',
+ 424: 'Du kannst nun Gegenstände für Topas kaufen',
+ 425: 'Produzenten zeigen nun das Rohstoffeinkommen an',
+ 426: '"Tiefer Hass" gibt nun weniger Angriff, erhöht aber auch Leben',
+ 427: 'Ein Fehler wurde behoben, bei dem "Erste Pflanzen" nach dem Öffnen des Spiels nicht korrekt angewendet wurde',
},
v: {
1: {
diff --git a/src/lang/de/upgrade.js b/src/lang/de/upgrade.js
index 2217caa..88466c0 100644
--- a/src/lang/de/upgrade.js
+++ b/src/lang/de/upgrade.js
@@ -827,10 +827,7 @@ export default {
event_pineTrees: 'Tannen',
event_woolHat: 'Wollmütze',
- event_mulledWine: 'Glühwein',
event_cookies: 'Kekse',
- event_iceSculpture: 'Eisskulptur',
event_attackBoost: 'Angriffsboost',
event_healthBoost: 'Lebensboost',
- event_lootBoost: 'Beuteboost',
};
diff --git a/src/lang/en.js b/src/lang/en.js
index eab7e59..0125f8e 100644
--- a/src/lang/en.js
+++ b/src/lang/en.js
@@ -841,21 +841,29 @@ export default {
name: 'Snowdown',
fightCount: 'Fight',
fight: 'Fight',
- fightDescription: 'Fight the shown opponent at the cost of a few snowballs. If you win, you get snowballs, snowdown tokens, a producer and a chance for a new non-producer item. The non-producer item is guaranteed for the first 5 fights. Your loot rating increases the chance for a new item and the amount of snowballs and snowdown tokens received.',
+ fightDescription: 'Fight the shown opponent at the cost of a few snowballs',
+ fightWin: 'If you win, you gain',
+ fightWinProducer: 'a producer of your choice',
+ fightWinItem: 'one of three random items',
pickProducer: 'Pick a producer',
pickItem: 'Pick an item',
reroll: 'Reroll',
- rerollDescription: 'Reroll an owned item into another item of the same category (producer or non-producer).',
+ rerollDescription: 'Reroll an owned item into another item',
buyItem: 'Buy item',
- buyItemDescription: 'Get one of three random non-producer items',
- attackDescription: 'Amount of damage your attacks deal. The final amount of damage will be between 80% and 120% of your attack.',
- healthDescription: 'Amount of damage you can take before freezing and becoming unable to fight.',
- defenseDescription: 'Reduces incoming damage by a flat amount.',
- critDescription: 'Increases your chance of dealing a critical hit by 1% per crit rating. Critical hits deal +10 damage. Above 25% crit chance, you get less crit chance per crit rating as your crit chance approaches 75%. For each 1% crit chance lost to this, get +0.2 crit damage.',
- blockDescription: 'Increases your chance of blocking an attack and taking no damage.',
+ buyItemDescription: 'Get one of three random items',
+ attackDescription: 'Amount of damage your attacks deal. The final amount of damage will be between 80% and 120% of your attack',
+ healthDescription: 'Amount of damage you can take before freezing and becoming unable to fight',
+ defenseDescription: 'Reduces incoming damage by a flat amount',
+ critDescription: 'Increases your chance of dealing a critical hit by 1% per crit rating. Critical hits deal +10 damage. Above 25% crit chance, you get less crit chance per crit rating as your crit chance approaches 75%. For each 1% crit chance lost to this, get +0.2 crit damage. Multiplicative attack increases also increase crit damage',
+ blockDescription: 'Increases your chance of blocking an attack and taking no damage',
boost: 'Get 1 day of progress instantly',
+ revenge: {
+ name: 'Revenge',
+ description: 'You have lost {0} battle(s) in a row. This increases your stats until you win a snowball fight',
+ statsBase: 'Gain +5% attack and health when you lose a fight',
+ statsScaling: 'Gain +5% attack and health, +{0} crit rating and +{1} block rating when you lose a fight. You also get an additional +{2}% attack and health per fight lost each time you lose a fight'
+ },
fighter: {
- player: 'Player',
snowOwl: 'Snow owl',
dog: 'Dog',
cat: 'Cat',
@@ -865,38 +873,32 @@ export default {
toddler: 'Toddler',
babysitter: 'Babysitter',
kid: 'Kid',
- fatKid: 'Fat kid',
+ toughKid: 'Tough kid',
teenager: 'Teenager',
bully: 'Bully',
youngAdult: 'Young adult',
hooligan: 'Hooligan',
adult: 'Adult',
+ veteran: 'Veteran',
+ wallOfIce: 'Wall of ice',
snowBot: 'Snow-BOT'
},
item: {
rollingPin: {
name: 'Rolling pin',
- description: 'Produces dough, which can be baked into cookies, boosting your critical rating'
+ description: ''
},
forest: {
name: 'Forest',
- description: 'Produces saplings, which can be grown into pine trees, boosting your attack'
- },
- spiceJar: {
- name: 'Spice jar',
- description: 'Produces cinnamon, which can be used to make mulled wine, boosting your block rating'
- },
- tap: {
- name: 'Tap',
- description: 'Produces water, which can be turned into ice sculptures, boosting your loot rating'
+ description: ''
},
snowCannon: {
name: 'Snow cannon',
- description: 'Produces snow, which can be used to make snowmen, giving you additional items'
+ description: ''
},
shepherd: {
name: 'Shepherd',
- description: 'Produces yarn, which can be turned into wool hats, boosting your health'
+ description: ''
},
animalTooth: {
name: 'Animal tooth',
@@ -1299,6 +1301,7 @@ export default {
ritualPotionLevel: 'Potion level',
ritualHint: 'Discovered hints',
ritualIngredient: 'Bonus ingredient',
+ snowdownRevenge: 'Revenge',
interest: 'Interest',
multiplier: 'Multiplier',
},
@@ -2112,7 +2115,8 @@ export default {
current: 'Your current prestige level is {0}, multiplying all crop gain by x{1}.',
next: 'Prestiging this crop increases your prestige level by {0}. This raises your total prestige level to {1}, increasing your crop gain to x{2}.',
nextNoEffect: 'Your level is not higher than your prestige level for this crop. Prestiging will not increase your prestige level, but still reset level and genes.',
- cropOnField: 'You cannot prestige now because this crop is on the field'
+ cropOnField: 'You cannot prestige now because this crop is on the field',
+ increasedGLRequirement: 'After reaching level 10, crops only increase global level every second level',
},
button: {
plantAll: 'Plant the selected crop ({0}) on all empty tiles. You can also plant a single crop by clicking the empty tile',
@@ -2305,7 +2309,7 @@ export default {
accelerator: 'The surrounding 8 shapes are special collected. If all 8 of them are the same, spend all motivation to gain even more shapes',
sparkles: 'The 4 directly adjacent shapes get regular collected if possible and count as one big combo',
hourglass: 'Immediately get converters and packages, collect shapes to increase the time',
- chest: 'Special collect 10 nearby shapes, the 8 surrounding ones and the ones to the left and right. If all 10 shapes are different, receive a special reward'
+ chest: 'Special collect 10 nearby shapes, the 8 surrounding ones and the ones to the left and right. If all 10 shapes are different, receive a special reward and apply the special shape multiplier again at its root value'
},
buyFor: {
0: 'Buy',
diff --git a/src/lang/en/currency.js b/src/lang/en/currency.js
index 1adcfe4..1da784b 100644
--- a/src/lang/en/currency.js
+++ b/src/lang/en/currency.js
@@ -281,18 +281,10 @@ export default {
name: 'Dough',
description: 'Why eat the cookies when you can eat the dough?'
},
- event_cinnamon: {
- name: 'Cinnamon',
- description: 'What would winter be without cinnamon?'
- },
event_sapling: {
name: 'Sapling',
description: 'Pine tree saplings. With enough time, these can grow into massive trees'
},
- event_water: {
- name: 'Water',
- description: 'Clean and cold tap water'
- },
event_snow: {
name: 'Snow',
description: 'It\'s cold, it\'s everywhere and with enough you could build an entire snowman'
diff --git a/src/lang/en/mult.js b/src/lang/en/mult.js
index 3fc1d24..4edf574 100644
--- a/src/lang/en/mult.js
+++ b/src/lang/en/mult.js
@@ -237,7 +237,6 @@ export default {
snowdownDefense: 'Defense',
snowdownCritRating: 'Crit rating',
snowdownBlockRating: 'Block rating',
- snowdownLootRating: 'Loot rating',
snowdownPetAttack: 'Pet attack',
snowdownPetHealth: 'Pet health',
snowdownPetDefense: 'Pet defense',
@@ -245,4 +244,8 @@ export default {
snowdownPetBlockRating: 'Pet block rating',
snowdownAllAttack: 'All attack',
snowdownAllHealth: 'All health',
+ snowdownAllDefense: 'All defense',
+ snowdownRevengeStats: 'Revenge stats',
+ snowdownRevengeCrit: 'Revenge crit rating',
+ snowdownRevengeBlock: 'Revenge block rating',
};
diff --git a/src/lang/en/patchnote.js b/src/lang/en/patchnote.js
index ea1c2c1..688269b 100644
--- a/src/lang/en/patchnote.js
+++ b/src/lang/en/patchnote.js
@@ -485,6 +485,37 @@ export default {
396: 'Fixed a bug with offerings breaking when updating multiple versions at once',
397: 'Bugged treasures from event rewards are now displayed correctly',
398: 'Fixed a bug where crafting milestones displayed the wrong rewards',
+
+ // v1.5.4
+ 399: '"Order massive safe" effect',
+ 400: '"Order massive safe" now reduces your canvas speed',
+ 401: 'Reservoir drum capacity',
+ 402: '"Make it pretty" beauty gain',
+ 403: 'Switched the effects of the "Sort waste" and "Build composter" ideas and adjusted their power to match the new tiers',
+ 404: '"Paint faster" canvas speed',
+ 405: '"Observe rainbow" all color gain',
+ 406: '"Be mysterious" now correctly applies its effect',
+ 407: 'Drum capacity per canvas level',
+ 408: 'Reduced the effect of most shape upgrades',
+ 409: 'Hourglass effect',
+ 410: 'Chest now increases collected shapes if its condition is triggered',
+ 411: 'While the new shapes minigame has fulfilled its goal of offering active gameplay to speed up progression, the effects were a little too strong. This has reached a point where players felt forced to engage with this mechanic to obtain its strong bonuses, so the rewards will be reduced',
+ 412: 'Reverted the increased experience requirement for higher tier crops',
+ 413: 'You now gain less global level from crops after level 10',
+ 414: 'You now gain ingredient boxes even when the village is frozen',
+ 415: 'Added more fights',
+ 416: 'Changed the effects of all snowdown upgrades',
+ 417: 'Revenge mechanic',
+ 418: 'You can no longer reroll producers',
+ 419: 'Fight snowball cost',
+ 420: 'Reroll snowball cost',
+ 421: 'Boost snowball cost',
+ 422: 'You no longer get snowballs from winning fights',
+ 423: 'Items are now given at specific fights instead of using randomness',
+ 424: 'You can now buy items for topaz',
+ 425: 'Producers now show their resource gain',
+ 426: '"Deep hatred" now gives less attack, but also increases health',
+ 427: 'Fixed a bug where the "First crops" effect was not applied correctly when opening the game',
},
v: {
1: {
diff --git a/src/lang/en/upgrade.js b/src/lang/en/upgrade.js
index 328803d..71580ce 100644
--- a/src/lang/en/upgrade.js
+++ b/src/lang/en/upgrade.js
@@ -827,10 +827,7 @@ export default {
event_pineTrees: 'Pine trees',
event_woolHat: 'Wool hat',
- event_mulledWine: 'Mulled wine',
event_cookies: 'Cookies',
- event_iceSculpture: 'Ice sculpture',
event_attackBoost: 'Attack boost',
event_healthBoost: 'Health boost',
- event_lootBoost: 'Loot boost',
};
diff --git a/src/store/farm.js b/src/store/farm.js
index 45d7230..e91156b 100644
--- a/src/store/farm.js
+++ b/src/store/farm.js
@@ -367,7 +367,7 @@ export default {
cardEquipped: [],
upgrades: {},
exp: 0,
- baseExp: Math.pow(1.6, tier) * 60 * baseExpMult,
+ baseExp: Math.pow(1.5, tier) * 60 * baseExpMult,
baseExpMult,
type: o.type,
patientStacks: 0
@@ -825,7 +825,8 @@ export default {
let totalLevel = 0;
for (const [, elem] of Object.entries(state.crop)) {
- totalLevel += Math.max(elem.level, elem.levelMax);
+ const lvl = Math.max(elem.level, elem.levelMax);
+ totalLevel += Math.min(lvl, Math.floor(lvl / 2) + 5);
}
dispatch('meta/globalLevelPart', {key: 'farm_0', amount: totalLevel}, {root: true});
diff --git a/src/store/gallery.js b/src/store/gallery.js
index 470ca9b..bf6c2b2 100644
--- a/src/store/gallery.js
+++ b/src/store/gallery.js
@@ -121,7 +121,7 @@ export default {
return state.shapeGrid.findIndex(row => row.findIndex(cell => cell === 'hourglass') !== -1) !== -1;
},
hourglassTime: (state) => {
- return state.hourglassCombo * 13 + 300;
+ return Math.round(state.hourglassCombo * 3.7 + 30);
},
canvasDifficulty: (state) => (name, level) => {
const index = state.color.findIndex(c => c === name);
@@ -296,6 +296,7 @@ export default {
if (rootGetters['currency/canAfford']({gallery_motivation: 1})) {
const shapeName = state.shapeGrid[o.y][o.x];
if (state.shape[shapeName].isSpecial) {
+ const specialMult = rootGetters['mult/get']('gallerySpecialShapeMult');
switch (shapeName) {
case 'bomb': {
let connectedGrid = [];
@@ -306,7 +307,7 @@ export default {
row.forEach((cell, x) => {
const cellName = state.shapeGrid[y][x];
if (cell && state.shape[cellName].unlocked && !state.shape[cellName].isSpecial) {
- dispatch('currency/gain', {feature: 'gallery', name: cellName, gainMult: true, amount: rootGetters['mult/get']('gallerySpecialShapeMult')}, {root: true});
+ dispatch('currency/gain', {feature: 'gallery', name: cellName, gainMult: true, amount: specialMult}, {root: true});
commit('stat/add', {feature: 'gallery', name: 'shapeComboTotal', value: 1}, {root: true});
}
});
@@ -334,14 +335,14 @@ export default {
if (cellName === targetShape) {
sameAmount++;
}
- dispatch('currency/gain', {feature: 'gallery', name: cellName, gainMult: true, amount: rootGetters['mult/get']('gallerySpecialShapeMult')}, {root: true});
+ dispatch('currency/gain', {feature: 'gallery', name: cellName, gainMult: true, amount: specialMult}, {root: true});
commit('stat/add', {feature: 'gallery', name: 'shapeComboTotal', value: 1}, {root: true});
}
});
});
if (sameAmount >= 8) {
const motivation = Math.floor(rootState.currency.gallery_motivation.value);
- dispatch('currency/gain', {feature: 'gallery', name: targetShape, gainMult: true, amount: (motivation / 5 + 1) * rootGetters['mult/get']('gallerySpecialShapeMult')}, {root: true});
+ dispatch('currency/gain', {feature: 'gallery', name: targetShape, gainMult: true, amount: (motivation / 5 + 1) * specialMult}, {root: true});
dispatch('currency/spend', {feature: 'gallery', name: 'motivation', amount: motivation}, {root: true});
}
dispatch('rerollShapes', connectedGrid);
@@ -440,15 +441,23 @@ export default {
if (!shapeList.includes(cellName)) {
shapeList.push(cellName);
}
+ }
+ });
+ });
+ const chestFull = shapeList.length >= 10;
+ connectedGrid.forEach((row, y) => {
+ row.forEach((cell, x) => {
+ const cellName = state.shapeGrid[y][x];
+ if (cell && !state.shape[cellName].isSpecial) {
if (state.shape[cellName].unlocked) {
- dispatch('currency/gain', {feature: 'gallery', name: cellName, gainMult: true, amount: rootGetters['mult/get']('gallerySpecialShapeMult')}, {root: true});
+ dispatch('currency/gain', {feature: 'gallery', name: cellName, gainMult: true, amount: chestFull ? Math.pow(specialMult, 1.5) : specialMult}, {root: true});
commit('stat/add', {feature: 'gallery', name: 'shapeComboTotal', value: 1}, {root: true});
}
}
});
});
- if (shapeList.length >= 10) {
- dispatch('currency/gain', {feature: 'gallery', name: 'mysteryShape', amount: 1}, {root: true});
+ if (chestFull) {
+ dispatch('currency/gain', {feature: 'gallery', name: 'mysteryShape', amount: rootGetters['mult/get']('currencyGalleryMysteryShapeGain')}, {root: true});
}
dispatch('rerollShapes', connectedGrid);
break;
@@ -583,7 +592,7 @@ export default {
if (level > 0) {
dispatch('system/applyEffect', {type: 'mult', name: `currencyGallery${ capitalize(o.name) }Gain`, multKey: `galleryCanvas_${o.name}`, value: Math.pow(2, level), trigger}, {root: true});
dispatch('system/applyEffect', {type: 'mult', name: `gallery${ capitalize(o.name) }Conversion`, multKey: `galleryCanvas_${o.name}`, value: Math.pow(2, level), trigger}, {root: true});
- dispatch('system/applyEffect', {type: 'base', name: `currencyGallery${ capitalize(o.name) }DrumCap`, multKey: `galleryCanvas_${o.name}`, value: 25 * level, trigger}, {root: true});
+ dispatch('system/applyEffect', {type: 'base', name: `currencyGallery${ capitalize(o.name) }DrumCap`, multKey: `galleryCanvas_${o.name}`, value: 10 * level, trigger}, {root: true});
} else {
dispatch('system/resetEffect', {type: 'mult', name: `currencyGallery${ capitalize(o.name) }Gain`, multKey: `galleryCanvas_${o.name}`}, {root: true});
dispatch('system/resetEffect', {type: 'mult', name: `gallery${ capitalize(o.name) }Conversion`, multKey: `galleryCanvas_${o.name}`}, {root: true});
diff --git a/src/store/meta.js b/src/store/meta.js
index caa266a..f6dcfc8 100644
--- a/src/store/meta.js
+++ b/src/store/meta.js
@@ -103,7 +103,7 @@ export default {
}
}
},
- globalLevelUnlocks({ state, rootState, rootGetters, commit, dispatch }) {
+ globalLevelUnlocks({ state, rootState, getters, rootGetters, commit, dispatch }) {
// Global level unlocks
for (const [key, elem] of Object.entries(state.globalLevelUnlocks)) {
if (state.globalLevel >= elem && !rootState.unlock[key].use) {
@@ -152,6 +152,16 @@ export default {
if (state.globalLevel >= 40 && !rootState.relic.item.friendlyBat.found) {
dispatch('relic/find', 'friendlyBat', {root: true});
}
+
+ // Apply effects
+ if (getters.globalEventLevel > 0) {
+ dispatch('system/applyEffect', {
+ type: 'mult',
+ name: 'snowdownResourceGain',
+ multKey: `globalLevel`,
+ value: Math.pow(1.01, getters.globalEventLevel)
+ }, {root: true});
+ }
}
}
}
diff --git a/src/store/snowdown.js b/src/store/snowdown.js
index 025fb9f..944f3de 100644
--- a/src/store/snowdown.js
+++ b/src/store/snowdown.js
@@ -1,6 +1,7 @@
import Vue from "vue";
import { SNOWDOWN_FIGHT_COST, SNOWDOWN_REROLL_COST } from "../js/constants";
import { chance, randomElem, randomFloat, randomInt } from "../js/utils/random";
+import { getSequence } from "../js/utils/math";
export default {
namespaced: true,
@@ -54,57 +55,87 @@ export default {
enemy: {
toddler: {
name: 'toddler',
- attack: 1.5,
+ attack: 2,
health: 15,
defense: 0
},
kid: {
name: 'kid',
- attack: 3,
- health: 50,
+ attack: 4,
+ health: 60,
defense: 0
},
babysitter: {
name: 'babysitter',
- attack: 9,
- health: 35,
- defense: 0
- },
- fatKid: {
- name: 'fatKid',
- attack: 7,
- health: 100,
+ attack: 12,
+ health: 55,
defense: 1
},
+ toughKid: {
+ name: 'toughKid',
+ attack: 14,
+ health: 200,
+ defense: 4
+ },
teenager: {
name: 'teenager',
- attack: 14,
- health: 160,
- defense: 2
+ attack: 30,
+ health: 350,
+ defense: 6
},
bully: {
name: 'bully',
- attack: 28,
- health: 105,
- defense: 1
+ attack: 70,
+ health: 260,
+ defense: 5
},
youngAdult: {
name: 'youngAdult',
- attack: 22,
- health: 320,
- defense: 3
+ attack: 60,
+ health: 850,
+ defense: 14
},
hooligan: {
name: 'hooligan',
- attack: 60,
- health: 220,
- defense: 1
+ attack: 180,
+ health: 650,
+ defense: 9
},
adult: {
name: 'adult',
- attack: 32,
- health: 700,
- defense: 5
+ attack: 100,
+ health: 2250,
+ defense: 35
+ },
+ veteran: {
+ name: 'veteran',
+ attack: 225,
+ health: 3600,
+ defense: 75
+ },
+ wallOfIce1: {
+ name: 'wallOfIce',
+ attack: 0,
+ health: 2000,
+ defense: 0
+ },
+ wallOfIce2: {
+ name: 'wallOfIce',
+ attack: 0,
+ health: 3000,
+ defense: 0
+ },
+ wallOfIce3: {
+ name: 'wallOfIce',
+ attack: 0,
+ health: 4000,
+ defense: 0
+ },
+ wallOfIce4: {
+ name: 'wallOfIce',
+ attack: 0,
+ health: 6000,
+ defense: 0
}
},
fights: [
@@ -118,27 +149,59 @@ export default {
['babysitter', 'toddler', 'toddler', 'toddler'],
['babysitter', 'babysitter', 'toddler', 'toddler'],
['babysitter', 'babysitter', 'kid', 'kid'],
- ['fatKid', 'babysitter'],
- ['fatKid', 'babysitter', 'kid', 'kid'],
- ['fatKid', 'babysitter', 'babysitter'],
- ['fatKid', 'babysitter', 'babysitter', 'babysitter'],
- ['fatKid', 'fatKid', 'babysitter'],
- ['fatKid', 'fatKid', 'babysitter', 'babysitter'],
- ['fatKid', 'fatKid', 'fatKid', 'kid'],
+ ['toughKid', 'babysitter'],
+ ['toughKid', 'babysitter', 'kid', 'kid'],
+ ['toughKid', 'babysitter', 'babysitter'],
+ ['toughKid', 'babysitter', 'babysitter', 'babysitter'],
+ ['toughKid', 'toughKid', 'babysitter'],
+ ['toughKid', 'toughKid', 'babysitter', 'babysitter'],
+ ['toughKid', 'toughKid', 'toughKid', 'kid'],
['teenager', 'toddler', 'toddler', 'toddler'],
['teenager', 'kid', 'kid', 'kid'],
- ['teenager', 'fatKid', 'babysitter'],
+ ['teenager', 'toughKid', 'babysitter'],
['teenager', 'teenager'],
['teenager', 'bully'],
- ['teenager', 'bully', 'fatKid', 'fatKid'],
- ['teenager', 'bully', 'bully', 'fatKid'],
- ['bully', 'bully', 'bully', 'bully'],
+ ['teenager', 'bully', 'toughKid', 'toughKid'],
+ ['teenager', 'bully', 'bully', 'toughKid'],
['teenager', 'bully', 'teenager', 'bully'],
+ ['bully', 'bully', 'bully', 'bully'],
+ ['youngAdult', 'bully', 'teenager'],
+ ['youngAdult', 'bully', 'bully', 'bully'],
+ ['youngAdult', 'youngAdult'],
+ ['youngAdult', 'youngAdult', 'bully', 'bully'],
+ ['youngAdult', 'youngAdult', 'youngAdult'],
+ ['wallOfIce1', 'youngAdult', 'youngAdult', 'youngAdult'],
+ ['wallOfIce1', 'hooligan'],
+ ['wallOfIce1', 'hooligan', 'youngAdult'],
+ ['wallOfIce1', 'hooligan', 'youngAdult', 'hooligan'],
+ ['wallOfIce1', 'hooligan', 'hooligan', 'hooligan'],
+ ['wallOfIce2', 'hooligan', 'hooligan', 'youngAdult'],
+ ['wallOfIce2', 'hooligan', 'hooligan', 'hooligan'],
+ ['wallOfIce2', 'adult'],
+ ['wallOfIce2', 'adult', 'youngAdult', 'youngAdult'],
+ ['wallOfIce2', 'adult', 'hooligan'],
+ ['wallOfIce3', 'adult', 'adult'],
+ ['wallOfIce3', 'adult', 'adult', 'youngAdult'],
+ ['wallOfIce3', 'adult', 'adult', 'hooligan'],
+ ['wallOfIce3', 'adult', 'adult', 'adult'],
+ ['wallOfIce3', 'veteran'],
+ ['wallOfIce3', 'veteran', 'hooligan'],
+ ['wallOfIce3', 'veteran', 'hooligan', 'hooligan'],
+ ['wallOfIce3', 'veteran', 'adult'],
+ ['wallOfIce4', 'veteran', 'adult'],
+ ['wallOfIce4', 'veteran', 'adult', 'hooligan'],
+ ['wallOfIce4', 'veteran', 'adult', 'adult'],
+ ['wallOfIce4', 'veteran', 'veteran'],
+ ['wallOfIce4', 'veteran', 'veteran', 'hooligan'],
+ ['wallOfIce4', 'veteran', 'veteran', 'adult'],
+ ['wallOfIce4', 'veteran', 'veteran', 'veteran'],
],
result: null,
rewardProducer: false,
rewardItem: null,
- itemsBought: 0
+ itemsBought: 0,
+ itemsBoughtTopaz: 0,
+ revenge: 0,
},
getters: {
playerStats: (state, getters, rootState, rootGetters) => {
@@ -146,7 +209,7 @@ export default {
name: 'player',
attack: rootGetters['mult/get']('snowdownAttack'),
health: rootGetters['mult/get']('snowdownHealth'),
- defense: rootGetters['mult/get']('snowdownDefense') + 5 * state.item.starShield.amount,
+ defense: rootGetters['mult/get']('snowdownDefense', 5 * state.item.starShield.amount),
critRating: rootGetters['mult/get']('snowdownCritRating'),
blockRating: rootGetters['mult/get']('snowdownBlockRating')
}];
@@ -166,26 +229,26 @@ export default {
},
enemyStats: (state) => {
if (state.fights.length <= state.fight) {
- const statMult = Math.pow(1.12, state.fight);
+ const statMult = Math.pow(1.1, state.fight);
return [{
+ name: 'wallOfIce',
+ attack: 0,
+ health: Math.round(statMult * 40),
+ defense: 0
+ }, {
name: 'snowBot',
attack: statMult * 1.1,
health: Math.round(statMult * 15),
- defense: Math.round(statMult * 0.075)
+ defense: Math.round(statMult * 0.4)
}, {
name: 'snowBot',
attack: statMult * 2,
health: Math.round(statMult * 9),
- defense: Math.round(statMult * 0.025)
- }, {
- name: 'snowBot',
- attack: statMult * 0.6,
- health: Math.round(statMult * 30),
- defense: Math.round(statMult * 0.3)
+ defense: Math.round(statMult * 0.2)
}];
}
return state.fights[state.fight].map(elem => {
- return {...state.enemy[elem], name: elem};
+ return {...state.enemy[elem]};
});
},
critChance: () => (rating) => {
@@ -211,6 +274,15 @@ export default {
},
itemSnowCost: (state) => {
return Math.pow(state.itemsBought * 10 + 10, state.itemsBought) * 1000;
+ },
+ itemTopazCost: (state) => {
+ return state.itemsBoughtTopaz * 10 + 100;
+ },
+ winTokenGain: (state) => {
+ return Math.floor(Math.pow(state.fight * 0.35 + 1, 0.75) + 3);
+ },
+ winItemGain: (state) => {
+ return state.fight < 50 && (state.fight < 5 || (state.fight % 5) === 4);
}
},
mutations: {
@@ -241,7 +313,7 @@ export default {
commit('updateItemKey', {name: key, key: 'amount', value: 0});
}
},
- fight({ state, getters, rootGetters, commit, dispatch }) {
+ fight({ state, rootState, getters, rootGetters, commit, dispatch }) {
if (rootGetters['currency/value']('event_snowball') >= SNOWDOWN_FIGHT_COST) {
dispatch('currency/spend', {feature: 'event', name: 'snowball', amount: SNOWDOWN_FIGHT_COST}, {root: true});
let turn = 0;
@@ -251,10 +323,10 @@ export default {
const attackMult = rootGetters['mult/get']('snowdownAllAttack', 1);
const healthMult = rootGetters['mult/get']('snowdownAllHealth', 1);
let player = playerBase.map((elem, key) => {
- return {...elem, healthCurrent: elem.health, revive: 0, stun: 0, spikedCollar: false, key};
+ return {...elem, healthCurrent: elem.health, critMult: elem.name === 'player' ? rootState.mult.items.snowdownAttack.multCache : rootState.mult.items.snowdownPetAttack.multCache, revive: 0, stun: 0, spikedCollar: false, key};
});
let enemy = enemyBase.map((elem, key) => {
- return {...elem, healthCurrent: elem.health, revive: 0, stun: 0, key};
+ return {...elem, healthCurrent: elem.health, critMult: 1, revive: 0, stun: 0, key};
});
let forceCrit = 5 * state.item.snowboard.amount; // Amount of attacks with a guaranteed crit (consumed on attack)
let petHeal = 3 * state.item.treatBag.amount;
@@ -392,9 +464,9 @@ export default {
forceCrit--;
}
const damage = Math.max(0, Math.round(
- elemP.attack * randomFloat(0.8, 1.2) + // base damage
- (crit ? getters.critDamage(elemP.critRating) : 0) - // crit damage
- enemy[picked].defense // enemy defense
+ elemP.attack * randomFloat(0.8, 1.2) + // base damage
+ (crit ? (getters.critDamage(elemP.critRating) * elemP.critMult) : 0) - // crit damage
+ enemy[picked].defense // enemy defense
));
if (damage > 0) {
enemy[picked].healthCurrent -= damage;
@@ -457,39 +529,43 @@ export default {
// Disable star shield after 3 turns
if (turn === 5 && state.item.starShield.amount > 0) {
- player[0].defense -= state.item.starShield.amount * 5;
- log.push({type: 'buffStat', stat: 'defense', targetKey: 0, power: state.item.starShield.amount * -5});
+ log.push({type: 'buffStat', stat: 'defense', targetKey: 0, power: rootGetters['mult/get']('snowdownDefense') - player[0].defense});
+ player[0].defense = rootGetters['mult/get']('snowdownDefense');
}
battleLog.push(log);
turn++;
}
- commit('updateKey', {key: 'result', value: {player: playerBase, enemy: enemyBase, winner, battleLog}});
+ commit('updateKey', {key: 'result', value: {player: playerBase.map(elem => {
+ return {...elem, critMult: elem.name === 'player' ? rootState.mult.items.snowdownAttack.multCache : rootState.mult.items.snowdownPetAttack.multCache};
+ }), enemy: enemyBase, winner, battleLog}});
if (winner === 'player') {
- const lootRating = rootGetters['mult/get']('snowdownLootRating', 35, 0.01);
- let rngGen = rootGetters['system/getRng']('snowdown_item');
- commit('system/nextRng', {name: 'snowdown_item', amount: 1}, {root: true});
- if (state.fight < 5 || chance(lootRating / (lootRating + 1), rngGen())) {
+ if (getters.winItemGain) {
dispatch('addRewardItem');
}
// Get currency rewards
- dispatch('currency/gain', {feature: 'event', name: 'snowball', amount: Math.round(rootGetters['mult/get']('snowdownLootRating', 3, 3))}, {root: true});
- dispatch('event/giveTokens', {event: 'snowdown', amount: Math.floor(rootGetters['mult/get']('snowdownLootRating', state.fight * 3.5 + 50, 0.05))}, {root: true});
+ dispatch('event/giveTokens', {event: 'snowdown', amount: getters.winTokenGain}, {root: true});
commit('updateKey', {key: 'fight', value: state.fight + 1});
+ commit('updateKey', {key: 'revenge', value: 0});
commit('updateKey', {key: 'rewardProducer', value: true});
dispatch('note/find', 'event_33', {root: true});
if (state.fight >= 4) {
dispatch('note/find', 'event_32', {root: true});
}
+ } else {
+ commit('updateKey', {key: 'revenge', value: state.revenge + 1});
}
+
+ dispatch('applyRevengeEffect');
}
},
- getProducer({ state, commit }, name) {
+ getProducer({ state, commit, dispatch }, name) {
if (state.rewardProducer) {
commit('updateItemKey', {name, key: 'amount', value: state.item[name].amount + 1});
+ dispatch('applyItemEffects', name);
commit('updateKey', {key: 'rewardProducer', value: false});
}
},
@@ -515,9 +591,7 @@ export default {
});
},
rerollItem({ state, getters, rootGetters, commit, dispatch }, name) {
- if (rootGetters['currency/value']('event_snowball') >= SNOWDOWN_REROLL_COST && state.rewardItem === null) {
- const isProducer = state.item[name].type === 'producer';
-
+ if (rootGetters['currency/value']('event_snowball') >= SNOWDOWN_REROLL_COST && state.rewardItem === null && state.item[name].type !== 'producer') {
commit('updateItemKey', {name, key: 'amount', value: state.item[name].amount - 1});
dispatch('applyItemEffects', name);
@@ -526,8 +600,8 @@ export default {
// Exclude producer and max amount items, also exclude pets if you already have 3
for (const [key, elem] of Object.entries(state.item)) {
- if ((
- (elem.type === 'producer') === isProducer) && // Producer reroll only gives producers, same with non-producers
+ if (
+ elem.type !== 'producer' && // Only non-producers
name !== key && // Cannot get back the same item
(getters.petCount < 3 || elem.type !== 'pet') && // No more than 3 pets
(elem.max === null || elem.amount < elem.max) // Respect item limits
@@ -589,6 +663,87 @@ export default {
commit('updateKey', {key: 'itemsBought', value: state.itemsBought + 1});
dispatch('addRewardItem');
}
+ },
+ buyTopazItem({ state, getters, rootGetters, commit, dispatch }) {
+ if (rootGetters['currency/value']('gem_topaz') >= getters.itemTopazCost && state.rewardItem === null) {
+ dispatch('currency/spend', {feature: 'gem', name: 'topaz', amount: getters.itemTopazCost}, {root: true});
+ commit('updateKey', {key: 'itemsBoughtTopaz', value: state.itemsBoughtTopaz + 1});
+ dispatch('addRewardItem');
+ }
+ },
+ applyRevengeEffect({ state, rootGetters, dispatch }) {
+ if (state.revenge > 0) {
+ const revengeStats = state.revenge * 0.05 + getSequence(1, state.revenge) * rootGetters['mult/get']('snowdownRevengeStats') + 1;
+ const revengeCrit = state.revenge * rootGetters['mult/get']('snowdownRevengeCrit');
+ const revengeBlock = state.revenge * rootGetters['mult/get']('snowdownRevengeBlock');
+ dispatch('system/applyEffect', {
+ type: 'mult',
+ name: 'snowdownAllAttack',
+ multKey: `snowdownRevenge`,
+ value: revengeStats
+ }, {root: true});
+ dispatch('system/applyEffect', {
+ type: 'mult',
+ name: 'snowdownAllHealth',
+ multKey: `snowdownRevenge`,
+ value: revengeStats
+ }, {root: true});
+ dispatch('system/applyEffect', {
+ type: 'base',
+ name: 'snowdownCritRating',
+ multKey: `snowdownRevenge`,
+ value: revengeCrit
+ }, {root: true});
+ dispatch('system/applyEffect', {
+ type: 'base',
+ name: 'snowdownPetCritRating',
+ multKey: `snowdownRevenge`,
+ value: revengeCrit
+ }, {root: true});
+ dispatch('system/applyEffect', {
+ type: 'base',
+ name: 'snowdownBlockRating',
+ multKey: `snowdownRevenge`,
+ value: revengeBlock
+ }, {root: true});
+ dispatch('system/applyEffect', {
+ type: 'base',
+ name: 'snowdownPetBlockRating',
+ multKey: `snowdownRevenge`,
+ value: revengeBlock
+ }, {root: true});
+ } else {
+ dispatch('system/resetEffect', {
+ type: 'mult',
+ name: 'snowdownAllAttack',
+ multKey: `snowdownRevenge`
+ }, {root: true});
+ dispatch('system/resetEffect', {
+ type: 'mult',
+ name: 'snowdownAllHealth',
+ multKey: `snowdownRevenge`
+ }, {root: true});
+ dispatch('system/resetEffect', {
+ type: 'base',
+ name: 'snowdownCritRating',
+ multKey: `snowdownRevenge`
+ }, {root: true});
+ dispatch('system/resetEffect', {
+ type: 'base',
+ name: 'snowdownPetCritRating',
+ multKey: `snowdownRevenge`
+ }, {root: true});
+ dispatch('system/resetEffect', {
+ type: 'base',
+ name: 'snowdownBlockRating',
+ multKey: `snowdownRevenge`
+ }, {root: true});
+ dispatch('system/resetEffect', {
+ type: 'base',
+ name: 'snowdownPetBlockRating',
+ multKey: `snowdownRevenge`
+ }, {root: true});
+ }
}
}
}
diff --git a/src/store/system.js b/src/store/system.js
index 2a1f7e7..0c993d6 100644
--- a/src/store/system.js
+++ b/src/store/system.js
@@ -7,7 +7,7 @@ import { LOCAL_STORAGE_NAME } from "../js/constants";
export default {
namespaced: true,
state: {
- version: '1.5.3',
+ version: '1.5.4',
cheaterSelfMark: 0,
cheatDetected: {},
lastPlayedDays: [],