{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/assets/socials/docusaurus.svg","webpack:///./src/assets/images/currencies/emerald.svg","webpack:///./src/assets/socials/github.png","webpack:///./src/assets/images/currencies/ruby.svg","webpack:///./src/ig-template/GameState.ts","webpack:///./src/App.vue?60bf","webpack:///./src/ig-template/tools/saving/LocalStorage.ts","webpack:///./src/ig-template/features/wallet/CurrencyType.ts","webpack:///./src/ig-template/developer-panel/DeveloperPanel.ts","webpack:///./src/ig-template/developer-panel/DeveloperPanelTab.ts","webpack:///./src/ig-template/developer-panel/fields/AbstractField.ts","webpack:///./src/ig-template/developer-panel/fields/FunctionField.ts","webpack:///./src/ig-template/developer-panel/fields/DisplayField.ts","webpack:///./src/ig-template/developer-panel/fields/ChoiceField.ts","webpack:///./src/ig-template/Game.ts","webpack:///./src/ig-template/features/settings/SettingId.ts","webpack:///./src/ig-template/features/Feature.ts","webpack:///./src/ig-template/features/wallet/Wallet.ts","webpack:///./src/ig-template/features/statistics/StatisticId.ts","webpack:///./src/ig-template/tools/requirements/Progress.ts","webpack:///./src/ig-template/tools/requirements/Requirement.ts","webpack:///./src/ig-template/tools/requirements/NoRequirement.ts","webpack:///./src/ig-template/features/settings/Setting.ts","webpack:///./src/ig-template/features/settings/MultipleChoiceSetting.ts","webpack:///./src/ig-template/features/settings/SettingOption.ts","webpack:///./src/ig-template/features/settings/BooleanSetting.ts","webpack:///./src/ig-template/features/settings/Settings.ts","webpack:///./src/ig-template/features/achievements/AchievementId.ts","webpack:///./src/ig-template/features/statistics/AbstractStatistic.ts","webpack:///./src/ig-template/features/statistics/NumberStatistic.ts","webpack:///./src/ig-template/features/statistics/StatisticsSaveData.ts","webpack:///./src/ig-template/features/statistics/ArrayStatistic.ts","webpack:///./src/ig-template/features/statistics/Statistics.ts","webpack:///./src/ig-template/features/achievements/Achievement.ts","webpack:///./src/ig-template/features/achievements/AchievementSaveData.ts","webpack:///./src/ig-template/features/codes/RedeemableCodeId.ts","webpack:///./src/ig-template/tools/requirements/ManualRequirement.ts","webpack:///./src/ig-template/features/achievements/CustomAchievement.ts","webpack:///./src/ig-template/features/statistics/requirements/NumberStatisticRequirement.ts","webpack:///./src/ig-template/features/achievements/Achievements.ts","webpack:///./src/ig-template/features/codes/RedeemableCode.ts","webpack:///./src/ig-template/features/codes/RedeemableCodesSaveData.ts","webpack:///./src/ig-template/tools/upgrades/UpgradeId.ts","webpack:///./src/ig-template/tools/upgrades/UpgradeType.ts","webpack:///./src/ig-template/features/wallet/Currency.ts","webpack:///./src/ig-template/features/codes/RedeemableCodes.ts","webpack:///./src/ig-template/features/UpgradesFeature.ts","webpack:///./src/ig-template/tools/exp-level/AbstractExpLevel.ts","webpack:///./src/ig-template/tools/exp-level/ContinuousExpLevel.ts","webpack:///./src/ig-template/tools/actions/AbstractAction.ts","webpack:///./src/ig-template/features/action-generator/actions/JewelAction.ts","webpack:///./src/ig-template/features/action-generator/actions/GainExpAction.ts","webpack:///./src/ig-template/tools/probability/Random.ts","webpack:///./src/ig-template/features/action-generator/actions/GainCurrencyAction.ts","webpack:///./src/ig-template/tools/upgrades/AbstractUpgrade.ts","webpack:///./src/ig-template/tools/upgrades/DiscreteUpgrade.ts","webpack:///./src/ig-template/features/wallet/CurrencyBuilder.ts","webpack:///./src/ig-template/features/special-events/SpecialEventDateState.ts","webpack:///./src/ig-template/util/ArrayBuilder.ts","webpack:///./src/ig-template/tools/upgrades/SingleLevelUpgrade.ts","webpack:///./src/ig-template/tools/probability/WeightedDistribution.ts","webpack:///./src/ig-template/tools/probability/Outcome.ts","webpack:///./src/ig-template/features/action-generator/ActionGenerator.ts","webpack:///./src/ig-template/features/special-events/AbstractSpecialEvent.ts","webpack:///./src/ig-template/features/special-events/SpecialEvent.ts","webpack:///./src/ig-template/util/DateHelper.ts","webpack:///./src/ig-template/features/special-events/WeeklySpecialEvent.ts","webpack:///./src/ig-template/features/items/ItemId.ts","webpack:///./src/ig-template/features/special-events/SpecialEvents.ts","webpack:///./src/ig-template/features/inventory/InventorySlot.ts","webpack:///./src/ig-template/features/items/ItemType.ts","webpack:///./src/ig-template/features/items/AbstractItem.ts","webpack:///./src/ig-template/features/items/Consumable.ts","webpack:///./src/ig-template/features/items/instances/EmptyItem.ts","webpack:///./src/ig-template/features/key-items/KeyItemId.ts","webpack:///./src/ig-template/features/inventory/Inventory.ts","webpack:///./src/ig-template/features/items/instances/MoneyPouch.ts","webpack:///./src/ig-template/features/items/instances/ItemWithData.ts","webpack:///./src/ig-template/features/items/instances/RawFish.ts","webpack:///./src/ig-template/features/items/instances/CookedFish.ts","webpack:///./src/ig-template/features/items/ItemList.ts","webpack:///./src/ig-template/features/key-items/KeyItem.ts","webpack:///./src/ig-template/features/key-items/KeyItems.ts","webpack:///./src/App.ts","webpack:///./src/components/util/igt-notifications.vue?1150","webpack:///./src/components/util/igt-notification.vue?2cbd","webpack:///src/components/util/igt-notification.vue","webpack:///./src/components/util/igt-notification.vue?1d55","webpack:///./src/components/util/igt-notification.vue","webpack:///src/components/util/igt-notifications.vue","webpack:///./src/components/util/igt-notifications.vue?fba1","webpack:///./src/components/util/igt-notifications.vue","webpack:///./src/components/features/action-generator/sj-action-generator.vue?f9e9","webpack:///./src/components/util/igt-feature.vue?bcbd","webpack:///src/components/util/igt-feature.vue","webpack:///./src/components/util/igt-feature.vue?4de0","webpack:///./src/components/util/igt-feature.vue","webpack:///./src/components/tools/exp-level/igt-exp-level.vue?310a","webpack:///./src/components/util/igt-progress-bar.vue?3dfa","webpack:///src/components/util/igt-progress-bar.vue","webpack:///./src/components/util/igt-progress-bar.vue?3fe7","webpack:///./src/components/util/igt-progress-bar.vue","webpack:///src/components/tools/exp-level/igt-exp-level.vue","webpack:///./src/components/tools/exp-level/igt-exp-level.vue?a002","webpack:///./src/components/tools/exp-level/igt-exp-level.vue","webpack:///./src/components/tools/actions/igt-action.vue?1a6c","webpack:///src/components/tools/actions/igt-action.vue","webpack:///./src/components/tools/actions/igt-action.vue?ce26","webpack:///./src/components/tools/actions/igt-action.vue","webpack:///./src/components/tools/upgrades/sj-time-upgrade.vue?dfaa","webpack:///./src/components/features/action-generator/sj-currency.vue?e954","webpack:///src/components/features/action-generator/sj-currency.vue","webpack:///./src/components/features/action-generator/sj-currency.vue?fac0","webpack:///./src/components/features/action-generator/sj-currency.vue","webpack:///src/components/tools/upgrades/sj-time-upgrade.vue","webpack:///./src/components/tools/upgrades/sj-time-upgrade.vue?f971","webpack:///./src/components/tools/upgrades/sj-time-upgrade.vue","webpack:///./src/components/tools/upgrades/igt-discrete-upgrade.vue?9c7c","webpack:///src/components/tools/upgrades/igt-discrete-upgrade.vue","webpack:///./src/components/tools/upgrades/igt-discrete-upgrade.vue?4d4b","webpack:///./src/components/tools/upgrades/igt-discrete-upgrade.vue","webpack:///./src/components/tools/upgrades/igt-single-level-upgrade.vue?c51e","webpack:///src/components/tools/upgrades/igt-single-level-upgrade.vue","webpack:///./src/components/tools/upgrades/igt-single-level-upgrade.vue?2f8a","webpack:///./src/components/tools/upgrades/igt-single-level-upgrade.vue","webpack:///src/components/features/action-generator/sj-action-generator.vue","webpack:///./src/components/features/action-generator/sj-action-generator.vue?f045","webpack:///./src/components/features/action-generator/sj-action-generator.vue","webpack:///./src/components/sj-header.vue?d4b2","webpack:///src/components/sj-header.vue","webpack:///./src/components/sj-header.vue?3049","webpack:///./src/components/sj-header.vue","webpack:///./src/components/sj-footer.vue?5809","webpack:///src/components/sj-footer.vue","webpack:///./src/components/sj-footer.vue?b380","webpack:///./src/components/sj-footer.vue","webpack:///src/App.vue","webpack:///./src/App.vue?1160","webpack:///./src/App.vue","webpack:///./src/VueFilters.ts","webpack:///./src/main.ts","webpack:///./src/assets/images/currencies/diamond.svg","webpack:///./src/assets/socials/discord.png","webpack:///./src/assets/images/currencies/sapphire.svg"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","GameState","_vm","this","_h","$createElement","_c","_self","class","darkMode","staticClass","staticRenderFns","CurrencyType","localStorage","setItem","JSON","stringify","parse","getItem","removeItem","tabs","label","children","propertyName","cssClass","undefined","console","warn","componentName","func","setComponentName","options","features","_tickInterval","TICK_DURATION","SAVE_INTERVAL","_nextSave","gameSpeed","_lastUpdate","SAVE_KEY","state","Launching","setObject","start","setCssClass","pause","resume","stop","featureList","feature","fields","getDeveloperPanelFields","field","tab","saveKey","isEmpty","now","Date","getTime","timeDifference","Math","max","Playing","delta","update","save","type","multiplier","getTotalCurrencyMultiplier","initialize","Stopped","setInterval","debug","printStateWarning","clearInterval","Paused","res","store","delete","saveData","featureSaveData","load","reason","values","SettingId","supportedCurrencies","_currencies","_multipliers","_onCurrencyGain","_supportedCurrencies","supportsCurrencyType","currency","multiply","getCurrencyMultiplier","isValid","dispatch","amount","toString","costs","cost","hasCurrency","min","currencies","loseCurrency","hasCurrencies","loseMultipleCurrencies","isNaN","includes","sapphire","Sapphire","emerald","Emerald","ruby","Ruby","diamond","Diamond","asEvent","StatisticId","actual","target","actualValue","targetValue","id","displayName","defaultValue","requirement","canAccess","validValue","option","find","isCompleted","RangeError","displayText","list","setting","getSetting","registerSetting","DarkMode","ExampleMultipleChoiceSetting","set","settingSave","map","AchievementId","description","totalMoneyGained","registerStatistic","TotalMoneyGained","wallet","onCurrencyGain","subscribe","incrementNumberStatistic","hasStatistic","statistic","index","newValue","addStatistic","title","image","isHidden","unlocked","progress","RedeemableCodeId","isSet","forceCompletion","ACHIEVEMENT_CHECK_TIME","_checkCounter","_onUnlock","registerAchievement","TotalMoney100","statistics","ExampleAchievement","checkForAchievementsCompleted","achievement","requirementsCompleted","isJustUnlocked","unlock","hasAchievement","getAchievement","addAchievement","hash","rewardFunction","isRepeatable","isRedeemed","UpgradeId","UpgradeType","error","exampleCode","gainCurrency","codeString","redeemableCode","redeem","text","chr","charCodeAt","forEach","foundCode","code","filter","upgrades","_wallet","upgrade","canBuy","buy","canAfford","upgradeSaveData","getUpgrade","maxLevel","baseExp","exp","getExpNeededForLevel","level","getLevel","expForNextLevel","getExpForNextLevel","alreadyGainedExp","levelFunc","Infinity","duration","repeat","isStarted","currentProgress","_onCompletion","canBeCompleted","complete","canRepeat","gainReward","repeatAction","canPerform","log","isNegative","isLocked","expLevel","_expLevel","gainExperience","floor","random","number","ratio","intBetween","probability","requireNormalizedProbability","chance","array","arrayIndex","temporaryValue","randomIndex","currentIndex","fuzzInt","abs","getBonusForLevel","isMaxLevel","getCost","levelUp","costList","bonusList","baseLevel","Error","SpecialEventDateState","amounts","step","count","bonus","outcomes","canGet","outcomesWithMetRequirements","totalWeight","getTotalWeight","floatBetween","weight","outcome","item","fromArray","indexOf","actions","checkCounter","playerLevel","refreshDurationUpgrade","ActionRefreshDuration","None","createArray","fromStartAndStepAdditive","maxActionsUpgrade","MaxActions","negativeRateUpgrade","NegativeRate","speedBoostUpgrade","SpeedBoost","concat","locks","Locks","betterGems","BetterGems","highlightNegatives","HighlightNegative","completeTheGame","CompleteTheGame","generateNewActions","currentLock","maxLock","total","action","getBonus","perform","switchTime","maxActionCount","createCurrencyGain","negativeProb","isBought","newActions","oldAction","wasStarted","newAction","getAction","possibleActions","createExpGain","speedBoost","benefit","pow","sqrt","booleanWithProbability","distribution","createSapphire","gemImprovement","createEmerald","createRuby","createDiamond","draw","startFunction","endFunction","isActive","date","getDateState","During","After","startTime","endTime","Before","minutes","seconds","weeks","setDate","getDate","milliseconds","MILLI_SECONDS_PER_DAY","days","ceil","MILLI_SECONDS_PER_HOUR","hours","MILLI_SECONDS_PER_MINUTE","ItemId","increaseWeek","addWeeks","SPECIAL_EVENT_CHECK_TIME","_onEventStart","_onEventEnd","events","event","checkForEvents","canStart","canEnd","end","maxStack","ItemType","consume","KeyItemId","Empty","slots","_itemList","_onItemGain","slotCount","Array","fill","itemList","indexFrom","indexTo","itemFrom","itemTo","swapItems","mergeItems","spaceLeft","loseItems","gainItems","temp","inventoryItem","canConsume","consumeMultiple","loseItemAtIndex","getTotalAmount","nonFullStackIndex","getIndexOfNonFullStack","indexToUse","getIndexOfItem","amountToRemove","amountLeft","_gainItem","emptyIndex","getIndexOfFirstEmptySlot","amountToAdd","itemAmounts","clonedInventory","cloneDeep","gainItem","hasItemAmount","getSpotsLeftForItem","isFull","slotData","e","slot","MoneyPouch","Consumable","consumeLabel","moneyToGain","customData","ItemWithData","Default","RawFish","CookedFish","_features","unlockHint","isUnlocked","_onKeyItemGain","registerKeyItem","Item1","Item2","keyItem","getKeyItem","didUnlock","game","getDefaultGame","settings","codes","actionGenerator","inventory","keyItems","specialEvents","achievements","inProduction","attrs","scopedSlots","_u","fn","ref","notifications","_l","notification","backgroundColor","icon","textColor","_v","_s","props","required","computed","component","components","refreshUpgrade","generator","nativeOn","$event","buyUpgrade","maxActionUpgrade","highlightNegativeUpgrade","buyFinalUpgrade","_e","refreshProgress","on","lock","containerClass","_t","String","default","_f","progressPercentage","bgClass","fgClass","style","percentage","Number","getLevelProgress","getPercentage","color","toggle","lockImage","stopPropagation","Boolean","methods","$emit","getProgress","getUpgradeBonus","highlightNegativeActions","bought","$swal","resetSave","confirmed","location","reload","pauseResume","isPaused","SjFooter","SjHeader","SjActionGenerator","IgtNotifications","showDevPanel","toFixed","replace","year","Intl","DateTimeFormat","format","month","day","getHours","hoursString","getMinutes","minutesString","string","charAt","toUpperCase","use","config","productionTip","onload","App","render","h","$mount"],"mappings":"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","file":"js/app.bbf9a3d2.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/stable-jewels/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","module.exports = __webpack_public_path__ + \"img/docusaurus.09a7b121.svg\";","module.exports = __webpack_public_path__ + \"img/emerald.75b1a26d.svg\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAABVlJREFUeJztm1uIVVUYgL+zx5x0Zo4zZpldxiYltasVpYxjmFERQhAV0RWh7DL4Ug8DQRe7oUZNmmC99mBQYEVk+FAaRTeCgvJSk9GJmpysRmvOwaxxpod/n+ac3dp7r3/fzg764Idhz7/+yzp77b3W+tcukD6dwGLgfGA+cBowE2gHml2dI8Ah4CegBOwFPgM+BH7IIMZEKQA9wEZgHzAeU74GNgBLXNu5pQPoA74hftJBndGH3D25YTqwDiiTXuJeGQHWIp3eMBxgNTBMdol75Veg140lU+YBH8UIPGn5ADgj1YxrWAlUUkwmqpSBW9NLG5qATTlINEyeIYUh0Qy8loPkbOUVYHKSyW/PQVJaeTOJTmjiv/XLe2UrMYfDszlIIq70R01+ZQ6CT0pu9kvSb249D/gUmBrQQWPAFcBh4BzgKlcSe/j4cAQZ39uBXUCr+3fQOqGMLMb22ThwsJvkvGdoewLwKPCbRXutHAQeBmYY/NrE+z6GTppkMNYLLDJc9/K24doB4CHk2fEEsKrGaQX4EvgW2I8sfw+7/5uCrClOArqQO3CK+78x4HngQWTabWKnRczdwF2uLV+mYz+3vy7EIciy+G7gTHRP4yZkWPW6gYdxk2XMPxOyklxnaWgcWKpIKG2WYx/3Y35GOtAtaXtSSSUay7CP+3dgWrVh7W25CmhRODU9jBrF8QrdNiRXYKIDCsgDQsO5Sv00OVupf6f3Qg/619KO6PEmzjvo419ca2CjsvFfwCWppqRjGTCKLoenag1od28fTzefSKxFl8OeasNOZcMfmZik5IkWpK6gyWWWg2csWLCZiRlcnqgAzynbdDvIIkHDFqV+lryo1F/oIOUqW0rIXD6vDACDCv0FDlKrs+ULVTiNYZdCt8tBCpW2DCmDaQT7FbozHXR1tlFlMI1AE2OHw0SJ2oY8vv68BO1ieWl2kA0HW1qVwTQCTYxjDrp3+qnKYBpBp0K34iB7ALbMUQaTNQXgdIV+2UH33pyhdJA184GiQn/QAb5TOlmu1M+SS5X6JQf4StnoBqV+lmhjGwC4Bt0KagxYkEy8iXIe+k2RqwFOjtBwazY5qXgDfR6zqo33Rmh8ffo5WWNbF6iVujXD0xEMjAAXppqWHRcT7cjOk7VGuiMYGEfKW5elmFwYlyP7/FFi/1cpbSCioaNIb2Y5TS4idf+jEWPebTLa56O8Byl49hP8rDgAPIAUONOiE1gD/BIQh43cazI+DXNZ+1XqCyi3IePfz/goUopeA1wJnBgx2QKy9liBVJo/Rl7BcRIfR4q/vner39byW8ApNXoXhXSCV7YhFV9bjkFK3nGTNckjQY7bkRKyqeEg9YuhWywdVqjvPFu6gD8STn4IqQ0Gck+Agc+p30CxOUEWeCAhhBciJuont9s4dZDjL35G7q/RLSLndIOcrtDn/Q/XKpILk50ovjeYi/9ZgWHqy+jNyLjyPpnLwMvEO9I+NyAhjYwgQ0pF0PRytUG/CSlTLwXOQh5kcWkLiEEjkaft/T4Gh8lmY+RYH/8aWR8nAAe5jU2GS8DCOMYtmOrj21a2kMB3RpORg4kmB38ixdILfBxptqdMtPj4tZHXSWYYAtIJL4U4PIScLn0X+AT43r1uOotoS2uIz6BfPo5fIw7Rls1xfoViBH/rSfnzuhvRHafTVJ68aDpghAw3aeYgt7pNYJpSlZd2Sx870FW5E8FBjpuFHUvRnD30clyI7SFketvQL0qLyPHTg5iDjPMm8OuAYWT2GbqwyZI24D5kA6UaaIl4v84k5FBW1d5uZDMj90XaRcitGWUZ7GU2cAey+fk/SfM3fwVWkQmXJ1MAAAAASUVORK5CYII=\"","module.exports = __webpack_public_path__ + \"img/ruby.7ab784d9.svg\";","/**\n * Launching: The default, game is still starting up\n * Playing: Normal gameplay\n * Paused: Gameplay is suspended, to continue you need to resume\n * Stopped: Gameplay is stopped, to continue you need to start\n */\nexport enum GameState {\n Launching = \"Launching\",\n Playing = \"Playing\",\n Paused = \"Paused\",\n Stopped = \"Stopped\",\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:{'dark': _vm.darkMode}},[_c('igt-notifications'),_c('div',{staticClass:\"flex flex-col h-screen\"},[_c('sj-header'),_c('sj-action-generator',{staticClass:\"flex-grow\"}),_c('sj-footer')],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","export class LocalStorage {\n public static store(key: string, data: Record): void {\n localStorage.setItem(key, JSON.stringify(data));\n }\n\n // TODO(@Isha) add error handling here\n public static get(key: string): Record {\n return JSON.parse(localStorage.getItem(key) as string) as Record;\n }\n\n public static delete(key: string): void {\n localStorage.removeItem(key)\n }\n}\n","export enum CurrencyType {\n Sapphire = \"Sapphire\",\n Emerald = \"Emerald\",\n Ruby = \"Ruby\",\n Diamond = \"Diamond\",\n}\n","import {DeveloperPanelTab} from \"@/ig-template/developer-panel/DeveloperPanelTab\";\n\nexport class DeveloperPanel {\n tabs: DeveloperPanelTab[];\n\n constructor(tabs: DeveloperPanelTab[]) {\n this.tabs = tabs;\n }\n}","import {AbstractField} from \"@/ig-template/developer-panel/fields/AbstractField\";\n\nexport class DeveloperPanelTab {\n label: string;\n children: AbstractField[];\n\n\n constructor(label: string, children: AbstractField[]) {\n this.label = label;\n this.children = children;\n }\n\n isEmpty(): boolean {\n return this.children.length == 0;\n }\n}","export class AbstractField {\n object: object | undefined;\n componentName: string | undefined;\n\n propertyName: string;\n label: string | undefined;\n\n cssClass: string;\n\n constructor(propertyName: string, label?: string) {\n this.propertyName = propertyName;\n this.label = label;\n this.cssClass = 'btn-green';\n }\n\n get displayLabel() {\n return this.label ?? this.propertyName;\n }\n\n get value() {\n if (this.object == undefined) {\n console.warn(`Cannot get warning as object is undefined for AbstractField ${this.propertyName}`)\n return '';\n }\n return (this.object as any)[this.propertyName];\n }\n\n set value(value: any) {\n (this.object as any)[this.propertyName] = value;\n }\n\n setObject(object: object): this {\n this.object = object;\n return this;\n }\n\n setCssClass(cssClass: string): this {\n this.cssClass = cssClass;\n return this;\n }\n\n setComponentName(name: string): this {\n this.componentName = name;\n return this;\n }\n}","import {AbstractField} from \"@/ig-template/developer-panel/fields/AbstractField\";\n\n/**\n * Runs a custom function when the button is pressed\n */\nexport class FunctionField extends AbstractField {\n\n func: Function ;\n\n constructor(func: Function, label?: string) {\n super('', label);\n this.func = func;\n this.setComponentName('igt-button-field');\n }\n\n}","import {AbstractField} from \"@/ig-template/developer-panel/fields/AbstractField\";\n\nexport class DisplayField extends AbstractField {\n\n constructor(propertyName: string, label?: string) {\n super(propertyName, label);\n this.setComponentName('igt-display-field');\n }\n\n}","import {AbstractField} from \"@/ig-template/developer-panel/fields/AbstractField\";\n\nexport class ChoiceField extends AbstractField {\n options: [string, number][];\n\n constructor(propertyName: string, options: [string, number][], label?: string) {\n super(propertyName, label);\n this.options = options;\n this.setComponentName('igt-choice-field');\n }\n\n}","import {GameState} from \"./GameState\";\nimport {LocalStorage} from \"@/ig-template/tools/saving/LocalStorage\";\nimport {CurrencyType} from \"@/ig-template/features/wallet/CurrencyType\";\nimport {Features} from \"@/ig-template/Features\";\nimport {Feature} from \"@/ig-template/features/Feature\";\nimport {DeveloperPanel} from \"@/ig-template/developer-panel/DeveloperPanel\";\nimport {DeveloperPanelTab} from \"@/ig-template/developer-panel/DeveloperPanelTab\";\nimport {FunctionField} from \"@/ig-template/developer-panel/fields/FunctionField\";\nimport {DisplayField} from \"@/ig-template/developer-panel/fields/DisplayField\";\nimport {ChoiceField} from \"@/ig-template/developer-panel/fields/ChoiceField\";\n\nexport class Game {\n private _tickInterval: number = -1;\n\n /**\n * Object with registered features. If you want them as a list use this.featureList\n */\n public readonly features: Features;\n\n public state: GameState;\n\n\n private readonly TICK_DURATION = 0.05;\n private readonly SAVE_INTERVAL = 30;\n private _nextSave = this.SAVE_INTERVAL;\n\n private gameSpeed = 1;\n private _lastUpdate: number = 0;\n\n /**\n * Otherwise you might run into loading conflicts when multiple games are hosted on the same domain (such as {\n this.start()\n }, 'Start').setCssClass('btn-green'),\n new FunctionField(() => {\n this.pause()\n }, 'Pause').setCssClass('btn-blue'),\n new FunctionField(() => {\n this.resume()\n }, 'Resume').setCssClass('btn-green'),\n new FunctionField(() => {\n this.stop()\n }, 'Stop').setCssClass('btn-red'),\n ]),\n\n ];\n\n\n for (const feature of this.featureList) {\n const fields = feature.getDeveloperPanelFields();\n\n // Inject the feature into the field.\n for (const field of fields) {\n field.setObject(feature);\n }\n\n const tab = new DeveloperPanelTab(feature.saveKey, fields)\n if (!tab.isEmpty()) {\n tabs.push(tab)\n }\n }\n return new DeveloperPanel(tabs);\n }\n\n /**\n * Update all features\n */\n public update(): void {\n const now = new Date().getTime() / 1000;\n const timeDifference = Math.max(0, now - this._lastUpdate);\n\n if (this.state != GameState.Playing) {\n return;\n }\n\n const delta = timeDifference * this.gameSpeed;\n for (const feature of this.featureList) {\n feature.update(delta)\n }\n\n this._lastUpdate = now;\n this._nextSave -= delta;\n if (this._nextSave <= 0) {\n this.save();\n this._nextSave = this.SAVE_INTERVAL;\n }\n }\n\n public getTotalCurrencyMultiplier(type: CurrencyType): number {\n let multiplier = 1;\n for (const feature of this.featureList) {\n multiplier *= feature.getTotalCurrencyMultiplier(type);\n }\n return multiplier;\n }\n\n /**\n * Initialize all features\n */\n public initialize(): void {\n for (const feature of this.featureList) {\n feature.initialize(this.features);\n }\n }\n\n /**\n * Start the main update loop\n */\n public start(): void {\n if (this.state !== GameState.Stopped && this.state !== GameState.Launching) {\n this.printStateWarning(\"Cannot start the game twice.\");\n return;\n }\n\n for (const feature of this.featureList) {\n feature.start();\n }\n\n this._lastUpdate = new Date().getTime() / 1000;\n this._tickInterval = setInterval(() => this.update(), this.TICK_DURATION * 1000);\n\n this.state = GameState.Playing;\n console.debug(\"Game Started\");\n }\n\n public pause(): void {\n if (this.state !== GameState.Playing) {\n this.printStateWarning(\"Cannot pause the game if we're not playing.\");\n return;\n }\n clearInterval(this._tickInterval);\n\n this.state = GameState.Paused;\n console.debug(\"Game Paused\");\n }\n\n\n public resume(): void {\n if (this.state !== GameState.Paused) {\n this.printStateWarning(\"Cannot resume the game if we're not paused.\");\n return;\n }\n\n this._lastUpdate = new Date().getTime() / 1000;\n this._tickInterval = setInterval(() => this.update(), this.TICK_DURATION * 1000);\n\n this.state = GameState.Playing;\n console.debug(\"Game Resumed\");\n }\n\n /**\n * Stop the main update loop\n */\n public stop(): void {\n if (this.state === GameState.Stopped) {\n this.printStateWarning(\"Cannot stop the game if we're already stopped.\");\n return;\n }\n clearInterval(this._tickInterval);\n\n for (const feature of this.featureList) {\n feature.stop();\n }\n\n this.state = GameState.Stopped;\n console.debug(\"Stopped\");\n }\n\n /**\n * Recursively save all registered features\n */\n public save(): void {\n const res: Record = {};\n for (const feature of this.featureList) {\n res[feature.saveKey] = feature.save()\n }\n LocalStorage.store(this.SAVE_KEY, res)\n }\n\n /**\n * Delete the locally stored save\n */\n public deleteSave(): void {\n LocalStorage.delete(this.SAVE_KEY);\n }\n\n /**\n * Recursively load all registered features\n */\n public load(): void {\n const saveData = LocalStorage.get(this.SAVE_KEY)\n if (saveData == null) {\n return;\n }\n for (const feature of this.featureList) {\n const featureSaveData: Record = saveData[feature.saveKey] as Record;\n if (featureSaveData == null) {\n continue;\n }\n feature.load(featureSaveData);\n }\n }\n\n private printStateWarning(reason: string): void {\n console.warn(`Current state = ${this.state}.`, reason);\n }\n\n private get featureList(): Feature[] {\n return Object.values(this.features)\n }\n\n}\n","export enum SettingId {\n DarkMode = 'dark-mode',\n ExampleMultipleChoiceSetting = 'multiple-choice',\n}\n","import {Saveable} from \"@/ig-template/tools/saving/Saveable\";\nimport {SaveData} from \"@/ig-template/tools/saving/SaveData\";\nimport {CurrencyType} from \"@/ig-template/features/wallet/CurrencyType\";\nimport {Features} from \"@/ig-template/Features\";\nimport {AbstractField} from \"@/ig-template/developer-panel/fields/AbstractField\";\n\n/**\n * An abstract class that all features should extend for.\n */\nexport abstract class Feature implements Saveable {\n\n /**\n * Initialize all feature attributes.\n * Note that you should not assume other features exist already here\n * @param saveKey\n */\n protected constructor(saveKey: string) {\n this.saveKey = saveKey;\n }\n\n /**\n * Called in dev mode, decides which fields to show in the developer panel.\n */\n getDeveloperPanelFields(): AbstractField[] {\n return []\n }\n\n /**\n * Called after all features are created.\n * Can be used to subscribe to other features events\n */\n initialize(features: Features): void {\n // This method intentionally left blank\n }\n\n /**\n * Runs when the game gets started. Can be run multiple times if the player can stop the game\n */\n start(): void {\n // This method intentionally left blank\n }\n\n /**\n * Runs when the game gets stopped. NOT when the game closes\n */\n stop(): void {\n // This method intentionally left blank\n }\n\n /**\n * Default false to avoid not implementing the proper restrictions\n */\n canAccess(): boolean {\n return false;\n }\n\n /**\n * Override in features if specified\n * IMPORTANT: Make sure to always return 1 as the default\n */\n getTotalCurrencyMultiplier(type: CurrencyType) {\n return 1;\n }\n\n /**\n * Gets called every Game.TICK_DURATION\n * @param delta time since last update\n */\n update(delta: number): void {\n // Override in subclass if needed\n }\n\n // Saving logic\n saveKey: string;\n\n abstract load(data: SaveData): void;\n\n abstract save(): SaveData;\n\n\n}\n","import {Currency} from \"./Currency\";\nimport {CurrencyType} from \"./CurrencyType\";\n\nimport {ISimpleEvent, SimpleEventDispatcher} from \"strongly-typed-events\";\nimport {Feature} from \"@/ig-template/features/Feature\";\nimport {WalletSaveData} from \"@/ig-template/features/wallet/WalletSaveData\";\n\n\nexport class Wallet extends Feature {\n private _currencies: Record = {} as Record\n private _multipliers: Record = {} as Record\n\n private _onCurrencyGain = new SimpleEventDispatcher();\n\n private readonly _supportedCurrencies: CurrencyType[];\n\n constructor(supportedCurrencies: CurrencyType[]) {\n super(\"wallet\");\n\n this._supportedCurrencies = supportedCurrencies;\n\n // Initialize currencies and multipliers\n for (const type of this._supportedCurrencies) {\n this._currencies[type as CurrencyType] = 0;\n this._multipliers[type as CurrencyType] = 1;\n }\n }\n\n public getAmount(type: CurrencyType): number {\n if (!this.supportsCurrencyType(type)) {\n return 0;\n }\n return this._currencies[type];\n }\n\n /**\n * Gain the specified currency and apply the global multiplier\n */\n public gainCurrency(currency: Currency): void {\n currency.multiply(this.getCurrencyMultiplier(currency.type));\n\n if (!currency.isValid() || !this.supportsCurrencyType(currency.type)) {\n console.warn(`Could not add currency ${currency.toString()}`);\n return;\n }\n\n this._onCurrencyGain.dispatch(currency);\n this._currencies[currency.type] += currency.amount;\n }\n\n /**\n * Return true if all currencies are valid and the player has the specified amount.\n */\n hasCurrencies(costs: Currency[]) {\n for (const cost of costs) {\n if (!this.hasCurrency(cost)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Return true if the currency is valid and the player has the specified amount.\n */\n public hasCurrency(currency: Currency): boolean {\n if (!this.supportsCurrencyType(currency.type)) {\n return false;\n }\n return this._currencies[currency.type] >= currency.amount;\n }\n\n\n public loseCurrency(currency: Currency): void {\n if (!currency.isValid() || !this.supportsCurrencyType(currency.type)) {\n console.warn(`Could not lose currency ${currency.toString()}`);\n return;\n }\n this._currencies[currency.type] -= Math.min(currency.amount, this._currencies[currency.type]);\n }\n\n /**\n * Remove the currencies amounts from the specified currency.\n * IMPORTANT: This method does not care if amounts go negative\n */\n public loseMultipleCurrencies(currencies: Currency[]) {\n for (const currency of currencies) {\n this.loseCurrency(currency);\n }\n }\n\n /**\n * Subtracts the specified currencies and returns true if the wallet has enough.\n * Otherwise return false and don't subtract anything\n */\n public payMultipleIfPossible(currencies: Currency[]): boolean {\n if (this.hasCurrencies(currencies)) {\n this.loseMultipleCurrencies(currencies);\n return true;\n }\n return false;\n }\n\n /**\n * Subtracts the specified currency and returns true if the wallet has enough.\n * Otherwise return false and don't subtract anything\n * @param currency\n * @constructor\n */\n public payIfPossible(currency: Currency): boolean {\n if (this.hasCurrency(currency)) {\n this.loseCurrency(currency);\n return true;\n }\n return false;\n }\n\n /**\n * Return 1 if the multiplier is not set\n */\n public getCurrencyMultiplier(type: CurrencyType): number {\n return this._multipliers[type] ?? 1;\n }\n\n public setCurrencyMultiplier(multiplier: number, type: CurrencyType): void {\n if (multiplier <= 0 || isNaN(multiplier) || !this.supportsCurrencyType(type)) {\n return;\n }\n this._multipliers[type] = multiplier;\n }\n\n public supportsCurrencyType(type: CurrencyType): boolean {\n return this._supportedCurrencies.includes(type);\n }\n\n public canAccess(): boolean {\n return true;\n }\n\n public save(): WalletSaveData {\n return {\n sapphire: this._currencies[CurrencyType.Sapphire],\n emerald: this._currencies[CurrencyType.Emerald],\n ruby: this._currencies[CurrencyType.Ruby],\n diamond: this._currencies[CurrencyType.Diamond],\n }\n }\n\n public load(data: WalletSaveData): void {\n this._currencies[CurrencyType.Sapphire] = data.sapphire ?? this._currencies[CurrencyType.Sapphire];\n this._currencies[CurrencyType.Emerald] = data.emerald ?? this._currencies[CurrencyType.Emerald];\n this._currencies[CurrencyType.Ruby] = data.ruby ?? this._currencies[CurrencyType.Ruby];\n this._currencies[CurrencyType.Diamond] = data.diamond ?? this._currencies[CurrencyType.Diamond];\n }\n\n /**\n * Emitted whenever a currency is gained\n * @private\n */\n public get onCurrencyGain(): ISimpleEvent {\n return this._onCurrencyGain.asEvent();\n }\n\n public get sapphire(): number {\n return this._currencies.Sapphire;\n }\n\n public get emerald(): number {\n return this._currencies.Emerald;\n }\n\n public get ruby(): number {\n return this._currencies.Ruby;\n }\n\n public get diamond(): number {\n return this._currencies.Diamond;\n }\n\n public set money(value: number) {\n this._currencies.Diamond = value;\n }\n}\n","export enum StatisticId {\n TotalMoneyGained = \"total-money-gained\",\n}","export class Progress {\n actual: number;\n target: number;\n\n constructor(actual: number, target: number) {\n this.actual = actual;\n this.target = target;\n }\n\n getPercentage(): number {\n return Math.min(1, Math.max(0, this.actual / this.target));\n }\n}\n","import {Progress} from \"./Progress\";\n\n/**\n * Abstract class that can be configured to whatever requirements you like.\n */\nexport abstract class Requirement {\n\n // Getters as the user should view these as attributes\n\n get isCompleted(): boolean {\n return this.actualValue >= this.targetValue;\n }\n\n get progress(): Progress {\n return new Progress(Math.min(this.actualValue, this.targetValue), this.targetValue);\n }\n\n abstract get hint(): string;\n\n abstract get actualValue(): number;\n\n abstract get targetValue(): number;\n}\n","import {Requirement} from \"@/ig-template/tools/requirements/Requirement\";\n\n/**\n * A requirement that is always completed\n */\nexport class NoRequirement extends Requirement {\n\n get isCompleted(): boolean {\n return true;\n }\n\n get actualValue(): number {\n return 0;\n }\n\n get hint(): string {\n return \"\";\n }\n\n get targetValue(): number {\n return 0;\n }\n}\n","import {SettingId} from \"@/ig-template/features/settings/SettingId\";\nimport {Requirement} from \"@/ig-template/tools/requirements/Requirement\";\nimport {NoRequirement} from \"@/ig-template/tools/requirements/NoRequirement\";\nimport {SettingOption} from \"@/ig-template/features/settings/SettingOption\";\nimport {SettingsValue} from \"@/ig-template/features/settings/SettingsValueType\";\n\n\nexport abstract class Setting {\n id: SettingId;\n displayName: string;\n options: SettingOption[];\n defaultValue: SettingsValue;\n value: SettingsValue;\n\n requirement: Requirement;\n\n protected constructor(id: SettingId, displayName: string, options: SettingOption[], defaultValue: SettingsValue, requirement: Requirement = new NoRequirement()) {\n this.id = id;\n this.displayName = displayName;\n this.options = options;\n this.defaultValue = defaultValue;\n\n this.value = defaultValue;\n\n this.requirement = requirement;\n }\n\n set(value: SettingsValue): void {\n if (!this.canAccess) {\n return;\n }\n if (this.validValue(value)) {\n this.value = value;\n } else {\n console.warn(`${value} is not a valid value for setting ${this.id}. It could be that the option is not yet unlocked.`);\n }\n }\n\n validValue(value: SettingsValue): boolean {\n const option = this.options.find((option) => option.value === value);\n if (option == undefined || !option.canAccess) {\n return false;\n }\n return true;\n }\n\n isSelected(value: SettingsValue): boolean {\n return this.value === value;\n }\n\n get canAccess(): boolean {\n return this.requirement.isCompleted\n }\n\n}\n","import {Setting} from \"@/ig-template/features/settings/Setting\";\nimport {SettingId} from \"@/ig-template/features/settings/SettingId\";\nimport {SettingOption} from \"@/ig-template/features/settings/SettingOption\";\nimport {Requirement} from \"@/ig-template/tools/requirements/Requirement\";\nimport {SettingsValue} from \"@/ig-template/features/settings/SettingsValueType\";\n\nexport class MultipleChoiceSetting extends Setting {\n\n constructor(id: SettingId, displayName: string, options: SettingOption[], defaultValue: SettingsValue, requirement?: Requirement) {\n super(id, displayName, options, defaultValue, requirement);\n\n if (!this.validValue(this.defaultValue)) {\n throw new RangeError(`${this.defaultValue} is not a valid value for setting ${this.id}.`);\n }\n }\n}\n","import {Requirement} from \"@/ig-template/tools/requirements/Requirement\";\nimport {NoRequirement} from \"@/ig-template/tools/requirements/NoRequirement\";\nimport {SettingsValue} from \"@/ig-template/features/settings/SettingsValueType\";\n\nexport class SettingOption {\n displayText: string;\n value: SettingsValue;\n\n requirement: Requirement;\n\n\n constructor(displayText: string, value: SettingsValue, requirement: Requirement = new NoRequirement()) {\n this.displayText = displayText;\n this.value = value;\n this.requirement = requirement;\n }\n\n get canAccess() {\n return this.requirement.isCompleted;\n }\n}\n","import {Setting} from \"@/ig-template/features/settings/Setting\";\nimport {SettingId} from \"@/ig-template/features/settings/SettingId\";\nimport {Requirement} from \"@/ig-template/tools/requirements/Requirement\";\nimport {SettingOption} from \"@/ig-template/features/settings/SettingOption\";\n\n/**\n * A setting that can only be on or off.\n * The options can't have requirements but this can be solved by using the correct defaultValue and requirement.\n */\nexport class BooleanSetting extends Setting {\n\n constructor(id: SettingId, displayName: string, defaultValue: boolean, requirement?: Requirement) {\n super(id, displayName, [\n new SettingOption(\"On\", true),\n new SettingOption(\"Off\", false)\n ], defaultValue, requirement);\n }\n\n public toggle(): void {\n this.value = !this.value;\n }\n}","import {Feature} from \"@/ig-template/features/Feature\";\nimport {SettingsSaveData} from \"@/ig-template/features/settings/SettingsSaveData\";\nimport {Setting} from \"@/ig-template/features/settings/Setting\";\nimport {SettingId} from \"@/ig-template/features/settings/SettingId\";\nimport {MultipleChoiceSetting} from \"@/ig-template/features/settings/MultipleChoiceSetting\";\nimport {SettingOption} from \"@/ig-template/features/settings/SettingOption\";\nimport {BooleanSetting} from \"@/ig-template/features/settings/BooleanSetting\";\nimport {SettingsValue} from \"@/ig-template/features/settings/SettingsValueType\";\n\nexport class Settings extends Feature {\n list: Setting[];\n\n darkMode: BooleanSetting;\n\n constructor() {\n super(\"settings\");\n this.list = [];\n\n // Empty, will be overwritten in initialize()\n this.darkMode = {} as BooleanSetting;\n }\n\n registerSetting(setting: T): T {\n if (!this.getSetting(setting.id)) {\n this.list.push(setting);\n }\n return setting;\n }\n\n initialize() {\n this.darkMode = this.registerSetting(new BooleanSetting(SettingId.DarkMode, \"Dark Mode\", true));\n\n this.registerSetting(\n new MultipleChoiceSetting(SettingId.ExampleMultipleChoiceSetting, \"Example setting\", [\n new SettingOption(\"Option 1\", 1),\n new SettingOption(\"Option 2\", 2),\n new SettingOption(\"Option 3\", 3),\n ], 2)\n )\n }\n\n setSetting(id: SettingId, value: SettingsValue) {\n const setting = this.getSetting(id);\n if (setting) {\n setting.set(value);\n } else {\n console.warn(`Setting ${id} does not exist`);\n }\n\n }\n\n getSetting(id: SettingId): T | null {\n for (let i = 0; i < this.list.length; i++) {\n if (this.list[i].id == id) {\n return this.list[i] as T;\n }\n }\n console.warn(`Setting ${id} does not exist`);\n return null;\n }\n\n\n load(data: SettingsSaveData): void {\n for (const settingSave of data.list) {\n this.getSetting(settingSave.id)?.set(settingSave.value);\n }\n }\n\n save(): SettingsSaveData {\n\n return {\n list: this.list.map(setting => {\n return {\n id: setting.id,\n value: setting.value\n }\n })\n }\n\n }\n}\n","export enum AchievementId {\n TotalMoney100 = \"total-money-100\",\n ExampleAchievement = \"example\",\n}","import {StatisticId} from \"@/ig-template/features/statistics/StatisticId\";\nimport {StatisticsValue} from \"@/ig-template/features/statistics/StatisticsValueType\";\n\nexport abstract class AbstractStatistic {\n id: StatisticId;\n description: string;\n abstract value: StatisticsValue;\n\n protected constructor(id: StatisticId, description: string) {\n this.id = id;\n this.description = description;\n }\n\n}","import {AbstractStatistic} from \"@/ig-template/features/statistics/AbstractStatistic\";\nimport {StatisticId} from \"@/ig-template/features/statistics/StatisticId\";\n\nexport class NumberStatistic extends AbstractStatistic {\n value: number;\n\n constructor(id: StatisticId, description: string, value: number = 0) {\n super(id, description);\n this.value = value;\n }\n\n}","import {StatisticsValue} from \"./StatisticsValueType\";\nimport {StatisticId} from \"@/ig-template/features/statistics/StatisticId\";\n\nexport class StatisticsSaveData {\n list: Record;\n\n constructor() {\n this.list = {} as Record;\n }\n\n addStatistic(id: StatisticId, value: StatisticsValue): void {\n this.list[id] = value;\n }\n\n}","import {AbstractStatistic} from \"@/ig-template/features/statistics/AbstractStatistic\";\nimport {StatisticId} from \"@/ig-template/features/statistics/StatisticId\";\n\nexport class ArrayStatistic extends AbstractStatistic {\n value: number[];\n\n constructor(id: StatisticId, description: string, value: number[]) {\n super(id, description);\n this.value = value;\n }\n\n\n}","/**\n * Statistics class to keep track of increasing numbers\n */\nimport {StatisticId} from \"@/ig-template/features/statistics/StatisticId\";\nimport {NumberStatistic} from \"@/ig-template/features/statistics/NumberStatistic\";\nimport {Feature} from \"@/ig-template/features/Feature\";\nimport {AbstractStatistic} from \"@/ig-template/features/statistics/AbstractStatistic\";\nimport {StatisticsSaveData} from \"@/ig-template/features/statistics/StatisticsSaveData\";\nimport {Features} from \"@/ig-template/Features\";\nimport {Currency} from \"@/ig-template/features/wallet/Currency\";\nimport {CurrencyType} from \"@/ig-template/features/wallet/CurrencyType\";\nimport {ArrayStatistic} from \"@/ig-template/features/statistics/ArrayStatistic\";\n\nexport class Statistics extends Feature {\n\n list: Record\n\n public totalMoneyGained: NumberStatistic;\n\n constructor() {\n super('statistics');\n this.list = {} as Record;\n\n // You can register statistics as attributes for easy access, but you don't have to.\n this.totalMoneyGained = this.registerStatistic(new NumberStatistic(StatisticId.TotalMoneyGained, 'Total money'));\n }\n\n initialize(features: Features): void {\n features.wallet.onCurrencyGain.subscribe((currency: Currency) => {\n if (currency.type === CurrencyType.Diamond) {\n this.incrementNumberStatistic(StatisticId.TotalMoneyGained, currency.amount);\n }\n });\n }\n\n incrementNumberStatistic(id: StatisticId, amount = 1): void {\n if (!this.hasStatistic(id)) {\n console.warn(`Could not find statistic with id ${id}`)\n return;\n }\n const statistic = this.list[id];\n if (!(statistic instanceof NumberStatistic)) {\n console.warn(`Trying to treat ${id} as NumberStatistic but it's not.`);\n return;\n }\n statistic.value += amount;\n }\n\n incrementArrayStatistic(id: StatisticId, index: number, amount = 1): void {\n if (!this.hasStatistic(id)) {\n console.warn(`Could not find statistic with id ${id}`)\n return;\n }\n const statistic = this.list[id];\n if (!(statistic instanceof ArrayStatistic)) {\n console.warn(`Trying to treat ${id} as ArrayStatistic but it's not.`);\n return;\n }\n const newValue = statistic.value[index] + amount;\n statistic.value.splice(index, 1, newValue);\n }\n\n public getStatistic(id: StatisticId): AbstractStatistic | null {\n if (!this.hasStatistic(id)) {\n console.warn(`Could not find statistic with id ${id}`)\n return null;\n } else {\n return this.list[id];\n }\n }\n\n private hasStatistic(id: StatisticId): boolean {\n return id in this.list\n }\n\n public registerStatistic(statistic: T): T {\n this.list[statistic.id] = statistic;\n return statistic;\n }\n\n load(data: StatisticsSaveData): void {\n for (const id in data.list) {\n if (Object.prototype.hasOwnProperty.call(data.list, id)) {\n if (this.hasStatistic(id as StatisticId)) {\n this.list[id as StatisticId].value = data.list[id as StatisticId];\n } else {\n console.warn(`Could not load statistic ${id}`)\n }\n }\n }\n }\n\n\n save(): StatisticsSaveData {\n const data = new StatisticsSaveData();\n for (const id in this.list) {\n data.addStatistic(id as StatisticId, this.list[id as StatisticId].value);\n }\n return data;\n }\n\n}\n","import {AchievementId} from \"@/ig-template/features/achievements/AchievementId\";\nimport {Requirement} from \"@/ig-template/tools/requirements/Requirement\";\nimport {Progress} from \"@/ig-template/tools/requirements/Progress\";\n\nexport class Achievement {\n public key: AchievementId;\n public title: string;\n public description: string;\n public image: string;\n public requirement: Requirement;\n public isHidden: boolean;\n public unlocked: boolean\n\n constructor(key: AchievementId, title: string, description: string, requirement: Requirement, image: string = '', isHidden = false) {\n this.key = key;\n this.title = title;\n this.description = description;\n this.image = image;\n this.requirement = requirement;\n this.isHidden = isHidden;\n this.unlocked = false;\n }\n\n /**\n * Unlock this achievement if possible.\n * Returns true if the achievement was just unlocked!\n */\n unlock(): boolean {\n if (!this.unlocked) {\n this.unlocked = true;\n return true;\n }\n return false;\n }\n\n requirementsCompleted(): boolean {\n return this.requirement.isCompleted;\n }\n\n getProgress(): Progress {\n return this.requirement.progress;\n }\n\n\n}\n","import {SaveData} from \"@/ig-template/tools/saving/SaveData\";\nimport {AchievementId} from \"@/ig-template/features/achievements/AchievementId\";\n\n/**\n * Unlocked achievements are saved as a list of keys\n */\nexport class AchievementsSaveData implements SaveData {\n list: AchievementId[];\n\n constructor() {\n this.list = [];\n }\n\n addAchievement(key: AchievementId): void {\n this.list.push(key);\n }\n\n}","export enum RedeemableCodeId {\n exampleCode = \"example-code\"\n}\n","import {Requirement} from \"@/ig-template/tools/requirements/Requirement\";\n\n/**\n * A requirement that can be manually set to be completed\n */\nexport class ManualRequirement extends Requirement {\n isSet: boolean\n\n constructor() {\n super();\n this.isSet = false;\n }\n\n forceCompletion(): void {\n this.isSet = true;\n }\n\n get isCompleted(): boolean {\n return this.isSet;\n }\n\n get actualValue(): number {\n return this.isSet ? this.targetValue : 0;\n }\n\n get hint(): string {\n return \"Can only be manually completed\";\n }\n\n get targetValue(): number {\n return 1;\n }\n}\n","import {Achievement} from \"@/ig-template/features/achievements/Achievement\";\nimport {AchievementId} from \"@/ig-template/features/achievements/AchievementId\";\nimport {ManualRequirement} from \"@/ig-template/tools/requirements/ManualRequirement\";\n\nexport class CustomAchievement extends Achievement {\n\n constructor(key: AchievementId, title: string, description: string, image: string = '', isHidden: boolean = false) {\n super(key, title, description, new ManualRequirement(), image, isHidden);\n }\n\n forceComplete() {\n (this.requirement as ManualRequirement).forceCompletion();\n }\n}","import {Requirement} from \"@/ig-template/tools/requirements/Requirement\";\nimport {NumberStatistic} from \"@/ig-template/features/statistics/NumberStatistic\";\n\nexport class NumberStatisticRequirement extends Requirement {\n statistic: NumberStatistic;\n targetValue: number;\n\n\n constructor(statistic: NumberStatistic, targetValue: number) {\n super();\n this.statistic = statistic;\n this.targetValue = targetValue;\n }\n\n get actualValue(): number {\n return this.statistic.value;\n }\n\n get hint(): string {\n return `The statistic ${this.statistic.description} needs to be at least ${this.targetValue}`;\n }\n}","import {Achievement} from \"@/ig-template/features/achievements/Achievement\";\nimport {AchievementId} from \"@/ig-template/features/achievements/AchievementId\";\nimport {Feature} from \"@/ig-template/features/Feature\";\nimport {AchievementsSaveData} from \"@/ig-template/features/achievements/AchievementSaveData\";\nimport {Features} from \"@/ig-template/Features\";\nimport {ISimpleEvent, SimpleEventDispatcher} from \"strongly-typed-events\";\nimport {CustomAchievement} from \"@/ig-template/features/achievements/CustomAchievement\";\nimport {NumberStatisticRequirement} from \"@/ig-template/features/statistics/requirements/NumberStatisticRequirement\";\n\nexport class Achievements extends Feature {\n list: Record\n\n // Delay between checking for achievements\n private readonly ACHIEVEMENT_CHECK_TIME: number = 2.0;\n private _checkCounter: number = 0;\n\n private _onUnlock = new SimpleEventDispatcher();\n\n /**\n * Emitted whenever an achievement is unlocked.\n */\n public get onUnlock(): ISimpleEvent {\n return this._onUnlock.asEvent();\n }\n\n constructor() {\n super('achievements');\n this.list = {} as Record;\n }\n\n initialize(features: Features): void {\n // You can base achievements on statistics\n this.registerAchievement(\n new Achievement(\n AchievementId.TotalMoney100, \"Gain 100 total money\", 'Automatically triggered if you gain enough money',\n new NumberStatisticRequirement(features.statistics.totalMoneyGained, 100),\n 'logo.png',\n )\n );\n\n // Or have manual ones. You'll have to trigger them with `achievement.forceUnlock()`\n this.registerAchievement(\n new CustomAchievement(AchievementId.ExampleAchievement, \"Custom Achievement\", 'Can be completed manually', 'logo.png', true)\n );\n\n }\n\n\n update(delta: number) {\n this._checkCounter += delta;\n if (this._checkCounter >= this.ACHIEVEMENT_CHECK_TIME) {\n this.checkForAchievementsCompleted();\n this._checkCounter = 0;\n }\n }\n\n public checkForAchievementsCompleted() {\n for (const key in this.list) {\n const achievement = this.list[key as AchievementId];\n if (achievement.requirementsCompleted()) {\n const isJustUnlocked = achievement.unlock();\n if (isJustUnlocked) {\n this._onUnlock.dispatch(achievement);\n }\n }\n }\n }\n\n public registerAchievement(achievement: T): T {\n this.list[achievement.key] = achievement;\n return achievement;\n }\n\n public getAchievement(key: AchievementId): Achievement | null {\n if (!this.hasAchievement(key)) {\n console.warn(`Could not find achievement with key ${key}`)\n\n return null;\n } else {\n return this.list[key];\n }\n }\n\n private hasAchievement(key: AchievementId): boolean {\n return key in this.list\n }\n\n\n load(data: AchievementsSaveData): void {\n for (const key of data.list) {\n const achievement = this.getAchievement(key);\n if (achievement !== null) {\n achievement.unlocked = true\n }\n }\n }\n\n\n save(): AchievementsSaveData {\n const data = new AchievementsSaveData();\n for (const key in this.list) {\n if (this.list[key as AchievementId].unlocked) {\n data.addAchievement(key as AchievementId);\n }\n }\n return data;\n }\n\n}","import {RedeemableCodeId} from \"@/ig-template/features/codes/RedeemableCodeId\";\n\nexport default class RedeemableCode {\n id: RedeemableCodeId;\n description: string;\n hash: number;\n isRedeemed: boolean;\n\n // Repeatable\n isRepeatable: boolean;\n private readonly rewardFunction: Function;\n\n constructor(id: RedeemableCodeId, description: string, hash: number, rewardFunction: Function, isRepeatable: boolean = false) {\n this.id = id;\n this.description = description;\n this.hash = hash;\n this.rewardFunction = rewardFunction;\n this.isRedeemed = false;\n this.isRepeatable = isRepeatable;\n }\n\n /**\n * Returns true if the code was successfully redeemed, false otherwise.\n */\n redeem(): boolean {\n if (this.isRedeemed) {\n return false;\n }\n\n if (!this.isRepeatable) {\n this.isRedeemed = true;\n }\n this.rewardFunction();\n return true;\n }\n}\n","import {SaveData} from \"@/ig-template/tools/saving/SaveData\";\nimport {RedeemableCodeId} from \"@/ig-template/features/codes/RedeemableCodeId\";\n\n/**\n * Redeemed codes are saved as a list of keys\n */\nexport class RedeemableCodesSaveData implements SaveData {\n list: RedeemableCodeId[];\n\n constructor(list: RedeemableCodeId[]) {\n this.list = list;\n }\n}\n","export enum UpgradeId {\n MoneyAdditive = 'money-additive',\n ActionRefreshDuration = 'action-refresh-duration',\n MaxActions = 'max-actions',\n NegativeRate = 'negative-rate',\n BetterGems = 'better-gems',\n HighlightNegative = 'highlight-negative',\n MoneyMultiplicative = 'money-multiplicative',\n SingleLevel = 'single-level',\n Locks = 'locks',\n SpeedBoost = 'speed-boost',\n CompleteTheGame = 'complete-the-game',\n}\n","/**\n * UpgradeTypes can be used to group multiplicative bonuses together\n */\nexport enum UpgradeType {\n None,\n Money,\n}","import {CurrencyType} from \"./CurrencyType\";\n\n/**\n * A class to store currency amounts\n */\nexport class Currency {\n amount: number;\n type: CurrencyType;\n\n constructor(amount: number, type: CurrencyType) {\n this.amount = amount;\n this.type = type;\n }\n\n /**\n * Whether or not this currency is valid. Your game can have different rules\n */\n public isValid(): boolean {\n if (isNaN(this.amount)) {\n return false;\n }\n return this.amount > 0;\n }\n\n public toString(): string {\n return `Currency(${this.amount}, ${this.type})`;\n }\n\n // Math methods as TS does not support operator overloading\n public add(amount: number) {\n this.amount += amount;\n }\n\n public subtract(amount: number) {\n this.amount -= amount;\n }\n\n public multiply(amount: number) {\n this.amount *= amount;\n }\n\n public divide(amount: number) {\n if (amount === 0) {\n console.error(`Cannot divide ${this} by 0`);\n return;\n }\n this.amount /= amount;\n }\n}\n","import RedeemableCode from \"@/ig-template/features/codes/RedeemableCode\";\nimport {Feature} from \"@/ig-template/features/Feature\";\nimport {RedeemableCodeId} from \"@/ig-template/features/codes/RedeemableCodeId\";\nimport {RedeemableCodesSaveData} from \"@/ig-template/features/codes/RedeemableCodesSaveData\";\nimport {Features} from \"@/ig-template/Features\";\nimport {CurrencyType} from \"@/ig-template/features/wallet/CurrencyType\";\nimport {Currency} from \"@/ig-template/features/wallet/Currency\";\n\nexport class RedeemableCodes extends Feature {\n\n list: RedeemableCode[];\n\n constructor() {\n super('redeemable-codes')\n this.list = [];\n }\n\n\n initialize(features: Features) {\n this.list.push(\n new RedeemableCode(RedeemableCodeId.exampleCode, 'Example code that gives 100 money, the key is \"DUMMY\"', 65408136, () => {\n features.wallet.gainCurrency(new Currency(100, CurrencyType.Diamond));\n })\n );\n }\n\n /**\n * Returns the code if it was successfully redeemed, false if it was already redeemed, undefined otherwise.\n */\n enterCode(codeString: string): boolean | RedeemableCode | undefined {\n const hash = this.hash(codeString);\n\n const redeemableCode = this.list.find(c => {\n return c.hash === hash;\n });\n\n if (!redeemableCode) {\n return undefined;\n }\n if (redeemableCode.isRedeemed) {\n return false;\n }\n\n redeemableCode.redeem();\n return redeemableCode;\n }\n\n /**\n * Insecure hash, but should keep some of the nosy people out.\n * @param text\n */\n hash(text: string): number {\n let hash = 0, i, chr;\n if (text.length === 0) {\n return hash;\n }\n\n for (i = 0; i < text.length; i++) {\n chr = text.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n }\n\n\n load(data: RedeemableCodesSaveData): void {\n if (!data?.list) {\n return;\n }\n\n data.list.forEach(id => {\n const foundCode = this.list.find(code => {\n return code.id === id;\n });\n\n if (foundCode) {\n foundCode.isRedeemed = true;\n }\n });\n }\n\n save(): RedeemableCodesSaveData {\n const list = this.list.filter(code => {\n return code.isRedeemed;\n }).map(code => {\n return code.id;\n })\n return new RedeemableCodesSaveData(list)\n }\n\n}\n","import {AbstractUpgrade} from \"@/ig-template/tools/upgrades/AbstractUpgrade\";\nimport {Wallet} from \"@/ig-template/features/wallet/Wallet\";\nimport {UpgradeId} from \"@/ig-template/tools/upgrades/UpgradeId\";\nimport {Feature} from \"@/ig-template/features/Feature\";\nimport {Features} from \"@/ig-template/Features\";\nimport {UpgradesFeatureSaveData} from \"@/ig-template/tools/saving/UpgradesFeatureSaveData\";\n\n/**\n * An abstract class for all features that need to buy Upgrades\n */\nexport abstract class UpgradesFeature extends Feature {\n\n _wallet: Wallet = null as unknown as Wallet;\n upgrades: AbstractUpgrade[];\n\n protected constructor(saveKey: string, upgrades: AbstractUpgrade[] = []) {\n super(saveKey);\n this.upgrades = upgrades;\n }\n\n /**\n * When overriding, make sure to call super.initialize() or you won't have access to the _wallet\n */\n initialize(features: Features) {\n this._wallet = features.wallet;\n }\n\n getUpgrade(id: UpgradeId): AbstractUpgrade | undefined {\n return this.upgrades.find(upgrade => {\n return upgrade.id === id;\n });\n }\n\n buyUpgrade(upgrade: AbstractUpgrade): boolean {\n if (!this._wallet) {\n console.warn(\"Wallet not found, are you sure it is initialized?\")\n return false;\n }\n if (!upgrade.canBuy(this._wallet)) {\n return false;\n }\n return upgrade.buy(this._wallet);\n }\n\n canAfford(upgrade: AbstractUpgrade): boolean {\n return upgrade.canAfford(this._wallet);\n }\n\n /**\n * IMPORTANT: Make sure to call super().load(data) when overriding to also load upgrades.\n */\n load(data: UpgradesFeatureSaveData) {\n data.upgrades?.forEach(upgradeSaveData => {\n this.getUpgrade(upgradeSaveData.id as UpgradeId)?.load(upgradeSaveData);\n });\n }\n\n /**\n * IMPORTANT: Make sure to call super().save() when overriding to also save upgrades.\n */\n save(): UpgradesFeatureSaveData {\n return {\n upgrades: this.upgrades.map(upgrade => {\n return upgrade.save();\n })\n }\n }\n}\n","import {Progress} from \"@/ig-template/tools/requirements/Progress\";\n\n/**\n * Abstract class to calculate basic level behaviour.\n * The level isn't stored, only the experience.\n */\nexport abstract class AbstractExpLevel {\n exp: number;\n maxLevel: number;\n\n protected constructor(maxLevel: number, baseExp: number) {\n this.exp = baseExp;\n this.maxLevel = maxLevel\n }\n\n gainExperience(amount: number): void {\n this.exp += amount;\n this.exp = Math.max(0, this.exp);\n }\n\n getLevel(): number {\n for (let i = 1; i <= this.maxLevel; i++) {\n if (this.exp < this.getExpNeededForLevel(i)) {\n return i - 1;\n }\n }\n return this.maxLevel;\n }\n\n getLevelProgress(): Progress {\n const level = this.getLevel();\n const expForNextLevel = this.getExpForNextLevel(level);\n const alreadyGainedExp = this.exp - this.getExpNeededForLevel(level);\n return new Progress(alreadyGainedExp, expForNextLevel);\n }\n\n getExpForNextLevel(level: number): number {\n return this.getExpNeededForLevel(level + 1) - this.getExpNeededForLevel(level);\n }\n\n abstract getExpNeededForLevel(level: number): number;\n\n}\n","import {AbstractExpLevel} from \"@/ig-template/tools/exp-level/AbstractExpLevel\";\n\n/**\n * Implementation of AbstractExpLevel that takes a function to calculate exp needed for each level.\n */\nexport class ContinuousExpLevel extends AbstractExpLevel {\n levelFunc: (arg1: number) => number;\n\n constructor(maxLevel: number, levelFunc: (arg1: number) => number, baseExp: number = 0) {\n super(maxLevel, baseExp);\n this.levelFunc = levelFunc;\n }\n\n getExpNeededForLevel(level: number): number {\n if (level > this.maxLevel) {\n return Infinity\n }\n return this.levelFunc(level);\n }\n\n}","import {ISimpleEvent, SimpleEventDispatcher} from \"strongly-typed-events\";\nimport {Progress} from \"@/ig-template/tools/requirements/Progress\";\nimport {Requirement} from \"@/ig-template/tools/requirements/Requirement\";\nimport {NoRequirement} from \"@/ig-template/tools/requirements/NoRequirement\";\n\nexport abstract class AbstractAction {\n description: string;\n duration: number;\n repeat: number; // 0, x, Infinity (until error)\n\n isStarted: boolean = false;\n currentProgress: number = 0;\n\n requirement: Requirement;\n\n // One iteration done\n private _onCompletion = new SimpleEventDispatcher();\n\n protected constructor(description: string, duration: number, repeat: number = Infinity, requirement: Requirement = new NoRequirement()) {\n this.description = description;\n this.duration = duration;\n this.repeat = repeat;\n this.requirement = requirement\n }\n\n perform(delta: number): void {\n if (!this.isStarted) {\n return;\n }\n\n this.currentProgress += delta;\n\n if (this.canBeCompleted()) {\n this.complete();\n }\n }\n\n canBeCompleted() {\n return this.isStarted && this.currentProgress >= this.duration;\n }\n\n complete(): void {\n this._onCompletion.dispatch(this);\n const canRepeat: boolean = this.gainReward();\n if (canRepeat && this.repeat > 0) {\n this.repeatAction();\n } else {\n this.stop();\n }\n }\n\n getProgress(): Progress {\n return new Progress(this.currentProgress, this.duration);\n }\n\n repeatAction() {\n this.repeat--;\n this.currentProgress = 0;\n }\n\n /**\n * Override if more permissions exist.\n */\n canPerform(): boolean {\n return this.requirement.isCompleted;\n }\n\n toggle() {\n if (this.isStarted) {\n this.stop();\n } else {\n this.start();\n }\n }\n\n start(): boolean {\n if (!this.canPerform()) {\n console.log(`Can't start action ${this.description}`)\n return false;\n }\n this.isStarted = true;\n return true;\n }\n\n stop() {\n this.currentProgress = 0;\n this.isStarted = false;\n }\n\n /**\n * Implement with whatever the reward should be for your action.\n * Return false if something is blocking a repeat (full inventory, etc)\n */\n abstract gainReward(): boolean;\n\n public get onCompletion(): ISimpleEvent {\n return this._onCompletion.asEvent();\n }\n}\n","import {AbstractAction} from \"@/ig-template/tools/actions/AbstractAction\";\nimport {NoRequirement} from \"@/ig-template/tools/requirements/NoRequirement\";\n\nexport abstract class JewelAction extends AbstractAction {\n isLocked: boolean = false;\n isNegative: boolean;\n\n protected constructor(description: string, duration: number, isNegative: boolean) {\n super(description, duration, Infinity, new NoRequirement());\n this.isNegative = isNegative;\n }\n}\n","import {JewelAction} from \"@/ig-template/features/action-generator/actions/JewelAction\";\nimport {AbstractExpLevel} from \"@/ig-template/tools/exp-level/AbstractExpLevel\";\n\nexport class GainExpAction extends JewelAction {\n _expLevel: AbstractExpLevel\n amount: number;\n\n\n constructor(duration: number, expLevel: AbstractExpLevel, amount: number) {\n super(`${amount < 0 ? 'Lose' : 'Gain'} ${amount} EXP`, duration, amount < 0);\n this._expLevel = expLevel;\n this.amount = amount;\n }\n\n gainReward(): boolean {\n this._expLevel.gainExperience(this.amount);\n return true;\n }\n\n}\n","export class Random {\n /**\n * Return a random integer between min (inclusive) and max (exclusive)\n * @param min inclusive\n * @param max exclusive\n */\n static intBetween(min: number, max: number): number {\n return Math.floor(Math.random() * (max - min) + min);\n }\n\n /**\n * Use ratio 0.10 to fuzz the number 80 between 72 and 88.\n */\n static fuzzInt(number: number, ratio: number): number {\n return this.intBetween((1-ratio) * number, (1 + ratio) * number);\n }\n\n\n /**\n * Return a boolean with probability [0, 1] to be true.\n * Returns false if the probability is not in this range. Can be ignored with the second argument requireNormalizedProbability.\n */\n static booleanWithProbability(probability: number, requireNormalizedProbability: boolean = true): boolean {\n if (requireNormalizedProbability && (probability < 0 || probability > 1)) {\n console.warn(`Trying to generate a boolean with probability ${probability} outside of [0,1].\n Run this method with requireNormalizedProbability=false if you're okay with this.`);\n return false;\n }\n return Math.random() < probability;\n }\n\n /**\n * Return a boolean with a 1 in chance to be true.\n * booleanWithChance(300) for action-generator\n * @param chance\n */\n static booleanWithOneInChance(chance: number): boolean {\n return this.intBetween(0, chance) == 0;\n }\n\n /**\n * Return a random float between min (inclusive) and max (exclusive)\n * @param min inclusive\n * @param max exclusive\n */\n static floatBetween(min: number, max: number): number {\n return Math.random() * (max - min) + min;\n }\n\n /**\n * Return a random index from the array\n */\n static arrayIndex(array: T[]): number {\n return this.intBetween(0, array.length);\n }\n\n /**\n * Get a random entry from the array\n */\n static fromArray(array: T[]): T {\n return array[this.arrayIndex(array)];\n }\n\n /**\n * Shuffle an array using fisher-yates\n * @param array\n */\n static shuffle(array: T[]): T[] {\n let currentIndex = array.length, temporaryValue, randomIndex;\n\n // While there remain elements to shuffle...\n while (0 !== currentIndex) {\n // Pick a remaining element...\n randomIndex = Math.floor(Math.random() * currentIndex);\n currentIndex -= 1;\n\n // And swap it with the current element.\n temporaryValue = array[currentIndex];\n array[currentIndex] = array[randomIndex];\n array[randomIndex] = temporaryValue;\n }\n\n return array;\n }\n}\n","import {JewelAction} from \"@/ig-template/features/action-generator/actions/JewelAction\";\nimport {Currency} from \"@/ig-template/features/wallet/Currency\";\nimport {Wallet} from \"@/ig-template/features/wallet/Wallet\";\nimport {Random} from \"@/ig-template/tools/probability/Random\";\n\nexport class GainCurrencyAction extends JewelAction {\n _wallet: Wallet;\n currency: Currency;\n\n\n constructor(duration: number, currency: Currency, wallet: Wallet) {\n super(`${currency.amount < 0 ? 'Lose' : 'Gain'} ${currency.amount} ${currency.type}`, Random.fuzzInt(duration, 0.2), currency.amount < 0);\n this.currency = currency;\n this._wallet = wallet;\n }\n\n gainReward(): boolean {\n if (this.isNegative) {\n this.currency.amount = Math.abs(this.currency.amount);\n this._wallet.loseCurrency(this.currency);\n } else {\n this._wallet.gainCurrency(this.currency);\n }\n return true;\n }\n\n}\n","/**\n * Generic upgrade class\n */\nimport {Saveable} from \"@/ig-template/tools/saving/Saveable\";\nimport {UpgradeType} from \"@/ig-template/tools/upgrades/UpgradeType\";\nimport {UpgradeId} from \"@/ig-template/tools/upgrades/UpgradeId\";\nimport {Currency} from \"@/ig-template/features/wallet/Currency\";\nimport {UpgradeSaveData} from \"@/ig-template/tools/upgrades/UpgradeSaveData\";\nimport {Wallet} from \"@/ig-template/features/wallet/Wallet\";\n\nexport abstract class AbstractUpgrade implements Saveable {\n id: UpgradeId;\n type: UpgradeType;\n displayName: string;\n maxLevel: number;\n level: number;\n\n protected constructor(id: UpgradeId, type: UpgradeType, displayName: string, maxLevel: number) {\n this.id = id;\n this.type = type;\n this.displayName = displayName;\n this.maxLevel = maxLevel;\n this.level = 0;\n }\n\n abstract getCost(): Currency;\n\n getBonus(): number {\n return this.getBonusForLevel(this.level);\n }\n\n abstract getBonusForLevel(level: number): number;\n\n getUpgradeBonus(): number {\n if (!this.isMaxLevel()) {\n return this.getBonusForLevel(this.level + 1) - this.getBonusForLevel(this.level);\n }\n return 0;\n }\n\n isMaxLevel(): boolean {\n return this.level >= this.maxLevel;\n }\n\n canAfford(wallet: Wallet): boolean {\n return wallet.hasCurrency(this.getCost());\n }\n\n // Override in subclass when other requirements exist.\n canBuy(wallet: Wallet): boolean {\n return this.level < this.maxLevel && this.canAfford(wallet);\n }\n\n buy(wallet: Wallet): boolean {\n if (!this.canBuy(wallet)) {\n return false;\n }\n\n wallet.loseCurrency(this.getCost());\n this.levelUp();\n return true;\n }\n\n levelUp(): void {\n this.level = this.level + 1;\n }\n\n\n // Save logic\n saveKey: string = this.id;\n\n load(data: UpgradeSaveData): void {\n this.level = data.level;\n }\n\n save(): UpgradeSaveData {\n return {\n 'id': this.id,\n 'level': this.level,\n }\n }\n\n}","import {Currency} from \"@/ig-template/features/wallet/Currency\";\nimport {AbstractUpgrade} from \"@/ig-template/tools/upgrades/AbstractUpgrade\";\nimport {UpgradeType} from \"@/ig-template/tools/upgrades/UpgradeType\";\nimport {UpgradeId} from \"@/ig-template/tools/upgrades/UpgradeId\";\nimport {CurrencyType} from \"@/ig-template/features/wallet/CurrencyType\";\n\nexport class DiscreteUpgrade extends AbstractUpgrade {\n\n costList: Currency[] = [];\n bonusList: number[] = []\n\n constructor(id: UpgradeId, type: UpgradeType, displayName: string, maxLevel: number, costList: Currency[], bonusList: number[], baseLevel: number = 1) {\n super(id, type, displayName, maxLevel);\n this.costList = costList;\n this.bonusList = bonusList;\n this.level = baseLevel;\n if (this.costList.length + 1 !== this.bonusList.length) {\n throw new Error(`BonusList must have a length 1 larger than CostList, got (${this.bonusList.length}) and (${this.costList.length}) respectively`)\n }\n }\n\n getCost(): Currency {\n if (this.isMaxLevel()) {\n return new Currency(Infinity, 'none' as CurrencyType);\n }\n return this.costList[this.level];\n }\n\n getBonusForLevel(level: number): number {\n return this.bonusList[level];\n }\n\n}\n","import {Currency} from \"./Currency\";\nimport {CurrencyType} from \"./CurrencyType\";\n\nexport abstract class CurrencyBuilder {\n\n static createArray(amounts: number[], type: CurrencyType): Currency[] {\n return amounts.map(amount => new Currency(amount, type));\n }\n}\n","export enum SpecialEventDateState {\n Before = 'before',\n During = 'during',\n After = 'after',\n}\n","export class ArrayBuilder {\n /**\n * Creates an array with 'count' numbers, starting at 'start', increasing by 'step' each entry.\n */\n static fromStartAndStepAdditive(start: number, step: number, count: number): number[] {\n const res = [];\n for (let i = 0; i < count; i++) {\n res.push(start + i * step);\n }\n return res;\n }\n}","import {DiscreteUpgrade} from \"@/ig-template/tools/upgrades/DiscreteUpgrade\";\nimport {UpgradeType} from \"@/ig-template/tools/upgrades/UpgradeType\";\nimport {UpgradeId} from \"@/ig-template/tools/upgrades/UpgradeId\";\nimport {Currency} from \"@/ig-template/features/wallet/Currency\";\n\n/**\n * An upgrade with a max level of 1\n */\nexport class SingleLevelUpgrade extends DiscreteUpgrade {\n\n constructor(id: UpgradeId, type: UpgradeType, displayName: string, cost: Currency, bonus: number) {\n super(id, type, displayName, 1, [cost], [0, bonus], 0);\n }\n\n isBought(): boolean {\n return this.isMaxLevel();\n }\n\n}\n","import {Outcome} from \"@/ig-template/tools/probability/Outcome\";\nimport {Random} from \"@/ig-template/tools/probability/Random\";\n\nexport class WeightedDistribution {\n outcomes: Outcome[];\n\n constructor(outcomes: Outcome[] = []) {\n this.outcomes = outcomes;\n }\n\n public outcomesWithMetRequirements(): Outcome[] {\n return this.outcomes.filter(o => o.canGet());\n }\n\n draw(): T {\n if (this.outcomesWithMetRequirements().length === 0) {\n throw new Error(\"Cannot draw from empty distribution\");\n }\n const totalWeight = this.getTotalWeight();\n const random = Random.floatBetween(0, totalWeight);\n\n let weight: number = 0;\n for (const outcome of this.outcomesWithMetRequirements()) {\n weight += outcome.weight;\n if (random <= weight) {\n return outcome.item;\n }\n }\n console.error(`Could not draw an item for random ${random}. This should never happen`);\n return Random.fromArray(this.outcomesWithMetRequirements()).item;\n }\n\n /**\n * Calculate the total weight of all outcomes\n */\n getTotalWeight(): number {\n let weight = 0;\n for (const outcome of this.outcomesWithMetRequirements()) {\n weight += outcome.weight;\n }\n return weight;\n }\n\n addOutcome(outcome: Outcome) {\n this.outcomes.push(outcome);\n }\n\n removeOutcome(outcome: Outcome) {\n const index = this.outcomes.indexOf(outcome);\n if (index !== -1) {\n this.outcomes.splice(index, 1);\n }\n }\n}","import {Requirement} from \"@/ig-template/tools/requirements/Requirement\";\nimport {NoRequirement} from \"@/ig-template/tools/requirements/NoRequirement\";\n\nexport class Outcome {\n public item: T;\n public weight: number;\n public requirement: Requirement\n\n constructor(item: T, weight: number, requirement: Requirement = new NoRequirement()) {\n this.item = item;\n this.weight = weight;\n this.requirement = requirement;\n }\n\n canGet(): boolean {\n return this.requirement.isCompleted;\n }\n}","import {UpgradesFeature} from \"@/ig-template/features/UpgradesFeature\";\nimport {ContinuousExpLevel} from \"@/ig-template/tools/exp-level/ContinuousExpLevel\";\nimport {Features} from \"@/ig-template/Features\";\nimport {ActionGeneratorSaveData} from \"@/ig-template/features/action-generator/ActionGeneratorSaveData\";\nimport {JewelAction} from \"@/ig-template/features/action-generator/actions/JewelAction\";\nimport {GainExpAction} from \"@/ig-template/features/action-generator/actions/GainExpAction\";\nimport {Random} from \"@/ig-template/tools/probability/Random\";\nimport {GainCurrencyAction} from \"@/ig-template/features/action-generator/actions/GainCurrencyAction\";\nimport {CurrencyType} from \"@/ig-template/features/wallet/CurrencyType\";\nimport {Currency} from \"@/ig-template/features/wallet/Currency\";\nimport {DiscreteUpgrade} from \"@/ig-template/tools/upgrades/DiscreteUpgrade\";\nimport {UpgradeId} from \"@/ig-template/tools/upgrades/UpgradeId\";\nimport {UpgradeType} from \"@/ig-template/tools/upgrades/UpgradeType\";\nimport {CurrencyBuilder} from \"@/ig-template/features/wallet/CurrencyBuilder\";\nimport {ArrayBuilder} from \"@/ig-template/util/ArrayBuilder\";\nimport {SingleLevelUpgrade} from \"@/ig-template/tools/upgrades/SingleLevelUpgrade\";\nimport {WeightedDistribution} from \"@/ig-template/tools/probability/WeightedDistribution\";\nimport {Outcome} from \"@/ig-template/tools/probability/Outcome\";\n\nexport class ActionGenerator extends UpgradesFeature {\n\n actions: JewelAction[] = [];\n playerLevel: ContinuousExpLevel;\n\n refreshDurationUpgrade: DiscreteUpgrade;\n maxActionsUpgrade: DiscreteUpgrade;\n negativeRateUpgrade: DiscreteUpgrade;\n betterGems: DiscreteUpgrade;\n speedBoostUpgrade: DiscreteUpgrade;\n locks: DiscreteUpgrade;\n highlightNegatives: SingleLevelUpgrade;\n completeTheGame: SingleLevelUpgrade;\n\n public checkCounter: number = 0;\n\n constructor() {\n super('action-generator-feature');\n\n this.playerLevel = new ContinuousExpLevel(100, (level) => {\n return 1 / 8 * (level ** 2 - level + 600 * (2 ** (level / 7) - 2 ** (1 / 7)) / (2 ** (1 / 7) - 1))\n })\n\n this.refreshDurationUpgrade = new DiscreteUpgrade(UpgradeId.ActionRefreshDuration, UpgradeType.None, \"Refresh Duration\", 10,\n CurrencyBuilder.createArray(ArrayBuilder.fromStartAndStepAdditive(0, 50, 10), CurrencyType.Sapphire),\n ArrayBuilder.fromStartAndStepAdditive(10, 5, 11), 1\n )\n\n this.maxActionsUpgrade = new DiscreteUpgrade(UpgradeId.MaxActions, UpgradeType.None, \"Max Actions\", 30,\n CurrencyBuilder.createArray(ArrayBuilder.fromStartAndStepAdditive(10, 40, 30), CurrencyType.Emerald),\n ArrayBuilder.fromStartAndStepAdditive(5, 1, 31), 1\n )\n\n this.negativeRateUpgrade = new DiscreteUpgrade(UpgradeId.NegativeRate, UpgradeType.None, \"Negative Chance\", 10,\n CurrencyBuilder.createArray(ArrayBuilder.fromStartAndStepAdditive(0, 50, 10), CurrencyType.Ruby),\n ArrayBuilder.fromStartAndStepAdditive(0.5, -0.05, 11), 1\n )\n\n this.speedBoostUpgrade = new DiscreteUpgrade(UpgradeId.SpeedBoost, UpgradeType.None, \"Speed boost\", 30,\n CurrencyBuilder.createArray(ArrayBuilder.fromStartAndStepAdditive(100, 100, 10), CurrencyType.Sapphire).concat(\n CurrencyBuilder.createArray(ArrayBuilder.fromStartAndStepAdditive(100, 100, 8), CurrencyType.Emerald).concat(\n CurrencyBuilder.createArray(ArrayBuilder.fromStartAndStepAdditive(50, 50, 8), CurrencyType.Ruby).concat(\n CurrencyBuilder.createArray(ArrayBuilder.fromStartAndStepAdditive(25, 25, 4), CurrencyType.Diamond).concat(\n )\n )\n )\n ),\n ArrayBuilder.fromStartAndStepAdditive(1, 0.1, 31), 0\n )\n\n this.locks = new DiscreteUpgrade(UpgradeId.Locks, UpgradeType.None, \"Lock Actions\", 5,\n CurrencyBuilder.createArray(ArrayBuilder.fromStartAndStepAdditive(-4, 5, 5), CurrencyType.Diamond),\n ArrayBuilder.fromStartAndStepAdditive(0, 1, 6), 1\n )\n\n\n this.betterGems = new DiscreteUpgrade(UpgradeId.BetterGems, UpgradeType.None, \"Better Gem Chance\", 30,\n CurrencyBuilder.createArray(ArrayBuilder.fromStartAndStepAdditive(100, 100, 12), CurrencyType.Sapphire).concat(\n CurrencyBuilder.createArray(ArrayBuilder.fromStartAndStepAdditive(100, 100, 7), CurrencyType.Emerald).concat(\n CurrencyBuilder.createArray(ArrayBuilder.fromStartAndStepAdditive(100, 100, 7), CurrencyType.Ruby).concat(\n CurrencyBuilder.createArray(ArrayBuilder.fromStartAndStepAdditive(20, 20, 4), CurrencyType.Diamond).concat(\n )\n )\n )\n ),\n ArrayBuilder.fromStartAndStepAdditive(0, 0.15, 31), 1\n )\n\n this.highlightNegatives = new SingleLevelUpgrade(UpgradeId.HighlightNegative, UpgradeType.None, \"Highlight Negatives\",\n new Currency(200, CurrencyType.Emerald), 1);\n\n this.completeTheGame = new SingleLevelUpgrade(UpgradeId.CompleteTheGame, UpgradeType.None, \"Complete the game\",\n new Currency(500, CurrencyType.Diamond), 1);\n\n this.upgrades = [\n this.refreshDurationUpgrade,\n this.maxActionsUpgrade,\n this.negativeRateUpgrade,\n this.betterGems,\n this.highlightNegatives,\n this.locks,\n this.speedBoostUpgrade,\n this.completeTheGame\n ]\n }\n\n\n start() {\n this.generateNewActions();\n }\n\n lock(index: number) {\n if (this.currentLock >= this.maxLock) {\n return;\n }\n this.actions[index].isLocked = !this.actions[index].isLocked;\n }\n\n unlock(index: number) {\n this.actions[index].isLocked = false;\n }\n\n get currentLock() {\n let total = 0;\n this.actions.forEach(action => {\n if (action.isLocked) {\n total++;\n }\n });\n return total;\n }\n\n get maxLock() {\n return this.locks.getBonus();\n }\n\n update(delta: number) {\n this.actions.forEach(action => {\n action.perform(delta);\n })\n\n this.checkCounter += delta;\n if (this.checkCounter >= this.switchTime) {\n this.generateNewActions();\n this.checkCounter = 0;\n }\n\n if (this.maxActionCount > this.actions.length) {\n this.actions.push(this.createCurrencyGain(this.playerLevel.getLevel(), this.negativeProb))\n }\n }\n\n get highlightNegativeActions(): boolean {\n return this.highlightNegatives.isBought()\n }\n\n get speedBoost() {\n return this.speedBoostUpgrade.getBonus();\n }\n\n get switchTime() {\n return this.refreshDurationUpgrade.getBonus();\n }\n\n get gemImprovement() {\n return this.betterGems.getBonus();\n }\n\n get negativeProb() {\n return this.negativeRateUpgrade.getBonus()\n }\n\n get maxActionCount() {\n return this.maxActionsUpgrade.getBonus();\n }\n\n initialize(features: Features) {\n this._wallet = features.wallet;\n }\n\n private generateNewActions() {\n const newActions = [];\n for (let i = 0; i < this.maxActionCount; i++) {\n const oldAction = this.actions[i];\n if (!oldAction) {\n newActions.push(this.getAction());\n continue;\n }\n if (oldAction.isLocked) {\n newActions.push(oldAction);\n continue;\n }\n\n const wasStarted = oldAction.isStarted;\n const newAction = this.getAction();\n newAction.isStarted = wasStarted\n newActions.push(newAction)\n }\n this.actions = newActions;\n }\n\n\n private getAction(): JewelAction {\n const level = this.playerLevel.getLevel();\n const negativeProb = this.negativeProb;\n const possibleActions = [];\n for (let i = 0; i < 13; i++) {\n possibleActions.push(this.createCurrencyGain(level, negativeProb))\n }\n for (let i = 0; i < 7; i++) {\n possibleActions.push(this.createExpGain(level, negativeProb))\n }\n possibleActions.forEach(action => {\n action.duration /= this.speedBoost;\n })\n return Random.fromArray(possibleActions);\n }\n\n createExpGain(level: number, negativeProb: number) {\n let benefit = Math.floor(3 + Math.pow(level + 2, 1.4));\n let duration = Math.max(12, Random.fuzzInt(Math.sqrt(benefit * 5), 0.3));\n const isNegative = Random.booleanWithProbability(negativeProb);\n if (isNegative) {\n benefit *= -4 / 5;\n duration /= 3;\n }\n return new GainExpAction(duration, this.playerLevel, Random.fuzzInt(benefit, 0.2))\n }\n\n createCurrencyGain(level: number, negativeProb: number): GainCurrencyAction {\n const isNegative = Random.booleanWithProbability(negativeProb);\n const distribution = new WeightedDistribution([\n new Outcome(this.createSapphire(level, isNegative), 8 - this.gemImprovement),\n new Outcome(this.createEmerald(level, isNegative), 5 - this.gemImprovement / 2),\n new Outcome(this.createRuby(level, isNegative), 2 + this.gemImprovement / 2),\n new Outcome(this.createDiamond(level, isNegative), -1 + this.gemImprovement),\n ])\n return distribution.draw();\n }\n\n createSapphire(level: number, isNegative: boolean) {\n if (isNegative) {\n level = Math.min(1, level - 5);\n }\n let benefit = Random.intBetween(10, 10 + 6 * level)\n if (isNegative) {\n benefit *= -1;\n }\n return new GainCurrencyAction(5, new Currency(benefit, CurrencyType.Sapphire), this._wallet)\n }\n\n createEmerald(level: number, isNegative: boolean) {\n if (isNegative) {\n level = Math.min(1, level - 3);\n }\n let benefit = Random.intBetween(6, 6 + 4 * level)\n if (isNegative) {\n benefit *= -1;\n }\n return new GainCurrencyAction(15, new Currency(benefit, CurrencyType.Emerald), this._wallet)\n }\n\n createRuby(level: number, isNegative: boolean) {\n if (isNegative) {\n level = Math.min(1, level - 2);\n }\n let benefit = Random.intBetween(3, 3 + 3 * level)\n if (isNegative) {\n benefit *= -1;\n }\n return new GainCurrencyAction(30, new Currency(benefit, CurrencyType.Ruby), this._wallet)\n }\n\n createDiamond(level: number, isNegative: boolean) {\n let benefit = isNegative ? -1 : 1 + Math.floor(level / 4);\n if (isNegative) {\n benefit *= -1;\n }\n return new GainCurrencyAction(120, new Currency(benefit, CurrencyType.Diamond), this._wallet)\n }\n\n save(): ActionGeneratorSaveData {\n return {\n exp: this.playerLevel.exp,\n ...super.save(),\n };\n }\n\n load(data: ActionGeneratorSaveData) {\n super.load(data);\n this.playerLevel.exp = data.exp ?? this.playerLevel.exp;\n }\n}\n","import {SpecialEventId} from \"@/ig-template/features/special-events/SpecialEventId\";\nimport {Requirement} from \"@/ig-template/tools/requirements/Requirement\";\nimport {NoRequirement} from \"@/ig-template/tools/requirements/NoRequirement\";\nimport {SpecialEventDateState} from \"@/ig-template/features/special-events/SpecialEventDateState\";\n\n/**\n * Abstract Special Event. Override if you need custom timing functions.\n */\nexport abstract class AbstractSpecialEvent {\n id: SpecialEventId;\n title: string;\n description: string;\n startFunction: () => void;\n endFunction: () => void;\n requirement: Requirement;\n isActive = false;\n\n protected constructor(id: SpecialEventId, title: string, description: string, startFunction: () => void, endFunction: () => void, requirement: Requirement = new NoRequirement()) {\n this.id = id;\n this.title = title;\n this.description = description;\n this.startFunction = startFunction;\n this.endFunction = endFunction;\n this.requirement = requirement;\n }\n\n canStart(date: Date): boolean {\n if (this.isActive) {\n return false;\n }\n if (!this.requirement.isCompleted) {\n return false;\n }\n return this.getDateState(date) === SpecialEventDateState.During;\n }\n\n public abstract getTimeUntilStart(date: Date): Date;\n\n public abstract getTimeUntilEnd(date: Date): Date;\n\n\n public abstract getDateState(date: Date): SpecialEventDateState;\n\n canEnd(date: Date) {\n if (!this.isActive) {\n return false;\n }\n return this.getDateState(date) === SpecialEventDateState.After;\n }\n\n\n start(): void {\n if (this.isActive) {\n console.warn(`Special Event ${this.title} already active`);\n return;\n }\n this.isActive = true;\n this.startFunction();\n }\n\n end(): void {\n if (!this.isActive) {\n console.warn(`Cannot end. Special Event ${this.title} is not active.`);\n return;\n }\n this.isActive = false;\n this.endFunction();\n }\n}\n","import {SpecialEventId} from \"@/ig-template/features/special-events/SpecialEventId\";\nimport {Requirement} from \"@/ig-template/tools/requirements/Requirement\";\nimport {NoRequirement} from \"@/ig-template/tools/requirements/NoRequirement\";\nimport {SpecialEventDateState} from \"@/ig-template/features/special-events/SpecialEventDateState\";\nimport {AbstractSpecialEvent} from \"@/ig-template/features/special-events/AbstractSpecialEvent\";\n\n/**\n * A special event with a set start and end date.\n */\nexport class SpecialEvent extends AbstractSpecialEvent {\n startTime: Date;\n endTime: Date;\n\n\n constructor(id: SpecialEventId, title: string, description: string, startTime: Date, endTime: Date, startFunction: () => void, endFunction: () => void, requirement: Requirement = new NoRequirement()) {\n super(id, title, description, startFunction, endFunction, requirement);\n this.startTime = startTime;\n this.endTime = endTime;\n }\n\n public getTimeUntilStart(date: Date) {\n return new Date(+this.startTime - +date);\n }\n\n public getTimeUntilEnd(date: Date) {\n return new Date(+this.endTime - +date);\n }\n\n public getDateState(date: Date) {\n if (date < this.startTime) {\n return SpecialEventDateState.Before;\n } else if (date > this.endTime) {\n return SpecialEventDateState.After;\n }\n return SpecialEventDateState.During;\n }\n}\n","export class DateHelper {\n public static readonly MILLI_SECONDS_PER_DAY = 24 * 60 * 60 * 1000;\n public static readonly MILLI_SECONDS_PER_HOUR = 60 * 60 * 1000;\n public static readonly MILLI_SECONDS_PER_MINUTE = 60 * 1000;\n\n static addMinutes(date: Date, minutes: number) {\n return new Date(date.getTime() + minutes * 60000);\n }\n\n static addSeconds(date: Date, seconds: number) {\n return new Date(date.getTime() + seconds * 1000);\n }\n\n static addWeeks(date: Date, weeks: number): Date {\n date.setDate(date.getDate() + weeks * 7);\n return date;\n }\n\n static toTimeLeftString(milliseconds: number) {\n if (milliseconds > this.MILLI_SECONDS_PER_DAY) {\n const days = milliseconds / this.MILLI_SECONDS_PER_DAY;\n return `${Math.ceil(days)} days`;\n }\n\n if (milliseconds > this.MILLI_SECONDS_PER_HOUR) {\n const hours = milliseconds / this.MILLI_SECONDS_PER_HOUR;\n return `${Math.ceil(hours)} hours`;\n }\n if (milliseconds > this.MILLI_SECONDS_PER_MINUTE) {\n const minutes = milliseconds / this.MILLI_SECONDS_PER_MINUTE;\n return `${Math.ceil(minutes)} minutes`;\n }\n\n\n return `${Math.ceil(milliseconds / 1000)} seconds`;\n }\n}\n","import {SpecialEventId} from \"@/ig-template/features/special-events/SpecialEventId\";\nimport {Requirement} from \"@/ig-template/tools/requirements/Requirement\";\nimport {NoRequirement} from \"@/ig-template/tools/requirements/NoRequirement\";\nimport {SpecialEvent} from \"@/ig-template/features/special-events/SpecialEvent\";\nimport {DateHelper} from \"@/ig-template/util/DateHelper\";\n\n/**\n * A special event that happens weekly.\n */\nexport class WeeklySpecialEvent extends SpecialEvent {\n\n constructor(id: SpecialEventId, title: string, description: string, startTime: Date, endTime: Date, startFunction: () => void, endFunction: () => void, requirement: Requirement = new NoRequirement()) {\n super(id, title, description, startTime, endTime, startFunction, endFunction, requirement);\n }\n\n\n end() {\n this.increaseWeek();\n super.end();\n }\n\n increaseWeek() {\n this.startTime = DateHelper.addWeeks(this.startTime, 1);\n this.endTime = DateHelper.addWeeks(this.endTime, 1);\n }\n}\n","/**\n * IMPORTANT: the string belonging to each ItemId has to match with the getter in the ItemList exactly!\n */\nexport enum ItemId {\n Empty = \"empty\",\n MoneyPouch = \"moneyPouch\",\n ItemWithData = \"itemWithData\",\n RawFish = \"rawFish\",\n CookedFish = \"cookedFish\",\n}\n","import {Feature} from \"@/ig-template/features/Feature\";\nimport {SaveData} from \"@/ig-template/tools/saving/SaveData\";\nimport {Features} from \"@/ig-template/Features\";\nimport {ISimpleEvent, SimpleEventDispatcher} from \"strongly-typed-events\";\nimport {WeeklySpecialEvent} from \"@/ig-template/features/special-events/WeeklySpecialEvent\";\nimport {AbstractSpecialEvent} from \"@/ig-template/features/special-events/AbstractSpecialEvent\";\n\nexport class SpecialEvents extends Feature {\n\n events: AbstractSpecialEvent[]\n\n // Delay between checking for special events\n private readonly SPECIAL_EVENT_CHECK_TIME: number = 1.0;\n private _checkCounter: number = 0;\n\n private _onEventStart = new SimpleEventDispatcher();\n\n private _onEventEnd = new SimpleEventDispatcher();\n\n\n constructor() {\n super('special-events');\n this.events = [];\n }\n\n initialize(features: Features) {\n // Schedule an event for a specific date and time.\n }\n\n /**\n * Adds an event, also upgrades weeklies if they're out of date.\n */\n addEvent(event: AbstractSpecialEvent) {\n if (event instanceof WeeklySpecialEvent) {\n const now = Date.now()\n while (+event.endTime < now) {\n event.increaseWeek();\n }\n }\n\n this.events.push(event);\n }\n\n\n update(delta: number) {\n this._checkCounter += delta;\n if (this._checkCounter >= this.SPECIAL_EVENT_CHECK_TIME) {\n this.checkForEvents();\n this._checkCounter = 0;\n }\n }\n\n private checkForEvents(): void {\n const now = new Date();\n for (const event of this.events) {\n if (event.canStart(now)) {\n this._onEventStart.dispatch(event);\n event.start();\n }\n if (event.canEnd(now)) {\n this._onEventEnd.dispatch(event);\n event.end();\n }\n }\n }\n\n\n load(): void {\n // Empty\n }\n\n save(): SaveData {\n return {};\n }\n\n /**\n * Emitted whenever an event starts\n */\n public get onEventStart(): ISimpleEvent {\n return this._onEventStart.asEvent();\n }\n\n /**\n * Emitted whenever an event end\n */\n public get onEventEnd(): ISimpleEvent {\n return this._onEventEnd.asEvent();\n }\n\n\n}\n","import {AbstractItem} from \"@/ig-template/features/items/AbstractItem\";\n\nexport class InventorySlot {\n item: AbstractItem;\n amount: number;\n\n constructor(item: AbstractItem, amount: number) {\n this.item = item;\n this.amount = amount;\n }\n\n isEmpty(): boolean {\n return this.amount === 0;\n }\n\n isFull(): boolean {\n return this.amount >= this.item.maxStack;\n }\n\n spaceLeft(): number {\n return this.item.maxStack - this.amount;\n }\n\n gainItems(amount: number) {\n this.amount += amount;\n if (this.amount > this.item.maxStack) {\n console.error(`Tried to have more than ${this.item.maxStack} of ${this.item.id} in one stack`);\n this.amount = this.item.maxStack;\n }\n }\n\n loseItems(amount: number) {\n this.amount -= amount;\n if (this.amount < 0) {\n console.error(`Tried to have less than 0 of ${this.item.id} in one stack`);\n this.amount = 0;\n }\n }\n}\n","export enum ItemType {\n Empty = \"empty\",\n Default = \"default\",\n Consumable = \"consumable\",\n}\n","import {ItemId} from \"./ItemId\";\nimport {ItemType} from \"./ItemType\";\nimport {Saveable} from \"@/ig-template/tools/saving/Saveable\";\nimport {SaveData} from \"@/ig-template/tools/saving/SaveData\";\n\nexport abstract class AbstractItem implements Saveable {\n name: string;\n id: ItemId;\n type: ItemType;\n description: string;\n maxStack: number\n\n protected constructor(name: string, description: string, id: ItemId, type: ItemType, maxStack: number = Infinity) {\n this.name = name;\n this.description = description;\n this.id = id;\n this.type = type;\n this.maxStack = maxStack;\n }\n\n // Save and load. Only needed if this item store additional data\n saveKey: string = this.id;\n\n load(data: object): void {\n // Empty\n }\n\n save(): SaveData {\n return {};\n }\n}\n","import {AbstractItem} from \"@/ig-template/features/items/AbstractItem\";\nimport {ItemId} from \"@/ig-template/features/items/ItemId\";\nimport {ItemType} from \"@/ig-template/features/items/ItemType\";\n\nexport abstract class AbstractConsumable extends AbstractItem {\n\n /**\n * What will be shown on the consume button\n */\n abstract consumeLabel: string;\n\n protected constructor(name: string, description: string, id: ItemId, type: ItemType, maxStack: number = Infinity) {\n super(name, description, id, type, maxStack);\n }\n\n /**\n * What to do when this item is consumed.\n */\n abstract consume(): void;\n\n /**\n * NOTE: your consumables can probably do something more clever here.\n * Make sure to override this method as needed.\n */\n consumeMultiple(amount: number): void {\n for (let i = 0; i < amount; i++) {\n this.consume()\n }\n }\n\n /**\n * Whether or not this item can be consumed.\n */\n abstract canConsume(): boolean;\n}\n","import {AbstractItem} from \"@/ig-template/features/items/AbstractItem\";\nimport {ItemId} from \"@/ig-template/features/items/ItemId\";\nimport {ItemType} from \"@/ig-template/features/items/ItemType\";\n\nexport class EmptyItem extends AbstractItem {\n\n constructor() {\n super('Empty', '', ItemId.Empty, ItemType.Empty, 0);\n }\n}\n","export enum KeyItemId {\n Item1 = 'item-1',\n Item2 = 'item-2',\n}\n","import {cloneDeep} from 'lodash-es';\n\nimport {InventorySlot} from \"@/ig-template/features/inventory/InventorySlot\";\nimport {ItemId} from \"@/ig-template/features/items/ItemId\";\nimport {Feature} from \"@/ig-template/features/Feature\";\nimport {ItemList} from \"@/ig-template/features/items/ItemList\";\nimport {Features} from \"@/ig-template/Features\";\nimport {AbstractConsumable} from \"@/ig-template/features/items/Consumable\";\nimport {AbstractItem} from \"@/ig-template/features/items/AbstractItem\";\nimport {EmptyItem} from \"@/ig-template/features/items/instances/EmptyItem\";\nimport {InventorySaveData} from \"@/ig-template/features/inventory/InventorySaveData\";\nimport {InventorySlotSaveData} from \"@/ig-template/features/inventory/InventorySlotSaveData\";\nimport {EventDispatcher} from \"strongly-typed-events\";\nimport {ItemAmount} from \"@/ig-template/features/items/ItemAmount\";\n\nexport class Inventory extends Feature {\n slotCount: number;\n slots: InventorySlot[];\n\n // Overridden in initialize;\n _itemList: ItemList = undefined as unknown as ItemList;\n\n private _onItemGain = new EventDispatcher();\n\n\n constructor(slots: number = 10) {\n super('inventory');\n this.slotCount = slots;\n this.slots = new Array(this.slotCount).fill(new InventorySlot(new EmptyItem(), 0));\n }\n\n\n initialize(features: Features) {\n super.initialize(features);\n this._itemList = features.itemList;\n }\n\n interactIndices(indexFrom: number, indexTo: number) {\n if (indexFrom === indexTo) {\n return;\n }\n\n const itemFrom = this.slots[indexFrom];\n\n if (itemFrom.isEmpty()) {\n console.warn(\"Cannot interact with empty item\");\n return;\n }\n const itemTo = this.slots[indexTo];\n\n if (itemFrom.item.id === itemTo.item.id) {\n this.mergeItems(itemFrom, itemTo);\n return;\n }\n\n this.swapItems(indexFrom, indexTo);\n return;\n }\n\n mergeItems(itemFrom: InventorySlot, itemTo: InventorySlot) {\n\n if (itemFrom.item.id !== itemTo.item.id) {\n throw new Error(`Cannot merge items of types ${itemFrom.item.id} and ${itemTo.item.id}`);\n }\n\n const amount = Math.min(itemFrom.amount, itemTo.spaceLeft());\n itemFrom.loseItems(amount);\n itemTo.gainItems(amount);\n }\n\n swapItems(indexFrom: number, indexTo: number) {\n const temp = this.slots[indexFrom];\n this.slots.splice(indexFrom, 1, this.slots[indexTo]);\n this.slots.splice(indexTo, 1, temp);\n\n }\n\n consumeItem(index: number, amount: number = 1): boolean {\n const inventoryItem = this.slots[index];\n const item = inventoryItem.item;\n\n\n if (!(item instanceof AbstractConsumable)) {\n console.warn(`Item ${item} is not a consumable`);\n return false;\n }\n if (inventoryItem.amount < amount) {\n console.warn(`Amount of ${inventoryItem} is not greater than ${amount}`);\n return false;\n }\n if (!item.canConsume()) {\n console.warn(\"Cannot consume item, check its restrictions for the reason\");\n return false;\n }\n\n if (amount === 1) {\n item.consume();\n } else {\n item.consumeMultiple(amount);\n }\n this.loseItemAtIndex(index, amount);\n return true;\n }\n\n /**\n * Remove items from this inventory, prefer an empty stack\n * Recursively calls itself if stacks are emptying\n * Returns the number of items that still need to be removed\n * @param id\n * @param amount\n */\n loseItemAmount(id: ItemId, amount: number = 1): number {\n // While we still need to remove and have items left\n while (amount > 0 && this.getTotalAmount(id) > 0) {\n const nonFullStackIndex = this.getIndexOfNonFullStack(id)\n const indexToUse = nonFullStackIndex !== -1 ? nonFullStackIndex : this.getIndexOfItem(id);\n if (indexToUse === -1) {\n throw Error(`Index of item ${id} to lose is -1. This suggests an error in inventory management`);\n }\n const amountToRemove = Math.min(amount, this.slots[indexToUse].amount);\n amount -= amountToRemove;\n this.loseItemAtIndex(indexToUse, amountToRemove);\n\n }\n\n return amount;\n }\n\n public gainItem(item: AbstractItem, amount: number = 1): number {\n const amountLeft = this._gainItem(item, amount);\n this._onItemGain.dispatch(item, amount);\n return amountLeft;\n }\n\n /**\n * Add items to this inventory, prefer an existing stack\n * Recursively calls itself if stacks are overflowing\n * Returns the number of items that need to be added\n */\n private _gainItem(item: AbstractItem, amount: number = 1): number {\n\n // Find stack and add to it or create a new one\n const nonFullStackIndex = this.getIndexOfNonFullStack(item.id);\n if (nonFullStackIndex === -1) {\n // Create a new stack\n const emptyIndex = this.getIndexOfFirstEmptySlot();\n if (emptyIndex === -1) {\n console.log(`Cannot add ${amount} of ${item.id}, no empty slots left`);\n return amount;\n }\n const amountToAdd = Math.min(amount, item.maxStack);\n this.slots.splice(emptyIndex, 1, new InventorySlot(item, amountToAdd));\n\n const amountLeft = amount - amountToAdd;\n if (amountLeft <= 0) {\n return 0;\n }\n return this._gainItem(item, amountLeft);\n } else {\n // Add to existing stack\n const amountToAdd = Math.min(amount, this.slots[nonFullStackIndex].spaceLeft());\n\n this.slots[nonFullStackIndex].gainItems(amountToAdd);\n const amountLeft = amount - amountToAdd;\n if (amountLeft <= 0) {\n return 0;\n }\n return this._gainItem(item, amountLeft);\n }\n }\n\n getSpotsLeftForItem(item: AbstractItem) {\n let total = 0;\n for (const inventoryItem of this.slots) {\n if (inventoryItem.isEmpty()) {\n total += item.maxStack;\n } else if (inventoryItem.item.id === item.id) {\n total += inventoryItem.spaceLeft();\n }\n }\n return total;\n }\n\n /**\n * This method very inefficiently clones the inventory, and simulates adding the items see if they can be taken.\n * It's also the only reason we're using lodash...\n * TODO do this in a smart way.\n */\n canTakeItemAmounts(itemAmounts: ItemAmount[]) {\n const clonedInventory = cloneDeep(this);\n for (const item of itemAmounts) {\n const amountLeft = clonedInventory.gainItem(this._itemList[item.id], item.amount);\n if (amountLeft !== 0) {\n return false;\n }\n }\n return true;\n }\n\n hasItemAmounts(amounts: ItemAmount[]) {\n for (const amount of amounts) {\n if (!this.hasItemAmount(amount)) {\n return false;\n }\n }\n return true;\n }\n\n hasItemAmount(amount: ItemAmount) {\n return this.getTotalAmount(amount.id) >= amount.amount;\n }\n\n canTakeItem(item: AbstractItem, amount: number) {\n return this.getSpotsLeftForItem(item) >= amount;\n }\n\n getIndexOfNonFullStack(id: ItemId) {\n for (let i = 0; i < this.slots.length; i++) {\n if (this.slots[i].item.id === id && !this.slots[i].isFull()) {\n return i;\n }\n }\n return -1;\n }\n\n getIndexOfItem(id: ItemId) {\n for (let i = 0; i < this.slots.length; i++) {\n if (this.slots[i].item.id === id) {\n return i;\n }\n }\n return -1;\n }\n\n getIndexOfFirstEmptySlot(): number {\n for (let i = 0; i < this.slots.length; i++) {\n if (this.slots[i].isEmpty()) {\n return i;\n }\n }\n return -1;\n }\n\n hasEmptySlot(): boolean {\n return this.getIndexOfFirstEmptySlot() !== -1;\n }\n\n hasNonFullStack(id: ItemId): boolean {\n return this.getIndexOfNonFullStack(id) !== -1;\n }\n\n\n loseItemAtIndex(index: number, amount: number = 1) {\n this.slots[index].loseItems(amount);\n if (this.slots[index].amount <= 0) {\n this.slots.splice(index, 1, new InventorySlot(new EmptyItem(), 0));\n }\n }\n\n dropStack(index: number) {\n this.loseItemAtIndex(index, this.slots[index].amount);\n }\n\n getEmptySlotCount(): number {\n let count = 0;\n for (const inventoryItem of this.slots) {\n if (inventoryItem.isEmpty()) {\n count++;\n }\n }\n return count;\n }\n\n\n getTotalAmount(id: ItemId): number {\n let total = 0;\n for (const inventoryItem of this.slots) {\n if (inventoryItem.item.id === id) {\n total += inventoryItem.amount;\n }\n }\n return total;\n }\n\n getAmount(index: number): number {\n return this.slots[index].amount;\n }\n\n\n isEmpty(): boolean {\n for (const item of this.slots) {\n if (item.amount != 0) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Emitted whenever this inventory gains items (even if it can't take them).\n */\n public get onItemGain() {\n return this._onItemGain.asEvent();\n }\n\n load(data: InventorySaveData): void {\n if (!data.slots) {\n return;\n }\n for (let i = 0; i < data.slots.length; i++) {\n const slotData: InventorySlotSaveData = data.slots[i];\n if (slotData.id === ItemId.Empty) {\n continue;\n }\n\n try {\n const item = this._itemList[slotData.id];\n item.load(slotData.data);\n this.slots[i] = new InventorySlot(item, slotData.amount);\n } catch (e) {\n console.error(`Could not load Item ${slotData.id}. Make sure it has a getter in ItemList`);\n }\n\n }\n }\n\n save(): InventorySaveData {\n const slots = this.slots.map(slot => {\n return {\n id: slot.item.id,\n amount: slot.amount,\n data: slot.item.save()\n };\n });\n return {\n slots: slots\n }\n }\n\n}\n","import {AbstractConsumable} from \"@/ig-template/features/items/Consumable\";\nimport {ItemId} from \"@/ig-template/features/items/ItemId\";\nimport {ItemType} from \"@/ig-template/features/items/ItemType\";\nimport {CurrencyType} from \"@/ig-template/features/wallet/CurrencyType\";\nimport {Currency} from \"@/ig-template/features/wallet/Currency\";\nimport {Wallet} from \"@/ig-template/features/wallet/Wallet\";\n\nexport class MoneyPouch extends AbstractConsumable {\n consumeLabel: string = \"Open\";\n _wallet: Wallet;\n\n moneyToGain: number = 10;\n\n constructor(wallet: Wallet) {\n super('Money Pouch', 'Open for some coins', ItemId.MoneyPouch, ItemType.Consumable);\n this._wallet = wallet;\n }\n\n canConsume(): boolean {\n return true;\n }\n\n consume(): void {\n this._wallet.gainCurrency(new Currency(this.moneyToGain, CurrencyType.Diamond));\n }\n\n consumeMultiple(amount: number) {\n this._wallet.gainCurrency(new Currency(this.moneyToGain * amount, CurrencyType.Diamond));\n }\n}\n","import {ItemId} from \"@/ig-template/features/items/ItemId\";\nimport {AbstractItem} from \"@/ig-template/features/items/AbstractItem\";\nimport {ItemType} from \"@/ig-template/features/items/ItemType\";\n\nexport class ItemWithData extends AbstractItem {\n customData: number;\n\n constructor(customData: number = 3) {\n super('Item with data', `This custom data is also saved`, ItemId.ItemWithData, ItemType.Default, 1);\n this.customData = customData;\n }\n\n save(): object {\n return {\n customData: this.customData\n }\n }\n\n load(data: any) {\n this.customData = data.customData ?? this.customData;\n this.description = `This custom data is also saved. It is now (${this.customData})`;\n }\n}\n","import {AbstractItem} from \"@/ig-template/features/items/AbstractItem\";\nimport {ItemId} from \"@/ig-template/features/items/ItemId\";\nimport {ItemType} from \"@/ig-template/features/items/ItemType\";\n\nexport class RawFish extends AbstractItem {\n constructor() {\n super('Raw Fish', 'Maybe you can cook it?', ItemId.RawFish, ItemType.Default);\n }\n}\n","import {ItemId} from \"@/ig-template/features/items/ItemId\";\nimport {ItemType} from \"@/ig-template/features/items/ItemType\";\nimport {AbstractConsumable} from \"@/ig-template/features/items/Consumable\";\n\nexport class CookedFish extends AbstractConsumable {\n constructor() {\n super('Cooked Fish', 'Delicious', ItemId.CookedFish, ItemType.Consumable);\n }\n\n consumeLabel: string = \"Eat\";\n\n canConsume(): boolean {\n return true;\n }\n\n consume(): void {\n // Empty\n }\n}\n","import {Feature} from \"@/ig-template/features/Feature\";\nimport {SaveData} from \"@/ig-template/tools/saving/SaveData\";\nimport {MoneyPouch} from \"@/ig-template/features/items/instances/MoneyPouch\";\nimport {Features} from \"@/ig-template/Features\";\nimport {ItemWithData} from \"@/ig-template/features/items/instances/ItemWithData\";\nimport {EmptyItem} from \"@/ig-template/features/items/instances/EmptyItem\";\nimport {RawFish} from \"@/ig-template/features/items/instances/RawFish\";\nimport {CookedFish} from \"@/ig-template/features/items/instances/CookedFish\";\n\nexport class ItemList extends Feature {\n\n _features = undefined as unknown as Features\n\n constructor() {\n super('item-list');\n }\n\n\n initialize(features: Features) {\n super.initialize(features);\n this._features = features;\n }\n\n get empty(): EmptyItem {\n return new EmptyItem();\n }\n\n get moneyPouch(): MoneyPouch {\n return new MoneyPouch(this._features.wallet)\n }\n\n get itemWithData(): ItemWithData {\n return new ItemWithData();\n }\n\n get rawFish(): RawFish {\n return new RawFish();\n }\n get cookedFish(): CookedFish {\n return new CookedFish();\n }\n\n load(): void {\n // Empty\n }\n\n save(): SaveData {\n return {}\n }\n}\n","import {KeyItemId} from \"@/ig-template/features/key-items/KeyItemId\";\nimport {NoRequirement} from \"@/ig-template/tools/requirements/NoRequirement\";\nimport {Requirement} from \"@/ig-template/tools/requirements/Requirement\";\n\nexport class KeyItem {\n id: KeyItemId;\n name: string;\n description: string;\n unlockHint: string;\n image: string\n isUnlocked: boolean = false;\n requirement: Requirement;\n\n constructor(id: KeyItemId, name: string, description: string, unlockHint: string = \"\", image: string = \"\", requirement: Requirement = new NoRequirement()) {\n this.id = id;\n this.name = name;\n this.description = description;\n this.unlockHint = unlockHint;\n this.image = image;\n this.requirement = requirement;\n }\n\n unlock(): boolean {\n if (this.requirement.isCompleted && !this.isUnlocked) {\n this.isUnlocked = true;\n return true;\n }\n return false;\n }\n}\n","import {Feature} from \"@/ig-template/features/Feature\";\nimport {ISimpleEvent, SimpleEventDispatcher} from \"strongly-typed-events\";\nimport {KeyItem} from \"@/ig-template/features/key-items/KeyItem\";\nimport {KeyItemId} from \"@/ig-template/features/key-items/KeyItemId\";\nimport {KeyItemSaveData} from \"@/ig-template/features/key-items/KeyItemSaveData\";\n\nexport class KeyItems extends Feature {\n list: Record\n\n private _onKeyItemGain = new SimpleEventDispatcher();\n\n constructor() {\n super('key-items');\n this.list = {} as Record;\n }\n\n\n initialize() {\n this.registerKeyItem(new KeyItem(KeyItemId.Item1, \"Item 1\", \"Grants access to something\", \"Maybe look over there?\", \"logo.png\"));\n this.registerKeyItem(new KeyItem(KeyItemId.Item2, \"Item 2\", \"Now you can do something\"));\n }\n\n public registerKeyItem(keyItem: T): T {\n this.list[keyItem.id] = keyItem;\n return keyItem;\n }\n\n hasKeyItem(id: KeyItemId): boolean {\n return this.getKeyItem(id)?.isUnlocked;\n }\n\n getKeyItem(id: KeyItemId): KeyItem {\n return this.list[id];\n }\n\n gainKeyItem(id: KeyItemId) {\n const item = this.getKeyItem(id);\n if (!item) {\n console.warn(`Key Item with id ${id} could not be found`);\n return;\n }\n const didUnlock = item.unlock();\n if (didUnlock) {\n this._onKeyItemGain.dispatch(item);\n }\n }\n\n /**\n * Emitted whenever a currency is gained\n * @private\n */\n public get onKeyItemGain(): ISimpleEvent {\n return this._onKeyItemGain.asEvent();\n }\n\n load(data: KeyItemSaveData): void {\n data.list?.forEach(id => {\n const item = this.getKeyItem(id);\n if (item) {\n item.isUnlocked = true;\n }\n })\n }\n\n save(): KeyItemSaveData {\n const list = [];\n for (const key in this.list) {\n if (this.list[key as KeyItemId].isUnlocked) {\n list.push(key as KeyItemId)\n }\n }\n return {\n list: list,\n };\n }\n}\n","import {Game} from \"./ig-template/Game\";\nimport {Wallet} from \"@/ig-template/features/wallet/Wallet\";\nimport {CurrencyType} from \"@/ig-template/features/wallet/CurrencyType\";\nimport {Settings} from \"@/ig-template/features/settings/Settings\";\nimport {Statistics} from \"@/ig-template/features/statistics/Statistics\";\nimport {Achievements} from \"@/ig-template/features/achievements/Achievements\";\nimport {RedeemableCodes} from \"@/ig-template/features/codes/RedeemableCodes\";\nimport {ActionGenerator} from \"@/ig-template/features/action-generator/ActionGenerator\";\nimport {SpecialEvents} from \"@/ig-template/features/special-events/SpecialEvents\";\nimport {Inventory} from \"@/ig-template/features/inventory/Inventory\";\nimport {ItemList} from \"@/ig-template/features/items/ItemList\";\nimport {KeyItems} from \"@/ig-template/features/key-items/KeyItems\";\n\nexport class App {\n static inProduction: boolean = (process.env.NODE_ENV === \"production\");\n\n static game: Game;\n\n static start(): void {\n\n this.game = this.getDefaultGame();\n this.game.initialize();\n this.game.load();\n this.game.start();\n }\n\n\n public static getDefaultGame(): Game {\n return new Game(\n {\n wallet: new Wallet([CurrencyType.Sapphire, CurrencyType.Emerald, CurrencyType.Ruby, CurrencyType.Diamond]),\n settings: new Settings(),\n codes: new RedeemableCodes(),\n actionGenerator: new ActionGenerator(),\n inventory: new Inventory(),\n itemList: new ItemList(),\n keyItems: new KeyItems(),\n specialEvents: new SpecialEvents(),\n statistics: new Statistics(),\n achievements: new Achievements(),\n }\n );\n }\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('notificationGroup',{attrs:{\"group\":\"top-left\"}},[_c('div',{staticClass:\"z-50 fixed inset-0 flex px-4 py-6 pointer-events-none p-6 items-start justify-start\"},[_c('div',{staticClass:\"max-w-sm w-full\"},[_c('notification',{scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar notifications = ref.notifications;\nreturn _vm._l((notifications),function(notification){return _c('div',{key:notification.id,staticClass:\"max-w-sm w-full mx-auto bg-white shadow-md rounded-lg overflow-hidden mt-4\"},[_c('igt-notification',{attrs:{\"notification\":notification}})],1)})}}])})],1)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"flex\"},[_c('div',{staticClass:\"flex justify-center items-center w-12\",class:_vm.backgroundColor},[_c('div',{staticClass:\"text-xl fa\",class:_vm.icon})]),_c('div',{staticClass:\"-mx-3 py-2 px-4\"},[_c('div',{staticClass:\"mx-3\"},[_c('span',{staticClass:\"font-semibold\",class:_vm.textColor},[_vm._v(_vm._s(_vm.notification.title))]),_c('p',{staticClass:\"text-gray-600 text-sm\"},[_vm._v(_vm._s(_vm.notification.text))])])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./igt-notification.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./igt-notification.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./igt-notification.vue?vue&type=template&id=15afe98b&scoped=true&\"\nimport script from \"./igt-notification.vue?vue&type=script&lang=js&\"\nexport * from \"./igt-notification.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"15afe98b\",\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./igt-notifications.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./igt-notifications.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./igt-notifications.vue?vue&type=template&id=c1296ae4&scoped=true&\"\nimport script from \"./igt-notifications.vue?vue&type=script&lang=js&\"\nexport * from \"./igt-notifications.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"c1296ae4\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('igt-feature',{staticClass:\"text-white\"},[_c('igt-exp-level',{staticClass:\"m-1\",attrs:{\"title\":\"Each level increases jewel rewards\",\"exp-level\":_vm.level}}),_c('div',{staticClass:\"flex flex-row flex-wrap\"},[_c('sj-time-upgrade',{attrs:{\"upgrade\":_vm.refreshUpgrade,\"can-buy\":_vm.generator.canAfford(_vm.refreshUpgrade)},nativeOn:{\"click\":function($event){return _vm.generator.buyUpgrade(_vm.refreshUpgrade)}}}),_c('igt-upgrade',{attrs:{\"upgrade\":_vm.maxActionUpgrade,\"can-buy\":_vm.generator.canAfford(_vm.maxActionUpgrade)},nativeOn:{\"click\":function($event){return _vm.generator.buyUpgrade(_vm.maxActionUpgrade)}}}),_c('igt-upgrade',{attrs:{\"upgrade\":_vm.negativeRateUpgrade,\"can-buy\":_vm.generator.canAfford(_vm.negativeRateUpgrade)},nativeOn:{\"click\":function($event){return _vm.generator.buyUpgrade(_vm.negativeRateUpgrade)}}}),_c('igt-upgrade',{attrs:{\"upgrade\":_vm.betterGems,\"can-buy\":_vm.generator.canAfford(_vm.betterGems)},nativeOn:{\"click\":function($event){return _vm.generator.buyUpgrade(_vm.betterGems)}}}),_c('igt-upgrade',{attrs:{\"upgrade\":_vm.speedBoost,\"can-buy\":_vm.generator.canAfford(_vm.speedBoost)},nativeOn:{\"click\":function($event){return _vm.generator.buyUpgrade(_vm.speedBoost)}}}),_c('igt-single-level-upgrade',{attrs:{\"upgrade\":_vm.highlightNegativeUpgrade,\"can-buy\":_vm.generator.canAfford(_vm.highlightNegativeUpgrade)},nativeOn:{\"click\":function($event){return _vm.generator.buyUpgrade(_vm.highlightNegativeUpgrade)}}}),_c('igt-upgrade',{attrs:{\"upgrade\":_vm.locks,\"can-buy\":_vm.generator.canAfford(_vm.locks)},nativeOn:{\"click\":function($event){return _vm.generator.buyUpgrade(_vm.locks)}}}),(_vm.generator._wallet.diamond > 10 || _vm.completeTheGame.isBought())?_c('igt-single-level-upgrade',{attrs:{\"upgrade\":_vm.completeTheGame,\"can-buy\":_vm.generator.canAfford(_vm.completeTheGame)},nativeOn:{\"click\":function($event){return _vm.buyFinalUpgrade($event)}}}):_vm._e()],1),_c('div',{staticClass:\"m-2 flex flex-col\"},[_c('div',{staticClass:\"flex flex-row justify-between\"},[_c('span',[_vm._v(\"Refreshing actions in...\")]),_c('span',{},[_c('span',{staticClass:\"fa fa-clock\"}),_vm._v(\" \"+_vm._s(_vm.generator.switchTime))])]),_c('igt-progress-bar',{attrs:{\"percentage\":_vm.refreshProgress,\"fg-class\":\"bg-gray-500\",\"bg-class\":\"bg-gray-600\"}})],1),_c('p',{staticClass:\"m-2\"},[_c('span',{staticClass:\"fa fa-lock\"}),_vm._v(\" Locks used \"+_vm._s(_vm.generator.currentLock)+\" / \"+_vm._s(_vm.generator.maxLock))]),_c('div',{staticClass:\"flex flex-row flex-wrap\"},_vm._l((_vm.actions),function(action,index){return _c('igt-action',{key:action.description + '-' + index,staticClass:\"m-2\",attrs:{\"action\":action,\"index\":index,\"highlight-negatives\":_vm.highlightNegatives},on:{\"lock\":_vm.lock}})}),1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"feature-tab\",class:_vm.containerClass},[_vm._t(\"default\")],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./igt-feature.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./igt-feature.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./igt-feature.vue?vue&type=template&id=b251df06&scoped=true&\"\nimport script from \"./igt-feature.vue?vue&type=script&lang=js&\"\nexport * from \"./igt-feature.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"b251df06\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"relative pt-1\"},[_c('div',{staticClass:\"flex justify-between\"},[_c('p',[_vm._v(\"Lvl. \"+_vm._s(_vm.expLevel.getLevel())+\" / \"+_vm._s(_vm.expLevel.maxLevel))]),_c('p',[_vm._v(_vm._s(_vm._f(\"numberFormat\")(_vm.progress.actual))+\" / \"+_vm._s(_vm._f(\"numberFormat\")(_vm.progress.target)))])]),_c('igt-progress-bar',{attrs:{\"percentage\":_vm.progressPercentage,\"fg-class\":\"bg-purple-600\",\"bg-class\":\"bg-purple-200\"}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"overflow-hidden h-2 mb-4 text-xs flex rounded\",class:_vm.bgClass},[_c('div',{staticClass:\"shadow-none flex flex-col text-center whitespace-nowrap text-white justify-center\",class:_vm.fgClass,style:({'width' : _vm.percentage * 100 + '%'})})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./igt-progress-bar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./igt-progress-bar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./igt-progress-bar.vue?vue&type=template&id=5b39c47a&scoped=true&\"\nimport script from \"./igt-progress-bar.vue?vue&type=script&lang=js&\"\nexport * from \"./igt-progress-bar.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5b39c47a\",\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./igt-exp-level.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./igt-exp-level.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./igt-exp-level.vue?vue&type=template&id=467fca20&scoped=true&\"\nimport script from \"./igt-exp-level.vue?vue&type=script&lang=js&\"\nexport * from \"./igt-exp-level.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"467fca20\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"w-44 h-28 border-4 shadow-lg hover:opacity-80 flex flex-col justify-center cursor-pointer\",class:_vm.color,on:{\"click\":function($event){return _vm.action.toggle()}}},[_c('div',{staticClass:\"flex flex-col w-full relative\"},[_c('div',{staticClass:\"absolute right-0 -top-2\"},[_c('span',{staticClass:\"fa px-3 py-3\",class:_vm.lockImage,on:{\"click\":function($event){$event.stopPropagation();return _vm.lock($event)}}})]),_c('div',{staticClass:\"p-4 flex flex-col w-full space-y-1\"},[_c('p',{staticClass:\"text-center text-white\"},[_vm._v(_vm._s(_vm.action.description))]),_c('span',{staticClass:\"text-center text-white\"},[_c('span',{staticClass:\"fa fa-clock\"}),_vm._v(\" \"+_vm._s(_vm._f(\"numberFormat\")(_vm.action.duration)))]),_c('igt-progress-bar',{attrs:{\"percentage\":_vm.progressPercentage,\"fg-class\":\"bg-gray-600\",\"bg-class\":\"bg-gray-300\"}})],1)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./igt-action.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./igt-action.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./igt-action.vue?vue&type=template&id=352757dc&scoped=true&\"\nimport script from \"./igt-action.vue?vue&type=script&lang=js&\"\nexport * from \"./igt-action.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"352757dc\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button',{staticClass:\"btn btn-blue\",attrs:{\"disabled\":!_vm.canBuy}},[_c('span',{staticClass:\"flex flex-col\"},[_c('span',[_vm._v(_vm._s(_vm.upgrade.displayName))]),_c('span',[_vm._v(\"Lvl. \"+_vm._s(_vm.upgrade.level)+\" / \"+_vm._s(_vm.upgrade.maxLevel))]),_c('span',[_c('span',{staticClass:\"fa fa-clock\"}),_vm._v(\" \"+_vm._s(_vm._f(\"numberFormat\")(_vm.upgrade.getBonus()))+\" \"),(!_vm.upgrade.isMaxLevel())?_c('span',[_vm._v(\" (+\"+_vm._s(_vm._f(\"numberFormat\")(_vm.upgrade.getUpgradeBonus()))+\") \")]):_vm._e()]),(!_vm.upgrade.isMaxLevel())?_c('span',[_c('sj-currency',{attrs:{\"currency\":_vm.upgrade.getCost()}})],1):_c('span',[_vm._v(\"Max\")])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"flex flex-row justify-center\"},[_c('span',{staticClass:\"mr-2\"},[_vm._v(_vm._s(_vm.currency.amount))]),(_vm.currency.type === _vm.CurrencyType.Sapphire)?_c('span',[_c('img',{staticClass:\"w-8 h-8\",attrs:{\"src\":require('@/assets/images/currencies/sapphire.svg')}})]):_vm._e(),(_vm.currency.type === _vm.CurrencyType.Emerald)?_c('span',[_c('img',{staticClass:\"w-8 h-8\",attrs:{\"src\":require('@/assets/images/currencies/emerald.svg')}})]):_vm._e(),(_vm.currency.type === _vm.CurrencyType.Ruby)?_c('span',[_c('img',{staticClass:\"w-8 h-8\",attrs:{\"src\":require('@/assets/images/currencies/ruby.svg')}})]):_vm._e(),(_vm.currency.type === _vm.CurrencyType.Diamond)?_c('span',[_c('img',{staticClass:\"w-8 h-8\",attrs:{\"src\":require('@/assets/images/currencies/diamond.svg')}})]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./sj-currency.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./sj-currency.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./sj-currency.vue?vue&type=template&id=f974cad0&scoped=true&\"\nimport script from \"./sj-currency.vue?vue&type=script&lang=js&\"\nexport * from \"./sj-currency.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"f974cad0\",\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./sj-time-upgrade.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./sj-time-upgrade.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./sj-time-upgrade.vue?vue&type=template&id=b4f3fcb8&scoped=true&\"\nimport script from \"./sj-time-upgrade.vue?vue&type=script&lang=js&\"\nexport * from \"./sj-time-upgrade.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"b4f3fcb8\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button',{staticClass:\"btn btn-blue\",attrs:{\"disabled\":!_vm.canBuy}},[_c('span',{staticClass:\"flex flex-col\"},[_c('span',[_vm._v(_vm._s(_vm.upgrade.displayName))]),_c('span',[_vm._v(\"Lvl. \"+_vm._s(_vm.upgrade.level)+\" / \"+_vm._s(_vm.upgrade.maxLevel))]),_c('span',[_vm._v(\" \"+_vm._s(_vm._f(\"numberFormat\")(_vm.upgrade.getBonus()))+\" \"),(!_vm.upgrade.isMaxLevel())?_c('span',[_vm._v(\" (\"),(_vm.upgrade.getUpgradeBonus() > 0)?_c('span',[_vm._v(\"+\")]):_vm._e(),_vm._v(_vm._s(_vm._f(\"numberFormat\")(_vm.upgrade.getUpgradeBonus()))+\") \")]):_vm._e()]),_vm._v(\" \"),(!_vm.upgrade.isMaxLevel())?_c('span',[_c('sj-currency',{attrs:{\"currency\":_vm.upgrade.getCost()}})],1):_c('span',[_vm._v(\"Max\")])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./igt-discrete-upgrade.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./igt-discrete-upgrade.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./igt-discrete-upgrade.vue?vue&type=template&id=25f0f572&scoped=true&\"\nimport script from \"./igt-discrete-upgrade.vue?vue&type=script&lang=js&\"\nexport * from \"./igt-discrete-upgrade.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"25f0f572\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button',{staticClass:\"btn btn-blue\",attrs:{\"disabled\":!_vm.canBuy}},[_c('span',{staticClass:\"flex flex-col\"},[_c('span',[_vm._v(_vm._s(_vm.upgrade.displayName))]),(!_vm.upgrade.isMaxLevel())?_c('span',[_c('sj-currency',{attrs:{\"currency\":_vm.upgrade.getCost()}})],1):_c('span',[_vm._v(\"Bought\")])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./igt-single-level-upgrade.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./igt-single-level-upgrade.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./igt-single-level-upgrade.vue?vue&type=template&id=3fa9220f&scoped=true&\"\nimport script from \"./igt-single-level-upgrade.vue?vue&type=script&lang=js&\"\nexport * from \"./igt-single-level-upgrade.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3fa9220f\",\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./sj-action-generator.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./sj-action-generator.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./sj-action-generator.vue?vue&type=template&id=5c1a7d1c&scoped=true&\"\nimport script from \"./sj-action-generator.vue?vue&type=script&lang=js&\"\nexport * from \"./sj-action-generator.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5c1a7d1c\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"w-full h-20 bg-gray-500 shadow-xl flex flex-row items-center justify-center text-white\"},[_c('div',{staticClass:\"p-4 flex flex-row items-center\",attrs:{\"title\":\"Sapphire\"}},[_c('span',{staticClass:\"m-2 text-lg\"},[_vm._v(_vm._s(_vm.sapphire))]),_c('img',{staticClass:\"w-8 h-8\",attrs:{\"src\":require('@/assets/images/currencies/sapphire.svg')}})]),_c('div',{staticClass:\"p-4 flex flex-row items-center\",attrs:{\"title\":\"Emerald\"}},[_c('span',{staticClass:\"m-2 text-lg\"},[_vm._v(_vm._s(_vm.emerald))]),_c('img',{staticClass:\"w-8 h-8\",attrs:{\"src\":require('@/assets/images/currencies/emerald.svg')}})]),_c('div',{staticClass:\"p-4 flex flex-row items-center\",attrs:{\"title\":\"Ruby\"}},[_c('span',{staticClass:\"m-2 text-lg\"},[_vm._v(_vm._s(_vm.ruby))]),_c('img',{staticClass:\"w-8 h-8\",attrs:{\"src\":require('@/assets/images/currencies/ruby.svg')}})]),_c('div',{staticClass:\"p-4 flex flex-row items-center\",attrs:{\"title\":\"Diamond\"}},[_c('span',{staticClass:\"m-2 text-lg\"},[_vm._v(_vm._s(_vm.diamond))]),_c('img',{staticClass:\"w-8 h-8\",attrs:{\"src\":require('@/assets/images/currencies/diamond.svg')}})])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./sj-header.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./sj-header.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./sj-header.vue?vue&type=template&id=97494a90&scoped=true&\"\nimport script from \"./sj-header.vue?vue&type=script&lang=js&\"\nexport * from \"./sj-header.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"97494a90\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"w-full p-4 bg-gray-500 shadow-xl flex flex-col items-center justify-around text-white space-y-4\"},[_c('p',[_vm._v(\"123IshaTest Games\")]),_c('p',[_vm._v(\"Made with the Incremental Game Template\")]),_c('div',{staticClass:\"flex flex-row space-x-4 items-center\"},[_c('span',[_c('a',{attrs:{\"href\":\"https://discord.gg/AvNpq6Ng6S\",\"target\":\"_blank\"}},[_c('img',{staticClass:\"w-8 h-8\",attrs:{\"src\":require('@/assets/socials/discord.png')}})])]),_c('span',[_c('a',{attrs:{\"href\":\"https://github.com/123ishaTest/incremental-game-template\",\"target\":\"_blank\"}},[_c('img',{staticClass:\"w-8 h-8\",attrs:{\"src\":require('@/assets/socials/github.png')}})])]),_c('span',[_c('a',{attrs:{\"href\":\"https://123ishatest.github.io/incremental-game-template-website/\",\"target\":\"_blank\"}},[_c('img',{staticClass:\"w-8 h-8\",attrs:{\"src\":require('@/assets/socials/docusaurus.svg')}})])]),_c('span',[_c('button',{staticClass:\"btn btn-red\",on:{\"click\":_vm.resetSave}},[_vm._v(\"Reset Save\")])])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./sj-footer.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./sj-footer.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./sj-footer.vue?vue&type=template&id=0c8e05cc&scoped=true&\"\nimport script from \"./sj-footer.vue?vue&type=script&lang=js&\"\nexport * from \"./sj-footer.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0c8e05cc\",\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=24ca064c&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import Vue from 'vue'\n\nVue.filter('numberFormat', function (value: number) {\n if (value == undefined) {\n return \"\";\n }\n return value.toFixed(2).toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n})\n\nVue.filter('dateFormat', function (date: Date) {\n if (date == undefined) {\n return \"\";\n }\n\n const year = new Intl.DateTimeFormat('en', {year: 'numeric'}).format(date);\n const month = new Intl.DateTimeFormat('en', {month: 'long'}).format(date);\n const day = new Intl.DateTimeFormat('en', {day: '2-digit'}).format(date);\n\n const hours = date.getHours();\n const hoursString = hours < 10 ? `0${hours}` : `${hours}`;\n const minutes = date.getMinutes();\n const minutesString = minutes < 10 ? `0${minutes}` : `${minutes}`;\n\n return `${day} ${month} ${year} ${hoursString}:${minutesString}`;\n\n})\n\nVue.filter('humanizeString', function (string: string) {\n if (string == undefined) {\n return \"\";\n }\n string = string.charAt(0).toUpperCase() + string.slice(1);\n string.replace(\"_\", \" \").replace(\"-\", \" \");\n return string;\n})\n","import Vue from 'vue'\nimport VueApp from './App.vue'\nimport {App} from \"./App\";\n\nimport VueSweetalert2 from 'vue-sweetalert2';\nimport 'sweetalert2/dist/sweetalert2.min.css';\n\nVue.use(VueSweetalert2);\n\nimport Notifications from \"vt-notifications\";\n\nimport './VueFilters';\n\nimport \"./index.css\";\n\nVue.config.productionTip = false\n\nVue.use(Notifications);\n\ndeclare global {\n interface Window {\n App: App;\n }\n}\n\n\n/**\n * Start the application when all html elements are loaded.\n */\nwindow.onload = function () {\n App.start();\n\n // Expose the App class to the window (and the console)\n // if (process.env.DEBUG && typeof window !== undefined) {\n\n console.log('Exposing App to console');\n window.App = App;\n // }\n\n\n console.log(\"Launched\");\n\n new Vue({\n render: h => h(VueApp),\n }).$mount('#app')\n\n\n};\n\n\n","module.exports = __webpack_public_path__ + \"img/diamond.66a6616d.svg\";","module.exports = __webpack_public_path__ + \"img/discord.872a595c.png\";","module.exports = __webpack_public_path__ + \"img/sapphire.e44ad932.svg\";"],"sourceRoot":""}