the merge project
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.
 
 
 
 

208 lines
6.9 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: [],
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;
});
}
},
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;
}
});
}
},
actions: {},
modules: {},
plugins: [createPersistedState()],
});