You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
262 lines
9.1 KiB
262 lines
9.1 KiB
import {createStore} from 'vuex' |
|
import moment from "moment"; |
|
import {SeasonService} from "@/services/SeasonService"; |
|
import {ItemTypes} from "@/data/ItemTypes"; |
|
import createPersistedState from "vuex-persistedstate"; |
|
import ItemService from "@/services/ItemService"; |
|
import iziToast from "izitoast"; |
|
|
|
|
|
export default createStore({ |
|
state: { |
|
initialized: null, |
|
player: { |
|
// TODO: ADD PLAYER INTRODUCTION |
|
name: 'Franz', |
|
money: 1_000, |
|
unlocked: { |
|
fields: 48 |
|
}, |
|
}, |
|
time: { |
|
stamp: null, |
|
week: null, |
|
season: null, |
|
weekday: null, |
|
weekdayNr: null |
|
}, |
|
inventory: [], |
|
inventorySortDesc: true, |
|
inventorySortQntyDesc: true, |
|
groupInventory: false, |
|
cropField: [], |
|
selections: { |
|
field: null, |
|
item: null |
|
} |
|
}, |
|
getters: { |
|
selectedField(state) { |
|
return state.cropField.find(function (field) { |
|
return field.id === state.selections.field; |
|
}) ?? {}; |
|
}, |
|
getInventoryWithItemData(state) { |
|
return state.inventory.filter((inventoryItem) => { |
|
return inventoryItem.quantity > 0; |
|
}).map((inventoryItem) => { |
|
let item = ItemService.getItemByID(inventoryItem.id); |
|
|
|
item.quantity = inventoryItem.quantity; |
|
return item; |
|
}) ?? []; |
|
}, |
|
getSeedsInInventory(state) { |
|
return state.inventory.filter((inventoryItem) => { |
|
return inventoryItem.type === ItemTypes.Seeds && inventoryItem.quantity > 0; |
|
}).map((inventoryItem) => { |
|
let item = ItemService.getItemByID(inventoryItem.id); |
|
|
|
item.quantity = inventoryItem.quantity; |
|
return item; |
|
}) ?? []; |
|
}, |
|
getFieldProductsInInventory(state) { |
|
return state.inventory.filter((inventoryItem) => { |
|
return inventoryItem.type === ItemTypes.FieldProducts && inventoryItem.quantity > 0; |
|
}).map((inventoryItem) => { |
|
let item = ItemService.getItemByID(inventoryItem.id); |
|
|
|
item.quantity = inventoryItem.quantity; |
|
return item; |
|
}) ?? []; |
|
}, |
|
getAnimalProductsInInventory(state) { |
|
return state.inventory.filter((inventoryItem) => { |
|
return inventoryItem.type === ItemTypes.AnimalProducts && inventoryItem.quantity > 0; |
|
}).map((inventoryItem) => { |
|
let item = ItemService.getItemByID(inventoryItem.id); |
|
|
|
item.quantity = inventoryItem.quantity; |
|
return item; |
|
}) ?? []; |
|
} |
|
}, |
|
mutations: { |
|
initialize(state) { |
|
this.commit('checkForSeasonChange'); |
|
|
|
state.time.week = moment().week(); |
|
state.time.season = SeasonService.getSeasonByWeek(state.time.week); |
|
state.time.weekday = moment().weekday(); |
|
state.time.weekdayNr = moment().format('dddd'); |
|
state.initialized = moment(); |
|
|
|
this.commit('generateField'); |
|
}, |
|
updateTimestamp(state) { |
|
state.time.stamp = moment().format('H:mm:ss') |
|
}, |
|
generateField(state) { |
|
let fieldIndex = 0; |
|
|
|
while (state.cropField.length < state.player.unlocked.fields) { |
|
fieldIndex++; |
|
|
|
state.cropField.push({ |
|
id: fieldIndex |
|
}); |
|
} |
|
}, |
|
selectField(state, id) { |
|
console.debug('select field with id ' + id) |
|
state.selections.field = id; |
|
}, |
|
plantSeed(state, seed) { |
|
let selectedField = state.cropField.find((field) => { |
|
return field.id === state.selections.field; |
|
}); |
|
|
|
/*** SEED PLANTING ***/ |
|
selectedField.data = { |
|
planted: moment(), |
|
readyForHarvest: moment().add(seed.cropData.timeToGrow, 'minutes'), |
|
percentDone: 0, |
|
canBeHarvested: false, |
|
seed_id: seed.id |
|
} |
|
|
|
this.commit('removeItemFromInventory', { |
|
item: seed, |
|
quantity: 1 |
|
}); |
|
}, |
|
harvestSeed(state, field) { |
|
let seed = ItemService.getItemByID(field.data.seed_id); |
|
let productFromSeed = ItemService.getItemByID(seed.cropData.product_id); |
|
|
|
if (field.data.percentDone < 100 || !field.data.readyForHarvest) { |
|
// bloody cheater |
|
return false; |
|
} |
|
|
|
this.commit('addItemToInventory', { |
|
item: productFromSeed, |
|
quantity: 1 |
|
}); |
|
|
|
field.data = null; |
|
}, |
|
checkForSeasonChange(state) { |
|
let prevDate = state.initialized; |
|
|
|
if (moment(prevDate).weekday() === 7 && moment().weekday() === 1) { |
|
console.debug('SEASON CHANGE DETECTED'); |
|
|
|
// TODO: KILL ALL THE CROPS |
|
} |
|
}, |
|
buyItem(state, props = {item: Object, quantity: Number}) { |
|
let purchasePrice = props.item.economy.buy * props.quantity; |
|
|
|
if (purchasePrice > state.player.money) { |
|
iziToast.error({ |
|
title: "Not enough money to buy " + props.quantity + " of " + props.item.name |
|
}); |
|
return false; |
|
} |
|
|
|
this.commit('addItemToInventory', { |
|
item: props.item, |
|
quantity: props.quantity |
|
}); |
|
|
|
state.player.money -= purchasePrice; |
|
|
|
iziToast.success({ |
|
title: 'Purchased ' + props.item.name + (props.quantity > 1 ? ' (' + props.quantity + ')' : '') |
|
}); |
|
}, |
|
addItemToInventory(state, props = {item: Object, quantity: Number}) { |
|
let itemInInventory = state.inventory.find((inventoryItem) => { |
|
return inventoryItem.id === props.item.id; |
|
}) |
|
|
|
if (itemInInventory) { |
|
itemInInventory.quantity = Number(itemInInventory.quantity) + Number(props.quantity); |
|
} else { |
|
/*** INVENTORY ITEM CREATION ***/ |
|
state.inventory.push({ |
|
id: props.item.id, |
|
type: props.item.type, |
|
quantity: props.quantity |
|
}) |
|
} |
|
}, |
|
removeItemFromInventory(state, props = {item: Object, quantity: Number}) { |
|
let itemInInventory = state.inventory.find((inventoryItem) => { |
|
return inventoryItem.id === props.item.id; |
|
}) |
|
|
|
if (itemInInventory) { |
|
itemInInventory.quantity -= props.quantity; |
|
} |
|
}, |
|
updateCrops(state) { |
|
state.cropField.filter((field) => { |
|
return field.data != null && !field.data.canBeHarvested; |
|
}).forEach(function (field) { |
|
let seed = ItemService.getItemByID(field.data.seed_id); |
|
|
|
if (field.data.readyForHarvest < moment()) { |
|
field.data.canBeHarvested = true; |
|
} |
|
|
|
if (field.data.percentDone <= 100) { |
|
let minutesLeft = moment.duration(moment(field.data.readyForHarvest).diff(moment())).asMinutes(); |
|
field.data.percentDone = Number((Number(seed.cropData.timeToGrow) * 100) / Number(minutesLeft) - 100).toFixed(2); |
|
if (field.data.percentDone >= 100) { |
|
field.data.percentDone = 100; |
|
field.data.canBeHarvested = true; |
|
} |
|
} else { |
|
field.data.canBeHarvested = true; |
|
} |
|
}); |
|
}, |
|
alphaAddMoney(state) { |
|
state.player.money = Number(state.player.money) + Number(1_000); |
|
}, |
|
sortInventory(state) { |
|
state.inventory = state.inventory.sort((a, b) => { |
|
let aItem = ItemService.getItemByID(a.id); |
|
let bItem = ItemService.getItemByID(b.id); |
|
|
|
if (state.inventorySortDesc === true) { |
|
return (bItem.name > aItem.name) ? 1 : -1; |
|
} else { |
|
return (aItem.name < bItem.name) ? -1 : 1; |
|
} |
|
}) |
|
|
|
state.inventorySortDesc = !state.inventorySortDesc; |
|
}, |
|
sortInventoryByQuantity(state) { |
|
state.inventory = state.inventory.sort((a, b) => { |
|
if (state.inventorySortQntyDesc === true) { |
|
return (b.quantity > a.quantity) ? 1 : -1; |
|
} else { |
|
return (a.quantity < b.quantity) ? -1 : 1; |
|
} |
|
}); |
|
|
|
state.inventorySortQntyDesc = !state.inventorySortQntyDesc; |
|
}, |
|
toggleGrouping(state) { |
|
state.groupInventory = !state.groupInventory; |
|
} |
|
}, |
|
actions: {}, |
|
modules: {}, |
|
plugins: [createPersistedState()], |
|
});
|
|
|