2020-10-03 19:45:47 +00:00
addLayer ( "c" , {
layer : "c" , // This is assigned automatically, both to the layer and all upgrades, etc. Shown here so you know about it
2020-10-07 15:08:20 +00:00
name : "Candies" , // This is optional, only used in a few places, If absent it just uses the layer id.
2020-09-24 15:54:41 +00:00
startData ( ) { return {
unl : true ,
points : new Decimal ( 0 ) ,
2020-09-24 23:32:34 +00:00
best : new Decimal ( 0 ) ,
total : new Decimal ( 0 ) ,
2020-10-01 00:25:14 +00:00
buyables : { } , // You don't actually have to initialize this one
2020-09-24 21:46:57 +00:00
beep : false ,
2020-09-24 15:54:41 +00:00
} } ,
2020-10-03 21:26:14 +00:00
color : ( ) => "#4BDC13" ,
2020-10-03 19:45:47 +00:00
requires : ( ) => new Decimal ( 10 ) , // Can be a function that takes requirement increases into account
2020-09-24 15:54:41 +00:00
resource : "lollipops" , // Name of prestige currency
baseResource : "candies" , // Name of resource prestige is based on
2020-10-03 19:45:47 +00:00
baseAmount ( ) { return player . points } , // Get the current amount of baseResource
2020-09-24 15:54:41 +00:00
type : "normal" , // normal: cost to gain currency depends on amount gained. static: cost depends on how much you already have
exponent : 0.5 , // Prestige currency exponent
base : 5 , // Only needed for static layers, base of the formula (b^(x^exp))
2020-10-03 19:45:47 +00:00
resCeil : false , // True if the cost needs to be rounded up (use when baseResource is static?)
canBuyMax ( ) { } , // Only needed for static layers with buy max
gainMult ( ) { // Calculate the multiplier for main currency from bonuses
2020-09-24 15:54:41 +00:00
mult = new Decimal ( 1 )
2020-10-04 15:28:52 +00:00
if ( hasUpg ( this . layer , 166 ) ) mult = mult . times ( 2 ) // These upgrades don't exist
2020-10-05 21:11:15 +00:00
if ( hasUpg ( this . layer , 120 ) ) mult = mult . times ( upgEffect ( this . layer , 120 ) )
2020-09-24 15:54:41 +00:00
return mult
} ,
2020-10-03 19:45:47 +00:00
gainExp ( ) { // Calculate the exponent on main currency from bonuses
2020-09-24 15:54:41 +00:00
return new Decimal ( 1 )
} ,
2020-10-03 19:45:47 +00:00
row : 0 , // Row the layer is in on the tree (0 is the first row)
effect ( ) {
return { // Formulas for any boosts inherent to resources in the layer. Can return a single value instead of an object if there is just one effect
waffleBoost : ( true == false ? 0 : Decimal . pow ( player [ this . layer ] . points , 0.2 ) ) ,
icecreamCap : ( player [ this . layer ] . points * 10 )
2020-09-24 15:54:41 +00:00
} } ,
2020-10-03 19:45:47 +00:00
effectDescription ( ) { // Optional text to describe the effects
2020-10-04 21:14:13 +00:00
eff = this . effect ( ) ;
2020-10-07 03:11:36 +00:00
eff . waffleBoost = eff . waffleBoost . times ( buyableEffect ( this . layer , 11 ) . first )
2020-09-24 15:54:41 +00:00
return "which are boosting waffles by " + format ( eff . waffleBoost ) + " and increasing the Ice Cream cap by " + format ( eff . icecreamCap )
} ,
2020-09-24 21:46:57 +00:00
milestones : {
2020-10-03 19:45:47 +00:00
0 : { requirementDesc : ( ) => "3 Lollipops" ,
2020-10-07 20:41:45 +00:00
done ( ) { return player [ this . layer ] . best . gte ( 3 ) } , // Used to determine when to give the milestone
effectDesc : ( ) => "Unlock the next milestone" ,
2020-09-24 21:46:57 +00:00
} ,
2020-10-03 19:45:47 +00:00
1 : { requirementDesc : ( ) => "4 Lollipops" ,
2020-10-07 20:41:45 +00:00
unl ( ) { return hasMilestone ( this . layer , 0 ) } ,
done ( ) { return player [ this . layer ] . best . gte ( 4 ) } ,
effectDesc : ( ) => "You can toggle beep and boop (which do nothing)" ,
toggles : [
[ "c" , "beep" ] , // Each toggle is defined by a layer and the data toggled for that layer
[ "f" , "boop" ] ] ,
style ( ) {
if ( hasMilestone ( this . layer , this . id ) ) return {
'background-color' : '#1111DD'
} } ,
} ,
2020-09-24 21:46:57 +00:00
} ,
2020-10-03 19:45:47 +00:00
challs : {
rows : 1 ,
cols : 1 ,
11 : {
name : ( ) => "Fun" ,
desc : ( ) => "Makes the game 0% harder" ,
unl ( ) { return player [ this . layer ] . best . gt ( 0 ) } ,
goal : ( ) => new Decimal ( "20" ) ,
currencyDisplayName : "lollipops" , // Use if using a nonstandard currency
currencyInternalName : "points" , // Use if using a nonstandard currency
currencyLayer : this . layer , // Leave empty if not in a layer
effect ( ) {
let ret = player [ this . layer ] . points . add ( 1 ) . tetrate ( 0.02 )
return ret ;
} ,
effectDisplay ( x ) { return format ( x ) + "x" } ,
countsAs : [ 12 , 21 ] , // Use this for if a challenge includes the effects of other challenges. Being in this challenge "counts as" being in these.
reward : ( ) => "Says hi" ,
onComplete ( ) { console . log ( "hiii" ) } // Called when you complete the challenge
} ,
} ,
2020-09-24 15:54:41 +00:00
upgrades : {
rows : 1 ,
cols : 3 ,
11 : {
2020-10-03 19:45:47 +00:00
title : ( ) => "Generator of Genericness" ,
desc : ( ) => "Gain 1 Point every second." ,
cost : ( ) => new Decimal ( 1 ) ,
unl ( ) { return player [ this . layer ] . unl } , // The upgrade is only visible when this is true
2020-09-24 15:54:41 +00:00
} ,
12 : {
2020-10-03 19:45:47 +00:00
desc : ( ) => "Candy generation is faster based on your unspent Lollipops." ,
cost : ( ) => new Decimal ( 1 ) ,
2020-10-04 15:23:38 +00:00
unl ( ) { return ( hasUpg ( this . layer , 11 ) ) } ,
2020-10-03 19:45:47 +00:00
effect ( ) { // Calculate bonuses from the upgrade. Can return a single value or an object with multiple values
let ret = player [ this . layer ] . points . add ( 1 ) . pow ( player [ this . layer ] . upgrades . includes ( 24 ) ? 1.1 : ( player [ this . layer ] . upgrades . includes ( 14 ) ? 0.75 : 0.5 ) )
2020-09-24 15:54:41 +00:00
if ( ret . gte ( "1e20000000" ) ) ret = ret . sqrt ( ) . times ( "1e10000000" )
return ret ;
} ,
2020-10-03 19:45:47 +00:00
effectDisplay ( fx ) { return format ( fx ) + "x" } , // Add formatting to the effect
2020-09-24 15:54:41 +00:00
} ,
13 : {
2020-10-07 20:41:45 +00:00
desc : ( ) => "Unlock a <b>secret subtab</b> and make this layer act if you unlocked it first." ,
2020-10-03 19:45:47 +00:00
cost : ( ) => new Decimal ( 69 ) ,
2020-09-24 15:54:41 +00:00
currencyDisplayName : "candies" , // Use if using a nonstandard currency
currencyInternalName : "points" , // Use if using a nonstandard currency
currencyLayer : "" , // Leave empty if not in a layer "e.g. points"
2020-10-04 15:23:38 +00:00
unl ( ) { return ( hasUpg ( this . layer , 12 ) ) } ,
2020-10-03 19:45:47 +00:00
onPurchase ( ) { // This function triggers when the upgrade is purchased
player [ this . layer ] . order = 0
2020-10-07 20:41:45 +00:00
} ,
style ( ) {
if ( hasUpg ( this . layer , this . id ) ) return {
'background-color' : '#1111dd'
}
else if ( ! canAffordUpg ( this . layer , this . id ) ) {
return {
'background-color' : '#dd1111'
}
} // Otherwise use the default
} ,
2020-09-24 15:54:41 +00:00
} ,
} ,
2020-10-01 00:25:14 +00:00
buyables : {
rows : 1 ,
cols : 1 ,
respec ( ) { // Optional, reset things and give back your currency. Having this function makes a respec button appear
2020-10-03 19:45:47 +00:00
player [ this . layer ] . points = player [ this . layer ] . points . add ( player [ this . layer ] . spentOnBuyables ) // A built-in thing to keep track of this but only keeps a single value
resetBuyables ( this . layer )
doReset ( this . layer , true ) // Force a reset
2020-10-01 00:25:14 +00:00
} ,
2020-10-03 19:45:47 +00:00
respecText : ( ) => "Respec Thingies" , // Text on Respec button, optional
2020-10-01 00:25:14 +00:00
11 : {
2020-10-03 19:45:47 +00:00
title : ( ) => "Exhancers" , // Optional, displayed at the top in a larger font
2020-10-01 00:25:14 +00:00
cost ( x ) { // cost for buying xth buyable, can be an object if there are multiple currencies
if ( x . gte ( 25 ) ) x = x . pow ( 2 ) . div ( 25 )
let cost = Decimal . pow ( 2 , x . pow ( 1.5 ) )
return cost . floor ( )
} ,
2020-10-01 05:30:59 +00:00
effect ( x ) { // Effects of owning x of the items, x is a decimal
2020-10-01 00:25:14 +00:00
let eff = { }
if ( x . gte ( 0 ) ) eff . first = Decimal . pow ( 25 , x . pow ( 1.1 ) )
else eff . first = Decimal . pow ( 1 / 25 , x . times ( - 1 ) . pow ( 1.1 ) )
if ( x . gte ( 0 ) ) eff . second = x . pow ( 0.8 )
else eff . second = x . times ( - 1 ) . pow ( 0.8 ) . times ( - 1 )
return eff ;
} ,
2020-10-03 19:45:47 +00:00
display ( ) { // Everything else displayed in the buyable button after the title
2020-10-03 20:47:56 +00:00
let data = tmp . buyables [ this . layer ] [ this . id ]
2020-10-01 00:25:14 +00:00
return "Cost: " + format ( data . cost ) + " lollipops \ n \
2020-10-03 20:47:56 +00:00
Amount : " + player[this.layer].buyables[this.id] + " \ n \
2020-10-03 19:45:47 +00:00
Adds + " + format(data.effect.first) + " things and multiplies stuff by " + format ( data . effect . second )
2020-10-01 00:25:14 +00:00
} ,
2020-10-03 19:45:47 +00:00
unl ( ) { return player [ this . layer ] . unl } ,
canAfford ( ) {
2020-10-03 20:47:56 +00:00
return player [ this . layer ] . points . gte ( tmp . buyables [ this . layer ] [ this . id ] . cost ) } ,
2020-10-03 19:45:47 +00:00
buy ( ) {
2020-10-03 20:47:56 +00:00
cost = tmp . buyables [ this . layer ] [ this . id ] . cost
2020-10-03 19:45:47 +00:00
player [ this . layer ] . points = player [ this . layer ] . points . sub ( cost )
2020-10-03 20:47:56 +00:00
player [ this . layer ] . buyables [ this . id ] = player [ this . layer ] . buyables [ this . id ] . add ( 1 )
2020-10-03 19:45:47 +00:00
player [ this . layer ] . spentOnBuyables = player [ this . layer ] . spentOnBuyables . add ( cost ) // This is a built-in system that you can use for respeccing but it only works with a single Decimal value
2020-10-01 00:25:14 +00:00
} ,
buyMax ( ) { } , // You'll have to handle this yourself if you want
} ,
} ,
2020-10-03 19:45:47 +00:00
doReset ( resettingLayer ) { // Triggers when this layer is being reset, along with the layer doing the resetting. Not triggered by lower layers resetting, but is by layers on the same row.
if ( layers [ resettingLayer ] . row > this . row ) fullLayerReset ( this . layer ) // This is actually the default behavior
2020-09-24 21:46:57 +00:00
} ,
2020-10-03 19:45:47 +00:00
layerShown ( ) { return true } , // Condition for when layer appears on the tree
2020-09-24 15:54:41 +00:00
update ( diff ) {
2020-10-03 19:45:47 +00:00
if ( player [ this . layer ] . upgrades . includes ( 11 ) ) player . points = player . points . add ( tmp . pointGen . times ( diff ) ) . max ( 0 )
2020-09-24 15:54:41 +00:00
} , // Do any gameloop things (e.g. resource generation) inherent to this layer
automate ( ) {
} , // Do any automation inherent to this layer if appropriate
updateTemp ( ) {
2020-10-03 19:45:47 +00:00
} , // Do any necessary temp updating, not that important usually
2020-09-24 15:54:41 +00:00
resetsNothing ( ) { return false } ,
2020-10-03 19:45:47 +00:00
onPrestige ( gain ) {
return
} , // Useful for if you gain secondary resources or have other interesting things happen to this layer when you reset it. You gain the currency after this function ends.
2020-10-01 01:30:50 +00:00
hotkeys : [
2020-10-03 21:26:14 +00:00
{ key : "c" , desc : "C: reset for lollipops or whatever" , onPress ( ) { if ( player [ this . layer ] . unl ) doReset ( this . layer ) } } ,
{ key : "ctrl+c" + this . layer , desc : "Ctrl+c: respec things" , onPress ( ) { if ( player [ this . layer ] . unl ) respecBuyables ( this . layer ) } } ,
2020-10-01 01:30:50 +00:00
] ,
2020-09-24 15:54:41 +00:00
incr _order : [ ] , // Array of layer names to have their order increased when this one is first unlocked
2020-10-01 01:30:50 +00:00
2020-10-07 03:11:36 +00:00
microtabs : {
stuff : {
first : {
content : [ "upgrades" , [ "display-text" , function ( ) { return "confirmed" } ] ]
} ,
second : {
content : [ [ "upgrade" , 11 ] ,
[ "row" , [ [ "upgrade" , 11 ] , "blank" , "blank" , [ "upgrade" , 11 ] , ] ] ,
[ "display-text" , function ( ) { return "double confirmed" } ] ]
} ,
} ,
otherStuff : {
// There could be another set of microtabs here
}
} ,
2020-09-28 01:00:10 +00:00
// Optional, lets you format the tab yourself by listing components. You can create your own components in v.js.
2020-10-04 17:10:04 +00:00
tabFormat : {
2020-10-07 04:57:41 +00:00
"main tab" : {
2020-10-07 20:41:45 +00:00
buttonStyle ( ) { return { 'color' : 'orange' } } ,
2020-10-07 03:11:36 +00:00
content :
[ "main-display" ,
[ "prestige-button" , function ( ) { return "Melt your points into " } ] ,
[ "blank" , "5px" ] , // Height
[ "raw-html" , function ( ) { return "<button onclick='console.log(`yeet`)'>'HI'</button>" } ] ,
[ "display-text" ,
function ( ) { return 'I have ' + format ( player . points ) + ' pointy points!' } ,
{ "color" : "red" , "font-size" : "32px" , "font-family" : "Comic Sans MS" } ] ,
"h-line" , "milestones" , "blank" , "upgrades" , "challs" ] ,
} ,
thingies : {
2020-10-07 20:41:45 +00:00
style ( ) { return { 'background-color' : '#222222' } } ,
buttonStyle ( ) { return { 'border-color' : 'orange' } } ,
2020-10-07 03:11:36 +00:00
content : [
[ "buyables" , "150px" ] , "blank" ,
[ "row" , [
[ "toggle" , [ "c" , "beep" ] ] , [ "blank" , [ "30px" , "10px" ] ] , // Width, height
[ "display-text" , function ( ) { return "Beep" } ] , "blank" , [ "v-line" , "200px" ] ,
[ "column" , [
[ "prestige-button" , function ( ) { return "Be redundant for " } , { 'width' : '150px' , 'height' : '30px' } ] ,
[ "prestige-button" , function ( ) { return "Be redundant for " } , { 'width' : '150px' , 'height' : '30px' } ] ,
] ] ,
] , { 'width' : '600px' , 'height' : '350px' , 'background-color' : 'green' , 'border-style' : 'solid' } ] ,
"blank" ,
[ "display-image" , "discord.png" ] , ] ,
} ,
illuminati : {
2020-10-07 03:29:52 +00:00
unl ( ) { return ( hasUpg ( "c" , 13 ) ) } ,
2020-10-07 03:11:36 +00:00
content : [
[ "raw-html" , function ( ) { return "<h1> C O N F I R M E D </h1>" } ] ,
[ "microtabs" , "stuff" , { 'width' : '600px' , 'height' : '350px' , 'background-color' : 'brown' , 'border-style' : 'solid' } ]
]
}
2020-10-04 17:10:04 +00:00
} ,
2020-10-03 19:45:47 +00:00
style ( ) { return {
2020-10-07 20:41:45 +00:00
'background-color' : '#3325CC'
} } ,
nodeStyle ( ) { return { // Style on the layer node
'color' : '#3325CC' ,
'text-decoration' : 'underline'
2020-10-03 19:45:47 +00:00
} } ,
2020-10-07 20:41:45 +00:00
componentStyles : {
"chall" ( ) { return { 'height' : '200px' } } ,
"prestige-button" ( ) { return { 'color' : '#AA66AA' } } ,
} ,
tooltip ( ) { // Optional, tooltip displays when the layer is unlocked
let tooltip = formatWhole ( player [ this . layer ] . points ) + " " + this . resource
if ( player [ this . layer ] . buyables [ 11 ] . gt ( 0 ) ) tooltip += "\n" + formatWhole ( player [ this . layer ] . buyables [ 11 ] ) + " Exhancers"
return tooltip
} ,
2020-10-04 15:23:38 +00:00
shouldNotify ( ) { // Optional, layer will be highlighted on the tree if true.
// Layer will automatically highlight if an upgrade is purchasable.
return ( player . c . buyables [ 11 ] == 1 )
}
2020-10-03 19:45:47 +00:00
} )
2020-09-24 21:46:57 +00:00
2020-10-07 03:11:36 +00:00
// This layer is mostly minimal but it uses a custom prestige type
2020-10-03 19:45:47 +00:00
addLayer ( "f" , {
2020-09-24 15:54:41 +00:00
startData ( ) { return {
unl : false ,
points : new Decimal ( 0 ) ,
2020-09-24 21:46:57 +00:00
boop : false ,
2020-09-24 15:54:41 +00:00
} } ,
2020-10-03 19:45:47 +00:00
color : ( ) => "#FE0102" ,
2020-10-07 00:09:54 +00:00
requires ( ) { return new Decimal ( 10 ) } ,
2020-09-24 22:42:52 +00:00
resource : "farm points" ,
baseResource : "candies" ,
2020-09-24 15:54:41 +00:00
baseAmount ( ) { return player . points } ,
2020-10-07 03:11:36 +00:00
type : "custom" , // A "Custom" type which is effectively static
2020-10-07 00:09:54 +00:00
exponent : 0.5 ,
base : 3 ,
resCeil : true ,
canBuyMax : ( ) => true ,
2020-09-24 15:54:41 +00:00
gainMult ( ) {
2020-09-24 21:46:57 +00:00
return new Decimal ( 1 )
2020-09-24 15:54:41 +00:00
} ,
gainExp ( ) {
return new Decimal ( 1 )
} ,
row : 1 ,
2020-09-24 21:46:57 +00:00
layerShown ( ) { return true } ,
2020-10-09 00:35:08 +00:00
branches : [ "c" ] , // When this layer appears, a branch will appear from this layer to any layers here. Each entry can be a pair consisting of a layer id and a color.
2020-10-07 03:11:36 +00:00
2020-10-07 20:41:45 +00:00
tooltipLocked ( ) { // Optional, tooltip displays when the layer is locked
return ( "This weird farmer dinosaur will only see you if you have at least " + this . requires ( ) + " candies. You only have " + formatWhole ( player . points ) )
} ,
2020-10-08 05:33:44 +00:00
midsection : [
2020-10-08 05:38:08 +00:00
"blank" , [ 'display-image' , 'https://images.beano.com/store/24ab3094eb95e5373bca1ccd6f330d4406db8d1f517fc4170b32e146f80d?auto=compress%2Cformat&dpr=1&w=390' ] ,
[ "display-text" , "Bork bork!" ]
2020-10-08 05:33:44 +00:00
] ,
2020-10-07 03:11:36 +00:00
// The following are only currently used for "custom" Prestige type:
prestigeButtonText ( ) { //Is secretly HTML
if ( ! this . canBuyMax ( ) ) return "Hi! I'm a <u>weird dinosaur</u> and I'll give you a Farm Point in exchange for all of your candies and lollipops! (At least " + formatWhole ( tmp . nextAt [ layer ] ) + " candies)"
2020-10-08 05:38:08 +00:00
if ( this . canBuyMax ( ) ) return "Hi! I'm a <u>weird dinosaur</u> and I'll give you <b>" + formatWhole ( tmp . resetGain [ this . layer ] ) + "</b> Farm Points in exchange for all of your candies and lollipops! (You'll get another one at " + formatWhole ( tmp . nextAtDisp [ layer ] ) + " candies)"
2020-10-07 03:11:36 +00:00
} ,
getResetGain ( ) {
return getResetGain ( this . layer , useType = "static" )
} ,
getNextAt ( canMax = false ) { //
return getNextAt ( this . layer , canMax , useType = "static" )
} ,
canReset ( ) {
return tmp . layerAmt [ this . layer ] . gte ( tmp . nextAt [ this . layer ] )
} ,
2020-09-24 15:54:41 +00:00
} ,
2020-10-03 19:45:47 +00:00
)
2020-09-24 15:54:41 +00:00