2022-01-07 16:10:23 -05:00
import Decimal from 'break_infinity.js'
2022-01-07 17:28:21 -05:00
import Vue from 'vue'
2022-01-07 16:10:23 -05:00
2022-01-06 17:17:26 -08:00
export const state = ( ) => ( {
tabs : [
{
2022-01-08 15:42:22 -08:00
route : '/' ,
label : 'fas fa-clock' ,
title : 'Timekeeping Instruments' ,
2022-01-09 00:04:24 -08:00
darkColor : 'amber-900' ,
2022-01-09 22:08:59 -08:00
color : 'amber-400' ,
2022-01-09 00:04:24 -08:00
lightColor : 'amber-200' ,
2022-01-08 15:45:07 -05:00
locked : false ,
2022-01-06 17:17:26 -08:00
} ,
{
2022-01-08 15:42:22 -08:00
route : '/apprentices' ,
label : 'fas fa-user-friends' ,
title : 'Apprentices' ,
2022-01-09 00:04:24 -08:00
darkColor : 'rose-900' ,
2022-01-09 22:08:59 -08:00
color : 'rose-400' ,
2022-01-09 00:04:24 -08:00
lightColor : 'rose-200' ,
2022-01-08 15:45:07 -05:00
locked : false ,
2022-01-06 17:17:26 -08:00
} ,
{
2022-01-08 15:42:22 -08:00
route : '/missions' ,
label : 'fas fa-th-list' ,
2022-01-07 19:46:33 -08:00
title : 'Missions' ,
2022-01-09 00:04:24 -08:00
darkColor : 'sky-900' ,
2022-01-09 22:08:59 -08:00
color : 'sky-400' ,
2022-01-09 00:04:24 -08:00
lightColor : 'sky-200' ,
2022-01-08 15:42:22 -08:00
locked : false ,
2022-01-06 17:17:26 -08:00
} ,
{
2022-01-08 15:42:22 -08:00
route : '/timemachine' ,
label : 'fas fa-fast-forward' ,
2022-01-07 19:46:33 -08:00
title : 'Time Machine' ,
2022-01-09 00:04:24 -08:00
darkColor : 'lime-900' ,
2022-01-09 22:08:59 -08:00
color : 'lime-400' ,
2022-01-06 17:17:26 -08:00
lightColor : 'lime-200' ,
2022-01-08 15:42:22 -08:00
locked : false ,
2022-01-06 17:17:26 -08:00
} ,
{
2022-01-08 15:42:22 -08:00
route : '/timemagic' ,
label : 'fas fa-eye' ,
2022-01-07 19:46:33 -08:00
title : 'Time Magic' ,
2022-01-09 00:04:24 -08:00
darkColor : 'violet-900' ,
2022-01-09 22:08:59 -08:00
color : 'violet-400' ,
2022-01-09 00:04:24 -08:00
lightColor : 'violet-200' ,
2022-01-08 15:42:22 -08:00
locked : false ,
2022-01-06 17:17:26 -08:00
} ,
{
2022-01-08 15:42:22 -08:00
route : '/wisdom' ,
label : 'fas fa-book-open' ,
title : 'Wisdom' ,
2022-01-09 00:04:24 -08:00
darkColor : 'teal-900' ,
2022-01-09 22:08:59 -08:00
color : 'teal-400' ,
2022-01-09 00:04:24 -08:00
lightColor : 'teal-100' ,
2022-01-08 15:42:22 -08:00
locked : false ,
2022-01-06 17:17:26 -08:00
} ,
] ,
2022-01-07 16:10:23 -05:00
currency : new Decimal ( 0 ) ,
currencyTotal : new Decimal ( 0 ) ,
processes : [
{
2022-01-10 02:16:25 -08:00
instrument : 'Mechanical Clock' ,
worker : 'Engineer' ,
cost : 10 ,
created : false ,
completion : 0 , // how close it is to giving currency. 10 gained per second.
completionRequired : 10 , // should be divisible by 10
baseReward : 5 , // currency added when the bar is completed
workerLevel : 0 , // 0 = not hired; 1+ = hired
nextWorkerCost : 25 , // currency cost of next worker
nextWorkerFactor : 1.5 , // worker cost *= this factor after each purchase
2022-01-07 16:10:23 -05:00
unlockThreshold : { tech : null , currency : 0 } ,
} ,
{
2022-01-10 02:16:25 -08:00
instrument : 'Hourglass' ,
worker : 'Glassblower' ,
cost : 100 ,
created : false ,
2022-01-07 17:28:21 -05:00
completion : 0 ,
2022-01-10 02:16:25 -08:00
completionRequired : 20 ,
baseReward : 35 ,
workerLevel : 0 ,
nextWorkerCost : 200 ,
2022-01-09 12:52:17 -05:00
nextWorkerFactor : 1.6 ,
2022-01-10 02:16:25 -08:00
2022-01-07 16:10:23 -05:00
unlockThreshold : { tech : null , currency : 10000 } ,
} ,
{
2022-01-10 02:16:25 -08:00
instrument : 'Pocket Watch' ,
worker : 'Miniaturist' ,
cost : 1000 ,
created : false ,
2022-01-07 17:28:21 -05:00
completion : 0 ,
2022-01-10 02:16:25 -08:00
completionRequired : 30 ,
baseReward : 80 ,
workerLevel : 0 ,
nextWorkerCost : 2000 ,
2022-01-09 12:52:17 -05:00
nextWorkerFactor : 1.8 ,
2022-01-10 02:16:25 -08:00
2022-01-07 16:10:23 -05:00
unlockThreshold : { tech : 0 , currency : new Decimal ( 10e5 ) } ,
} ,
] ,
upgrades : [
{
name : 'Mathematics' ,
price : 100 ,
purchased : false ,
} ,
] ,
2022-01-07 19:46:33 -08:00
missions : [
{
name : 'Create the Time Machine' ,
description : 'Soon you will be able to control time itself.' ,
completionCriteria : {
2022-01-09 13:12:52 -05:00
cost : 50000 ,
2022-01-07 19:46:33 -08:00
} ,
available : true ,
viewed : false ,
complete : false ,
} ,
{
name : 'Time To Cheat Death' ,
description :
'Your body seems to be failing you. ' +
'Write a book to pass your knowedge to your younger self through the time machine. ' +
"Now where's your pen..." ,
appearanceCriteria : {
age : 100 ,
} ,
2022-01-09 13:12:52 -05:00
completionCriteria : {
cost : 150000 ,
} ,
2022-01-07 19:46:33 -08:00
available : true ,
viewed : false ,
complete : false ,
} ,
] ,
2022-01-09 18:29:13 -05:00
gameDate : {
2022-01-09 18:34:50 -05:00
month : 12 ,
year : 1990 ,
2022-01-09 18:29:13 -05:00
} ,
playerAge : {
2022-01-09 18:34:50 -05:00
month : 0 ,
year : 34 ,
2022-01-09 18:29:13 -05:00
} ,
playerAgeMax : {
2022-01-09 18:34:50 -05:00
month : 0 ,
year : 80 ,
2022-01-09 18:29:13 -05:00
} ,
playerLivedTotal : {
2022-01-09 18:34:50 -05:00
month : 0 ,
year : 0 ,
2022-01-09 18:29:13 -05:00
} ,
wisdomGained : 0 , // wisdom gained so far on this run, not applied until player sends the book.
wisdomApplied : 0 , // wisdom from previous runs
2022-01-09 19:29:57 -05:00
totalLifetimes : 1 ,
2022-01-06 17:17:26 -08:00
} )
export const getters = {
2022-01-09 19:28:09 -08:00
activeTab ( state ) {
return state . tabs . find (
// eslint-disable-next-line no-undef
( tab ) => tab . route === $nuxt . $route . path
)
2022-01-06 17:17:26 -08:00
} ,
2022-01-09 18:29:13 -05:00
canTimeTravel : ( state ) => {
2022-01-09 18:34:50 -05:00
if ( state . playerAge . year < state . playerAgeMax . year ) return true
if ( state . playerAge . year > state . playerAgeMax . year ) return false
return state . playerAge . month < state . playerAgeMax . month
} ,
2022-01-09 19:05:58 -05:00
gameMonth : ( state ) => {
return {
1 : 'Jan.' ,
2 : 'Feb.' ,
3 : 'Mar.' ,
4 : 'Apr.' ,
5 : 'May.' ,
6 : 'Jun.' ,
7 : 'Jul.' ,
8 : 'Aug.' ,
9 : 'Sep.' ,
10 : 'Oct.' ,
11 : 'Nov.' ,
12 : 'Dec.' ,
} [ state . gameDate . month ]
} ,
2022-01-09 19:29:57 -05:00
currencySpent : ( state ) => {
return Decimal . subtract ( state . currencyTotal , state . currency )
} ,
2022-01-06 17:17:26 -08:00
}
export const mutations = {
2022-01-07 16:10:23 -05:00
addCurrency : ( state , value ) => {
state . currency = Decimal . add ( state . currency , value )
state . currencyTotal = Decimal . add ( state . currencyTotal , value )
} ,
spendCurrency : ( state , value ) => {
value = Decimal . mul ( value , - 1 )
state . currency = Decimal . add ( state . currency , value )
2022-01-07 16:19:21 -05:00
} ,
2022-01-10 02:16:25 -08:00
createInstrument : ( state , instrument ) => {
const index = state . processes . findIndex ( ( p ) => p . instrument === instrument )
Vue . set ( state . processes [ index ] , 'created' , true )
} ,
setProcessCompletion : ( state , { index , value } ) => {
Vue . set ( state . processes [ index ] , 'completion' , value )
2022-01-07 17:28:21 -05:00
} ,
2022-01-07 19:46:33 -08:00
setMissionAvailable : ( state , missionIndex ) => {
Vue . set ( state . missions [ missionIndex ] , 'available' , true )
} ,
setMissionViewed : ( state , missionIndex ) => {
Vue . set ( state . missions [ missionIndex ] , 'viewed' , true )
} ,
completeMission : ( state , missionIndex ) => {
state . missions [ missionIndex ] . complete = true
} ,
2022-01-10 02:16:25 -08:00
levelUpApprentice : ( state , process ) => {
if ( process . nextWorkerCost > state . currency ) {
return
}
const index = state . processes . findIndex ( ( p ) => p . worker === process . worker )
state . currency = Decimal . subtract ( state . currency , process . nextWorkerCost )
Vue . set ( state . processes [ index ] , 'workerLevel' , process . workerLevel + 1 )
2022-01-09 12:52:17 -05:00
Vue . set (
2022-01-10 02:16:25 -08:00
state . processes [ index ] ,
2022-01-09 12:52:17 -05:00
'nextWorkerCost' ,
2022-01-10 02:16:25 -08:00
Math . floor ( process . nextWorkerCost * process . nextWorkerFactor )
2022-01-09 12:52:17 -05:00
)
} ,
2022-01-09 18:29:13 -05:00
tickGameDate : ( state ) => {
let gameYear = state . gameDate . year
let gameMonth = state . gameDate . month + 1
2022-01-09 19:05:58 -05:00
// Intentional: Months are 1 through 12, ages are 0 through 11.
2022-01-09 18:29:13 -05:00
if ( gameMonth > 12 ) {
2022-01-09 18:34:50 -05:00
gameMonth = 1
gameYear = gameYear + 1
2022-01-09 18:29:13 -05:00
}
let ageYear = state . playerAge . year
let ageMonth = state . playerAge . month + 1
let wisdomGained = 0
2022-01-09 19:05:58 -05:00
if ( ageMonth >= 12 ) {
ageMonth = 0
2022-01-09 18:34:50 -05:00
ageYear = ageYear + 1
wisdomGained += 1
2022-01-09 18:29:13 -05:00
}
Vue . set ( state . gameDate , 'year' , gameYear )
Vue . set ( state . gameDate , 'month' , gameMonth )
Vue . set ( state . playerAge , 'year' , ageYear )
Vue . set ( state . playerAge , 'month' , ageMonth )
state . wisdomGained = state . wisdomGained + wisdomGained
} ,
travelGameDate : ( state , { month , year } ) => {
Vue . set ( state . gameDate , 'month' , month )
Vue . set ( state . gameDate , 'year' , year )
} ,
2022-01-06 17:17:26 -08:00
}