From fc0c6bb01ec156a75ea3b91f97bf60de87ad8837 Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Tue, 11 Jun 2024 02:38:24 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20pages=20from=20@=20thepaperpil?= =?UTF-8?q?ot/pages@30daecfc3fbaa1652eead0912de7ec3476d08621=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 404.html | 4 +- assets/{app.fRTEzOm5.js => app.Cr-tMuRf.js} | 2 +- assets/changelog_index.md.BUwKGXwi.js | 1 + ...js => changelog_index.md.BUwKGXwi.lean.js} | 2 +- assets/changelog_index.md.Bq0zUXhk.js | 1 - .../{theme.g7q6KECo.js => theme.BFUR2isj.js} | 2 +- assets/chunks/virtual_search-data.6Jzpy5HH.js | 480 ------------------ assets/chunks/virtual_search-data.CUABEQwy.js | 480 ++++++++++++++++++ ...> garden_activitypub_index.md.BKxKk1GM.js} | 2 +- ...den_activitypub_index.md.BKxKk1GM.lean.js} | 2 +- ...n_advent-incremental_index.md.Bi867NSD.js} | 2 +- ...ent-incremental_index.md.Bi867NSD.lean.js} | 2 +- ...js => garden_atproto_index.md.BwFHx7Hd.js} | 2 +- ... garden_atproto_index.md.BwFHx7Hd.lean.js} | 2 +- ...> garden_babble-buds_index.md.IVJV-9eu.js} | 2 +- ...den_babble-buds_index.md.IVJV-9eu.lean.js} | 2 +- ..._capture-the-citadel_index.md.CcwwplwM.js} | 2 +- ...ure-the-citadel_index.md.CcwwplwM.lean.js} | 2 +- ... => garden_chat-glue_index.md.Cgbw8xnx.js} | 2 +- ...arden_chat-glue_index.md.Cgbw8xnx.lean.js} | 2 +- ...garden_chronological_index.md.g8ZA0BlN.js} | 2 +- ...n_chronological_index.md.g8ZA0BlN.lean.js} | 2 +- ...G.js => garden_cinny_index.md.DjdgGx9N.js} | 2 +- ...=> garden_cinny_index.md.DjdgGx9N.lean.js} | 2 +- ...js => garden_commune_index.md.Cz6o7qRH.js} | 2 +- ... garden_commune_index.md.Cz6o7qRH.lean.js} | 2 +- ... garden_davey-wreden_index.md.BMlE9hYd.js} | 2 +- ...en_davey-wreden_index.md.BMlE9hYd.lean.js} | 2 +- ...garden_decentralized_index.md.DuxiPg9M.js} | 2 +- ...n_decentralized_index.md.DuxiPg9M.lean.js} | 2 +- ...=> garden_dice-armor_index.md.CztXuY1B.js} | 2 +- ...rden_dice-armor_index.md.CztXuY1B.lean.js} | 2 +- ...rden_digital-gardens_index.md.ChW8RG51.js} | 2 +- ...digital-gardens_index.md.ChW8RG51.lean.js} | 2 +- ...n_federated-identity_index.md.Bf4QWuIq.js} | 2 +- ...erated-identity_index.md.Bf4QWuIq.lean.js} | 2 +- ...js => garden_fedi-v2_index.md.B5ZguLke.js} | 2 +- ... garden_fedi-v2_index.md.B5ZguLke.lean.js} | 2 +- ... => garden_fediverse_index.md.UJiYbaK2.js} | 2 +- ...arden_fediverse_index.md.UJiYbaK2.lean.js} | 2 +- ...js => garden_forgejo_index.md.BIFTMSC0.js} | 2 +- ... garden_forgejo_index.md.BIFTMSC0.lean.js} | 2 +- ...onological-dichotomy_index.md.C3LSUlA6.js} | 2 +- ...gical-dichotomy_index.md.C3LSUlA6.lean.js} | 2 +- ...s => garden_freeform_index.md.BLA-ZZ3B.js} | 2 +- ...garden_freeform_index.md.BLA-ZZ3B.lean.js} | 2 +- ...garden_game-dev-tree_index.md.DweE1Ysy.js} | 2 +- ...n_game-dev-tree_index.md.DweE1Ysy.lean.js} | 2 +- ...=> garden_garden-rss_index.md.CqqLm4uJ.js} | 2 +- ...rden_garden-rss_index.md.CqqLm4uJ.lean.js} | 2 +- ...appeal-to-developers_index.md.C6gNawcM.js} | 2 +- ...l-to-developers_index.md.C6gNawcM.lean.js} | 2 +- ...ls_appeal-to-players_index.md.AIc2QesW.js} | 2 +- ...peal-to-players_index.md.AIc2QesW.lean.js} | 2 +- ...s_defining-the-genre_index.md.B-EmqxPI.js} | 2 +- ...ining-the-genre_index.md.B-EmqxPI.lean.js} | 2 +- ...uide-to-incrementals_index.md.D-Qo_phb.js} | 2 +- ...to-incrementals_index.md.D-Qo_phb.lean.js} | 2 +- ...navigating-criticism_index.md.Djt_EVT5.js} | 2 +- ...ating-criticism_index.md.Djt_EVT5.lean.js} | 2 +- ...tals_what-is-content_index.md.A83vET_y.js} | 2 +- ...what-is-content_index.md.A83vET_y.lean.js} | 2 +- ...n_incremental-social_index.md.TlaPPmQO.js} | 2 +- ...remental-social_index.md.TlaPPmQO.lean.js} | 2 +- ...s => garden_ivy-road_index.md.DK8swC5I.js} | 2 +- ...garden_ivy-road_index.md.DK8swC5I.lean.js} | 2 +- ....js => garden_kronos_index.md.B-JAOjIb.js} | 2 +- ...> garden_kronos_index.md.B-JAOjIb.lean.js} | 2 +- ....js => garden_logseq_index.md.Sw_XpNVJ.js} | 2 +- ...> garden_logseq_index.md.Sw_XpNVJ.lean.js} | 2 +- ....js => garden_matrix_index.md.B4VZfP7W.js} | 2 +- ...> garden_matrix_index.md.B4VZfP7W.lean.js} | 2 +- ...Ka.js => garden_mbin_index.md.DHRumvWR.js} | 2 +- ... => garden_mbin_index.md.DHRumvWR.lean.js} | 2 +- ..._my-personal-website_index.md.DryeDwGD.js} | 2 +- ...ersonal-website_index.md.DryeDwGD.lean.js} | 2 +- ...> garden_my-projects_index.md.efagz0SF.js} | 2 +- ...den_my-projects_index.md.efagz0SF.lean.js} | 2 +- ...u.js => garden_nostr_index.md.CnVfHGYc.js} | 2 +- ...=> garden_nostr_index.md.CnVfHGYc.lean.js} | 2 +- ...> garden_open-source_index.md.DFsY5O5E.js} | 2 +- ...den_open-source_index.md.DFsY5O5E.lean.js} | 2 +- ...> garden_opti-speech_index.md.C1FMxL_Q.js} | 2 +- ...den_opti-speech_index.md.C1FMxL_Q.lean.js} | 2 +- ...rden_planar-pioneers_index.md.DjRmOjdq.js} | 2 +- ...planar-pioneers_index.md.DjRmOjdq.lean.js} | 2 +- ... => garden_profectus_index.md.0UR_Gmo7.js} | 2 +- ...arden_profectus_index.md.0UR_Gmo7.lean.js} | 2 +- ... garden_social-media_index.md.CZWs3kNq.js} | 2 +- ...en_social-media_index.md.CZWs3kNq.lean.js} | 2 +- ...js => garden_synapse_index.md.DlkipkaT.js} | 2 +- ... garden_synapse_index.md.DlkipkaT.lean.js} | 2 +- ...the-beginner-s-guide_index.md.vCAvuQfF.js} | 2 +- ...eginner-s-guide_index.md.vCAvuQfF.lean.js} | 2 +- ... garden_the-cozy-web_index.md.C9yKvylk.js} | 2 +- ...en_the-cozy-web_index.md.C9yKvylk.lean.js} | 2 +- ...garden_the-small-web_index.md.2RHAQRcF.js} | 2 +- ...n_the-small-web_index.md.2RHAQRcF.lean.js} | 2 +- ...n_this-knowledge-hub_index.md.BtDJLJGY.js} | 2 +- ...s-knowledge-hub_index.md.BtDJLJGY.lean.js} | 2 +- ...v.js => garden_v-ecs_index.md.CeXiyFwA.js} | 2 +- ...=> garden_v-ecs_index.md.CeXiyFwA.lean.js} | 2 +- ... => garden_vitepress_index.md.6SyjaoK2.js} | 2 +- ...arden_vitepress_index.md.6SyjaoK2.lean.js} | 2 +- ...=> garden_wanderstop_index.md.fcx7CNrA.js} | 2 +- ...rden_wanderstop_index.md.fcx7CNrA.lean.js} | 2 +- ...s => garden_webrings_index.md.57x1ZkEg.js} | 2 +- ...garden_webrings_index.md.57x1ZkEg.lean.js} | 2 +- ...4.js => garden_weird_index.md.Bd7l3f9l.js} | 2 +- ...=> garden_weird_index.md.Bd7l3f9l.lean.js} | 2 +- ...ex.md.CrdqXg4F.js => index.md.DdYa43X-.js} | 2 +- ...Xg4F.lean.js => index.md.DdYa43X-.lean.js} | 2 +- ...devtree_2.0-format-changes.md.Cu7Ykz4Q.js} | 2 +- ...ee_2.0-format-changes.md.Cu7Ykz4Q.lean.js} | 2 +- ... public_gamedevtree_README.md.D0kWmw3r.js} | 2 +- ...ic_gamedevtree_README.md.D0kWmw3r.lean.js} | 2 +- ...blic_gamedevtree_changelog.md.BVckBzUe.js} | 2 +- ...gamedevtree_changelog.md.BVckBzUe.lean.js} | 2 +- ...devtree_docs_!general-info.md.WzWHA4Zz.js} | 2 +- ...ee_docs_!general-info.md.WzWHA4Zz.lean.js} | 2 +- ...edevtree_docs_achievements.md.BgY9AsGa.js} | 2 +- ...ree_docs_achievements.md.BgY9AsGa.lean.js} | 2 +- ...blic_gamedevtree_docs_bars.md.DbswOg3L.js} | 2 +- ...gamedevtree_docs_bars.md.DbswOg3L.lean.js} | 2 +- ...docs_basic-layer-breakdown.md.DlASwD5Q.js} | 2 +- ...basic-layer-breakdown.md.DlASwD5Q.lean.js} | 2 +- ..._gamedevtree_docs_buyables.md.Bu_8Had0.js} | 2 +- ...devtree_docs_buyables.md.Bu_8Had0.lean.js} | 2 +- ...amedevtree_docs_challenges.md.BFQDD4X0.js} | 2 +- ...vtree_docs_challenges.md.BFQDD4X0.lean.js} | 2 +- ...amedevtree_docs_clickables.md.9UR7Ajqa.js} | 2 +- ...vtree_docs_clickables.md.9UR7Ajqa.lean.js} | 2 +- ...ee_docs_custom-tab-layouts.md.CuvyVAhF.js} | 2 +- ...cs_custom-tab-layouts.md.CuvyVAhF.lean.js} | 2 +- ...vtree_docs_getting-started.md.CO6xRZs4.js} | 2 +- ..._docs_getting-started.md.CO6xRZs4.lean.js} | 2 +- ...gamedevtree_docs_infoboxes.md.CRUxoh5g.js} | 2 +- ...evtree_docs_infoboxes.md.CRUxoh5g.lean.js} | 2 +- ...evtree_docs_layer-features.md.DSg6NDQu.js} | 2 +- ...e_docs_layer-features.md.DSg6NDQu.lean.js} | 2 +- ...devtree_docs_main-mod-info.md.6LyBs-t5.js} | 2 +- ...ee_docs_main-mod-info.md.6LyBs-t5.lean.js} | 2 +- ...amedevtree_docs_milestones.md.BmAGhs_0.js} | 2 +- ...vtree_docs_milestones.md.BmAGhs_0.lean.js} | 2 +- ...docs_subtabs-and-microtabs.md.C4QzwvQW.js} | 2 +- ...subtabs-and-microtabs.md.C4QzwvQW.lean.js} | 2 +- ...edevtree_docs_updating-tmt.md.DGbxasx9.js} | 2 +- ...ree_docs_updating-tmt.md.DGbxasx9.lean.js} | 2 +- ..._gamedevtree_docs_upgrades.md.DZ8OZlWu.js} | 2 +- ...devtree_docs_upgrades.md.DZ8OZlWu.lean.js} | 2 +- ... Things_2.0-format-changes.md.NRns2BBm.js} | 2 +- ...gs_2.0-format-changes.md.NRns2BBm.lean.js} | 2 +- ...=> public_kronos_changelog.md.CKFBbvc8.js} | 2 +- ...blic_kronos_changelog.md.CKFBbvc8.lean.js} | 2 +- ..._kronos_docs_!general-info.md.BpKUMbLF.js} | 2 +- ...os_docs_!general-info.md.BpKUMbLF.lean.js} | 2 +- ...c_kronos_docs_achievements.md.CV5RQN-f.js} | 2 +- ...nos_docs_achievements.md.CV5RQN-f.lean.js} | 2 +- ...=> public_kronos_docs_bars.md.DYrBr3p3.js} | 2 +- ...blic_kronos_docs_bars.md.DYrBr3p3.lean.js} | 2 +- ...docs_basic-layer-breakdown.md.CKcXGVzo.js} | 2 +- ...basic-layer-breakdown.md.CKcXGVzo.lean.js} | 2 +- ...ublic_kronos_docs_buyables.md.Clz5ovuw.js} | 2 +- ..._kronos_docs_buyables.md.Clz5ovuw.lean.js} | 2 +- ...lic_kronos_docs_challenges.md.xjts-SLB.js} | 2 +- ...ronos_docs_challenges.md.xjts-SLB.lean.js} | 2 +- ...lic_kronos_docs_clickables.md.CwRD8HLA.js} | 2 +- ...ronos_docs_clickables.md.CwRD8HLA.lean.js} | 2 +- ...os_docs_custom-tab-layouts.md.DQLQaGen.js} | 2 +- ...cs_custom-tab-layouts.md.DQLQaGen.lean.js} | 2 +- ...ronos_docs_getting-started.md.CvyktqWn.js} | 2 +- ..._docs_getting-started.md.CvyktqWn.lean.js} | 2 +- ...> public_kronos_docs_grids.md.D6eGDxZf.js} | 2 +- ...lic_kronos_docs_grids.md.D6eGDxZf.lean.js} | 2 +- ...blic_kronos_docs_infoboxes.md.d7yspWU6.js} | 2 +- ...kronos_docs_infoboxes.md.d7yspWU6.lean.js} | 2 +- ...kronos_docs_layer-features.md.CUYPvQ75.js} | 2 +- ...s_docs_layer-features.md.CUYPvQ75.lean.js} | 2 +- ..._kronos_docs_main-mod-info.md.59FtHiDt.js} | 2 +- ...os_docs_main-mod-info.md.59FtHiDt.lean.js} | 2 +- ...lic_kronos_docs_milestones.md._qurRXy3.js} | 2 +- ...ronos_docs_milestones.md._qurRXy3.lean.js} | 2 +- ...blic_kronos_docs_particles.md.BmR47K5y.js} | 2 +- ...kronos_docs_particles.md.BmR47K5y.lean.js} | 2 +- ...docs_subtabs-and-microtabs.md.NAJvWyOX.js} | 2 +- ...subtabs-and-microtabs.md.NAJvWyOX.lean.js} | 2 +- ...ees-and-tree-customization.md.DNSPCGw2.js} | 2 +- ...nd-tree-customization.md.DNSPCGw2.lean.js} | 2 +- ...c_kronos_docs_updating-tmt.md.F3HiFsfM.js} | 2 +- ...nos_docs_updating-tmt.md.F3HiFsfM.lean.js} | 2 +- ...ublic_kronos_docs_upgrades.md.CwGnjpZF.js} | 2 +- ..._kronos_docs_upgrades.md.CwGnjpZF.lean.js} | 2 +- ... Things_2.0-format-changes.md.C-yzF1yi.js} | 2 +- ...gs_2.0-format-changes.md.C-yzF1yi.lean.js} | 2 +- ...js => public_lit_changelog.md.O4pzFPx8.js} | 2 +- ... public_lit_changelog.md.O4pzFPx8.lean.js} | 2 +- ...lic_lit_docs_!general-info.md.Bx73xrHN.js} | 2 +- ...it_docs_!general-info.md.Bx73xrHN.lean.js} | 2 +- ...blic_lit_docs_achievements.md.Cz8mR7W2.js} | 2 +- ...lit_docs_achievements.md.Cz8mR7W2.lean.js} | 2 +- ...js => public_lit_docs_bars.md.B1zVageA.js} | 2 +- ... public_lit_docs_bars.md.B1zVageA.lean.js} | 2 +- ...docs_basic-layer-breakdown.md.CZbO_awH.js} | 2 +- ...basic-layer-breakdown.md.CZbO_awH.lean.js} | 2 +- ...> public_lit_docs_buyables.md.BSNB4_NL.js} | 2 +- ...lic_lit_docs_buyables.md.BSNB4_NL.lean.js} | 2 +- ...public_lit_docs_challenges.md.Ckyne6Wg.js} | 2 +- ...c_lit_docs_challenges.md.Ckyne6Wg.lean.js} | 2 +- ...public_lit_docs_clickables.md.XlVpmgOb.js} | 2 +- ...c_lit_docs_clickables.md.XlVpmgOb.lean.js} | 2 +- ...it_docs_custom-tab-layouts.md.RNFGijzw.js} | 2 +- ...cs_custom-tab-layouts.md.RNFGijzw.lean.js} | 2 +- ...c_lit_docs_getting-started.md.GyuAnbTP.js} | 2 +- ..._docs_getting-started.md.GyuAnbTP.lean.js} | 2 +- ... public_lit_docs_infoboxes.md.rD48WYz9.js} | 2 +- ...ic_lit_docs_infoboxes.md.rD48WYz9.lean.js} | 2 +- ...ic_lit_docs_layer-features.md.B06xG5cR.js} | 2 +- ...t_docs_layer-features.md.B06xG5cR.lean.js} | 2 +- ...lic_lit_docs_main-mod-info.md.DgSHm7mV.js} | 2 +- ...it_docs_main-mod-info.md.DgSHm7mV.lean.js} | 2 +- ...public_lit_docs_milestones.md.Cty1k_dD.js} | 2 +- ...c_lit_docs_milestones.md.Cty1k_dD.lean.js} | 2 +- ...docs_subtabs-and-microtabs.md.BRlF9GbR.js} | 2 +- ...subtabs-and-microtabs.md.BRlF9GbR.lean.js} | 2 +- ...ees-and-tree-customization.md.B4CePdZ2.js} | 2 +- ...nd-tree-customization.md.B4CePdZ2.lean.js} | 2 +- ...blic_lit_docs_updating-tmt.md.Bx5ufyRr.js} | 2 +- ...lit_docs_updating-tmt.md.Bx5ufyRr.lean.js} | 2 +- ...> public_lit_docs_upgrades.md.Bh4bFGTK.js} | 2 +- ...lic_lit_docs_upgrades.md.Bh4bFGTK.lean.js} | 2 +- changelog/index.html | 10 +- garden/activitypub/index.html | 10 +- garden/advent-incremental/index.html | 10 +- garden/atproto/index.html | 10 +- garden/babble-buds/index.html | 10 +- garden/capture-the-citadel/index.html | 10 +- garden/chat-glue/index.html | 10 +- garden/chronological/index.html | 10 +- garden/cinny/index.html | 10 +- garden/commune/index.html | 10 +- garden/davey-wreden/index.html | 10 +- garden/decentralized/index.html | 10 +- garden/dice-armor/index.html | 10 +- garden/digital-gardens/index.html | 10 +- garden/federated-identity/index.html | 10 +- garden/fedi-v2/index.html | 10 +- garden/fediverse/index.html | 10 +- garden/forgejo/index.html | 10 +- .../index.html | 10 +- garden/freeform/index.html | 10 +- garden/game-dev-tree/index.html | 10 +- garden/garden-rss/index.html | 10 +- .../appeal-to-developers/index.html | 10 +- .../appeal-to-players/index.html | 10 +- .../defining-the-genre/index.html | 10 +- garden/guide-to-incrementals/index.html | 10 +- .../navigating-criticism/index.html | 10 +- .../what-is-content/index.html | 10 +- garden/incremental-social/index.html | 10 +- garden/ivy-road/index.html | 10 +- garden/kronos/index.html | 10 +- garden/logseq/index.html | 10 +- garden/matrix/index.html | 10 +- garden/mbin/index.html | 10 +- garden/my-personal-website/index.html | 10 +- garden/my-projects/index.html | 10 +- garden/nostr/index.html | 10 +- garden/open-source/index.html | 10 +- garden/opti-speech/index.html | 10 +- garden/planar-pioneers/index.html | 10 +- garden/profectus/index.html | 10 +- garden/social-media/index.html | 10 +- garden/synapse/index.html | 10 +- garden/the-beginner-s-guide/index.html | 10 +- garden/the-cozy-web/index.html | 10 +- garden/the-small-web/index.html | 10 +- garden/this-knowledge-hub/index.html | 10 +- garden/v-ecs/index.html | 10 +- garden/vitepress/index.html | 10 +- garden/wanderstop/index.html | 10 +- garden/webrings/index.html | 10 +- garden/weird/index.html | 10 +- .../design/criticism/index.html | 6 +- guide-to-incrementals/index.html | 6 +- .../ludology/appeal-developers/index.html | 6 +- .../ludology/appeal-gamers/index.html | 6 +- .../ludology/content/index.html | 6 +- .../ludology/definition/index.html | 6 +- hashmap.json | 2 +- index.html | 8 +- public/gamedevtree/2.0-format-changes.html | 10 +- public/gamedevtree/README.html | 10 +- public/gamedevtree/changelog.html | 10 +- public/gamedevtree/docs/!general-info.html | 10 +- public/gamedevtree/docs/achievements.html | 10 +- public/gamedevtree/docs/bars.html | 10 +- .../docs/basic-layer-breakdown.html | 10 +- public/gamedevtree/docs/buyables.html | 10 +- public/gamedevtree/docs/challenges.html | 10 +- public/gamedevtree/docs/clickables.html | 10 +- .../gamedevtree/docs/custom-tab-layouts.html | 10 +- public/gamedevtree/docs/getting-started.html | 10 +- public/gamedevtree/docs/infoboxes.html | 10 +- public/gamedevtree/docs/layer-features.html | 10 +- public/gamedevtree/docs/main-mod-info.html | 10 +- public/gamedevtree/docs/milestones.html | 10 +- .../docs/subtabs-and-microtabs.html | 10 +- public/gamedevtree/docs/updating-tmt.html | 10 +- public/gamedevtree/docs/upgrades.html | 10 +- .../kronos/Old Things/2.0-format-changes.html | 10 +- public/kronos/README.html | 6 +- public/kronos/changelog.html | 10 +- public/kronos/docs/!general-info.html | 10 +- public/kronos/docs/achievements.html | 10 +- public/kronos/docs/bars.html | 10 +- public/kronos/docs/basic-layer-breakdown.html | 10 +- public/kronos/docs/buyables.html | 10 +- public/kronos/docs/challenges.html | 10 +- public/kronos/docs/clickables.html | 10 +- public/kronos/docs/custom-tab-layouts.html | 10 +- public/kronos/docs/getting-started.html | 10 +- public/kronos/docs/grids.html | 10 +- public/kronos/docs/infoboxes.html | 10 +- public/kronos/docs/layer-features.html | 10 +- public/kronos/docs/main-mod-info.html | 10 +- public/kronos/docs/milestones.html | 10 +- public/kronos/docs/particles.html | 10 +- public/kronos/docs/subtabs-and-microtabs.html | 10 +- .../docs/trees-and-tree-customization.html | 10 +- public/kronos/docs/updating-tmt.html | 10 +- public/kronos/docs/upgrades.html | 10 +- public/lit/Old Things/2.0-format-changes.html | 10 +- public/lit/README.html | 6 +- public/lit/changelog.html | 10 +- public/lit/docs/!general-info.html | 10 +- public/lit/docs/achievements.html | 10 +- public/lit/docs/bars.html | 10 +- public/lit/docs/basic-layer-breakdown.html | 10 +- public/lit/docs/buyables.html | 10 +- public/lit/docs/challenges.html | 10 +- public/lit/docs/clickables.html | 10 +- public/lit/docs/custom-tab-layouts.html | 10 +- public/lit/docs/getting-started.html | 10 +- public/lit/docs/infoboxes.html | 10 +- public/lit/docs/layer-features.html | 10 +- public/lit/docs/main-mod-info.html | 10 +- public/lit/docs/milestones.html | 10 +- public/lit/docs/subtabs-and-microtabs.html | 10 +- .../docs/trees-and-tree-customization.html | 10 +- public/lit/docs/updating-tmt.html | 10 +- public/lit/docs/upgrades.html | 10 +- sitemap.xml | 2 +- 352 files changed, 1293 insertions(+), 1293 deletions(-) rename assets/{app.fRTEzOm5.js => app.Cr-tMuRf.js} (95%) create mode 100644 assets/changelog_index.md.BUwKGXwi.js rename assets/{changelog_index.md.Bq0zUXhk.lean.js => changelog_index.md.BUwKGXwi.lean.js} (58%) delete mode 100644 assets/changelog_index.md.Bq0zUXhk.js rename assets/chunks/{theme.g7q6KECo.js => theme.BFUR2isj.js} (99%) delete mode 100644 assets/chunks/virtual_search-data.6Jzpy5HH.js create mode 100644 assets/chunks/virtual_search-data.CUABEQwy.js rename assets/{garden_activitypub_index.md.BBeMc1Gf.js => garden_activitypub_index.md.BKxKk1GM.js} (93%) rename assets/{garden_activitypub_index.md.BBeMc1Gf.lean.js => garden_activitypub_index.md.BKxKk1GM.lean.js} (88%) rename assets/{garden_advent-incremental_index.md.04u11BOM.js => garden_advent-incremental_index.md.Bi867NSD.js} (96%) rename assets/{garden_advent-incremental_index.md.04u11BOM.lean.js => garden_advent-incremental_index.md.Bi867NSD.lean.js} (89%) rename assets/{garden_atproto_index.md.-sODrTEJ.js => garden_atproto_index.md.BwFHx7Hd.js} (90%) rename assets/{garden_atproto_index.md.-sODrTEJ.lean.js => garden_atproto_index.md.BwFHx7Hd.lean.js} (77%) rename assets/{garden_babble-buds_index.md.BkMcku2S.js => garden_babble-buds_index.md.IVJV-9eu.js} (96%) rename assets/{garden_babble-buds_index.md.BkMcku2S.lean.js => garden_babble-buds_index.md.IVJV-9eu.lean.js} (88%) rename assets/{garden_capture-the-citadel_index.md.0xMEcFyt.js => garden_capture-the-citadel_index.md.CcwwplwM.js} (94%) rename assets/{garden_capture-the-citadel_index.md.0xMEcFyt.lean.js => garden_capture-the-citadel_index.md.CcwwplwM.lean.js} (89%) rename assets/{garden_chat-glue_index.md.BJK65pvS.js => garden_chat-glue_index.md.Cgbw8xnx.js} (94%) rename assets/{garden_chat-glue_index.md.BJK65pvS.lean.js => garden_chat-glue_index.md.Cgbw8xnx.lean.js} (87%) rename assets/{garden_chronological_index.md.DcD47fhh.js => garden_chronological_index.md.g8ZA0BlN.js} (95%) rename assets/{garden_chronological_index.md.DcD47fhh.lean.js => garden_chronological_index.md.g8ZA0BlN.lean.js} (88%) rename assets/{garden_cinny_index.md.rVS5Vh1G.js => garden_cinny_index.md.DjdgGx9N.js} (93%) rename assets/{garden_cinny_index.md.rVS5Vh1G.lean.js => garden_cinny_index.md.DjdgGx9N.lean.js} (87%) rename assets/{garden_commune_index.md.Dz4Z13kZ.js => garden_commune_index.md.Cz6o7qRH.js} (97%) rename assets/{garden_commune_index.md.Dz4Z13kZ.lean.js => garden_commune_index.md.Cz6o7qRH.lean.js} (87%) rename assets/{garden_davey-wreden_index.md.D5jOgDow.js => garden_davey-wreden_index.md.BMlE9hYd.js} (96%) rename assets/{garden_davey-wreden_index.md.D5jOgDow.lean.js => garden_davey-wreden_index.md.BMlE9hYd.lean.js} (88%) rename assets/{garden_decentralized_index.md.BsoUG57G.js => garden_decentralized_index.md.DuxiPg9M.js} (93%) rename assets/{garden_decentralized_index.md.BsoUG57G.lean.js => garden_decentralized_index.md.DuxiPg9M.lean.js} (77%) rename assets/{garden_dice-armor_index.md.DRqBzafS.js => garden_dice-armor_index.md.CztXuY1B.js} (99%) rename assets/{garden_dice-armor_index.md.DRqBzafS.lean.js => garden_dice-armor_index.md.CztXuY1B.lean.js} (89%) rename assets/{garden_digital-gardens_index.md.B2uLVFGz.js => garden_digital-gardens_index.md.ChW8RG51.js} (96%) rename assets/{garden_digital-gardens_index.md.B2uLVFGz.lean.js => garden_digital-gardens_index.md.ChW8RG51.lean.js} (90%) rename assets/{garden_federated-identity_index.md.DQgk_kzS.js => garden_federated-identity_index.md.Bf4QWuIq.js} (96%) rename assets/{garden_federated-identity_index.md.DQgk_kzS.lean.js => garden_federated-identity_index.md.Bf4QWuIq.lean.js} (89%) rename assets/{garden_fedi-v2_index.md.bYm2NX_V.js => garden_fedi-v2_index.md.B5ZguLke.js} (99%) rename assets/{garden_fedi-v2_index.md.bYm2NX_V.lean.js => garden_fedi-v2_index.md.B5ZguLke.lean.js} (87%) rename assets/{garden_fediverse_index.md.mvmrObxT.js => garden_fediverse_index.md.UJiYbaK2.js} (95%) rename assets/{garden_fediverse_index.md.mvmrObxT.lean.js => garden_fediverse_index.md.UJiYbaK2.lean.js} (89%) rename assets/{garden_forgejo_index.md.D0iEfYzP.js => garden_forgejo_index.md.BIFTMSC0.js} (93%) rename assets/{garden_forgejo_index.md.D0iEfYzP.lean.js => garden_forgejo_index.md.BIFTMSC0.lean.js} (87%) rename assets/{garden_freeform-vs-chronological-dichotomy_index.md.1DrtPCar.js => garden_freeform-vs-chronological-dichotomy_index.md.C3LSUlA6.js} (94%) rename assets/{garden_freeform-vs-chronological-dichotomy_index.md.1DrtPCar.lean.js => garden_freeform-vs-chronological-dichotomy_index.md.C3LSUlA6.lean.js} (90%) rename assets/{garden_freeform_index.md.Dpr_rnXh.js => garden_freeform_index.md.BLA-ZZ3B.js} (95%) rename assets/{garden_freeform_index.md.Dpr_rnXh.lean.js => garden_freeform_index.md.BLA-ZZ3B.lean.js} (87%) rename assets/{garden_game-dev-tree_index.md.1knpikM2.js => garden_game-dev-tree_index.md.DweE1Ysy.js} (90%) rename assets/{garden_game-dev-tree_index.md.1knpikM2.lean.js => garden_game-dev-tree_index.md.DweE1Ysy.lean.js} (77%) rename assets/{garden_garden-rss_index.md.BwhK0u3y.js => garden_garden-rss_index.md.CqqLm4uJ.js} (96%) rename assets/{garden_garden-rss_index.md.BwhK0u3y.lean.js => garden_garden-rss_index.md.CqqLm4uJ.lean.js} (87%) rename assets/{garden_guide-to-incrementals_appeal-to-developers_index.md.DZzqiW0T.js => garden_guide-to-incrementals_appeal-to-developers_index.md.C6gNawcM.js} (98%) rename assets/{garden_guide-to-incrementals_appeal-to-developers_index.md.DZzqiW0T.lean.js => garden_guide-to-incrementals_appeal-to-developers_index.md.C6gNawcM.lean.js} (91%) rename assets/{garden_guide-to-incrementals_appeal-to-players_index.md.Zt-2JIdI.js => garden_guide-to-incrementals_appeal-to-players_index.md.AIc2QesW.js} (99%) rename assets/{garden_guide-to-incrementals_appeal-to-players_index.md.Zt-2JIdI.lean.js => garden_guide-to-incrementals_appeal-to-players_index.md.AIc2QesW.lean.js} (90%) rename assets/{garden_guide-to-incrementals_defining-the-genre_index.md.Cqr_5G2y.js => garden_guide-to-incrementals_defining-the-genre_index.md.B-EmqxPI.js} (99%) rename assets/{garden_guide-to-incrementals_defining-the-genre_index.md.Cqr_5G2y.lean.js => garden_guide-to-incrementals_defining-the-genre_index.md.B-EmqxPI.lean.js} (90%) rename assets/{garden_guide-to-incrementals_index.md.CnQL84i-.js => garden_guide-to-incrementals_index.md.D-Qo_phb.js} (98%) rename assets/{garden_guide-to-incrementals_index.md.CnQL84i-.lean.js => garden_guide-to-incrementals_index.md.D-Qo_phb.lean.js} (89%) rename assets/{garden_guide-to-incrementals_navigating-criticism_index.md.4aLxw7wS.js => garden_guide-to-incrementals_navigating-criticism_index.md.Djt_EVT5.js} (98%) rename assets/{garden_guide-to-incrementals_navigating-criticism_index.md.4aLxw7wS.lean.js => garden_guide-to-incrementals_navigating-criticism_index.md.Djt_EVT5.lean.js} (91%) rename assets/{garden_guide-to-incrementals_what-is-content_index.md.D_VOmtEP.js => garden_guide-to-incrementals_what-is-content_index.md.A83vET_y.js} (99%) rename assets/{garden_guide-to-incrementals_what-is-content_index.md.D_VOmtEP.lean.js => garden_guide-to-incrementals_what-is-content_index.md.A83vET_y.lean.js} (90%) rename assets/{garden_incremental-social_index.md.CfME2gTU.js => garden_incremental-social_index.md.TlaPPmQO.js} (95%) rename assets/{garden_incremental-social_index.md.CfME2gTU.lean.js => garden_incremental-social_index.md.TlaPPmQO.lean.js} (89%) rename assets/{garden_ivy-road_index.md.31ClM7tv.js => garden_ivy-road_index.md.DK8swC5I.js} (94%) rename assets/{garden_ivy-road_index.md.31ClM7tv.lean.js => garden_ivy-road_index.md.DK8swC5I.lean.js} (88%) rename assets/{garden_kronos_index.md.DD5fELK_.js => garden_kronos_index.md.B-JAOjIb.js} (95%) rename assets/{garden_kronos_index.md.DD5fELK_.lean.js => garden_kronos_index.md.B-JAOjIb.lean.js} (88%) rename assets/{garden_logseq_index.md.uO2Fr5Gt.js => garden_logseq_index.md.Sw_XpNVJ.js} (92%) rename assets/{garden_logseq_index.md.uO2Fr5Gt.lean.js => garden_logseq_index.md.Sw_XpNVJ.lean.js} (87%) rename assets/{garden_matrix_index.md.DSfu06km.js => garden_matrix_index.md.B4VZfP7W.js} (93%) rename assets/{garden_matrix_index.md.DSfu06km.lean.js => garden_matrix_index.md.B4VZfP7W.lean.js} (87%) rename assets/{garden_mbin_index.md.BCeJHUKa.js => garden_mbin_index.md.DHRumvWR.js} (87%) rename assets/{garden_mbin_index.md.BCeJHUKa.lean.js => garden_mbin_index.md.DHRumvWR.lean.js} (74%) rename assets/{garden_my-personal-website_index.md.DbCoVJwI.js => garden_my-personal-website_index.md.DryeDwGD.js} (93%) rename assets/{garden_my-personal-website_index.md.DbCoVJwI.lean.js => garden_my-personal-website_index.md.DryeDwGD.lean.js} (89%) rename assets/{garden_my-projects_index.md.kS6uq5l_.js => garden_my-projects_index.md.efagz0SF.js} (97%) rename assets/{garden_my-projects_index.md.kS6uq5l_.lean.js => garden_my-projects_index.md.efagz0SF.lean.js} (88%) rename assets/{garden_nostr_index.md.lCBdDjSu.js => garden_nostr_index.md.CnVfHGYc.js} (93%) rename assets/{garden_nostr_index.md.lCBdDjSu.lean.js => garden_nostr_index.md.CnVfHGYc.lean.js} (87%) rename assets/{garden_open-source_index.md.BrIASRsU.js => garden_open-source_index.md.DFsY5O5E.js} (95%) rename assets/{garden_open-source_index.md.BrIASRsU.lean.js => garden_open-source_index.md.DFsY5O5E.lean.js} (88%) rename assets/{garden_opti-speech_index.md.C0T7MKQx.js => garden_opti-speech_index.md.C1FMxL_Q.js} (98%) rename assets/{garden_opti-speech_index.md.C0T7MKQx.lean.js => garden_opti-speech_index.md.C1FMxL_Q.lean.js} (95%) rename assets/{garden_planar-pioneers_index.md.6LR6SQYR.js => garden_planar-pioneers_index.md.DjRmOjdq.js} (95%) rename assets/{garden_planar-pioneers_index.md.6LR6SQYR.lean.js => garden_planar-pioneers_index.md.DjRmOjdq.lean.js} (89%) rename assets/{garden_profectus_index.md.Y8HQeYK8.js => garden_profectus_index.md.0UR_Gmo7.js} (96%) rename assets/{garden_profectus_index.md.Y8HQeYK8.lean.js => garden_profectus_index.md.0UR_Gmo7.lean.js} (88%) rename assets/{garden_social-media_index.md.CxiS8Ne_.js => garden_social-media_index.md.CZWs3kNq.js} (96%) rename assets/{garden_social-media_index.md.CxiS8Ne_.lean.js => garden_social-media_index.md.CZWs3kNq.lean.js} (88%) rename assets/{garden_synapse_index.md.6c0_vLtD.js => garden_synapse_index.md.DlkipkaT.js} (93%) rename assets/{garden_synapse_index.md.6c0_vLtD.lean.js => garden_synapse_index.md.DlkipkaT.lean.js} (87%) rename assets/{garden_the-beginner-s-guide_index.md.BejdJHJA.js => garden_the-beginner-s-guide_index.md.vCAvuQfF.js} (96%) rename assets/{garden_the-beginner-s-guide_index.md.BejdJHJA.lean.js => garden_the-beginner-s-guide_index.md.vCAvuQfF.lean.js} (89%) rename assets/{garden_the-cozy-web_index.md.C1ibMFr-.js => garden_the-cozy-web_index.md.C9yKvylk.js} (95%) rename assets/{garden_the-cozy-web_index.md.C1ibMFr-.lean.js => garden_the-cozy-web_index.md.C9yKvylk.lean.js} (88%) rename assets/{garden_the-small-web_index.md.CCPoKGQN.js => garden_the-small-web_index.md.2RHAQRcF.js} (99%) rename assets/{garden_the-small-web_index.md.CCPoKGQN.lean.js => garden_the-small-web_index.md.2RHAQRcF.lean.js} (92%) rename assets/{garden_this-knowledge-hub_index.md.C_VS46AX.js => garden_this-knowledge-hub_index.md.BtDJLJGY.js} (96%) rename assets/{garden_this-knowledge-hub_index.md.C_VS46AX.lean.js => garden_this-knowledge-hub_index.md.BtDJLJGY.lean.js} (88%) rename assets/{garden_v-ecs_index.md.BMdd2G-v.js => garden_v-ecs_index.md.CeXiyFwA.js} (97%) rename assets/{garden_v-ecs_index.md.BMdd2G-v.lean.js => garden_v-ecs_index.md.CeXiyFwA.lean.js} (88%) rename assets/{garden_vitepress_index.md.DwDwogUe.js => garden_vitepress_index.md.6SyjaoK2.js} (93%) rename assets/{garden_vitepress_index.md.DwDwogUe.lean.js => garden_vitepress_index.md.6SyjaoK2.lean.js} (87%) rename assets/{garden_wanderstop_index.md.osEdKtZT.js => garden_wanderstop_index.md.fcx7CNrA.js} (93%) rename assets/{garden_wanderstop_index.md.osEdKtZT.lean.js => garden_wanderstop_index.md.fcx7CNrA.lean.js} (88%) rename assets/{garden_webrings_index.md.DDDfYflF.js => garden_webrings_index.md.57x1ZkEg.js} (96%) rename assets/{garden_webrings_index.md.DDDfYflF.lean.js => garden_webrings_index.md.57x1ZkEg.lean.js} (87%) rename assets/{garden_weird_index.md.DlZUcsA4.js => garden_weird_index.md.Bd7l3f9l.js} (95%) rename assets/{garden_weird_index.md.DlZUcsA4.lean.js => garden_weird_index.md.Bd7l3f9l.lean.js} (87%) rename assets/{index.md.CrdqXg4F.js => index.md.DdYa43X-.js} (94%) rename assets/{index.md.CrdqXg4F.lean.js => index.md.DdYa43X-.lean.js} (94%) rename assets/{public_gamedevtree_2.0-format-changes.md.BJWVbIw2.js => public_gamedevtree_2.0-format-changes.md.Cu7Ykz4Q.js} (96%) rename assets/{public_gamedevtree_2.0-format-changes.md.BJWVbIw2.lean.js => public_gamedevtree_2.0-format-changes.md.Cu7Ykz4Q.lean.js} (87%) rename assets/{public_gamedevtree_README.md.BcJ-DaYW.js => public_gamedevtree_README.md.D0kWmw3r.js} (94%) rename assets/{public_gamedevtree_README.md.BcJ-DaYW.lean.js => public_gamedevtree_README.md.D0kWmw3r.lean.js} (94%) rename assets/{public_gamedevtree_changelog.md.yaSdB86a.js => public_gamedevtree_changelog.md.BVckBzUe.js} (98%) rename assets/{public_gamedevtree_changelog.md.yaSdB86a.lean.js => public_gamedevtree_changelog.md.BVckBzUe.lean.js} (86%) rename assets/{public_gamedevtree_docs_!general-info.md.60si-HlW.js => public_gamedevtree_docs_!general-info.md.WzWHA4Zz.js} (98%) rename assets/{public_gamedevtree_docs_!general-info.md.60si-HlW.lean.js => public_gamedevtree_docs_!general-info.md.WzWHA4Zz.lean.js} (87%) rename assets/{public_gamedevtree_docs_achievements.md.Byb7DjwU.js => public_gamedevtree_docs_achievements.md.BgY9AsGa.js} (98%) rename assets/{public_gamedevtree_docs_achievements.md.Byb7DjwU.lean.js => public_gamedevtree_docs_achievements.md.BgY9AsGa.lean.js} (86%) rename assets/{public_gamedevtree_docs_bars.md.BOkZNfjK.js => public_gamedevtree_docs_bars.md.DbswOg3L.js} (98%) rename assets/{public_gamedevtree_docs_bars.md.BOkZNfjK.lean.js => public_gamedevtree_docs_bars.md.DbswOg3L.lean.js} (85%) rename assets/{public_gamedevtree_docs_basic-layer-breakdown.md.Lt_Kak5C.js => public_gamedevtree_docs_basic-layer-breakdown.md.DlASwD5Q.js} (98%) rename assets/{public_gamedevtree_docs_basic-layer-breakdown.md.Lt_Kak5C.lean.js => public_gamedevtree_docs_basic-layer-breakdown.md.DlASwD5Q.lean.js} (75%) rename assets/{public_gamedevtree_docs_buyables.md.Bdb3l1uw.js => public_gamedevtree_docs_buyables.md.Bu_8Had0.js} (99%) rename assets/{public_gamedevtree_docs_buyables.md.Bdb3l1uw.lean.js => public_gamedevtree_docs_buyables.md.Bu_8Had0.lean.js} (86%) rename assets/{public_gamedevtree_docs_challenges.md.BsXIWoTI.js => public_gamedevtree_docs_challenges.md.BFQDD4X0.js} (99%) rename assets/{public_gamedevtree_docs_challenges.md.BsXIWoTI.lean.js => public_gamedevtree_docs_challenges.md.BFQDD4X0.lean.js} (86%) rename assets/{public_gamedevtree_docs_clickables.md.CYP_r85U.js => public_gamedevtree_docs_clickables.md.9UR7Ajqa.js} (98%) rename assets/{public_gamedevtree_docs_clickables.md.CYP_r85U.lean.js => public_gamedevtree_docs_clickables.md.9UR7Ajqa.lean.js} (86%) rename assets/{public_gamedevtree_docs_custom-tab-layouts.md.DXFeTlpj.js => public_gamedevtree_docs_custom-tab-layouts.md.CuvyVAhF.js} (99%) rename assets/{public_gamedevtree_docs_custom-tab-layouts.md.DXFeTlpj.lean.js => public_gamedevtree_docs_custom-tab-layouts.md.CuvyVAhF.lean.js} (87%) rename assets/{public_gamedevtree_docs_getting-started.md.53r6S_jZ.js => public_gamedevtree_docs_getting-started.md.CO6xRZs4.js} (98%) rename assets/{public_gamedevtree_docs_getting-started.md.53r6S_jZ.lean.js => public_gamedevtree_docs_getting-started.md.CO6xRZs4.lean.js} (87%) rename assets/{public_gamedevtree_docs_infoboxes.md.u7lbf1fe.js => public_gamedevtree_docs_infoboxes.md.CRUxoh5g.js} (98%) rename assets/{public_gamedevtree_docs_infoboxes.md.u7lbf1fe.lean.js => public_gamedevtree_docs_infoboxes.md.CRUxoh5g.lean.js} (86%) rename assets/{public_gamedevtree_docs_layer-features.md.BBomRnin.js => public_gamedevtree_docs_layer-features.md.DSg6NDQu.js} (99%) rename assets/{public_gamedevtree_docs_layer-features.md.BBomRnin.lean.js => public_gamedevtree_docs_layer-features.md.DSg6NDQu.lean.js} (87%) rename assets/{public_gamedevtree_docs_main-mod-info.md.CzntOXuT.js => public_gamedevtree_docs_main-mod-info.md.6LyBs-t5.js} (99%) rename assets/{public_gamedevtree_docs_main-mod-info.md.CzntOXuT.lean.js => public_gamedevtree_docs_main-mod-info.md.6LyBs-t5.lean.js} (86%) rename assets/{public_gamedevtree_docs_milestones.md.Phzy1O6H.js => public_gamedevtree_docs_milestones.md.BmAGhs_0.js} (98%) rename assets/{public_gamedevtree_docs_milestones.md.Phzy1O6H.lean.js => public_gamedevtree_docs_milestones.md.BmAGhs_0.lean.js} (86%) rename assets/{public_gamedevtree_docs_subtabs-and-microtabs.md.D3v8JvXX.js => public_gamedevtree_docs_subtabs-and-microtabs.md.C4QzwvQW.js} (97%) rename assets/{public_gamedevtree_docs_subtabs-and-microtabs.md.D3v8JvXX.lean.js => public_gamedevtree_docs_subtabs-and-microtabs.md.C4QzwvQW.lean.js} (75%) rename assets/{public_gamedevtree_docs_updating-tmt.md.Cym0rRYz.js => public_gamedevtree_docs_updating-tmt.md.DGbxasx9.js} (97%) rename assets/{public_gamedevtree_docs_updating-tmt.md.Cym0rRYz.lean.js => public_gamedevtree_docs_updating-tmt.md.DGbxasx9.lean.js} (87%) rename assets/{public_gamedevtree_docs_upgrades.md.hegmaS21.js => public_gamedevtree_docs_upgrades.md.DZ8OZlWu.js} (98%) rename assets/{public_gamedevtree_docs_upgrades.md.hegmaS21.lean.js => public_gamedevtree_docs_upgrades.md.DZ8OZlWu.lean.js} (86%) rename assets/{public_kronos_Old Things_2.0-format-changes.md.B6DTr0jJ.js => public_kronos_Old Things_2.0-format-changes.md.NRns2BBm.js} (97%) rename assets/{public_kronos_Old Things_2.0-format-changes.md.B6DTr0jJ.lean.js => public_kronos_Old Things_2.0-format-changes.md.NRns2BBm.lean.js} (87%) rename assets/{public_kronos_changelog.md.paCgtsXh.js => public_kronos_changelog.md.CKFBbvc8.js} (99%) rename assets/{public_kronos_changelog.md.paCgtsXh.lean.js => public_kronos_changelog.md.CKFBbvc8.lean.js} (86%) rename assets/{public_kronos_docs_!general-info.md.DvOjN6Rt.js => public_kronos_docs_!general-info.md.BpKUMbLF.js} (99%) rename assets/{public_kronos_docs_!general-info.md.DvOjN6Rt.lean.js => public_kronos_docs_!general-info.md.BpKUMbLF.lean.js} (86%) rename assets/{public_kronos_docs_achievements.md.B2ZLvQuE.js => public_kronos_docs_achievements.md.CV5RQN-f.js} (98%) rename assets/{public_kronos_docs_achievements.md.B2ZLvQuE.lean.js => public_kronos_docs_achievements.md.CV5RQN-f.lean.js} (86%) rename assets/{public_kronos_docs_bars.md.JgNsk6mY.js => public_kronos_docs_bars.md.DYrBr3p3.js} (97%) rename assets/{public_kronos_docs_bars.md.JgNsk6mY.lean.js => public_kronos_docs_bars.md.DYrBr3p3.lean.js} (71%) rename assets/{public_kronos_docs_basic-layer-breakdown.md.MMKYyoj1.js => public_kronos_docs_basic-layer-breakdown.md.CKcXGVzo.js} (99%) rename assets/{public_kronos_docs_basic-layer-breakdown.md.MMKYyoj1.lean.js => public_kronos_docs_basic-layer-breakdown.md.CKcXGVzo.lean.js} (87%) rename assets/{public_kronos_docs_buyables.md.DApk6nw5.js => public_kronos_docs_buyables.md.Clz5ovuw.js} (99%) rename assets/{public_kronos_docs_buyables.md.DApk6nw5.lean.js => public_kronos_docs_buyables.md.Clz5ovuw.lean.js} (86%) rename assets/{public_kronos_docs_challenges.md.Cn9Xc7xE.js => public_kronos_docs_challenges.md.xjts-SLB.js} (99%) rename assets/{public_kronos_docs_challenges.md.Cn9Xc7xE.lean.js => public_kronos_docs_challenges.md.xjts-SLB.lean.js} (86%) rename assets/{public_kronos_docs_clickables.md.BzXBLTUl.js => public_kronos_docs_clickables.md.CwRD8HLA.js} (98%) rename assets/{public_kronos_docs_clickables.md.BzXBLTUl.lean.js => public_kronos_docs_clickables.md.CwRD8HLA.lean.js} (86%) rename assets/{public_kronos_docs_custom-tab-layouts.md.BbyIoWME.js => public_kronos_docs_custom-tab-layouts.md.DQLQaGen.js} (99%) rename assets/{public_kronos_docs_custom-tab-layouts.md.BbyIoWME.lean.js => public_kronos_docs_custom-tab-layouts.md.DQLQaGen.lean.js} (87%) rename assets/{public_kronos_docs_getting-started.md.CQfW9cEX.js => public_kronos_docs_getting-started.md.CvyktqWn.js} (98%) rename assets/{public_kronos_docs_getting-started.md.CQfW9cEX.lean.js => public_kronos_docs_getting-started.md.CvyktqWn.lean.js} (86%) rename assets/{public_kronos_docs_grids.md.3_YSBuDO.js => public_kronos_docs_grids.md.D6eGDxZf.js} (99%) rename assets/{public_kronos_docs_grids.md.3_YSBuDO.lean.js => public_kronos_docs_grids.md.D6eGDxZf.lean.js} (85%) rename assets/{public_kronos_docs_infoboxes.md.DpZxLNRR.js => public_kronos_docs_infoboxes.md.d7yspWU6.js} (98%) rename assets/{public_kronos_docs_infoboxes.md.DpZxLNRR.lean.js => public_kronos_docs_infoboxes.md.d7yspWU6.lean.js} (86%) rename assets/{public_kronos_docs_layer-features.md.Bz9OYgri.js => public_kronos_docs_layer-features.md.CUYPvQ75.js} (99%) rename assets/{public_kronos_docs_layer-features.md.Bz9OYgri.lean.js => public_kronos_docs_layer-features.md.CUYPvQ75.lean.js} (86%) rename assets/{public_kronos_docs_main-mod-info.md.ByNe_g0w.js => public_kronos_docs_main-mod-info.md.59FtHiDt.js} (99%) rename assets/{public_kronos_docs_main-mod-info.md.ByNe_g0w.lean.js => public_kronos_docs_main-mod-info.md.59FtHiDt.lean.js} (86%) rename assets/{public_kronos_docs_milestones.md.D2as2Rdw.js => public_kronos_docs_milestones.md._qurRXy3.js} (98%) rename assets/{public_kronos_docs_milestones.md.D2as2Rdw.lean.js => public_kronos_docs_milestones.md._qurRXy3.lean.js} (86%) rename assets/{public_kronos_docs_particles.md.DkE7U5GT.js => public_kronos_docs_particles.md.BmR47K5y.js} (99%) rename assets/{public_kronos_docs_particles.md.DkE7U5GT.lean.js => public_kronos_docs_particles.md.BmR47K5y.lean.js} (86%) rename assets/{public_kronos_docs_subtabs-and-microtabs.md.Bqm7YUXh.js => public_kronos_docs_subtabs-and-microtabs.md.NAJvWyOX.js} (99%) rename assets/{public_kronos_docs_subtabs-and-microtabs.md.Bqm7YUXh.lean.js => public_kronos_docs_subtabs-and-microtabs.md.NAJvWyOX.lean.js} (87%) rename assets/{public_kronos_docs_trees-and-tree-customization.md.DZzDglty.js => public_kronos_docs_trees-and-tree-customization.md.DNSPCGw2.js} (98%) rename assets/{public_kronos_docs_trees-and-tree-customization.md.DZzDglty.lean.js => public_kronos_docs_trees-and-tree-customization.md.DNSPCGw2.lean.js} (88%) rename assets/{public_kronos_docs_updating-tmt.md.B2tZSHuA.js => public_kronos_docs_updating-tmt.md.F3HiFsfM.js} (97%) rename assets/{public_kronos_docs_updating-tmt.md.B2tZSHuA.lean.js => public_kronos_docs_updating-tmt.md.F3HiFsfM.lean.js} (86%) rename assets/{public_kronos_docs_upgrades.md.5OAqntPP.js => public_kronos_docs_upgrades.md.CwGnjpZF.js} (98%) rename assets/{public_kronos_docs_upgrades.md.5OAqntPP.lean.js => public_kronos_docs_upgrades.md.CwGnjpZF.lean.js} (86%) rename assets/{public_lit_Old Things_2.0-format-changes.md.y8RAczqh.js => public_lit_Old Things_2.0-format-changes.md.C-yzF1yi.js} (97%) rename assets/{public_lit_Old Things_2.0-format-changes.md.y8RAczqh.lean.js => public_lit_Old Things_2.0-format-changes.md.C-yzF1yi.lean.js} (87%) rename assets/{public_lit_changelog.md.Dj7fgFUm.js => public_lit_changelog.md.O4pzFPx8.js} (99%) rename assets/{public_lit_changelog.md.Dj7fgFUm.lean.js => public_lit_changelog.md.O4pzFPx8.lean.js} (85%) rename assets/{public_lit_docs_!general-info.md.CDTQvlu3.js => public_lit_docs_!general-info.md.Bx73xrHN.js} (99%) rename assets/{public_lit_docs_!general-info.md.CDTQvlu3.lean.js => public_lit_docs_!general-info.md.Bx73xrHN.lean.js} (86%) rename assets/{public_lit_docs_achievements.md.z7uTtaPO.js => public_lit_docs_achievements.md.Cz8mR7W2.js} (98%) rename assets/{public_lit_docs_achievements.md.z7uTtaPO.lean.js => public_lit_docs_achievements.md.Cz8mR7W2.lean.js} (86%) rename assets/{public_lit_docs_bars.md.hc6LT70W.js => public_lit_docs_bars.md.B1zVageA.js} (97%) rename assets/{public_lit_docs_bars.md.hc6LT70W.lean.js => public_lit_docs_bars.md.B1zVageA.lean.js} (70%) rename assets/{public_lit_docs_basic-layer-breakdown.md.CqbgegVm.js => public_lit_docs_basic-layer-breakdown.md.CZbO_awH.js} (99%) rename assets/{public_lit_docs_basic-layer-breakdown.md.CqbgegVm.lean.js => public_lit_docs_basic-layer-breakdown.md.CZbO_awH.lean.js} (87%) rename assets/{public_lit_docs_buyables.md.DilfnDIO.js => public_lit_docs_buyables.md.BSNB4_NL.js} (99%) rename assets/{public_lit_docs_buyables.md.DilfnDIO.lean.js => public_lit_docs_buyables.md.BSNB4_NL.lean.js} (85%) rename assets/{public_lit_docs_challenges.md.FvqZDXVG.js => public_lit_docs_challenges.md.Ckyne6Wg.js} (99%) rename assets/{public_lit_docs_challenges.md.FvqZDXVG.lean.js => public_lit_docs_challenges.md.Ckyne6Wg.lean.js} (86%) rename assets/{public_lit_docs_clickables.md.D9eesbmM.js => public_lit_docs_clickables.md.XlVpmgOb.js} (98%) rename assets/{public_lit_docs_clickables.md.D9eesbmM.lean.js => public_lit_docs_clickables.md.XlVpmgOb.lean.js} (86%) rename assets/{public_lit_docs_custom-tab-layouts.md.BYNeuJZ1.js => public_lit_docs_custom-tab-layouts.md.RNFGijzw.js} (99%) rename assets/{public_lit_docs_custom-tab-layouts.md.BYNeuJZ1.lean.js => public_lit_docs_custom-tab-layouts.md.RNFGijzw.lean.js} (86%) rename assets/{public_lit_docs_getting-started.md.MYuuOf2Q.js => public_lit_docs_getting-started.md.GyuAnbTP.js} (98%) rename assets/{public_lit_docs_getting-started.md.MYuuOf2Q.lean.js => public_lit_docs_getting-started.md.GyuAnbTP.lean.js} (86%) rename assets/{public_lit_docs_infoboxes.md.Be2LqzDD.js => public_lit_docs_infoboxes.md.rD48WYz9.js} (98%) rename assets/{public_lit_docs_infoboxes.md.Be2LqzDD.lean.js => public_lit_docs_infoboxes.md.rD48WYz9.lean.js} (85%) rename assets/{public_lit_docs_layer-features.md.BSLdBpI-.js => public_lit_docs_layer-features.md.B06xG5cR.js} (99%) rename assets/{public_lit_docs_layer-features.md.BSLdBpI-.lean.js => public_lit_docs_layer-features.md.B06xG5cR.lean.js} (86%) rename assets/{public_lit_docs_main-mod-info.md.CUo3Y8ir.js => public_lit_docs_main-mod-info.md.DgSHm7mV.js} (99%) rename assets/{public_lit_docs_main-mod-info.md.CUo3Y8ir.lean.js => public_lit_docs_main-mod-info.md.DgSHm7mV.lean.js} (86%) rename assets/{public_lit_docs_milestones.md.DKpEd4GK.js => public_lit_docs_milestones.md.Cty1k_dD.js} (98%) rename assets/{public_lit_docs_milestones.md.DKpEd4GK.lean.js => public_lit_docs_milestones.md.Cty1k_dD.lean.js} (85%) rename assets/{public_lit_docs_subtabs-and-microtabs.md.CICoMMMb.js => public_lit_docs_subtabs-and-microtabs.md.BRlF9GbR.js} (99%) rename assets/{public_lit_docs_subtabs-and-microtabs.md.CICoMMMb.lean.js => public_lit_docs_subtabs-and-microtabs.md.BRlF9GbR.lean.js} (87%) rename assets/{public_lit_docs_trees-and-tree-customization.md.CWsN4p6Q.js => public_lit_docs_trees-and-tree-customization.md.B4CePdZ2.js} (98%) rename assets/{public_lit_docs_trees-and-tree-customization.md.CWsN4p6Q.lean.js => public_lit_docs_trees-and-tree-customization.md.B4CePdZ2.lean.js} (87%) rename assets/{public_lit_docs_updating-tmt.md.K90Uh1tC.js => public_lit_docs_updating-tmt.md.Bx5ufyRr.js} (97%) rename assets/{public_lit_docs_updating-tmt.md.K90Uh1tC.lean.js => public_lit_docs_updating-tmt.md.Bx5ufyRr.lean.js} (86%) rename assets/{public_lit_docs_upgrades.md.DnP9Av1u.js => public_lit_docs_upgrades.md.Bh4bFGTK.js} (99%) rename assets/{public_lit_docs_upgrades.md.DnP9Av1u.lean.js => public_lit_docs_upgrades.md.Bh4bFGTK.lean.js} (85%) diff --git a/404.html b/404.html index c67d4f0d..1cc1a3f2 100644 --- a/404.html +++ b/404.html @@ -8,7 +8,7 @@ - + @@ -20,7 +20,7 @@
- + \ No newline at end of file diff --git a/assets/app.fRTEzOm5.js b/assets/app.Cr-tMuRf.js similarity index 95% rename from assets/app.fRTEzOm5.js rename to assets/app.Cr-tMuRf.js index aa733a3e..f38137d0 100644 --- a/assets/app.fRTEzOm5.js +++ b/assets/app.Cr-tMuRf.js @@ -1 +1 @@ -import{U as o,ar as p,as as u,at as l,au as c,av as f,aw as d,ax as m,ay as h,az as A,aA as g,d as v,u as y,y as P,x as w,aB as C,aC as R,aD as b,a8 as E}from"./chunks/framework.D8PMdl4T.js";import{R as S}from"./chunks/theme.g7q6KECo.js";function i(e){if(e.extends){const a=i(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=i(S),T=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return P(()=>{w(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&C(),R(),b(),s.setup&&s.setup(),()=>E(s.Layout)}});async function _(){globalThis.__VITEPRESS__=!0;const e=D(),a=x();a.provide(u,e);const t=l(e.route);return a.provide(c,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function x(){return h(T)}function D(){let e=o,a;return A(t=>{let n=g(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&_().then(({app:e,router:a,data:t})=>{a.go().then(()=>{p(a.route,t.site),e.mount("#app")})});export{_ as createApp}; +import{U as o,ar as p,as as u,at as l,au as c,av as f,aw as d,ax as m,ay as h,az as A,aA as g,d as v,u as y,y as P,x as w,aB as C,aC as R,aD as b,a8 as E}from"./chunks/framework.D8PMdl4T.js";import{R as S}from"./chunks/theme.BFUR2isj.js";function i(e){if(e.extends){const a=i(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=i(S),T=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return P(()=>{w(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&C(),R(),b(),s.setup&&s.setup(),()=>E(s.Layout)}});async function _(){globalThis.__VITEPRESS__=!0;const e=D(),a=x();a.provide(u,e);const t=l(e.route);return a.provide(c,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function x(){return h(T)}function D(){let e=o,a;return A(t=>{let n=g(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&_().then(({app:e,router:a,data:t})=>{a.go().then(()=>{p(a.route,t.site),e.mount("#app")})});export{_ as createApp}; diff --git a/assets/changelog_index.md.BUwKGXwi.js b/assets/changelog_index.md.BUwKGXwi.js new file mode 100644 index 00000000..c5fdf03b --- /dev/null +++ b/assets/changelog_index.md.BUwKGXwi.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Changelog","description":"","frontmatter":{"title":"Changelog","prev":false,"next":false},"headers":[],"relativePath":"changelog/index.md","filePath":"changelog/index.md","lastUpdated":null}'),d={name:"changelog/index.md"},n=r('

Changelog

This feed starts when I formatted the site to be a Digital Garden. If you'd like to look further into this site's history, check here!

Update the-small-web There's some new pages that are not quite ready yet, so I left those out

Pushed on

PageChanges
the-small-web14 +++++++++++---

1 file changed, 11 insertions(+), 3 deletions(-)

Update garden

Pushed on

PageChanges
digital-gardens2 +-
fedi-v23 ++-
the-small-web81 ++++++++++++++++++++++++++++++++++++++------------------------------

3 files changed, 48 insertions(+), 38 deletions(-)

Update garden pages

Pushed on

PageChanges
activitypub2 ++
advent-incremental2 ++
atproto2 ++
babble-buds2 ++
capture-the-citadel2 ++
chat-glue2 ++
chronological2 ++
cinny2 ++
commune2 ++
decentralized2 ++
dice-armor2 ++
digital-gardens2 ++
federated-identity2 ++
fedi-v230 ++++++++++++++++++++++++------
fediverse2 ++
forgejo2 ++
freeform-vs-chronological-dichotomy2 ++
freeform2 ++
game-dev-tree2 ++
garden-rss4 +++-
guide-to-incrementals/appeal-to-developers2 ++
guide-to-incrementals/appeal-to-players6 ++++--
guide-to-incrementals/defining-the-genre6 ++++--
guide-to-incrementals2 ++
guide-to-incrementals/navigating-criticism2 ++
guide-to-incrementals/what-is-content4 +++-
incremental-social2 ++
kronos2 ++
logseq2 ++
matrix2 ++
mbin2 ++
my-personal-website2 ++
my-projects2 ++
nostr2 ++
open-source2 ++
opti-speech2 ++
planar-pioneers2 ++
profectus4 +++-
social-media2 ++
synapse2 ++
the-cozy-web2 ++
the-small-web2 ++
this-knowledge-hub3 +++
v-ecs2 ++
vitepress2 ++
webrings2 ++
weird2 ++

47 files changed, 124 insertions(+), 13 deletions(-)

Make garden tracked via git

Pushed on

PageChanges
activitypub13 ++++
advent-incremental21 ++++++
atproto18 +++++
babble-buds22 +++++++
capture-the-citadel15 +++++
chat-glue12 ++++
chronological21 ++++++
cinny10 +++
commune33 ++++++++++
decentralized28 ++++++++
dice-armor55 ++++++++++++++++
digital-gardens20 ++++++
federated-identity23 +++++++
fedi-v295 +++++++++++++++++++++++++++
fediverse21 ++++++
forgejo10 +++
freeform-vs-chronological-dichotomy10 +++
freeform17 +++++
game-dev-tree17 +++++
garden-rss22 +++++++
guide-to-incrementals/appeal-to-developers30 +++++++++
guide-to-incrementals/appeal-to-players60 +++++++++++++++++
guide-to-incrementals/defining-the-genre141 ++++++++++++++++++++++++++++++++++++++++
guide-to-incrementals27 ++++++++
guide-to-incrementals/navigating-criticism26 ++++++++
guide-to-incrementals/what-is-content52 +++++++++++++++
incremental-social16 +++++
kronos18 +++++
logseq10 +++
matrix10 +++
mbin12 ++++
my-personal-website10 +++
my-projects27 ++++++++
nostr13 ++++
open-source12 ++++
opti-speech37 +++++++++++
planar-pioneers15 +++++
profectus24 +++++++
social-media25 +++++++
synapse10 +++
the-cozy-web16 +++++
the-small-web58 +++++++++++++++++
this-knowledge-hub22 +++++++
v-ecs25 +++++++
vitepress10 +++
webrings25 +++++++
weird12 ++++

47 files changed, 1226 insertions(+)

',1),s=[n];function o(l,p,c,i,h,g){return a(),e("div",null,s)}const m=t(d,[["render",o]]);export{f as __pageData,m as default}; diff --git a/assets/changelog_index.md.Bq0zUXhk.lean.js b/assets/changelog_index.md.BUwKGXwi.lean.js similarity index 58% rename from assets/changelog_index.md.Bq0zUXhk.lean.js rename to assets/changelog_index.md.BUwKGXwi.lean.js index 86c56659..c6c23a41 100644 --- a/assets/changelog_index.md.Bq0zUXhk.lean.js +++ b/assets/changelog_index.md.BUwKGXwi.lean.js @@ -1 +1 @@ -import{_ as t,c as e,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Changelog","description":"","frontmatter":{"title":"Changelog","prev":false,"next":false},"headers":[],"relativePath":"changelog/index.md","filePath":"changelog/index.md","lastUpdated":null}'),d={name:"changelog/index.md"},n=r("",1),s=[n];function o(l,p,c,i,g,h){return a(),e("div",null,s)}const m=t(d,[["render",o]]);export{y as __pageData,m as default}; +import{_ as t,c as e,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Changelog","description":"","frontmatter":{"title":"Changelog","prev":false,"next":false},"headers":[],"relativePath":"changelog/index.md","filePath":"changelog/index.md","lastUpdated":null}'),d={name:"changelog/index.md"},n=r("",1),s=[n];function o(l,p,c,i,h,g){return a(),e("div",null,s)}const m=t(d,[["render",o]]);export{f as __pageData,m as default}; diff --git a/assets/changelog_index.md.Bq0zUXhk.js b/assets/changelog_index.md.Bq0zUXhk.js deleted file mode 100644 index b15eada4..00000000 --- a/assets/changelog_index.md.Bq0zUXhk.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,c as e,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Changelog","description":"","frontmatter":{"title":"Changelog","prev":false,"next":false},"headers":[],"relativePath":"changelog/index.md","filePath":"changelog/index.md","lastUpdated":null}'),d={name:"changelog/index.md"},n=r('

Changelog

This feed starts when I formatted the site to be a Digital Garden. If you'd like to look further into this site's history, check here!

more testing

Pushed on

PageChanges
activitypub15 +++++
advent-incremental23 +++++++
atproto20 ++++++
babble-buds24 +++++++
capture-the-citadel17 +++++
chat-glue14 ++++
chronological23 +++++++
cinny12 ++++
commune35 ++++++++++
davey-wreden22 +++++++
decentralized30 +++++++++
dice-armor57 ++++++++++++++++
digital-gardens22 +++++++
federated-identity25 +++++++
fedi-v2114 ++++++++++++++++++++++++++++++++
fediverse23 +++++++
forgejo12 ++++
freeform-vs-chronological-dichotomy12 ++++
freeform19 ++++++
game-dev-tree19 ++++++
garden-rss24 +++++++
guide-to-incrementals/appeal-to-developers32 +++++++++
guide-to-incrementals/appeal-to-players62 +++++++++++++++++
guide-to-incrementals/defining-the-genre143 ++++++++++++++++++++++++++++++++++++++++
guide-to-incrementals29 ++++++++
guide-to-incrementals/navigating-criticism28 ++++++++
guide-to-incrementals/what-is-content54 +++++++++++++++
incremental-social18 +++++
ivy-road15 +++++
kronos20 ++++++
logseq12 ++++
matrix12 ++++
mbin14 ++++
my-personal-website12 ++++
my-projects29 ++++++++
nostr15 +++++
open-source14 ++++
opti-speech39 +++++++++++
planar-pioneers17 +++++
profectus26 ++++++++
social-media27 ++++++++
synapse12 ++++
the-beginner-s-guide22 +++++++
the-cozy-web18 +++++
the-small-web77 ++++++++++++++++++++++
this-knowledge-hub25 +++++++
v-ecs27 ++++++++
vitepress12 ++++
wanderstop13 ++++
webrings27 ++++++++
weird14 ++++

51 files changed, 1427 insertions(+)

',1),s=[n];function o(l,p,c,i,g,h){return a(),e("div",null,s)}const m=t(d,[["render",o]]);export{y as __pageData,m as default}; diff --git a/assets/chunks/theme.g7q6KECo.js b/assets/chunks/theme.BFUR2isj.js similarity index 99% rename from assets/chunks/theme.g7q6KECo.js rename to assets/chunks/theme.BFUR2isj.js index 0371f771..ea8f73ac 100644 --- a/assets/chunks/theme.g7q6KECo.js +++ b/assets/chunks/theme.BFUR2isj.js @@ -1 +1 @@ -import{d as k,o as r,c as p,r as d,n as A,a as J,t as M,b as S,w as v,e as g,T as Ne,_ as L,u as We,i as mt,f as _t,g as me,h as V,j as h,k as l,p as z,l as j,m as ee,q as Le,s as I,v as X,x as _e,y as te,z as Me,A as Je,B as gt,C as kt,D as Z,F as C,E as F,G as Xe,H as ge,I as y,J as oe,K as Ye,L as ie,M as ue,N as ke,O as bt,P as Qe,Q as $t,R as Ae,S as Ze,U as be,V as yt,W as Pt,X as Vt,Y as ze,Z as Lt,$ as et,a0 as St,a1 as wt,a2 as tt,a3 as nt,a4 as It,a5 as Tt,a6 as Nt,a7 as Mt,a8 as je}from"./framework.D8PMdl4T.js";const At=k({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(e){return(t,n)=>(r(),p("span",{class:A(["VPBadge",t.type])},[d(t.$slots,"default",{},()=>[J(M(t.text),1)])],2))}}),Ct={key:0,class:"VPBackdrop"},Ht=k({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(r(),S(Ne,{name:"fade"},{default:v(()=>[t.show?(r(),p("div",Ct)):g("",!0)]),_:1}))}}),Bt=L(Ht,[["__scopeId","data-v-c79a1216"]]),T=We;function Et(e,t){let n,s=!1;return()=>{n&&clearTimeout(n),s?n=setTimeout(e,t):(e(),(s=!0)&&setTimeout(()=>s=!1,t))}}function Se(e){return/^\//.test(e)?e:`/${e}`}function Ce(e){const{pathname:t,search:n,hash:s,protocol:o}=new URL(e,"http://a.com");if(mt(e)||e.startsWith("#")||!o.startsWith("http")||!_t(t))return e;const{site:a}=T(),i=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,a.value.cleanUrls?"":".html")}${n}${s}`);return me(i)}function re({correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:s,theme:o,hash:a}=T(),i=V(()=>{var u,f;return{label:(u=t.value.locales[n.value])==null?void 0:u.label,link:((f=t.value.locales[n.value])==null?void 0:f.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:V(()=>Object.entries(t.value.locales).flatMap(([u,f])=>i.value.label===f.label?[]:{text:f.label,link:Ot(f.link||(u==="root"?"/":`/${u}/`),o.value.i18nRouting!==!1&&e,s.value.relativePath.slice(i.value.link.length-1),!t.value.cleanUrls)+a.value})),currentLang:i}}function Ot(e,t,n,s){return t?e.replace(/\/$/,"")+Se(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,s?".html":"")):e}const Dt=e=>(z("data-v-d6be1790"),e=e(),j(),e),Ft={class:"NotFound"},zt={class:"code"},jt={class:"title"},Ut=Dt(()=>h("div",{class:"divider"},null,-1)),qt={class:"quote"},Gt={class:"action"},Rt=["href","aria-label"],xt=k({__name:"NotFound",setup(e){const{theme:t}=T(),{currentLang:n}=re();return(s,o)=>{var a,i,c,u,f;return r(),p("div",Ft,[h("p",zt,M(((a=l(t).notFound)==null?void 0:a.code)??"404"),1),h("h1",jt,M(((i=l(t).notFound)==null?void 0:i.title)??"PAGE NOT FOUND"),1),Ut,h("blockquote",qt,M(((c=l(t).notFound)==null?void 0:c.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),h("div",Gt,[h("a",{class:"link",href:l(me)(l(n).link),"aria-label":((u=l(t).notFound)==null?void 0:u.linkLabel)??"go to home"},M(((f=l(t).notFound)==null?void 0:f.linkText)??"Take me home"),9,Rt)])])}}}),Kt=L(xt,[["__scopeId","data-v-d6be1790"]]);function st(e,t){if(Array.isArray(e))return de(e);if(e==null)return[];t=Se(t);const n=Object.keys(e).sort((o,a)=>a.split("/").length-o.split("/").length).find(o=>t.startsWith(Se(o))),s=n?e[n]:[];return Array.isArray(s)?de(s):de(s.items,s.base)}function Wt(e){const t=[];let n=0;for(const s in e){const o=e[s];if(o.items){n=t.push(o);continue}t[n]||t.push({items:[]}),t[n].items.push(o)}return t}function Jt(e){const t=[];function n(s){for(const o of s)o.text&&o.link&&t.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&n(o.items)}return n(e),t}function we(e,t){return Array.isArray(t)?t.some(n=>we(e,n)):ee(e,t.link)?!0:t.items?we(e,t.items):!1}function de(e,t){return[...e].map(n=>{const s={...n},o=s.base||t;return o&&s.link&&(s.link=o+s.link),s.items&&(s.items=de(s.items,o)),s})}function Y(){const{frontmatter:e,page:t,theme:n}=T(),s=Le("(min-width: 960px)"),o=I(!1),a=V(()=>{const N=n.value.sidebar,w=t.value.relativePath;return N?st(N,w):[]}),i=I(a.value);X(a,(N,w)=>{JSON.stringify(N)!==JSON.stringify(w)&&(i.value=a.value)});const c=V(()=>e.value.sidebar!==!1&&i.value.length>0&&e.value.layout!=="home"),u=V(()=>f?e.value.aside==null?n.value.aside==="left":e.value.aside==="left":!1),f=V(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:n.value.aside!==!1),_=V(()=>c.value&&s.value),m=V(()=>c.value?Wt(i.value):[]);function P(){o.value=!0}function b(){o.value=!1}function $(){o.value?b():P()}return{isOpen:o,sidebar:i,sidebarGroups:m,hasSidebar:c,hasAside:f,leftAside:u,isSidebarEnabled:_,open:P,close:b,toggle:$}}function Xt(e,t){let n;_e(()=>{n=e.value?document.activeElement:void 0}),te(()=>{window.addEventListener("keyup",s)}),Me(()=>{window.removeEventListener("keyup",s)});function s(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function Yt(e){const{page:t,hash:n}=T(),s=I(!1),o=V(()=>e.value.collapsed!=null),a=V(()=>!!e.value.link),i=I(!1),c=()=>{i.value=ee(t.value.relativePath,e.value.link)};X([t,e,n],c),te(c);const u=V(()=>i.value?!0:e.value.items?we(t.value.relativePath,e.value.items):!1),f=V(()=>!!(e.value.items&&e.value.items.length));_e(()=>{s.value=!!(o.value&&e.value.collapsed)}),Je(()=>{(i.value||u.value)&&(s.value=!1)});function _(){o.value&&(s.value=!s.value)}return{collapsed:s,collapsible:o,isLink:a,isActiveLink:i,hasActiveLink:u,hasChildren:f,toggle:_}}function Qt(){const{hasSidebar:e}=Y(),t=Le("(min-width: 960px)"),n=Le("(min-width: 1280px)");return{isAsideEnabled:V(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const Ie=[];function ot(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function He(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const s=Number(n.tagName[1]);return{element:n,title:Zt(n),link:"#"+n.id,level:s}});return en(t,e)}function Zt(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if(n.classList.contains("VPBadge")||n.classList.contains("header-anchor")||n.classList.contains("ignore-header"))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function en(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[s,o]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;e=e.filter(i=>i.level>=s&&i.level<=o),Ie.length=0;for(const{element:i,link:c}of e)Ie.push({element:i,link:c});const a=[];e:for(let i=0;i=0;u--){const f=e[u];if(f.level{requestAnimationFrame(a),window.addEventListener("scroll",s)}),gt(()=>{i(location.hash)}),Me(()=>{window.removeEventListener("scroll",s)});function a(){if(!n.value)return;const c=window.scrollY,u=window.innerHeight,f=document.body.offsetHeight,_=Math.abs(c+u-f)<1,m=Ie.map(({element:b,link:$})=>({link:$,top:nn(b)})).filter(({top:b})=>!Number.isNaN(b)).sort((b,$)=>b.top-$.top);if(!m.length){i(null);return}if(c<1){i(null);return}if(_){i(m[m.length-1].link);return}let P=null;for(const{link:b,top:$}of m){if($>c+kt()+4)break;P=b}i(P)}function i(c){o&&o.classList.remove("active"),c==null?o=null:o=e.value.querySelector(`a[href="${decodeURIComponent(c)}"]`);const u=o;u?(u.classList.add("active"),t.value.style.top=u.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function nn(e){let t=0;for(;e!==document.body;){if(e===null)return NaN;t+=e.offsetTop,e=e.offsetParent}return t}const sn=["href","title"],on=k({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(e){function t({target:n}){const s=n.href.split("#")[1],o=document.getElementById(decodeURIComponent(s));o==null||o.focus({preventScroll:!0})}return(n,s)=>{const o=Z("VPDocOutlineItem",!0);return r(),p("ul",{class:A(["VPDocOutlineItem",n.root?"root":"nested"])},[(r(!0),p(C,null,F(n.headers,({children:a,link:i,title:c})=>(r(),p("li",null,[h("a",{class:"outline-link",href:i,onClick:t,title:c},M(c),9,sn),a!=null&&a.length?(r(),S(o,{key:0,headers:a},null,8,["headers"])):g("",!0)]))),256))],2)}}}),at=L(on,[["__scopeId","data-v-b933a997"]]),an={class:"content"},rn={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},ln=k({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=T(),s=Xe([]);ge(()=>{s.value=He(t.value.outline??n.value.outline)});const o=I(),a=I();return tn(o,a),(i,c)=>(r(),p("nav",{"aria-labelledby":"doc-outline-aria-label",class:A(["VPDocAsideOutline",{"has-outline":s.value.length>0}]),ref_key:"container",ref:o},[h("div",an,[h("div",{class:"outline-marker",ref_key:"marker",ref:a},null,512),h("div",rn,M(l(ot)(l(n))),1),y(at,{headers:s.value,root:!0},null,8,["headers"])])],2))}}),cn=L(ln,[["__scopeId","data-v-a5bbad30"]]),un={class:"VPDocAsideCarbonAds"},dn=k({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(n,s)=>(r(),p("div",un,[y(l(t),{"carbon-ads":n.carbonAds},null,8,["carbon-ads"])]))}}),hn=e=>(z("data-v-3f215769"),e=e(),j(),e),pn={class:"VPDocAside"},vn=hn(()=>h("div",{class:"spacer"},null,-1)),fn=k({__name:"VPDocAside",setup(e){const{theme:t}=T();return(n,s)=>(r(),p("div",pn,[d(n.$slots,"aside-top",{},void 0,!0),d(n.$slots,"aside-outline-before",{},void 0,!0),y(cn),d(n.$slots,"aside-outline-after",{},void 0,!0),vn,d(n.$slots,"aside-ads-before",{},void 0,!0),l(t).carbonAds?(r(),S(dn,{key:0,"carbon-ads":l(t).carbonAds},null,8,["carbon-ads"])):g("",!0),d(n.$slots,"aside-ads-after",{},void 0,!0),d(n.$slots,"aside-bottom",{},void 0,!0)]))}}),mn=L(fn,[["__scopeId","data-v-3f215769"]]);function _n(){const{theme:e,page:t}=T();return V(()=>{const{text:n="Edit this page",pattern:s=""}=e.value.editLink||{};let o;return typeof s=="function"?o=s(t.value):o=s.replace(/:path/g,t.value.filePath),{url:o,text:n}})}function gn(){const{page:e,theme:t,frontmatter:n}=T();return V(()=>{var f,_,m,P,b,$,N,w;const s=st(t.value.sidebar,e.value.relativePath),o=Jt(s),a=kn(o,U=>U.link.replace(/[?#].*$/,"")),i=a.findIndex(U=>ee(e.value.relativePath,U.link)),c=((f=t.value.docFooter)==null?void 0:f.prev)===!1&&!n.value.prev||n.value.prev===!1,u=((_=t.value.docFooter)==null?void 0:_.next)===!1&&!n.value.next||n.value.next===!1;return{prev:c?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((m=a[i-1])==null?void 0:m.docFooterText)??((P=a[i-1])==null?void 0:P.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((b=a[i-1])==null?void 0:b.link)},next:u?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??(($=a[i+1])==null?void 0:$.docFooterText)??((N=a[i+1])==null?void 0:N.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((w=a[i+1])==null?void 0:w.link)}}})}function kn(e,t){const n=new Set;return e.filter(s=>{const o=t(s);return n.has(o)?!1:n.add(o)})}const W=k({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,n=V(()=>t.tag??(t.href?"a":"span")),s=V(()=>t.href&&Ye.test(t.href)||t.target==="_blank");return(o,a)=>(r(),S(oe(n.value),{class:A(["VPLink",{link:o.href,"vp-external-link-icon":s.value,"no-icon":o.noIcon}]),href:o.href?l(Ce)(o.href):void 0,target:o.target??(s.value?"_blank":void 0),rel:o.rel??(s.value?"noreferrer":void 0)},{default:v(()=>[d(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),bn={class:"VPLastUpdated"},$n=["datetime"],yn=k({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,frontmatter:s,lang:o}=T(),a=V(()=>new Date(s.value.lastUpdated??n.value.lastUpdated)),i=V(()=>a.value.toISOString()),c=I("");return te(()=>{_e(()=>{var u,f,_;c.value=new Intl.DateTimeFormat((f=(u=t.value.lastUpdated)==null?void 0:u.formatOptions)!=null&&f.forceLocale?o.value:void 0,((_=t.value.lastUpdated)==null?void 0:_.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(a.value)})}),(u,f)=>{var _;return r(),p("p",bn,[J(M(((_=l(t).lastUpdated)==null?void 0:_.text)||l(t).lastUpdatedText||"Last updated")+": ",1),h("time",{datetime:i.value},M(c.value),9,$n)])}}}),Pn=L(yn,[["__scopeId","data-v-7e05ebdb"]]),it=e=>(z("data-v-d4a0bba5"),e=e(),j(),e),Vn={key:0,class:"VPDocFooter"},Ln={key:0,class:"edit-info"},Sn={key:0,class:"edit-link"},wn=it(()=>h("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),In={key:1,class:"last-updated"},Tn={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Nn=it(()=>h("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),Mn={class:"pager"},An=["innerHTML"],Cn=["innerHTML"],Hn={class:"pager"},Bn=["innerHTML"],En=["innerHTML"],On=k({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:s}=T(),o=_n(),a=gn(),i=V(()=>t.value.editLink&&s.value.editLink!==!1),c=V(()=>n.value.lastUpdated&&s.value.lastUpdated!==!1),u=V(()=>i.value||c.value||a.value.prev||a.value.next);return(f,_)=>{var m,P,b,$;return u.value?(r(),p("footer",Vn,[d(f.$slots,"doc-footer-before",{},void 0,!0),i.value||c.value?(r(),p("div",Ln,[i.value?(r(),p("div",Sn,[y(W,{class:"edit-link-button",href:l(o).url,"no-icon":!0},{default:v(()=>[wn,J(" "+M(l(o).text),1)]),_:1},8,["href"])])):g("",!0),c.value?(r(),p("div",In,[y(Pn)])):g("",!0)])):g("",!0),(m=l(a).prev)!=null&&m.link||(P=l(a).next)!=null&&P.link?(r(),p("nav",Tn,[Nn,h("div",Mn,[(b=l(a).prev)!=null&&b.link?(r(),S(W,{key:0,class:"pager-link prev",href:l(a).prev.link},{default:v(()=>{var N;return[h("span",{class:"desc",innerHTML:((N=l(t).docFooter)==null?void 0:N.prev)||"Previous page"},null,8,An),h("span",{class:"title",innerHTML:l(a).prev.text},null,8,Cn)]}),_:1},8,["href"])):g("",!0)]),h("div",Hn,[($=l(a).next)!=null&&$.link?(r(),S(W,{key:0,class:"pager-link next",href:l(a).next.link},{default:v(()=>{var N;return[h("span",{class:"desc",innerHTML:((N=l(t).docFooter)==null?void 0:N.next)||"Next page"},null,8,Bn),h("span",{class:"title",innerHTML:l(a).next.text},null,8,En)]}),_:1},8,["href"])):g("",!0)])])):g("",!0)])):g("",!0)}}}),Dn=L(On,[["__scopeId","data-v-d4a0bba5"]]),Fn=e=>(z("data-v-39a288b8"),e=e(),j(),e),zn={class:"container"},jn=Fn(()=>h("div",{class:"aside-curtain"},null,-1)),Un={class:"aside-container"},qn={class:"aside-content"},Gn={class:"content"},Rn={class:"content-container"},xn={class:"main"},Kn=k({__name:"VPDoc",setup(e){const{theme:t}=T(),n=ie(),{hasSidebar:s,hasAside:o,leftAside:a}=Y(),i=V(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(c,u)=>{const f=Z("Content");return r(),p("div",{class:A(["VPDoc",{"has-sidebar":l(s),"has-aside":l(o)}])},[d(c.$slots,"doc-top",{},void 0,!0),h("div",zn,[l(o)?(r(),p("div",{key:0,class:A(["aside",{"left-aside":l(a)}])},[jn,h("div",Un,[h("div",qn,[y(mn,null,{"aside-top":v(()=>[d(c.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[d(c.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[d(c.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[d(c.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[d(c.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[d(c.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):g("",!0),h("div",Gn,[h("div",Rn,[d(c.$slots,"doc-before",{},void 0,!0),h("main",xn,[y(f,{class:A(["vp-doc",[i.value,l(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),y(Dn,null,{"doc-footer-before":v(()=>[d(c.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),d(c.$slots,"doc-after",{},void 0,!0)])])]),d(c.$slots,"doc-bottom",{},void 0,!0)],2)}}}),Wn=L(Kn,[["__scopeId","data-v-39a288b8"]]),Jn=k({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(e){const t=e,n=V(()=>t.href&&Ye.test(t.href)),s=V(()=>t.tag||t.href?"a":"button");return(o,a)=>(r(),S(oe(s.value),{class:A(["VPButton",[o.size,o.theme]]),href:o.href?l(Ce)(o.href):void 0,target:t.target??(n.value?"_blank":void 0),rel:t.rel??(n.value?"noreferrer":void 0)},{default:v(()=>[J(M(o.text),1)]),_:1},8,["class","href","target","rel"]))}}),Xn=L(Jn,[["__scopeId","data-v-cad61b99"]]),Yn=["src","alt"],Qn=k({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,n)=>{const s=Z("VPImage",!0);return t.image?(r(),p(C,{key:0},[typeof t.image=="string"||"src"in t.image?(r(),p("img",ue({key:0,class:"VPImage"},typeof t.image=="string"?t.$attrs:{...t.image,...t.$attrs},{src:l(me)(typeof t.image=="string"?t.image:t.image.src),alt:t.alt??(typeof t.image=="string"?"":t.image.alt||"")}),null,16,Yn)):(r(),p(C,{key:1},[y(s,ue({class:"dark",image:t.image.dark,alt:t.image.alt},t.$attrs),null,16,["image","alt"]),y(s,ue({class:"light",image:t.image.light,alt:t.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):g("",!0)}}}),pe=L(Qn,[["__scopeId","data-v-8426fc1a"]]),Zn=e=>(z("data-v-303bb580"),e=e(),j(),e),es={class:"container"},ts={class:"main"},ns={key:0,class:"name"},ss=["innerHTML"],os=["innerHTML"],as=["innerHTML"],is={key:0,class:"actions"},rs={key:0,class:"image"},ls={class:"image-container"},cs=Zn(()=>h("div",{class:"image-bg"},null,-1)),us=k({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const t=ke("hero-image-slot-exists");return(n,s)=>(r(),p("div",{class:A(["VPHero",{"has-image":n.image||l(t)}])},[h("div",es,[h("div",ts,[d(n.$slots,"home-hero-info-before",{},void 0,!0),d(n.$slots,"home-hero-info",{},()=>[n.name?(r(),p("h1",ns,[h("span",{innerHTML:n.name,class:"clip"},null,8,ss)])):g("",!0),n.text?(r(),p("p",{key:1,innerHTML:n.text,class:"text"},null,8,os)):g("",!0),n.tagline?(r(),p("p",{key:2,innerHTML:n.tagline,class:"tagline"},null,8,as)):g("",!0)],!0),d(n.$slots,"home-hero-info-after",{},void 0,!0),n.actions?(r(),p("div",is,[(r(!0),p(C,null,F(n.actions,o=>(r(),p("div",{key:o.link,class:"action"},[y(Xn,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link,target:o.target,rel:o.rel},null,8,["theme","text","href","target","rel"])]))),128))])):g("",!0),d(n.$slots,"home-hero-actions-after",{},void 0,!0)]),n.image||l(t)?(r(),p("div",rs,[h("div",ls,[cs,d(n.$slots,"home-hero-image",{},()=>[n.image?(r(),S(pe,{key:0,class:"image-src",image:n.image},null,8,["image"])):g("",!0)],!0)])])):g("",!0)])],2))}}),ds=L(us,[["__scopeId","data-v-303bb580"]]),hs=k({__name:"VPHomeHero",setup(e){const{frontmatter:t}=T();return(n,s)=>l(t).hero?(r(),S(ds,{key:0,class:"VPHomeHero",name:l(t).hero.name,text:l(t).hero.text,tagline:l(t).hero.tagline,image:l(t).hero.image,actions:l(t).hero.actions},{"home-hero-info-before":v(()=>[d(n.$slots,"home-hero-info-before")]),"home-hero-info":v(()=>[d(n.$slots,"home-hero-info")]),"home-hero-info-after":v(()=>[d(n.$slots,"home-hero-info-after")]),"home-hero-actions-after":v(()=>[d(n.$slots,"home-hero-actions-after")]),"home-hero-image":v(()=>[d(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):g("",!0)}}),ps=e=>(z("data-v-a3976bdc"),e=e(),j(),e),vs={class:"box"},fs={key:0,class:"icon"},ms=["innerHTML"],_s=["innerHTML"],gs=["innerHTML"],ks={key:4,class:"link-text"},bs={class:"link-text-value"},$s=ps(()=>h("span",{class:"vpi-arrow-right link-text-icon"},null,-1)),ys=k({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,n)=>(r(),S(W,{class:"VPFeature",href:t.link,rel:t.rel,target:t.target,"no-icon":!0,tag:t.link?"a":"div"},{default:v(()=>[h("article",vs,[typeof t.icon=="object"&&t.icon.wrap?(r(),p("div",fs,[y(pe,{image:t.icon,alt:t.icon.alt,height:t.icon.height||48,width:t.icon.width||48},null,8,["image","alt","height","width"])])):typeof t.icon=="object"?(r(),S(pe,{key:1,image:t.icon,alt:t.icon.alt,height:t.icon.height||48,width:t.icon.width||48},null,8,["image","alt","height","width"])):t.icon?(r(),p("div",{key:2,class:"icon",innerHTML:t.icon},null,8,ms)):g("",!0),h("h2",{class:"title",innerHTML:t.title},null,8,_s),t.details?(r(),p("p",{key:3,class:"details",innerHTML:t.details},null,8,gs)):g("",!0),t.linkText?(r(),p("div",ks,[h("p",bs,[J(M(t.linkText)+" ",1),$s])])):g("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Ps=L(ys,[["__scopeId","data-v-a3976bdc"]]),Vs={key:0,class:"VPFeatures"},Ls={class:"container"},Ss={class:"items"},ws=k({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,n=V(()=>{const s=t.features.length;if(s){if(s===2)return"grid-2";if(s===3)return"grid-3";if(s%3===0)return"grid-6";if(s>3)return"grid-4"}else return});return(s,o)=>s.features?(r(),p("div",Vs,[h("div",Ls,[h("div",Ss,[(r(!0),p(C,null,F(s.features,a=>(r(),p("div",{key:a.title,class:A(["item",[n.value]])},[y(Ps,{icon:a.icon,title:a.title,details:a.details,link:a.link,"link-text":a.linkText,rel:a.rel,target:a.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):g("",!0)}}),Is=L(ws,[["__scopeId","data-v-a6181336"]]),Ts=k({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=T();return(n,s)=>l(t).features?(r(),S(Is,{key:0,class:"VPHomeFeatures",features:l(t).features},null,8,["features"])):g("",!0)}}),Ns=k({__name:"VPHomeContent",setup(e){const{width:t}=bt({initialWidth:0,includeScrollbar:!1});return(n,s)=>(r(),p("div",{class:"vp-doc container",style:Qe(l(t)?{"--vp-offset":`calc(50% - ${l(t)/2}px)`}:{})},[d(n.$slots,"default",{},void 0,!0)],4))}}),Ms=L(Ns,[["__scopeId","data-v-8e2d4988"]]),As={class:"VPHome"},Cs=k({__name:"VPHome",setup(e){const{frontmatter:t}=T();return(n,s)=>{const o=Z("Content");return r(),p("div",As,[d(n.$slots,"home-hero-before",{},void 0,!0),y(hs,null,{"home-hero-info-before":v(()=>[d(n.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[d(n.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[d(n.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[d(n.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":v(()=>[d(n.$slots,"home-hero-image",{},void 0,!0)]),_:3}),d(n.$slots,"home-hero-after",{},void 0,!0),d(n.$slots,"home-features-before",{},void 0,!0),y(Ts),d(n.$slots,"home-features-after",{},void 0,!0),l(t).markdownStyles!==!1?(r(),S(Ms,{key:0},{default:v(()=>[y(o)]),_:1})):(r(),S(o,{key:1}))])}}}),Hs=L(Cs,[["__scopeId","data-v-686f80a6"]]),Bs={},Es={class:"VPPage"};function Os(e,t){const n=Z("Content");return r(),p("div",Es,[d(e.$slots,"page-top"),y(n),d(e.$slots,"page-bottom")])}const Ds=L(Bs,[["render",Os]]),Fs=k({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=T(),{hasSidebar:s}=Y();return(o,a)=>(r(),p("div",{class:A(["VPContent",{"has-sidebar":l(s),"is-home":l(n).layout==="home"}]),id:"VPContent"},[l(t).isNotFound?d(o.$slots,"not-found",{key:0},()=>[y(Kt)],!0):l(n).layout==="page"?(r(),S(Ds,{key:1},{"page-top":v(()=>[d(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[d(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):l(n).layout==="home"?(r(),S(Hs,{key:2},{"home-hero-before":v(()=>[d(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":v(()=>[d(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[d(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[d(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[d(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":v(()=>[d(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[d(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[d(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[d(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):l(n).layout&&l(n).layout!=="doc"?(r(),S(oe(l(n).layout),{key:3})):(r(),S(Wn,{key:4},{"doc-top":v(()=>[d(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[d(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[d(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[d(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[d(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[d(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[d(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[d(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[d(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[d(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[d(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),zs=L(Fs,[["__scopeId","data-v-1428d186"]]),js={class:"container"},Us=["innerHTML"],qs=["innerHTML"],Gs=k({__name:"VPFooter",setup(e){const{theme:t,frontmatter:n}=T(),{hasSidebar:s}=Y();return(o,a)=>l(t).footer&&l(n).footer!==!1?(r(),p("footer",{key:0,class:A(["VPFooter",{"has-sidebar":l(s)}])},[h("div",js,[l(t).footer.message?(r(),p("p",{key:0,class:"message",innerHTML:l(t).footer.message},null,8,Us)):g("",!0),l(t).footer.copyright?(r(),p("p",{key:1,class:"copyright",innerHTML:l(t).footer.copyright},null,8,qs)):g("",!0)])],2)):g("",!0)}}),Rs=L(Gs,[["__scopeId","data-v-e315a0ad"]]);function xs(){const{theme:e,frontmatter:t}=T(),n=Xe([]),s=V(()=>n.value.length>0);return ge(()=>{n.value=He(t.value.outline??e.value.outline)}),{headers:n,hasLocalNav:s}}const Ks=e=>(z("data-v-17a5e62e"),e=e(),j(),e),Ws={class:"menu-text"},Js=Ks(()=>h("span",{class:"vpi-chevron-right icon"},null,-1)),Xs={class:"header"},Ys={class:"outline"},Qs=k({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:n}=T(),s=I(!1),o=I(0),a=I(),i=I();function c(m){var P;(P=a.value)!=null&&P.contains(m.target)||(s.value=!1)}X(s,m=>{if(m){document.addEventListener("click",c);return}document.removeEventListener("click",c)}),$t("Escape",()=>{s.value=!1}),ge(()=>{s.value=!1});function u(){s.value=!s.value,o.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function f(m){m.target.classList.contains("outline-link")&&(i.value&&(i.value.style.transition="none"),Ae(()=>{s.value=!1}))}function _(){s.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(m,P)=>(r(),p("div",{class:"VPLocalNavOutlineDropdown",style:Qe({"--vp-vh":o.value+"px"}),ref_key:"main",ref:a},[m.headers.length>0?(r(),p("button",{key:0,onClick:u,class:A({open:s.value})},[h("span",Ws,M(l(ot)(l(n))),1),Js],2)):(r(),p("button",{key:1,onClick:_},M(l(n).returnToTopLabel||"Return to top"),1)),y(Ne,{name:"flyout"},{default:v(()=>[s.value?(r(),p("div",{key:0,ref_key:"items",ref:i,class:"items",onClick:f},[h("div",Xs,[h("a",{class:"top-link",href:"#",onClick:_},M(l(n).returnToTopLabel||"Return to top"),1)]),h("div",Ys,[y(at,{headers:m.headers},null,8,["headers"])])],512)):g("",!0)]),_:1})],4))}}),Zs=L(Qs,[["__scopeId","data-v-17a5e62e"]]),eo=e=>(z("data-v-a6f0e41e"),e=e(),j(),e),to={class:"container"},no=["aria-expanded"],so=eo(()=>h("span",{class:"vpi-align-left menu-icon"},null,-1)),oo={class:"menu-text"},ao=k({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:n}=T(),{hasSidebar:s}=Y(),{headers:o}=xs(),{y:a}=Ze(),i=I(0);te(()=>{i.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),ge(()=>{o.value=He(n.value.outline??t.value.outline)});const c=V(()=>o.value.length===0),u=V(()=>c.value&&!s.value),f=V(()=>({VPLocalNav:!0,"has-sidebar":s.value,empty:c.value,fixed:u.value}));return(_,m)=>l(n).layout!=="home"&&(!u.value||l(a)>=i.value)?(r(),p("div",{key:0,class:A(f.value)},[h("div",to,[l(s)?(r(),p("button",{key:0,class:"menu","aria-expanded":_.open,"aria-controls":"VPSidebarNav",onClick:m[0]||(m[0]=P=>_.$emit("open-menu"))},[so,h("span",oo,M(l(t).sidebarMenuLabel||"Menu"),1)],8,no)):g("",!0),y(Zs,{headers:l(o),navHeight:i.value},null,8,["headers","navHeight"])])],2)):g("",!0)}}),io=L(ao,[["__scopeId","data-v-a6f0e41e"]]);function ro(){const e=I(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function s(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const a=ie();return X(()=>a.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:s}}const lo={},co={class:"VPSwitch",type:"button",role:"switch"},uo={class:"check"},ho={key:0,class:"icon"};function po(e,t){return r(),p("button",co,[h("span",uo,[e.$slots.default?(r(),p("span",ho,[d(e.$slots,"default",{},void 0,!0)])):g("",!0)])])}const vo=L(lo,[["render",po],["__scopeId","data-v-1d5665e3"]]),rt=e=>(z("data-v-d1f28634"),e=e(),j(),e),fo=rt(()=>h("span",{class:"vpi-sun sun"},null,-1)),mo=rt(()=>h("span",{class:"vpi-moon moon"},null,-1)),_o=k({__name:"VPSwitchAppearance",setup(e){const{isDark:t,theme:n}=T(),s=ke("toggle-appearance",()=>{t.value=!t.value}),o=V(()=>t.value?n.value.lightModeSwitchTitle||"Switch to light theme":n.value.darkModeSwitchTitle||"Switch to dark theme");return(a,i)=>(r(),S(vo,{title:o.value,class:"VPSwitchAppearance","aria-checked":l(t),onClick:l(s)},{default:v(()=>[fo,mo]),_:1},8,["title","aria-checked","onClick"]))}}),Be=L(_o,[["__scopeId","data-v-d1f28634"]]),go={key:0,class:"VPNavBarAppearance"},ko=k({__name:"VPNavBarAppearance",setup(e){const{site:t}=T();return(n,s)=>l(t).appearance&&l(t).appearance!=="force-dark"?(r(),p("div",go,[y(Be)])):g("",!0)}}),bo=L(ko,[["__scopeId","data-v-e6aabb21"]]),Ee=I();let lt=!1,ye=0;function $o(e){const t=I(!1);if(be){!lt&&yo(),ye++;const n=X(Ee,s=>{var o,a,i;s===e.el.value||(o=e.el.value)!=null&&o.contains(s)?(t.value=!0,(a=e.onFocus)==null||a.call(e)):(t.value=!1,(i=e.onBlur)==null||i.call(e))});Me(()=>{n(),ye--,ye||Po()})}return yt(t)}function yo(){document.addEventListener("focusin",ct),lt=!0,Ee.value=document.activeElement}function Po(){document.removeEventListener("focusin",ct)}function ct(){Ee.value=document.activeElement}const Vo={class:"VPMenuLink"},Lo=k({__name:"VPMenuLink",props:{item:{}},setup(e){const{page:t}=T();return(n,s)=>(r(),p("div",Vo,[y(W,{class:A({active:l(ee)(l(t).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel},{default:v(()=>[J(M(n.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),$e=L(Lo,[["__scopeId","data-v-43f1e123"]]),So={class:"VPMenuGroup"},wo={key:0,class:"title"},Io=k({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,n)=>(r(),p("div",So,[t.text?(r(),p("p",wo,M(t.text),1)):g("",!0),(r(!0),p(C,null,F(t.items,s=>(r(),p(C,null,["link"in s?(r(),S($e,{key:0,item:s},null,8,["item"])):g("",!0)],64))),256))]))}}),To=L(Io,[["__scopeId","data-v-69e747b5"]]),No={class:"VPMenu"},Mo={key:0,class:"items"},Ao=k({__name:"VPMenu",props:{items:{}},setup(e){return(t,n)=>(r(),p("div",No,[t.items?(r(),p("div",Mo,[(r(!0),p(C,null,F(t.items,s=>(r(),p(C,{key:s.text},["link"in s?(r(),S($e,{key:0,item:s},null,8,["item"])):(r(),S(To,{key:1,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):g("",!0),d(t.$slots,"default",{},void 0,!0)]))}}),Co=L(Ao,[["__scopeId","data-v-e7ea1737"]]),Ho=e=>(z("data-v-b6c34ac9"),e=e(),j(),e),Bo=["aria-expanded","aria-label"],Eo={key:0,class:"text"},Oo=["innerHTML"],Do=Ho(()=>h("span",{class:"vpi-chevron-down text-icon"},null,-1)),Fo={key:1,class:"vpi-more-horizontal icon"},zo={class:"menu"},jo=k({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=I(!1),n=I();$o({el:n,onBlur:s});function s(){t.value=!1}return(o,a)=>(r(),p("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:a[1]||(a[1]=i=>t.value=!0),onMouseleave:a[2]||(a[2]=i=>t.value=!1)},[h("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":o.label,onClick:a[0]||(a[0]=i=>t.value=!t.value)},[o.button||o.icon?(r(),p("span",Eo,[o.icon?(r(),p("span",{key:0,class:A([o.icon,"option-icon"])},null,2)):g("",!0),o.button?(r(),p("span",{key:1,innerHTML:o.button},null,8,Oo)):g("",!0),Do])):(r(),p("span",Fo))],8,Bo),h("div",zo,[y(Co,{items:o.items},{default:v(()=>[d(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),Oe=L(jo,[["__scopeId","data-v-b6c34ac9"]]),Uo=["href","aria-label","innerHTML"],qo=k({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(e){const t=e,n=V(()=>typeof t.icon=="object"?t.icon.svg:``);return(s,o)=>(r(),p("a",{class:"VPSocialLink no-icon",href:s.link,"aria-label":s.ariaLabel??(typeof s.icon=="string"?s.icon:""),target:"_blank",rel:"noopener",innerHTML:n.value},null,8,Uo))}}),Go=L(qo,[["__scopeId","data-v-eee4e7cb"]]),Ro={class:"VPSocialLinks"},xo=k({__name:"VPSocialLinks",props:{links:{}},setup(e){return(t,n)=>(r(),p("div",Ro,[(r(!0),p(C,null,F(t.links,({link:s,icon:o,ariaLabel:a})=>(r(),S(Go,{key:s,icon:o,link:s,ariaLabel:a},null,8,["icon","link","ariaLabel"]))),128))]))}}),De=L(xo,[["__scopeId","data-v-7bc22406"]]),Ko={key:0,class:"group translations"},Wo={class:"trans-title"},Jo={key:1,class:"group"},Xo={class:"item appearance"},Yo={class:"label"},Qo={class:"appearance-action"},Zo={key:2,class:"group"},ea={class:"item social-links"},ta=k({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=T(),{localeLinks:s,currentLang:o}=re({correspondingLink:!0}),a=V(()=>s.value.length&&o.value.label||t.value.appearance||n.value.socialLinks);return(i,c)=>a.value?(r(),S(Oe,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[l(s).length&&l(o).label?(r(),p("div",Ko,[h("p",Wo,M(l(o).label),1),(r(!0),p(C,null,F(l(s),u=>(r(),S($e,{key:u.link,item:u},null,8,["item"]))),128))])):g("",!0),l(t).appearance&&l(t).appearance!=="force-dark"?(r(),p("div",Jo,[h("div",Xo,[h("p",Yo,M(l(n).darkModeSwitchLabel||"Appearance"),1),h("div",Qo,[y(Be)])])])):g("",!0),l(n).socialLinks?(r(),p("div",Zo,[h("div",ea,[y(De,{class:"social-links-list",links:l(n).socialLinks},null,8,["links"])])])):g("",!0)]),_:1})):g("",!0)}}),na=L(ta,[["__scopeId","data-v-d0bd9dde"]]),sa=e=>(z("data-v-e5dd9c1c"),e=e(),j(),e),oa=["aria-expanded"],aa=sa(()=>h("span",{class:"container"},[h("span",{class:"top"}),h("span",{class:"middle"}),h("span",{class:"bottom"})],-1)),ia=[aa],ra=k({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(r(),p("button",{type:"button",class:A(["VPNavBarHamburger",{active:t.active}]),"aria-label":"mobile navigation","aria-expanded":t.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=s=>t.$emit("click"))},ia,10,oa))}}),la=L(ra,[["__scopeId","data-v-e5dd9c1c"]]),ca=["innerHTML"],ua=k({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const{page:t}=T();return(n,s)=>(r(),S(W,{class:A({VPNavBarMenuLink:!0,active:l(ee)(l(t).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,noIcon:n.item.noIcon,target:n.item.target,rel:n.item.rel,tabindex:"0"},{default:v(()=>[h("span",{innerHTML:n.item.text},null,8,ca)]),_:1},8,["class","href","noIcon","target","rel"]))}}),da=L(ua,[["__scopeId","data-v-9c663999"]]),ha=k({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:n}=T(),s=a=>"link"in a?ee(n.value.relativePath,a.link,!!t.item.activeMatch):a.items.some(s),o=V(()=>s(t.item));return(a,i)=>(r(),S(Oe,{class:A({VPNavBarMenuGroup:!0,active:l(ee)(l(n).relativePath,a.item.activeMatch,!!a.item.activeMatch)||o.value}),button:a.item.text,items:a.item.items},null,8,["class","button","items"]))}}),pa=e=>(z("data-v-7f418b0f"),e=e(),j(),e),va={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},fa=pa(()=>h("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),ma=k({__name:"VPNavBarMenu",setup(e){const{theme:t}=T();return(n,s)=>l(t).nav?(r(),p("nav",va,[fa,(r(!0),p(C,null,F(l(t).nav,o=>(r(),p(C,{key:o.text},["link"in o?(r(),S(da,{key:0,item:o},null,8,["item"])):(r(),S(ha,{key:1,item:o},null,8,["item"]))],64))),128))])):g("",!0)}}),_a=L(ma,[["__scopeId","data-v-7f418b0f"]]),ga="/assets/flex-logo.BJA2J7hW.svg";function Pe(e,t){return typeof e>"u"?t:e}function Ue(e){const t=Array(e);for(let n=0;n=this.minlength&&(c||!i[_])){let P=ce(u,o,f),b="";switch(this.tokenize){case"full":if(3$;N--)if(N-$>=this.minlength){const w=ce(u,o,f,m,$);b=_.substring($,N),this.push_index(i,b,w,e,n)}break}case"reverse":if(2=this.minlength){const N=ce(u,o,f,m,$);this.push_index(i,b,N,e,n)}b=""}case"forward":if(1=this.minlength&&this.push_index(i,b,P,e,n);break}default:if(this.boost&&(P=Math.min(0|P/this.boost(t,_,f),u-1)),this.push_index(i,_,P,e,n),c&&1=this.minlength&&!$[_]){$[_]=1;const K=ce(N+(o/2>N?0:1),o,f,U-1,D-1),Q=this.bidirectional&&_>w;this.push_index(a,Q?w:_,K,e,n,Q?_:w)}}}}}this.fastupdate||(this.register[e]=1)}}return this};function ce(e,t,n,s,o){return n&&1=this.minlength&&!m[b]){if(!this.optimize&&!a&&!this.map[b])return i;P[N++]=b,m[b]=1}e=P,s=e.length}if(!s)return i;t||(t=100);let u,f=this.depth&&1=n)))));b++);if(f)return o?Re(c,n,0):void(e[e.length]=c)}return!t&&c};function Re(e,t,n){return e=e.length===1?e[0]:ba(e),n||e.length>t?e.slice(n,n+t):e}function xe(e,t,n,s){if(n){const o=s&&t>n;e=e[o?t:n],e=e&&e[o?n:t]}else e=e[t];return e}R.prototype.contain=function(e){return!!this.register[e]},R.prototype.update=function(e,t){return this.remove(e).add(e,t)},R.prototype.remove=function(e,t){const n=this.register[e];if(n){if(this.fastupdate)for(let s,o=0;o{if(a.value){for(var B=m.value.search(a.value,{enrich:!0}),H=[],q=0;q!B||!B.length?[]:B.reduce((q,E)=>(q[H(E)]||(q[H(E)]=[]),q[H(E)].push(E),q),{}),K=()=>{setTimeout(()=>{c.value&&c.value.focus()},100),Fe(),o.value=!0};te(async()=>{var E,O;const B=await Vt(()=>import("./virtual_search-data.6Jzpy5HH.js"),[]);u.value=B.default.INDEX_DATA,f.value=B.default.PREVIEW_LOOKUP,_.value=B.default.Options,i.value=window.location.origin+me(n.value==="root"?"/":n.value),P.value=((E=_.value)==null?void 0:E.buttonLabel)||P.value,b.value=((O=_.value)==null?void 0:O.placeholder)||b.value;var H=new R(_.value);H.import("reg",u.value.reg),H.import("cfg",u.value.cfg),H.import("map",u.value.map),H.import("ctx",u.value.ctx),m.value=H,s.value.innerHTML=/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"⌘":"Ctrl";const q=G=>{var se;G.key==="k"&&(G.ctrlKey||G.metaKey)&&(G.preventDefault(),K()),G.key==="Escape"&&((se=a.value)==null?void 0:se.length)==0&&o.value&&(o.value=!1)};window.addEventListener("keydown",q)});const Q=V(()=>D(U.value,B=>B.link.split("/").slice(0,-1).join("-"))),ne=V(()=>Object.values(Q.value).flat().map(B=>B.id));function Fe(){o.value=!1,a.value=""}const vt=B=>{var H,q;if(document.getElementsByClassName("search-group")[0]){if(B.key=="ArrowUp"||B.key=="ArrowDown"){const E=ne.value.indexOf($.value);if(B.key=="ArrowUp"){const O=E==0?ne.value.length-1:E-1;$.value=ne.value[O]}if(B.key=="ArrowDown"){const O=E>ne.value.length-2?0:E+1;$.value=ne.value[O]}if(E<5){const O=N.value.getElementsByClassName("VPPluginSearch-search-group")[0];O==null||O.scrollIntoView(!0)}else(H=document.getElementById(ne.value[$.value]))==null||H.scrollIntoView(!0);Ae()}B.key=="Enter"&&w.go(t.site.value.base+((q=N.value.getElementsByClassName("link-focused")[0].getAttribute("href"))==null?void 0:q.replace(i.value,"")))}};return(B,H)=>{const q=Z("ClientOnly");return r(),p("div",za,[y(q,null,{default:v(()=>[(r(),S(wt,{to:"body"},[ze(h("div",{class:"VPPluginSearch-modal-back",onClick:H[2]||(H[2]=E=>o.value=!1),onKeydown:vt},[h("div",{class:"VPPluginSearch-modal",onClick:H[1]||(H[1]=et(()=>{},["stop"])),ref_key:"modal",ref:N},[h("form",ja,[Ua,ze(h("input",{class:"DocSearch-Input","aria-autocomplete":"both","aria-labelledby":"docsearch-label",id:"docsearch-input",autocomplete:"off",autocorrect:"off",autocapitalize:"off",enterkeyhint:"search",spellcheck:"false",autofocus:"true","onUpdate:modelValue":H[0]||(H[0]=E=>a.value=E),placeholder:b.value,maxlength:"64",type:"search",ref_key:"input",ref:c},null,8,qa),[[St,a.value]])]),h("div",Ga,[(r(!0),p(C,null,F(Q.value,(E,O)=>(r(),p("div",{class:"search-group",key:O},[h("span",Ra,M(O?O.toString()[0].toUpperCase()+O.toString().slice(1):"Home"),1),(r(!0),p(C,null,F(E,(G,se)=>(r(),p("a",{href:i.value+G.link,key:G.id,onClick:Fe,onMouseenter:le=>$.value=G.id,class:A({"link-focused":$.value==G.id}),id:se.toString()},[h("div",Ka,[h("span",Wa,M(G.link.includes("#")?"#":"▤"),1),h("div",Ja,[h("h3",null,M(G.title),1),h("p",null,[h("div",{innerHTML:G.preview},null,8,Xa)])]),Ya])],42,xa))),128))]))),128))]),Qa],512)],544),[[Lt,o.value]])]))]),_:1}),h("div",{id:"docsearch",onClick:H[3]||(H[3]=E=>K())},[h("button",Za,[h("span",ei,[ti,h("span",ni,M(P.value),1)]),h("span",si,[h("span",{class:"DocSearch-Button-Key",ref_key:"metaKey",ref:s},"Meta",512),oi])])])])}}}),ii=k({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=T();return(n,s)=>l(t).socialLinks?(r(),S(De,{key:0,class:"VPNavBarSocialLinks",links:l(t).socialLinks},null,8,["links"])):g("",!0)}}),ri=L(ii,[["__scopeId","data-v-0394ad82"]]),li=["href","rel","target"],ci={key:1},ui={key:2},di=k({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=T(),{hasSidebar:s}=Y(),{currentLang:o}=re(),a=V(()=>{var u;return typeof n.value.logoLink=="string"?n.value.logoLink:(u=n.value.logoLink)==null?void 0:u.link}),i=V(()=>{var u;return typeof n.value.logoLink=="string"||(u=n.value.logoLink)==null?void 0:u.rel}),c=V(()=>{var u;return typeof n.value.logoLink=="string"||(u=n.value.logoLink)==null?void 0:u.target});return(u,f)=>(r(),p("div",{class:A(["VPNavBarTitle",{"has-sidebar":l(s)}])},[h("a",{class:"title",href:a.value??l(Ce)(l(o).link),rel:i.value,target:c.value},[d(u.$slots,"nav-bar-title-before",{},void 0,!0),l(n).logo?(r(),S(pe,{key:0,class:"logo",image:l(n).logo},null,8,["image"])):g("",!0),l(n).siteTitle?(r(),p("span",ci,M(l(n).siteTitle),1)):l(n).siteTitle===void 0?(r(),p("span",ui,M(l(t).title),1)):g("",!0),d(u.$slots,"nav-bar-title-after",{},void 0,!0)],8,li)],2))}}),hi=L(di,[["__scopeId","data-v-ab179fa1"]]),pi={class:"items"},vi={class:"title"},fi=k({__name:"VPNavBarTranslations",setup(e){const{theme:t}=T(),{localeLinks:n,currentLang:s}=re({correspondingLink:!0});return(o,a)=>l(n).length&&l(s).label?(r(),S(Oe,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:l(t).langMenuLabel||"Change language"},{default:v(()=>[h("div",pi,[h("p",vi,M(l(s).label),1),(r(!0),p(C,null,F(l(n),i=>(r(),S($e,{key:i.link,item:i},null,8,["item"]))),128))])]),_:1},8,["label"])):g("",!0)}}),mi=L(fi,[["__scopeId","data-v-88af2de4"]]),_i=e=>(z("data-v-ccf7ddec"),e=e(),j(),e),gi={class:"wrapper"},ki={class:"container"},bi={class:"title"},$i={class:"content"},yi={class:"content-body"},Pi=_i(()=>h("div",{class:"divider"},[h("div",{class:"divider-line"})],-1)),Vi=k({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const{y:t}=Ze(),{hasSidebar:n}=Y(),{frontmatter:s}=T(),o=I({});return Je(()=>{o.value={"has-sidebar":n.value,home:s.value.layout==="home",top:t.value===0}}),(a,i)=>(r(),p("div",{class:A(["VPNavBar",o.value])},[h("div",gi,[h("div",ki,[h("div",bi,[y(hi,null,{"nav-bar-title-before":v(()=>[d(a.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[d(a.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),h("div",$i,[h("div",yi,[d(a.$slots,"nav-bar-content-before",{},void 0,!0),y(ai,{class:"search"}),y(_a,{class:"menu"}),y(mi,{class:"translations"}),y(bo,{class:"appearance"}),y(ri,{class:"social-links"}),y(na,{class:"extra"}),d(a.$slots,"nav-bar-content-after",{},void 0,!0),y(la,{class:"hamburger",active:a.isScreenOpen,onClick:i[0]||(i[0]=c=>a.$emit("toggle-screen"))},null,8,["active"])])])])]),Pi],2))}}),Li=L(Vi,[["__scopeId","data-v-ccf7ddec"]]),Si={key:0,class:"VPNavScreenAppearance"},wi={class:"text"},Ii=k({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=T();return(s,o)=>l(t).appearance&&l(t).appearance!=="force-dark"?(r(),p("div",Si,[h("p",wi,M(l(n).darkModeSwitchLabel||"Appearance"),1),y(Be)])):g("",!0)}}),Ti=L(Ii,[["__scopeId","data-v-2d7af913"]]),Ni=k({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=ke("close-screen");return(n,s)=>(r(),S(W,{class:"VPNavScreenMenuLink",href:n.item.link,target:n.item.target,rel:n.item.rel,onClick:l(t),innerHTML:n.item.text},null,8,["href","target","rel","onClick","innerHTML"]))}}),Mi=L(Ni,[["__scopeId","data-v-7f31e1f6"]]),Ai=k({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=ke("close-screen");return(n,s)=>(r(),S(W,{class:"VPNavScreenMenuGroupLink",href:n.item.link,target:n.item.target,rel:n.item.rel,onClick:l(t)},{default:v(()=>[J(M(n.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),ut=L(Ai,[["__scopeId","data-v-19976ae1"]]),Ci={class:"VPNavScreenMenuGroupSection"},Hi={key:0,class:"title"},Bi=k({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,n)=>(r(),p("div",Ci,[t.text?(r(),p("p",Hi,M(t.text),1)):g("",!0),(r(!0),p(C,null,F(t.items,s=>(r(),S(ut,{key:s.text,item:s},null,8,["item"]))),128))]))}}),Ei=L(Bi,[["__scopeId","data-v-8133b170"]]),Oi=e=>(z("data-v-ff6087d4"),e=e(),j(),e),Di=["aria-controls","aria-expanded"],Fi=["innerHTML"],zi=Oi(()=>h("span",{class:"vpi-plus button-icon"},null,-1)),ji=["id"],Ui={key:1,class:"group"},qi=k({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,n=I(!1),s=V(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){n.value=!n.value}return(a,i)=>(r(),p("div",{class:A(["VPNavScreenMenuGroup",{open:n.value}])},[h("button",{class:"button","aria-controls":s.value,"aria-expanded":n.value,onClick:o},[h("span",{class:"button-text",innerHTML:a.text},null,8,Fi),zi],8,Di),h("div",{id:s.value,class:"items"},[(r(!0),p(C,null,F(a.items,c=>(r(),p(C,{key:c.text},["link"in c?(r(),p("div",{key:c.text,class:"item"},[y(ut,{item:c},null,8,["item"])])):(r(),p("div",Ui,[y(Ei,{text:c.text,items:c.items},null,8,["text","items"])]))],64))),128))],8,ji)],2))}}),Gi=L(qi,[["__scopeId","data-v-ff6087d4"]]),Ri={key:0,class:"VPNavScreenMenu"},xi=k({__name:"VPNavScreenMenu",setup(e){const{theme:t}=T();return(n,s)=>l(t).nav?(r(),p("nav",Ri,[(r(!0),p(C,null,F(l(t).nav,o=>(r(),p(C,{key:o.text},["link"in o?(r(),S(Mi,{key:0,item:o},null,8,["item"])):(r(),S(Gi,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):g("",!0)}}),Ki=k({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=T();return(n,s)=>l(t).socialLinks?(r(),S(De,{key:0,class:"VPNavScreenSocialLinks",links:l(t).socialLinks},null,8,["links"])):g("",!0)}}),dt=e=>(z("data-v-858fe1a4"),e=e(),j(),e),Wi=dt(()=>h("span",{class:"vpi-languages icon lang"},null,-1)),Ji=dt(()=>h("span",{class:"vpi-chevron-down icon chevron"},null,-1)),Xi={class:"list"},Yi=k({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=re({correspondingLink:!0}),s=I(!1);function o(){s.value=!s.value}return(a,i)=>l(t).length&&l(n).label?(r(),p("div",{key:0,class:A(["VPNavScreenTranslations",{open:s.value}])},[h("button",{class:"title",onClick:o},[Wi,J(" "+M(l(n).label)+" ",1),Ji]),h("ul",Xi,[(r(!0),p(C,null,F(l(t),c=>(r(),p("li",{key:c.link,class:"item"},[y(W,{class:"link",href:c.link},{default:v(()=>[J(M(c.text),1)]),_:2},1032,["href"])]))),128))])],2)):g("",!0)}}),Qi=L(Yi,[["__scopeId","data-v-858fe1a4"]]),Zi={class:"container"},er=k({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=I(null),n=tt(be?document.body:null);return(s,o)=>(r(),S(Ne,{name:"fade",onEnter:o[0]||(o[0]=a=>n.value=!0),onAfterLeave:o[1]||(o[1]=a=>n.value=!1)},{default:v(()=>[s.open?(r(),p("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[h("div",Zi,[d(s.$slots,"nav-screen-content-before",{},void 0,!0),y(xi,{class:"menu"}),y(Qi,{class:"translations"}),y(Ti,{class:"appearance"}),y(Ki,{class:"social-links"}),d(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):g("",!0)]),_:3}))}}),tr=L(er,[["__scopeId","data-v-cc5739dd"]]),nr={key:0,class:"VPNav"},sr=k({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:s}=ro(),{frontmatter:o}=T(),a=V(()=>o.value.navbar!==!1);return nt("close-screen",n),_e(()=>{be&&document.documentElement.classList.toggle("hide-nav",!a.value)}),(i,c)=>a.value?(r(),p("header",nr,[y(Li,{"is-screen-open":l(t),onToggleScreen:l(s)},{"nav-bar-title-before":v(()=>[d(i.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[d(i.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[d(i.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[d(i.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),y(tr,{open:l(t)},{"nav-screen-content-before":v(()=>[d(i.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[d(i.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):g("",!0)}}),or=L(sr,[["__scopeId","data-v-ae24b3ad"]]),ht=e=>(z("data-v-b8d55f3b"),e=e(),j(),e),ar=["role","tabindex"],ir=ht(()=>h("div",{class:"indicator"},null,-1)),rr=["onKeydown"],lr=ht(()=>h("span",{class:"vpi-chevron-right caret-icon"},null,-1)),cr=[lr],ur={key:1,class:"items"},dr=k({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:n,collapsible:s,isLink:o,isActiveLink:a,hasActiveLink:i,hasChildren:c,toggle:u}=Yt(V(()=>t.item)),f=V(()=>c.value?"section":"div"),_=V(()=>o.value?"a":"div"),m=V(()=>c.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),P=V(()=>o.value?void 0:"button"),b=V(()=>[[`level-${t.depth}`],{collapsible:s.value},{collapsed:n.value},{"is-link":o.value},{"is-active":a.value},{"has-active":i.value}]);function $(w){"key"in w&&w.key!=="Enter"||!t.item.link&&u()}function N(){t.item.link&&u()}return(w,U)=>{const D=Z("VPSidebarItem",!0);return r(),S(oe(f.value),{class:A(["VPSidebarItem",b.value])},{default:v(()=>[w.item.text?(r(),p("div",ue({key:0,class:"item",role:P.value},Tt(w.item.items?{click:$,keydown:$}:{},!0),{tabindex:w.item.items&&0}),[ir,w.item.link?(r(),S(W,{key:0,tag:_.value,class:"link",href:w.item.link,rel:w.item.rel,target:w.item.target},{default:v(()=>[(r(),S(oe(m.value),{class:"text",innerHTML:w.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(r(),S(oe(m.value),{key:1,class:"text",innerHTML:w.item.text},null,8,["innerHTML"])),w.item.collapsed!=null&&w.item.items&&w.item.items.length?(r(),p("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:N,onKeydown:It(N,["enter"]),tabindex:"0"},cr,40,rr)):g("",!0)],16,ar)):g("",!0),w.item.items&&w.item.items.length?(r(),p("div",ur,[w.depth<5?(r(!0),p(C,{key:0},F(w.item.items,K=>(r(),S(D,{key:K.text,item:K,depth:w.depth+1},null,8,["item","depth"]))),128)):g("",!0)])):g("",!0)]),_:1},8,["class"])}}}),hr=L(dr,[["__scopeId","data-v-b8d55f3b"]]),pt=e=>(z("data-v-575e6a36"),e=e(),j(),e),pr=pt(()=>h("div",{class:"curtain"},null,-1)),vr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},fr=pt(()=>h("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),mr=k({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const t=e,{sidebarGroups:n,hasSidebar:s}=Y(),o=I(null),a=tt(be?document.body:null);return X([t,o],()=>{var i;t.open?(a.value=!0,(i=o.value)==null||i.focus()):a.value=!1},{immediate:!0,flush:"post"}),(i,c)=>l(s)?(r(),p("aside",{key:0,class:A(["VPSidebar",{open:i.open}]),ref_key:"navEl",ref:o,onClick:c[0]||(c[0]=et(()=>{},["stop"]))},[pr,h("nav",vr,[fr,d(i.$slots,"sidebar-nav-before",{},void 0,!0),(r(!0),p(C,null,F(l(n),u=>(r(),p("div",{key:u.text,class:"group"},[y(hr,{item:u,depth:0},null,8,["item"])]))),128)),d(i.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):g("",!0)}}),_r=L(mr,[["__scopeId","data-v-575e6a36"]]),gr=k({__name:"VPSkipLink",setup(e){const t=ie(),n=I();X(()=>t.path,()=>n.value.focus());function s({target:o}){const a=document.getElementById(decodeURIComponent(o.hash).slice(1));if(a){const i=()=>{a.removeAttribute("tabindex"),a.removeEventListener("blur",i)};a.setAttribute("tabindex","-1"),a.addEventListener("blur",i),a.focus(),window.scrollTo(0,0)}}return(o,a)=>(r(),p(C,null,[h("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),h("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s}," Skip to content ")],64))}}),kr=L(gr,[["__scopeId","data-v-0f60ec36"]]),br=k({__name:"Layout",setup(e){const{isOpen:t,open:n,close:s}=Y(),o=ie();X(()=>o.path,s),Xt(t,s);const{frontmatter:a}=T(),i=Nt(),c=V(()=>!!i["home-hero-image"]);return nt("hero-image-slot-exists",c),(u,f)=>{const _=Z("Content");return l(a).layout!==!1?(r(),p("div",{key:0,class:A(["Layout",l(a).pageClass])},[d(u.$slots,"layout-top",{},void 0,!0),y(kr),y(Bt,{class:"backdrop",show:l(t),onClick:l(s)},null,8,["show","onClick"]),y(or,null,{"nav-bar-title-before":v(()=>[d(u.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[d(u.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[d(u.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[d(u.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[d(u.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[d(u.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),y(io,{open:l(t),onOpenMenu:l(n)},null,8,["open","onOpenMenu"]),y(_r,{open:l(t)},{"sidebar-nav-before":v(()=>[d(u.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[d(u.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),y(zs,null,{"page-top":v(()=>[d(u.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[d(u.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[d(u.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[d(u.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":v(()=>[d(u.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[d(u.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[d(u.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[d(u.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":v(()=>[d(u.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[d(u.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[d(u.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[d(u.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[d(u.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[d(u.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[d(u.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[d(u.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[d(u.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[d(u.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[d(u.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[d(u.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[d(u.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[d(u.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[d(u.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),y(Rs),d(u.$slots,"layout-bottom",{},void 0,!0)],2)):(r(),S(_,{key:1}))}}}),$r=L(br,[["__scopeId","data-v-5d98c3a5"]]),Ke={Layout:$r,enhanceApp:({app:e})=>{e.component("Badge",At)}},yr=k({__name:"HighlightTargetedHeading",setup(e){function t(){if(!window||!window.location||!window.location.hash)return;const s=decodeURIComponent(window.location.hash);if(!s)return;let o;try{o=document.querySelector(s)}catch(a){console.error(a);return}o&&(o.classList.contains("VPNolebaseHighlightTargetedHeading")||o.classList.add("VPNolebaseHighlightTargetedHeading"),o.classList.remove("VPNolebaseHighlightTargetedHeadingAnimated"),setTimeout(()=>{o&&o.classList.add("VPNolebaseHighlightTargetedHeadingAnimated")},10))}const n=ie();return te(t),X(n,async()=>{await Ae(),t()}),Mt("hashchange",t),(s,o)=>d(s.$slots,"default")}}),Vr={...Ke,Layout:()=>je(Ke.Layout,null,{"layout-top":()=>[je(yr)]})};export{Vr as R}; +import{d as k,o as r,c as p,r as d,n as A,a as J,t as M,b as S,w as v,e as g,T as Ne,_ as L,u as We,i as mt,f as _t,g as me,h as V,j as h,k as l,p as z,l as j,m as ee,q as Le,s as I,v as X,x as _e,y as te,z as Me,A as Je,B as gt,C as kt,D as Z,F as C,E as F,G as Xe,H as ge,I as y,J as oe,K as Ye,L as ie,M as ue,N as ke,O as bt,P as Qe,Q as $t,R as Ae,S as Ze,U as be,V as yt,W as Pt,X as Vt,Y as ze,Z as Lt,$ as et,a0 as St,a1 as wt,a2 as tt,a3 as nt,a4 as It,a5 as Tt,a6 as Nt,a7 as Mt,a8 as je}from"./framework.D8PMdl4T.js";const At=k({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(e){return(t,n)=>(r(),p("span",{class:A(["VPBadge",t.type])},[d(t.$slots,"default",{},()=>[J(M(t.text),1)])],2))}}),Ct={key:0,class:"VPBackdrop"},Ht=k({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(r(),S(Ne,{name:"fade"},{default:v(()=>[t.show?(r(),p("div",Ct)):g("",!0)]),_:1}))}}),Bt=L(Ht,[["__scopeId","data-v-c79a1216"]]),T=We;function Et(e,t){let n,s=!1;return()=>{n&&clearTimeout(n),s?n=setTimeout(e,t):(e(),(s=!0)&&setTimeout(()=>s=!1,t))}}function Se(e){return/^\//.test(e)?e:`/${e}`}function Ce(e){const{pathname:t,search:n,hash:s,protocol:o}=new URL(e,"http://a.com");if(mt(e)||e.startsWith("#")||!o.startsWith("http")||!_t(t))return e;const{site:a}=T(),i=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,a.value.cleanUrls?"":".html")}${n}${s}`);return me(i)}function re({correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:s,theme:o,hash:a}=T(),i=V(()=>{var u,f;return{label:(u=t.value.locales[n.value])==null?void 0:u.label,link:((f=t.value.locales[n.value])==null?void 0:f.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:V(()=>Object.entries(t.value.locales).flatMap(([u,f])=>i.value.label===f.label?[]:{text:f.label,link:Ot(f.link||(u==="root"?"/":`/${u}/`),o.value.i18nRouting!==!1&&e,s.value.relativePath.slice(i.value.link.length-1),!t.value.cleanUrls)+a.value})),currentLang:i}}function Ot(e,t,n,s){return t?e.replace(/\/$/,"")+Se(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,s?".html":"")):e}const Dt=e=>(z("data-v-d6be1790"),e=e(),j(),e),Ft={class:"NotFound"},zt={class:"code"},jt={class:"title"},Ut=Dt(()=>h("div",{class:"divider"},null,-1)),qt={class:"quote"},Gt={class:"action"},Rt=["href","aria-label"],xt=k({__name:"NotFound",setup(e){const{theme:t}=T(),{currentLang:n}=re();return(s,o)=>{var a,i,c,u,f;return r(),p("div",Ft,[h("p",zt,M(((a=l(t).notFound)==null?void 0:a.code)??"404"),1),h("h1",jt,M(((i=l(t).notFound)==null?void 0:i.title)??"PAGE NOT FOUND"),1),Ut,h("blockquote",qt,M(((c=l(t).notFound)==null?void 0:c.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),h("div",Gt,[h("a",{class:"link",href:l(me)(l(n).link),"aria-label":((u=l(t).notFound)==null?void 0:u.linkLabel)??"go to home"},M(((f=l(t).notFound)==null?void 0:f.linkText)??"Take me home"),9,Rt)])])}}}),Kt=L(xt,[["__scopeId","data-v-d6be1790"]]);function st(e,t){if(Array.isArray(e))return de(e);if(e==null)return[];t=Se(t);const n=Object.keys(e).sort((o,a)=>a.split("/").length-o.split("/").length).find(o=>t.startsWith(Se(o))),s=n?e[n]:[];return Array.isArray(s)?de(s):de(s.items,s.base)}function Wt(e){const t=[];let n=0;for(const s in e){const o=e[s];if(o.items){n=t.push(o);continue}t[n]||t.push({items:[]}),t[n].items.push(o)}return t}function Jt(e){const t=[];function n(s){for(const o of s)o.text&&o.link&&t.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&n(o.items)}return n(e),t}function we(e,t){return Array.isArray(t)?t.some(n=>we(e,n)):ee(e,t.link)?!0:t.items?we(e,t.items):!1}function de(e,t){return[...e].map(n=>{const s={...n},o=s.base||t;return o&&s.link&&(s.link=o+s.link),s.items&&(s.items=de(s.items,o)),s})}function Y(){const{frontmatter:e,page:t,theme:n}=T(),s=Le("(min-width: 960px)"),o=I(!1),a=V(()=>{const N=n.value.sidebar,w=t.value.relativePath;return N?st(N,w):[]}),i=I(a.value);X(a,(N,w)=>{JSON.stringify(N)!==JSON.stringify(w)&&(i.value=a.value)});const c=V(()=>e.value.sidebar!==!1&&i.value.length>0&&e.value.layout!=="home"),u=V(()=>f?e.value.aside==null?n.value.aside==="left":e.value.aside==="left":!1),f=V(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:n.value.aside!==!1),_=V(()=>c.value&&s.value),m=V(()=>c.value?Wt(i.value):[]);function P(){o.value=!0}function b(){o.value=!1}function $(){o.value?b():P()}return{isOpen:o,sidebar:i,sidebarGroups:m,hasSidebar:c,hasAside:f,leftAside:u,isSidebarEnabled:_,open:P,close:b,toggle:$}}function Xt(e,t){let n;_e(()=>{n=e.value?document.activeElement:void 0}),te(()=>{window.addEventListener("keyup",s)}),Me(()=>{window.removeEventListener("keyup",s)});function s(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function Yt(e){const{page:t,hash:n}=T(),s=I(!1),o=V(()=>e.value.collapsed!=null),a=V(()=>!!e.value.link),i=I(!1),c=()=>{i.value=ee(t.value.relativePath,e.value.link)};X([t,e,n],c),te(c);const u=V(()=>i.value?!0:e.value.items?we(t.value.relativePath,e.value.items):!1),f=V(()=>!!(e.value.items&&e.value.items.length));_e(()=>{s.value=!!(o.value&&e.value.collapsed)}),Je(()=>{(i.value||u.value)&&(s.value=!1)});function _(){o.value&&(s.value=!s.value)}return{collapsed:s,collapsible:o,isLink:a,isActiveLink:i,hasActiveLink:u,hasChildren:f,toggle:_}}function Qt(){const{hasSidebar:e}=Y(),t=Le("(min-width: 960px)"),n=Le("(min-width: 1280px)");return{isAsideEnabled:V(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const Ie=[];function ot(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function He(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const s=Number(n.tagName[1]);return{element:n,title:Zt(n),link:"#"+n.id,level:s}});return en(t,e)}function Zt(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if(n.classList.contains("VPBadge")||n.classList.contains("header-anchor")||n.classList.contains("ignore-header"))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function en(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[s,o]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;e=e.filter(i=>i.level>=s&&i.level<=o),Ie.length=0;for(const{element:i,link:c}of e)Ie.push({element:i,link:c});const a=[];e:for(let i=0;i=0;u--){const f=e[u];if(f.level{requestAnimationFrame(a),window.addEventListener("scroll",s)}),gt(()=>{i(location.hash)}),Me(()=>{window.removeEventListener("scroll",s)});function a(){if(!n.value)return;const c=window.scrollY,u=window.innerHeight,f=document.body.offsetHeight,_=Math.abs(c+u-f)<1,m=Ie.map(({element:b,link:$})=>({link:$,top:nn(b)})).filter(({top:b})=>!Number.isNaN(b)).sort((b,$)=>b.top-$.top);if(!m.length){i(null);return}if(c<1){i(null);return}if(_){i(m[m.length-1].link);return}let P=null;for(const{link:b,top:$}of m){if($>c+kt()+4)break;P=b}i(P)}function i(c){o&&o.classList.remove("active"),c==null?o=null:o=e.value.querySelector(`a[href="${decodeURIComponent(c)}"]`);const u=o;u?(u.classList.add("active"),t.value.style.top=u.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function nn(e){let t=0;for(;e!==document.body;){if(e===null)return NaN;t+=e.offsetTop,e=e.offsetParent}return t}const sn=["href","title"],on=k({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(e){function t({target:n}){const s=n.href.split("#")[1],o=document.getElementById(decodeURIComponent(s));o==null||o.focus({preventScroll:!0})}return(n,s)=>{const o=Z("VPDocOutlineItem",!0);return r(),p("ul",{class:A(["VPDocOutlineItem",n.root?"root":"nested"])},[(r(!0),p(C,null,F(n.headers,({children:a,link:i,title:c})=>(r(),p("li",null,[h("a",{class:"outline-link",href:i,onClick:t,title:c},M(c),9,sn),a!=null&&a.length?(r(),S(o,{key:0,headers:a},null,8,["headers"])):g("",!0)]))),256))],2)}}}),at=L(on,[["__scopeId","data-v-b933a997"]]),an={class:"content"},rn={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},ln=k({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=T(),s=Xe([]);ge(()=>{s.value=He(t.value.outline??n.value.outline)});const o=I(),a=I();return tn(o,a),(i,c)=>(r(),p("nav",{"aria-labelledby":"doc-outline-aria-label",class:A(["VPDocAsideOutline",{"has-outline":s.value.length>0}]),ref_key:"container",ref:o},[h("div",an,[h("div",{class:"outline-marker",ref_key:"marker",ref:a},null,512),h("div",rn,M(l(ot)(l(n))),1),y(at,{headers:s.value,root:!0},null,8,["headers"])])],2))}}),cn=L(ln,[["__scopeId","data-v-a5bbad30"]]),un={class:"VPDocAsideCarbonAds"},dn=k({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(n,s)=>(r(),p("div",un,[y(l(t),{"carbon-ads":n.carbonAds},null,8,["carbon-ads"])]))}}),hn=e=>(z("data-v-3f215769"),e=e(),j(),e),pn={class:"VPDocAside"},vn=hn(()=>h("div",{class:"spacer"},null,-1)),fn=k({__name:"VPDocAside",setup(e){const{theme:t}=T();return(n,s)=>(r(),p("div",pn,[d(n.$slots,"aside-top",{},void 0,!0),d(n.$slots,"aside-outline-before",{},void 0,!0),y(cn),d(n.$slots,"aside-outline-after",{},void 0,!0),vn,d(n.$slots,"aside-ads-before",{},void 0,!0),l(t).carbonAds?(r(),S(dn,{key:0,"carbon-ads":l(t).carbonAds},null,8,["carbon-ads"])):g("",!0),d(n.$slots,"aside-ads-after",{},void 0,!0),d(n.$slots,"aside-bottom",{},void 0,!0)]))}}),mn=L(fn,[["__scopeId","data-v-3f215769"]]);function _n(){const{theme:e,page:t}=T();return V(()=>{const{text:n="Edit this page",pattern:s=""}=e.value.editLink||{};let o;return typeof s=="function"?o=s(t.value):o=s.replace(/:path/g,t.value.filePath),{url:o,text:n}})}function gn(){const{page:e,theme:t,frontmatter:n}=T();return V(()=>{var f,_,m,P,b,$,N,w;const s=st(t.value.sidebar,e.value.relativePath),o=Jt(s),a=kn(o,U=>U.link.replace(/[?#].*$/,"")),i=a.findIndex(U=>ee(e.value.relativePath,U.link)),c=((f=t.value.docFooter)==null?void 0:f.prev)===!1&&!n.value.prev||n.value.prev===!1,u=((_=t.value.docFooter)==null?void 0:_.next)===!1&&!n.value.next||n.value.next===!1;return{prev:c?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((m=a[i-1])==null?void 0:m.docFooterText)??((P=a[i-1])==null?void 0:P.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((b=a[i-1])==null?void 0:b.link)},next:u?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??(($=a[i+1])==null?void 0:$.docFooterText)??((N=a[i+1])==null?void 0:N.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((w=a[i+1])==null?void 0:w.link)}}})}function kn(e,t){const n=new Set;return e.filter(s=>{const o=t(s);return n.has(o)?!1:n.add(o)})}const W=k({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,n=V(()=>t.tag??(t.href?"a":"span")),s=V(()=>t.href&&Ye.test(t.href)||t.target==="_blank");return(o,a)=>(r(),S(oe(n.value),{class:A(["VPLink",{link:o.href,"vp-external-link-icon":s.value,"no-icon":o.noIcon}]),href:o.href?l(Ce)(o.href):void 0,target:o.target??(s.value?"_blank":void 0),rel:o.rel??(s.value?"noreferrer":void 0)},{default:v(()=>[d(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),bn={class:"VPLastUpdated"},$n=["datetime"],yn=k({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,frontmatter:s,lang:o}=T(),a=V(()=>new Date(s.value.lastUpdated??n.value.lastUpdated)),i=V(()=>a.value.toISOString()),c=I("");return te(()=>{_e(()=>{var u,f,_;c.value=new Intl.DateTimeFormat((f=(u=t.value.lastUpdated)==null?void 0:u.formatOptions)!=null&&f.forceLocale?o.value:void 0,((_=t.value.lastUpdated)==null?void 0:_.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(a.value)})}),(u,f)=>{var _;return r(),p("p",bn,[J(M(((_=l(t).lastUpdated)==null?void 0:_.text)||l(t).lastUpdatedText||"Last updated")+": ",1),h("time",{datetime:i.value},M(c.value),9,$n)])}}}),Pn=L(yn,[["__scopeId","data-v-7e05ebdb"]]),it=e=>(z("data-v-d4a0bba5"),e=e(),j(),e),Vn={key:0,class:"VPDocFooter"},Ln={key:0,class:"edit-info"},Sn={key:0,class:"edit-link"},wn=it(()=>h("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),In={key:1,class:"last-updated"},Tn={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Nn=it(()=>h("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),Mn={class:"pager"},An=["innerHTML"],Cn=["innerHTML"],Hn={class:"pager"},Bn=["innerHTML"],En=["innerHTML"],On=k({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:s}=T(),o=_n(),a=gn(),i=V(()=>t.value.editLink&&s.value.editLink!==!1),c=V(()=>n.value.lastUpdated&&s.value.lastUpdated!==!1),u=V(()=>i.value||c.value||a.value.prev||a.value.next);return(f,_)=>{var m,P,b,$;return u.value?(r(),p("footer",Vn,[d(f.$slots,"doc-footer-before",{},void 0,!0),i.value||c.value?(r(),p("div",Ln,[i.value?(r(),p("div",Sn,[y(W,{class:"edit-link-button",href:l(o).url,"no-icon":!0},{default:v(()=>[wn,J(" "+M(l(o).text),1)]),_:1},8,["href"])])):g("",!0),c.value?(r(),p("div",In,[y(Pn)])):g("",!0)])):g("",!0),(m=l(a).prev)!=null&&m.link||(P=l(a).next)!=null&&P.link?(r(),p("nav",Tn,[Nn,h("div",Mn,[(b=l(a).prev)!=null&&b.link?(r(),S(W,{key:0,class:"pager-link prev",href:l(a).prev.link},{default:v(()=>{var N;return[h("span",{class:"desc",innerHTML:((N=l(t).docFooter)==null?void 0:N.prev)||"Previous page"},null,8,An),h("span",{class:"title",innerHTML:l(a).prev.text},null,8,Cn)]}),_:1},8,["href"])):g("",!0)]),h("div",Hn,[($=l(a).next)!=null&&$.link?(r(),S(W,{key:0,class:"pager-link next",href:l(a).next.link},{default:v(()=>{var N;return[h("span",{class:"desc",innerHTML:((N=l(t).docFooter)==null?void 0:N.next)||"Next page"},null,8,Bn),h("span",{class:"title",innerHTML:l(a).next.text},null,8,En)]}),_:1},8,["href"])):g("",!0)])])):g("",!0)])):g("",!0)}}}),Dn=L(On,[["__scopeId","data-v-d4a0bba5"]]),Fn=e=>(z("data-v-39a288b8"),e=e(),j(),e),zn={class:"container"},jn=Fn(()=>h("div",{class:"aside-curtain"},null,-1)),Un={class:"aside-container"},qn={class:"aside-content"},Gn={class:"content"},Rn={class:"content-container"},xn={class:"main"},Kn=k({__name:"VPDoc",setup(e){const{theme:t}=T(),n=ie(),{hasSidebar:s,hasAside:o,leftAside:a}=Y(),i=V(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(c,u)=>{const f=Z("Content");return r(),p("div",{class:A(["VPDoc",{"has-sidebar":l(s),"has-aside":l(o)}])},[d(c.$slots,"doc-top",{},void 0,!0),h("div",zn,[l(o)?(r(),p("div",{key:0,class:A(["aside",{"left-aside":l(a)}])},[jn,h("div",Un,[h("div",qn,[y(mn,null,{"aside-top":v(()=>[d(c.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[d(c.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[d(c.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[d(c.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[d(c.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[d(c.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):g("",!0),h("div",Gn,[h("div",Rn,[d(c.$slots,"doc-before",{},void 0,!0),h("main",xn,[y(f,{class:A(["vp-doc",[i.value,l(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),y(Dn,null,{"doc-footer-before":v(()=>[d(c.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),d(c.$slots,"doc-after",{},void 0,!0)])])]),d(c.$slots,"doc-bottom",{},void 0,!0)],2)}}}),Wn=L(Kn,[["__scopeId","data-v-39a288b8"]]),Jn=k({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(e){const t=e,n=V(()=>t.href&&Ye.test(t.href)),s=V(()=>t.tag||t.href?"a":"button");return(o,a)=>(r(),S(oe(s.value),{class:A(["VPButton",[o.size,o.theme]]),href:o.href?l(Ce)(o.href):void 0,target:t.target??(n.value?"_blank":void 0),rel:t.rel??(n.value?"noreferrer":void 0)},{default:v(()=>[J(M(o.text),1)]),_:1},8,["class","href","target","rel"]))}}),Xn=L(Jn,[["__scopeId","data-v-cad61b99"]]),Yn=["src","alt"],Qn=k({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,n)=>{const s=Z("VPImage",!0);return t.image?(r(),p(C,{key:0},[typeof t.image=="string"||"src"in t.image?(r(),p("img",ue({key:0,class:"VPImage"},typeof t.image=="string"?t.$attrs:{...t.image,...t.$attrs},{src:l(me)(typeof t.image=="string"?t.image:t.image.src),alt:t.alt??(typeof t.image=="string"?"":t.image.alt||"")}),null,16,Yn)):(r(),p(C,{key:1},[y(s,ue({class:"dark",image:t.image.dark,alt:t.image.alt},t.$attrs),null,16,["image","alt"]),y(s,ue({class:"light",image:t.image.light,alt:t.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):g("",!0)}}}),pe=L(Qn,[["__scopeId","data-v-8426fc1a"]]),Zn=e=>(z("data-v-303bb580"),e=e(),j(),e),es={class:"container"},ts={class:"main"},ns={key:0,class:"name"},ss=["innerHTML"],os=["innerHTML"],as=["innerHTML"],is={key:0,class:"actions"},rs={key:0,class:"image"},ls={class:"image-container"},cs=Zn(()=>h("div",{class:"image-bg"},null,-1)),us=k({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const t=ke("hero-image-slot-exists");return(n,s)=>(r(),p("div",{class:A(["VPHero",{"has-image":n.image||l(t)}])},[h("div",es,[h("div",ts,[d(n.$slots,"home-hero-info-before",{},void 0,!0),d(n.$slots,"home-hero-info",{},()=>[n.name?(r(),p("h1",ns,[h("span",{innerHTML:n.name,class:"clip"},null,8,ss)])):g("",!0),n.text?(r(),p("p",{key:1,innerHTML:n.text,class:"text"},null,8,os)):g("",!0),n.tagline?(r(),p("p",{key:2,innerHTML:n.tagline,class:"tagline"},null,8,as)):g("",!0)],!0),d(n.$slots,"home-hero-info-after",{},void 0,!0),n.actions?(r(),p("div",is,[(r(!0),p(C,null,F(n.actions,o=>(r(),p("div",{key:o.link,class:"action"},[y(Xn,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link,target:o.target,rel:o.rel},null,8,["theme","text","href","target","rel"])]))),128))])):g("",!0),d(n.$slots,"home-hero-actions-after",{},void 0,!0)]),n.image||l(t)?(r(),p("div",rs,[h("div",ls,[cs,d(n.$slots,"home-hero-image",{},()=>[n.image?(r(),S(pe,{key:0,class:"image-src",image:n.image},null,8,["image"])):g("",!0)],!0)])])):g("",!0)])],2))}}),ds=L(us,[["__scopeId","data-v-303bb580"]]),hs=k({__name:"VPHomeHero",setup(e){const{frontmatter:t}=T();return(n,s)=>l(t).hero?(r(),S(ds,{key:0,class:"VPHomeHero",name:l(t).hero.name,text:l(t).hero.text,tagline:l(t).hero.tagline,image:l(t).hero.image,actions:l(t).hero.actions},{"home-hero-info-before":v(()=>[d(n.$slots,"home-hero-info-before")]),"home-hero-info":v(()=>[d(n.$slots,"home-hero-info")]),"home-hero-info-after":v(()=>[d(n.$slots,"home-hero-info-after")]),"home-hero-actions-after":v(()=>[d(n.$slots,"home-hero-actions-after")]),"home-hero-image":v(()=>[d(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):g("",!0)}}),ps=e=>(z("data-v-a3976bdc"),e=e(),j(),e),vs={class:"box"},fs={key:0,class:"icon"},ms=["innerHTML"],_s=["innerHTML"],gs=["innerHTML"],ks={key:4,class:"link-text"},bs={class:"link-text-value"},$s=ps(()=>h("span",{class:"vpi-arrow-right link-text-icon"},null,-1)),ys=k({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,n)=>(r(),S(W,{class:"VPFeature",href:t.link,rel:t.rel,target:t.target,"no-icon":!0,tag:t.link?"a":"div"},{default:v(()=>[h("article",vs,[typeof t.icon=="object"&&t.icon.wrap?(r(),p("div",fs,[y(pe,{image:t.icon,alt:t.icon.alt,height:t.icon.height||48,width:t.icon.width||48},null,8,["image","alt","height","width"])])):typeof t.icon=="object"?(r(),S(pe,{key:1,image:t.icon,alt:t.icon.alt,height:t.icon.height||48,width:t.icon.width||48},null,8,["image","alt","height","width"])):t.icon?(r(),p("div",{key:2,class:"icon",innerHTML:t.icon},null,8,ms)):g("",!0),h("h2",{class:"title",innerHTML:t.title},null,8,_s),t.details?(r(),p("p",{key:3,class:"details",innerHTML:t.details},null,8,gs)):g("",!0),t.linkText?(r(),p("div",ks,[h("p",bs,[J(M(t.linkText)+" ",1),$s])])):g("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Ps=L(ys,[["__scopeId","data-v-a3976bdc"]]),Vs={key:0,class:"VPFeatures"},Ls={class:"container"},Ss={class:"items"},ws=k({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,n=V(()=>{const s=t.features.length;if(s){if(s===2)return"grid-2";if(s===3)return"grid-3";if(s%3===0)return"grid-6";if(s>3)return"grid-4"}else return});return(s,o)=>s.features?(r(),p("div",Vs,[h("div",Ls,[h("div",Ss,[(r(!0),p(C,null,F(s.features,a=>(r(),p("div",{key:a.title,class:A(["item",[n.value]])},[y(Ps,{icon:a.icon,title:a.title,details:a.details,link:a.link,"link-text":a.linkText,rel:a.rel,target:a.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):g("",!0)}}),Is=L(ws,[["__scopeId","data-v-a6181336"]]),Ts=k({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=T();return(n,s)=>l(t).features?(r(),S(Is,{key:0,class:"VPHomeFeatures",features:l(t).features},null,8,["features"])):g("",!0)}}),Ns=k({__name:"VPHomeContent",setup(e){const{width:t}=bt({initialWidth:0,includeScrollbar:!1});return(n,s)=>(r(),p("div",{class:"vp-doc container",style:Qe(l(t)?{"--vp-offset":`calc(50% - ${l(t)/2}px)`}:{})},[d(n.$slots,"default",{},void 0,!0)],4))}}),Ms=L(Ns,[["__scopeId","data-v-8e2d4988"]]),As={class:"VPHome"},Cs=k({__name:"VPHome",setup(e){const{frontmatter:t}=T();return(n,s)=>{const o=Z("Content");return r(),p("div",As,[d(n.$slots,"home-hero-before",{},void 0,!0),y(hs,null,{"home-hero-info-before":v(()=>[d(n.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[d(n.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[d(n.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[d(n.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":v(()=>[d(n.$slots,"home-hero-image",{},void 0,!0)]),_:3}),d(n.$slots,"home-hero-after",{},void 0,!0),d(n.$slots,"home-features-before",{},void 0,!0),y(Ts),d(n.$slots,"home-features-after",{},void 0,!0),l(t).markdownStyles!==!1?(r(),S(Ms,{key:0},{default:v(()=>[y(o)]),_:1})):(r(),S(o,{key:1}))])}}}),Hs=L(Cs,[["__scopeId","data-v-686f80a6"]]),Bs={},Es={class:"VPPage"};function Os(e,t){const n=Z("Content");return r(),p("div",Es,[d(e.$slots,"page-top"),y(n),d(e.$slots,"page-bottom")])}const Ds=L(Bs,[["render",Os]]),Fs=k({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=T(),{hasSidebar:s}=Y();return(o,a)=>(r(),p("div",{class:A(["VPContent",{"has-sidebar":l(s),"is-home":l(n).layout==="home"}]),id:"VPContent"},[l(t).isNotFound?d(o.$slots,"not-found",{key:0},()=>[y(Kt)],!0):l(n).layout==="page"?(r(),S(Ds,{key:1},{"page-top":v(()=>[d(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[d(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):l(n).layout==="home"?(r(),S(Hs,{key:2},{"home-hero-before":v(()=>[d(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":v(()=>[d(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[d(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[d(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[d(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":v(()=>[d(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[d(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[d(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[d(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):l(n).layout&&l(n).layout!=="doc"?(r(),S(oe(l(n).layout),{key:3})):(r(),S(Wn,{key:4},{"doc-top":v(()=>[d(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[d(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[d(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[d(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[d(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[d(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[d(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[d(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[d(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[d(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[d(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),zs=L(Fs,[["__scopeId","data-v-1428d186"]]),js={class:"container"},Us=["innerHTML"],qs=["innerHTML"],Gs=k({__name:"VPFooter",setup(e){const{theme:t,frontmatter:n}=T(),{hasSidebar:s}=Y();return(o,a)=>l(t).footer&&l(n).footer!==!1?(r(),p("footer",{key:0,class:A(["VPFooter",{"has-sidebar":l(s)}])},[h("div",js,[l(t).footer.message?(r(),p("p",{key:0,class:"message",innerHTML:l(t).footer.message},null,8,Us)):g("",!0),l(t).footer.copyright?(r(),p("p",{key:1,class:"copyright",innerHTML:l(t).footer.copyright},null,8,qs)):g("",!0)])],2)):g("",!0)}}),Rs=L(Gs,[["__scopeId","data-v-e315a0ad"]]);function xs(){const{theme:e,frontmatter:t}=T(),n=Xe([]),s=V(()=>n.value.length>0);return ge(()=>{n.value=He(t.value.outline??e.value.outline)}),{headers:n,hasLocalNav:s}}const Ks=e=>(z("data-v-17a5e62e"),e=e(),j(),e),Ws={class:"menu-text"},Js=Ks(()=>h("span",{class:"vpi-chevron-right icon"},null,-1)),Xs={class:"header"},Ys={class:"outline"},Qs=k({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:n}=T(),s=I(!1),o=I(0),a=I(),i=I();function c(m){var P;(P=a.value)!=null&&P.contains(m.target)||(s.value=!1)}X(s,m=>{if(m){document.addEventListener("click",c);return}document.removeEventListener("click",c)}),$t("Escape",()=>{s.value=!1}),ge(()=>{s.value=!1});function u(){s.value=!s.value,o.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function f(m){m.target.classList.contains("outline-link")&&(i.value&&(i.value.style.transition="none"),Ae(()=>{s.value=!1}))}function _(){s.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(m,P)=>(r(),p("div",{class:"VPLocalNavOutlineDropdown",style:Qe({"--vp-vh":o.value+"px"}),ref_key:"main",ref:a},[m.headers.length>0?(r(),p("button",{key:0,onClick:u,class:A({open:s.value})},[h("span",Ws,M(l(ot)(l(n))),1),Js],2)):(r(),p("button",{key:1,onClick:_},M(l(n).returnToTopLabel||"Return to top"),1)),y(Ne,{name:"flyout"},{default:v(()=>[s.value?(r(),p("div",{key:0,ref_key:"items",ref:i,class:"items",onClick:f},[h("div",Xs,[h("a",{class:"top-link",href:"#",onClick:_},M(l(n).returnToTopLabel||"Return to top"),1)]),h("div",Ys,[y(at,{headers:m.headers},null,8,["headers"])])],512)):g("",!0)]),_:1})],4))}}),Zs=L(Qs,[["__scopeId","data-v-17a5e62e"]]),eo=e=>(z("data-v-a6f0e41e"),e=e(),j(),e),to={class:"container"},no=["aria-expanded"],so=eo(()=>h("span",{class:"vpi-align-left menu-icon"},null,-1)),oo={class:"menu-text"},ao=k({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:n}=T(),{hasSidebar:s}=Y(),{headers:o}=xs(),{y:a}=Ze(),i=I(0);te(()=>{i.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),ge(()=>{o.value=He(n.value.outline??t.value.outline)});const c=V(()=>o.value.length===0),u=V(()=>c.value&&!s.value),f=V(()=>({VPLocalNav:!0,"has-sidebar":s.value,empty:c.value,fixed:u.value}));return(_,m)=>l(n).layout!=="home"&&(!u.value||l(a)>=i.value)?(r(),p("div",{key:0,class:A(f.value)},[h("div",to,[l(s)?(r(),p("button",{key:0,class:"menu","aria-expanded":_.open,"aria-controls":"VPSidebarNav",onClick:m[0]||(m[0]=P=>_.$emit("open-menu"))},[so,h("span",oo,M(l(t).sidebarMenuLabel||"Menu"),1)],8,no)):g("",!0),y(Zs,{headers:l(o),navHeight:i.value},null,8,["headers","navHeight"])])],2)):g("",!0)}}),io=L(ao,[["__scopeId","data-v-a6f0e41e"]]);function ro(){const e=I(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function s(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const a=ie();return X(()=>a.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:s}}const lo={},co={class:"VPSwitch",type:"button",role:"switch"},uo={class:"check"},ho={key:0,class:"icon"};function po(e,t){return r(),p("button",co,[h("span",uo,[e.$slots.default?(r(),p("span",ho,[d(e.$slots,"default",{},void 0,!0)])):g("",!0)])])}const vo=L(lo,[["render",po],["__scopeId","data-v-1d5665e3"]]),rt=e=>(z("data-v-d1f28634"),e=e(),j(),e),fo=rt(()=>h("span",{class:"vpi-sun sun"},null,-1)),mo=rt(()=>h("span",{class:"vpi-moon moon"},null,-1)),_o=k({__name:"VPSwitchAppearance",setup(e){const{isDark:t,theme:n}=T(),s=ke("toggle-appearance",()=>{t.value=!t.value}),o=V(()=>t.value?n.value.lightModeSwitchTitle||"Switch to light theme":n.value.darkModeSwitchTitle||"Switch to dark theme");return(a,i)=>(r(),S(vo,{title:o.value,class:"VPSwitchAppearance","aria-checked":l(t),onClick:l(s)},{default:v(()=>[fo,mo]),_:1},8,["title","aria-checked","onClick"]))}}),Be=L(_o,[["__scopeId","data-v-d1f28634"]]),go={key:0,class:"VPNavBarAppearance"},ko=k({__name:"VPNavBarAppearance",setup(e){const{site:t}=T();return(n,s)=>l(t).appearance&&l(t).appearance!=="force-dark"?(r(),p("div",go,[y(Be)])):g("",!0)}}),bo=L(ko,[["__scopeId","data-v-e6aabb21"]]),Ee=I();let lt=!1,ye=0;function $o(e){const t=I(!1);if(be){!lt&&yo(),ye++;const n=X(Ee,s=>{var o,a,i;s===e.el.value||(o=e.el.value)!=null&&o.contains(s)?(t.value=!0,(a=e.onFocus)==null||a.call(e)):(t.value=!1,(i=e.onBlur)==null||i.call(e))});Me(()=>{n(),ye--,ye||Po()})}return yt(t)}function yo(){document.addEventListener("focusin",ct),lt=!0,Ee.value=document.activeElement}function Po(){document.removeEventListener("focusin",ct)}function ct(){Ee.value=document.activeElement}const Vo={class:"VPMenuLink"},Lo=k({__name:"VPMenuLink",props:{item:{}},setup(e){const{page:t}=T();return(n,s)=>(r(),p("div",Vo,[y(W,{class:A({active:l(ee)(l(t).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel},{default:v(()=>[J(M(n.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),$e=L(Lo,[["__scopeId","data-v-43f1e123"]]),So={class:"VPMenuGroup"},wo={key:0,class:"title"},Io=k({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,n)=>(r(),p("div",So,[t.text?(r(),p("p",wo,M(t.text),1)):g("",!0),(r(!0),p(C,null,F(t.items,s=>(r(),p(C,null,["link"in s?(r(),S($e,{key:0,item:s},null,8,["item"])):g("",!0)],64))),256))]))}}),To=L(Io,[["__scopeId","data-v-69e747b5"]]),No={class:"VPMenu"},Mo={key:0,class:"items"},Ao=k({__name:"VPMenu",props:{items:{}},setup(e){return(t,n)=>(r(),p("div",No,[t.items?(r(),p("div",Mo,[(r(!0),p(C,null,F(t.items,s=>(r(),p(C,{key:s.text},["link"in s?(r(),S($e,{key:0,item:s},null,8,["item"])):(r(),S(To,{key:1,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):g("",!0),d(t.$slots,"default",{},void 0,!0)]))}}),Co=L(Ao,[["__scopeId","data-v-e7ea1737"]]),Ho=e=>(z("data-v-b6c34ac9"),e=e(),j(),e),Bo=["aria-expanded","aria-label"],Eo={key:0,class:"text"},Oo=["innerHTML"],Do=Ho(()=>h("span",{class:"vpi-chevron-down text-icon"},null,-1)),Fo={key:1,class:"vpi-more-horizontal icon"},zo={class:"menu"},jo=k({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=I(!1),n=I();$o({el:n,onBlur:s});function s(){t.value=!1}return(o,a)=>(r(),p("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:a[1]||(a[1]=i=>t.value=!0),onMouseleave:a[2]||(a[2]=i=>t.value=!1)},[h("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":o.label,onClick:a[0]||(a[0]=i=>t.value=!t.value)},[o.button||o.icon?(r(),p("span",Eo,[o.icon?(r(),p("span",{key:0,class:A([o.icon,"option-icon"])},null,2)):g("",!0),o.button?(r(),p("span",{key:1,innerHTML:o.button},null,8,Oo)):g("",!0),Do])):(r(),p("span",Fo))],8,Bo),h("div",zo,[y(Co,{items:o.items},{default:v(()=>[d(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),Oe=L(jo,[["__scopeId","data-v-b6c34ac9"]]),Uo=["href","aria-label","innerHTML"],qo=k({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(e){const t=e,n=V(()=>typeof t.icon=="object"?t.icon.svg:``);return(s,o)=>(r(),p("a",{class:"VPSocialLink no-icon",href:s.link,"aria-label":s.ariaLabel??(typeof s.icon=="string"?s.icon:""),target:"_blank",rel:"noopener",innerHTML:n.value},null,8,Uo))}}),Go=L(qo,[["__scopeId","data-v-eee4e7cb"]]),Ro={class:"VPSocialLinks"},xo=k({__name:"VPSocialLinks",props:{links:{}},setup(e){return(t,n)=>(r(),p("div",Ro,[(r(!0),p(C,null,F(t.links,({link:s,icon:o,ariaLabel:a})=>(r(),S(Go,{key:s,icon:o,link:s,ariaLabel:a},null,8,["icon","link","ariaLabel"]))),128))]))}}),De=L(xo,[["__scopeId","data-v-7bc22406"]]),Ko={key:0,class:"group translations"},Wo={class:"trans-title"},Jo={key:1,class:"group"},Xo={class:"item appearance"},Yo={class:"label"},Qo={class:"appearance-action"},Zo={key:2,class:"group"},ea={class:"item social-links"},ta=k({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=T(),{localeLinks:s,currentLang:o}=re({correspondingLink:!0}),a=V(()=>s.value.length&&o.value.label||t.value.appearance||n.value.socialLinks);return(i,c)=>a.value?(r(),S(Oe,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[l(s).length&&l(o).label?(r(),p("div",Ko,[h("p",Wo,M(l(o).label),1),(r(!0),p(C,null,F(l(s),u=>(r(),S($e,{key:u.link,item:u},null,8,["item"]))),128))])):g("",!0),l(t).appearance&&l(t).appearance!=="force-dark"?(r(),p("div",Jo,[h("div",Xo,[h("p",Yo,M(l(n).darkModeSwitchLabel||"Appearance"),1),h("div",Qo,[y(Be)])])])):g("",!0),l(n).socialLinks?(r(),p("div",Zo,[h("div",ea,[y(De,{class:"social-links-list",links:l(n).socialLinks},null,8,["links"])])])):g("",!0)]),_:1})):g("",!0)}}),na=L(ta,[["__scopeId","data-v-d0bd9dde"]]),sa=e=>(z("data-v-e5dd9c1c"),e=e(),j(),e),oa=["aria-expanded"],aa=sa(()=>h("span",{class:"container"},[h("span",{class:"top"}),h("span",{class:"middle"}),h("span",{class:"bottom"})],-1)),ia=[aa],ra=k({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(r(),p("button",{type:"button",class:A(["VPNavBarHamburger",{active:t.active}]),"aria-label":"mobile navigation","aria-expanded":t.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=s=>t.$emit("click"))},ia,10,oa))}}),la=L(ra,[["__scopeId","data-v-e5dd9c1c"]]),ca=["innerHTML"],ua=k({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const{page:t}=T();return(n,s)=>(r(),S(W,{class:A({VPNavBarMenuLink:!0,active:l(ee)(l(t).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,noIcon:n.item.noIcon,target:n.item.target,rel:n.item.rel,tabindex:"0"},{default:v(()=>[h("span",{innerHTML:n.item.text},null,8,ca)]),_:1},8,["class","href","noIcon","target","rel"]))}}),da=L(ua,[["__scopeId","data-v-9c663999"]]),ha=k({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:n}=T(),s=a=>"link"in a?ee(n.value.relativePath,a.link,!!t.item.activeMatch):a.items.some(s),o=V(()=>s(t.item));return(a,i)=>(r(),S(Oe,{class:A({VPNavBarMenuGroup:!0,active:l(ee)(l(n).relativePath,a.item.activeMatch,!!a.item.activeMatch)||o.value}),button:a.item.text,items:a.item.items},null,8,["class","button","items"]))}}),pa=e=>(z("data-v-7f418b0f"),e=e(),j(),e),va={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},fa=pa(()=>h("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),ma=k({__name:"VPNavBarMenu",setup(e){const{theme:t}=T();return(n,s)=>l(t).nav?(r(),p("nav",va,[fa,(r(!0),p(C,null,F(l(t).nav,o=>(r(),p(C,{key:o.text},["link"in o?(r(),S(da,{key:0,item:o},null,8,["item"])):(r(),S(ha,{key:1,item:o},null,8,["item"]))],64))),128))])):g("",!0)}}),_a=L(ma,[["__scopeId","data-v-7f418b0f"]]),ga="/assets/flex-logo.BJA2J7hW.svg";function Pe(e,t){return typeof e>"u"?t:e}function Ue(e){const t=Array(e);for(let n=0;n=this.minlength&&(c||!i[_])){let P=ce(u,o,f),b="";switch(this.tokenize){case"full":if(3$;N--)if(N-$>=this.minlength){const w=ce(u,o,f,m,$);b=_.substring($,N),this.push_index(i,b,w,e,n)}break}case"reverse":if(2=this.minlength){const N=ce(u,o,f,m,$);this.push_index(i,b,N,e,n)}b=""}case"forward":if(1=this.minlength&&this.push_index(i,b,P,e,n);break}default:if(this.boost&&(P=Math.min(0|P/this.boost(t,_,f),u-1)),this.push_index(i,_,P,e,n),c&&1=this.minlength&&!$[_]){$[_]=1;const K=ce(N+(o/2>N?0:1),o,f,U-1,D-1),Q=this.bidirectional&&_>w;this.push_index(a,Q?w:_,K,e,n,Q?_:w)}}}}}this.fastupdate||(this.register[e]=1)}}return this};function ce(e,t,n,s,o){return n&&1=this.minlength&&!m[b]){if(!this.optimize&&!a&&!this.map[b])return i;P[N++]=b,m[b]=1}e=P,s=e.length}if(!s)return i;t||(t=100);let u,f=this.depth&&1=n)))));b++);if(f)return o?Re(c,n,0):void(e[e.length]=c)}return!t&&c};function Re(e,t,n){return e=e.length===1?e[0]:ba(e),n||e.length>t?e.slice(n,n+t):e}function xe(e,t,n,s){if(n){const o=s&&t>n;e=e[o?t:n],e=e&&e[o?n:t]}else e=e[t];return e}R.prototype.contain=function(e){return!!this.register[e]},R.prototype.update=function(e,t){return this.remove(e).add(e,t)},R.prototype.remove=function(e,t){const n=this.register[e];if(n){if(this.fastupdate)for(let s,o=0;o{if(a.value){for(var B=m.value.search(a.value,{enrich:!0}),H=[],q=0;q!B||!B.length?[]:B.reduce((q,E)=>(q[H(E)]||(q[H(E)]=[]),q[H(E)].push(E),q),{}),K=()=>{setTimeout(()=>{c.value&&c.value.focus()},100),Fe(),o.value=!0};te(async()=>{var E,O;const B=await Vt(()=>import("./virtual_search-data.CUABEQwy.js"),[]);u.value=B.default.INDEX_DATA,f.value=B.default.PREVIEW_LOOKUP,_.value=B.default.Options,i.value=window.location.origin+me(n.value==="root"?"/":n.value),P.value=((E=_.value)==null?void 0:E.buttonLabel)||P.value,b.value=((O=_.value)==null?void 0:O.placeholder)||b.value;var H=new R(_.value);H.import("reg",u.value.reg),H.import("cfg",u.value.cfg),H.import("map",u.value.map),H.import("ctx",u.value.ctx),m.value=H,s.value.innerHTML=/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"⌘":"Ctrl";const q=G=>{var se;G.key==="k"&&(G.ctrlKey||G.metaKey)&&(G.preventDefault(),K()),G.key==="Escape"&&((se=a.value)==null?void 0:se.length)==0&&o.value&&(o.value=!1)};window.addEventListener("keydown",q)});const Q=V(()=>D(U.value,B=>B.link.split("/").slice(0,-1).join("-"))),ne=V(()=>Object.values(Q.value).flat().map(B=>B.id));function Fe(){o.value=!1,a.value=""}const vt=B=>{var H,q;if(document.getElementsByClassName("search-group")[0]){if(B.key=="ArrowUp"||B.key=="ArrowDown"){const E=ne.value.indexOf($.value);if(B.key=="ArrowUp"){const O=E==0?ne.value.length-1:E-1;$.value=ne.value[O]}if(B.key=="ArrowDown"){const O=E>ne.value.length-2?0:E+1;$.value=ne.value[O]}if(E<5){const O=N.value.getElementsByClassName("VPPluginSearch-search-group")[0];O==null||O.scrollIntoView(!0)}else(H=document.getElementById(ne.value[$.value]))==null||H.scrollIntoView(!0);Ae()}B.key=="Enter"&&w.go(t.site.value.base+((q=N.value.getElementsByClassName("link-focused")[0].getAttribute("href"))==null?void 0:q.replace(i.value,"")))}};return(B,H)=>{const q=Z("ClientOnly");return r(),p("div",za,[y(q,null,{default:v(()=>[(r(),S(wt,{to:"body"},[ze(h("div",{class:"VPPluginSearch-modal-back",onClick:H[2]||(H[2]=E=>o.value=!1),onKeydown:vt},[h("div",{class:"VPPluginSearch-modal",onClick:H[1]||(H[1]=et(()=>{},["stop"])),ref_key:"modal",ref:N},[h("form",ja,[Ua,ze(h("input",{class:"DocSearch-Input","aria-autocomplete":"both","aria-labelledby":"docsearch-label",id:"docsearch-input",autocomplete:"off",autocorrect:"off",autocapitalize:"off",enterkeyhint:"search",spellcheck:"false",autofocus:"true","onUpdate:modelValue":H[0]||(H[0]=E=>a.value=E),placeholder:b.value,maxlength:"64",type:"search",ref_key:"input",ref:c},null,8,qa),[[St,a.value]])]),h("div",Ga,[(r(!0),p(C,null,F(Q.value,(E,O)=>(r(),p("div",{class:"search-group",key:O},[h("span",Ra,M(O?O.toString()[0].toUpperCase()+O.toString().slice(1):"Home"),1),(r(!0),p(C,null,F(E,(G,se)=>(r(),p("a",{href:i.value+G.link,key:G.id,onClick:Fe,onMouseenter:le=>$.value=G.id,class:A({"link-focused":$.value==G.id}),id:se.toString()},[h("div",Ka,[h("span",Wa,M(G.link.includes("#")?"#":"▤"),1),h("div",Ja,[h("h3",null,M(G.title),1),h("p",null,[h("div",{innerHTML:G.preview},null,8,Xa)])]),Ya])],42,xa))),128))]))),128))]),Qa],512)],544),[[Lt,o.value]])]))]),_:1}),h("div",{id:"docsearch",onClick:H[3]||(H[3]=E=>K())},[h("button",Za,[h("span",ei,[ti,h("span",ni,M(P.value),1)]),h("span",si,[h("span",{class:"DocSearch-Button-Key",ref_key:"metaKey",ref:s},"Meta",512),oi])])])])}}}),ii=k({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=T();return(n,s)=>l(t).socialLinks?(r(),S(De,{key:0,class:"VPNavBarSocialLinks",links:l(t).socialLinks},null,8,["links"])):g("",!0)}}),ri=L(ii,[["__scopeId","data-v-0394ad82"]]),li=["href","rel","target"],ci={key:1},ui={key:2},di=k({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=T(),{hasSidebar:s}=Y(),{currentLang:o}=re(),a=V(()=>{var u;return typeof n.value.logoLink=="string"?n.value.logoLink:(u=n.value.logoLink)==null?void 0:u.link}),i=V(()=>{var u;return typeof n.value.logoLink=="string"||(u=n.value.logoLink)==null?void 0:u.rel}),c=V(()=>{var u;return typeof n.value.logoLink=="string"||(u=n.value.logoLink)==null?void 0:u.target});return(u,f)=>(r(),p("div",{class:A(["VPNavBarTitle",{"has-sidebar":l(s)}])},[h("a",{class:"title",href:a.value??l(Ce)(l(o).link),rel:i.value,target:c.value},[d(u.$slots,"nav-bar-title-before",{},void 0,!0),l(n).logo?(r(),S(pe,{key:0,class:"logo",image:l(n).logo},null,8,["image"])):g("",!0),l(n).siteTitle?(r(),p("span",ci,M(l(n).siteTitle),1)):l(n).siteTitle===void 0?(r(),p("span",ui,M(l(t).title),1)):g("",!0),d(u.$slots,"nav-bar-title-after",{},void 0,!0)],8,li)],2))}}),hi=L(di,[["__scopeId","data-v-ab179fa1"]]),pi={class:"items"},vi={class:"title"},fi=k({__name:"VPNavBarTranslations",setup(e){const{theme:t}=T(),{localeLinks:n,currentLang:s}=re({correspondingLink:!0});return(o,a)=>l(n).length&&l(s).label?(r(),S(Oe,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:l(t).langMenuLabel||"Change language"},{default:v(()=>[h("div",pi,[h("p",vi,M(l(s).label),1),(r(!0),p(C,null,F(l(n),i=>(r(),S($e,{key:i.link,item:i},null,8,["item"]))),128))])]),_:1},8,["label"])):g("",!0)}}),mi=L(fi,[["__scopeId","data-v-88af2de4"]]),_i=e=>(z("data-v-ccf7ddec"),e=e(),j(),e),gi={class:"wrapper"},ki={class:"container"},bi={class:"title"},$i={class:"content"},yi={class:"content-body"},Pi=_i(()=>h("div",{class:"divider"},[h("div",{class:"divider-line"})],-1)),Vi=k({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const{y:t}=Ze(),{hasSidebar:n}=Y(),{frontmatter:s}=T(),o=I({});return Je(()=>{o.value={"has-sidebar":n.value,home:s.value.layout==="home",top:t.value===0}}),(a,i)=>(r(),p("div",{class:A(["VPNavBar",o.value])},[h("div",gi,[h("div",ki,[h("div",bi,[y(hi,null,{"nav-bar-title-before":v(()=>[d(a.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[d(a.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),h("div",$i,[h("div",yi,[d(a.$slots,"nav-bar-content-before",{},void 0,!0),y(ai,{class:"search"}),y(_a,{class:"menu"}),y(mi,{class:"translations"}),y(bo,{class:"appearance"}),y(ri,{class:"social-links"}),y(na,{class:"extra"}),d(a.$slots,"nav-bar-content-after",{},void 0,!0),y(la,{class:"hamburger",active:a.isScreenOpen,onClick:i[0]||(i[0]=c=>a.$emit("toggle-screen"))},null,8,["active"])])])])]),Pi],2))}}),Li=L(Vi,[["__scopeId","data-v-ccf7ddec"]]),Si={key:0,class:"VPNavScreenAppearance"},wi={class:"text"},Ii=k({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=T();return(s,o)=>l(t).appearance&&l(t).appearance!=="force-dark"?(r(),p("div",Si,[h("p",wi,M(l(n).darkModeSwitchLabel||"Appearance"),1),y(Be)])):g("",!0)}}),Ti=L(Ii,[["__scopeId","data-v-2d7af913"]]),Ni=k({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=ke("close-screen");return(n,s)=>(r(),S(W,{class:"VPNavScreenMenuLink",href:n.item.link,target:n.item.target,rel:n.item.rel,onClick:l(t),innerHTML:n.item.text},null,8,["href","target","rel","onClick","innerHTML"]))}}),Mi=L(Ni,[["__scopeId","data-v-7f31e1f6"]]),Ai=k({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=ke("close-screen");return(n,s)=>(r(),S(W,{class:"VPNavScreenMenuGroupLink",href:n.item.link,target:n.item.target,rel:n.item.rel,onClick:l(t)},{default:v(()=>[J(M(n.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),ut=L(Ai,[["__scopeId","data-v-19976ae1"]]),Ci={class:"VPNavScreenMenuGroupSection"},Hi={key:0,class:"title"},Bi=k({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,n)=>(r(),p("div",Ci,[t.text?(r(),p("p",Hi,M(t.text),1)):g("",!0),(r(!0),p(C,null,F(t.items,s=>(r(),S(ut,{key:s.text,item:s},null,8,["item"]))),128))]))}}),Ei=L(Bi,[["__scopeId","data-v-8133b170"]]),Oi=e=>(z("data-v-ff6087d4"),e=e(),j(),e),Di=["aria-controls","aria-expanded"],Fi=["innerHTML"],zi=Oi(()=>h("span",{class:"vpi-plus button-icon"},null,-1)),ji=["id"],Ui={key:1,class:"group"},qi=k({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,n=I(!1),s=V(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){n.value=!n.value}return(a,i)=>(r(),p("div",{class:A(["VPNavScreenMenuGroup",{open:n.value}])},[h("button",{class:"button","aria-controls":s.value,"aria-expanded":n.value,onClick:o},[h("span",{class:"button-text",innerHTML:a.text},null,8,Fi),zi],8,Di),h("div",{id:s.value,class:"items"},[(r(!0),p(C,null,F(a.items,c=>(r(),p(C,{key:c.text},["link"in c?(r(),p("div",{key:c.text,class:"item"},[y(ut,{item:c},null,8,["item"])])):(r(),p("div",Ui,[y(Ei,{text:c.text,items:c.items},null,8,["text","items"])]))],64))),128))],8,ji)],2))}}),Gi=L(qi,[["__scopeId","data-v-ff6087d4"]]),Ri={key:0,class:"VPNavScreenMenu"},xi=k({__name:"VPNavScreenMenu",setup(e){const{theme:t}=T();return(n,s)=>l(t).nav?(r(),p("nav",Ri,[(r(!0),p(C,null,F(l(t).nav,o=>(r(),p(C,{key:o.text},["link"in o?(r(),S(Mi,{key:0,item:o},null,8,["item"])):(r(),S(Gi,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):g("",!0)}}),Ki=k({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=T();return(n,s)=>l(t).socialLinks?(r(),S(De,{key:0,class:"VPNavScreenSocialLinks",links:l(t).socialLinks},null,8,["links"])):g("",!0)}}),dt=e=>(z("data-v-858fe1a4"),e=e(),j(),e),Wi=dt(()=>h("span",{class:"vpi-languages icon lang"},null,-1)),Ji=dt(()=>h("span",{class:"vpi-chevron-down icon chevron"},null,-1)),Xi={class:"list"},Yi=k({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=re({correspondingLink:!0}),s=I(!1);function o(){s.value=!s.value}return(a,i)=>l(t).length&&l(n).label?(r(),p("div",{key:0,class:A(["VPNavScreenTranslations",{open:s.value}])},[h("button",{class:"title",onClick:o},[Wi,J(" "+M(l(n).label)+" ",1),Ji]),h("ul",Xi,[(r(!0),p(C,null,F(l(t),c=>(r(),p("li",{key:c.link,class:"item"},[y(W,{class:"link",href:c.link},{default:v(()=>[J(M(c.text),1)]),_:2},1032,["href"])]))),128))])],2)):g("",!0)}}),Qi=L(Yi,[["__scopeId","data-v-858fe1a4"]]),Zi={class:"container"},er=k({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=I(null),n=tt(be?document.body:null);return(s,o)=>(r(),S(Ne,{name:"fade",onEnter:o[0]||(o[0]=a=>n.value=!0),onAfterLeave:o[1]||(o[1]=a=>n.value=!1)},{default:v(()=>[s.open?(r(),p("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[h("div",Zi,[d(s.$slots,"nav-screen-content-before",{},void 0,!0),y(xi,{class:"menu"}),y(Qi,{class:"translations"}),y(Ti,{class:"appearance"}),y(Ki,{class:"social-links"}),d(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):g("",!0)]),_:3}))}}),tr=L(er,[["__scopeId","data-v-cc5739dd"]]),nr={key:0,class:"VPNav"},sr=k({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:s}=ro(),{frontmatter:o}=T(),a=V(()=>o.value.navbar!==!1);return nt("close-screen",n),_e(()=>{be&&document.documentElement.classList.toggle("hide-nav",!a.value)}),(i,c)=>a.value?(r(),p("header",nr,[y(Li,{"is-screen-open":l(t),onToggleScreen:l(s)},{"nav-bar-title-before":v(()=>[d(i.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[d(i.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[d(i.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[d(i.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),y(tr,{open:l(t)},{"nav-screen-content-before":v(()=>[d(i.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[d(i.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):g("",!0)}}),or=L(sr,[["__scopeId","data-v-ae24b3ad"]]),ht=e=>(z("data-v-b8d55f3b"),e=e(),j(),e),ar=["role","tabindex"],ir=ht(()=>h("div",{class:"indicator"},null,-1)),rr=["onKeydown"],lr=ht(()=>h("span",{class:"vpi-chevron-right caret-icon"},null,-1)),cr=[lr],ur={key:1,class:"items"},dr=k({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:n,collapsible:s,isLink:o,isActiveLink:a,hasActiveLink:i,hasChildren:c,toggle:u}=Yt(V(()=>t.item)),f=V(()=>c.value?"section":"div"),_=V(()=>o.value?"a":"div"),m=V(()=>c.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),P=V(()=>o.value?void 0:"button"),b=V(()=>[[`level-${t.depth}`],{collapsible:s.value},{collapsed:n.value},{"is-link":o.value},{"is-active":a.value},{"has-active":i.value}]);function $(w){"key"in w&&w.key!=="Enter"||!t.item.link&&u()}function N(){t.item.link&&u()}return(w,U)=>{const D=Z("VPSidebarItem",!0);return r(),S(oe(f.value),{class:A(["VPSidebarItem",b.value])},{default:v(()=>[w.item.text?(r(),p("div",ue({key:0,class:"item",role:P.value},Tt(w.item.items?{click:$,keydown:$}:{},!0),{tabindex:w.item.items&&0}),[ir,w.item.link?(r(),S(W,{key:0,tag:_.value,class:"link",href:w.item.link,rel:w.item.rel,target:w.item.target},{default:v(()=>[(r(),S(oe(m.value),{class:"text",innerHTML:w.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(r(),S(oe(m.value),{key:1,class:"text",innerHTML:w.item.text},null,8,["innerHTML"])),w.item.collapsed!=null&&w.item.items&&w.item.items.length?(r(),p("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:N,onKeydown:It(N,["enter"]),tabindex:"0"},cr,40,rr)):g("",!0)],16,ar)):g("",!0),w.item.items&&w.item.items.length?(r(),p("div",ur,[w.depth<5?(r(!0),p(C,{key:0},F(w.item.items,K=>(r(),S(D,{key:K.text,item:K,depth:w.depth+1},null,8,["item","depth"]))),128)):g("",!0)])):g("",!0)]),_:1},8,["class"])}}}),hr=L(dr,[["__scopeId","data-v-b8d55f3b"]]),pt=e=>(z("data-v-575e6a36"),e=e(),j(),e),pr=pt(()=>h("div",{class:"curtain"},null,-1)),vr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},fr=pt(()=>h("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),mr=k({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const t=e,{sidebarGroups:n,hasSidebar:s}=Y(),o=I(null),a=tt(be?document.body:null);return X([t,o],()=>{var i;t.open?(a.value=!0,(i=o.value)==null||i.focus()):a.value=!1},{immediate:!0,flush:"post"}),(i,c)=>l(s)?(r(),p("aside",{key:0,class:A(["VPSidebar",{open:i.open}]),ref_key:"navEl",ref:o,onClick:c[0]||(c[0]=et(()=>{},["stop"]))},[pr,h("nav",vr,[fr,d(i.$slots,"sidebar-nav-before",{},void 0,!0),(r(!0),p(C,null,F(l(n),u=>(r(),p("div",{key:u.text,class:"group"},[y(hr,{item:u,depth:0},null,8,["item"])]))),128)),d(i.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):g("",!0)}}),_r=L(mr,[["__scopeId","data-v-575e6a36"]]),gr=k({__name:"VPSkipLink",setup(e){const t=ie(),n=I();X(()=>t.path,()=>n.value.focus());function s({target:o}){const a=document.getElementById(decodeURIComponent(o.hash).slice(1));if(a){const i=()=>{a.removeAttribute("tabindex"),a.removeEventListener("blur",i)};a.setAttribute("tabindex","-1"),a.addEventListener("blur",i),a.focus(),window.scrollTo(0,0)}}return(o,a)=>(r(),p(C,null,[h("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),h("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s}," Skip to content ")],64))}}),kr=L(gr,[["__scopeId","data-v-0f60ec36"]]),br=k({__name:"Layout",setup(e){const{isOpen:t,open:n,close:s}=Y(),o=ie();X(()=>o.path,s),Xt(t,s);const{frontmatter:a}=T(),i=Nt(),c=V(()=>!!i["home-hero-image"]);return nt("hero-image-slot-exists",c),(u,f)=>{const _=Z("Content");return l(a).layout!==!1?(r(),p("div",{key:0,class:A(["Layout",l(a).pageClass])},[d(u.$slots,"layout-top",{},void 0,!0),y(kr),y(Bt,{class:"backdrop",show:l(t),onClick:l(s)},null,8,["show","onClick"]),y(or,null,{"nav-bar-title-before":v(()=>[d(u.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[d(u.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[d(u.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[d(u.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[d(u.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[d(u.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),y(io,{open:l(t),onOpenMenu:l(n)},null,8,["open","onOpenMenu"]),y(_r,{open:l(t)},{"sidebar-nav-before":v(()=>[d(u.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[d(u.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),y(zs,null,{"page-top":v(()=>[d(u.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[d(u.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[d(u.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[d(u.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":v(()=>[d(u.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[d(u.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[d(u.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[d(u.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":v(()=>[d(u.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[d(u.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[d(u.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[d(u.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[d(u.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[d(u.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[d(u.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[d(u.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[d(u.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[d(u.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[d(u.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[d(u.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[d(u.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[d(u.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[d(u.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),y(Rs),d(u.$slots,"layout-bottom",{},void 0,!0)],2)):(r(),S(_,{key:1}))}}}),$r=L(br,[["__scopeId","data-v-5d98c3a5"]]),Ke={Layout:$r,enhanceApp:({app:e})=>{e.component("Badge",At)}},yr=k({__name:"HighlightTargetedHeading",setup(e){function t(){if(!window||!window.location||!window.location.hash)return;const s=decodeURIComponent(window.location.hash);if(!s)return;let o;try{o=document.querySelector(s)}catch(a){console.error(a);return}o&&(o.classList.contains("VPNolebaseHighlightTargetedHeading")||o.classList.add("VPNolebaseHighlightTargetedHeading"),o.classList.remove("VPNolebaseHighlightTargetedHeadingAnimated"),setTimeout(()=>{o&&o.classList.add("VPNolebaseHighlightTargetedHeadingAnimated")},10))}const n=ie();return te(t),X(n,async()=>{await Ae(),t()}),Mt("hashchange",t),(s,o)=>d(s.$slots,"default")}}),Vr={...Ke,Layout:()=>je(Ke.Layout,null,{"layout-top":()=>[je(yr)]})};export{Vr as R}; diff --git a/assets/chunks/virtual_search-data.6Jzpy5HH.js b/assets/chunks/virtual_search-data.6Jzpy5HH.js deleted file mode 100644 index 622d60c5..00000000 --- a/assets/chunks/virtual_search-data.6Jzpy5HH.js +++ /dev/null @@ -1,480 +0,0 @@ -const e={map:'[{"section":["0.0"],"activitypub":["1.0"],"advent":["2.0"],"atproto":["3.0"],"babble":["4.0"],"capture":["5.0"],"chat":["6.0"],"chronological":["7.0"],"cinny":["8.0"],"commune":["9.0"],"davey":["10.0"],"decentralized":["11.0"],"dice":["12.0"],"digital":["13.0","45.4"],"federated":["14.0"],"fedi":["15.0"],"inspiration":["15.1"],"identity":["15.2"],"servers":["15.3"],"content":["15.4"],"moderation":["15.5"],"problems":["15.6"],"fediverse":["16.0"],"forgejo":["17.0"],"freeform":["18.0","19.0"],"game":["20.0"],"garden":["21.0"],"guide":["22.0","23.0","24.0","25.0","26.0","27.0","52.0","53.0","54.0","55.0","56.0","57.0"],"incrementals":["22.1","24.1","24.2","54.1","57.1","57.2"],"players":["22.2","54.2"],"monetization":["22.3","54.3"],"numbers":["23.1","55.1"],"effortlessness":["23.2","55.2"],"strategy":["23.3","55.3"],"avoiding":["23.4","55.4"],"good":["23.5","55.5"],"artistic":["23.6","55.6"],"roguelites":["24.3","57.3"],"the":["24.4","24.5","24.6","38.1","43.0","44.0","45.0","57.4","57.5","57.6","60.0","61.0","62.0","80.0","81.0","102.0","103.0"],"high":["24.7","57.7"],"low":["24.8","57.8"],"are":["24.9","57.9"],"sub":["24.10","57.10"],"other":["24.11","57.11","62.3","72.5","81.4","92.4","92.6","103.4","113.4","113.6"],"why":["25.1","45.5","53.1"],"ludology":["25.2","53.2"],"making":["25.3","53.3"],"reading":["26.1","52.1"],"seeking":["26.2","52.2"],"responding":["26.3","52.3"],"interaction":["27.1","56.1"],"repeatable":["27.2","56.2"],"following":["27.3","56.3"],"tips":["27.4","56.4"],"incremental":["28.0"],"ivy":["29.0"],"kronos":["30.0","79.0","101.0"],"logseq":["31.0"],"matrix":["32.0"],"mbin":["33.0"],"my":["34.0","35.0","38.2"],"games":["35.1"],"tools":["35.2"],"nostr":["36.0"],"open":["37.0"],"opti":["38.0"],"planar":["39.0"],"profectus":["40.0"],"social":["41.0"],"synapse":["42.0"],"browsing":["45.1"],"building":["45.2"],"streams":["45.3"],"recommended":["45.6"],"this":["46.0"],"v":["47.0"],"vitepress":["48.0"],"wanderstop":["49.0"],"webrings":["50.0"],"weird":["51.0"],"v1":["61.1","61.2","61.3","61.4","61.5","80.47","80.48","80.49","80.50","80.51","80.52","80.53","80.54","80.55","80.56","80.57","102.29","102.30","102.31","102.32","102.33","102.34","102.35","102.36","102.37","102.38","102.39"],"v0":["61.6","61.7","61.8","61.9","61.10","61.11","61.12"],"general":["62.1","81.2","103.2"],"common":["62.2","81.3","103.3"],"achievements":["63.0","82.0","104.0"],"bars":["64.0","83.0","105.0"],"basic":["65.0","84.0","106.0"],"buyables":["66.0","85.0","107.0"],"challenges":["67.0","86.0","108.0"],"clickables":["68.0","87.0","109.0"],"custom":["69.0","72.6","88.0","92.7","110.0","113.7"],"getting":["70.0","70.1","89.0","89.1","111.0","111.1"],"using":["70.2","89.2","111.2"],"infoboxes":["71.0","91.0","112.0"],"layer":["72.0","72.1","92.0","92.1","113.0","113.1"],"big":["72.2","92.2","113.2"],"prestige":["72.3","92.3","113.3"],"tree":["72.4","92.5","113.5"],"mod":["73.0","93.0","114.0"],"milestones":["74.0","94.0","115.0"],"subtabs":["75.0","96.0","116.0"],"updating":["76.0","98.0","118.0"],"upgrades":["77.0","99.0","119.0"],"v2":["80.1","80.2","80.3","80.4","80.5","80.6","80.7","80.8","80.9","80.10","80.11","80.12","80.13","80.14","80.15","80.16","80.17","80.18","80.19","80.20","80.21","80.22","80.23","80.24","80.25","80.26","80.27","80.28","80.29","80.30","80.31","80.32","80.33","80.34","80.35","80.36","80.37","80.38","80.39","80.40","80.41","80.42","80.43","80.44","80.45","80.46","102.1","102.2","102.3","102.4","102.5","102.6","102.7","102.8","102.9","102.10","102.11","102.12","102.13","102.14","102.15","102.16","102.17","102.18","102.19","102.20","102.21","102.22","102.23","102.24","102.25","102.26","102.27","102.28"],"table":["81.1","103.1"],"grids":["90.0"],"particles":["95.0"],"trees":["97.0","97.2","117.0","117.2"],"layoutinfo":["97.1","117.1"],"nodes":["97.3","117.3"]},{"0":["0.0","59.0","61.1","61.2","61.3","61.4","61.5","61.12","74.0","78.0","80.41","80.42","80.43","80.44","80.45","80.46","80.57","94.0","100.0","102.23","102.24","102.25","102.26","102.27","102.28","102.39","115.0"],"1":["0.0","61.8","61.10","61.11","70.1","70.2","80.16","80.18","80.24","80.33","80.35","80.36","80.37","80.38","80.39","80.40","80.50","80.55","80.56","89.1","89.2","102.6","102.15","102.17","102.18","102.19","102.20","102.21","102.22","102.32","102.37","102.38","111.1","111.2"],"2":["0.0","59.0","61.3","61.6","61.7","61.8","61.9","70.1","70.2","78.0","80.7","80.13","80.19","80.26","80.27","80.28","80.29","80.30","80.31","80.32","80.33","80.34","80.38","80.44","80.52","80.53","80.54","100.0","102.1","102.8","102.9","102.10","102.11","102.12","102.13","102.14","102.15","102.16","102.20","102.26","102.34","102.35","102.36"],"3":["12.0","61.2","61.6","80.11","80.20","80.21","80.22","80.23","80.24","80.25","80.31","80.37","80.43","80.47","80.48","80.49","80.50","80.51","80.53","80.54","102.2","102.3","102.4","102.5","102.6","102.7","102.13","102.19","102.25","102.29","102.30","102.31","102.32","102.33","102.35","102.36"],"4":["0.0","61.1","80.10","80.16","80.17","80.18","80.21","80.30","80.35","80.48","80.52","102.3","102.12","102.17","102.30","102.34"],"5":["0.0","80.1","80.2","80.3","80.4","80.5","80.6","80.7","80.8","80.9","80.10","80.11","80.12","80.13","80.14","80.15","80.19","80.20","80.29","80.41","80.47","102.1","102.2","102.11","102.23","102.29"],"6":["0.0","80.6","80.28","102.10"],"7":["0.0","80.5","80.15","80.18","80.27","80.33","80.34","80.50","80.51","102.9","102.15","102.16","102.32","102.33"],"8":["0.0","80.4","80.11","80.26","80.48","102.8","102.30"],"9":["0.0","80.3","80.56"],"10":["0.0","80.10","80.25","80.35","80.37","80.38","80.39","80.40","80.41","80.43","80.44","80.46","80.48","80.50","80.51","80.52","80.53","80.54","90.0","102.7","102.17","102.19","102.20","102.21","102.22","102.23","102.25","102.26","102.28","102.30","102.32","102.33","102.34","102.35","102.36"],"11":["80.27","80.28","80.29","80.30","80.31","80.32","80.33","80.34","99.0","102.9","102.10","102.11","102.12","102.13","102.14","102.15","102.16","119.0"],"12":["80.9","80.20","80.21","80.22","80.24","80.25","80.26","102.2","102.3","102.4","102.6","102.7","102.8"],"13":["0.0","80.22","102.4"],"14":["80.6"],"15":["80.5","80.46","102.28"],"16":["0.0","80.21","80.41","80.43","102.3","102.23","102.25"],"17":["80.4","80.39","80.40","102.21","102.22"],"18":["80.3"],"19":["80.38","102.20"],"20":["80.20","80.24","80.25","80.26","80.27","80.29","80.30","80.31","80.33","80.34","80.35","80.37","80.38","80.39","80.40","80.41","80.43","80.46","80.50","80.51","80.52","80.53","80.54","102.2","102.6","102.7","102.8","102.9","102.11","102.12","102.13","102.15","102.16","102.17","102.19","102.20","102.21","102.22","102.23","102.25","102.28","102.32","102.33","102.34","102.35","102.36"],"21":["0.0","80.5","80.9","80.10","80.15","80.16","80.17","80.20","80.37","102.2","102.19"],"25":["80.35","102.17"],"28":["80.30","80.31","102.12","102.13"],"29":["80.16","80.17","80.29","102.11"],"30":["80.27","80.28","80.56","102.9","102.10"],"42":["0.0"],"49":["0.0"],"58":["0.0"],"75":["0.0"],"79":["0.0"],"84":["0.0"],"100":["90.0","99.0"],"111":["0.0"],"113":["0.0"],"123":["74.0","94.0","115.0"],"178":["0.0"],"179":["0.0"],"497":["0.0"],"747":["0.0"],"776":["0.0"],"797":["0.0"],"974":["0.0"],"class":["0.0"],"h":["0.0"],"feed":["0.0"],"h1":["0.0"],"p":["0.0","65.0","84.0","106.0"],"name":["0.0","72.1","73.0","92.1","93.0","113.1","114.0"],"a":["0.0","4.0","12.0","15.1","15.2","15.5","15.6","23.1","23.2","23.3","23.5","23.6","24.0","24.1","24.2","24.6","24.10","24.11","25.0","25.1","26.0","26.1","27.1","27.2","27.3","27.4","38.1","45.3","46.0","47.0","50.0","52.0","52.1","53.0","53.1","55.1","55.2","55.3","55.5","55.6","56.1","56.2","56.3","56.4","57.0","57.1","57.2","57.6","57.10","57.11","60.0","62.0","62.2","62.3","63.0","64.0","65.0","66.0","67.0","68.0","69.0","70.0","70.1","72.0","72.2","72.5","73.0","74.0","75.0","80.5","80.10","80.15","80.16","80.17","80.33","80.34","80.51","81.0","81.3","81.4","82.0","83.0","84.0","85.0","86.0","87.0","88.0","89.0","90.0","92.0","92.2","92.6","93.0","94.0","95.0","96.0","97.3","102.15","102.16","102.33","103.0","103.3","103.4","104.0","105.0","106.0","107.0","108.0","109.0","110.0","111.0","113.0","113.2","113.6","114.0","115.0","116.0","117.3"],"href":["0.0"],"changelog":["0.0"],"u":["0.0"],"url":["0.0","92.5"],"rss":["0.0","13.0","21.0"],"svg":["0.0"],"viewbox":["0.0"],"octicon":["0.0"],"aria":["0.0"],"hidden":["0.0"],"true":["0.0","27.3","27.4","56.3","56.4","80.15"],"width":["0.0"],"height":["0.0"],"path":["0.0"],"d":["0.0","22.3","24.1","27.3","54.3","56.3","57.1"],"m2":["0.0"],"002":["0.0"],"725a":["0.0"],"699c8":["0.0"],"201a":["0.0"],"098":["0.0"],"798zm2":["0.0"],"05h":["0.0"],"002a7":["0.0"],"489m2":["0.0"],"13a1":["0.0"],"this":["0.0","15.1","21.0","23.0","23.1","23.2","23.3","24.1","24.2","24.6","25.0","25.1","27.3","27.4","45.0","45.3","53.0","53.1","55.0","55.1","55.2","55.3","56.3","56.4","57.1","57.2","57.6","65.0","67.0","69.0","70.2","72.0","72.1","72.4","72.5","74.0","76.0","80.40","80.54","84.0","86.0","88.0","89.2","92.0","92.1","92.5","92.6","94.0","98.0","102.22","102.36","106.0","108.0","110.0","111.2","113.0","113.1","113.5","113.6","115.0","118.0"],"starts":["0.0"],"when":["0.0","26.2","52.2","63.0","72.5","74.0","82.0","92.6","94.0","104.0","113.6","115.0"],"i":["0.0","12.0","22.3","23.0","23.1","24.1","24.3","24.5","24.7","25.1","26.0","27.1","27.3","47.0","52.0","53.1","54.3","55.0","55.1","56.1","56.3","57.1","57.3","57.5","57.7","88.0","110.0"],"formatted":["0.0","74.0","94.0","115.0"],"the":["0.0","5.0","7.0","10.0","12.0","13.0","15.2","15.5","21.0","23.2","23.3","23.6","24.0","24.1","24.2","24.3","24.7","24.9","24.10","26.1","26.2","27.0","27.1","27.2","27.3","38.2","45.1","45.5","45.6","50.0","51.0","52.1","52.2","55.2","55.3","55.6","56.0","56.1","56.2","56.3","57.0","57.1","57.2","57.3","57.7","57.9","57.10","62.1","63.0","66.0","67.0","68.0","69.0","70.0","70.1","70.2","71.0","72.1","72.3","72.4","72.5","73.0","74.0","75.0","76.0","77.0","80.46","81.2","82.0","85.0","86.0","87.0","88.0","89.0","89.1","89.2","90.0","91.0","92.1","92.3","92.5","92.6","93.0","94.0","95.0","96.0","97.1","97.2","97.3","98.0","99.0","102.28","103.2","104.0","107.0","108.0","109.0","110.0","111.0","111.1","111.2","112.0","113.1","113.3","113.5","113.6","114.0","115.0","116.0","117.1","117.2","117.3","118.0","119.0"],"site":["0.0","12.0"],"to":["0.0","9.0","12.0","15.2","15.3","15.4","15.6","22.0","22.1","22.2","22.3","23.0","23.1","23.2","23.4","23.5","23.6","24.0","24.1","24.2","24.5","24.6","24.7","25.0","25.2","26.0","26.1","26.2","26.3","27.0","27.2","27.4","45.3","50.0","52.0","52.1","52.2","52.3","53.0","53.2","54.0","54.1","54.2","54.3","55.0","55.1","55.2","55.4","55.5","55.6","56.0","56.2","56.4","57.0","57.1","57.2","57.5","57.6","57.7","59.0","62.0","62.2","62.3","63.0","66.0","68.0","69.0","70.0","70.2","72.0","72.1","72.3","72.5","73.0","74.0","76.0","78.0","80.17","80.33","80.46","81.0","81.3","81.4","82.0","87.0","88.0","89.0","89.2","90.0","92.1","92.3","92.4","92.6","93.0","94.0","95.0","97.0","97.3","98.0","100.0","102.15","102.28","103.0","103.3","103.4","104.0","107.0","109.0","110.0","111.0","111.2","113.1","113.3","113.4","113.6","114.0","115.0","117.0","117.3","118.0"],"be":["0.0","9.0","23.1","23.3","23.6","24.2","24.3","27.1","27.3","38.1","55.1","55.3","55.6","56.1","56.3","57.2","57.3","63.0","64.0","66.0","69.0","73.0","74.0","80.46","80.54","83.0","85.0","88.0","90.0","92.7","93.0","94.0","102.28","102.36","104.0","105.0","107.0","110.0","113.7","114.0","115.0"],"garden":["0.0","13.0","46.0"],"digital":["0.0","7.0","18.0","44.0","46.0"],"gardens":["0.0","7.0","13.0","18.0","44.0","45.4","46.0"],"referenced":["1.0","3.0","6.0","7.0","8.0","9.0","10.0","11.0","12.0","13.0","14.0","15.0","16.0","17.0","18.0","21.0","28.0","29.0","30.0","31.0","32.0","33.0","36.0","37.0","40.0","41.0","42.0","44.0","45.0","46.0","48.0","50.0","51.0"],"incremental":["2.0","22.3","23.1","23.2","23.3","23.4","23.5","24.1","24.2","24.5","24.6","24.8","24.9","24.10","25.0","27.0","27.3","35.1","37.0","40.0","53.0","54.3","55.1","55.2","55.3","55.4","55.5","56.0","56.3","57.1","57.2","57.5","57.6","57.8","57.9","57.10"],"tags":["2.0","3.0","4.0","5.0","12.0","14.0","20.0","30.0","38.0","39.0","43.0","47.0","49.0"],"my":["2.0","4.0","5.0","9.0","12.0","20.0","24.5","30.0","38.0","39.0","43.0","46.0","47.0","57.5"],"projects":["2.0","4.0","5.0","12.0","20.0","30.0","35.0","38.0","39.0","47.0"],"profectus":["2.0","30.0"],"play":["2.0","23.2","35.1","55.2","79.0","101.0"],"it":["2.0","12.0","22.2","23.1","23.5","24.1","24.2","24.3","24.6","26.1","26.3","27.1","27.2","46.0","52.1","52.3","54.2","55.1","55.5","56.1","56.2","57.1","57.2","57.3","57.6","62.0","64.0","72.1","72.5","73.0","81.0","83.0","88.0","92.1","92.6","93.0","103.0","105.0","113.1","113.6","114.0"],"here":["2.0","12.0","69.0","73.0","76.0","79.0","88.0","92.2","93.0","98.0","101.0","110.0","113.2","114.0","118.0"],"an":["2.0","9.0","12.0","24.2","24.6","25.3","26.0","26.3","27.2","52.0","52.3","53.3","56.2","57.2","57.6","68.0","69.0","77.0","80.35","87.0","88.0","90.0","97.2","99.0","102.17","103.0","109.0","110.0","117.2","119.0"],"open":["2.0","9.0","70.2","89.2","111.2"],"source":["2.0","9.0","37.0"],"game":["2.0","12.0","22.2","23.2","23.5","24.1","24.2","24.10","26.1","26.2","27.2","27.3","52.1","52.2","54.2","55.2","55.5","56.2","56.3","57.1","57.2","57.10","61.0","81.0"],"made":["2.0","15.5","23.6","24.9","47.0","55.6","57.9"],"in":["2.0","15.5","23.1","23.2","24.3","24.10","27.0","27.1","27.2","27.3","38.1","47.0","55.1","55.2","56.0","56.1","56.2","56.3","57.3","57.10","62.0","63.0","64.0","67.0","69.0","70.2","71.0","72.1","72.2","72.5","73.0","75.0","77.0","81.0","82.0","83.0","86.0","88.0","89.2","90.0","91.0","92.1","92.6","93.0","96.0","97.3","99.0","103.0","104.0","105.0","108.0","110.0","111.2","112.0","113.1","113.6","114.0","116.0","117.3","119.0"],"by":["3.0","6.0","7.0","8.0","9.0","10.0","11.0","12.0","13.0","14.0","15.5","16.0","18.0","21.0","23.0","24.4","27.3","27.4","28.0","29.0","30.0","33.0","35.0","37.0","40.0","41.0","44.0","45.0","46.0","50.0","51.0","55.0","56.3","56.4","57.4","63.0","72.5","73.0","75.0","81.0","82.0","92.6","92.7","93.0","96.0","103.0","104.0","113.6","113.7","114.0","116.0"],"fediverse":["3.0","41.0"],"buds":["4.0","12.0"],"is":["4.0","12.0","23.0","23.1","23.2","23.6","24.1","24.2","24.4","24.6","25.0","26.0","26.1","27.0","27.1","27.2","27.3","45.3","46.0","47.0","52.0","52.1","53.0","55.0","55.1","55.2","55.6","56.0","56.1","56.2","56.3","57.1","57.2","57.4","57.6","59.0","62.0","65.0","66.0","67.0","68.0","69.0","72.0","72.1","72.3","72.4","72.5","73.0","77.0","78.0","84.0","85.0","86.0","87.0","88.0","92.0","92.1","92.3","92.4","92.5","92.6","93.0","95.0","97.1","97.2","99.0","100.0","103.0","106.0","107.0","108.0","109.0","110.0","113.0","113.1","113.3","113.4","113.5","113.6","114.0","117.1","117.2","119.0"],"tool":["4.0"],"for":["4.0","9.0","12.0","15.1","15.6","23.1","23.5","24.0","24.6","24.9","27.0","27.1","27.2","27.4","47.0","55.1","55.5","56.0","56.1","56.2","56.4","57.0","57.6","57.9","59.0","62.2","62.3","63.0","67.0","68.0","69.0","71.0","72.6","73.0","76.0","77.0","78.0","81.3","81.4","82.0","85.0","86.0","87.0","88.0","91.0","92.2","92.4","92.6","92.7","93.0","98.0","99.0","100.0","103.3","103.4","104.0","107.0","108.0","109.0","110.0","112.0","113.2","113.4","113.7","114.0","118.0","119.0"],"creating":["4.0","62.0","103.0"],"puppets":["4.0"],"and":["4.0","12.0","15.2","15.3","15.4","15.5","22.2","23.0","23.1","23.2","23.3","23.5","23.6","24.1","24.4","24.7","24.8","26.0","26.1","26.3","27.2","27.3","35.2","38.1","47.0","52.0","52.1","52.3","54.2","55.0","55.1","55.2","55.3","55.5","55.6","56.2","56.3","57.1","57.4","57.7","57.8","63.0","66.0","67.0","70.1","70.2","72.1","72.2","73.0","74.0","75.0","76.0","77.0","80.25","80.37","80.46","80.51","81.4","82.0","85.0","86.0","89.1","89.2","92.1","92.2","93.0","94.0","95.0","96.0","97.0","98.0","99.0","102.7","102.19","102.28","102.33","103.0","103.4","104.0","107.0","108.0","111.1","111.2","113.1","113.2","114.0","115.0","116.0","117.0","118.0","119.0"],"interacting":["4.0"],"citadel":["5.0"],"glue":["6.0"],"commune":["6.0","11.0","13.0","14.0","18.0","41.0","51.0"],"freeform":["7.0","21.0"],"vs":["7.0","18.0","19.0","24.1","57.1"],"dichotomy":["7.0"],"small":["7.0","21.0","44.0","45.0","45.1","45.5","45.6","50.0","80.33","102.15"],"federated":["9.0","15.2","28.0"],"identity":["9.0","14.0","28.0"],"fedi":["9.0","11.0","14.0","41.0","51.0"],"v2":["9.0","11.0","14.0","15.0","41.0","51.0"],"personal":["9.0","34.0","45.0","45.2","50.0"],"website":["9.0","34.0"],"webrings":["9.0"],"weird":["9.0","14.0"],"matrix":["9.0","11.0"],"web":["9.0","21.0","22.3","27.3","44.0","45.0","45.1","45.5","50.0","54.3","56.3"],"client":["9.0","15.6"],"built":["9.0"],"better":["9.0","24.1","57.1"],"communities":["9.0"],"wreden":["10.0","43.0"],"ivy":["10.0"],"road":["10.0","29.0"],"beginner":["10.0","43.0"],"social":["11.0","15.1","28.0"],"media":["11.0","15.1","41.0"],"tagged":["11.0","35.0","40.0"],"atproto":["11.0","16.0"],"activitypub":["11.0"],"armor":["12.0"],"babble":["12.0"],"download":["12.0"],"that":["12.0","15.3","22.3","23.0","23.5","24.1","24.2","24.3","24.6","24.10","25.1","26.1","27.1","27.2","27.3","38.1","45.3","45.5","50.0","52.1","53.1","54.3","55.0","55.5","56.1","56.2","56.3","57.1","57.2","57.3","57.6","57.10","65.0","66.0","67.0","68.0","72.4","73.0","75.0","76.0","84.0","85.0","86.0","87.0","92.5","93.0","95.0","96.0","97.3","98.0","106.0","107.0","108.0","109.0","113.5","114.0","116.0","117.3","118.0"],"started":["12.0","62.1","70.0","76.0","81.0","81.2","89.0","98.0","103.2","111.0","118.0"],"development":["12.0","26.1","52.1"],"as":["12.0","15.2","15.3","24.1","24.2","24.3","24.6","24.7","24.8","26.1","27.3","38.2","52.1","56.3","57.1","57.2","57.3","57.6","57.7","57.8","67.0","71.0","72.1","81.4","86.0","87.0","91.0","92.1","95.0","97.2","108.0","112.0","113.1","117.2"],"semester":["12.0"],"long":["12.0","24.7","57.7"],"project":["12.0","38.1","70.2"],"team":["12.0"],"of":["12.0","23.2","23.3","23.5","23.6","24.0","24.1","24.2","24.4","24.6","24.7","24.8","24.9","24.10","25.0","26.0","26.2","27.0","27.3","27.4","50.0","52.0","52.2","53.0","55.2","55.3","55.5","55.6","56.0","56.3","56.4","57.0","57.1","57.2","57.4","57.6","57.7","57.8","57.9","57.10","60.0","62.1","63.0","66.0","67.0","68.0","69.0","72.0","72.1","72.2","72.3","73.0","75.0","77.0","80.34","80.40","80.46","81.1","81.2","82.0","85.0","86.0","87.0","88.0","90.0","92.1","92.2","92.3","92.7","93.0","96.0","97.1","97.3","99.0","102.16","102.22","102.28","103.1","103.2","104.0","107.0","108.0","109.0","110.0","113.1","113.2","113.3","113.7","114.0","116.0","117.1","117.3","119.0"],"nine":["12.0"],"producer":["12.0"],"creative":["12.0"],"director":["12.0"],"narrative":["12.0"],"writer":["12.0"],"artist":["12.0"],"two":["12.0","68.0","87.0","109.0"],"programmers":["12.0"],"designers":["12.0"],"information":["12.0","15.2","64.0","81.4","83.0","105.0"],"about":["12.0","23.2","23.6","24.2","27.3","45.6","55.2","55.6","56.3","57.2"],"contributions":["12.0"],"lead":["12.0"],"programmer":["12.0","38.2"],"over":["12.0"],"because":["12.0","24.3","57.3","68.0","87.0","109.0"],"can":["12.0","15.2","23.0","24.0","26.3","27.2","27.3","38.1","41.0","52.3","55.0","56.2","56.3","57.0","62.0","63.0","64.0","66.0","68.0","69.0","72.1","72.2","72.6","74.0","75.0","80.34","80.46","80.54","82.0","83.0","85.0","86.0","87.0","88.0","92.1","92.2","92.7","94.0","95.0","96.0","97.3","102.16","102.28","102.36","103.0","104.0","105.0","107.0","108.0","109.0","110.0","113.1","113.2","113.7","115.0","116.0","117.3"],"show":["12.0","23.5","55.5","70.2","89.2","111.2"],"off":["12.0","80.46","102.28"],"stuff":["12.0"],"like":["12.0","22.3","23.0","23.1","23.2","24.1","26.3","52.3","54.3","55.0","55.1","55.2","57.1","64.0","69.0","72.3","74.0","83.0","88.0","92.3","94.0","105.0","110.0","113.3","115.0"],"editor":["12.0"],"scripts":["12.0"],"wrote":["12.0"],"was":["12.0","72.5","92.6","113.6"],"doing":["12.0","23.2","55.2"],"everything":["12.0","22.3","23.0","54.3","55.0","72.5","73.0","80.54","92.6","93.0","102.36","113.6","114.0"],"from":["12.0","24.1","27.2","27.3","56.2","56.3","57.1","59.0","78.0","90.0","100.0"],"interface":["12.0"],"coding":["12.0"],"integrating":["12.0"],"course":["12.0"],"related":["12.0","24.11","57.11","92.4","113.4"],"gameplay":["12.0","27.3","56.3"],"itself":["12.0"],"date":["12.0"],"m":["12.0"],"still":["12.0","69.0","110.0"],"more":["12.0","23.2","23.5","27.3","55.2","55.5","56.3","64.0","68.0","69.0","72.0","83.0","87.0","88.0","92.0","92.2","105.0","109.0","110.0","113.0","113.2"],"up":["12.0","23.1","24.0","24.2","24.5","24.7","55.1","57.0","57.2","57.5","57.7","62.1","70.1","81.0","81.2","89.1","89.2","103.2","111.1","111.2"],"on":["12.0","22.2","22.3","23.6","24.3","24.7","27.3","54.2","54.3","55.6","56.3","57.3","57.7","67.0","69.0","70.2","72.3","72.4","72.5","81.0","86.0","88.0","89.2","90.0","92.3","92.5","92.6","108.0","110.0","111.2","113.5","113.6"],"current":["12.0","67.0","72.3","77.0","85.0","86.0","92.3","99.0","108.0","113.3","119.0"],"state":["12.0"],"please":["12.0"],"visit":["12.0"],"official":["12.0"],"chronological":["13.0","19.0"],"cozy":["13.0","44.0"],"decentralized":["14.0","16.0","41.0"],"allow":["14.0"],"plan":["15.1"],"rethinking":["15.1"],"federation":["15.1"],"article":["15.1"],"doesn":["15.1"],"t":["15.1","22.1","24.3","24.7","24.8","27.3","54.1","56.3","57.3","57.7","57.8","81.0"],"address":["15.1"],"many":["15.1","23.0","55.0","67.0","72.6","80.54","86.0","92.7","95.0","102.36","108.0","113.7"],"implementation":["15.1"],"details":["15.1"],"if":["15.1","23.5","24.3","27.0","27.3","27.4","55.5","56.0","56.3","56.4","57.3","66.0","67.0","69.0","72.1","72.5","72.6","74.0","77.0","81.0","82.0","86.0","88.0","92.1","92.4","92.6","97.0","99.0","107.0","108.0","110.0","113.1","113.4","113.6","117.0","119.0"],"private":["15.2"],"public":["15.2","15.6"],"keys":["15.2"],"anyone":["15.2","26.0","52.0"],"create":["15.2","27.4","56.4","62.2","62.3","81.3","81.4","103.3","103.4"],"store":["15.2"],"how":["15.2","15.4","27.2","27.3","27.4","56.2","56.3","56.4","62.2","62.3","67.0","72.6","81.3","81.4","86.0","92.7","103.3","103.4","108.0","113.7"],"they":["15.2","15.5","23.6","24.0","24.8","24.10","27.3","55.6","56.3","57.0","57.8","57.10","63.0","68.0","74.0","80.9","82.0","85.0","87.0","90.0","94.0","95.0","97.3","104.0","109.0","115.0","117.3"],"want":["15.2","27.0","45.5","56.0","97.0","117.0"],"fully":["15.2","86.0","108.0"],"free":["15.2","95.0"],"with":["15.2","15.4","15.5","22.3","23.6","24.8","26.0","27.3","52.0","54.3","55.6","56.3","57.8","65.0","66.0","67.0","69.0","70.1","72.4","77.0","81.2","82.0","84.0","85.0","86.0","88.0","89.1","92.5","95.0","97.3","99.0","103.2","104.0","106.0","107.0","108.0","110.0","111.1","113.5","117.3","119.0"],"no":["15.2","15.6","24.2","27.3","56.3","57.2"],"server":["15.2"],"dependencies":["15.2"],"profile":["15.2"],"sent":["15.2"],"signed":["15.2"],"message":["15.2","15.5"],"through":["15.2","62.0","103.0"],"all":["15.2","15.6","24.3","57.3","72.1","72.2","73.0","90.0","92.1","92.2","92.7","113.1","113.2","113.7","114.0"],"relays":["15.2","15.3"],"would":["15.2"],"you":["15.2","22.1","22.2","23.2","23.5","24.1","24.7","26.2","27.0","27.2","27.3","27.4","52.2","54.1","54.2","55.2","55.5","56.0","56.2","56.3","56.4","57.1","57.7","62.0","63.0","64.0","66.0","68.0","69.0","70.2","72.1","72.3","72.6","73.0","74.0","75.0","76.0","80.25","80.34","81.0","82.0","83.0","87.0","88.0","89.2","90.0","92.1","92.3","92.7","93.0","94.0","96.0","97.0","98.0","102.7","102.16","103.0","104.0","105.0","107.0","109.0","110.0","111.2","113.1","113.3","113.7","114.0","115.0","116.0","117.0","118.0"],"act":["15.3"],"merely":["15.3"],"storing":["15.3"],"messages":["15.3","15.5"],"sending":["15.3"],"them":["15.3","23.2","24.1","24.7","55.2","57.1","57.7","63.0","82.0","104.0"],"any":["15.3","27.0","27.3","56.0","56.3","67.0","68.0","77.0","86.0","87.0","99.0","108.0","109.0","119.0"],"clients":["15.3"],"or":["15.3","22.1","22.2","23.1","24.1","27.1","27.3","54.1","54.2","55.1","56.1","56.3","57.1","62.0","64.0","66.0","67.0","71.0","72.1","72.5","80.46","81.0","83.0","85.0","86.0","91.0","92.1","92.5","92.6","102.28","103.0","105.0","108.0","112.0","113.1","113.6"],"have":["15.3","15.5","22.1","23.2","23.4","23.5","24.8","27.4","54.1","55.2","55.4","55.5","56.4","57.8","72.2","76.0","80.40","86.0","88.0","90.0","92.2","95.0","97.0","98.0","102.22","108.0","110.0","113.2","117.0","118.0"],"subscribed":["15.3"],"may":["15.3","24.8","45.4","57.8"],"decide":["15.3"],"protocol":["15.4","45.3"],"should":["15.4","24.2","24.4","27.1","27.4","56.1","56.4","57.2","57.4","72.6","74.0","80.40","81.0","89.2","92.7","94.0","102.22","111.2","113.7","115.0"],"dictate":["15.4"],"convey":["15.4"],"text":["15.4","69.0","72.4","88.0","92.5","110.0","113.5"],"image":["15.4","92.5","95.0","113.5"],"audio":["15.4"],"video":["15.4","23.6","24.0","25.0","43.0","53.0","55.6","57.0"],"binary":["15.4"],"include":["15.4"],"reacting":["15.4"],"arbitrary":["15.4"],"general":["15.5"],"edits":["15.5"],"delete":["15.5"],"requests":["15.5"],"are":["15.5","15.6","22.1","22.2","22.3","23.2","23.5","23.6","24.0","24.1","24.2","24.8","24.10","24.11","26.1","27.2","45.5","50.0","52.1","54.1","54.2","54.3","55.2","55.5","55.6","56.2","57.0","57.1","57.2","57.8","57.10","57.11","59.0","63.0","64.0","66.0","68.0","69.0","71.0","72.2","74.0","75.0","76.0","77.0","78.0","80.9","80.37","80.46","82.0","83.0","85.0","86.0","87.0","88.0","90.0","91.0","94.0","95.0","96.0","97.3","98.0","99.0","100.0","102.19","102.28","104.0","105.0","107.0","108.0","109.0","110.0","112.0","115.0","116.0","117.3","118.0","119.0"],"replying":["15.5"],"specially":["15.5"],"flagged":["15.5"],"edit":["15.5","70.2","73.0","93.0","114.0"],"deletion":["15.5"],"ignored":["15.5"],"unless":["15.5"],"solve":["15.6"],"anonymity":["15.6"],"upvotes":["15.6"],"downvotes":["15.6"],"etc":["15.6","74.0","94.0","115.0"],"linked":["15.6"],"your":["15.6","22.2","26.2","27.1","52.2","54.2","56.1","62.1","69.0","70.2","73.0","76.0","81.0","81.2","88.0","89.2","93.0","98.0","103.2","110.0","111.2","114.0","118.0"],"key":["15.6"],"perhaps":["15.6"],"could":["15.6","23.3","24.3","45.3","55.3","57.3"],"generate":["15.6"],"new":["15.6","72.1","73.0","92.1","93.0","99.0","113.1","114.0"],"keypairs":["15.6"],"every":["15.6","23.2","55.2"],"action":["15.6"],"dev":["20.0"],"tree":["20.0","60.0","62.0","70.0","70.1","76.0","81.0","89.0","89.1","97.0","97.2","98.0","103.0","111.0","111.1","117.0","117.2","118.0"],"knowledge":["21.0","45.0","46.0"],"incrementals":["22.0","22.3","23.0","23.1","24.0","24.3","24.6","24.9","25.0","25.2","26.0","27.0","52.0","53.0","53.2","54.0","54.3","55.0","55.1","56.0","57.0","57.3","57.6","57.9"],"appeal":["22.0","23.0","23.2","23.3","54.0","55.0","55.2","55.3"],"developers":["22.0","27.4","54.0","56.4"],"easy":["22.1","22.2","23.2","54.1","54.2","55.2"],"make":["22.1","24.3","27.3","45.5","54.1","56.3","57.3","63.0","68.0","70.1","82.0","87.0","95.0","104.0","109.0"],"compared":["22.1","54.1"],"other":["22.1","24.2","26.1","50.0","52.1","54.1","57.2","64.0","72.1","83.0","85.0","92.7","95.0","105.0","113.7"],"genres":["22.1","24.0","24.2","24.10","24.11","54.1","57.0","57.2","57.10","57.11"],"quite":["22.1","54.1","90.0"],"low":["22.1","24.7","54.1","57.7"],"expectations":["22.1","24.0","54.1","57.0"],"don":["22.1","27.3","54.1","56.3"],"need":["22.1","54.1"],"fancy":["22.1","54.1"],"art":["22.1","23.6","54.1","55.6"],"music":["22.1","54.1"],"lay":["22.1","54.1"],"things":["22.1","27.3","54.1","56.3","65.0","66.0","68.0","69.0","71.0","73.0","84.0","85.0","87.0","88.0","91.0","93.0","95.0","106.0","107.0","109.0","110.0","112.0","114.0"],"out":["22.1","54.1"],"find":["22.2","23.1","24.1","27.0","54.2","55.1","56.0","57.1"],"once":["22.2","27.3","54.2","56.3"],"ve":["22.2","22.3","24.5","24.7","27.0","54.2","54.3","56.0","57.5","57.7"],"finished":["22.2","54.2"],"uploaded":["22.2","54.2"],"github":["22.2","54.2","70.1","76.0","81.2","89.1","98.0","103.2","111.1","118.0"],"pages":["22.2","54.2"],"itch":["22.2","54.2"],"just":["22.2","23.1","24.1","24.10","54.2","55.1","57.1","57.10","70.0","89.0","92.1","111.0","113.1"],"clarify":["22.3","54.3"],"said":["22.3","54.3"],"above":["22.3","54.3"],"mainly":["22.3","54.3"],"applies":["22.3","54.3"],"based":["22.3","23.6","47.0","54.3","55.6","72.3","90.0","92.3","113.3"],"games":["22.3","23.1","23.2","23.3","23.4","23.5","23.6","24.0","24.1","24.2","24.4","24.5","24.6","24.8","24.9","24.10","25.0","26.0","27.0","27.3","47.0","52.0","53.0","54.3","55.1","55.2","55.3","55.4","55.5","55.6","56.0","56.3","57.0","57.1","57.2","57.4","57.5","57.6","57.8","57.9","57.10"],"also":["22.3","54.3","72.1","80.51","92.1","92.7","95.0","96.0","102.33","113.1","113.7","116.0"],"incredibly":["22.3","27.2","54.3","56.2"],"popular":["22.3","24.4","54.3","57.4"],"mobile":["22.3","54.3"],"but":["22.3","23.1","23.2","24.1","24.2","24.3","27.1","27.2","27.3","54.3","55.1","55.2","56.1","56.2","56.3","57.1","57.2","57.3","63.0","69.0","72.5","88.0","90.0","92.6","97.3","104.0","110.0","113.6","117.3"],"players":["23.0","23.5","26.2","27.0","27.3","52.2","55.0","55.5","56.0","56.3"],"something":["23.0","23.2","55.0","55.2","59.0","78.0","100.0"],"has":["23.0","23.5","24.1","55.0","55.5","57.1","67.0","77.0","82.0","85.0","86.0","99.0","107.0","108.0","119.0"],"been":["23.0","24.5","27.0","55.0","56.0","57.5"],"discussed":["23.0","55.0"],"analyzed":["23.0","55.0"],"people":["23.0","23.1","24.1","24.6","45.3","45.5","55.0","55.1","57.1","57.6"],"some":["23.0","23.1","24.10","27.3","55.0","55.1","56.3","57.10","63.0","74.0","81.4","82.0","90.0","94.0","104.0","115.0"],"extent":["23.0","55.0"],"feel":["23.0","23.2","26.3","52.3","55.0","55.2"],"going":["23.1","24.2","55.1","57.2"],"very":["23.1","55.1","65.0","84.0","106.0"],"common":["23.1","24.6","27.2","55.1","56.2","57.6"],"response":["23.1","55.1"],"why":["23.1","55.1"],"enjoy":["23.1","23.5","55.1","55.5"],"although":["23.1","55.1"],"s":["23.1","23.5","24.0","24.6","25.1","26.1","26.3","27.3","43.0","46.0","52.1","52.3","53.1","55.1","55.5","56.3","57.0","57.6","72.1","72.4","73.0","76.0","77.0","80.15","81.0","87.0","92.1","92.5","93.0","97.3","98.0","99.0","109.0","113.1","113.5","114.0","117.3","118.0","119.0"],"not":["23.1","23.2","23.5","24.1","24.4","27.1","27.3","41.0","55.1","55.2","55.5","56.1","56.3","57.1","57.4","68.0","73.0","80.43","87.0","93.0","102.25","109.0","114.0"],"one":["23.1","27.0","55.1","56.0","67.0","68.0","72.2","72.5","75.0","86.0","87.0","92.2","92.6","96.0","108.0","109.0","113.2","113.6","116.0"],"compels":["23.1","55.1"],"me":["23.1","23.6","55.1","55.6"],"personally":["23.1","55.1"],"suspect":["23.1","55.1"],"might":["23.1","23.5","55.1","55.5"],"stand":["23.1","55.1"],"progression":["23.1","55.1"],"guide":["23.1","25.2","43.0","53.2","55.1","81.0"],"what":["23.1","24.3","25.1","27.0","53.1","55.1","56.0","57.3","73.0","76.0","93.0","98.0","114.0","118.0"],"content":["23.1","27.0","27.1","27.2","27.3","27.4","55.1","56.0","56.1","56.2","56.3","56.4","62.0","103.0"],"reportedly":["23.1","55.1"],"do":["23.1","25.1","53.1","55.1","68.0","69.0","72.1","80.15","87.0","88.0","92.1","109.0","110.0","113.1"],"seeing":["23.1","55.1"],"big":["23.1","55.1","64.0","83.0","105.0"],"so":["23.2","23.5","24.6","55.2","55.5","57.6","72.1","90.0","92.1","113.1"],"lot":["23.2","26.0","52.0","55.2"],"even":["23.2","23.5","24.1","55.2","55.5","57.1"],"progress":["23.2","55.2","64.0","80.46","83.0","102.28","105.0"],"while":["23.2","23.5","24.6","38.1","55.2","55.5","57.6"],"re":["23.2","23.5","27.3","27.4","55.2","55.5","56.3","56.4","68.0","73.0","87.0","93.0","109.0","114.0"],"playing":["23.2","23.5","55.2","55.5"],"part":["23.2","55.2","97.1","117.1"],"being":["23.2","24.10","55.2","57.10"],"able":["23.2","55.2"],"making":["23.2","25.1","27.1","47.0","53.1","55.2","56.1","81.0","82.0","90.0","104.0"],"actually":["23.2","55.2"],"productive":["23.2","55.2"],"multitasking":["23.2","55.2"],"way":["23.2","24.2","24.4","45.3","55.2","57.2","57.4","62.0","64.0","83.0","90.0","96.0","103.0","105.0","116.0"],"sense":["23.2","55.2"],"fidget":["23.2","55.2"],"toy":["23.2","55.2"],"think":["23.2","23.6","27.1","55.2","55.6","56.1"],"hard":["23.2","55.2"],"actively":["23.2","55.2"],"click":["23.2","24.1","55.2","57.1","68.0","70.2","80.17","87.0","89.2","109.0","111.2"],"few":["23.2","55.2","90.0","95.0"],"buttons":["23.2","55.2","85.0","97.3","117.3"],"often":["23.2","24.2","55.2","57.2"],"paying":["23.2","55.2"],"attention":["23.2","55.2"],"considered":["23.3","55.3"],"subset":["23.3","55.3"],"inherit":["23.3","55.3"],"appeals":["23.3","55.3"],"includes":["23.3","55.3"],"feeling":["23.3","55.3"],"staleness":["23.4","55.4"],"tend":["23.4","23.5","55.4","55.5"],"paradigm":["23.4","24.6","55.4","57.6"],"design":["23.5","24.10","55.5","57.10"],"their":["23.5","23.6","45.2","55.5","55.6","66.0","67.0","77.0","82.0","85.0","86.0","88.0","90.0","99.0","107.0","108.0","119.0"],"plainly":["23.5","55.5"],"readily":["23.5","55.5"],"apparent":["23.5","55.5"],"looking":["23.5","55.5"],"different":["23.5","55.5","90.0","95.0"],"preferences":["23.5","55.5"],"types":["23.5","55.5","92.7","113.7"],"than":["23.5","55.5","72.5","92.6","113.6"],"others":["23.5","55.5"],"there":["23.5","24.2","24.10","45.5","55.5","57.2","57.10","68.0","87.0","95.0","103.0","109.0"],"underlying":["23.5","55.5"],"bad":["23.5","27.3","55.5","56.3"],"principles":["23.5","55.5"],"will":["23.5","27.3","55.5","56.3","63.0","65.0","70.2","71.0","73.0","84.0","89.2","91.0","93.0","104.0","106.0","111.2","112.0","114.0"],"merit":["23.6","55.6"],"vampire":["23.6","55.6"],"survivors":["23.6","55.6"],"back":["23.6","55.6","66.0","107.0"],"old":["23.6","55.6"],"arguments":["23.6","55.6"],"whether":["23.6","55.6"],"ought":["23.6","55.6"],"seems":["23.6","55.6"],"preoccupied":["23.6","55.6"],"attaching":["23.6","55.6"],"value":["23.6","24.6","24.7","24.8","55.6","57.6","57.7","57.8","72.1","92.1","113.1"],"solely":["23.6","27.1","55.6","56.1"],"mechanics":["23.6","24.3","55.6","57.3"],"depth":["23.6","55.6"],"thereof":["23.6","55.6"],"point":["23.6","24.6","27.3","27.4","55.6","56.3","56.4","57.6","77.0","80.15","99.0","119.0"],"arguing":["23.6","55.6"],"waste":["23.6","55.6"],"time":["23.6","24.5","26.1","27.0","27.1","27.2","38.1","52.1","55.6","56.0","56.1","56.2","57.5","72.2","92.2","113.2"],"due":["23.6","24.6","55.6","57.6"],"defining":["24.0","24.4","57.0","57.4","81.0","88.0","95.0"],"genre":["24.0","24.1","24.4","25.0","53.0","57.0","57.1","57.4"],"placed":["24.0","57.0"],"into":["24.0","57.0","69.0","88.0","110.0"],"variety":["24.0","57.0"],"reasons":["24.0","57.0"],"give":["24.0","57.0","63.0","74.0","82.0","94.0","104.0","115.0"],"mental":["24.0","57.0"],"shorthand":["24.0","57.0"],"set":["24.0","57.0","62.1","66.0","70.1","81.0","81.2","85.0","89.1","92.2","103.2","107.0","111.1"],"player":["24.0","27.3","56.3","57.0","63.0","66.0","67.0","72.1","74.0","77.0","82.0","85.0","86.0","88.0","92.1","94.0","99.0","104.0","107.0","108.0","110.0","113.1","115.0","119.0"],"help":["24.0","57.0","63.0","104.0"],"idlers":["24.1","57.1"],"clickers":["24.1","57.1"],"oftentimes":["24.1","57.1"],"refer":["24.1","57.1"],"idle":["24.1","57.1"],"clicker":["24.1","27.2","56.2","57.1"],"ll":["24.1","27.0","27.3","56.0","56.3","57.1"],"trend":["24.1","27.3","56.3","57.1"],"oxymoronic":["24.1","57.1"],"titles":["24.1","57.1"],"contain":["24.1","57.1"],"both":["24.1","27.3","56.3","57.1"],"terms":["24.1","57.1"],"umbrella":["24.1","57.1"],"term":["24.1","24.6","57.1","57.6"],"those":["24.1","57.1","68.0","87.0","109.0"],"fall":["24.1","57.1"],"under":["24.1","57.1"],"however":["24.1","26.3","27.2","52.3","56.2","57.1"],"argue":["24.1","27.3","56.3","57.1"],"only":["24.1","24.2","57.1","57.2","72.5","92.6","113.6"],"use":["24.1","24.2","45.3","57.1","57.2","66.0","68.0","69.0","72.3","74.0","87.0","90.0","92.3","94.0","95.0","109.0","110.0","113.3","115.0"],"calling":["24.1","57.1","103.0"],"wrong":["24.1","57.1"],"almost":["24.1","57.1"],"universally":["24.1","57.1"],"these":["24.1","24.8","24.10","27.2","45.4","45.5","50.0","56.2","57.1","57.8","57.10","68.0","87.0","90.0","92.7","109.0","113.7"],"used":["24.1","24.2","24.3","24.10","57.1","57.2","57.3","57.10","69.0","72.1","76.0","85.0","88.0","92.1","92.4","92.7","93.0","98.0","110.0","113.1","113.4","113.7","118.0"],"interchangeably":["24.1","57.1"],"same":["24.1","27.2","56.2","57.1","67.0","69.0","72.1","86.0","88.0","90.0","92.1","96.0","108.0","110.0","113.1","116.0"],"kind":["24.1","57.1","68.0","87.0","109.0"],"where":["24.1","24.2","26.2","27.3","52.2","56.3","57.1","57.2","73.0","93.0","114.0"],"start":["24.1","57.1","81.0"],"spamming":["24.1","57.1"],"eventually":["24.1","57.1"],"automate":["24.1","57.1"],"process":["24.1","57.1"],"frankly":["24.1","57.1"],"deserves":["24.1","57.1"],"neither":["24.1","57.1"],"title":["24.1","57.1","92.1","113.1"],"trended":["24.1","57.1"],"away":["24.1","57.1"],"ever":["24.1","57.1"],"requiring":["24.1","57.1"],"ngu":["24.2","57.2"],"another":["24.2","57.2","62.0","67.0","80.24","86.0","102.6","103.0","108.0"],"broad":["24.2","57.2"],"definition":["24.2","24.3","24.4","57.2","57.3","57.4","72.1","92.1","113.1"],"focus":["24.2","57.2"],"numbers":["24.2","57.2"],"proposes":["24.2","57.2"],"simply":["24.2","27.3","56.3","57.2"],"increasing":["24.2","57.2"],"means":["24.2","57.2"],"end":["24.2","57.2","95.0"],"uniquely":["24.2","57.2"],"care":["24.2","57.2"],"themselves":["24.2","57.2"],"put":["24.2","57.2"],"implies":["24.2","57.2"],"earlier":["24.3","24.7","57.3","57.7"],"mentioned":["24.3","57.3"],"reset":["24.3","57.3","66.0","72.1","72.5","72.6","92.1","92.6","107.0","113.1","113.6"],"shouldn":["24.3","57.3"],"berlin":["24.4","24.9","57.4","57.9"],"interpretation":["24.4","24.9","57.4","57.9"],"far":["24.4","57.4"],"most":["24.4","24.7","57.4","57.7","65.0","73.0","80.40","84.0","93.0","97.1","102.22","106.0","114.0","117.1"],"roguelikes":["24.4","57.4"],"which":["24.4","57.4","72.2","72.3","80.46","92.2","92.3","95.0","102.28","113.2","113.3"],"acknowledged":["24.4","57.4"],"diversity":["24.4","57.4"],"within":["24.4","57.4","69.0","110.0"],"argued":["24.4","57.4"],"canon":["24.5","57.5"],"alright":["24.5","57.5"],"get":["24.5","26.1","26.3","52.1","52.3","57.5","66.0","72.6","85.0","107.0"],"controversial":["24.5","27.1","27.3","56.1","56.3","57.5"],"til":["24.5","57.5"],"now":["24.5","27.3","56.3","57.5","72.6","80.34","80.47","80.54","102.16","102.29","102.36"],"trying":["24.5","24.6","57.5","57.6"],"best":["24.5","57.5"],"stay":["24.5","57.5"],"objective":["24.5","57.5"],"shift":["24.6","57.6","80.17"],"probably":["24.6","57.6"],"highest":["24.6","57.6"],"possible":["24.6","57.6"],"factor":["24.6","57.6"],"referred":["24.6","57.6"],"exhibit":["24.6","57.6"],"trait":["24.6","57.6"],"unfolding":["24.6","57.6"],"replace":["24.6","57.6"],"factors":["24.7","24.8","57.7","57.8"],"won":["24.7","57.7"],"take":["24.7","57.7"],"discuss":["24.7","57.7"],"already":["24.7","57.7"],"seen":["24.7","57.7"],"brought":["24.7","57.7"],"meaning":["24.8","57.8"],"aren":["24.8","57.8","81.0"],"strongly":["24.8","57.8"],"correlated":["24.8","57.8"],"none":["24.8","57.8","72.3","92.3","113.3"],"non":["24.8","27.1","56.1","57.8","93.0","97.3","114.0","117.3"],"roguelites":["24.9","57.9"],"having":["24.9","57.9"],"our":["24.9","57.9"],"variation":["24.9","57.9"],"we":["24.9","27.3","56.3","57.9","80.40","102.22"],"trends":["24.10","57.10"],"go":["24.10","27.3","56.3","57.10","97.3","117.3"],"beyond":["24.10","27.2","56.2","57.10"],"commonly":["24.10","57.10"],"mechanic":["24.10","57.10"],"such":["24.10","57.10","72.1","92.1","113.1"],"deeply":["24.10","57.10"],"affect":["24.10","57.10"],"rest":["24.10","57.10"],"cultivation":["24.11","57.11"],"rpgs":["24.11","57.11"],"comprehensive":["25.0","53.0","72.0","92.0","113.0"],"am":["25.1","53.1"],"good":["25.1","53.1","71.0","91.0","112.0"],"question":["25.1","53.1"],"authority":["25.1","53.1"],"navigating":["26.0","52.0"],"criticism":["26.0","26.1","52.0","52.1"],"developing":["26.0","52.0"],"fun":["26.0","52.0"],"exciting":["26.0","52.0"],"teaches":["26.0","52.0"],"wonderful":["26.0","52.0"],"skills":["26.0","52.0"],"enthusiastically":["26.0","52.0"],"encourage":["26.0","52.0"],"interest":["26.0","52.0"],"feedback":["26.1","26.2","26.3","52.1","52.2","52.3"],"skill":["26.1","52.1"],"takes":["26.1","52.1"],"practice":["26.1","52.1"],"truly":["26.1","52.1"],"great":["26.1","52.1"],"at":["26.1","38.2","52.1","70.0","75.0","80.15","89.0","95.0","96.0","111.0","116.0"],"constructive":["26.1","52.1"],"vital":["26.1","52.1"],"continually":["26.1","52.1"],"improving":["26.1","52.1"],"useful":["26.1","52.1","63.0","67.0","77.0","82.0","85.0","86.0","95.0","99.0","104.0","107.0","108.0","119.0"],"look":["26.1","52.1"],"deciding":["26.2","52.2"],"share":["26.2","52.2"],"consider":["26.2","52.2"],"type":["26.2","52.2","72.3","72.6","92.3","92.7","113.3","113.7"],"anticipate":["26.2","52.2"],"getting":["26.2","27.3","52.2","56.3","62.1","76.0","81.0","81.2","98.0","103.2","118.0"],"negative":["26.3","52.3"],"naturally":["26.3","52.3"],"attack":["26.3","52.3"],"okay":["26.3","52.3"],"angry":["26.3","52.3"],"community":["27.0","56.0"],"amount":["27.0","56.0","66.0","72.3","80.15","85.0","87.0","92.3","95.0","107.0","113.3"],"quickly":["27.0","56.0"],"number":["27.0","56.0","63.0","82.0","104.0"],"thing":["27.0","27.2","27.3","56.0","56.2","56.3","68.0","87.0","109.0"],"fairly":["27.1","56.1"],"opinion":["27.1","56.1"],"spent":["27.1","56.1"],"waiting":["27.1","56.1"],"count":["27.1","56.1"],"towards":["27.1","56.1"],"including":["27.1","56.1"],"reading":["27.1","56.1"],"various":["27.1","45.2","56.1"],"effects":["27.1","27.3","56.1","56.3","67.0","77.0","82.0","85.0","86.0","99.0","107.0","108.0","119.0"],"decisions":["27.1","27.3","56.1","56.3"],"head":["27.1","38.1","56.1"],"rather":["27.1","56.1"],"purchases":["27.2","56.2","66.0","72.2","92.2","107.0","113.2"],"imagine":["27.2","56.2"],"entity":["27.2","56.2"],"purchase":["27.2","27.3","56.2","56.3"],"multiple":["27.2","56.2","66.0","85.0","107.0"],"times":["27.2","56.2","66.0","67.0","85.0","86.0","107.0","108.0"],"each":["27.2","50.0","56.2","69.0","110.0"],"performs":["27.2","56.2"],"higher":["27.2","56.2","72.5","92.6","113.6"],"cost":["27.2","56.2","72.3","99.0"],"buildings":["27.2","56.2"],"cookie":["27.2","56.2"],"units":["27.2","56.2"],"swarm":["27.2","56.2"],"sim":["27.2","56.2"],"ip":["27.2","56.2"],"ep":["27.2","56.2"],"multipliers":["27.2","56.2"],"antimatter":["27.2","56.2"],"dimensions":["27.2","56.2"],"much":["27.2","56.2","96.0","116.0"],"specific":["27.2","27.3","56.2","56.3"],"first":["27.2","56.2","71.0","72.4","91.0","92.5","112.0","113.5"],"does":["27.2","56.2","72.5","92.6","113.6"],"instructions":["27.3","56.3"],"along":["27.3","56.3"],"let":["27.3","56.3","64.0","70.2","83.0","89.2","105.0","111.2"],"talk":["27.3","56.3"],"linear":["27.3","56.3"],"circumstances":["27.3","56.3"],"adding":["27.3","56.3"],"difficulty":["27.3","56.3"],"abstract":["27.3","56.3"],"change":["27.3","56.3"],"expect":["27.3","56.3"],"decision":["27.3","56.3"],"sufficiently":["27.3","56.3"],"abstracts":["27.3","56.3"],"effect":["27.3","56.3","68.0","87.0","109.0"],"then":["27.3","56.3","70.2","89.2","111.2"],"longer":["27.3","56.3"],"engaging":["27.3","56.3"],"clicking":["27.3","56.3","80.26","102.8"],"become":["27.3","56.3"],"available":["27.3","56.3"],"isn":["27.3","56.3"],"necessarily":["27.3","56.3"],"plenty":["27.3","56.3"],"mind":["27.3","56.3","90.0"],"style":["27.3","56.3","69.0","88.0","110.0"],"reach":["27.3","56.3"],"developer":["27.4","56.4"],"pretty":["27.4","56.4","63.0","104.0"],"decent":["27.4","56.4"],"idea":["27.4","56.4"],"v":["30.0"],"ecs":["30.0","47.0"],"advent":["35.0","35.1","37.0","40.0"],"planar":["35.1","40.0"],"pioneers":["35.1","39.0","40.0"],"speech":["38.0","38.2"],"original":["38.1"],"optispeech":["38.1"],"involves":["38.1","81.0"],"designing":["38.1"],"testing":["38.1"],"real":["38.1"],"tongue":["38.1"],"model":["38.1"],"viewed":["38.1"],"transparent":["38.1"],"subject":["38.1"],"work":["38.2"],"sole":["38.2"],"ut":["38.2"],"dallas":["38.2"],"kronos":["40.0"],"traditional":["41.0"],"davey":["43.0","49.0"],"favorite":["43.0"],"hub":["45.0","46.0"],"follow":["45.1"],"websites":["45.2","50.0"],"indieweb":["45.2"],"contains":["45.2","73.0","93.0","114.0"],"resources":["45.2"],"blocks":["45.2"],"microsub":["45.3"],"proposed":["45.3"],"support":["45.3"],"sites":["45.4"],"tools":["45.5","47.0"],"days":["45.5"],"videos":["45.6"],"collecting":["46.0"],"screenshot":["47.0"],"png":["47.0"],"pronounced":["47.0"],"vex":["47.0"],"vulkan":["47.0"],"engine":["47.0"],"highly":["47.0","80.46","102.28"],"moddable":["47.0"],"lua":["47.0"],"collection":["50.0"],"link":["50.0"],"format":["59.0","69.0","77.0","78.0","88.0","99.0","100.0","110.0","119.0"],"changes":["59.0","78.0","80.54","100.0","102.36"],"temp":["59.0","78.0","100.0"],"changed":["59.0","78.0","100.0"],"layer":["59.0","62.0","62.3","63.0","65.0","66.0","67.0","69.0","72.4","72.5","74.0","77.0","78.0","80.34","80.54","81.3","81.4","82.0","84.0","85.0","86.0","88.0","92.5","92.6","93.0","97.3","99.0","100.0","102.16","102.36","103.0","103.4","104.0","106.0","107.0","108.0","110.0","113.5","113.6","114.0","117.3","119.0"],"consistency":["59.0","78.0","100.0"],"challenges":["59.0","62.3","78.0","81.4","100.0","103.4"],"modding":["60.0","62.0","70.0","70.1","76.0","80.0","81.0","89.0","89.1","98.0","102.0","103.0","111.0","111.1","118.0"],"modified":["60.0"],"version":["60.0","61.5","68.0","87.0","109.0"],"prestige":["60.0","69.0","72.6","88.0","92.4","92.7","110.0","113.4","113.7"],"bump":["61.5"],"row":["61.8","63.0","72.5","82.0","92.6","104.0","113.6"],"cash":["61.10"],"main":["62.0","69.0","81.2","88.0","103.0","103.2","110.0"],"add":["62.0","72.0","103.0"],"layers":["62.0","72.1","80.46","92.1","92.4","92.6","96.0","97.3","102.28","103.0","113.1","113.4","116.0","117.3"],"either":["62.0","103.0"],"directly":["62.0","77.0","99.0","103.0","119.0"],"object":["62.0","95.0","103.0"],"layerssupportjs":["62.0"],"declare":["62.0","103.0"],"file":["62.0","72.2","89.2","103.0","111.2"],"own":["62.1","81.2","103.2"],"copy":["62.1","70.0","81.2","89.0","103.2","111.0"],"code":["62.1","70.1","72.1","73.0","81.2","89.1","92.1","93.0","103.2","111.1","113.1","114.0"],"components":["62.2","62.3","81.3","81.4","90.0","103.3","103.4"],"upgrades":["62.2","72.1","72.2","81.3","88.0","92.1","92.2","103.3","113.1","113.2"],"awarded":["63.0","74.0","82.0","94.0","104.0","115.0"],"meet":["63.0","74.0","82.0","94.0","104.0","115.0"],"certain":["63.0","74.0","82.0","94.0","104.0","115.0"],"goal":["63.0","74.0","82.0","94.0","104.0","115.0"],"benefit":["63.0","74.0","82.0","94.0","104.0","115.0"],"currently":["63.0","104.0"],"basic":["63.0","73.0","77.0","81.0","93.0","99.0","104.0","114.0","119.0"],"additional":["63.0","65.0","84.0","104.0","106.0"],"features":["63.0","64.0","65.0","72.0","72.1","72.2","72.3","72.4","72.5","80.54","81.4","83.0","84.0","92.0","92.1","92.2","92.3","92.4","92.5","92.6","95.0","97.3","102.36","103.4","104.0","105.0","106.0","113.0","113.1","113.2","113.3","113.4","113.5","113.6","117.3"],"added":["63.0","80.5","80.9","80.10","80.15","80.20","80.25","80.27","80.29","80.33","80.35","80.38","80.46","80.50","80.51","102.2","102.7","102.9","102.11","102.15","102.17","102.20","102.28","102.32","102.33","102.38","104.0"],"later":["63.0","104.0"],"global":["63.0","82.0","104.0"],"putting":["63.0","82.0","104.0"],"side":["63.0","80.46","82.0","92.6","102.28","104.0"],"its":["63.0","70.0","72.3","82.0","87.0","89.0","92.3","104.0","111.0","113.3"],"instead":["63.0","82.0","90.0","97.3","104.0","117.3"],"functions":["63.0","67.0","77.0","81.0","82.0","85.0","86.0","99.0","104.0","107.0","108.0","119.0"],"display":["64.0","69.0","80.15","81.4","83.0","88.0","105.0","110.0"],"direct":["64.0","83.0","105.0"],"bar":["64.0","83.0","105.0"],"health":["64.0","83.0","105.0"],"capacity":["64.0","83.0","105.0"],"gague":["64.0"],"anything":["64.0","69.0","83.0","88.0","105.0","110.0"],"else":["64.0","83.0","105.0"],"defined":["64.0","83.0","97.2","97.3","105.0","117.2","117.3"],"js":["64.0","65.0","69.0","73.0","74.0","77.0","81.0","83.0","84.0","88.0","93.0","94.0","95.0","99.0","103.0","105.0","106.0","110.0","114.0","115.0","119.0"],"breakdown":["65.0","73.0","84.0","93.0","106.0","114.0"],"minimal":["65.0","84.0","106.0"],"require":["65.0","84.0","106.0"],"startdata":["65.0","84.0","106.0"],"return":["65.0","69.0","84.0","88.0","94.0","106.0","110.0","115.0"],"function":["65.0","66.0","69.0","75.0","84.0","88.0","92.4","96.0","99.0","106.0","107.0","110.0","113.4","116.0","119.0"],"returns":["65.0","67.0","72.6","77.0","84.0","85.0","86.0","92.7","99.0","106.0","108.0","113.7","119.0"],"default":["65.0","71.0","72.4","72.5","84.0","91.0","92.1","92.5","92.6","97.1","112.0","113.1","113.5","113.6","117.1"],"usually":["66.0","85.0","107.0"],"bought":["66.0","85.0","107.0"],"scaling":["66.0","85.0","107.0"],"costs":["66.0","72.2","85.0","92.2","107.0","113.2"],"respec":["66.0","107.0"],"currency":["66.0","72.2","72.3","92.2","92.3","107.0","113.2","113.3"],"buyable":["66.0","85.0","87.0","107.0","109.0"],"owned":["66.0","85.0","107.0"],"decimal":["66.0","85.0","99.0","107.0"],"getbuyableamt":["66.0"],"id":["66.0","67.0","72.4","73.0","74.0","77.0","81.0","82.0","85.0","86.0","92.5","93.0","97.1","99.0","107.0","108.0","113.5","114.0","117.1","119.0"],"setbuyableamt":["66.0"],"amt":["66.0"],"buyableeffect":["66.0","85.0"],"dealing":["67.0","77.0","82.0","85.0","86.0","99.0","104.0","107.0","108.0","119.0"],"implementing":["67.0","77.0","82.0","85.0","86.0","99.0","107.0","108.0","119.0"],"inchallenge":["67.0","86.0","108.0"],"determine":["67.0","74.0","77.0","82.0","86.0","92.4","93.0","99.0","108.0","113.4","119.0"],"given":["67.0","86.0","108.0"],"challenge":["67.0","86.0","108.0"],"counts":["67.0","86.0","108.0"],"haschallenge":["67.0","86.0","108.0"],"completed":["67.0","86.0","108.0"],"challengecompletions":["67.0","86.0","108.0"],"challeffect":["67.0"],"generalized":["68.0","87.0","109.0"],"buyables":["68.0","72.1","87.0","92.1","109.0","113.1"],"repeatedly":["68.0","87.0","109.0"],"bonus":["68.0","87.0","109.0"],"awful":["68.0","87.0","109.0"],"several":["68.0","87.0","109.0"],"differences":["68.0","87.0","109.0"],"between":["68.0","87.0","109.0"],"tab":["69.0","71.0","75.0","88.0","91.0","96.0","97.1","110.0","112.0","116.0","117.1"],"layouts":["69.0","88.0","110.0"],"note":["69.0","88.0","90.0","110.0"],"using":["69.0","70.0","76.0","88.0","89.0","98.0","110.0","111.0","118.0"],"subtabs":["69.0","80.51","88.0","102.33","110.0"],"tabformat":["69.0","88.0","110.0"],"differently":["69.0","88.0","110.0"],"see":["69.0","88.0","92.2","110.0","113.2"],"basically":["69.0","88.0","110.0"],"window":["69.0","88.0","110.0"],"especially":["69.0","88.0","110.0"],"combined":["69.0","88.0","110.0"],"feature":["69.0","88.0","110.0"],"array":["69.0","88.0","110.0"],"button":["69.0","88.0","110.0"],"melt":["69.0","88.0","110.0"],"points":["69.0","72.1","72.6","88.0","92.1","92.7","94.0","110.0","113.1","113.7","115.0"],"blank":["69.0","88.0","110.0"],"welcome":["70.0","89.0","111.0"],"simplest":["70.0","89.0","111.0"],"level":["70.0","89.0","111.0"],"requires":["70.0","89.0","111.0"],"install":["70.1","89.1","111.1"],"desktop":["70.1","76.0","81.2","89.1","98.0","103.2","111.1","118.0"],"visual":["70.1","89.1","111.1"],"studio":["70.1","89.1","111.1"],"repository":["70.2","89.2","111.2"],"finder":["70.2","89.2","111.2"],"right":["70.2","89.2","111.2"],"index":["70.2","89.2","111.2"],"html":["70.2","89.2","111.2"],"view":["70.2","75.0","89.2","96.0","111.2","116.0"],"test":["70.2","89.2","111.2"],"displaying":["71.0","80.43","91.0","102.25","112.0"],"lore":["71.0","91.0","112.0"],"story":["71.0","91.0","112.0"],"elements":["71.0","91.0","95.0","112.0"],"well":["71.0","91.0","112.0"],"explaining":["71.0","91.0","112.0"],"complicated":["71.0","91.0","112.0"],"layout":["71.0","91.0","112.0"],"infobox":["71.0","80.35","91.0","92.1","102.17","112.0","113.1"],"list":["72.0","92.0","92.2","113.0","113.2"],"established":["72.0"],"assigned":["72.1","92.1","113.1"],"automagically":["72.1","92.1","113.1"],"similar":["72.1","90.0","92.1","113.1"],"access":["72.1","92.1","113.1"],"save":["72.1"],"makes":["72.1","92.1","113.1"],"copying":["72.1","92.1","113.1"],"easier":["72.1","90.0","92.1","113.1"],"optional":["72.1","72.2","72.3","72.4","72.5","85.0","92.1","92.2","92.3","92.5","92.6","97.3","113.1","113.2","113.3","113.5","113.6","117.3"],"confirmations":["72.1","92.1","113.1"],"maybe":["72.1"],"places":["72.1"],"grid":["72.2","113.2"],"unique":["72.2","92.2","93.0","113.2"],"upgrade":["72.2","77.0","92.2","99.0","113.2","119.0"],"conditions":["72.2","86.0","92.2","108.0","113.2"],"bonuses":["72.2","72.3","92.2","92.3","113.2","113.3"],"explanations":["72.2"],"separate":["72.2","75.0","96.0","116.0"],"milestones":["72.2","81.3","88.0","92.2","113.2"],"formula":["72.3","92.3","113.3"],"determines":["72.3","86.0","92.3","113.3"],"defaults":["72.3","92.3","95.0","113.3"],"normal":["72.3","90.0","92.3","113.3"],"gain":["72.3","77.0","92.3","99.0","113.3","119.0"],"independent":["72.3","92.3","113.3"],"before":["72.3","92.3","113.3"],"baseresource":["72.3","92.3"],"exponent":["72.3","92.3"],"static":["72.3","80.54","92.3","92.4","102.36","113.4"],"dependent":["72.3"],"node":["72.4","80.17","92.5","97.3","113.5","117.3"],"symbol":["72.4","92.5","113.5"],"appears":["72.4","92.5","113.5"],"doreset":["72.5","92.6","113.6"],"resettinglayer":["72.5","92.6","113.6"],"triggered":["72.5","92.6","113.6"],"greater":["72.5","92.6","113.6"],"equal":["72.5","82.0","92.6","104.0","113.6"],"behavior":["72.5","90.0","92.6","113.6"],"getresetgain":["72.6","92.7","113.7"],"data":["73.0","87.0","90.0","93.0","114.0"],"likely":["73.0","93.0","114.0"],"altered":["73.0","93.0","114.0"],"updates":["73.0","93.0","114.0"],"besides":["73.0","93.0","114.0"],"addition":["73.0","93.0","114.0"],"modinfo":["73.0","93.0","114.0"],"configuration":["73.0","93.0","114.0"],"string":["73.0","93.0","97.3","114.0","117.3"],"requirementdesc":["74.0"],"waffles":["74.0","94.0","115.0"],"hasmilestone":["74.0","94.0","115.0"],"microtabs":["75.0","96.0","116.0"],"sections":["75.0","96.0","116.0"],"selecting":["75.0","96.0","116.0"],"top":["75.0","96.0","116.0"],"smaller":["75.0","80.46","96.0","102.28","116.0"],"areas":["75.0","96.0","116.0"],"tutorial":["76.0","98.0","118.0"],"assumes":["76.0","98.0","118.0"],"vscode":["76.0","98.0","118.0"],"mod":["76.0","77.0","81.0","98.0","99.0","118.0","119.0"],"hasupgrade":["77.0","99.0","119.0"],"upgradeeffect":["77.0","99.0","119.0"],"buyupgrade":["77.0","99.0","119.0"],"buys":["77.0","99.0","119.0"],"affordable":["77.0","99.0","119.0"],"hint":["77.0","99.0","119.0"],"calculated":["77.0","99.0","119.0"],"getpointgen":["77.0","99.0","119.0"],"stored":["77.0","86.0","99.0","108.0","119.0"],"following":["77.0","81.0","99.0","108.0","119.0"],"particle":["80.5","95.0"],"grids":["80.9"],"setting":["80.10","81.0"],"dreams":["80.15"],"really":["80.15"],"come":["80.15","85.0"],"optimizations":["80.15"],"hopefully":["80.15"],"significant":["80.15"],"oom":["80.15"],"gen":["80.15"],"rationalized":["80.17"],"edition":["80.17","80.25","80.56","102.7","102.38"],"completely":["80.17","80.47","102.29"],"reworked":["80.17"],"tooltips":["80.17"],"force":["80.17"],"π":["80.18","80.19","102.1"],"incrementally":["80.19","102.1"],"updated":["80.19","102.1"],"cooler":["80.25","102.7"],"newer":["80.25","102.7"],"achievement":["80.25","80.46","102.7","102.28"],"milestone":["80.25","102.7"],"popups":["80.25","102.7"],"thank":["80.25","102.7"],"03":["80.26","102.8"],"double":["80.26","102.8"],"highlight":["80.33","102.15"],"uprooted":["80.34","102.16"],"embed":["80.34","96.0","102.16","116.0"],"inside":["80.34","96.0","102.16"],"component":["80.35","97.2","102.17","117.2"],"gainmult":["80.37","102.19"],"gainexp":["80.37","102.19"],"thought":["80.40","102.22"],"sooner":["80.40","102.22"],"moved":["80.40","102.22"],"fixed":["80.43","102.25"],"hotkeys":["80.43","102.25"],"pinnacle":["80.46","102.28"],"mountain":["80.46","102.28"],"bars":["80.46","81.4","102.28","103.4"],"customizable":["80.46","86.0","102.28","108.0"],"horizontal":["80.46","102.28"],"vertical":["80.46","102.28"],"displayed":["80.46","102.28"],"automated":["80.47","102.29"],"converttodecimal":["80.47","102.29"],"custom":["80.50","102.32"],"css":["80.50","102.32"],"tabception":["80.51","102.33"],"ception":["80.51","102.33"],"micro":["80.51","102.33"],"values":["80.54","102.36"],"enhanced":["80.56","102.38"],"mostly":["81.0","92.7","113.7"],"parameters":["81.0"],"objects":["81.0"],"info":["81.0","92.2","113.2"],"important":["81.0","97.1","117.1"],"ensure":["81.0"],"saving":["81.0"],"optionally":["82.0","104.0"],"hasachievement":["82.0"],"gauge":["83.0","105.0"],"addlayer":["84.0","97.3","103.0","106.0","117.3"],"respeccing":["85.0"],"selling":["85.0"],"among":["85.0"],"getbuyableamount":["85.0","107.0"],"setbuyableamount":["85.0","107.0"],"win":["86.0","108.0"],"maxedchallenge":["86.0"],"reached":["86.0"],"maximum":["86.0"],"completions":["86.0"],"challengeeffect":["86.0","108.0"],"saved":["87.0","92.1","109.0","113.1"],"pointy":["88.0","110.0"],"color":["88.0","97.3","117.3"],"red":["88.0"],"font":["88.0"],"size":["88.0"],"32px":["88.0"],"family":["88.0"],"comic":["88.0"],"sans":["88.0"],"ms":["88.0"],"toggle":["88.0"],"c":["88.0"],"beep":["88.0"],"explorer":["89.2","111.2"],"folder":["89.2","111.2"],"page":["89.2","111.2"],"browser":["89.2","111.2"],"group":["90.0"],"clickables":["90.0"],"gridables":["90.0"],"respects":["90.0"],"fundamentally":["90.0"],"tmt":["90.0"],"ways":["90.0"],"sure":["90.0"],"keep":["90.0"],"gridable":["90.0"],"ids":["90.0"],"base":["90.0"],"absent":["92.1","113.1"],"uses":["92.1","95.0","113.1"],"gained":["92.2"],"canbuymax":["92.4","113.4"],"sometimes":["92.4","113.4"],"required":["92.4","113.4"],"buying":["92.4","113.4"],"max":["92.4","113.4"],"letter":["92.5","113.5"],"capitalized":["92.5","113.5"],"override":["92.5","113.5"],"local":["92.5"],"always":["92.6"],"called":["92.6"],"requirementdescription":["94.0","115.0"],"effectdescription":["94.0","115.0"],"blah":["94.0","99.0","115.0"],"done":["94.0","115.0"],"w":["94.0","115.0"],"gte":["94.0","115.0"],"floating":["95.0"],"move":["95.0"],"behaviors":["95.0"],"interact":["95.0"],"mouse":["95.0"],"makeparticles":["95.0"],"explained":["95.0"],"below":["95.0"],"makeshinies":["95.0"],"creates":["95.0"],"stationary":["95.0"],"random":["95.0"],"location":["95.0"],"listed":["95.0"],"const":["95.0"],"myparticle":["95.0"],"options":["95.0"],"wheel":["95.0"],"customization":["97.0","117.0"],"containing":["97.1","117.1"],"starttab":["97.1","117.1"],"trees":["97.3","117.3"],"similarly":["97.3","117.3"],"addnode":["97.3","117.3"],"hex":["97.3","117.3"],"description":["99.0"],"layersupport":["103.0"],"register":["103.0"],"layername":["103.0"],"layerdata":["103.0"],"example":["103.0"],"registration":["103.0"],"showing":["103.0"],"recommended":["103.0"],"rows":["119.0"],"cols":["119.0"],"columns":["119.0"]},{"0":["65.0","83.0","84.0","105.0","106.0"],"1":["2.0","61.4","76.0","80.2","80.12","80.14","80.45","85.0","95.0","98.0","102.27","107.0","118.0"],"2":["80.1","80.12","80.23","89.1","89.2","95.0","102.5","111.1","111.2"],"3":["61.7","61.8","70.1","70.2","80.36","89.1","89.2","95.0","102.18","111.1","111.2"],"4":["80.42","102.24"],"7":["80.13"],"8":["95.0"],"9":["80.1","80.2","80.55","80.57"],"10":["61.8","80.42","80.45","80.49","102.24","102.27","102.31"],"11":["61.5","63.0","67.0","77.0","82.0","85.0","86.0","104.0","107.0","108.0"],"12":["80.7"],"15":["0.0","80.44","102.26"],"20":["0.0","80.21","80.22","80.28","80.32","80.44","80.48","80.56","95.0","102.3","102.4","102.10","102.14","102.26","102.30"],"21":["80.3","80.4","80.6","80.7","80.11","80.13","80.18","80.19","102.1"],"22":["80.32","102.14"],"23":["0.0"],"24":["0.0"],"50":["83.0","105.0"],"100":["86.0","108.0","119.0"],"101":["90.0"],"102":["90.0"],"200":["83.0","105.0"],"201":["90.0"],"202":["90.0"],"560":["45.6"],"2020":["61.5","61.6","61.8","61.10"],"2024":["0.0"],"if":["0.0","15.5","15.6","22.1","22.2","23.1","23.6","24.8","24.9","27.2","54.1","54.2","55.1","55.6","56.2","57.8","57.9","63.0","70.0","72.0","73.0","76.0","80.15","80.31","80.52","85.0","89.0","90.0","92.2","92.7","93.0","94.0","97.1","97.3","98.0","102.13","102.34","104.0","111.0","113.7","114.0","115.0","117.1","117.3","118.0"],"you":["0.0","12.0","15.5","23.1","23.3","26.1","27.1","52.1","55.1","55.3","56.1","65.0","70.0","70.1","72.0","72.5","80.6","80.26","80.33","80.35","80.43","80.47","80.51","80.52","80.54","84.0","86.0","89.0","89.1","92.0","92.4","92.6","99.0","102.8","102.15","102.17","102.25","102.29","102.33","102.34","102.36","106.0","108.0","111.0","111.1","113.0","113.4","113.6","119.0"],"like":["0.0","9.0","23.3","23.5","55.3","55.5","63.0","66.0","71.0","75.0","82.0","85.0","90.0","91.0","92.6","96.0","102.38","104.0","107.0","112.0","116.0"],"look":["0.0","70.2","76.0","89.2","90.0","98.0","111.2","118.0"],"further":["0.0"],"into":["0.0","12.0","62.0","90.0"],"s":["0.0","10.0","12.0","14.0","15.4","21.0","23.2","23.6","24.1","24.5","24.9","25.0","53.0","55.2","55.6","57.1","57.5","57.9","68.0","69.0","88.0","89.2","103.0","110.0","111.2"],"history":["0.0"],"check":["0.0"],"https":["0.0"],"code":["0.0","22.1","54.1","80.40","102.22"],"incremental":["0.0","8.0","16.0","17.0","22.1","24.7","25.3","26.0","30.0","33.0","35.0","42.0","52.0","53.3","54.1","57.7"],"social":["0.0","8.0","15.0","16.0","33.0"],"thepaperpilot":["0.0","80.35","102.17"],"pages":["0.0"],"commits":["0.0"],"branch":["0.0"],"master":["0.0"],"here":["0.0","20.0","24.5","24.6","27.4","39.0","56.4","57.5","57.6","65.0","84.0","106.0"],"article":["0.0"],"entry":["0.0"],"h2":["0.0"],"more":["0.0","23.3","27.1","55.3","56.1","63.0","65.0","72.3","77.0","80.41","80.46","82.0","84.0","90.0","92.3","102.23","102.28","104.0","106.0"],"testing":["0.0"],"pushed":["0.0"],"on":["0.0","4.0","14.0","23.0","24.1","24.4","27.0","46.0","50.0","55.0","56.0","57.1","57.4","66.0","68.0","70.1","73.0","80.33","80.37","87.0","89.1","93.0","95.0","97.0","97.1","97.3","102.15","102.19","109.0","111.1","113.3","114.0","117.0","117.1","117.3"],"time":["0.0","12.0","23.2","27.3","38.2","43.0","55.2","56.3","80.20","95.0","102.2"],"dt":["0.0"],"published":["0.0"],"06":["0.0"],"content":["0.0","12.0","15.1","23.2","55.2","81.0","96.0","116.0"],"table":["0.0"],"thead":["0.0"],"tr":["0.0"],"th":["0.0"],"style":["0.0"],"align":["0.0"],"center":["0.0"],"page":["0.0","24.1","24.7","57.1","57.7","68.0","87.0","109.0"],"changes":["0.0","23.4","24.6","38.2","55.4","57.6","73.0","76.0","93.0","98.0","114.0","118.0"],"tbody":["0.0"],"td":["0.0"],"activitypub":["0.0"],"span":["0.0","24.1","57.1"],"color":["0.0","69.0","110.0"],"a3be8c":["0.0"],"advent":["0.0"],"atproto":["0.0"],"babble":["0.0","35.0"],"buds":["0.0","35.0"],"capture":["0.0","35.0","35.1"],"citadel":["0.0"],"by":["1.0","2.0","4.0","15.0","17.0","24.0","24.1","24.10","31.0","32.0","34.0","36.0","42.0","43.0","48.0","57.0","57.1","57.10","72.4","80.46","92.5","97.3","102.28","117.3"],"fediverse":["1.0","11.0","36.0"],"over":["2.0","27.2","27.3","56.2","56.3"],"the":["2.0","3.0","4.0","6.0","15.1","15.4","18.0","22.1","22.2","22.3","23.0","23.1","23.4","23.5","25.0","25.1","25.2","26.3","45.2","47.0","52.3","53.0","53.1","53.2","54.1","54.2","54.3","55.0","55.1","55.4","55.5","59.0","64.0","65.0","72.2","78.0","79.0","80.9","80.15","80.20","80.22","80.24","80.25","80.26","80.29","80.34","80.40","80.43","83.0","84.0","92.2","92.4","97.0","100.0","101.0","102.2","102.4","102.6","102.7","102.8","102.11","102.16","102.22","102.25","105.0","106.0","113.2","113.4","117.0"],"course":["2.0","23.2","55.2"],"of":["2.0","5.0","7.0","11.0","13.0","15.5","22.0","22.1","22.2","23.0","23.1","24.3","24.5","24.11","27.1","27.2","38.1","43.0","44.0","46.0","47.0","54.0","54.1","54.2","55.0","55.1","56.1","56.2","57.3","57.5","57.11","59.0","70.0","71.0","72.4","78.0","80.9","80.11","80.16","81.0","89.0","91.0","92.0","92.5","92.6","95.0","97.2","100.0","103.0","111.0","112.0","113.0","113.5","117.2"],"month":["2.0"],"myself":["2.0"],"and":["2.0","15.6","22.1","22.3","24.0","24.2","24.5","24.11","25.0","26.2","27.0","27.1","30.0","45.3","52.2","53.0","54.1","54.3","56.0","56.1","57.0","57.2","57.5","57.11","62.0","69.0","72.3","72.4","72.5","80.17","80.29","80.30","80.33","80.50","81.0","87.0","88.0","90.0","92.6","102.11","102.12","102.15","102.32","109.0","110.0","113.6"],"other":["2.0","12.0","23.5","24.0","27.3","27.4","35.2","45.1","55.5","56.3","56.4","57.0","71.0","72.0","73.0","91.0","93.0","96.0","112.0","114.0","116.0"],"devs":["2.0"],"i":["2.0","4.0","23.5","23.6","27.2","27.4","30.0","38.0","46.0","55.5","55.6","56.2","56.4","69.0"],"know":["2.0"],"decentralized":["3.0","15.2"],"at":["3.0","12.0","23.1","23.2","23.3","55.1","55.2","55.3","70.2","71.0","72.3","76.0","77.0","82.0","85.0","89.2","91.0","92.3","97.1","98.0","99.0","103.0","111.2","112.0","117.1","118.0","119.0"],"protocol":["3.0"],"is":["3.0","7.0","15.1","24.5","26.3","40.0","44.0","51.0","52.3","57.5","60.0","64.0","75.0","80.15","80.25","80.37","81.0","82.0","83.0","96.0","97.3","102.7","102.19","104.0","105.0","116.0","117.3"],"with":["4.0","11.0","12.0","23.0","23.5","24.3","24.6","27.1","38.1","47.0","55.0","55.5","56.1","57.3","57.6","59.0","62.1","63.0","78.0","87.0","90.0","100.0","109.0"],"controlled":["4.0"],"others":["4.0"],"shared":["4.0"],"stage":["4.0"],"note":["4.0","27.3","56.3"],"need":["4.0","24.7","57.7","72.1","86.0","103.0","108.0"],"to":["4.0","7.0","15.1","15.5","21.0","23.3","24.4","24.9","24.10","25.1","27.1","27.3","38.2","45.0","45.2","45.4","53.1","55.3","56.1","56.3","57.4","57.9","57.10","60.0","62.1","64.0","65.0","70.1","72.6","80.10","80.15","80.16","80.24","80.25","80.26","80.35","80.40","80.47","80.51","81.2","84.0","86.0","92.0","92.7","97.1","99.0","102.6","102.7","102.8","102.17","102.22","102.29","102.33","103.2","106.0","108.0","113.0","113.7","117.1"],"move":["4.0"],"a":["5.0","7.0","14.0","15.4","18.0","21.0","22.0","22.1","22.3","23.0","23.4","24.3","24.4","24.5","24.7","24.8","45.0","54.0","54.1","54.3","55.0","55.4","57.3","57.4","57.5","57.7","57.8","72.1","76.0","77.0","80.9","80.20","80.21","80.26","80.46","80.53","89.1","89.2","92.1","92.4","92.5","98.0","99.0","102.2","102.3","102.8","102.28","102.35","111.1","111.2","113.1","113.4","118.0","119.0"],"3d":["5.0"],"vr":["5.0"],"re":["5.0","22.2","23.3","24.8","27.1","27.2","54.2","55.3","56.1","56.2","57.8"],"envisioning":["5.0"],"my":["6.0","23.5","28.0","40.0","45.0","55.5"],"personal":["6.0","28.0"],"website":["6.0","28.0","45.0","79.0","101.0"],"web":["7.0","13.0","18.0","45.6","51.0"],"collection":["7.0"],"information":["7.0","62.3","103.4"],"that":["7.0","9.0","15.2","15.5","21.0","23.1","23.2","23.3","23.6","24.4","24.7","24.9","27.4","55.1","55.2","55.3","55.6","56.4","57.4","57.7","57.9","60.0","64.0","70.2","74.0","77.0","81.0","83.0","88.0","90.0","92.4","94.0","99.0","105.0","113.4","115.0","119.0"],"tied":["7.0","24.6","57.6"],"its":["7.0","15.3","23.6","24.0","24.4","55.6","57.0","57.4","68.0","72.4","80.17","90.0","92.5","109.0","113.5"],"creation":["7.0"],"than":["9.0","24.1","24.2","57.1","57.2","90.0","92.1","113.1"],"anything":["9.0","46.0","76.0","98.0","118.0"],"else":["9.0","24.1","57.1"],"out":["9.0","26.0","27.3","52.0","56.3","103.0"],"there":["9.0","12.0","22.0","24.4","24.6","24.9","26.0","52.0","54.0","57.4","57.6","57.9","76.0","81.0","98.0","118.0"],"currently":["9.0"],"in":["9.0","12.0","15.2","22.3","23.4","23.5","24.8","26.0","26.3","27.4","38.0","45.3","45.5","46.0","50.0","52.0","52.3","54.3","55.4","55.5","56.4","57.8","59.0","70.0","70.1","72.4","78.0","80.43","81.2","85.0","89.0","89.1","92.5","95.0","100.0","102.25","103.2","111.0","111.1","113.5"],"development":["9.0","26.0","52.0"],"exposes":["9.0"],"certain":["9.0","72.2","92.2","113.2"],"channels":["9.0"],"such":["9.0","12.0","15.6","24.2","57.2","72.5","92.6","113.6"],"they":["9.0","23.2","23.5","24.2","24.4","27.0","27.2","50.0","55.2","55.5","56.0","56.2","57.2","57.4","80.46","81.4","92.2","102.28","103.4"],"are":["9.0","12.0","13.0","15.3","15.4","22.0","23.0","23.3","24.4","24.6","24.7","26.0","27.3","27.4","45.2","47.0","52.0","54.0","55.0","55.3","56.3","56.4","57.4","57.6","57.7","62.0","67.0","80.52","81.4","102.34","103.4"],"indexable":["9.0"],"will":["9.0","22.3","24.1","25.0","26.2","52.2","53.0","54.3","57.1","59.0","70.0","76.0","78.0","80.15","80.31","80.40","80.54","86.0","89.0","95.0","98.0","99.0","100.0","102.13","102.22","102.36","108.0","111.0","118.0","119.0"],"include":["9.0","92.6"],"features":["9.0","67.0","68.0","71.0","74.0","77.0","80.29","80.30","80.33","80.41","82.0","85.0","86.0","87.0","91.0","94.0","96.0","99.0","102.11","102.12","102.15","102.23","108.0","109.0","112.0","115.0","116.0","119.0"],"chat":["9.0"],"glue":["9.0"],"guide":["10.0","24.1","25.1","27.3","53.1","56.3","57.1"],"tagged":["10.0"],"federated":["11.0","45.3"],"identity":["11.0"],"nostr":["11.0"],"something":["11.0","97.0","117.0"],"no":["11.0"],"central":["11.0"],"source":["11.0","40.0"],"authority":["11.0"],"common":["11.0","24.2","57.2"],"build":["12.0"],"available":["12.0"],"created":["12.0","43.0","45.0"],"showing":["12.0","81.0"],"end":["12.0"],"has":["12.0","22.3","24.8","38.1","54.3","57.8","63.0","74.0","89.2","94.0","104.0","111.2","115.0"],"some":["12.0","24.5","27.4","56.4","57.5","62.3","80.18","80.54","88.0","102.36","103.4"],"buttons":["12.0","80.9"],"present":["12.0"],"make":["12.0","23.2","23.5","55.2","55.5","80.51","89.1","92.1","92.2","102.33","111.1","113.1","113.2"],"easier":["12.0","60.0"],"skip":["12.0"],"parts":["12.0"],"see":["12.0","23.2","23.6","24.1","55.2","55.6","57.1","68.0","72.3","87.0","92.3","109.0"],"all":["12.0","22.2","23.2","24.7","27.3","43.0","50.0","54.2","55.2","56.3","57.7","80.43","93.0","95.0","102.25"],"start":["12.0","23.1","24.5","55.1","57.5","93.0","97.1","117.1"],"already":["12.0","23.0","24.0","55.0","57.0"],"shop":["12.0"],"button":["12.0","22.1","23.1","54.1","55.1","66.0","72.3","92.3","97.3","117.3"],"give":["12.0","66.0","90.0"],"yourself":["12.0","72.3","92.3"],"free":["12.0"],"money":["12.0"],"buy":["12.0","85.0","107.0"],"these":["12.0","15.3","23.0","23.2","24.2","24.7","27.1","55.0","55.2","56.1","57.2","57.7","67.0","72.5","77.0","82.0","86.0","88.0","92.6","95.0","99.0","108.0","110.0","113.6","119.0"],"duel":["12.0"],"force":["12.0"],"win":["12.0"],"or":["12.0","15.2","15.6","23.2","23.3","24.2","27.2","45.1","55.2","55.3","56.2","57.2","62.3","68.0","69.0","72.0","72.6","73.0","76.0","80.34","80.54","81.4","87.0","88.0","92.7","93.0","95.0","97.2","98.0","102.16","102.36","103.4","109.0","110.0","113.5","113.7","114.0","117.2","118.0"],"loss":["12.0"],"which":["12.0","22.2","47.0","54.2","68.0","69.0","80.4","80.9","80.10","80.20","80.39","80.53","80.54","80.56","87.0","88.0","102.2","102.21","102.35","102.36","102.38","109.0","110.0"],"be":["12.0","15.1","15.2","15.6","23.0","23.2","23.5","24.1","24.4","24.6","24.7","24.10","25.1","26.1","27.2","45.4","50.0","52.1","53.1","55.0","55.2","55.5","56.2","57.1","57.4","57.6","57.7","57.10","62.0","67.0","68.0","71.0","72.1","72.6","77.0","80.5","80.25","80.31","81.4","82.0","86.0","87.0","91.0","95.0","99.0","102.7","102.13","103.0","108.0","109.0","112.0","119.0"],"used":["12.0","15.2","24.4","26.1","27.2","52.1","56.2","57.4","72.2","73.0","80.5","80.46","92.2","102.28","113.2","114.0"],"tutorial":["12.0"],"not":["12.0","15.1","23.0","23.6","24.7","24.8","46.0","55.0","55.6","57.7","57.8","64.0","66.0","72.1","72.3","80.5","80.15","83.0","90.0","92.1","105.0","113.1"],"recommended":["12.0","81.0"],"first":["12.0","20.0","67.0","69.0","77.0","80.22","82.0","86.0","88.0","99.0","102.4","102.39","103.0","104.0","108.0","110.0","119.0"],"players":["12.0","23.6","55.6"],"dueling":["12.0"],"use":["12.0","45.2","62.0","67.0","77.0","80.10","86.0","88.0","92.1","99.0","103.0","108.0","113.1","119.0"],"abilities":["12.0"],"flip":["12.0"],"attack":["12.0"],"each":["12.0","15.4","24.7","57.7","59.0","63.0","67.0","75.0","77.0","78.0","82.0","86.0","95.0","96.0","100.0","104.0","108.0","116.0","119.0"],"puts":["12.0"],"chance":["12.0"],"small":["13.0","18.0","45.2","51.0"],"freeform":["13.0"],"collections":["13.0","47.0"],"for":["14.0","15.4","15.5","22.3","24.1","24.2","26.1","38.1","52.1","54.3","57.1","57.2","62.0","65.0","72.1","72.2","72.5","74.0","80.5","80.18","80.25","80.28","80.29","80.30","80.34","80.35","80.40","80.46","80.50","81.2","84.0","90.0","92.1","94.0","102.7","102.10","102.11","102.12","102.16","102.17","102.22","102.28","102.32","103.0","103.2","106.0","113.1","113.6","115.0"],"validating":["14.0"],"one":["14.0","45.3","80.15"],"without":["14.0"],"relying":["14.0"],"specific":["14.0","27.4","56.4"],"server":["15.1","73.0","93.0","114.0"],"relay":["15.1"],"can":["15.1","15.5","22.1","22.2","23.5","23.6","24.1","24.3","24.4","24.9","24.10","26.2","27.1","45.2","52.2","54.1","54.2","55.5","55.6","56.1","57.1","57.3","57.4","57.9","57.10","65.0","67.0","70.1","72.0","72.3","73.0","77.0","80.5","80.6","80.25","80.33","80.56","81.0","81.4","84.0","89.1","90.0","92.3","92.6","93.0","99.0","102.7","102.15","102.38","106.0","111.1","113.3","114.0","119.0"],"viewed":["15.1"],"anonymously":["15.1"],"how":["15.1","15.3","24.1","25.0","53.0","57.1","62.1","81.2","103.2"],"handle":["15.1","70.1","89.1","111.1"],"storing":["15.1"],"large":["15.1"],"amounts":["15.1"],"trust":["15.2"],"username":["15.2"],"petnames":["15.2"],"could":["15.2","23.6","55.6"],"display":["15.2","15.3","62.3","71.0","80.27","80.39","85.0","102.9","102.21","103.4","107.0"],"human":["15.2"],"readable":["15.2"],"names":["15.2","92.6","97.2","117.2"],"via":["15.2"],"contacts":["15.2"],"naming":["15.2"],"hubs":["15.2"],"most":["15.2","27.0","30.0","56.0"],"conversations":["15.2"],"online":["15.2","23.6","55.6"],"their":["15.2","24.6","57.6","63.0","68.0","87.0","104.0","109.0"],"name":["15.2","63.0","65.0","67.0","69.0","75.0","82.0","84.0","86.0","88.0","89.2","96.0","103.0","104.0","106.0","108.0","110.0","111.2","116.0"],"add":["15.2","65.0","72.1","73.0","81.0","84.0","85.0","92.0","92.1","93.0","106.0","113.0","113.1","114.0"],"them":["15.2","45.3","62.0","65.0","84.0","90.0","106.0"],"contact":["15.2"],"publicly":["15.3"],"received":["15.3"],"discovery":["15.3"],"would":["15.3","72.6","92.7","113.7"],"work":["15.3","23.2","38.1","47.0","55.2"],"different":["15.3","22.3","26.2","27.2","52.2","54.3","56.2"],"offer":["15.3"],"unique":["15.3","73.0","114.0"],"displays":["15.3","80.29","80.39","80.53","88.0","102.11","102.21","102.35"],"including":["15.4","80.41","102.23"],"url":["15.4","113.5"],"upvotes":["15.4"],"downvotes":["15.4"],"implemented":["15.4"],"this":["15.4","22.1","22.3","23.5","24.0","24.7","26.1","27.1","27.2","31.0","38.1","48.0","52.1","54.1","54.3","55.5","56.1","56.2","57.0","57.7","59.0","63.0","66.0","70.1","72.3","72.6","73.0","75.0","78.0","80.24","80.25","80.35","82.0","85.0","89.1","90.0","92.4","92.7","93.0","95.0","96.0","100.0","102.6","102.7","102.17","104.0","107.0","111.1","113.4","113.7","114.0","116.0"],"system":["15.4","47.0","80.5"],"message":["15.4"],"contains":["15.4"],"fields":["15.4"],"poster":["15.4"],"id":["15.4","63.0","72.1","87.0","90.0","92.1","94.0","95.0","97.3","103.0","104.0","113.1","115.0","117.3"],"public":["15.4","15.5"],"correct":["15.5"],"key":["15.5"],"signature":["15.5"],"parent":["15.5"],"form":["15.5","50.0"],"hierarchy":["15.5"],"permission":["15.5"],"someone":["15.5","24.1","57.1"],"replies":["15.5"],"your":["15.5","23.2","27.4","41.0","55.2","56.4","65.0","66.0","70.0","70.1","72.3","72.6","84.0","89.0","89.1","92.3","92.7","103.0","106.0","111.0","111.1","113.3","113.7"],"send":["15.5"],"request":["15.5"],"but":["15.6","23.5","24.4","24.5","24.6","24.7","45.5","55.5","57.4","57.5","57.6","57.7","68.0","80.9","87.0","92.1","109.0","113.1"],"then":["15.6","23.6","55.6","62.0","72.5","92.6","113.6"],"it":["15.6","20.0","23.2","23.6","24.0","24.5","24.9","25.0","26.0","27.0","27.3","39.0","52.0","53.0","55.2","55.6","56.0","56.3","57.0","57.5","57.9","60.0","66.0","69.0","70.0","70.2","72.4","74.0","76.0","77.0","80.5","80.40","80.47","85.0","86.0","89.0","89.2","94.0","98.0","99.0","102.22","102.29","108.0","110.0","111.0","111.2","115.0","118.0","119.0"],"d":["15.6","27.4","56.4"],"hard":["15.6"],"determine":["15.6","24.9","24.10","57.9","57.10","63.0","72.5","73.0","92.6","94.0","104.0","113.6","114.0","115.0"],"an":["15.6","22.1","23.2","24.1","24.7","24.8","27.4","39.0","40.0","44.0","51.0","54.1","55.2","56.4","57.1","57.7","57.8","59.0","63.0","67.0","78.0","81.0","82.0","86.0","92.5","92.6","95.0","100.0","104.0","108.0","113.5"],"account":["15.6","70.1","89.1","111.1"],"was":["15.6","45.5"],"genuine":["15.6"],"user":["15.6"],"bot":["15.6"],"servers":["15.6"],"mbin":["16.0"],"weird":["16.0"],"tags":["16.0","28.0","40.0"],"chronological":["18.0"],"dichotomy":["18.0","19.0"],"garden":["18.0"],"rss":["18.0"],"referenced":["19.0","34.0"],"play":["20.0","22.2","39.0","54.2"],"good":["20.0","23.3","55.3","62.0"],"hub":["21.0"],"theoretical":["21.0"],"alternative":["21.0"],"better":["21.0","23.5","55.5"],"lot":["22.0","23.0","24.3","54.0","55.0","57.3"],"nicely":["22.1","54.1"],"learn":["22.1","54.1"],"few":["22.1","54.1"],"lines":["22.1","54.1","70.2"],"necessary":["22.1","54.1"],"number":["22.1","54.1","68.0","80.16","87.0","109.0"],"go":["22.1","54.1","70.1","90.0"],"up":["22.1","54.1","62.0","64.0","83.0","105.0"],"copied":["22.2","54.2"],"link":["22.2","54.2","73.0","93.0","114.0"],"using":["22.2","24.2","54.2","57.2","75.0","80.3","96.0","116.0"],"glitch":["22.2","54.2"],"replit":["22.2","54.2"],"do":["22.2","24.1","27.2","27.3","54.2","56.2","56.3","57.1","62.0","70.0","76.0","89.0","98.0","103.0","111.0","118.0"],"anyone":["22.2","54.2"],"now":["22.2","54.2","59.0","78.0","80.6","80.27","80.37","80.52","92.7","100.0","102.9","102.19","102.34","113.7"],"much":["22.3","23.0","27.0","54.3","55.0","56.0","60.0","75.0"],"culture":["22.3","54.3"],"community":["22.3","54.3"],"many":["22.3","24.1","24.6","26.0","52.0","54.3","57.1","57.6","70.0","80.16","89.0","111.0"],"gamers":["22.3","54.3"],"still":["22.3","27.1","54.3","56.1","60.0","80.38","102.20"],"participate":["22.3","54.3"],"focused":["22.3","54.3"],"said":["23.0","55.0"],"topic":["23.0","55.0"],"however":["23.0","23.5","23.6","26.0","27.4","52.0","55.0","55.5","55.6","56.4","70.0","89.0","111.0"],"analyses":["23.0","55.0"],"from":["23.0","23.1","38.1","45.1","55.0","55.1","64.0","72.3","92.3","113.3"],"perspective":["23.0","55.0"],"those":["23.0","23.5","27.3","55.0","55.5","56.3"],"as":["23.0","23.1","23.2","27.0","55.0","55.1","55.2","56.0","59.0","62.0","62.3","64.0","68.0","78.0","83.0","100.0","103.0","103.4","105.0","109.0"],"experience":["23.0","23.5","24.1","55.0","55.5","57.1"],"involvement":["23.0","55.0"],"within":["23.0","24.10","55.0","57.10"],"must":["23.1","55.1"],"reiterate":["23.1","55.1"],"actual":["23.1","55.1"],"cause":["23.1","55.1"],"context":["23.1","55.1"],"though":["23.1","55.1","80.38","102.20"],"1e1000":["23.1","55.1"],"currency":["23.1","55.1","72.1","73.0","92.1","92.4","93.0","113.1","113.4","114.0"],"get":["23.1","26.0","27.1","45.3","52.0","55.1","56.1","80.46","87.0","92.7","102.28","113.7"],"1e1001":["23.1","55.1"],"isn":["23.1","23.5","27.4","55.1","55.5","56.4"],"t":["23.1","23.2","23.5","24.2","24.6","25.1","27.2","27.4","41.0","53.1","55.1","55.2","55.5","56.2","56.4","57.2","57.6","80.46","93.0","102.28"],"feel":["23.1","23.5","27.2","55.1","55.5","56.2"],"satisfying":["23.1","55.1"],"1e10":["23.1","55.1"],"1e100":["23.1","55.1"],"any":["23.1","23.6","24.4","55.1","55.6","57.4","63.0","72.1","76.0","82.0","85.0","92.1","98.0","104.0","107.0","113.1","118.0"],"case":["23.1","55.1"],"don":["23.1","23.5","24.2","27.2","55.1","55.5","56.2","57.2","80.46","93.0","102.28"],"think":["23.1","24.5","55.1","57.5"],"lecture":["23.2","55.2"],"studying":["23.2","55.2"],"working":["23.2","55.2"],"lend":["23.2","55.2"],"themselves":["23.2","26.1","52.1","55.2"],"played":["23.2","55.2"],"specifically":["23.2","55.2"],"idle":["23.2","55.2"],"take":["23.2","27.2","55.2","56.2"],"incredibly":["23.2","45.5","55.2"],"long":["23.2","24.1","55.2","57.1"],"amount":["23.2","55.2","59.0","68.0","78.0","92.1","100.0","109.0","113.1"],"stretching":["23.2","27.0","55.2","56.0"],"thin":["23.2","55.2"],"possible":["23.2","27.0","55.2","56.0"],"aren":["23.2","24.6","55.2","57.6"],"expecting":["23.2","55.2"],"sitting":["23.2","55.2"],"device":["23.2","55.2"],"entire":["23.2","55.2"],"expect":["23.2","55.2"],"leave":["23.2","55.2"],"come":["23.2","55.2"],"back":["23.2","26.3","45.5","52.3","55.2","70.1","80.25","102.7"],"later":["23.2","55.2","93.0"],"ve":["23.3","27.3","30.0","55.3","56.3"],"found":["23.3","55.3"],"solution":["23.3","55.3"],"puzzle":["23.3","55.3"],"learning":["23.3","55.3"],"about":["23.3","23.5","24.4","55.3","55.5","57.4","80.47","102.29"],"game":["23.3","24.0","24.7","24.8","26.0","27.1","27.4","30.0","35.1","37.0","40.0","43.0","52.0","55.3","56.1","56.4","57.0","57.7","57.8","80.43","92.2","102.25"],"improving":["23.3","55.3"],"shifts":["23.4","24.6","55.4","57.6"],"where":["23.4","23.5","24.10","55.4","55.5","57.10","67.0","70.2","72.5","75.0","77.0","82.0","86.0","88.0","89.2","92.6","96.0","99.0","104.0","108.0","110.0","111.2","113.6","116.0","119.0"],"gameplay":["23.4","23.6","24.6","55.4","55.6","57.6"],"meaningful":["23.4","27.2","55.4","56.2"],"notice":["23.5","55.5"],"effects":["23.5","55.5","63.0","66.0","87.0","104.0"],"clear":["23.5","55.5"],"talking":["23.5","55.5"],"stuff":["23.5","55.5"],"big":["23.5","24.2","55.5","57.2","71.0","91.0","112.0"],"numbers":["23.5","24.8","55.5","57.8","92.1","113.1"],"being":["23.5","55.5","95.0"],"enjoyable":["23.5","55.5"],"comfortably":["23.5","55.5"],"agree":["23.5","55.5"],"disagree":["23.5","55.5"],"intrinsically":["23.5","55.5"],"m":["23.5","55.5"],"aware":["23.5","55.5"],"whom":["23.5","55.5"],"does":["23.5","24.3","24.7","55.5","57.3","57.7","72.3","73.0","93.0","114.0"],"won":["23.5","55.5"],"argue":["23.5","55.5"],"against":["23.5","26.1","27.2","52.1","55.5","56.2"],"feelings":["23.5","55.5"],"designer":["23.5","55.5"],"me":["23.5","55.5"],"lack":["23.6","55.6"],"even":["23.6","55.6"],"setting":["23.6","55.6","73.0","114.0"],"aside":["23.6","55.6"],"fact":["23.6","27.1","55.6","56.1"],"having":["23.6","24.2","24.10","55.6","57.2","57.10","66.0"],"fun":["23.6","55.6"],"wasted":["23.6","55.6"],"have":["23.6","25.1","26.2","27.0","27.2","46.0","52.2","53.1","55.6","56.0","56.2","63.0","67.0","68.0","69.0","72.0","72.1","73.0","77.0","80.47","82.0","87.0","92.1","93.0","99.0","102.29","104.0","109.0","113.1","114.0","119.0"],"supersedes":["23.6","55.6"],"necessity":["23.6","55.6"],"engaging":["23.6","55.6"],"deep":["23.6","55.6"],"consensus":["23.6","55.6"],"definitively":["23.6","55.6"],"although":["23.6","55.6"],"argument":["23.6","55.6","88.0","95.0"],"market":["24.0","57.0"],"itself":["24.0","57.0"],"similarities":["24.0","57.0"],"popular":["24.0","27.0","27.1","56.0","56.1","57.0"],"honestly":["24.0","57.0"],"people":["24.0","45.2","57.0"],"just":["24.0","27.0","56.0","57.0","62.0","69.0","72.1","81.0","88.0","92.4","103.0","110.0","113.4"],"love":["24.0","57.0"],"categorization":["24.0","57.0"],"own":["24.0","41.0","57.0","70.1","89.1","103.0","111.1"],"sake":["24.0","57.0"],"important":["24.0","57.0","73.0","114.0"],"define":["24.0","24.2","57.0","57.2","72.3","92.3","113.3"],"so":["24.0","27.0","27.1","56.0","56.1","57.0"],"bad":["24.1","57.1"],"mechanic":["24.1","24.6","27.0","56.0","57.1","57.6"],"anyways":["24.1","57.1"],"while":["24.1","24.2","57.1","57.2","68.0","87.0","109.0"],"spectrum":["24.1","27.3","56.3","57.1"],"active":["24.1","57.1"],"requires":["24.1","57.1","60.0"],"sorting":["24.1","41.0","57.1"],"metric":["24.1","57.1"],"useful":["24.1","27.2","45.4","56.2","57.1","87.0","109.0"],"looking":["24.1","57.1"],"particular":["24.1","57.1"],"borders":["24.1","57.1"],"when":["24.1","24.6","27.2","56.2","57.1","57.6","76.0","80.3","92.4","93.0","95.0","97.3","98.0","113.4","117.3","118.0"],"counts":["24.1","57.1"],"idler":["24.1","57.1"],"too":["24.1","24.6","27.2","27.3","56.2","56.3","57.1","57.6"],"blurry":["24.1","57.1"],"may":["24.1","57.1"],"great":["24.1","57.1"],"descriptive":["24.1","57.1"],"hence":["24.1","57.1"],"thousands":["24.1","57.1"],"words":["24.1","57.1"],"defining":["24.1","25.0","25.2","53.0","53.2","57.1"],"what":["24.1","24.4","27.2","56.2","57.1","57.4","67.0","72.5","72.6","86.0","92.6","92.7","108.0","113.6","113.7"],"strictly":["24.1","57.1"],"always":["24.1","57.1","72.5","80.10","92.1","113.1","113.6"],"unless":["24.1","57.1"],"quoting":["24.1","57.1"],"typically":["24.1","24.6","57.1","57.6"],"narrative":["24.2","57.2"],"justification":["24.2","57.2"],"why":["24.2","25.0","53.0","57.2"],"shouldn":["24.2","57.2"],"because":["24.2","57.2","93.0"],"feels":["24.2","57.2"],"easy":["24.2","45.5","57.2"],"understand":["24.2","57.2"],"difficult":["24.2","57.2"],"formally":["24.2","57.2"],"phrases":["24.2","57.2"],"describe":["24.2","57.2"],"framework":["24.2","57.2"],"exaggerated":["24.2","57.2"],"sense":["24.2","24.3","57.2","57.3"],"progression":["24.2","24.3","27.3","56.3","57.2","57.3"],"terms":["24.2","57.2"],"vague":["24.2","57.2"],"described":["24.3","57.3"],"games":["24.3","24.11","26.1","27.1","52.1","56.1","57.3","57.11"],"strong":["24.3","24.7","57.3","57.7"],"often":["24.3","57.3","72.2","81.0","92.2","113.2"],"layers":["24.3","57.3","72.0","72.5","80.31","80.33","80.52","81.0","92.0","97.2","102.13","102.15","102.34","113.0","113.6","117.2"],"meta":["24.3","57.3"],"fit":["24.3","57.3"],"bill":["24.3","57.3"],"based":["24.4","27.3","56.3","57.4","72.5","92.6","95.0","113.6"],"ideals":["24.4","57.4"],"ought":["24.4","57.4"],"rather":["24.4","57.4","92.1","113.1"],"defined":["24.4","24.10","57.4","57.10","71.0","75.0","90.0","91.0","96.0","112.0","116.0"],"canon":["24.4","57.4"],"handful":["24.4","57.4"],"analytical":["24.5","57.5"],"making":["24.5","45.5","57.5","93.0"],"opinionated":["24.5","57.5"],"decisions":["24.5","57.5"],"list":["24.5","24.6","57.5","57.6","69.0","72.2","88.0","110.0"],"popularity":["24.6","57.6"],"refer":["24.6","57.6"],"significantly":["24.6","57.6"],"examples":["24.6","57.6","62.0"],"notably":["24.6","57.6"],"every":["24.6","57.6","80.46","102.28"],"single":["24.6","57.6","80.10"],"reset":["24.6","57.6","72.3","80.37","80.46","92.3","92.7","102.19","102.28","113.3","113.7"],"going":["24.6","57.6"],"reminder":["24.7","57.7"],"indicate":["24.7","57.7"],"possibility":["24.7","57.7"],"incrementals":["24.8","57.8"],"several":["24.8","57.8"],"only":["24.8","57.8","80.5","80.15","92.1"],"probably":["24.8","57.8"],"fast":["24.8","57.8"],"numeric":["24.8","57.8"],"growth":["24.8","57.8"],"compare":["24.9","57.9"],"enough":["24.9","57.9","80.15"],"overlap":["24.9","57.9"],"umbrella":["24.10","57.10"],"loops":["24.10","57.10"],"genre":["24.10","24.11","25.2","53.2","57.10","57.11"],"core":["24.10","57.10"],"related":["24.10","50.0","57.10"],"loop":["24.10","57.10"],"books":["24.11","57.11"],"anime":["24.11","57.11"],"explore":["25.0","53.0"],"appealing":["25.0","53.0"],"design":["25.0","47.0","53.0"],"haven":["25.1","53.1"],"made":["25.1","53.1","80.41","80.54","95.0","102.23","102.36"],"best":["25.1","26.3","52.3","53.1","92.6"],"try":["26.0","27.1","52.0","56.1"],"way":["26.0","52.0","70.0","75.0","81.0","89.0","111.0"],"started":["26.0","52.0"],"challenges":["26.0","52.0","72.2","92.2","113.2"],"young":["26.0","52.0"],"solely":["26.1","52.1"],"tool":["26.1","52.1"],"future":["26.1","52.1"],"say":["26.1","27.1","52.1","56.1"],"should":["26.1","52.1","63.0","66.0","67.0","77.0","82.0","85.0","86.0","97.1","99.0","104.0","107.0","108.0","117.1","119.0"],"never":["26.1","26.3","52.1","52.3","80.47","102.29"],"person":["26.1","52.1"],"insults":["26.1","52.1"],"towards":["26.1","52.1"],"developer":["26.1","52.1"],"okay":["26.1","52.1"],"kind":["26.2","52.2"],"receiving":["26.2","52.2"],"communities":["26.2","52.2"],"levels":["26.2","46.0","52.2"],"lashing":["26.3","52.3"],"appropriate":["26.3","52.3","90.0"],"response":["26.3","52.3"],"cool":["26.3","52.3"],"off":["26.3","52.3"],"irl":["26.3","52.3"],"keep":["26.3","27.0","52.3","56.0","72.5","92.6","113.6"],"mind":["26.3","52.3"],"tons":["27.0","56.0"],"introducing":["27.0","56.0"],"after":["27.0","56.0","72.3","92.3","113.3"],"condition":["27.1","56.1"],"met":["27.1","56.1"],"engage":["27.1","56.1"],"necessarily":["27.1","56.1"],"minimize":["27.1","56.1"],"plenty":["27.1","56.1"],"lead":["27.1","56.1"],"infrequent":["27.1","56.1"],"appeal":["27.1","56.1"],"diminishing":["27.2","56.2"],"returns":["27.2","56.2","63.0","74.0","82.0","88.0","94.0","97.3","104.0","107.0","115.0","117.3"],"oscillating":["27.2","56.2"],"between":["27.2","56.2"],"two":["27.2","56.2"],"lost":["27.2","56.2"],"automate":["27.2","56.2"],"away":["27.2","56.2"],"want":["27.2","56.2","72.0","72.5","76.0","80.40","92.6","98.0","102.22","113.6","118.0"],"harsh":["27.2","56.2"],"stance":["27.2","56.2"],"tools":["27.2","56.2"],"myriad":["27.2","56.2"],"interesting":["27.2","56.2"],"ways":["27.2","56.2","70.0","89.0","111.0"],"become":["27.2","56.2"],"stale":["27.2","56.2"],"less":["27.2","56.2"],"bother":["27.3","56.3"],"reading":["27.3","56.3"],"interactions":["27.3","56.3"],"truly":["27.3","56.3"],"unlike":["27.3","56.3"],"previous":["27.3","56.3"],"qualifiers":["27.3","56.3"],"mentioned":["27.3","56.3"],"qualifier":["27.3","56.3"],"therefore":["27.3","56.3","72.3"],"subjective":["27.3","56.3"],"complicated":["27.3","45.5","56.3"],"becomes":["27.3","56.3"],"likely":["27.3","56.3"],"disengage":["27.3","56.3"],"complicatedness":["27.3","56.3"],"leading":["27.3","56.3"],"disengaging":["27.3","56.3"],"also":["27.3","56.3","62.0","68.0","74.0","77.0","80.15","85.0","86.0","87.0","88.0","94.0","99.0","103.0","109.0","115.0","119.0"],"happen":["27.3","56.3"],"non":["27.3","35.2","56.3","80.34","102.16"],"finding":["27.3","56.3"],"optimal":["27.3","56.3"],"route":["27.3","56.3"],"consuming":["27.3","56.3"],"discover":["27.3","56.3"],"seek":["27.3","56.3"],"guides":["27.3","56.3"],"who":["27.3","56.3"],"completed":["27.3","56.3"],"second":["27.3","56.3","67.0","69.0","77.0","82.0","86.0","88.0","99.0","104.0","108.0","110.0","119.0"],"effectively":["27.3","45.3","56.3"],"linearly":["27.3","56.3"],"suggest":["27.4","56.4"],"upgrade":["27.4","56.4"],"simply":["27.4","56.4"],"unlocks":["27.4","56.4"],"another":["27.4","56.4","72.6","92.7","113.7"],"trivially":["27.4","56.4"],"webrings":["28.0","45.1"],"davey":["29.0"],"wreden":["29.0","49.0"],"wanderstop":["29.0"],"largest":["30.0"],"ambitious":["30.0"],"cinny":["32.0","37.0"],"dev":["35.1","61.0"],"tree":["35.1","80.0","80.34","97.1","102.0","102.16","117.1"],"dice":["35.1","37.0"],"armor":["35.1","37.0"],"commune":["37.0"],"forgejo":["37.0"],"college":["38.0"],"continued":["38.0"],"talks":["38.1"],"purposes":["38.1"],"treating":["38.1"],"speech":["38.1"],"errors":["38.1"],"teaching":["38.1"],"foreign":["38.1"],"language":["38.1"],"sounds":["38.1"],"been":["38.1"],"conducted":["38.1"],"partnership":["38.1"],"vulintus":["38.1"],"support":["38.1","80.34","102.16"],"production":["38.2"],"lab":["38.2"],"involved":["38.2"],"updating":["38.2","74.0","77.0","79.0","86.0","88.0","94.0","99.0","101.0","115.0","119.0"],"profectus":["39.0"],"projects":["40.0"],"open":["40.0","51.0"],"engine":["40.0"],"choose":["41.0"],"rules":["41.0"],"methods":["41.0"],"data":["41.0","65.0","68.0","69.0","72.1","84.0","88.0","92.1","106.0","109.0","110.0","113.1"],"queries":["41.0"],"etc":["41.0","63.0","64.0","67.0","71.0","77.0","82.0","83.0","85.0","86.0","91.0","95.0","96.0","99.0","104.0","105.0","108.0","112.0","119.0"],"overrun":["41.0"],"scams":["41.0"],"bar":["43.0","62.3","81.4","91.0","103.4","112.0"],"none":["43.0"],"extension":["44.0"],"websites":["45.0","45.5"],"individuals":["45.0"],"callback":["45.0"],"links":["45.1"],"standards":["45.2"],"help":["45.2","70.0","89.0","111.0"],"clients":["45.3"],"subscribe":["45.3"],"multiple":["45.3"],"feed":["45.3"],"occasionally":["45.4"],"day":["45.5"],"geocities":["45.5"],"pretty":["45.5"],"iframe":["45.6"],"width":["45.6","83.0","105.0"],"height":["45.6","83.0","105.0"],"thoughts":["46.0"],"varying":["46.0"],"completeness":["46.0"],"basically":["46.0"],"interest":["46.0"],"wikipedia":["46.0"],"centered":["47.0"],"around":["47.0"],"pattern":["47.0"],"stealing":["47.0"],"job":["47.0"],"works":["47.0","80.38","81.0","102.20"],"worlds":["47.0"],"systems":["47.0"],"renderers":["47.0"],"comes":["47.0"],"endorsing":["50.0"],"network":["50.0"],"sites":["50.0"],"readers":["50.0"],"might":["50.0","90.0"],"interested":["50.0"],"built":["50.0"],"saved":["59.0","68.0","78.0","100.0"],"object":["59.0","68.0","78.0","87.0","88.0","89.2","90.0","100.0","109.0","110.0","111.2"],"completions":["59.0","78.0","100.0"],"spot":["59.0","78.0","100.0"],"break":["59.0","76.0","78.0","80.54","98.0","100.0","102.36","118.0"],"saves":["59.0","78.0","93.0","100.0"],"effectdisplay":["59.0","78.0","100.0"],"mod":["60.0","62.1","70.2","80.40","81.2","89.2","102.22","103.0","103.2","111.2"],"version":["61.1","61.2","61.3","61.4"],"bump":["61.1","61.2","61.3"],"rebalanced":["61.1","61.3","61.10"],"08":["61.5"],"finished":["61.5"],"stylish":["61.6"],"row":["61.7","61.9","67.0","72.4","77.0","80.53","86.0","90.0","92.5","99.0","102.35","108.0","119.0"],"influx":["61.10"],"cash":["61.11"],"initial":["61.12"],"addlayer":["62.0","81.0"],"layername":["62.0","81.0"],"layerdata":["62.0","81.0"],"breaking":["62.0"],"things":["62.0","62.1","72.5","80.54","81.2","92.6","96.0","102.36","103.2","113.6","116.0"],"smaller":["62.0","68.0","80.51","87.0","102.33","109.0"],"files":["62.0"],"existing":["62.0","88.0"],"freely":["62.0","72.0","103.0"],"deleted":["62.0","103.0"],"github":["62.1","70.2","89.2","111.2"],"desktop":["62.1","70.2","89.2","111.2"],"main":["62.1","72.1","73.0","75.0","80.26","81.0","84.0","92.1","93.0","96.0","102.8","113.1","114.0","116.0"],"info":["62.1","73.0","80.43","81.2","93.0","102.25","103.2","114.0"],"layer":["62.2","72.3","72.6","80.26","80.35","80.37","80.50","81.0","87.0","92.4","92.7","94.0","102.8","102.17","102.19","102.32","103.3","113.4","113.7","115.0"],"milestones":["62.2","69.0","72.5","92.6","103.3","110.0","113.6"],"bars":["62.3"],"progress":["62.3","81.4","103.4"],"gague":["62.3"],"dealing":["63.0","87.0","109.0"],"implementing":["63.0","87.0","104.0","109.0"],"hasachievement":["63.0","104.0"],"achievement":["63.0","82.0","104.0"],"achievementeffect":["63.0","82.0","104.0"],"current":["63.0","66.0","82.0","104.0","107.0"],"formatted":["63.0","66.0","82.0","85.0","104.0","107.0"],"js":["63.0","66.0","67.0","70.2","71.0","75.0","80.40","81.2","82.0","85.0","86.0","89.2","91.0","96.0","102.22","103.2","104.0","107.0","108.0","111.2","112.0","116.0"],"rows":["63.0","66.0","67.0","77.0","104.0","107.0","108.0"],"cols":["63.0","66.0","67.0","77.0","104.0","107.0","108.0"],"columns":["63.0","66.0","67.0","77.0","104.0","107.0","108.0"],"blah":["63.0","64.0","71.0","77.0","82.0","85.0","104.0","107.0","119.0"],"bigbar":["64.0","83.0","105.0"],"return":["64.0","71.0","72.1","83.0","85.0","86.0","91.0","92.1","95.0","105.0","107.0","112.0","113.1"],"direction":["64.0","83.0","105.0"],"down":["64.0","83.0","105.0"],"left":["64.0","83.0","97.0","97.1","105.0","117.0","117.1"],"right":["64.0","70.0","83.0","89.0","105.0","111.0"],"strings":["64.0","83.0","105.0"],"determines":["64.0","72.4","83.0","92.5","105.0","113.5"],"filled":["64.0","83.0","105.0"],"progresses":["64.0","83.0","105.0"],"means":["64.0","90.0"],"unlocked":["65.0","72.1","84.0","92.1","106.0","113.1"],"false":["65.0"],"variables":["65.0","72.1","84.0","92.1","106.0","113.1"],"points":["65.0","73.0","84.0","85.0","86.0","92.6","93.0","106.0","107.0","114.0"],"new":["65.0","81.0","84.0","85.0","106.0","107.0","108.0","119.0"],"decimal":["65.0","68.0","72.1","84.0","87.0","92.1","106.0","108.0","109.0","113.1","119.0"],"internal":["65.0","84.0","106.0"],"optional":["66.0","69.0","77.0","80.37","82.0","88.0","92.4","95.0","99.0","102.19","110.0","113.4","119.0"],"implement":["66.0","86.0","99.0","108.0"],"makes":["66.0","67.0","86.0","108.0"],"appear":["66.0"],"respectext":["66.0"],"text":["66.0","72.3","73.0","74.0","77.0","80.17","86.0","92.3","93.0","94.0","97.3","99.0","113.3","114.0","115.0","117.3","119.0"],"appears":["66.0"],"showrespecbutton":["66.0"],"determining":["66.0","72.1","92.1","113.1"],"whether":["66.0"],"show":["66.0","97.1","117.1"],"defaults":["66.0"],"true":["66.0","84.0","97.1","97.3","106.0","117.1","117.3"],"stored":["67.0"],"following":["67.0","86.0"],"format":["67.0","75.0","86.0","96.0","97.3","108.0","116.0","117.3"],"ouch":["67.0","86.0","108.0"],"digit":["67.0","77.0","82.0","86.0","99.0","104.0","108.0","119.0"],"column":["67.0","77.0","82.0","86.0","99.0","108.0","119.0"],"individual":["67.0","77.0","82.0","86.0","90.0","99.0","108.0","119.0"],"string":["67.0","68.0","74.0","86.0","87.0","94.0","108.0","109.0","115.0"],"function":["67.0","72.1","74.0","77.0","80.38","85.0","86.0","92.1","94.0","97.3","102.20","102.38","108.0","113.1","115.0","117.3"],"basic":["67.0","74.0","81.2","86.0","88.0","94.0","103.2","108.0","115.0"],"html":["67.0","74.0","86.0","88.0","94.0","99.0","108.0","115.0","119.0"],"challengedescription":["67.0","86.0","108.0"],"description":["67.0","77.0","86.0","108.0","119.0"],"buyable":["68.0"],"store":["68.0","87.0","109.0"],"state":["68.0","87.0","109.0"],"array":["68.0","87.0","92.6","97.2","109.0","117.2"],"extra":["68.0","87.0","109.0"],"default":["68.0","72.1","80.46","87.0","95.0","97.3","102.28","106.0","109.0","117.3"],"player":["69.0","72.2","92.2","97.3","113.2","117.3"],"pointy":["69.0"],"red":["69.0","110.0"],"font":["69.0","77.0","85.0","99.0","110.0","119.0"],"size":["69.0","87.0","109.0","110.0"],"32px":["69.0","110.0"],"family":["69.0","110.0"],"comic":["69.0","110.0"],"sans":["69.0","110.0"],"ms":["69.0","110.0"],"toggle":["69.0","110.0"],"c":["69.0","110.0"],"beep":["69.0","110.0"],"upgrades":["69.0","110.0"],"components":["69.0","80.17","88.0","110.0"],"either":["69.0","88.0","110.0"],"arguments":["69.0","88.0","90.0","110.0"],"item":["69.0","88.0","110.0"],"component":["69.0","80.39","80.51","80.53","88.0","102.21","102.33","102.35","110.0"],"passed":["69.0","88.0","110.0"],"third":["69.0","88.0","110.0"],"applies":["69.0","88.0","110.0"],"css":["69.0","88.0","110.0"],"onto":["70.0","89.0","111.0"],"computer":["70.0","89.0","111.0"],"log":["70.1","89.1","111.1"],"browser":["70.1","89.1","111.1"],"vscode":["70.2","89.2","111.2"],"top":["70.2","71.0","77.0","85.0","89.2","91.0","99.0","103.0","111.2","112.0","119.0"],"part":["70.2","89.2","111.2"],"says":["70.2"],"modinfo":["70.2","89.2","103.0","111.2"],"below":["70.2"],"change":["70.2","80.54","93.0","102.36"],"displayed":["71.0","73.0","77.0","80.17","82.0","85.0","91.0","93.0","99.0","112.0","114.0","119.0"],"very":["71.0","91.0","112.0"],"functions":["72.0","80.54","87.0","90.0","95.0","102.36","109.0"],"absent":["72.1"],"uses":["72.1","72.4"],"startdata":["72.1","92.1","113.1"],"nonstandard":["72.1"],"added":["72.1","80.4","80.17","80.21","80.28","80.30","80.34","80.39","80.40","80.48","80.53","80.56","102.3","102.10","102.12","102.16","102.21","102.22","102.30","102.35"],"converttodecimal":["72.1"],"well":["72.1"],"standard":["72.1","92.1","92.5","97.0","113.1","117.0"],"values":["72.1","80.15","92.1","113.1"],"required":["72.1","92.1","113.1"],"bool":["72.1","92.1","113.1"],"gained":["72.2","113.2"],"upon":["72.2","92.2","113.2"],"reaching":["72.2","92.2","113.2"],"thresholds":["72.2","92.2","113.2"],"resource":["72.2","80.27","80.39","92.2","102.9","102.21","113.2"],"automation":["72.2","92.2","113.2"],"qol":["72.2","92.2","113.2"],"enter":["72.2","92.2","113.2"],"total":["72.3","74.0","92.1","92.3","92.6","94.0","113.1","113.3","115.0"],"base":["72.3","92.3","103.0","113.3"],"x":["72.3","85.0","92.3","107.0","113.3"],"custom":["72.3","92.3","113.3"],"everything":["72.3","92.3","113.3"],"calculations":["72.3","92.3","113.3"],"bottom":["72.3","92.3"],"letter":["72.4"],"capitalized":["72.4","97.3","117.3"],"position":["72.4","92.5","113.5"],"horizontal":["72.4","81.4","92.5","113.5"],"called":["72.5","90.0","95.0","97.3","113.6","117.3"],"side":["72.5","113.6"],"nothing":["72.5","92.6","113.6"],"call":["72.5","72.6","92.6","92.7","113.6","113.7"],"resetlayerdata":["72.5"],"usetype":["72.6","92.7","113.7"],"static":["72.6","92.7","113.3","113.7"],"similar":["72.6","81.4","92.7","103.4","113.7"],"calculate":["72.6","92.7","113.7"],"gain":["72.6","92.4","92.7","113.4","113.7"],"under":["72.6","92.7","113.7"],"provided":["72.6"],"savefile":["73.0","93.0","114.0"],"location":["73.0","93.0","114.0"],"author":["73.0","93.0","114.0"],"tab":["73.0","80.10","80.15","80.25","80.34","80.51","93.0","102.7","102.16","102.33","114.0"],"pointsname":["73.0","93.0","114.0"],"instead":["73.0","93.0","114.0"],"affect":["73.0","93.0","114.0"],"discordname":["73.0","93.0","114.0"],"discordlink":["73.0","93.0","114.0"],"discord":["73.0","93.0","114.0"],"discussion":["73.0","93.0","114.0"],"place":["73.0","93.0","114.0"],"given":["74.0","75.0","94.0","96.0","115.0","116.0"],"milestone":["74.0","94.0","115.0"],"describing":["74.0","94.0","115.0"],"requirement":["74.0","94.0","115.0"],"unlocking":["74.0","80.37","94.0","102.19","115.0"],"suggestion":["74.0","94.0","115.0"],"effectdesc":["74.0"],"same":["75.0","80.9"],"element":["75.0","96.0","116.0"],"tabformat":["75.0","96.0","116.0"],"subtab":["75.0","80.34","80.51","96.0","102.16","102.33","116.0"],"tmt":["76.0","98.0","118.0"],"update":["76.0","98.0","118.0"],"changelog":["76.0","80.25","98.0","102.7","118.0"],"warn":["76.0","98.0","118.0"],"require":["76.0","98.0","118.0"],"decide":["76.0","98.0","118.0"],"title":["77.0","85.0","91.0","99.0","112.0","119.0"],"larger":["77.0","85.0","99.0","119.0"],"fixed":["80.3","80.7","80.17","80.18","80.19","80.22","80.32","102.1","102.4","102.14"],"issue":["80.3"],"makeshinies":["80.4"],"creates":["80.4"],"grid":["80.9","90.0"],"behave":["80.9"],"mode":["80.10"],"directmult":["80.10"],"improved":["80.11"],"performance":["80.11","80.19","102.1"],"high":["80.15"],"thanks":["80.15","80.16"],"ducdat":["80.15"],"window":["80.15"],"wide":["80.15"],"holding":["80.15"],"minor":["80.16"],"fixes":["80.16"],"tooltip":["80.17"],"stay":["80.17"],"hopefully":["80.17"],"finally":["80.17"],"flickering":["80.17","80.24","102.6"],"input":["80.17"],"slider":["80.17"],"formatting":["80.18"],"improvements":["80.19","102.1"],"tooltips":["80.19","80.24","80.50","102.1","102.6","102.32"],"overlapping":["80.19","102.1"],"resettime":["80.20","102.2"],"tracks":["80.20","92.1","102.2","113.1"],"since":["80.20","102.2"],"node":["80.21","80.26","102.3","102.8"],"image":["80.21","102.3"],"attempt":["80.24","102.6"],"fix":["80.24","102.6"],"jacorb":["80.25","102.7"],"contribution":["80.25","80.35","102.7","102.17"],"set":["80.25","93.0","102.7","103.0"],"brings":["80.26","102.8"],"autoupgrade":["80.27","102.9"],"feature":["80.27","80.48","102.9","102.30"],"shows":["80.27","102.9"],"goaldescription":["80.28","102.10"],"overriding":["80.29","102.11"],"softcap":["80.30","102.12"],"softcappower":["80.30","102.12"],"highlighted":["80.31","80.52","102.13","102.34"],"meaningfully":["80.33","102.15"],"prestige":["80.33","80.41","92.1","102.15","102.23","113.1"],"passivegeneration":["80.33","102.15"],"autoprestige":["80.33","102.15"],"microtab":["80.34","102.16"],"hiding":["80.34","102.16"],"reformatting":["80.34","102.16"],"thank":["80.35","102.17"],"type":["80.35","102.17"],"kept":["80.37","102.19"],"buyupgrade":["80.38","102.20"],"buyupg":["80.38","102.20"],"users":["80.40","102.22"],"edit":["80.40","89.2","102.22","111.2"],"documentation":["80.40","102.22"],"parameters":["80.41","102.23"],"supressing":["80.43","102.25"],"external":["80.43","102.25"],"branches":["80.44","102.26"],"global":["80.46","92.5","102.28","113.5"],"achievements":["80.46","102.28","109.0"],"statistics":["80.46","102.28"],"speaking":["80.46","102.28"],"clickables":["80.46","102.28"],"generalized":["80.46","102.28"],"variant":["80.46","102.28"],"buyables":["80.46","80.56","81.3","102.28","102.38"],"almost":["80.46","102.28"],"value":["80.46","95.0","102.28"],"worry":["80.47","102.29"],"midsection":["80.48","102.30"],"nodes":["80.50","102.32"],"let":["80.51","102.33"],"esque":["80.51","102.33"],"areas":["80.51","102.33"],"anywhere":["80.51","102.33"],"formats":["80.54","102.36"],"old":["80.54","102.36"],"properly":["81.0"],"beyond":["81.0","97.0","117.0"],"through":["81.0"],"creating":["81.0"],"calling":["81.0"],"example":["81.0"],"method":["81.0","103.0"],"contents":["81.1","103.1"],"rebuyable":["81.3"],"gauge":["81.4","103.4"],"highly":["81.4","103.4"],"customizable":["81.4"],"vertical":["81.4"],"usually":["82.0","86.0","99.0"],"cost":["85.0","92.3","107.0","113.3","119.0"],"mul":["85.0","107.0"],"canafford":["85.0","107.0"],"gte":["85.0","86.0","107.0"],"sub":["85.0"],"ouchie":["86.0","108.0"],"cancomplete":["86.0"],"elsewhere":["86.0","108.0"],"getclickablestate":["87.0"],"clickable":["87.0"],"keys":["88.0","110.0"],"attributes":["88.0","110.0"],"create":["88.0"],"raw":["88.0"],"project":["89.2","111.2"],"locally":["89.2","111.2"],"fill":["89.2","103.0","111.2"],"tiles":["90.0"],"individually":["90.0"],"properties":["90.0"],"directly":["90.0"],"associated":["90.0"],"appearance":["90.0"],"foo":["91.0","112.0"],"body":["91.0","112.0"],"established":["92.0","113.0"],"save":["92.1","113.1"],"sure":["92.1","93.0","113.1"],"normal":["92.1","113.1"],"tracked":["92.1","113.1"],"shown":["92.1"],"harder":["92.2"],"reach":["92.2"],"dependent":["92.3","113.3"],"permitted":["92.4","113.4"],"onprestige":["92.4","113.4"],"triggers":["92.4","113.4"],"prestiges":["92.4","113.4"],"before":["92.4","113.4"],"goes":["92.5","113.5"],"overrides":["92.5","113.5"],"layerdatareset":["92.6","113.6"],"erase":["93.0"],"png":["95.0"],"spread":["95.0"],"gravity":["95.0"],"speed":["95.0"],"randomize":["95.0"],"bit":["95.0"],"math":["95.0"],"constant":["95.0"],"assigned":["95.0"],"spawned":["95.0"],"distances":["95.0"],"pixels":["95.0"],"angles":["95.0"],"degrees":["95.0"],"showtree":["97.1","117.1"],"arrays":["97.2","117.2"],"symbol":["97.3","117.3"],"canclick":["97.3","117.3"],"click":["97.3","117.3"],"onclick":["97.3","117.3"],"clicked":["97.3","117.3"],"effect":["99.0","119.0"],"reference":["103.0"],"thing":["103.0"],"buyableeffect":["107.0"],"getbuyableamt":["107.0"],"goal":["108.0"],"baseresource":["113.3"],"exponent":["113.3"],"local":["113.5"],"inside":["116.0"]},{"0":["38.1","72.1","95.0"],"1":["80.8"],"2":["76.0","96.0","98.0","118.0"],"3":["61.9","76.0","98.0","118.0"],"4":["61.5","90.0"],"7":["80.12","80.14","80.49","102.31"],"10":["61.6","61.7","61.10","80.36","102.18"],"11":["61.3","66.0","87.0","109.0"],"12":["0.0","80.23","102.5"],"13":["80.23","102.5"],"14":["0.0"],"15":["80.45","102.27"],"16":["80.42","102.24"],"17":["0.0"],"18":["80.2"],"19":["61.10","80.1"],"20":["80.42","80.49","80.55","102.24","102.31"],"21":["61.8","80.14"],"22":["0.0","61.7"],"27":["80.57"],"30":["0.0","61.6","80.55"],"35":["0.0"],"57":["0.0"],"315":["38.1","45.6"],"560":["38.1"],"600":["38.1"],"2020":["61.1","61.3","61.7","61.9","61.11"],"8263":["23.1","55.1"],"chat":["0.0"],"glue":["0.0"],"chronological":["0.0"],"cinny":["0.0"],"commune":["0.0","32.0","50.0"],"davey":["0.0"],"wreden":["0.0"],"decentralized":["0.0","1.0","36.0"],"dice":["0.0","35.0"],"armor":["0.0","35.0"],"tags":["1.0","29.0","36.0"],"games":["2.0","22.0","24.7","25.1","26.2","27.4","35.2","52.2","53.1","54.0","56.4","57.7"],"community":["2.0","13.0","22.0","26.1","52.1","54.0"],"had":["2.0"],"idea":["2.0","24.1","57.1"],"style":["2.0","5.0"],"a":["3.0","6.0","9.0","11.0","16.0","26.3","27.0","30.0","38.2","45.5","52.3","56.0","71.0","72.3","72.4","80.4","80.7","80.19","80.22","80.31","80.37","80.48","80.52","81.2","91.0","92.3","102.1","102.4","102.13","102.19","102.30","102.34","103.2","112.0","113.5"],"for":["3.0","15.2","21.0","22.1","23.0","24.4","26.2","27.3","50.0","52.2","54.1","55.0","56.3","57.4","62.1","66.0","80.3","80.6","80.9","80.13","80.26","80.39","80.43","81.0","102.8","102.21","102.25"],"federated":["3.0","41.0"],"website":["4.0"],"off":["4.0"],"replit":["4.0"],"because":["4.0","73.0","114.0"],"of":["4.0","15.1","15.6","16.0","18.0","22.3","23.4","30.0","38.2","45.5","54.3","55.4","62.0","64.0","65.0","72.5","72.6","80.29","80.32","80.51","80.53","83.0","84.0","102.11","102.14","102.33","102.35","105.0","106.0","113.6"],"their":["4.0","15.3","15.6","22.2","23.2","24.1","54.2","55.2","57.1","80.9","103.0"],"monetization":["4.0"],"strategy":["4.0"],"changing":["4.0","103.0"],"in":["4.0","11.0","22.0","22.2","23.6","24.0","24.1","24.6","24.11","26.1","38.2","52.1","54.0","54.2","55.6","57.0","57.1","57.6","57.11","62.1","66.0","72.3","72.6","80.4","80.22","80.25","80.46","80.53","87.0","92.3","92.7","97.0","97.2","102.4","102.7","102.28","102.35","107.0","113.3","113.7","117.0","117.2"],"meantime":["4.0"],"you":["4.0","15.1","24.10","26.0","26.3","35.1","52.0","52.3","57.10","67.0","77.0","80.31","81.4","102.13","102.37"],"can":["4.0","15.3","23.3","24.6","27.4","35.1","55.3","56.4","57.6","59.0","62.3","70.2","71.0","72.5","78.0","80.31","80.43","80.47","80.52","89.2","91.0","92.0","92.4","97.0","100.0","102.13","102.25","102.29","102.34","102.37","103.4","111.2","112.0","113.0","113.4","113.6","117.0"],"check":["4.0","27.1","45.4","56.1"],"slay":["5.0","23.2","55.2"],"spire":["5.0","23.2","55.2"],"small":["6.0","34.0"],"web":["6.0","45.2"],"theoretical":["6.0"],"or":["7.0","13.0","24.0","26.2","27.4","52.2","56.4","57.0","77.0","80.20","80.56","92.4","99.0","102.2","102.38","113.4","119.0"],"edit":["7.0","12.0","62.0"],"date":["7.0"],"part":["7.0","95.0"],"is":["8.0","15.6","18.0","21.0","23.5","24.0","24.7","24.10","28.0","33.0","41.0","45.1","49.0","55.5","57.0","57.7","57.10","63.0","70.2","80.16","80.35","89.2","102.17","111.2"],"and":["9.0","14.0","21.0","24.6","24.10","41.0","46.0","57.6","57.10","59.0","62.3","68.0","71.0","78.0","80.10","80.11","80.28","80.35","80.40","80.43","80.52","91.0","92.3","92.5","100.0","102.10","102.17","102.22","102.25","102.34","112.0","113.3","113.5"],"communal":["9.0"],"digital":["9.0","21.0"],"gardens":["9.0","21.0"],"created":["9.0"],"erlend":["9.0"],"sogge":["9.0"],"heggen":["9.0"],"ex":["9.0"],"employee":["9.0"],"from":["9.0","24.4","25.0","53.0","57.4","67.0","72.4","77.0","83.0","92.5","99.0","103.0","105.0","119.0"],"discourse":["9.0"],"maintains":["9.0"],"the":["9.0","11.0","14.0","15.3","15.6","22.0","24.8","26.0","34.0","35.0","35.1","38.0","40.0","46.0","49.0","52.0","54.0","57.8","72.6","80.5","80.16","80.17","80.19","80.28","80.33","80.35","80.39","80.54","81.3","92.7","102.1","102.10","102.15","102.17","102.21","102.36","113.7"],"blog":["9.0"],"with":["9.0","15.1","15.6","23.2","24.1","45.2","55.2","57.1","62.2","68.0","72.0","72.1","80.5","80.7","80.19","81.3","92.1","102.1","103.0","103.3","113.1"],"great":["9.0"],"write":["9.0"],"ups":["9.0"],"on":["9.0","15.1","24.6","27.1","38.0","40.0","43.0","45.4","56.1","57.6","92.4","113.4"],"wanderstop":["10.0"],"projects":["10.0","28.0"],"stanley":["10.0"],"examples":["11.0","23.5","24.10","25.0","53.0","55.5","57.10"],"rss":["11.0"],"email":["11.0"],"practice":["11.0"],"pick":["11.0"],"server":["11.0","14.0","15.3","15.5"],"problem":["11.0","24.0","57.0"],"hands":["12.0"],"this":["12.0","22.2","54.2","68.0","87.0","92.3","97.3","103.0","109.0","113.3","117.3"],"what":["12.0","23.3","24.0","55.3","57.0"],"scene":["12.0"],"looks":["12.0"],"cutscene":["12.0"],"happening":["12.0"],"top":["12.0","24.6","57.6","62.0","63.0","66.0","70.1","76.0","80.19","82.0","87.0","89.1","98.0","102.1","104.0","107.0","111.1","118.0"],"guide":["12.0","25.3","53.3"],"player":["12.0","23.6","24.6","24.10","55.6","57.6","57.10","73.0","87.0","92.6","93.0","109.0","114.0"],"through":["12.0","45.3"],"basics":["12.0"],"also":["12.0","24.9","24.10","45.3","57.9","57.10","63.0","66.0","67.0","69.0","80.54","81.0","82.0","97.3","102.36","104.0","107.0","108.0","110.0","117.3"],"constructed":["12.0"],"dynamically":["12.0"],"using":["12.0","45.3","47.0","66.0","73.0","86.0","93.0","108.0","114.0"],"quaternion":["12.0"],"math":["12.0"],"figure":["12.0"],"out":["12.0","27.1","56.1","95.0"],"placement":["12.0"],"component":["12.0","90.0","96.0","116.0"],"relative":["12.0"],"face":["12.0","26.0","52.0"],"going":["12.0","24.0","57.0","95.0"],"die":["12.0"],"middle":["12.0","76.0","98.0","118.0"],"one":["12.0","24.1","26.0","52.0","57.1","66.0","72.1","92.1","113.1"],"opponents":["12.0"],"portraits":["12.0"],"its":["12.0","23.1","24.1","55.1","57.1","97.3","117.3"],"sides":["12.0"],"editors":["12.0"],"many":["12.0","23.5","23.6","24.3","27.1","27.4","55.5","55.6","56.1","56.4","57.3","65.0","72.1","84.0","92.1","92.2","106.0","113.1"],"objects":["12.0","80.53","102.35"],"ve":["12.0","23.1","26.3","27.2","52.3","55.1","56.2"],"made":["12.0","13.0","15.4","23.1","30.0","40.0","55.1","80.28","102.10"],"scriptable":["12.0"],"so":["12.0","24.2","24.7","57.2","57.7"],"add":["12.0","80.48","102.30","107.0"],"modify":["12.0"],"them":["12.0","15.6","23.6","27.2","55.6","56.2","66.0","80.34","81.3","92.6","102.16"],"easily":["12.0","23.5","55.5"],"additionally":["12.0","22.1","24.2","54.1","57.2"],"would":["12.0","23.0","24.3","24.9","27.2","55.0","56.2","57.3","57.9"],"create":["12.0","69.0","81.0","103.0","110.0"],"custom":["12.0","80.17","80.51","102.33","102.38"],"inspectors":["12.0"],"help":["12.0"],"easy":["12.0","60.0"],"understand":["12.0","24.1","57.1"],"possible":["12.0"],"opponent":["12.0"],"artificial":["12.0"],"intelligence":["12.0"],"information":["13.0","18.0","76.0","98.0","103.0","118.0"],"an":["13.0","15.4","23.5","24.5","26.1","33.0","45.5","47.0","52.1","55.5","57.5","66.0","72.4","72.5","73.0","80.52","85.0","93.0","102.34","107.0","113.6","114.0"],"individual":["13.0","63.0","104.0"],"alternatives":["13.0"],"to":["13.0","24.3","24.8","45.5","46.0","47.0","57.3","57.8","67.0","71.0","77.0","80.34","80.38","80.41","80.48","80.54","83.0","85.0","89.1","91.0","97.2","102.16","102.20","102.23","102.30","102.36","105.0","111.1","112.0","117.2","119.0"],"centralized":["14.0"],"implementations":["14.0"],"private":["14.0"],"public":["14.0"],"keypairs":["14.0"],"indieauth":["14.0"],"media":["15.0","45.0","45.3"],"my":["15.0"],"data":["15.1","80.9","80.46","102.28"],"every":["15.1","27.2","56.2","92.6"],"client":["15.1"],"don":["15.1","24.3","57.3","70.0","89.0","89.2","111.0","111.2"],"still":["15.1","80.33","81.0","97.3","102.15","103.0","117.3"],"need":["15.1","15.2","62.0","67.0","72.3","80.46","81.0","90.0","92.3","102.28","113.3"],"associate":["15.1"],"people":["15.1","15.2","70.0","89.0","103.0","111.0"],"only":["15.2","15.6","63.0","82.0","104.0","113.1"],"verify":["15.2"],"are":["15.2","23.1","46.0","55.1","62.3","72.4","73.0","80.44","92.2","92.5","93.0","102.26","113.5","114.0"],"same":["15.2","27.3","56.3"],"person":["15.2"],"interacted":["15.2"],"previously":["15.2"],"send":["15.2","15.3"],"money":["15.2"],"otherwise":["15.2"],"important":["15.2"],"identities":["15.2"],"your":["15.2","23.1","25.0","26.0","26.1","52.0","52.1","53.0","55.1","62.0","62.2","72.0","81.3","81.4","103.3"],"forming":["15.2"],"filters":["15.3"],"etc":["15.3","15.5","26.0","52.0","66.0","72.5","75.0","87.0","92.6","107.0","113.6","116.0"],"users":["15.3"],"content":["15.3","45.0"],"no":["15.3","23.6","55.6","59.0","64.0","78.0","83.0","95.0","100.0","105.0"],"authentication":["15.3"],"account":["15.3"],"required":["15.3","72.6","92.7","113.7"],"identity":["15.3","15.6"],"suffices":["15.3"],"key":["15.4"],"signature":["15.4"],"that":["15.4","15.6","18.0","24.11","26.3","52.3","57.11","63.0","69.0","70.1","72.3","72.5","80.26","81.4","82.0","89.1","89.2","92.2","92.3","92.6","97.0","102.8","103.0","104.0","110.0","111.1","111.2","113.2","113.3","113.6","117.0"],"verifies":["15.4"],"was":["15.4","45.0","80.20","92.1","102.2","113.1"],"by":["15.4","19.0","23.5","55.5","80.25","92.1","102.7","113.1","113.5"],"serves":["15.4"],"as":["15.4","15.5","27.2","56.2","70.2","80.43","81.0","89.2","93.0","102.25","111.2","114.0"],"relay":["15.5"],"owners":["15.5"],"cannot":["15.5"],"fully":["15.5","23.0","27.1","55.0","56.1"],"but":["15.5","46.0","60.0","64.0","75.0","80.5","80.33","81.0","83.0","96.0","102.15","103.0","105.0","116.0"],"choose":["15.5"],"stop":["15.5"],"relaying":["15.5"],"owner":["15.5"],"wishes":["15.5"],"posts":["15.5","45.3"],"be":["15.5","25.0","27.4","53.0","56.4","62.3","70.1","70.2","80.41","80.47","81.0","89.1","89.2","92.2","92.4","97.1","97.3","102.23","102.29","103.4","111.1","111.2","113.2","113.4","117.1","117.3"],"publicly":["15.5"],"probably":["15.6","24.7","57.7","89.2","111.2"],"clients":["15.6"],"sending":["15.6"],"messages":["15.6","80.17"],"ever":["15.6","30.0"],"sends":["15.6"],"specific":["15.6","27.0","56.0","72.5","92.6","113.6"],"collection":["16.0","18.0"],"social":["17.0","42.0","45.0","45.3"],"not":["18.0","24.2","24.3","25.1","26.1","27.2","52.1","53.1","56.2","57.2","57.3","80.25","92.3","102.7","113.3"],"tied":["18.0"],"incremental":["20.0","22.0","23.6","24.0","24.3","25.1","27.1","47.0","53.1","54.0","55.6","56.1","57.0","57.3"],"actual":["20.0","24.2","57.2"],"websites":["21.0","45.1","45.3"],"specifically":["21.0","23.3","55.3","80.40","102.22"],"why":["21.0","27.3","56.3","93.0"],"it":["21.0","23.3","26.2","27.4","40.0","44.0","52.2","55.3","56.4","63.0","67.0","70.1","80.10","80.15","80.51","82.0","87.0","92.5","97.3","102.33","104.0","107.0","113.5","117.3"],"threshold":["22.1","24.2","54.1","57.2"],"makes":["22.1","54.1"],"genre":["22.1","23.0","27.3","54.1","55.0","56.3"],"perfect":["22.1","54.1"],"those":["22.1","24.4","54.1","57.4"],"who":["22.1","27.1","54.1","56.1"],"actively":["22.1","54.1"],"learning":["22.1","26.2","52.2","54.1"],"haven":["22.1","54.1"],"developed":["22.1","54.1"],"any":["22.1","24.9","27.2","54.1","56.2","57.9","70.2","72.3","72.5","73.0","80.46","89.2","92.3","92.6","93.0","102.28","111.2","113.3","113.6","114.0"],"gamedev":["22.1","54.1"],"related":["22.1","54.1","80.46","102.28"],"skills":["22.1","54.1"],"yet":["22.1","54.1"],"unlike":["22.1","24.1","54.1","57.1"],"browser":["22.2","54.2"],"low":["22.2","54.2"],"barrier":["22.2","54.2"],"entry":["22.2","54.2","75.0","96.0","116.0"],"has":["22.2","23.6","24.4","27.3","27.4","45.5","50.0","54.2","55.6","56.3","56.4","57.4","87.0","96.0","109.0"],"shown":["22.2","54.2","97.1","113.1","117.1"],"tremendous":["22.2","54.2"],"success":["22.2","54.2"],"getting":["22.2","54.2"],"completely":["22.2","22.3","54.2","54.3"],"unknown":["22.2","54.2"],"developers":["22.2","26.0","26.2","52.0","52.2","54.2","93.0"],"have":["22.2","24.0","24.2","26.0","27.1","27.3","35.1","50.0","52.0","54.2","56.1","56.3","57.0","57.2","66.0","72.6","74.0","80.9","80.37","85.0","92.4","92.7","94.0","102.19","103.0","107.0","113.4","113.7","115.0"],"been":["22.3","54.3"],"criticized":["22.3","54.3"],"being":["22.3","54.3"],"anti":["22.3","54.3"],"ads":["22.3","41.0","54.3"],"iaps":["22.3","54.3"],"similar":["22.3","54.3","62.3"],"forms":["22.3","54.3"],"often":["22.3","54.3"],"due":["22.3","54.3"],"abundance":["22.3","54.3"],"non":["22.3","24.2","54.3","57.2","80.6"],"monetized":["22.3","54.3"],"d":["23.0","23.2","55.0","55.2"],"argue":["23.0","23.2","24.10","55.0","55.2","57.10"],"necessary":["23.0","55.0"],"contextualized":["23.0","55.0"],"answer":["23.0","55.0"],"recently":["23.0","55.0","80.15"],"watched":["23.0","55.0"],"video":["23.0","55.0"],"about":["23.0","24.0","55.0","57.0","76.0","98.0","118.0"],"vampire":["23.0","23.1","23.3","55.0","55.1","55.3"],"survivors":["23.0","23.1","23.3","55.0","55.1","55.3"],"which":["23.0","27.4","45.0","55.0","56.4","65.0","84.0","96.0","97.3","106.0","116.0","117.3"],"since":["23.0","55.0","92.1","113.1"],"taken":["23.0","24.10","55.0","57.10"],"adds":["23.1","55.1","69.0","88.0","110.0"],"zero":["23.1","55.1"],"number":["23.1","55.1","73.0","80.51","86.0","92.1","93.0","102.33","108.0","113.1","114.0"],"will":["23.1","24.2","55.1","57.2","67.0","72.4","74.0","77.0","80.18","80.25","92.5","94.0","96.0","97.1","97.3","102.7","103.0","115.0","116.0","117.1","117.3"],"quite":["23.1","55.1"],"believe":["23.1","27.2","55.1","56.2"],"sense":["23.1","24.6","55.1","57.6"],"having":["23.1","24.7","55.1","57.7","74.0","85.0","94.0","115.0"],"progress":["23.1","24.10","55.1","57.10"],"comparing":["23.1","55.1"],"where":["23.1","23.3","55.1","55.3","63.0","69.0","76.0","98.0","118.0"],"started":["23.1","55.1","103.0"],"feeling":["23.1","55.1"],"earned":["23.1","55.1"],"way":["23.1","23.4","24.0","25.0","53.0","55.1","55.4","57.0"],"here":["23.1","24.3","55.1","57.3","92.1","113.1"],"enjoyable":["23.1","55.1"],"span":["23.1","27.3","46.0","55.1","56.3"],"id":["23.1","24.1","27.3","55.1","56.3","57.1","68.0","70.2","89.2","109.0","111.2"],"665ceed1":["23.1","55.1"],"704e":["23.1","55.1"],"4cd0":["23.1","55.1"],"9a1756b09f4a":["23.1","55.1"],"h2":["23.1","24.1","27.3","55.1","56.3","57.1"],"bit":["23.2","23.6","27.0","55.2","55.6","56.0"],"repeat":["23.2","55.2"],"cycle":["23.2","55.2"],"if":["23.2","26.1","52.1","55.2","68.0","72.2","80.27","87.0","92.0","102.9","109.0","113.0","113.2"],"look":["23.2","55.2","80.35","102.17"],"higher":["23.2","55.2"],"level":["23.2","27.3","55.2","56.3"],"most":["23.2","24.0","24.1","24.2","25.1","53.1","55.2","57.0","57.1","57.2","70.0","80.15","81.0","89.0","103.0","111.0"],"ll":["23.2","55.2","90.0"],"perform":["23.2","55.2"],"difficult":["23.2","55.2"],"feats":["23.2","55.2"],"ease":["23.2","55.2"],"speed":["23.2","55.2"],"achieve":["23.2","55.2"],"flow":["23.2","55.2"],"state":["23.2","55.2","90.0"],"takes":["23.2","55.2","59.0","78.0","100.0"],"knowledge":["23.2","31.0","48.0","55.2","60.0"],"experience":["23.2","55.2"],"uses":["23.2","24.1","55.2","57.1","92.2","92.5","113.5"],"instinctively":["23.2","55.2"],"incredible":["23.2","55.2"],"watch":["23.2","55.2"],"things":["23.2","23.6","55.2","55.6","60.0","80.43","80.48","81.0","92.4","102.25","102.30","103.0","113.4"],"runs":["23.2","55.2"],"competitive":["23.2","55.2"],"ddr":["23.2","55.2"],"likes":["23.2","55.2"],"i":["23.2","35.1","40.0","55.2","93.0"],"goal":["23.2","24.1","55.2","57.1","72.2","86.0","92.2","113.2"],"making":["23.3","27.2","55.3","56.2","80.54","102.36"],"decisions":["23.3","55.3"],"within":["23.3","23.6","26.1","52.1","55.3","55.6","88.0"],"applies":["23.3","55.3"],"evolutions":["23.3","55.3"],"synergies":["23.3","55.3"],"kinds":["23.3","55.3"],"enemies":["23.3","55.3"],"at":["23.4","24.1","24.2","27.3","55.4","56.3","57.1","57.2","62.0","63.0","64.0","66.0","70.1","72.1","83.0","87.0","89.1","104.0","105.0","107.0","111.1","113.3"],"various":["23.4","55.4"],"times":["23.4","55.4","92.2","113.2"],"throughout":["23.4","55.4"],"progression":["23.4","55.4"],"some":["23.5","23.6","24.0","24.2","27.1","47.0","55.5","55.6","56.1","57.0","57.2","69.0","110.0"],"extremely":["23.5","55.5"],"cut":["23.5","55.5"],"philosophies":["23.5","55.5"],"let":["23.5","23.6","24.1","55.5","55.6","57.1","70.0","89.0","111.0"],"start":["23.5","55.5","80.37","102.19"],"giving":["23.5","55.5"],"example":["23.5","27.2","55.5","56.2"],"mechanic":["23.5","27.3","55.5","56.3"],"think":["23.5","24.1","24.3","26.0","52.0","55.5","57.1","57.3"],"strongly":["23.5","55.5"],"argued":["23.5","55.5"],"course":["23.5","55.5"],"personal":["23.5","45.3","55.5"],"favorite":["23.5","55.5"],"mine":["23.5","55.5"],"how":["23.5","24.2","26.3","45.0","52.3","55.5","57.2","72.3","92.3"],"doom":["23.5","55.5"],"encourages":["23.5","55.5"],"aggressive":["23.5","55.5"],"gameplay":["23.5","24.2","55.5","57.2"],"linking":["23.5","55.5"],"health":["23.5","38.1","55.5"],"drops":["23.5","55.5"],"melee":["23.5","55.5"],"attacks":["23.5","55.5"],"genres":["23.6","24.1","24.8","55.6","57.1","57.8"],"like":["23.6","55.6","68.0","72.5","80.56","87.0","109.0","113.6"],"might":["23.6","55.6"],"grey":["23.6","55.6"],"area":["23.6","55.6"],"talk":["23.6","55.6"],"first":["23.6","49.0","55.6","62.0","63.0","96.0"],"though":["23.6","27.3","55.6","56.3","72.0"],"story":["23.6","55.6"],"tell":["23.6","55.6"],"lore":["23.6","55.6"],"characters":["23.6","55.6"],"drive":["23.6","55.6"],"encourage":["23.6","55.6"],"continue":["23.6","55.6"],"exploring":["23.6","55.6"],"game":["23.6","24.4","24.5","24.6","24.9","25.0","39.0","47.0","53.0","55.6","57.4","57.5","57.6","57.9","62.0","72.2","73.0","80.37","92.6","97.1","102.19","113.2","117.1"],"discovering":["23.6","55.6"],"walking":["23.6","55.6"],"simulator":["23.6","55.6"],"clear":["24.0","57.0"],"even":["24.0","57.0"],"talking":["24.0","57.0"],"poses":["24.0","57.0"],"horribly":["24.0","57.0"],"vague":["24.0","57.0"],"numbers":["24.0","27.2","56.2","57.0","64.0","80.3","80.18","83.0","105.0"],"form":["24.0","57.0"],"another":["24.0","57.0","92.1","113.1"],"we":["24.0","57.0"],"all":["24.1","26.3","47.0","52.3","57.1","66.0","72.6"],"modern":["24.1","27.1","38.2","50.0","56.1","57.1"],"665cea25":["24.1","57.1"],"b1e5":["24.1","57.1"],"40bc":["24.1","57.1"],"8c82":["24.1","57.1"],"2296982ce1d1":["24.1","57.1"],"parodies":["24.1","57.1"],"interesting":["24.1","57.1"],"definitions":["24.1","57.1"],"appear":["24.1","57.1","72.4","92.5","96.0","116.0"],"distilled":["24.1","57.1"],"versions":["24.1","57.1"],"revealing":["24.1","57.1"],"naked":["24.1","57.1"],"design":["24.1","27.3","56.3","57.1"],"core":["24.1","57.1"],"comment":["24.1","26.1","52.1","57.1"],"upon":["24.1","26.1","52.1","57.1"],"source":["24.1","39.0","51.0","57.1"],"material":["24.1","57.1"],"means":["24.1","24.7","57.1","57.7","83.0","105.0"],"casino":["24.1","57.1"],"skinner":["24.1","57.1"],"boxes":["24.1","57.1"],"emotionally":["24.1","57.1"],"manipulate":["24.1","57.1"],"customers":["24.1","57.1"],"keep":["24.1","57.1","72.1","92.1","113.1"],"playing":["24.1","57.1","103.0"],"dressing":["24.1","57.1"],"up":["24.1","27.1","45.4","50.0","56.1","57.1","80.37","95.0","97.3","102.19","117.3"],"box":["24.1","57.1","71.0","91.0","112.0"],"tons":["24.1","57.1"],"stimuli":["24.1","57.1"],"hide":["24.1","57.1","97.3","117.3"],"ultimately":["24.1","57.1"],"condition":["24.1","57.1","86.0","108.0"],"into":["24.1","57.1","81.0","103.0"],"coming":["24.1","57.1"],"back":["24.1","57.1","89.1","111.1"],"compulsively":["24.1","57.1"],"taking":["24.1","57.1"],"demonstrate":["24.2","57.2"],"between":["24.2","27.1","43.0","56.1","57.2","93.0"],"when":["24.2","26.0","27.3","52.0","56.3","57.2","80.54","102.36"],"notably":["24.2","57.2"],"rpgs":["24.2","57.2"],"typically":["24.2","57.2"],"considered":["24.2","57.2"],"pass":["24.2","24.9","57.2","57.9"],"lot":["24.2","45.5","57.2"],"tend":["24.2","24.8","57.2","57.8"],"theme":["24.2","57.2"],"guiding":["24.2","57.2"],"least":["24.2","57.2"],"names":["24.2","57.2","72.5","113.6"],"mechanics":["24.2","24.6","26.2","52.2","57.2","57.6"],"honestly":["24.3","27.3","56.3","57.3"],"there":["24.3","24.8","26.3","27.0","52.3","56.0","57.3","57.8","70.1","85.0","89.1","111.1"],"s":["24.3","24.4","26.2","27.0","27.2","52.2","56.0","56.2","57.3","57.4","60.0","65.0","67.0","70.0","70.2","72.5","84.0","86.0","89.0","92.6","106.0","108.0","111.0","113.6"],"good":["24.3","57.3","80.9"],"explanation":["24.3","57.3"],"fans":["24.3","57.3"],"define":["24.4","57.4"],"list":["24.4","57.4","80.53","102.35"],"factors":["24.4","57.4"],"derived":["24.4","57.4"],"determine":["24.4","57.4","70.2","89.2","111.2"],"roguelikeness":["24.4","57.4"],"more":["24.4","24.8","27.2","35.1","38.2","56.2","57.4","57.8","80.43","102.25","113.3"],"could":["24.5","57.5"],"justifiably":["24.5","57.5"],"make":["24.5","57.5","70.2","72.0","72.2","73.0","76.0","80.34","80.54","81.3","89.2","93.0","98.0","102.16","102.36","111.2","114.0","118.0"],"dark":["24.5","24.6","44.0","57.5","57.6"],"room":["24.5","24.6","57.5","57.6"],"clicker":["24.5","57.5"],"heroes":["24.5","57.5"],"crank":["24.5","57.5"],"increlution":["24.5","24.10","57.5","57.10"],"kitten":["24.5","57.5"],"ngu":["24.5","57.5"],"idle":["24.5","24.10","57.5","57.10"],"include":["24.6","24.10","47.0","57.6","57.10","72.5","113.6"],"universal":["24.6","57.6"],"paperclips":["24.6","57.6"],"reasons":["24.6","57.6"],"appeal":["24.6","27.3","56.3","57.6"],"oftentimes":["24.6","57.6"],"each":["24.6","45.2","57.6"],"builds":["24.6","57.6"],"existing":["24.6","57.6","69.0","110.0"],"increasing":["24.6","57.6"],"complexity":["24.6","57.6"],"steps":["24.6","57.6"],"follow":["24.6","57.6"],"along":["24.6","25.0","53.0","57.6"],"they":["24.6","24.7","27.1","45.2","56.1","57.6","57.7","62.3","72.2","80.44","97.2","102.26","113.2","117.2"],"provide":["24.6","27.2","56.2","57.6"],"several":["24.7","47.0","57.7"],"apply":["24.7","27.3","56.3","57.7"],"canon":["24.7","57.7"],"pure":["24.7","57.7"],"ui":["24.7","57.7"],"display":["24.7","57.7","66.0","80.19","80.21","87.0","95.0","99.0","102.1","102.3","119.0"],"incrementals":["24.7","57.7"],"grow":["24.8","57.8"],"faster":["24.8","57.8","80.37","102.19"],"than":["24.8","26.0","45.4","50.0","52.0","57.8","70.0","89.0","111.0"],"other":["24.8","27.1","45.2","56.1","57.8","72.3","75.0","80.46","92.3","97.1","102.28","103.0","113.3","117.1"],"instances":["24.8","57.8"],"superlinear":["24.8","57.8"],"larger":["24.8","57.8","66.0","80.18","87.0","107.0"],"get":["24.8","57.8","68.0","76.0","90.0","98.0","109.0","118.0"],"stronger":["24.8","57.8"],"signal":["24.8","57.8"],"passes":["24.9","57.9"],"variant":["24.9","57.9"],"deciding":["24.10","57.10"],"actions":["24.10","57.10"],"per":["24.10","57.10","80.27","102.9"],"notable":["24.10","57.10"],"stuck":["24.10","57.10"],"time":["24.10","57.10","73.0","80.30","81.0","92.1","93.0","102.12","103.0","113.1","114.0"],"cavernous":["24.10","57.10"],"ii":["24.10","57.10"],"may":["24.10","26.2","52.2","57.10"],"groundhog":["24.10","57.10"],"life":["24.10","57.10"],"knight":["24.10","57.10"],"popular":["24.11","25.1","53.1","57.11"],"china":["24.11","57.11"],"center":["24.11","57.11"],"around":["24.11","57.11"],"build":["25.0","53.0"],"own":["25.0","53.0","62.0","80.9","81.0"],"interactive":["25.0","53.0"],"snippets":["25.0","53.0"],"nor":["25.1","53.1"],"certainly":["25.1","53.1"],"ones":["25.1","53.1"],"inexperienced":["26.0","52.0"],"hardest":["26.0","52.0"],"harder":["26.0","52.0","72.2","113.2"],"coding":["26.0","52.0"],"debugging":["26.0","52.0"],"balancing":["26.0","52.0"],"handling":["26.0","52.0"],"put":["26.0","52.0"],"heart":["26.0","52.0"],"allowed":["26.1","52.1"],"whatever":["26.1","52.1","70.2","89.2","111.2"],"re":["26.1","52.1","61.6"],"sharing":["26.1","52.1"],"works":["26.1","45.3","52.1"],"do":["26.1","52.1","97.0","117.0"],"come":["26.1","52.1"],"across":["26.1","52.1"],"interpret":["26.1","52.1"],"attack":["26.1","52.1"],"report":["26.1","52.1"],"negative":["26.1","52.1"],"comments":["26.1","26.3","43.0","52.1","52.3"],"support":["26.2","52.2","80.46","80.51","102.28","102.33"],"certain":["26.2","27.3","52.2","56.3"],"prefer":["26.2","52.2"],"types":["26.2","52.2"],"positive":["26.3","52.3"],"received":["26.3","52.3"],"concept":["26.3","52.3"],"psychology":["26.3","52.3"],"called":["26.3","52.3"],"bias":["26.3","52.3"],"explains":["26.3","52.3"],"love":["27.0","56.0"],"fact":["27.0","46.0","56.0"],"seem":["27.0","27.1","56.0","56.1"],"value":["27.0","56.0","70.2","72.3","77.0","85.0","88.0","89.2","99.0","110.0","111.2","119.0"],"over":["27.0","56.0","82.0","104.0"],"quality":["27.0","56.0"],"however":["27.0","56.0"],"lack":["27.0","56.0"],"understanding":["27.0","56.0"],"concerning":["27.0","56.0"],"gamers":["27.1","56.1"],"want":["27.1","56.1","70.2","81.0","89.2","92.0","111.2","113.0"],"something":["27.1","56.1","70.2","72.5","89.2","92.6","111.2","113.6"],"bursts":["27.1","56.1"],"working":["27.1","56.1"],"activity":["27.1","56.1"],"fallen":["27.1","56.1"],"slightly":["27.1","56.1"],"fashion":["27.1","56.1"],"amongst":["27.1","56.1"],"valid":["27.1","56.1"],"point":["27.1","56.1"],"happens":["27.2","27.3","56.2","56.3"],"exponentially":["27.2","56.2"],"quickly":["27.2","56.2"],"frequently":["27.2","56.2"],"purchased":["27.2","56.2"],"classic":["27.2","56.2"],"goes":["27.2","56.2"],"far":["27.2","56.2"],"go":["27.2","56.2","89.1","111.1"],"say":["27.2","56.2"],"chore":["27.2","27.3","56.2","56.3"],"after":["27.2","56.2","80.10","103.0"],"bought":["27.2","56.2","92.2","113.2"],"couple":["27.2","56.2"],"method":["27.2","56.2"],"inflating":["27.2","56.2"],"effectively":["27.2","56.2","72.2","92.2","113.2"],"oom":["27.2","56.2"],"above":["27.3","56.3","71.0","91.0","112.0"],"criticisms":["27.3","56.3"],"similarly":["27.3","56.3","75.0","96.0","116.0"],"before":["27.3","27.4","45.0","56.3","56.4","72.1","92.1","113.1"],"everyone":["27.3","56.3"],"665cf570":["27.3","56.3"],"e3d3":["27.3","56.3"],"48f6":["27.3","56.3"],"9fde":["27.3","56.3"],"aa94e68a8682":["27.3","56.3"],"automation":["27.3","56.3","80.33","102.15"],"staple":["27.3","56.3"],"implications":["27.3","56.3"],"new":["27.3","45.3","56.3","80.15","80.28","80.54","102.10","102.36"],"introduced":["27.3","56.3"],"must":["27.3","56.3"],"older":["27.3","56.3"],"automated":["27.3","56.3"],"away":["27.3","56.3","70.0","89.0","111.0"],"feels":["27.3","56.3"],"rewarding":["27.3","56.3"],"again":["27.3","56.3","80.47","89.2","102.29","111.2"],"does":["27.3","56.3","59.0","78.0","92.3","100.0","113.3"],"such":["27.3","56.3","93.0","114.0"],"know":["27.3","56.3"],"just":["27.3","27.4","56.3","56.4"],"later":["27.3","56.3","89.2","111.2"],"happy":["27.3","56.3"],"begs":["27.3","56.3"],"question":["27.3","56.3"],"feature":["27.4","56.4","75.0","80.21","96.0","102.3","116.0"],"then":["27.4","56.4"],"wait":["27.4","56.4"],"requirements":["27.4","56.4"],"used":["27.4","56.4","70.2","89.2","111.2"],"magnum":["30.0"],"opus":["30.0"],"sorts":["30.0"],"p":["30.0"],"open":["33.0","39.0","76.0","98.0","118.0"],"citadel":["35.0","35.1"],"profectus":["35.2"],"dev":["37.0"],"tree":["37.0","40.0","61.0"],"logseq":["37.0"],"mbin":["37.0"],"planar":["37.0"],"pioneers":["37.0"],"development":["38.0"],"national":["38.1"],"institutes":["38.1"],"nih":["38.1"],"system":["38.1","86.0","108.0"],"architecture":["38.1"],"jpg":["38.1"],"iframe":["38.1"],"width":["38.1","64.0","88.0"],"height":["38.1","64.0","88.0","110.0"],"src":["38.1","45.6"],"https":["38.1","45.6"],"www":["38.1","45.6"],"youtube":["38.1","45.6"],"com":["38.1"],"embed":["38.1"],"9uhqirs7zjm":["38.1"],"frameborder":["38.1"],"allow":["38.1","86.0","108.0"],"accelerometer":["38.1"],"version":["38.2","80.40","102.22"],"unity":["38.2"],"improving":["38.2"],"interface":["38.2"],"designed":["39.0"],"loosely":["40.0"],"based":["40.0","46.0"],"modding":["40.0"],"acamaeda":["40.0"],"technically":["40.0"],"influencers":["41.0"],"partially":["41.0"],"self":["41.0"],"hosting":["41.0"],"too":["41.0","93.0","114.0"],"broadly":["43.0"],"relationship":["43.0"],"forest":["44.0"],"theory":["44.0"],"internet":["44.0"],"refers":["44.0"],"homogenized":["45.0"],"known":["45.1"],"marginalia":["45.1"],"connect":["45.2"],"consistently":["45.2"],"discourage":["45.2"],"announce":["45.3"],"websub":["45.3"],"allows":["45.3"],"rather":["45.4","50.0"],"managed":["45.5"],"pages":["45.5"],"neocities":["45.5"],"biased":["46.0"],"argumentative":["46.0"],"best":["46.0","72.1","72.5","92.1","113.1","113.6"],"ability":["46.0","80.17","80.40","102.22"],"expertise":["46.0"],"including":["47.0"],"voxel":["47.0"],"world":["47.0"],"test":["47.0"],"scenes":["47.0"],"these":["47.0","63.0","69.0","72.0","73.0","93.0","104.0","114.0"],"render":["47.0"],"hub":["48.0"],"human":["50.0"],"trust":["50.0"],"algorithms":["50.0"],"vision":["50.0"],"communities":["50.0"],"set":["50.0","62.0","68.0","73.0","87.0","90.0","92.6","96.0","109.0","114.0"],"matrix":["50.0"],"spaces":["50.0"],"project":["51.0"],"team":["51.0"],"currently":["51.0"],"upgrades":["59.0","72.5","78.0","80.18","80.29","80.50","92.6","100.0","102.11","102.32","113.6"],"longer":["59.0","78.0","100.0"],"argument":["59.0","66.0","69.0","78.0","85.0","100.0","107.0","110.0"],"neither":["59.0","78.0","100.0"],"effect":["59.0","67.0","77.0","78.0","85.0","86.0","90.0","100.0","108.0"],"buyables":["59.0","62.2","72.2","78.0","80.50","92.2","100.0","102.32","103.3","113.2"],"buyable":["59.0","78.0","80.15","100.0"],"cost":["59.0","66.0","78.0","100.0"],"take":["59.0","78.0","95.0","97.3","100.0","117.3"],"programming":["60.0"],"mostly":["60.0"],"pretty":["60.0"],"debuggedx3":["61.1"],"rebalanced":["61.2"],"debuggedx2":["61.2"],"debugged":["61.3"],"bump":["61.4"],"row":["61.5","72.1","80.22","84.0","88.0","92.1","102.4","113.5"],"added":["61.5","80.3","80.13"],"colored":["61.5"],"fixed":["61.8","61.10"],"layers":["61.8","72.4","80.30","80.54","92.5","102.12","102.36","113.5"],"hiding":["61.8"],"notification":["61.10"],"influx":["61.11"],"commit":["61.12"],"references":["62.0"],"base":["62.0","80.39","81.0","92.7","102.21","113.7"],"thing":["62.0"],"modinfo":["62.0","80.38","80.40","102.20","102.22"],"js":["62.0","62.1","68.0","80.25","87.0","90.0","97.0","102.7","109.0","117.0"],"modid":["62.0","103.0"],"string":["62.0","70.2","72.1","89.2","92.1","103.0","111.2","113.1"],"basic":["62.1","69.0","71.0","82.0","91.0","110.0","112.0"],"layer":["62.1","68.0","80.17","80.20","80.25","80.41","80.46","81.2","90.0","92.3","102.2","102.7","102.23","102.28","103.2","109.0","113.3"],"breakdown":["62.1","81.2","103.2"],"breaking":["62.1","81.2","103.2"],"down":["62.1","80.15","81.2","103.2"],"rebuyable":["62.2","103.3"],"highly":["62.3"],"customizable":["62.3","103.4"],"horizontal":["62.3","103.4"],"digit":["63.0"],"second":["63.0","80.27","96.0","102.9"],"column":["63.0","88.0","104.0"],"optional":["63.0","67.0","68.0","80.35","86.0","87.0","102.17","104.0","107.0","108.0"],"displayed":["63.0","66.0","87.0","104.0","107.0"],"visible":["63.0","82.0","97.3","104.0","117.3"],"text":["63.0","67.0","71.0","80.3","82.0","85.0","91.0","104.0","107.0","108.0","112.0"],"function":["63.0","64.0","71.0","72.3","80.46","80.56","82.0","83.0","87.0","91.0","92.3","92.6","102.28","104.0","105.0","112.0"],"updating":["63.0","66.0","67.0","69.0","82.0","85.0","104.0","107.0","108.0","110.0"],"use":["63.0","70.0","71.0","73.0","75.0","80.6","80.43","80.54","81.0","82.0","89.0","91.0","92.4","96.0","102.25","102.36","104.0","111.0","112.0","113.4","116.0"],"html":["63.0","69.0","71.0","77.0","82.0","91.0","104.0","110.0","112.0"],"done":["63.0","74.0","82.0","104.0"],"returning":["63.0","74.0","82.0","86.0","94.0","97.3","104.0","108.0","115.0","117.3"],"size":["64.0","68.0","83.0","105.0"],"pixels":["64.0","83.0","105.0"],"px":["64.0","83.0","105.0"],"end":["64.0","83.0","105.0"],"returns":["64.0","66.0","69.0","83.0","87.0","105.0","109.0","110.0"],"portion":["64.0","83.0","105.0"],"main":["65.0","71.0","72.3","91.0","92.3","106.0","112.0"],"resource":["65.0","72.3","80.21","84.0","92.3","92.4","102.3","106.0","113.3","113.4"],"color":["65.0","72.1","84.0","92.1","106.0","113.1"],"fe0102":["65.0"],"affects":["65.0","84.0","106.0"],"elements":["65.0","84.0","106.0"],"prestige":["65.0","72.1","72.5","80.10","80.39","80.46","80.51","84.0","92.6","102.21","102.28","102.33","106.0","113.6"],"absent":["66.0"],"sellonetext":["66.0"],"sellalltext":["66.0"],"sell":["66.0"],"buttons":["66.0","80.25","80.34","102.7","102.16"],"respectively":["66.0"],"return":["66.0","77.0","87.0","97.3","99.0","117.3","119.0"],"blah":["66.0","87.0"],"features":["66.0","72.6","75.0","80.51","81.2","92.7","102.33","103.2","107.0","113.7"],"title":["66.0","71.0","87.0","107.0"],"font":["66.0","87.0","107.0"],"buying":["66.0","85.0","107.0"],"next":["66.0","85.0","107.0"],"x":["66.0","69.0","88.0","110.0"],"calculate":["66.0","85.0","107.0"],"implement":["67.0","74.0","77.0","94.0","115.0","119.0"],"elsewhere":["67.0","74.0","94.0","115.0"],"rewarddescription":["67.0","86.0","108.0"],"reward":["67.0","74.0","82.0","86.0","94.0","108.0","115.0"],"applied":["67.0","77.0","86.0","99.0","119.0"],"rewardeffect":["67.0"],"calculates":["67.0","77.0","85.0","99.0","119.0"],"values":["67.0","72.0","77.0","85.0","99.0","119.0"],"bonuses":["67.0","77.0","85.0","99.0","119.0"],"clickable":["68.0","109.0"],"getclickablestate":["68.0","109.0"],"setclickablestate":["68.0","87.0","109.0"],"clickableeffect":["68.0","87.0","109.0"],"current":["68.0","76.0","87.0","98.0","109.0","118.0"],"effects":["68.0","80.5","109.0"],"should":["68.0","70.1","80.24","80.37","87.0","89.1","90.0","95.0","97.3","102.6","102.19","109.0","111.1","117.3"],"formatted":["68.0","87.0","90.0","109.0"],"rows":["68.0","90.0","109.0"],"cols":["68.0","109.0"],"columns":["68.0","88.0","109.0"],"masterbuttonpress":["68.0"],"object":["69.0","77.0","85.0","99.0","119.0"],"keys":["69.0"],"attributes":["69.0"],"v":["69.0"],"displays":["69.0","99.0","110.0","119.0"],"raw":["69.0","110.0"],"empty":["69.0","88.0","110.0"],"space":["69.0","80.56","88.0","97.3","102.38","110.0","117.3"],"default":["69.0","82.0","88.0","99.0","104.0","110.0","119.0"],"dimensions":["69.0","88.0","110.0"],"8px":["69.0","88.0","110.0"],"17px":["69.0","88.0","110.0"],"t":["70.0","89.0","89.2","103.0","111.0","111.2"],"word":["70.0","89.0","111.0"],"github":["70.0","89.0","111.0"],"scare":["70.0","89.0","111.0"],"actually":["70.0","80.10","89.0","111.0"],"much":["70.0","72.3","89.0","92.3","93.0","111.0","114.0"],"easier":["70.0","80.54","89.0","102.36","111.0"],"page":["70.1","73.0","89.1","111.1"],"right":["70.1","80.32","89.1","102.14","111.1"],"button":["70.1","80.15","80.34","89.1","102.16","111.1","113.3"],"says":["70.1","76.0","89.1","98.0","111.1","118.0"],"fork":["70.1","89.1","111.1"],"click":["70.1","76.0","89.1","98.0","111.1","118.0"],"name":["70.2","72.3","80.38","92.3","102.20","113.3"],"well":["70.2","81.4","89.2","103.4","111.2"],"savefile":["70.2","89.2","111.2"],"dynamic":["71.0","80.41","80.44","91.0","102.23","102.26","112.0"],"body":["71.0"],"inside":["71.0"],"associated":["72.0","72.1","92.1","113.1"],"special":["72.0"],"functionality":["72.0"],"total":["72.1","72.5","95.0","113.6"],"tracks":["72.1"],"amount":["72.1","73.0","93.0","114.0"],"highest":["72.1","92.1","113.1"],"unlockorder":["72.1","92.1","113.1"],"track":["72.1","92.1","113.1"],"relevant":["72.1","92.1","113.1"],"hex":["72.1","92.1"],"format":["72.1","92.1"],"starting":["72.1"],"reach":["72.2","113.2"],"beat":["72.2","92.2","113.2"],"challenge":["72.2","80.31","92.2","102.13","113.2"],"recieve":["72.2","92.2","113.2"],"bonus":["72.2","92.2","113.2"],"section":["72.3","92.3","113.3"],"baseamount":["72.3","92.3"],"gets":["72.3"],"requires":["72.3"],"sorted":["72.4","92.5","113.5"],"alphabetical":["72.4","92.5","113.5"],"order":["72.4","92.5","113.5"],"branches":["72.4","80.47","92.5","102.29","113.5"],"array":["72.4","72.5","92.5","113.5","113.6"],"ids":["72.4","80.6","92.5"],"line":["72.4","92.5"],"points":["72.5","113.6"],"currency":["72.5","80.39","88.0","92.6","102.21","113.6"],"unique":["72.5","89.2","92.6","103.0","111.2","113.6"],"variables":["72.5","92.6","113.6"],"generatorpower":["72.5","92.6","113.6"],"getnextat":["72.6","92.7","113.7"],"canmax":["72.6","92.7","113.7"],"false":["72.6","92.7","113.7"],"url":["73.0","93.0","114.0"],"invite":["73.0","93.0","114.0"],"please":["73.0","93.0","114.0"],"sure":["73.0","114.0"],"never":["73.0","93.0","114.0"],"expire":["73.0","93.0","114.0"],"changeloglink":["73.0"],"changelog":["73.0","80.0","102.0"],"offlinelimit":["73.0","93.0","114.0"],"maximum":["73.0","93.0","114.0"],"offline":["73.0","80.30","93.0","102.12","114.0"],"accumulate":["73.0","93.0","114.0"],"hours":["73.0","93.0","114.0"],"extra":["73.0","93.0","114.0"],"lost":["73.0","93.0","114.0"],"useful":["73.0","88.0","90.0","93.0","114.0"],"mods":["73.0","93.0","103.0","114.0"],"fast":["73.0","93.0","114.0"],"boolean":["74.0","82.0","94.0","104.0","115.0"],"group":["75.0","96.0","116.0"],"try":["76.0","98.0","118.0"],"fetch":["76.0","98.0","118.0"],"origin":["76.0","98.0","118.0"],"containing":["77.0","85.0","99.0","119.0"],"git":["79.0","101.0"],"submodule":["79.0","101.0"],"inputs":["80.3"],"stationary":["80.4"],"particle":["80.4"],"visual":["80.5"],"particles":["80.5"],"interact":["80.5"],"mouse":["80.5"],"numeric":["80.6"],"major":["80.7"],"issue":["80.7"],"inventory":["80.9"],"map":["80.9"],"tiles":["80.9"],"multiplies":["80.10"],"gain":["80.10","80.27","102.9"],"exponents":["80.10"],"softcaps":["80.10"],"tab":["80.11","97.0","117.0"],"formats":["80.11"],"bars":["80.11"],"glowcolor":["80.13"],"now":["80.15","80.16","80.21","80.35","80.44","102.3","102.17","102.26"],"buys":["80.15"],"continuously":["80.15"],"milestone":["80.15"],"setting":["80.15"],"show":["80.15","97.2","117.2"],"unlocked":["80.15"],"renamed":["80.15"],"thepaperpilot":["80.16"],"respec":["80.16","80.17","80.25","81.3","102.7"],"confirmation":["80.16","80.17"],"checkbox":["80.16"],"toggle":["80.17"],"confirmations":["80.17"],"red":["80.17"],"highlight":["80.17"],"expand":["80.18"],"clicking":["80.19","102.1"],"prestiged":["80.20","92.1","102.2","113.1"],"reset":["80.20","102.2","103.0"],"always":["80.21","102.3"],"node":["80.22","102.4"],"keyword":["80.24","80.54","102.6","102.36"],"work":["80.24","80.33","97.2","102.6","102.15","117.2"],"everywhere":["80.24","102.6"],"except":["80.24","102.6"],"tabformat":["80.24","102.6"],"arrays":["80.24","102.6"],"mod":["80.25","102.7"],"nodes":["80.25","80.34","80.41","97.2","102.7","102.16","102.23","117.2"],"clicked":["80.25","102.7"],"pressing":["80.25","102.7"],"enter":["80.25","102.7"],"subtab":["80.26","102.8"],"attempted":["80.26","102.8"],"fix":["80.26","80.38","102.8","102.20"],"challenges":["80.26","80.28","80.29","80.46","80.50","102.8","102.10","102.11","102.28","102.32"],"passivegain":["80.27","102.9"],"costs":["80.29","80.43","102.11","102.25"],"goals":["80.29","102.11"],"normal":["80.30","102.12"],"limit":["80.30","102.12"],"finish":["80.31","102.13"],"half":["80.32","102.14"],"standardize":["80.33","102.15"],"old":["80.33","86.0","102.15","108.0"],"ways":["80.33","102.15"],"shouldnotify":["80.34","102.16"],"highlighted":["80.34","102.16"],"commas":["80.34","102.16"],"defaults":["80.35","102.17"],"none":["80.35","80.46","96.0","102.17","102.28"],"improved":["80.35","102.17"],"updates":["80.37","102.19"],"author":["80.38","102.20"],"cangenpoints":["80.40","102.22"],"getpointgen":["80.40","102.22"],"maxticklength":["80.40","102.22"],"getstartpoints":["80.40","102.22"],"store":["80.40","102.22"],"able":["80.41","102.23"],"currencies":["80.43","85.0","102.25"],"upgrade":["80.43","80.52","102.25","102.34"],"either":["80.46","102.28"],"constant":["80.46","102.28"],"multiple":["80.46","92.2","99.0","102.28","113.2","119.0"],"completions":["80.46","102.28"],"type":["80.46","80.51","102.28","102.33"],"removes":["80.46","102.28"],"defined":["80.47","102.29"],"without":["80.47","102.29"],"milestones":["80.50","102.32"],"both":["80.50","102.32"],"individually":["80.50","102.32"],"formula":["80.51","102.33"],"buy":["80.52","102.34"],"code":["80.54","81.0","102.36","103.0"],"transfer":["80.54","102.36"],"buildings":["80.56","102.38"],"freely":["81.0","92.0","113.0"],"deleted":["81.0"],"reference":["81.0"],"won":["81.0","103.0"],"dive":["81.0","103.0"],"deep":["81.0","103.0"],"really":["81.0"],"vue":["81.0"],"components":["81.0","81.2","103.2"],"minimal":["81.2","103.2"],"explanations":["81.2","103.2"],"option":["81.3"],"subtabs":["81.4","103.4"],"microtabs":["81.4","103.4"],"tabs":["81.4","96.0","116.0"],"microtab":["81.4"],"tooltip":["82.0","104.0"],"appears":["82.0","104.0"],"hovered":["82.0","104.0"],"convey":["82.0"],"completing":["82.0","86.0","108.0"],"4bdc13":["84.0","106.0"],"1th":["85.0"],"purchase":["85.0"],"goaldescription":["86.0","108.0"],"true":["86.0","108.0"],"meet":["86.0","108.0"],"bulk":["86.0","108.0"],"changes":["88.0","110.0"],"single":["88.0","110.0"],"e":["88.0","110.0"],"g":["88.0","110.0"],"20px":["88.0","110.0"],"determines":["88.0","97.3","110.0","117.3"],"pair":["88.0","110.0"],"horizontally":["88.0"],"layout":["88.0"],"vertically":["88.0"],"change":["89.2","111.2"],"two":["90.0"],"unrelated":["90.0"],"proxy":["90.0"],"dealing":["90.0"],"getgriddata":["90.0"],"chosen":["90.0"],"setgriddata":["90.0"],"grideffect":["90.0"],"resettime":["92.1","113.1"],"last":["92.1","95.0","113.1"],"places":["92.1","113.1"],"optionally":["92.2"],"respeccable":["92.2"],"therefore":["92.3","113.3"],"secondary":["92.4","113.4"],"recalculate":["92.4","113.4"],"whatnot":["92.4","113.4"],"resetdescription":["92.4","113.4"],"save":["92.6","113.6"],"separate":["92.6"],"variable":["92.6"],"saved":["92.6"],"update":["92.6"],"diff":["92.6"],"tick":["92.6"],"provided":["92.7","113.7"],"paced":["93.0","114.0"],"enough":["93.0","114.0"],"ruins":["93.0","114.0"],"balance":["93.0","114.0"],"suggest":["93.0"],"disable":["93.0"],"clockwise":["95.0"],"seconds":["95.0"],"fadeouttime":["95.0"],"fading":["95.0"],"lifetime":["95.0"],"fadeintime":["95.0"],"stuff":["96.0"],"otherstuff":["96.0"],"fill":["97.1","117.1"],"whole":["97.1","117.1"],"layershown":["97.3","117.3"],"bool":["97.3","117.3"],"ghost":["97.3","117.3"],"effectdisplay":["99.0","119.0"],"formatting":["99.0","119.0"],"nothing":["99.0","119.0"],"fulldisplay":["99.0"],"enhancers":["102.38"],"release":["102.39"],"prevent":["103.0"],"saves":["103.0"],"conflicting":["103.0"],"note":["103.0"],"vertical":["103.4"],"sub":["107.0"],"cancomplete":["108.0"],"yourself":["113.3"],"see":["113.3"],"bottom":["113.3"],"standard":["113.5"]},{"0":["27.1","56.1","64.0","90.0","92.1","113.1"],"1":["64.0","72.3","83.0","92.3","105.0"],"2":["72.4","75.0","92.5","116.0"],"4":["70.1","70.2","76.0","89.1","89.2","98.0","111.1","111.2","118.0"],"5":["90.0"],"10":["61.9","61.11"],"11":["61.1","61.2","68.0"],"19":["0.0"],"20":["80.23","80.45","80.57","102.5","102.27"],"21":["80.1","80.2","80.12","80.36","102.18"],"25":["0.0"],"35":["95.0"],"114":["0.0"],"2020":["61.2","61.4","61.12"],"3603":["46.0"],"federated":["0.0"],"identity":["0.0","26.1","52.1"],"fedi":["0.0"],"v2":["0.0"],"fediverse":["0.0","28.0","33.0"],"forgejo":["0.0"],"freeform":["0.0"],"vs":["0.0","23.6","55.6"],"dichotomy":["0.0"],"game":["0.0","5.0","22.3","23.1","23.4","25.1","35.0","49.0","53.1","54.3","55.1","55.4","70.2","72.5","113.6"],"dev":["0.0","35.0"],"tree":["0.0","35.0","61.3","72.1","73.0","80.46","92.1","93.0","97.3","102.28","113.1","114.0","117.3"],"that":["2.0","16.0","24.0","44.0","45.2","47.0","57.0","72.2","81.2","103.2","103.4"],"unlocked":["2.0","72.3","74.0","77.0","80.17","82.0","85.0","86.0","87.0","94.0","99.0","104.0","115.0","119.0"],"new":["2.0","12.0","15.4","22.1","22.2","54.1","54.2","80.33","80.52","102.15","102.34","103.0"],"pieces":["2.0"],"content":["2.0","24.6","45.3","57.6"],"every":["2.0","27.1","46.0","56.1","72.5","113.6"],"real":["2.0"],"life":["2.0","24.1","57.1"],"day":["2.0","46.0"],"a":["2.0","13.0","15.3","19.0","26.2","28.0","34.0","40.0","45.1","52.2","62.1","80.47","102.29","113.3"],"couple":["2.0"],"days":["2.0"],"before":["2.0","24.6","57.6","80.17","88.0","95.0"],"social":["3.0","9.0"],"media":["3.0","9.0","16.0","38.1"],"currently":["3.0","80.34","102.16"],"only":["3.0","23.1","55.1","72.2","80.34","92.2","102.16","113.2"],"used":["3.0","72.6","80.43","81.3","102.25"],"it":["4.0","15.2","18.0","24.4","38.2","43.0","57.4","59.0","68.0","72.3","78.0","80.19","89.1","92.7","100.0","102.1","109.0","111.1","113.7"],"out":["4.0","15.2","23.1","55.1","64.0","83.0","105.0"],"from":["4.0","15.3","22.3","24.0","26.1","45.4","52.1","54.3","57.0","62.0","82.0","86.0","97.3","104.0","108.0","113.5","117.3"],"its":["4.0","72.0","88.0","110.0"],"github":["4.0"],"repository":["4.0"],"inspired":["4.0"],"puppet":["4.0"],"pals":["4.0"],"robert":["4.0"],"moran":["4.0"],"intended":["4.0","23.5","55.5"],"by":["5.0","23.1","23.2","24.8","26.1","47.0","49.0","52.1","55.1","55.2","57.8","67.0","72.0","72.1","77.0","99.0","119.0"],"anthony":["5.0"],"lawn":["5.0"],"and":["5.0","11.0","23.4","35.1","43.0","45.0","55.4","60.0","64.0","80.9","80.54","83.0","97.1","102.36","105.0","117.1"],"grant":["5.0"],"system":["6.0","80.28","102.10"],"designed":["6.0"],"to":["6.0","11.0","18.0","25.3","39.0","41.0","43.0","44.0","51.0","53.3","61.5","61.10","72.4","80.5","80.9","80.29","92.5","102.11","113.5"],"solve":["6.0"],"anything":["7.0","15.4"],"with":["7.0","24.0","24.11","26.3","27.4","37.0","52.3","56.4","57.0","57.11","62.0","72.6","73.0","80.33","80.37","92.0","92.2","92.4","92.7","93.0","102.15","102.19","113.0","113.4","113.7","114.0"],"timeline":["7.0"],"feed":["7.0"],"considered":["7.0","22.3","24.9","54.3","57.9"],"even":["7.0","12.0","15.3","15.5","24.3","27.3","56.3","57.3","80.15","81.4"],"if":["7.0","12.0","24.1","57.1","59.0","64.0","72.3","78.0","80.18","80.20","80.34","83.0","100.0","102.2","102.16","103.0","105.0"],"an":["8.0","24.9","25.0","27.1","42.0","53.0","56.1","57.9","72.6","74.0","80.15","80.34","81.2","92.2","92.7","94.0","97.3","102.16","103.2","113.7","115.0","117.3"],"open":["8.0","70.1"],"issues":["9.0","80.27","102.9"],"of":["9.0","15.2","40.0","45.2","45.3","70.1","74.0","76.0","80.21","80.35","80.38","89.1","94.0","97.0","98.0","102.3","102.17","102.20","111.1","115.0","117.0","118.0"],"modern":["9.0"],"etc":["9.0","22.1","23.6","54.1","55.6","80.6","90.0","109.0"],"how":["9.0","15.5","23.3","24.0","27.0","45.5","55.3","56.0","57.0","113.3"],"can":["9.0","15.4","16.0","23.1","26.0","26.1","27.0","38.2","43.0","45.5","50.0","52.0","52.1","55.1","56.0","62.2","72.4","80.41","80.44","80.50","80.51","80.55","81.2","81.3","92.5","102.23","102.26","102.32","102.33","103.2","103.3"],"improved":["9.0","80.13","80.33","102.15"],"or":["9.0","15.5","18.0","22.3","23.6","45.2","54.3","55.6","70.1","81.3","82.0","89.1","89.2","90.0","92.0","104.0","107.0","111.1","111.2","113.0"],"related":["9.0","80.40","102.22"],"projects":["9.0","37.0"],"also":["9.0","72.3","80.47","92.3","102.29"],"parable":["10.0"],"causes":["11.0"],"trend":["11.0"],"towards":["11.0","24.5","57.5"],"handful":["11.0"],"large":["11.0","80.34","81.0","102.16","103.0"],"strategies":["12.0"],"prioritized":["12.0"],"list":["12.0","72.4","92.5","97.3","113.5","117.3"],"when":["12.0","18.0","23.5","27.4","55.5","56.4","80.38","80.46","99.0","102.20","102.28"],"turn":["12.0"],"they":["12.0","24.1","24.3","57.1","57.3","80.5","80.34","80.47","88.0","102.16","102.29"],"go":["12.0","24.1","57.1"],"strategy":["12.0","24.0","24.4","57.0","57.4"],"check":["12.0"],"run":["12.0"],"then":["12.0","24.1","57.1","70.1","89.1","111.1"],"performs":["12.0"],"starts":["12.0","80.37","102.19"],"back":["12.0"],"sign":["12.0"],"under":["12.0","23.3","55.3"],"opens":["12.0"],"organized":["12.0"],"dropdown":["12.0"],"various":["12.0"],"simulator":["12.0"],"addition":["12.0"],"inspector":["12.0"],"code":["12.0","62.0","96.0"],"tools":["12.0"],"our":["12.0"],"will":["12.0","15.6","23.2","24.3","24.6","30.0","55.2","57.3","57.6","62.0","68.0","72.1","75.0","80.4","80.17","80.20","88.0","92.1","92.6","102.2","113.1","113.5"],"take":["12.0","15.0","80.41","102.23"],"simulate":["12.0"],"arbitrary":["12.0"],"number":["12.0","64.0","67.0","72.1","77.0","81.0","83.0","105.0"],"duels":["12.0"],"between":["12.0","13.0","24.3","57.3","73.0","80.35","92.7","102.17","113.7","114.0"],"output":["12.0"],"results":["12.0"],"summarize":["12.0"],"much":["12.0","26.3","52.3","73.0","80.18","113.3"],"quicker":["12.0"],"than":["12.0","23.1","23.6","26.3","52.3","55.1","55.6"],"manually":["12.0"],"personal":["13.0"],"blogs":["13.0"],"exist":["13.0"],"in":["13.0","15.4","22.1","25.1","30.0","51.0","53.1","54.1","72.0","74.0","80.50","94.0","102.32","109.0","115.0"],"middleground":["13.0"],"dark":["13.0"],"indieweb":["14.0"],"supported":["14.0"],"rauthy":["14.0"],"which":["14.0","23.5","55.5","70.0","72.1","75.0","80.43","89.0","92.1","102.25","111.0","113.1"],"community":["14.0","22.2","54.2"],"endorses":["14.0"],"self":["14.0"],"on":["15.0","23.5","24.10","26.1","26.2","35.1","45.5","52.1","52.2","55.5","57.10","60.0","65.0","72.1","74.0","80.27","80.54","84.0","85.0","92.1","94.0","102.9","102.36","106.0","107.0","113.1","115.0"],"direct":["15.1"],"their":["15.1","24.2","24.3","27.3","56.3","57.2","57.3","73.0","93.0","114.0"],"messages":["15.1"],"single":["15.1","69.0"],"user":["15.1"],"mastodon":["15.1"],"instance":["15.1","41.0"],"bad":["15.1","64.0","83.0","105.0"],"idea":["15.1"],"focuses":["15.1"],"chain":["15.2"],"authoritative":["15.2"],"hub":["15.2","31.0"],"e":["15.2","69.0"],"g":["15.2","69.0"],"white":["15.2"],"house":["15.2"],"ran":["15.2"],"verifies":["15.2"],"president":["15.2"],"congress":["15.2"],"typically":["15.2","24.7","45.0","57.7"],"wouldn":["15.2"],"t":["15.2","15.6","20.0","24.0","45.0","57.0","62.0","70.2"],"reach":["15.2","23.2","55.2"],"replies":["15.3","15.4"],"this":["15.3","24.4","24.8","24.10","57.4","57.8","57.10","80.16","81.0","99.0","119.0"],"way":["15.3","24.1","57.1","80.26","102.8"],"need":["15.3","24.0","27.2","56.2","57.0","72.6","80.17","92.7","113.7"],"know":["15.3","25.1","53.1"],"where":["15.3","72.1","92.1","113.1"],"given":["15.3"],"message":["15.3"],"originated":["15.3"],"private":["15.3"],"could":["15.3","27.1","56.1","80.5","96.0","116.0"],"itself":["15.4"],"be":["15.4","24.0","24.9","27.0","30.0","45.3","45.5","56.0","57.0","57.9","62.2","72.2","72.4","80.15","80.20","80.43","80.44","80.51","81.3","92.5","96.0","102.2","102.25","102.26","102.33","102.38","103.3","116.0"],"replied":["15.4"],"using":["15.4","72.0","72.1","80.43","92.1","102.25","113.1"],"parent":["15.4"],"property":["15.4"],"post":["15.4"],"edits":["15.4"],"handled":["15.4"],"reported":["15.5"],"reply":["15.5"],"make":["15.5","27.1","27.4","51.0","56.1","56.4","62.2","72.3","80.29","80.52","90.0","92.3","102.11","102.34","103.3"],"anonymous":["15.5"],"reports":["15.5"],"users":["15.5"],"without":["15.5"],"matching":["15.5"],"unlikely":["15.6"],"server":["15.6"],"doesn":["15.6"],"subscribe":["15.6"],"illegal":["15.6"],"material":["15.6","25.0","53.0"],"likely":["15.6","76.0","85.0","87.0","98.0","118.0"],"websites":["16.0"],"all":["16.0","23.3","26.1","52.1","55.3","72.0","72.4","80.15","81.2","92.5","97.3","103.2","113.5","117.3"],"is":["17.0","22.2","24.8","24.9","27.4","29.0","42.0","54.2","56.4","57.8","57.9","70.0","72.6","74.0","80.17","80.18","80.27","80.54","89.0","92.7","94.0","102.9","102.36","111.0","113.7","115.0"],"was":["18.0","20.0","72.3"],"created":["18.0"],"edited":["18.0"],"part":["18.0","27.3","44.0","56.3","80.16"],"describes":["19.0","21.0"],"shape":["20.0"],"tycoon":["20.0"],"i":["20.0","24.2","24.6","25.0","27.0","53.0","56.0","57.2","57.6","73.0","80.24","102.6","114.0"],"don":["20.0","70.2"],"useful":["21.0","26.3","52.3","72.1","92.1","110.0","113.1"],"feeds":["21.0"],"are":["21.0","45.0","72.1","80.11","81.0","92.1","103.0","113.1","113.2"],"not":["21.0","23.3","55.3","80.17","85.0","99.0","119.0"],"fit":["21.0"],"gardening":["21.0"],"genre":["22.0","24.2","54.0","57.2"],"seems":["22.0","54.0"],"draw":["22.0","54.0"],"uniquely":["22.1","54.1"],"implement":["22.1","54.1"],"normal":["22.1","54.1","96.0"],"web":["22.1","34.0","40.0","54.1"],"page":["22.1","35.1","45.5","54.1","97.1","117.1"],"no":["22.1","24.8","27.1","54.1","56.1","57.8","80.17"],"worry":["22.1","54.1"],"about":["22.1","50.0","54.1"],"rendering":["22.1","54.1"],"sprites":["22.1","54.1"],"moving":["22.1","54.1"],"them":["22.1","23.0","23.3","24.8","26.1","27.4","52.1","54.1","55.0","55.3","56.4","57.8","62.2","72.1","72.5","80.29","81.4","92.1","102.11","103.3","113.1","113.6"],"around":["22.1","22.2","54.1","54.2"],"implementing":["22.1","54.1"],"physics":["22.1","54.1"],"developers":["22.1","22.3","54.1","54.3","73.0","114.0"],"thousands":["22.2","54.2"],"plays":["22.2","54.2"],"incremental":["22.2","35.2","54.2"],"games":["22.2","23.0","40.0","54.2","55.0"],"mostly":["22.2","54.2"],"centers":["22.2","40.0","54.2"],"r":["22.2","24.1","54.2","57.1"],"always":["22.2","54.2","80.22","102.4"],"looking":["22.2","54.2"],"for":["22.2","23.6","30.0","40.0","41.0","45.1","45.3","54.2","55.6","60.0","80.10","80.15","80.49","96.0","102.31"],"available":["22.3","54.3"],"hobbyist":["22.3","54.3"],"there":["22.3","24.7","27.4","54.3","56.4","57.7","66.0","80.18","96.0","107.0","116.0"],"exceptions":["22.3","54.3"],"paid":["22.3","54.3"],"fine":["22.3","54.3"],"increlution":["22.3","54.3"],"stuck":["22.3","54.3"],"time":["22.3","54.3","62.0","72.5","92.6","113.6"],"donation":["22.3","54.3"],"ware":["22.3","54.3"],"kittens":["22.3","54.3"],"down":["23.0","55.0"],"due":["23.0","24.3","55.0","57.3"],"drawing":["23.0","55.0"],"negative":["23.0","55.0"],"attention":["23.0","55.0"],"made":["23.0","55.0"],"me":["23.0","55.0","68.0"],"think":["23.0","26.2","27.0","52.2","55.0","56.0","70.0","89.0","111.0"],"interesting":["23.0","55.0"],"arguments":["23.0","55.0"],"what":["23.0","23.6","24.6","24.7","55.0","55.6","57.6","57.7"],"makes":["23.0","24.2","55.0","57.2"],"good":["23.0","23.2","27.2","55.0","55.2","56.2","93.0"],"s":["23.0","26.0","40.0","41.0","52.0","55.0","62.0","80.48","80.54","92.7","102.30","102.36","113.7"],"argument":["23.0","27.2","55.0","56.2"],"argued":["23.1","55.1"],"have":["23.1","24.7","24.10","45.0","55.1","57.7","57.10","70.1","80.24","80.34","81.0","89.1","92.0","102.6","102.16","111.1","113.0"],"comparatively":["23.1","55.1"],"low":["23.1","23.5","55.1","55.5"],"depth":["23.1","55.1"],"combat":["23.1","24.2","55.1","57.2"],"compared":["23.1","55.1"],"many":["23.1","55.1","72.2","81.0","103.0","113.2"],"other":["23.1","24.1","25.0","27.2","53.0","55.1","56.2","57.1","62.0","80.33","86.0","92.0","99.0","102.15","113.0","119.0"],"d":["23.1","27.0","55.1","56.0"],"argue":["23.1","55.1"],"has":["23.1","55.1","75.0","116.0"],"sufficient":["23.1","55.1"],"more":["23.1","23.6","24.0","24.1","26.3","40.0","52.3","55.1","55.6","57.0","57.1","80.9","80.40","102.22"],"someone":["23.1","55.1"],"expect":["23.1","55.1"],"who":["23.1","23.5","55.1","55.5"],"played":["23.1","55.1"],"short":["23.1","55.1"],"while":["23.1","26.0","52.0","55.1","80.48","102.30"],"still":["23.1","30.0","41.0","55.1","80.41","102.23"],"definitely":["23.1","55.1"],"gets":["23.1","24.6","27.2","55.1","56.2","57.6","92.3","93.0","113.3"],"beat":["23.1","55.1","67.0"],"focused":["23.1","26.2","52.2","55.1"],"scene":["23.2","55.2"],"get":["23.2","26.2","45.4","52.2","55.2"],"becomes":["23.2","55.2"],"effortless":["23.2","55.2"],"allows":["23.2","55.2"],"point":["23.2","24.2","27.2","55.2","56.2","57.2","72.6","92.7","113.7"],"earlier":["23.2","24.8","55.2","57.8","80.37","102.19"],"isn":["23.2","24.7","55.2","57.7"],"any":["23.2","24.0","24.1","47.0","55.2","57.0","57.1","72.0"],"less":["23.2","23.6","55.2","55.6"],"legitimate":["23.2","23.6","55.2","55.6"],"rather":["23.2","55.2"],"lowers":["23.2","55.2"],"barrier":["23.2","55.2"],"entry":["23.2","55.2","72.4","92.5","97.3","113.5","117.3"],"allowing":["23.2","24.4","24.6","55.2","57.4","57.6","88.0"],"people":["23.2","55.2"],"really":["23.2","55.2","103.0"],"clear":["23.2","55.2"],"vampire":["23.2","55.2"],"survivors":["23.2","55.2"],"trivially":["23.2","55.2"],"extent":["23.2","55.2"],"spawn":["23.3","55.3"],"conditions":["23.3","55.3"],"best":["23.3","24.2","55.3","57.2","80.29","88.0","102.11"],"handle":["23.3","55.3"],"note":["23.3","25.0","53.0","55.3"],"same":["23.3","50.0","55.3"],"difficulty":["23.3","55.3"],"as":["23.3","23.5","23.6","24.4","27.1","47.0","55.3","55.5","55.6","56.1","57.4","66.0","73.0","74.0","80.39","88.0","90.0","94.0","97.1","102.21","107.0","115.0","117.1"],"well":["23.3","47.0","55.3","62.3","80.39","88.0","90.0","102.21"],"these":["23.4","27.3","45.0","55.4","56.3","64.0","83.0","105.0"],"upset":["23.4","55.4"],"change":["23.4","55.4","97.0","117.0"],"trying":["23.5","27.1","55.5","56.1"],"give":["23.5","27.3","27.4","55.5","56.3","56.4","81.2","103.2"],"player":["23.5","24.3","24.8","27.2","55.5","56.2","57.3","57.8","72.5","80.15","84.0","90.0","113.6"],"immersing":["23.5","55.5"],"themselves":["23.5","55.5"],"guy":["23.5","55.5"],"would":["23.5","24.0","24.7","55.5","57.0","57.7"],"hide":["23.5","55.5"],"behind":["23.5","55.5"],"cover":["23.5","55.5"],"great":["23.5","55.5"],"job":["23.5","55.5"],"at":["23.5","55.5","73.0","80.40","80.46","92.1","93.0","102.22","102.28","109.0","113.1","114.0"],"encouraging":["23.5","55.5"],"effectively":["23.5","55.5","89.2","111.2"],"teaching":["23.5","55.5"],"behave":["23.5","55.5"],"properly":["23.5","55.5"],"sharp":["23.5","55.5"],"contrast":["23.5","55.5"],"shooters":["23.5","55.5"],"call":["23.5","55.5","68.0"],"duty":["23.5","55.5"],"regen":["23.5","55.5"],"passively":["23.5","55.5"],"label":["23.6","55.6"],"because":["23.6","24.0","27.3","55.6","56.3","57.0","70.0","89.0","111.0"],"perceived":["23.6","55.6"],"worth":["23.6","55.6"],"most":["23.6","46.0","55.6","62.0","80.46","102.28"],"consumed":["23.6","55.6"],"ease":["23.6","55.6"],"painting":["23.6","55.6"],"movie":["23.6","55.6"],"sculpture":["23.6","55.6"],"lot":["23.6","55.6"],"incrementals":["23.6","55.6"],"narrative":["23.6","55.6"],"context":["23.6","55.6"],"similarly":["23.6","24.1","55.6","57.1"],"qualify":["23.6","55.6"],"cookie":["23.6","55.6"],"clicker":["23.6","55.6"],"specific":["24.0","24.4","57.0","57.4"],"definition":["24.0","27.0","56.0","57.0"],"similar":["24.0","24.3","57.0","57.3"],"mean":["24.0","57.0"],"amount":["24.0","57.0","67.0","80.21","88.0","90.0","102.3"],"specifically":["24.0","57.0"],"differentiates":["24.0","57.0"],"stance":["24.1","57.1"],"some":["24.1","25.1","53.1","57.1","80.24","102.6"],"level":["24.1","57.1"],"manipulating":["24.1","57.1"],"giving":["24.1","27.2","56.2","57.1"],"dopamine":["24.1","57.1"],"rewards":["24.1","57.1"],"manipulates":["24.1","57.1"],"necessarily":["24.1","57.1"],"value":["24.1","57.1","64.0","66.0","67.0","69.0","72.0","74.0","81.0","82.0","83.0","86.0","87.0","90.0","92.3","92.6","94.0","104.0","105.0","107.0","108.0","109.0","113.3","115.0"],"fulfillment":["24.1","57.1"],"plainly":["24.1","57.1"],"display":["24.1","38.1","57.1","67.0","68.0","72.0","77.0","80.40","80.46","80.51","86.0","90.0","102.22","102.28","102.33","108.0","109.0"],"manipulative":["24.1","57.1"],"forefront":["24.1","57.1"],"fun":["24.1","57.1"],"healthy":["24.1","57.1"],"certain":["24.1","57.1"],"contexts":["24.1","57.1"],"exacerbate":["24.1","57.1"],"video":["24.1","38.1","57.1"],"addiction":["24.1","57.1"],"feel":["24.1","26.0","52.0","57.1"],"priority":["24.1","57.1"],"over":["24.1","57.1","63.0"],"things":["24.1","57.1","80.24","80.33","80.40","102.6","102.15","102.22"],"your":["24.1","45.3","57.1","103.4"],"sleep":["24.1","57.1"],"schedule":["24.1","57.1"],"prudent":["24.1","57.1"],"seek":["24.1","57.1"],"help":["24.1","57.1"],"stopgaming":["24.1","57.1"],"resources":["24.1","57.1"],"undressing":["24.1","57.1"],"tends":["24.1","26.3","52.3","57.1"],"hand":["24.1","57.1"],"line":["24.2","57.2","80.51","97.3","102.33","113.5","117.3"],"blurred":["24.2","57.2"],"own":["24.2","26.1","52.1","57.2","73.0","93.0","114.0"],"sake":["24.2","57.2"],"versus":["24.2","57.2"],"contextual":["24.2","57.2"],"reason":["24.2","57.2"],"believe":["24.2","24.3","57.2","57.3"],"illustrated":["24.2","57.2"],"sub":["24.2","57.2"],"relates":["24.2","57.2"],"perform":["24.2","57.2","81.0"],"automatically":["24.2","24.8","57.2","57.8","83.0","105.0"],"does":["24.2","57.2"],"support":["24.2","57.2"],"state":["24.3","24.7","57.3","57.7"],"do":["24.3","26.0","27.4","41.0","52.0","56.4","57.3","59.0","78.0","100.0"],"two":["24.3","57.3"],"genres":["24.3","27.3","56.3","57.3"],"unrelated":["24.3","57.3"],"significant":["24.3","57.3"],"overlap":["24.3","57.3"],"bases":["24.3","57.3"],"having":["24.3","24.8","57.3","57.8"],"roguelike":["24.4","57.4"],"very":["24.4","26.0","27.3","52.0","56.3","57.4"],"lenient":["24.4","57.4"],"present":["24.4","57.4","68.0","97.1","117.1"],"factor":["24.4","24.8","57.4","57.8"],"so":["24.4","26.3","38.2","52.3","57.4","80.34","102.16"],"long":["24.4","30.0","57.4","93.0"],"shows":["24.4","38.1","57.4","80.21","102.3"],"enough":["24.4","27.2","56.2","57.4","73.0"],"accounts":["24.4","57.4"],"blurriness":["24.4","57.4"],"realm":["24.5","57.5"],"grinder":["24.5","57.5"],"synergism":["24.5","57.5"],"universal":["24.5","57.5"],"paperclips":["24.5","57.5"],"learn":["24.5","45.5","57.5"],"fly":["24.5","57.5"],"hades":["24.5","57.5"],"just":["24.5","27.1","27.2","56.1","56.2","57.5","67.0","77.0","86.0","97.2","108.0","117.2"],"kidding":["24.5","57.5"],"chose":["24.5","57.5"],"variety":["24.5","57.5"],"biasing":["24.5","57.5"],"newer":["24.5","57.5"],"mystery":["24.6","57.6"],"anticipating":["24.6","57.6"],"happen":["24.6","24.8","57.6","57.8"],"next":["24.6","57.6","72.6","92.7","113.7"],"shake":["24.6","57.6"],"up":["24.6","38.2","45.2","57.6","80.22","102.4"],"stale":["24.6","57.6"],"entertain":["24.6","57.6"],"longer":["24.6","24.8","57.6","57.8","80.17"],"guide":["24.6","57.6"],"dissipates":["24.6","57.6"],"canon":["24.6","57.6"],"selected":["24.6","57.6"],"above":["24.6","57.6","68.0"],"textual":["24.7","57.7"],"presentation":["24.7","57.7"],"visual":["24.7","57.7"],"representation":["24.7","57.7"],"entities":["24.7","57.7"],"within":["24.7","57.7"],"interface":["24.7","57.7"],"closer":["24.7","57.7"],"automation":["24.8","57.8","80.37","102.19"],"progresses":["24.8","57.8"],"often":["24.8","24.10","57.8","57.10"],"deal":["24.8","57.8"],"mechanics":["24.8","27.3","56.3","57.8"],"either":["24.8","25.1","27.3","53.1","56.3","57.8"],"say":["24.9","57.9","76.0","88.0","98.0","118.0"],"whether":["24.9","57.9","68.0"],"roguelite":["24.9","57.9"],"meta":["24.9","57.9"],"fall":["24.10","57.10"],"into":["24.10","26.0","52.0","57.10","76.0","98.0","118.0"],"itrtg":["24.10","57.10"],"like":["24.10","27.0","56.0","57.10","92.2","97.2","117.2"],"based":["24.10","57.10","65.0","84.0","87.0","88.0","106.0"],"clearing":["24.10","57.10"],"increasingly":["24.10","57.10"],"difficult":["24.10","57.10"],"battles":["24.10","57.10"],"tend":["24.10","57.10"],"being":["24.11","57.11","80.32","102.14"],"fantasy":["24.11","57.11"],"world":["24.11","57.11"],"creators":["25.0","43.0","53.0"],"relevant":["25.0","50.0","53.0"],"contextualize":["25.0","27.3","53.0","56.3"],"everything":["25.0","53.0","66.0","85.0","87.0","107.0"],"incomplete":["25.0","53.0"],"document":["25.0","53.0"],"but":["25.1","53.1","59.0","66.0","78.0","80.41","80.47","100.0","102.23","102.29","107.0"],"formal":["25.1","53.1"],"education":["25.1","53.1"],"development":["25.1","30.0","51.0","53.1"],"appeal":["25.2","53.2"],"players":["25.2","53.2"],"soul":["26.0","52.0"],"natural":["26.0","52.0"],"vulnerable":["26.0","52.0"],"communities":["26.0","52.0"],"ensure":["26.0","52.0"],"try":["26.1","27.4","52.1","56.4"],"internalize":["26.1","52.1"],"instead":["26.1","27.2","27.3","52.1","56.2","56.3","72.1","72.3","81.0","92.1","92.3","97.1","113.1","117.1"],"focus":["26.1","52.1"],"distancing":["26.1","52.1"],"work":["26.1","52.1"],"emotionally":["26.1","52.1"],"better":["26.1","52.1","80.33","102.15"],"analyze":["26.1","52.1"],"use":["26.1","52.1","72.5","80.50","81.4","85.0","92.6","102.32","107.0","113.6"],"advantage":["26.1","52.1"],"important":["26.2","52.2"],"diverse":["26.2","45.0","52.2"],"set":["26.2","52.2","72.5","75.0","86.0","99.0","113.6","116.0","119.0"],"enjoy":["26.2","52.2"],"stick":["26.3","52.3"],"us":["26.3","52.3"],"prominently":["26.3","52.3"],"explore":["27.0","56.0"],"counts":["27.0","56.0"],"we":["27.0","56.0"],"measure":["27.0","56.0"],"baseline":["27.0","56.0"],"described":["27.0","56.0"],"parts":["27.0","56.0"],"m":["27.1","46.0","56.1"],"here":["27.1","56.1","60.0","96.0","116.0"],"extreme":["27.1","56.1"],"example":["27.1","27.4","56.1","56.4"],"interactions":["27.1","56.1"],"counter":["27.1","56.1"],"goes":["27.1","56.1","64.0","83.0","105.0"],"second":["27.1","56.1","75.0","116.0"],"safely":["27.1","56.1"],"said":["27.1","56.1"],"beyond":["27.1","56.1"],"5x":["27.2","56.2"],"step":["27.2","56.2"],"10x":["27.2","56.2"],"punishes":["27.2","56.2"],"progression":["27.2","56.2"],"wise":["27.2","56.2"],"whenever":["27.2","56.2"],"forget":["27.2","56.2"],"max":["27.2","56.2","80.30","90.0","102.12"],"again":["27.2","56.2","70.2"],"eventually":["27.2","56.2"],"automated":["27.2","56.2"],"reward":["27.2","27.3","56.2","56.3","63.0","104.0"],"progress":["27.2","56.2"],"voice":["27.2","56.2"],"side":["27.2","56.2","72.1","92.1","113.1"],"acamaeda":["27.2","56.2"],"defended":["27.2","56.2"],"multiplier":["27.2","56.2"],"upgrade":["27.2","56.2"],"understand":["27.2","56.2"],"clarify":["27.2","56.2"],"framework":["27.3","56.3"],"introducing":["27.3","56.3"],"automating":["27.3","56.3"],"old":["27.3","56.3"],"enjoyable":["27.3","56.3"],"nearly":["27.3","56.3"],"nonexistent":["27.3","56.3"],"going":["27.3","56.3"],"platformer":["27.3","56.3"],"automate":["27.3","56.3","92.6"],"jumping":["27.3","56.3"],"core":["27.3","56.3"],"platformers":["27.3","56.3"],"add":["27.3","56.3","80.9"],"build":["27.3","56.3"],"least":["27.3","56.3"],"however":["27.3","56.3"],"frequently":["27.3","56.3"],"means":["27.3","56.3","81.0","103.0"],"replacing":["27.3","56.3"],"opposed":["27.3","56.3"],"augmenting":["27.3","56.3"],"admittedly":["27.3","56.3"],"paragraph":["27.3","56.3"],"ignores":["27.3","56.3"],"obvious":["27.3","56.3"],"answer":["27.3","56.3"],"separates":["27.3","56.3"],"regard":["27.3","56.3"],"chores":["27.3","56.3"],"frequency":["27.3","56.3"],"increases":["27.3","56.3"],"sense":["27.3","56.3"],"seen":["27.3","56.3"],"sure":["27.4","56.4"],"unlock":["27.4","56.4","72.3","92.3"],"immediately":["27.4","56.4","80.19","102.1"],"something":["27.4","46.0","56.4","92.4","113.4"],"the":["27.4","45.3","56.4","62.2","80.13","80.21","80.31","80.32","80.38","81.4","102.3","102.13","102.14","102.20","103.3"],"perhaps":["27.4","56.4"],"hosted":["28.0"],"synapse":["32.0","37.0"],"source":["33.0","45.3"],"find":["35.1"],"my":["35.1"],"itch":["35.1"],"io":["35.1"],"profectus":["37.0"],"vitepress":["37.0"],"weird":["37.0"],"project":["38.0"],"originally":["38.0"],"built":["38.0"],"autoplay":["38.1"],"clipboard":["38.1"],"write":["38.1"],"encrypted":["38.1"],"gyroscope":["38.1"],"picture":["38.1"],"allowfullscreen":["38.1"],"style":["38.1","71.0","91.0","95.0","112.0"],"block":["38.1"],"margin":["38.1"],"auto":["38.1"],"talker":["38.1"],"wave":["38.1"],"sensors":["38.1"],"placed":["38.1"],"general":["38.2"],"cleaning":["38.2"],"tech":["38.2"],"debt":["38.2"],"easily":["38.2"],"show":["39.0","47.0","68.0","80.34","102.16"],"off":["39.0","72.1","92.1","113.1"],"dynamic":["39.0","72.0","90.0"],"template":["40.0"],"making":["40.0"],"hard":["41.0","70.0","89.0","111.0"],"everyone":["41.0"],"subject":["41.0"],"moderation":["41.0"],"limitations":["41.0"],"consumers":["43.0"],"apply":["43.0","71.0","91.0","95.0","112.0"],"pages":["45.0"],"won":["45.0","62.0"],"ads":["45.0"],"search":["45.1"],"engine":["45.1"],"site":["45.2"],"builders":["45.2"],"templates":["45.2"],"end":["45.2"],"website":["45.3"],"truth":["45.3"],"posted":["45.3"],"notifications":["45.4"],"extensive":["45.5"],"hosting":["45.5"],"expensive":["45.5"],"com":["45.6"],"embed":["45.6","81.4"],"00qwzmmrtok":["45.6"],"title":["45.6","47.0","70.2","89.2","109.0","111.2"],"frameborder":["45.6"],"id":["46.0","80.47","102.29"],"6637b86a":["46.0"],"45ef":["46.0"],"a21e":["46.0"],"b33c7d96c529":["46.0"],"writing":["46.0"],"essentially":["46.0"],"fps":["47.0"],"debug":["47.0","61.7"],"console":["47.0"],"typing":["47.0"],"grave":["47.0"],"key":["47.0","70.0","89.0","111.0"],"default":["47.0","63.0","66.0","67.0","77.0","80.30","85.0","86.0","90.0","102.12","107.0","108.0"],"screen":["47.0","80.25","80.32","80.46","102.7","102.14","102.28"],"detects":["47.0"],"chatting":["50.0"],"multiple":["50.0","67.0","72.2","77.0","82.0","86.0","87.0","104.0","108.0","109.0"],"contain":["50.0"],"room":["50.0"],"share":["50.0"],"aims":["51.0"],"creating":["51.0"],"needs":["59.0","66.0","78.0","100.0","107.0"],"function":["59.0","68.0","72.0","72.5","78.0","100.0","109.0","113.3","113.6"],"supplied":["59.0","78.0","100.0"],"should":["59.0","73.0","78.0","88.0","93.0","100.0","114.0"],"copy":["60.0","70.1","89.1","111.1"],"pasting":["60.0"],"look":["60.0"],"tutorial":["60.0"],"changelog":["61.0","93.0","114.0"],"09":["61.1"],"fixed":["61.1","61.3","80.1","80.6","80.14","80.27","80.30","80.42","80.45","102.9","102.12","102.24","102.27"],"08":["61.3"],"rebalanced":["61.4"],"text":["61.5","68.0","80.25","87.0","95.0","102.7","109.0"],"lore":["61.5"],"styled":["61.6"],"basically":["61.6"],"removed":["61.7"],"typos":["61.8"],"minor":["61.8"],"issue":["61.10"],"unique":["62.0","70.2"],"prevent":["62.0"],"mod":["62.0"],"saves":["62.0","89.2","111.2"],"conflicting":["62.0"],"mods":["62.0"],"dive":["62.0"],"deep":["62.0"],"create":["62.0","80.5"],"components":["62.1","103.0"],"minimal":["62.1"],"features":["62.1","80.46","90.0","102.28"],"explanations":["62.1"],"option":["62.2","103.3"],"respec":["62.2","80.11","103.3"],"able":["62.2","81.3","103.3"],"vertical":["62.3"],"subtabs":["62.3","80.13","92.2"],"microtabs":["62.3","92.2","113.2"],"boolean":["63.0","92.6"],"tooltip":["63.0"],"appears":["63.0","72.1","76.0","92.1","98.0","113.1","118.0"],"hovered":["63.0"],"convey":["63.0","104.0"],"completing":["63.0","104.0"],"effect":["63.0","66.0","82.0","104.0","107.0"],"calculates":["63.0","66.0","82.0","86.0","87.0","104.0","107.0","108.0","109.0"],"empty":["64.0","83.0","105.0"],"full":["64.0","83.0","86.0","99.0","105.0","119.0"],"nothing":["64.0","83.0","105.0"],"happens":["64.0","83.0","105.0"],"bounds":["64.0","83.0","105.0"],"decimal":["64.0","67.0","72.3","73.0","77.0","81.0","83.0","92.3","93.0","103.0","105.0","113.3","114.0"],"optional":["64.0","71.0","72.6","74.0","91.0","92.7","94.0","109.0","112.0","113.7","115.0"],"row":["65.0","69.0","106.0","110.0","113.1"],"first":["65.0","72.3","75.0","84.0","106.0","116.0"],"baseresource":["65.0","84.0","106.0"],"gain":["65.0","72.1","84.0","88.0","106.0"],"baseamount":["65.0","84.0","113.3"],"1th":["66.0","107.0"],"object":["66.0","67.0","82.0","86.0","104.0","107.0","108.0"],"currencies":["66.0","107.0"],"values":["66.0","81.0","82.0","86.0","87.0","88.0","92.0","103.0","104.0","107.0","108.0","109.0","113.0"],"bonuses":["66.0","82.0","86.0","87.0","104.0","107.0","108.0","109.0"],"containing":["66.0","67.0","82.0","86.0","87.0","104.0","107.0","108.0","109.0"],"returning":["66.0","77.0","85.0","87.0","99.0","107.0","119.0"],"return":["67.0","68.0","82.0","90.0","104.0","108.0","109.0"],"rewarddisplay":["67.0","86.0","108.0"],"formatting":["67.0","77.0","80.27","86.0","102.9","108.0"],"behavior":["67.0","77.0","86.0","108.0"],"appropriately":["67.0","77.0","86.0"],"formatted":["67.0","77.0","86.0"],"goal":["67.0"],"currency":["67.0","72.6","77.0","85.0","92.7","99.0","110.0","113.7","119.0"],"required":["67.0","72.3","92.3"],"points":["67.0","80.46","80.51","102.28","102.33"],"additional":["68.0"],"button":["68.0","80.16","92.4","113.4"],"appear":["68.0","72.1","74.0","75.0","80.17","92.1","94.0","97.3","113.1","113.5","115.0","117.3"],"pressing":["68.0"],"masterbuttontext":["68.0"],"press":["68.0"],"master":["68.0","76.0","98.0","118.0"],"showmasterbutton":["68.0"],"determining":["68.0"],"defaults":["68.0","92.6"],"true":["68.0","90.0","92.6"],"absent":["68.0"],"blah":["68.0","109.0"],"changes":["69.0","92.1"],"20px":["69.0"],"determines":["69.0"],"height":["69.0","95.0"],"pair":["69.0","74.0","94.0","115.0"],"width":["69.0","95.0","110.0"],"horizontally":["69.0","110.0"],"layout":["69.0","80.48","96.0","97.0","97.1","102.30","110.0","117.0","117.1"],"column":["69.0","80.53","102.35","110.0"],"vertically":["69.0","110.0"],"especially":["70.0","89.0","111.0"],"desktop":["70.0","89.0","111.0"],"lets":["70.0","80.52","86.0","89.0","95.0","99.0","102.34","111.0","119.0"],"username":["70.1","89.1","111.1"],"now":["70.1","80.50","80.56","89.1","89.2","102.32","102.38","111.1","111.2"],"probably":["70.2"],"later":["70.2"],"save":["70.2","72.5","89.2","111.2"],"reload":["70.2","89.2","111.2"],"tab":["70.2","80.35","80.48","81.2","89.2","102.17","102.30","103.2","111.2"],"info":["70.2","89.2","111.2"],"titlestyle":["71.0","91.0","112.0"],"bodystyle":["71.0","91.0","112.0"],"css":["71.0","80.56","91.0","95.0","102.38","112.0"],"almost":["72.0"],"place":["72.0"],"including":["72.0","85.0","97.0","117.0"],"affects":["72.1","92.1","113.1"],"node":["72.1","80.20","92.1","102.2","113.1"],"resets":["72.1","92.1","113.1"],"affect":["72.1","92.1","113.1"],"cause":["72.1","92.1","113.1"],"smaller":["72.1","92.1","113.1"],"achievements":["72.1","92.1","113.1"],"statistics":["72.1","92.1","113.1"],"affected":["72.1","92.1","113.1"],"unless":["72.1","92.1","113.1"],"doreset":["72.1","92.1","113.1"],"resource":["72.1","72.5","88.0","92.6","110.0","113.6"],"bought":["72.2"],"times":["72.2"],"optionally":["72.2","113.2"],"respeccable":["72.2","113.2"],"uses":["72.2","81.0","103.0","113.2"],"clickables":["72.2","80.15","92.2","113.2"],"extremely":["72.2","92.2","113.2"],"versatile":["72.2","92.2","113.2"],"generalized":["72.2","92.2","113.2"],"buttons":["72.2","74.0","80.35","92.2","94.0","102.17","113.2","115.0"],"needed":["72.3","90.0","92.3","113.3"],"harder":["72.3"],"another":["72.3","81.4","96.0","116.0"],"alternatively":["72.4","92.5","97.3","113.5","117.3"],"element":["72.4","92.5"],"separate":["72.5","113.6"],"variable":["72.5","72.6","88.0","92.7","113.6","113.7"],"layerdatareset":["72.5"],"saved":["72.5","113.6"],"update":["72.5","79.0","101.0","113.6"],"diff":["72.5","113.6"],"tick":["72.5","80.30","102.12","113.6"],"passive":["72.5","92.6","113.6"],"production":["72.5","92.6","113.6"],"base":["72.6"],"ish":["72.6","92.7","113.7"],"layers":["72.6","80.10","80.37","92.7","102.19","113.7"],"paced":["73.0"],"too":["73.0","80.18"],"ruins":["73.0"],"balance":["73.0"],"such":["73.0"],"why":["73.0","114.0"],"suggest":["73.0","114.0"],"disable":["73.0","114.0"],"initialstartpoints":["73.0","93.0","114.0"],"start":["73.0","114.0"],"version":["73.0","93.0","114.0"],"describe":["73.0","93.0","97.1","114.0","117.1"],"current":["73.0","80.54","93.0","102.36","114.0"],"num":["73.0","93.0","114.0"],"top":["73.0","80.40","80.46","93.0","102.22","102.28","109.0","114.0"],"right":["73.0","93.0","114.0"],"toggles":["74.0","94.0","115.0"],"creates":["74.0","94.0","115.0"],"toggle":["74.0","94.0","115.0"],"defined":["74.0","94.0","115.0"],"array":["74.0","94.0","97.3","115.0","117.3"],"paired":["74.0","94.0","115.0"],"items":["74.0","94.0","115.0"],"one":["74.0","85.0","94.0","115.0"],"per":["74.0","94.0","115.0"],"tabs":["75.0","103.4"],"component":["75.0","80.16"],"stuff":["75.0","116.0"],"otherstuff":["75.0","116.0"],"none":["75.0","116.0"],"branch":["76.0","98.0","118.0"],"bottom":["76.0","98.0","118.0"],"thing":["76.0","98.0","118.0"],"choose":["76.0","98.0","118.0"],"merge":["76.0","98.0","118.0"],"select":["76.0","98.0","118.0"],"upstream":["76.0","98.0","118.0"],"effectdisplay":["77.0","80.34","102.16"],"cost":["77.0"],"main":["77.0","97.2","99.0","113.3","117.2","119.0"],"prestige":["77.0","99.0","119.0"],"remote":["79.0","101.0"],"particle":["80.3"],"color":["80.3","80.31","80.47","92.5","95.0","102.13","102.29"],"feature":["80.3","80.9","80.15","80.52","102.34"],"random":["80.4"],"spot":["80.4"],"bars":["80.4","80.35","102.17"],"visually":["80.4","80.26","80.33","102.8","102.15"],"golden":["80.5"],"cookies":["80.5"],"upgrades":["80.6","80.34","102.16"],"buyables":["80.6","80.7"],"marked":["80.9"],"mark":["80.9"],"static":["80.10"],"onenter":["80.10"],"onexit":["80.10"],"confirmation":["80.11"],"settings":["80.11","80.15"],"clearer":["80.15"],"onhold":["80.15"],"layer":["80.15","80.39","80.40","102.21","102.22"],"nodes":["80.15","97.1","117.1"],"highlighted":["80.15","80.20","102.2"],"unlocking":["80.17"],"hotkeys":["80.17"],"you":["80.17","80.50","80.55","81.2","85.0","95.0","97.1","102.32","103.2","103.4","117.1"],"popup":["80.19","102.1"],"dismisses":["80.19","102.1"],"added":["80.19","80.26","80.43","80.54","102.1","102.8","102.25","102.36"],"red":["80.20","102.2"],"taking":["80.22","102.4"],"space":["80.22","81.3","102.4"],"although":["80.24","102.6"],"may":["80.24","102.6"],"missed":["80.24","102.6"],"possible":["80.25","102.7"],"fix":["80.25","80.49","102.7","102.31"],"flickering":["80.25","102.7"],"tooltips":["80.25","102.7"],"strange":["80.25","102.7"],"transitions":["80.25","102.7"],"victory":["80.25","102.7"],"configurable":["80.25","102.7"],"updating":["80.26","83.0","87.0","102.8","105.0","109.0"],"different":["80.26","81.2","102.8","103.2"],"softcap":["80.26","102.8"],"active":["80.27","102.9"],"cancomplete":["80.28","102.10"],"standard":["80.28","102.10"],"fully":["80.29","102.11"],"custom":["80.29","80.56","81.2","102.11","103.2"],"length":["80.30","102.12"],"were":["80.30","102.12"],"complete":["80.31","102.13"],"ones":["80.33","102.15"],"milestones":["80.33","102.15"],"exponents":["80.34","102.16"],"spacing":["80.35","102.17"],"determined":["80.37","102.19"],"order":["80.37","102.19"],"rowed":["80.37","102.19"],"crash":["80.38","102.20"],"caused":["80.38","102.20"],"non":["80.40","88.0","102.22"],"data":["80.40","102.22"],"hidden":["80.41","102.23"],"html":["80.42","80.50","85.0","87.0","93.0","95.0","102.24","102.32"],"challenge":["80.43","102.25"],"goals":["80.43","102.25"],"currencylocation":["80.43","102.25"],"maxticklength":["80.43","102.25"],"functions":["80.44","80.46","92.0","92.2","102.26","102.28","113.0"],"gui":["80.46","102.28"],"elements":["80.46","102.28"],"stay":["80.46","102.28"],"scrolls":["80.46","102.28"],"getter":["80.46","102.28"],"setter":["80.46","102.28"],"amounts":["80.46","102.28"],"effects":["80.46","88.0","102.28","110.0"],"big":["80.46","102.28"],"wide":["80.50","102.32"],"sec":["80.51","102.33"],"disabled":["80.51","102.33"],"h":["80.51","102.33"],"v":["80.51","102.33","103.0"],"image":["80.51","102.33"],"shouldnotify":["80.52","102.34"],"name":["80.54","102.36"],"works":["80.54","102.36"],"existing":["80.54","89.2","102.36","111.2"],"subfeatures":["80.54","102.36"],"enhancers":["80.56","81.3"],"break":["81.0","103.0"],"eternity":["81.0","103.0"],"store":["81.0","103.0"],"numbers":["81.0","88.0","103.0"],"must":["81.0","103.0"],"treated":["81.0","103.0"],"differently":["81.0","103.0"],"x":["81.0","103.0"],"plain":["81.0"],"operations":["81.0"],"properties":["81.2","103.2"],"layouts":["81.2","103.2"],"buildings":["81.3"],"put":["81.4","88.0","93.0","103.4"],"inside":["81.4","91.0","112.0"],"grids":["81.4"],"setting":["82.0","104.0"],"disables":["82.0","104.0"],"bool":["82.0","85.0","99.0","119.0"],"after":["85.0","87.0","92.6"],"description":["85.0"],"basic":["85.0","87.0","95.0"],"determine":["85.0"],"visible":["85.0","99.0","119.0"],"implements":["85.0"],"spending":["85.0"],"buymax":["85.0"],"rewardeffect":["86.0","108.0"],"fulldisplay":["86.0","119.0"],"override":["86.0","92.1","99.0","119.0"],"overrides":["86.0","97.1","99.0","117.1","119.0"],"displays":["86.0","95.0"],"descriptions":["86.0","99.0","119.0"],"changing":["87.0"],"precision":["88.0"],"whole":["88.0"],"total":["88.0"],"startdata":["88.0"],"string":["88.0"],"input":["88.0"],"box":["88.0"],"else":["89.2","92.4","111.2","113.4"],"ll":["89.2","111.2"],"wipe":["89.2","111.2"],"updated":["89.2","111.2"],"cols":["90.0"],"getstartdata":["90.0"],"getunlocked":["90.0"],"getcanclick":["90.0"],"onclick":["90.0"],"getdisplay":["90.0"],"columns":["90.0","110.0"],"maxrows":["90.0"],"maxcols":["90.0"],"sometimes":["90.0","92.2","113.2"],"associated":["92.0","113.0"],"starting":["92.1","113.1"],"displayrow":["92.1"],"clicked":["92.2","113.2"],"area":["92.2"],"requires":["92.3","113.3"],"replace":["92.4","113.4"],"reset":["92.4","113.4"],"prestigebuttontext":["92.4","113.4"],"consisting":["92.5"],"since":["92.6","113.6"],"last":["92.6"],"autoupgrade":["92.6"],"attempt":["92.6"],"buy":["92.6"],"false":["92.6"],"differentiate":["92.7","113.7"],"alongside":["93.0","114.0"],"particularly":["93.0"],"might":["93.0"],"generic":["95.0"],"styling":["95.0"],"dimensions":["95.0"],"sets":["95.0"],"angle":["95.0"],"face":["95.0"],"dir":["95.0"],"initial":["95.0"],"factored":["95.0"],"microtab":["96.0","103.4"],"both":["96.0"],"treelayout":["97.1","117.1"],"places":["97.1","117.1"],"branches":["97.3","117.3"],"ids":["97.3","113.5","117.3"],"onpurchase":["99.0","119.0"],"called":["99.0"],"define":["102.37"],"want":["103.0"],"vue":["103.0"],"objects":["103.0"],"applied":["108.0"],"displayed":["109.0"],"larger":["109.0"],"font":["109.0"],"hex":["113.1"],"format":["113.1"]},{"0":["45.6","80.10","87.0"],"1":["65.0","84.0","92.5","97.3","106.0","113.3","117.3"],"2":["23.3","55.3","61.1","72.3","92.3","97.3","113.5","117.3"],"3":["61.1","88.0","92.5","97.3","117.3"],"5":["70.2","76.0","89.2","98.0","111.2","118.0"],"6":["70.2"],"10":["61.12","84.0","106.0"],"11":["61.4"],"12":["80.8"],"15":["95.0"],"18":["61.12"],"19":["61.11"],"20":["10.0","80.36","102.18"],"21":["61.9","80.8"],"25":["87.0"],"28":["0.0"],"29":["0.0"],"30":["95.0"],"32":["0.0"],"54":["0.0"],"62":["0.0"],"143":["0.0"],"200":["65.0"],"8445":["24.2","57.2"],"9215":["23.2","55.2"],"guide":["0.0","24.8","57.8"],"incrementals":["0.0","25.3","53.3"],"appeal":["0.0","24.1","57.1"],"developers":["0.0","24.1","25.0","53.0","57.1"],"players":["0.0","23.1","55.1"],"defining":["0.0","23.6","55.6"],"genre":["0.0","23.2","24.5","24.6","24.7","55.2","57.5","57.6","57.7"],"navigating":["0.0"],"criticism":["0.0","22.3","24.1","54.3","57.1"],"what":["0.0","27.1","27.3","56.1","56.3"],"is":["0.0","1.0","9.0","15.2","15.5","22.1","23.3","26.2","31.0","32.0","36.0","38.1","48.0","52.2","54.1","55.3","70.1","80.20","80.22","80.34","80.38","80.46","89.1","102.2","102.4","102.16","102.20","102.28","111.1"],"a":["1.0","15.0","24.9","29.0","32.0","36.0","57.9","59.0","70.2","78.0","79.0","80.38","80.44","80.54","100.0","101.0","102.20","102.26","102.36"],"december":["2.0"],"started":["2.0","60.0"],"this":["2.0","13.0","15.2","23.4","24.3","27.0","44.0","50.0","55.4","56.0","57.3","62.0","77.0","80.39","102.21"],"was":["2.0","4.0","15.2","27.3","56.3","77.0","92.3","99.0","113.3","119.0"],"one":["2.0","24.6","27.1","41.0","56.1","57.6","80.20","80.40","102.2","102.22","107.0"],"most":["2.0","35.1","80.50","102.32"],"hectic":["2.0"],"months":["2.0"],"m":["2.0","24.6","27.2","56.2","57.6"],"bluesky":["3.0"],"in":["3.0","5.0","23.3","24.7","35.1","45.0","55.3","57.7","68.0","80.26","80.32","97.1","102.8","102.14","117.1"],"comparison":["3.0","81.0","103.0"],"to":["3.0","14.0","16.0","40.0","80.18","80.28","80.43","96.0","102.10","102.25","116.0"],"use":["4.0","22.1","27.2","54.1","56.2","64.0","80.17","80.25","80.26","80.47","83.0","102.7","102.8","102.29","103.4","105.0"],"rpg":["4.0"],"campaigns":["4.0"],"renderer":["4.0"],"separated":["4.0"],"into":["4.0","23.6","55.6","70.2","89.2","97.0","111.2","117.0"],"own":["4.0","23.6","55.6","81.4"],"project":["4.0","70.1"],"js":["4.0","80.46","102.28"],"barbee":["5.0"],"for":["5.0","15.3","23.2","28.0","34.0","38.2","45.5","55.2","72.3","75.0","80.17","80.19","80.27","80.47","80.51","92.3","102.1","102.9","102.29","102.33","116.0"],"their":["5.0","12.0","26.0","41.0","52.0","81.4"],"class":["5.0"],"problems":["6.0","45.3"],"of":["6.0","25.1","26.1","26.3","52.1","52.3","53.1","80.7","80.20","80.39","81.3","92.4","102.2","102.21","113.4"],"transcribing":["6.0"],"there":["7.0","27.2","27.3","56.2","56.3","75.0","80.16","90.0"],"s":["7.0","15.2","20.0","27.1","38.1","56.1","61.8","72.6","80.21","85.0","102.3"],"algorithmic":["7.0"],"sortings":["7.0"],"take":["7.0","24.6","57.6"],"things":["7.0","15.3","76.0","80.14","98.0","118.0"],"other":["7.0","15.3","16.0","24.4","25.1","26.2","52.2","53.1","57.4","67.0","80.52","97.0","102.34","108.0","117.0"],"than":["7.0","23.3","55.3","72.3","92.3"],"source":["8.0","15.2","20.0","42.0"],"web":["8.0","27.4","56.4"],"about":["9.0"],"similar":["9.0","72.5","92.2"],"topics":["9.0"],"community":["9.0"],"very":["9.0","73.0","93.0","114.0"],"interested":["9.0"],"various":["9.0","23.6","55.6"],"relate":["9.0"],"together":["9.0"],"talks":["10.0"],"and":["10.0","13.0","22.0","24.9","25.1","27.4","38.2","40.0","53.1","54.0","56.4","57.9","72.0","80.3","80.15","80.39","97.3","102.21","117.3"],"interviews":["10.0"],"later":["10.0","80.37","102.19"],"tone":["10.0"],"control":["10.0","12.0","24.7","57.7"],"servers":["11.0"],"that":["11.0","24.8","26.0","27.0","45.0","52.0","56.0","57.8","62.0","62.1","62.3","72.1","80.6","92.1","113.1"],"still":["11.0","15.2","23.3","24.1","24.7","55.3","57.1","57.7","62.0","80.48","102.30"],"suffer":["11.0"],"from":["11.0","23.4","24.3","26.2","52.2","55.4","57.3","63.0","80.43","80.46","102.25","102.28"],"some":["11.0","15.3","15.4","22.3","23.2","26.0","52.0","54.3","55.2","61.5","80.27","80.32","92.2","102.9","102.14","113.2"],"issues":["11.0","21.0","61.8","80.1"],"centralization":["11.0"],"advantages":["11.0"],"absurdly":["12.0"],"high":["12.0"],"timescale":["12.0"],"become":["12.0","24.10","57.10"],"incredibly":["12.0","22.2","26.2","52.2","54.2"],"useful":["12.0","15.3","69.0"],"making":["12.0","26.2","45.2","52.2","70.2","89.2","97.0","111.2","117.0"],"balance":["12.0"],"changes":["12.0","67.0","70.2","89.2","111.2","113.1"],"testing":["12.0"],"against":["12.0"],"existing":["12.0"],"sets":["12.0"],"screenshot":["12.0"],"mode":["12.0"],"but":["12.0","24.0","27.0","56.0","57.0","62.0","73.0","76.0","77.0","81.4","85.0","92.4","93.0","97.2","98.0","113.4","114.0","117.2","118.0"],"play":["12.0","23.3","55.3"],"removes":["12.0"],"managers":["12.0"],"field":["12.0"],"whatever":["12.0","95.0"],"settings":["12.0"],"allowing":["12.0"],"gds":["12.0"],"test":["12.0"],"freely":["12.0"],"without":["12.0","23.1","55.1","70.0","89.0","92.1","111.0","113.1"],"worrying":["12.0"],"undoing":["12.0"],"afterward":["12.0"],"da1":["12.0"],"png":["12.0"],"puppet":["12.0"],"ported":["12.0"],"rendering":["12.0"],"library":["12.0"],"c":["12.0"],"could":["12.0","24.0","24.6","24.9","47.0","57.0","57.6","57.9","75.0"],"unity":["12.0"],"full":["12.0","30.0","108.0"],"campaign":["12.0"],"cutscenes":["12.0"],"taking":["12.0"],"advantage":["12.0"],"support":["12.0","38.2","80.19","80.27","102.1","102.9"],"commands":["12.0"],"fields":["12.0"],"forest":["13.0"],"knowledge":["13.0"],"hub":["13.0"],"hosted":["14.0","45.3"],"providers":["14.0"],"are":["14.0","80.3","80.29","80.33","80.34","102.11","102.15","102.16"],"not":["14.0","15.2","44.0","59.0","63.0","67.0","74.0","77.0","78.0","80.24","80.34","82.0","86.0","88.0","92.6","94.0","97.1","100.0","102.6","102.16","104.0","107.0","108.0","115.0","117.1"],"enough":["14.0"],"be":["14.0","22.2","22.3","24.5","24.8","54.2","54.3","57.5","57.8","72.3","75.0","80.9","80.56","92.3","92.6","113.5"],"considered":["14.0","24.1","27.1","56.1","57.1"],"theoretical":["15.0"],"non":["15.1","23.0","45.1","55.0","97.0","117.0"],"feasibility":["15.1"],"self":["15.1"],"hosting":["15.1"],"contributing":["15.1"],"federated":["15.1","51.0"],"actually":["15.1"],"having":["15.1","22.2","23.5","24.0","54.2","55.5","57.0"],"all":["15.1","24.0","57.0","62.1","67.0","86.0","88.0"],"upsides":["15.1"],"it":["15.1","15.4","30.0","47.0","72.6","80.52","90.0","92.3","97.0","102.34","113.3","117.0"],"necessary":["15.2"],"supercede":["15.2"],"so":["15.2","27.3","46.0","47.0","56.3","99.0","119.0"],"if":["15.2","15.4","24.2","24.7","27.1","56.1","57.2","57.7","62.0","80.33","92.3","95.0","102.15","113.3"],"breached":["15.2"],"i":["15.2","24.4","57.4"],"ve":["15.2","26.2","52.2"],"added":["15.2","38.2","61.6","80.41","102.23"],"truth":["15.2"],"fails":["15.2"],"key":["15.2","72.0"],"itself":["15.2"],"require":["15.3"],"password":["15.3"],"when":["15.3","23.6","38.1","55.6","67.0","77.0","80.16","80.24","86.0","87.0","90.0","96.0","102.6","108.0","116.0","119.0"],"subscribing":["15.3"],"school":["15.3"],"entity":["15.3"],"wants":["15.3"],"an":["15.3","17.0","21.0","31.0","38.1","41.0","43.0","48.0","71.0","72.1","72.2","80.6","80.9","80.25","91.0","92.1","96.0","102.7","112.0","113.1","113.2"],"flag":["15.4"],"indicate":["15.4"],"updating":["15.4","68.0","80.24","102.6"],"messages":["15.4"],"naturally":["15.4"],"reply":["15.4"],"would":["15.4","24.6","57.6"],"only":["15.4","46.0","80.33","92.4","97.2","102.15","113.4","117.2"],"respected":["15.4"],"matches":["15.4"],"clients":["15.5"],"relays":["15.5"],"respect":["15.5"],"those":["15.5","23.2","24.0","27.1","55.2","56.1","57.0","67.0","73.0","82.0","85.0","86.0","93.0","96.0","99.0","114.0","119.0"],"whitelisted":["15.5"],"moderator":["15.5","15.6"],"extension":["15.5"],"groups":["15.5"],"placed":["15.6"],"on":["15.6","24.2","24.8","38.1","47.0","57.2","57.8","64.0","80.11","80.15","80.42","80.46","80.56","83.0","97.2","102.24","102.28","102.38","103.0","105.0","117.2"],"drive":["15.6"],"at":["15.6","24.3","27.2","38.1","56.2","57.3","68.0","72.2","72.6","90.0","92.2","92.7","113.2","113.7"],"least":["15.6","27.2","56.2","87.0"],"temporarily":["15.6"],"downloaded":["15.6"],"even":["15.6","22.3","54.3","70.0","81.2","89.0","103.2","103.4","111.0"],"you":["15.6","60.0","62.1","62.3"],"follow":["15.6"],"looks":["15.6"],"talk":["16.0","23.5","55.5"],"each":["16.0","27.1","27.3","47.0","56.1","56.3"],"open":["17.0","20.0","42.0","89.1","111.1"],"anything":["18.0"],"wiki":["18.0"],"between":["19.0","23.1","23.3","26.1","52.1","55.1","55.3","72.6","80.10","97.2","117.2"],"displaying":["19.0","80.10"],"recommend":["20.0"],"with":["21.0","22.2","40.0","41.0","45.1","51.0","54.2","60.0","72.2","80.41","81.0","102.23","113.2"],"proposes":["21.0"],"creating":["21.0"],"them":["22.0","23.4","24.2","24.3","47.0","54.0","55.4","57.2","57.3","76.0","77.0","81.0","88.0","98.0","103.0","103.4","118.0"],"convert":["22.0","54.0"],"just":["22.1","24.2","24.6","24.7","54.1","57.2","57.6","57.7"],"html":["22.1","54.1","64.0","66.0","80.17","83.0","105.0","107.0","109.0","114.0"],"add":["22.1","25.0","53.0","54.1","79.0","101.0"],"game":["22.1","23.0","27.0","29.0","50.0","54.1","55.0","56.0","59.0","61.10","72.0","78.0","80.46","90.0","100.0","102.28"],"now":["22.1","54.1","70.2","80.11","80.22","80.31","80.33","102.4","102.13","102.15"],"available":["22.1","51.0","54.1"],"your":["22.1","26.3","52.3","54.1","62.3","92.0","113.0"],"browser":["22.1","54.1"],"choose":["22.1","54.1","70.1","89.1","111.1"],"engine":["22.1","54.1"],"admin":["22.1","54.1"],"privileges":["22.1","54.1"],"tends":["22.2","54.2"],"flood":["22.2","54.2"],"any":["22.2","54.2","72.6","80.17","80.56","81.3","92.7","102.38","113.7"],"ones":["22.2","27.3","54.2","56.3","70.2","73.0","93.0","114.0"],"posted":["22.2","54.2"],"initial":["22.2","54.2"],"played":["22.2","54.2"],"motivating":["22.2","54.2"],"have":["22.3","24.4","30.0","54.3","57.4","80.54","81.4","102.36"],"iap":["22.3","54.3"],"see":["22.3","24.6","54.3","57.6","81.0","103.0"],"level":["22.3","54.3"],"regular":["22.3","54.3","90.0"],"ngu":["22.3","24.10","54.3","57.10"],"idle":["22.3","27.1","54.3","56.1"],"skilling":["22.3","54.3"],"pins":["22.3","54.3"],"large":["22.3","27.4","54.3","56.4","62.0","80.27","102.9"],"part":["22.3","24.3","54.3","57.3","80.34","102.16"],"can":["22.3","33.0","45.3","54.3","60.0","62.1","80.9","80.17","113.5"],"mirrors":["23.0","55.0"],"claim":["23.0","55.0"],"developer":["23.0","55.0"],"cookie":["23.0","23.3","55.0","55.3"],"clicker":["23.0","23.3","55.0","55.3"],"his":["23.0","55.0"],"using":["23.0","27.2","40.0","55.0","56.2","80.27","102.9"],"instead":["23.1","55.1","80.9","103.0","113.3"],"lot":["23.1","24.10","25.1","53.1","55.1","57.10"],"comes":["23.1","27.3","55.1","56.3"],"meta":["23.1","55.1"],"system":["23.1","39.0","55.1","70.2","89.2","111.2"],"which":["23.1","23.4","27.2","55.1","55.4","56.2","81.0","103.0"],"base":["23.1","27.3","55.1","56.3","65.0","84.0","106.0"],"stats":["23.1","55.1"],"increased":["23.1","55.1"],"spending":["23.1","55.1","107.0"],"persists":["23.1","55.1"],"runs":["23.1","55.1"],"technically":["23.1","55.1"],"possible":["23.1","55.1","85.0"],"win":["23.1","55.1"],"indeed":["23.1","23.2","23.6","55.1","55.2","55.6"],"roguelikes":["23.1","55.1"],"challenge":["23.1","55.1","80.19","102.1"],"themselves":["23.1","55.1"],"beating":["23.1","55.1"],"learning":["23.2","55.2"],"improvement":["23.2","55.2"],"over":["23.2","24.11","55.2","57.11"],"span":["23.2","24.2","45.2","55.2","57.2"],"id":["23.2","24.2","45.2","55.2","57.2","80.54","102.36"],"665ceed1":["23.2","55.2"],"72a9":["23.2","55.2"],"49f2":["23.2","55.2"],"dd690f89aee3":["23.2","55.2"],"h2":["23.2","24.2","55.2","57.2"],"addiction":["23.2","55.2"],"reasons":["23.2","55.2"],"why":["23.2","24.1","55.2","57.1"],"may":["23.2","55.2"],"reminded":["23.2","55.2"],"gambling":["23.2","55.2"],"appeals":["23.2","55.2"],"particularly":["23.2","24.1","55.2","57.1"],"prone":["23.2","55.2"],"quite":["23.2","55.2"],"criticized":["23.2","55.2"],"similarity":["23.2","55.2"],"skinner":["23.2","55.2"],"box":["23.2","55.2"],"gone":["23.2","55.2"],"far":["23.2","55.2"],"say":["23.2","24.6","27.4","55.2","56.4","57.6","69.0","110.0"],"commenting":["23.2","23.6","55.2","55.6"],"easier":["23.3","24.1","27.3","55.3","56.3","57.1"],"starcraft":["23.3","55.3"],"probably":["23.3","27.3","55.3","56.3"],"somewhere":["23.3","55.3"],"once":["23.3","55.3"],"progress":["23.3","55.3","92.2"],"sufficiently":["23.3","55.3"],"loop":["23.4","27.3","55.4","56.3","59.0","78.0","100.0"],"helps":["23.4","55.4"],"keep":["23.4","25.0","53.0","55.4","81.0","103.0"],"stagnating":["23.4","55.4"],"wait":["23.5","55.5"],"after":["23.5","27.1","55.5","56.1","66.0","72.5","107.0","109.0","113.6"],"getting":["23.5","24.11","55.5","57.11","60.0"],"hit":["23.5","27.1","38.1","55.5","56.1"],"note":["23.5","55.5"],"arguing":["23.5","55.5"],"cod":["23.5","55.5"],"poorly":["23.5","55.5"],"designed":["23.5","40.0","55.5"],"experiences":["23.5","55.5"],"specifically":["23.5","55.5","73.0","93.0","114.0"],"praising":["23.5","55.5"],"ensuring":["23.5","55.5"],"been":["23.6","27.2","55.6","56.2"],"pointed":["23.6","55.6"],"out":["23.6","45.5","55.6"],"numerous":["23.6","55.6"],"times":["23.6","27.1","55.6","56.1"],"before":["23.6","24.1","55.6","57.1","69.0","110.0"],"excess":["23.6","55.6"],"increasing":["23.6","55.6"],"production":["23.6","55.6"],"beyond":["23.6","55.6"],"reasonable":["23.6","55.6"],"limits":["23.6","55.6","80.30","88.0","102.12"],"devolving":["23.6","55.6"],"sake":["23.6","55.6"],"written":["23.6","55.6"],"comment":["23.6","55.6"],"upon":["23.6","27.3","55.6","56.3"],"concepts":["23.6","55.6"],"capitalism":["23.6","55.6"],"tropes":["23.6","39.0","55.6"],"discussed":["23.6","55.6"],"d":["23.6","24.3","38.1","55.6","57.3"],"argue":["23.6","24.6","55.6","57.6"],"rest":["24.0","57.0"],"implies":["24.0","57.0"],"defined":["24.0","57.0"],"mechanic":["24.0","57.0"],"mechanics":["24.0","24.10","57.0","57.10"],"imply":["24.0","57.0"],"exist":["24.0","57.0"],"many":["24.0","24.4","57.0","57.4","62.0","80.1","85.0"],"skill":["24.0","57.0"],"tree":["24.0","57.0","80.24","80.40","102.6","102.22"],"upgrades":["24.0","57.0","80.51","80.54","102.33","102.36"],"doesn":["24.0","57.0","88.0","110.0"],"make":["24.0","24.1","45.3","57.0","57.1","61.10","80.50","92.4","102.32","102.38","113.3","113.4"],"reduced":["24.1","57.1"],"focus":["24.1","57.1"],"aesthetics":["24.1","57.1"],"often":["24.1","24.7","46.0","57.1","57.7"],"printing":["24.1","57.1"],"state":["24.1","57.1"],"directly":["24.1","57.1","102.37"],"screen":["24.1","57.1"],"text":["24.1","57.1","64.0","72.1","80.2","80.18","80.50","83.0","90.0","92.4","102.32","105.0","113.4"],"makes":["24.1","57.1","70.0","77.0","89.0","99.0","111.0","119.0"],"much":["24.1","27.3","56.3","57.1"],"develop":["24.1","57.1"],"programming":["24.1","57.1"],"skills":["24.1","57.1"],"art":["24.1","43.0","57.1"],"tangent":["24.1","57.1"],"continue":["24.1","57.1"],"my":["24.1","57.1"],"clear":["24.1","57.1"],"love":["24.1","57.1"],"should":["24.1","24.6","57.1","57.6","69.0","103.0","110.0"],"inherently":["24.1","57.1"],"above":["24.1","57.1","72.3","92.3"],"logic":["24.1","27.2","56.2","57.1"],"behavior":["24.1","57.1"],"via":["24.1","57.1"],"reward":["24.1","57.1"],"believe":["24.1","24.4","57.1","57.4"],"real":["24.1","57.1"],"here":["24.1","57.1","75.0"],"empty":["24.1","57.1"],"being":["24.2","24.3","57.2","57.3","61.3","74.0","94.0","115.0"],"distinct":["24.2","57.2"],"sides":["24.2","57.2"],"difference":["24.2","57.2"],"manual":["24.2","57.2"],"vs":["24.2","57.2"],"automatic":["24.2","57.2"],"665cea25":["24.2","57.2"],"437a":["24.2","57.2"],"49a4":["24.2","57.2"],"00422fb9ded1":["24.2","57.2"],"strategies":["24.2","57.2"],"rarer":["24.2","57.2"],"interpretation":["24.2","57.2"],"similarities":["24.2","57.2"],"strategy":["24.2","57.2"],"implying":["24.2","57.2"],"might":["24.2","57.2"],"appealing":["24.3","57.3"],"traits":["24.3","57.3"],"point":["24.3","57.3"],"appropriate":["24.3","57.3"],"consider":["24.3","57.3"],"precludes":["24.3","57.3"],"also":["24.3","43.0","57.3","80.16","80.35","80.46","84.0","102.17","102.28","113.3"],"reveals":["24.3","57.3"],"explicitly":["24.4","28.0","57.4"],"stating":["24.4","57.4"],"how":["24.4","57.4","85.0"],"must":["24.4","57.4","62.0","72.3","92.3"],"qualify":["24.4","57.4"],"definite":["24.4","57.4"],"genres":["24.4","57.4"],"applied":["24.4","57.4","72.1","92.1"],"purposefully":["24.5","57.5"],"avoid":["24.5","57.5"],"narrow":["24.5","57.5"],"or":["24.5","24.7","24.8","45.0","57.5","57.7","57.8","62.2","63.0","80.5","80.38","80.39","80.43","92.2","97.3","102.20","102.21","102.25","103.3","117.3"],"traditional":["24.5","57.5"],"definition":["24.5","24.6","57.5","57.6"],"growing":["24.5","57.5"],"shouldn":["24.5","57.5","92.6"],"t":["24.5","26.1","35.1","52.1","57.5","88.0","92.6","110.0","113.6"],"constrained":["24.5","57.5"],"by":["24.5","57.5","59.0","70.2","78.0","89.2","92.4","95.0","100.0","111.2","113.4"],"contains":["24.6","57.6","92.4","113.4"],"although":["24.6","45.4","57.6"],"someone":["24.6","57.6"],"disagreeing":["24.6","57.6"],"statement":["24.6","57.6","61.7"],"wrt":["24.6","57.6"],"increlution":["24.6","57.6"],"moment":["24.6","57.6"],"hyping":["24.6","57.6"],"specific":["24.6","26.1","26.2","41.0","52.1","52.2","57.6","80.25","102.7"],"we":["24.6","57.6"],"cannot":["24.6","57.6","90.0"],"reduce":["24.6","57.6"],"does":["24.6","57.6","88.0"],"another":["24.7","57.7","75.0","80.28","92.3","102.10","113.3"],"panel":["24.7","57.7"],"plane":["24.7","57.7"],"player":["24.7","27.0","56.0","57.7","65.0","106.0"],"otherwise":["24.8","57.8","92.6"],"replaced":["24.8","57.8","81.0","103.0"],"alternative":["24.8","57.8"],"requires":["24.8","57.8","65.0","84.0","106.0"],"less":["24.8","57.8"],"interaction":["24.8","57.8"],"goal":["24.8","57.8"],"oriented":["24.8","57.8"],"heavily":["24.8","57.8"],"reliant":["24.8","57.8"],"extrinsic":["24.8","57.8"],"motivation":["24.8","57.8"],"typically":["24.8","26.1","37.0","52.1","57.8"],"progression":["24.9","57.9"],"arguably":["24.9","57.9"],"paradigm":["24.9","57.9"],"shift":["24.9","57.9"],"certainly":["24.9","57.9"],"adds":["24.9","57.9","85.0"],"different":["24.10","57.10","62.1"],"progressively":["24.10","57.10"],"stronger":["24.10","24.11","27.3","56.3","57.10","57.11"],"idling":["24.10","57.10"],"rule":["24.10","57.10"],"gods":["24.10","57.10"],"wizard":["24.10","57.10"],"minion":["24.10","57.10"],"polynomial":["24.10","57.10"],"growth":["24.10","57.10"],"characters":["24.11","57.11"],"time":["24.11","30.0","57.11","70.2","80.43","89.2","102.25","111.2"],"while":["24.11","27.2","56.2","57.11"],"few":["24.11","57.11"],"want":["25.0","53.0","62.0","97.1","117.1"],"adding":["25.0","53.0","93.0"],"opinions":["25.0","53.0"],"opposing":["25.0","53.0"],"views":["25.0","53.0"],"devs":["25.1","53.1"],"as":["25.1","53.1","69.0","72.3","80.54","85.0","92.2","92.3","96.0","99.0","102.36","110.0","113.2","119.0"],"well":["25.1","53.1","69.0","80.54","102.36","110.0"],"they":["26.0","26.2","26.3","52.0","52.2","52.3","69.0","110.0"],"re":["26.0","26.2","52.0","52.2","76.0","98.0","118.0"],"welcoming":["26.0","52.0"],"positive":["26.0","52.0"],"constructive":["26.0","52.0"],"criticisms":["26.0","52.0"],"inevitably":["26.0","52.0"],"will":["26.0","27.2","52.0","56.2","82.0","85.0","97.2","110.0","113.6","117.2"],"eventually":["26.0","47.0","52.0"],"read":["26.0","26.1","52.0","52.1"],"potentially":["26.0","52.0"],"comments":["26.0","52.0"],"deeply":["26.0","52.0"],"made":["26.1","28.0","52.1","76.0","80.2","80.40","98.0","102.22","118.0"],"equal":["26.1","52.1"],"don":["26.1","27.4","52.1","56.4"],"need":["26.1","27.0","41.0","52.1","56.0","70.0","73.0","89.0","93.0","111.0","114.0"],"feel":["26.1","52.1"],"compelled":["26.1","52.1"],"obey":["26.1","52.1"],"every":["26.1","45.4","52.1","73.0","89.2","93.0","111.2","114.0"],"piece":["26.1","52.1"],"receive":["26.1","52.1"],"learn":["26.1","52.1"],"distinguish":["26.1","52.1"],"unhelpful":["26.1","52.1"],"offers":["26.1","52.1"],"collecting":["26.2","52.2"],"helpful":["26.2","52.2"],"regularly":["26.3","52.3"],"remind":["26.3","52.3"],"yourself":["26.3","52.3"],"celebrate":["26.3","52.3"],"successes":["26.3","52.3"],"no":["26.3","52.3","72.0","85.0"],"matter":["26.3","52.3"],"small":["26.3","27.4","52.3","56.4"],"engage":["27.0","56.0"],"truly":["27.0","56.0"],"understand":["27.0","27.1","56.0","56.1"],"contextualize":["27.0","56.0"],"means":["27.0","56.0","62.0"],"affects":["27.0","56.0"],"gameplay":["27.0","56.0"],"experience":["27.0","56.0"],"clarify":["27.0","56.0"],"purpose":["27.0","56.0"],"takes":["27.1","56.1"],"going":["27.1","56.1"],"has":["27.1","56.1","80.37","102.19"],"list":["27.1","56.1","92.6"],"goals":["27.1","56.1"],"then":["27.1","27.2","56.1","56.2"],"understanding":["27.1","56.1"],"short":["27.1","27.2","56.1","56.2"],"achieving":["27.1","56.1"],"mainly":["27.2","56.2"],"criticizing":["27.2","56.2"],"introduced":["27.2","56.2"],"fact":["27.2","56.2"],"defend":["27.2","56.2"],"normal":["27.2","56.2","75.0","116.0"],"pre":["27.2","56.2"],"infinity":["27.2","56.2"],"had":["27.2","56.2"],"looking":["27.2","56.2","72.6","92.7","113.7"],"affordable":["27.2","56.2"],"next":["27.2","56.2","59.0","78.0","97.1","100.0","117.1"],"choosing":["27.2","56.2"],"manages":["27.3","56.3"],"becoming":["27.3","56.3"],"unmanageable":["27.3","56.3"],"continues":["27.3","56.3"],"good":["27.3","56.3","77.0","81.4","92.7","99.0","113.7","119.0"],"fine":["27.3","56.3","73.0","93.0","114.0"],"justification":["27.3","56.3"],"building":["27.3","56.3"],"layer":["27.3","39.0","56.3","80.21","97.0","102.3","117.0"],"essentially":["27.3","56.3"],"lets":["27.3","56.3","88.0","108.0"],"start":["27.3","56.3"],"needing":["27.3","56.3"],"think":["27.3","56.3"],"ideas":["27.3","56.3"],"conform":["27.3","56.3"],"original":["27.3","47.0","56.3"],"problem":["27.3","56.3"],"justified":["27.3","56.3"],"easy":["27.3","56.3"],"implement":["27.3","56.3","72.1","92.1","113.1"],"first":["27.3","56.3","72.6","74.0","80.57","92.3","92.6","92.7","94.0","113.3","113.7","115.0"],"off":["27.3","56.3"],"neutral":["27.3","56.3"],"cycle":["27.3","56.3"],"towards":["27.3","56.3"],"amount":["27.4","56.4","65.0","84.0","106.0","110.0"],"new":["27.4","38.2","56.4","70.2","81.2","103.2"],"currency":["27.4","56.4","69.0","80.21","84.0","102.3"],"applicable":["27.4","56.4"],"effects":["27.4","56.4","69.0","80.34","102.16"],"definitively":["27.4","56.4"],"me":["28.0"],"the":["28.0","37.0","39.0","72.0","80.30","80.48","80.49","102.12","102.30","102.31","103.4"],"indie":["29.0"],"intention":["30.0"],"completing":["30.0"],"however":["30.0"],"software":["33.0"],"show":["33.0"],"websites":["34.0","51.0"],"social":["35.0","35.2"],"kronos":["35.0"],"opti":["35.0"],"speech":["35.0"],"several":["35.1","95.0"],"development":["35.1","50.0"],"aren":["35.1","92.6","113.6"],"babble":["35.2"],"code":["37.0","72.4","75.0","89.2","92.5","97.3","111.2","116.0","117.3"],"publicly":["37.0"],"accessible":["37.0"],"alongside":["38.0","73.0"],"scientific":["38.0"],"paper":["38.0"],"hitting":["38.1"],"virtual":["38.1"],"target":["38.1"],"sphere":["38.1"],"located":["38.1"],"alveolar":["38.1"],"ridge":["38.1"],"consonant":["38.1"],"e":["38.1","50.0","74.0","80.54","81.0","94.0","102.36","103.0","115.0"],"g":["38.1","50.0","74.0","80.54","81.0","94.0","102.36","103.0","115.0"],"n":["38.1"],"features":["38.2","80.17","80.25","102.7"],"additional":["38.2"],"ema":["38.2"],"systems":["38.2"],"tv":["39.0"],"around":["40.0"],"vue":["40.0"],"reactivity":["40.0"],"intent":["40.0"],"users":["41.0"],"pick":["41.0"],"associating":["41.0"],"identity":["41.0","51.0"],"group":["41.0","81.4"],"people":["41.0","47.0"],"forms":["43.0"],"perhaps":["43.0"],"important":["43.0","93.0"],"commentary":["43.0"],"parasocial":["43.0"],"indexable":["44.0"],"marketers":["45.0"],"comparable":["45.0"],"cozy":["45.0"],"way":["45.0","81.2","86.0","103.2"],"commercial":["45.1"],"content":["45.1","72.2","75.0","92.2","113.2"],"sites":["45.2"],"look":["45.2"],"too":["45.2","80.30","102.12"],"homogenized":["45.2"],"665b6ac0":["45.2"],"d3ca":["45.2"],"41d8":["45.2"],"solves":["45.3"],"described":["45.3","72.3","92.3"],"hey":["45.3"],"creators":["45.3"],"please":["45.3"],"firehoses":["45.3"],"post":["45.4"],"change":["45.4","77.0","95.0"],"garden":["45.4"],"static":["45.5"],"cheap":["45.5"],"plenty":["45.5"],"free":["45.5"],"options":["45.5"],"allowfullscreen":["45.6"],"pages":["46.0"],"private":["46.0"],"especially":["46.0"],"journal":["46.0"],"ll":["46.0"],"push":["46.0"],"updates":["46.0"],"site":["46.0"],"folder":["47.0"],"displays":["47.0","108.0"],"button":["47.0","71.0","87.0","91.0","112.0"],"plans":["47.0"],"were":["47.0"],"put":["47.0","69.0","110.0"],"steam":["47.0"],"workshop":["47.0"],"ivy":["49.0"],"road":["49.0"],"topic":["50.0"],"bunch":["50.0"],"libraries":["50.0"],"shared":["50.0"],"design":["50.0"],"allows":["50.0"],"smaller":["50.0"],"personal":["51.0"],"purchase":["59.0","78.0","100.0"],"generation":["59.0","78.0","100.0"],"points":["59.0","78.0","80.40","99.0","100.0","102.22"],"happens":["59.0","76.0","78.0","98.0","100.0","118.0"],"main":["59.0","78.0","97.1","100.0","117.1"],"update":["59.0","78.0","80.4","90.0","100.0"],"enabled":["59.0","78.0","100.0"],"tmt":["60.0","73.0","80.46","93.0","102.28","114.0"],"refactorings":["61.1"],"08":["61.2","61.4"],"fixed":["61.2","61.5","80.4","80.12","80.23","80.24","80.35","80.36","80.44","80.52","80.54","102.5","102.6","102.17","102.18","102.26","102.34","102.36"],"lines":["61.3"],"hidden":["61.3"],"visual":["61.5","95.0"],"bugs":["61.5","80.52","102.34"],"everything":["61.6","70.0","70.1","89.0","89.1","109.0","111.0","111.1"],"moved":["61.7","80.46","102.28"],"milestones":["61.7","80.51","102.33"],"early":["61.10"],"really":["62.0"],"uses":["62.0"],"break":["62.0"],"eternity":["62.0"],"store":["62.0","73.0","93.0","114.0"],"values":["62.0","63.0","68.0","69.0","71.0","80.47","91.0","96.0","102.29","110.0","112.0"],"numbers":["62.0","80.10","80.27","102.9"],"decimal":["62.0","88.0"],"objects":["62.0"],"properties":["62.1"],"give":["62.1"],"custom":["62.1","92.4","113.4"],"used":["62.2","72.3","80.56","92.3","102.38","103.3"],"enhancers":["62.2","103.3"],"space":["62.2","80.41","102.23","103.3"],"buildings":["62.2","103.3"],"clickables":["62.2","81.3","103.3"],"tabs":["62.3","81.2","103.2"],"microtab":["62.3","75.0","80.38","102.20","116.0"],"bonuses":["63.0","68.0","72.1","92.1","113.1"],"return":["63.0"],"value":["63.0","65.0","68.0","72.4","92.5","97.3","103.0","113.5","113.6","117.3"],"object":["63.0","71.0","72.1","91.0","92.1","92.5","96.0","112.0","113.1"],"containing":["63.0","68.0","72.1","92.1","113.1"],"multiple":["63.0","68.0","72.1","92.1","113.1"],"unlocked":["63.0","64.0","66.0","67.0","80.29","83.0","92.3","92.6","102.11","105.0","107.0","108.0","109.0","113.3"],"bool":["63.0","64.0","66.0","67.0","72.3","77.0","83.0","86.0","87.0","104.0","105.0","107.0","108.0","109.0"],"oncomplete":["63.0","67.0","82.0","86.0","104.0","108.0"],"called":["63.0","67.0","77.0","82.0","86.0","87.0","104.0","108.0","119.0"],"completed":["63.0","80.31","82.0","102.13","104.0"],"style":["63.0","82.0","85.0","87.0","96.0","99.0","104.0","116.0","119.0"],"applies":["63.0","81.0","82.0","85.0","87.0","96.0","99.0","103.0","104.0","116.0","119.0"],"css":["63.0","82.0","85.0","87.0","92.5","96.0","99.0","104.0","116.0","119.0"],"displayed":["64.0","68.0","80.33","83.0","102.15","105.0"],"top":["64.0","68.0","72.2","83.0","92.2","105.0","113.2"],"returning":["64.0","67.0","83.0","105.0","109.0"],"determine":["64.0","66.0","83.0","87.0","105.0","107.0","109.0"],"visible":["64.0","66.0","67.0","77.0","83.0","86.0","87.0","90.0","105.0","107.0","108.0","109.0"],"default":["64.0","80.34","102.16"],"current":["65.0","72.1","84.0","92.1","106.0","113.1"],"needed":["65.0","84.0","106.0"],"likely":["66.0","107.0","109.0"],"including":["66.0","107.0"],"description":["66.0","72.1","107.0"],"basic":["66.0","107.0","109.0"],"canafford":["66.0"],"buy":["66.0","113.6"],"implements":["66.0","87.0","107.0"],"its":["67.0","69.0","80.20","102.2"],"previously":["67.0","80.30","86.0","102.12","108.0"],"incomplete":["67.0","86.0","108.0"],"countsas":["67.0","86.0","108.0"],"combines":["67.0","86.0","108.0"],"array":["67.0","73.0","86.0","93.0","108.0","114.0"],"ids":["67.0","80.47","86.0","92.6","102.29","108.0"],"effectively":["67.0","86.0"],"etc":["68.0"],"title":["68.0"],"larger":["68.0"],"font":["68.0"],"returns":["68.0","72.1","90.0","92.1","92.6","113.1"],"calculates":["68.0","72.1","92.1","113.1"],"columns":["69.0"],"resource":["69.0","92.1","113.1"],"based":["69.0","80.46","102.28","109.0","110.0"],"best":["69.0","80.19","80.33","80.39","102.1","102.15","102.21","110.0"],"total":["69.0","80.29","80.33","80.39","102.11","102.15","102.21","110.0"],"startdata":["69.0","110.0"],"string":["69.0","72.4","92.5","110.0","113.5"],"touching":["70.0","89.0","111.0"],"command":["70.0","89.0","111.0"],"line":["70.0","89.0","111.0"],"benefits":["70.0","89.0","111.0"],"ignore":["70.1","89.1","111.1"],"else":["70.1","89.1","111.1"],"clone":["70.1","89.1","111.1"],"repository":["70.1","89.1","111.1"],"basically":["70.1","89.1","89.2","111.1","111.2"],"page":["70.2"],"go":["70.2","89.2","111.2"],"back":["70.2","89.2","111.2"],"git":["70.2","89.2","111.2"],"commit":["70.2","89.2","111.2"],"form":["71.0","82.0","85.0","91.0","96.0","99.0","104.0","112.0","116.0","119.0"],"where":["71.0","85.0","91.0","92.5","112.0"],"keys":["71.0","82.0","85.0","91.0","96.0","99.0","104.0","112.0","119.0"],"attributes":["71.0","82.0","85.0","91.0","96.0","99.0","104.0","112.0","119.0"],"strings":["72.0","85.0","88.0","96.0","99.0","119.0"],"styling":["72.0","80.18"],"color":["72.0","72.4","113.5"],"label":["72.0"],"required":["72.0","84.0","113.3"],"resetting":["72.1","92.1","113.1"],"effect":["72.1","80.15","92.1","113.1"],"inherent":["72.1","92.1","113.1"],"effectdescription":["72.1","92.1"],"stays":["72.1"],"constant":["72.1","80.34","102.16"],"clicked":["72.2"],"sometimes":["72.2","72.3","92.3"],"microtabs":["72.2","80.12"],"area":["72.2","113.2"],"functions":["72.2","73.0","80.15","93.0","103.0","113.2","114.0"],"like":["72.2","77.0","99.0","113.2","119.0"],"set":["72.2","74.0","94.0","108.0","113.2","115.0"],"subtabs":["72.2","80.20","102.2","113.2"],"changing":["72.2","92.1","92.2","109.0","113.1","113.2"],"within":["72.2","92.2","113.2"],"advanced":["72.2","92.2","113.2"],"unlockorder":["72.3","92.3","92.6","113.3"],"layers":["72.3","73.0","80.45","92.3","93.0","102.27","114.0"],"absent":["72.3","92.3"],"greater":["72.3","92.3"],"roundupcost":["72.3"],"true":["72.3","85.0","113.6"],"needs":["72.3","77.0"],"rounded":["72.3"],"consisting":["72.4","97.3","113.5","117.3"],"either":["72.4","92.5","97.3","113.5","117.3"],"hex":["72.4","80.47","92.5","102.29","113.5"],"since":["72.5"],"last":["72.5","113.6"],"suggestion":["72.5"],"addpoints":["72.5"],"gain":["72.5","80.21","92.1","102.3","110.0","113.1"],"generating":["72.5"],"automatically":["72.5","80.15","80.29","102.11"],"amounts":["72.5"],"automate":["72.5","113.6"],"activate":["72.5","92.6","113.6"],"autobuyers":["72.5"],"auto":["72.5","74.0","94.0","115.0"],"resets":["72.5","80.11","92.6"],"differentiate":["72.6"],"requirement":["72.6","92.7","113.7"],"donotcallthesefunctionseverytick":["73.0","93.0","114.0"],"calls":["73.0","93.0","114.0"],"function":["73.0","80.26","93.0","102.8","114.0"],"anywhere":["73.0","93.0","114.0"],"tick":["73.0","93.0","114.0"],"result":["73.0","93.0","114.0"],"unless":["73.0","93.0","114.0"],"told":["73.0","93.0","114.0"],"do":["73.0","93.0","99.0","114.0","119.0"],"action":["73.0","93.0","114.0"],"identified":["73.0","93.0","114.0"],"official":["73.0","93.0","114.0"],"documentation":["73.0","80.17","93.0","114.0"],"names":["73.0","93.0","114.0"],"internal":["74.0","94.0","115.0"],"name":["74.0","94.0","99.0","115.0","119.0"],"toggled":["74.0","94.0","115.0"],"stored":["74.0","94.0","115.0"],"second":["74.0","94.0","115.0"],"variable":["74.0","94.0","115.0"],"b":["74.0","94.0","115.0"],"tip":["74.0","94.0","115.0"],"de":["74.0","94.0","115.0"],"both":["75.0","76.0","85.0","92.7","98.0","99.0","113.7","116.0","118.0","119.0"],"layout":["75.0","81.2","103.2","116.0"],"conflicts":["76.0","98.0","118.0"],"tools":["76.0","98.0","118.0"],"resolve":["76.0","98.0","118.0"],"conflict":["76.0","98.0","118.0"],"trying":["76.0","98.0","118.0"],"onpurchase":["77.0"],"purchased":["77.0","99.0","119.0"],"act":["77.0","99.0","119.0"],"include":["77.0","88.0","110.0"],"speed":["80.3"],"dir":["80.3"],"updated":["80.3"],"more":["80.4","81.0","81.3"],"quickly":["80.4","89.2","111.2"],"collectables":["80.5"],"example":["80.5","81.3"],"marked":["80.5","85.0"],"feature":["80.5","80.26","102.8"],"buyables":["80.5"],"exploit":["80.6"],"let":["80.6"],"variety":["80.7"],"tabformat":["80.7"],"related":["80.7"],"node":["80.9","80.15"],"image":["80.9","80.25","82.0","102.7","104.0"],"challenges":["80.10","80.51","88.0","102.33"],"improved":["80.10"],"0001":["80.10"],"kept":["80.11"],"display":["80.13","80.18","80.50","92.2","102.32","113.2"],"extremely":["80.13"],"dynamic":["80.14"],"same":["80.15","81.4","99.0","119.0"],"customizable":["80.15","80.40","92.2","102.22"],"glowcolor":["80.15"],"purchaselimit":["80.15","85.0"],"supplied":["80.15"],"cost":["80.15"],"locked":["80.15"],"appearing":["80.16"],"supply":["80.17"],"rows":["80.17","80.25","88.0","102.7","110.0"],"cols":["80.17"],"big":["80.17","80.54","102.36"],"symbols":["80.17"],"bulk":["80.19","102.1"],"completions":["80.19","102.1"],"layershown":["80.22","102.4"],"optional":["80.22","81.2","83.0","90.0","96.0","102.4","103.2","105.0","116.0"],"branches":["80.24","97.2","102.6","117.2"],"scrolling":["80.24","102.6"],"textstyle":["80.25","102.7"],"achievements":["80.25","80.34","88.0","102.7","102.16"],"argument":["80.25","102.7"],"formulas":["80.26","102.8"],"displayrow":["80.26","102.8","113.1"],"better":["80.27","102.9"],"attempt":["80.28","102.10","113.6"],"fix":["80.28","102.10"],"always":["80.29","102.11"],"1000x":["80.30","102.12"],"overrides":["80.31","102.13","108.0"],"already":["80.31","102.13"],"unclickable":["80.32","102.14"],"circumstances":["80.32","102.14"],"bit":["80.33","102.15"],"present":["80.33","102.15"],"format":["80.34","102.16"],"nan":["80.34","102.16"],"nodes":["80.35","97.0","102.17","117.0"],"thanks":["80.35","102.17"],"blank":["80.35","102.17"],"breaking":["80.35","80.43","102.17","102.25"],"subtab":["80.38","102.20"],"changed":["80.38","102.20"],"fixes":["80.38","102.20"],"tab":["80.40","80.43","102.22","102.25"],"below":["80.40","102.22"],"endgame":["80.40","102.22"],"condition":["80.40","102.22"],"sell":["80.40","102.22"],"up":["80.41","102.23"],"ghost":["80.41","102.23"],"visibility":["80.41","102.23"],"buttons":["80.42","81.4","102.24"],"prevent":["80.43","102.25"],"offline":["80.43","102.25"],"switching":["80.43","102.25"],"crash":["80.44","102.26"],"side":["80.45","102.27"],"modinfo":["80.46","102.28"],"spot":["80.46","102.28"],"discord":["80.46","102.28"],"link":["80.46","102.28"],"changelog":["80.46","102.28"],"separate":["80.46","93.0","102.28"],"mod":["80.46","102.28"],"version":["80.46","102.28"],"structure":["80.46","102.28"],"created":["80.47","102.29"],"keeping":["80.48","102.30"],"standard":["80.48","93.0","102.30"],"order":["80.49","92.1","102.31","113.1"],"unlockable":["80.50","102.32"],"components":["80.51","102.33"],"plus":["80.51","102.33"],"individual":["80.51","80.54","102.33","102.36"],"upgeffect":["80.51","102.33"],"buyableeffect":["80.51","102.33"],"highlight":["80.52","102.34"],"ways":["80.52","102.34"],"save":["80.54","102.36"],"issue":["80.54","102.36"],"define":["80.55","90.0"],"hotkeys":["80.55","102.37"],"component":["80.56","102.38"],"y":["81.0","95.0","103.0"],"mind":["81.0","103.0"],"operators":["81.0","103.0"],"gt":["81.0","103.0"],"gte":["81.0","103.0"],"lt":["81.0","103.0"],"lte":["81.0","103.0"],"eq":["81.0","103.0"],"neq":["81.0","103.0"],"docs":["81.0"],"details":["81.0"],"working":["81.0"],"create":["81.2","103.2"],"entirely":["81.2","103.2"],"generalized":["81.3"],"variant":["81.3"],"md":["81.4"],"behave":["81.4"],"data":["81.4"],"puts":["82.0","104.0"],"given":["82.0","104.0"],"url":["82.0","104.0"],"relative":["82.0","104.0"],"absolute":["82.0","104.0"],"unlock":["84.0","113.3"],"limit":["85.0"],"mark":["85.0"],"corner":["85.0"],"star":["85.0"],"onenter":["86.0"],"entering":["86.0"],"onexit":["86.0"],"exiting":["86.0"],"canclick":["87.0","109.0"],"onclick":["87.0"],"clicking":["87.0"],"onhold":["87.0"],"20x":["87.0"],"sec":["87.0"],"held":["87.0"],"seconds":["87.0"],"works":["88.0"],"decimals":["88.0"],"slider":["88.0"],"user":["88.0"],"element":["88.0","97.3","113.5","117.3"],"min":["88.0"],"max":["88.0"],"work":["88.0"],"easily":["89.2","111.2"],"maximum":["90.0"],"increase":["90.0"],"though":["90.0","92.0","113.0"],"creates":["90.0"],"position":["90.0"],"gettitle":["90.0"],"these":["92.0","113.0"],"special":["92.0","113.0"],"functionality":["92.0","113.0"],"bars":["92.2","113.2"],"information":["92.2","113.2"],"bar":["92.2"],"gague":["92.2"],"highly":["92.2"],"harder":["92.3","113.3"],"entirety":["92.4","113.4"],"usable":["92.4","113.4"],"number":["92.5","97.3","103.0","117.3"],"theme":["92.5"],"affected":["92.5"],"colors":["92.5"],"nodestyle":["92.5"],"automation":["92.6","113.6"],"supported":["92.6"],"resetsnothing":["92.6"],"trigger":["92.6"],"increaseunlockorder":["92.6"],"yet":["92.6"],"increases":["92.6"],"supporting":["92.7","113.7"],"file":["93.0"],"index":["93.0"],"examples":["93.0","114.0"],"becomes":["94.0","115.0"],"centered":["95.0"],"rotation":["95.0"],"starting":["95.0"],"accelerate":["95.0"],"downwards":["95.0"],"x":["95.0"],"coordinates":["95.0"],"whole":["96.0","116.0"],"switched":["96.0","116.0"],"buttonstyle":["96.0"],"explained":["97.1","117.1"],"section":["97.1","117.1"],"additionally":["97.1","117.1"],"assigned":["99.0","119.0"],"automagically":["99.0","119.0"],"plain":["103.0"],"perform":["103.0"],"operations":["103.0"],"inside":["103.4"],"embed":["103.4"],"baseamount":["106.0"],"appropriately":["108.0"],"formatted":["108.0"],"fulldisplay":["108.0"],"override":["108.0","113.1"],"descriptions":["108.0"],"autoupgrade":["113.6"],"boolean":["113.6"],"defaults":["113.6"],"false":["113.6"]},{"1":["72.4","80.10","86.0","108.0","113.5"],"2":["113.3"],"3":["72.4","113.5"],"5":["65.0","70.1","84.0","89.1","106.0","111.1"],"6":["76.0","89.2","98.0","111.2","118.0"],"7":["70.2"],"10":["95.0"],"18":["0.0"],"9534":["45.2"],"ivy":["0.0"],"road":["0.0"],"kronos":["0.0"],"logseq":["0.0"],"matrix":["0.0"],"mbin":["0.0"],"my":["0.0","15.2","27.0","27.3","56.0","56.3"],"personal":["0.0"],"website":["0.0","15.2"],"projects":["0.0"],"nostr":["0.0","15.1"],"protocol":["1.0","16.0","32.0","36.0"],"for":["1.0","8.0","13.0","24.7","36.0","43.0","44.0","45.2","57.7","70.1","80.41","80.48","89.1","92.5","95.0","97.3","102.23","102.30","111.1","113.3","117.3"],"super":["2.0"],"happy":["2.0","47.0"],"with":["2.0","24.5","24.7","26.1","27.0","27.2","46.0","50.0","52.1","56.0","56.2","57.5","57.7","61.5","80.1","80.11","80.20","80.42","80.47","80.52","80.54","102.2","102.24","102.29","102.34","102.36"],"how":["2.0","21.0","24.6","26.2","50.0","52.2","57.6","60.0","80.10","95.0"],"turned":["2.0"],"out":["2.0","23.2","55.2","70.2"],"ended":["2.0"],"up":["2.0","72.1","72.3","80.15","92.1","92.3","113.1"],"being":["2.0","15.1","23.3","24.8","55.3","57.8","61.8","80.48","102.30"],"way":["2.0","62.1","92.2"],"more":["2.0","24.2","47.0","57.2","60.0","62.2","80.34","81.4","95.0","102.16","103.0","103.3"],"ambitious":["2.0"],"other":["3.0","15.5","24.5","24.9","47.0","57.5","57.9","61.5","80.54","92.2","102.36"],"protocols":["3.0","15.1"],"so":["4.0","22.1","23.3","26.1","45.3","52.1","54.1","55.3","63.0","66.0","82.0","85.0","104.0","107.0","108.0"],"could":["4.0","21.0","45.4","50.0"],"be":["4.0","72.0","80.26","92.1","102.8","113.1","113.3"],"used":["4.0","65.0","84.0","92.6","95.0","106.0","113.3"],"stuff":["4.0"],"like":["4.0","46.0","70.1","89.1","89.2","111.1","111.2"],"cutscenes":["4.0"],"ported":["4.0"],"engine":["4.0"],"c":["4.0"],"college":["5.0"],"s":["5.0","15.3","15.6","49.0","63.0","66.0","80.39","82.0","102.21","104.0","107.0"],"final":["5.0","12.0"],"project":["5.0","89.1","111.1"],"branching":["6.0"],"conversations":["6.0"],"into":["6.0","7.0","22.0","23.2","24.11","27.2","40.0","54.0","55.2","56.2","57.11","93.0"],"linear":["6.0"],"timelines":["6.0"],"account":["7.0"],"displays":["7.0"],"are":["7.0","24.3","24.5","57.3","57.5"],"less":["7.0","23.1","23.5","55.1","55.5","80.34","102.16"],"suitable":["7.0"],"as":["7.0","24.0","45.0","57.0","63.0","72.2","80.3","80.31","82.0","102.13","104.0","113.3","116.0"],"client":["8.0"],"common":["9.0","24.1","57.1"],"themes":["9.0"],"here":["9.0","97.2","117.2"],"want":["9.0","73.0","93.0","114.0"],"these":["9.0","22.2","24.5","54.2","57.5","81.3","92.3"],"things":["9.0","12.0","27.2","56.2","80.1"],"decentralized":["9.0","15.1"],"freeform":["9.0","45.0"],"re":["9.0","24.3","45.3","57.3","80.15"],"building":["9.0"],"make":["9.0","46.0","80.56","92.0","92.6","113.0"],"several":["9.0","24.1","27.3","56.3","57.1"],"i":["10.0","24.9","57.9"],"played":["10.0"],"over":["11.0"],"data":["11.0"],"ownership":["11.0"],"increased":["11.0"],"privacy":["11.0"],"rules":["11.0"],"follow":["11.0"],"can":["11.0","23.2","23.4","55.2","55.4","70.0","80.22","80.30","89.0","97.1","102.4","102.12","111.0","117.1"],"fully":["11.0","27.3","56.3"],"talking":["12.0"],"giving":["12.0"],"starting":["12.0"],"controlling":["12.0"],"progression":["12.0"],"story":["12.0"],"action":["12.0"],"wheel":["12.0"],"ends":["12.0"],"command":["12.0"],"either":["12.0","81.0"],"set":["12.0","69.0","88.0","95.0","110.0"],"next":["12.0","24.2","27.4","56.4","57.2","76.0","77.0","98.0","118.0"],"latter":["12.0","26.1","52.1"],"case":["12.0","74.0","94.0","115.0"],"additional":["12.0","24.1","57.1","85.0"],"call":["12.0","21.0"],"location":["12.0"],"takes":["12.0","24.0","57.0"],"place":["12.0","76.0","98.0","118.0"],"added":["12.0","80.16"],"save":["12.0"],"file":["12.0","76.0","98.0","118.0"],"city":["12.0"],"locations":["12.0"],"greyed":["12.0"],"until":["12.0","46.0"],"have":["12.0","14.0","15.1","15.2","15.6","23.3","24.6","55.3","57.6","62.0","80.46","92.6","97.2","102.28","117.2"],"least":["12.0"],"do":["12.0","24.2","46.0","57.2","63.0","82.0","85.0","104.0","107.0","108.0"],"populated":["12.0"],"range":["12.0"],"acceptable":["12.0"],"angles":["12.0"],"resources":["13.0"],"creating":["13.0"],"them":["13.0","24.4","24.11","57.4","57.11","99.0","110.0","119.0"],"https":["13.0"],"github":["13.0"],"oidc":["14.0"],"oauth":["14.0"],"require":["14.0"],"service":["14.0"],"owner":["14.0","15.2"],"successor":["15.0"],"to":["15.0","35.1","37.0","38.1","75.0","80.44","102.26"],"should":["15.1","21.0","72.1","92.1","92.6","96.0","113.1"],"theoretically":["15.1"],"by":["15.1","22.3","24.2","45.3","54.3","57.2","62.0","80.5","80.9","86.0","92.0","113.0"],"virtue":["15.1","16.0"],"commune":["15.1"],"community":["15.1","28.0"],"existing":["15.1"],"atproto":["15.1"],"lot":["15.1","24.5","57.5"],"m":["15.2","27.0","27.3","56.0","56.3","79.0","101.0"],"just":["15.2","24.3","57.3"],"thepaperpilot":["15.2"],"communication":["15.2"],"sufficient":["15.2"],"nameserver":["15.2"],"saying":["15.2"],"publickey":["15.2"],"site":["15.2","45.3"],"write":["15.2"],"paper":["15.2"],"at":["15.2","15.5","27.1","56.1","81.0","86.0"],"scientific":["15.2"],"journal":["15.2"],"internal":["15.3","67.0","77.0","99.0","119.0"],"social":["15.3","50.0"],"network":["15.3"],"ways":["15.3"],"subscribe":["15.3"],"all":["15.3","23.6","24.2","55.6","57.2","69.0","80.22","80.40","81.0","85.0","92.4","102.4","102.22","103.0","108.0","110.0","113.4"],"relay":["15.3"],"hears":["15.3"],"about":["15.3"],"new":["15.3","24.3","57.3","62.0"],"same":["15.4","63.0","66.0","76.0","80.46","82.0","85.0","98.0","102.28","104.0","107.0","109.0","118.0"],"creator":["15.4","23.6","55.6"],"servers":["15.4"],"replace":["15.4"],"original":["15.4"],"entirely":["15.4"],"one":["15.4","40.0","43.0"],"its":["15.4","22.3","54.3","72.1","92.1","113.1"],"edited":["15.4"],"granting":["15.5"],"removing":["15.5"],"ids":["15.5","72.5","113.6"],"level":["15.5"],"people":["15.5","26.3","52.3"],"setup":["15.5"],"accounts":["15.5"],"their":["15.5","23.3","35.1","47.0","55.3","95.0"],"desired":["15.5"],"heuristic":["15.5"],"sending":["15.5"],"such":["15.5","24.1","24.8","57.1","57.8"],"there":["15.6","22.1","24.0","54.1","57.0","80.25","102.7"],"delay":["15.6"],"between":["15.6","81.3"],"receiving":["15.6"],"initial":["15.6"],"message":["15.6"],"bots":["15.6"],"delete":["15.6"],"download":["15.6"],"spam":["15.6","27.1","56.1"],"shared":["16.0"],"source":["17.0","48.0"],"code":["17.0","47.0","76.0","98.0","113.5","118.0"],"style":["18.0","33.0","66.0","74.0","75.0","86.0","92.2","94.0","107.0","108.0","109.0","115.0"],"considered":["18.0"],"information":["19.0","60.0","72.1","72.2","80.38","92.1","102.20"],"in":["19.0","24.2","57.2","60.0","61.7","76.0","80.14","80.17","80.27","80.33","80.38","98.0","102.9","102.15","102.20","118.0"],"the":["20.0","30.0","41.0","62.3","80.36","80.56","102.18","102.38"],"tv":["20.0"],"tropes":["20.0"],"page":["20.0","27.0","39.0","56.0"],"on":["20.0","39.0","51.0","62.0","80.10","80.21","80.24","92.2","102.3","102.6"],"which":["21.0","23.6","55.6","59.0","72.4","78.0","80.26","85.0","92.5","99.0","100.0","102.8","113.5","119.0"],"they":["21.0","45.3"],"grdn":["21.0"],"work":["21.0","24.8","57.8","70.0","80.10","80.31","89.0","89.2","102.13","111.0","111.2"],"players":["22.0","22.3","23.2","23.3","23.4","54.0","54.3","55.2","55.3","55.4"],"let":["22.0","27.1","54.0","56.1"],"hell":["22.1","54.1"],"dedicated":["22.1","54.1"],"even":["22.1","54.1"],"computer":["22.1","54.1","70.1","89.1","111.1"],"tools":["22.1","54.1"],"development":["22.1","54.1"],"that":["22.1","22.2","24.5","30.0","40.0","41.0","54.1","54.2","57.5","80.9","81.3"],"run":["22.1","54.1"],"itself":["22.1","54.1"],"makes":["22.2","24.0","54.2","57.0"],"quite":["22.2","23.5","24.6","27.0","27.2","54.2","55.5","56.0","56.2","57.6"],"clear":["22.2","54.2"],"expect":["22.2","54.2"],"communities":["22.2","54.2"],"both":["22.2","33.0","54.2","63.0","66.0","71.0","72.6","82.0","86.0","87.0","91.0","104.0","107.0","108.0","109.0","112.0"],"explained":["22.3","54.3"],"hyper":["22.3","54.3"],"aware":["22.3","54.3"],"addictive":["22.3","23.2","54.3","55.2"],"nature":["22.3","54.3"],"genre":["22.3","54.3"],"susceptibility":["22.3","54.3"],"exploiting":["22.3","54.3"],"however":["22.3","54.3"],"is":["22.3","30.0","45.0","54.3","71.0","80.19","80.21","81.3","91.0","102.1","102.3","112.0"],"norm":["22.3","54.3"],"it":["23.0","49.0","55.0","72.0","80.3"],"framework":["23.0","24.1","55.0","57.1"],"ll":["23.0","55.0"],"answering":["23.0","55.0"],"why":["23.0","26.0","52.0","55.0"],"incremental":["23.0","24.4","50.0","55.0","57.4"],"criticism":["23.1","55.1"],"de":["23.1","55.1"],"emphasizes":["23.1","55.1"],"player":["23.1","24.2","55.1","57.2","80.27","102.9"],"skill":["23.1","24.6","55.1","57.6"],"making":["23.1","24.2","55.1","57.2","80.12"],"important":["23.1","55.1"],"certainly":["23.1","55.1"],"often":["23.1","26.1","27.2","52.1","55.1","56.2"],"literally":["23.1","55.1"],"impossible":["23.1","55.1"],"complete":["23.1","55.1","86.0","108.0"],"taking":["23.1","55.1","80.15"],"advantage":["23.1","55.1"],"systems":["23.1","55.1"],"boxes":["23.2","55.2","69.0","81.4","88.0","110.0"],"argument":["23.2","23.5","55.2","55.5","80.56","102.38"],"goes":["23.2","55.2"],"fun":["23.2","23.5","55.2","55.5"],"condition":["23.2","55.2"],"continuing":["23.2","55.2"],"without":["23.2","23.6","55.2","55.6"],"getting":["23.2","26.3","52.3","55.2","80.47","102.29"],"anything":["23.2","24.9","55.2","57.9","73.0","93.0","114.0"],"from":["23.2","26.0","50.0","52.0","55.2","80.26","80.55","95.0","102.8","102.37"],"when":["23.2","55.2","75.0","80.25","92.5","102.7"],"tied":["23.2","55.2"],"real":["23.2","38.0","55.2","80.41","102.23"],"world":["23.2","55.2"],"money":["23.2","55.2"],"seen":["23.2","55.2"],"predatory":["23.2","55.2"],"lesser":["23.2","55.2"],"free":["23.2","45.2","55.2"],"feeding":["23.2","55.2"],"sides":["23.2","55.2"],"seek":["23.2","55.2"],"micro":["23.2","55.2"],"transaction":["23.2","55.2"],"heavy":["23.2","55.2"],"healthy":["23.2","55.2"],"certain":["23.2","24.8","55.2","57.8"],"contexts":["23.2","55.2"],"successful":["23.3","55.3"],"may":["23.3","26.3","27.1","52.3","55.3","56.1","72.0"],"indicate":["23.3","55.3"],"strategies":["23.3","55.3"],"separate":["23.3","55.3","80.26","102.8"],"harder":["23.3","55.3","92.6"],"feel":["23.3","55.3"],"smart":["23.3","55.3"],"constant":["23.4","55.4","81.0","92.1","103.0","113.1"],"freshness":["23.4","55.4"],"shields":["23.5","55.5"],"souls":["23.5","55.5"],"likes":["23.5","24.3","55.5","57.3"],"bit":["23.5","55.5","80.15"],"famous":["23.5","55.5"],"highly":["23.5","55.5","72.2","113.2"],"recommend":["23.5","55.5"],"video":["23.5","55.5"],"essay":["23.5","55.5"],"spends":["23.5","55.5"],"time":["23.5","38.0","55.5","80.44","102.26"],"topic":["23.5","55.5"],"essentially":["23.5","55.5"],"boils":["23.5","55.5"],"down":["23.5","55.5","76.0","98.0","118.0"],"earlier":["23.5","55.5"],"using":["23.5","55.5","67.0"],"too":["23.5","27.0","55.5","56.0"],"much":["23.5","55.5"],"slowly":["23.5","55.5"],"conservatively":["23.5","55.5"],"ultimately":["23.5","55.5"],"wanted":["23.5","55.5"],"safe":["23.5","55.5"],"still":["23.6","55.6","72.1","92.1","113.1"],"concept":["23.6","55.6"],"pretty":["23.6","55.6"],"nebulous":["23.6","55.6"],"already":["23.6","55.6","73.0","93.0","114.0"],"but":["23.6","47.0","55.6","72.1","80.29","86.0","92.2","95.0","99.0","102.11","113.2","119.0"],"personally":["23.6","55.6"],"those":["23.6","27.2","45.4","55.6","56.2","63.0","66.0","71.0","91.0","94.0","104.0","107.0","108.0","112.0","115.0","116.0"],"who":["23.6","55.6"],"define":["23.6","55.6"],"an":["23.6","24.0","27.3","30.0","46.0","55.6","56.3","57.0","62.1","64.0","75.0","80.56","81.4","83.0","102.38","105.0","116.0"],"act":["23.6","55.6"],"expression":["23.6","55.6"],"physical":["23.6","55.6"],"result":["23.6","55.6"],"created":["23.6","29.0","55.6"],"meaning":["23.6","55.6"],"put":["23.6","27.2","55.6","56.2","62.3"],"relevant":["23.6","55.6","80.34","102.16"],"you":["24.0","45.5","57.0","80.30","80.46","97.2","102.12","102.28","117.2"],"if":["24.0","57.0","71.0","80.35","80.54","91.0","96.0","97.2","102.17","102.36","112.0","117.2"],"reset":["24.0","57.0","73.0","93.0","114.0"],"then":["24.0","57.0","95.0"],"every":["24.0","57.0","92.4","113.4"],"roguelite":["24.0","57.0"],"well":["24.0","24.4","57.0","57.4","72.2","92.2","113.2"],"clearly":["24.0","57.0"],"than":["24.0","24.9","57.0","57.9","97.0","113.3","117.0"],"doesn":["24.1","27.3","56.3","57.1"],"t":["24.1","57.1","72.0","72.5","96.0"],"offer":["24.1","57.1"],"sense":["24.1","57.1"],"don":["24.1","57.1"],"moderation":["24.1","57.1"],"although":["24.1","27.2","27.3","56.2","56.3","57.1"],"become":["24.1","24.6","27.1","56.1","57.1","57.6"],"problem":["24.1","24.3","57.1","57.3"],"profit":["24.1","57.1"],"seeking":["24.1","57.1"],"play":["24.1","57.1"],"detriment":["24.1","57.1"],"parts":["24.1","57.1","76.0","98.0","118.0"],"another":["24.1","27.2","56.2","57.1","80.34","102.16","103.4"],"interpretation":["24.1","57.1"],"comes":["24.1","57.1"],"mainstream":["24.1","57.1"],"also":["24.1","25.1","27.2","37.0","51.0","53.1","56.2","57.1","65.0","72.6","80.17","106.0"],"capitalism":["24.1","57.1"],"cookie":["24.1","57.1"],"adventure":["24.1","57.1"],"capitalist":["24.1","57.1"],"very":["24.1","24.7","57.1","57.7"],"portray":["24.1","57.1"],"increasing":["24.1","57.1"],"numbers":["24.1","57.1","80.13","80.35","102.17"],"insatiable":["24.1","57.1"],"hunger":["24.1","57.1"],"ones":["24.1","57.1","80.34","102.16"],"observed":["24.1","57.1"],"within":["24.1","57.1","80.53","102.35"],"therefore":["24.1","57.1"],"evidence":["24.1","57.1"],"whole":["24.1","45.0","57.1","75.0"],"approach":["24.2","57.2"],"would":["24.2","57.2"],"defined":["24.2","24.3","57.2","57.3","81.0","103.0"],"relation":["24.2","57.2"],"involve":["24.2","57.2"],"large":["24.2","24.6","57.2","57.6","80.30","102.12"],"optimization":["24.2","57.2"],"problems":["24.2","57.2"],"above":["24.2","57.2","113.3"],"else":["24.2","57.2"],"performing":["24.2","57.2"],"deciding":["24.2","57.2"],"what":["24.2","57.2","81.0","89.2","103.0","111.2"],"consequences":["24.2","24.7","57.2","57.7"],"wrong":["24.2","27.0","56.0","57.2"],"decisions":["24.2","57.2"],"lenient":["24.2","57.2"],"usually":["24.3","57.3"],"rogue":["24.3","57.3"],"pushes":["24.3","57.3"],"back":["24.3","57.3"],"step":["24.3","57.3"],"judge":["24.4","57.4"],"traits":["24.5","57.5"],"early":["24.5","27.2","56.2","57.5"],"popular":["24.5","57.5"],"titles":["24.5","57.5"],"easily":["24.5","47.0","57.5"],"replaced":["24.5","57.5"],"mechanically":["24.5","57.5"],"not":["24.6","27.0","40.0","56.0","57.6","71.0","72.5","80.28","80.33","80.35","80.46","80.50","91.0","102.10","102.15","102.17","102.28","102.32","112.0","113.6"],"indicator":["24.6","57.6"],"incrementalness":["24.6","57.6"],"additionally":["24.6","57.6"],"hard":["24.6","57.6"],"determine":["24.6","57.6","68.0","71.0","72.3","91.0","96.0","112.0"],"example":["24.6","27.3","56.3","57.6","62.0","85.0","99.0","119.0"],"any":["24.6","27.1","56.1","57.6","62.2","70.0","81.0","89.0","92.0","103.0","103.3","111.0","113.0"],"tree":["24.6","57.6","80.32","81.2","88.0","92.6","102.14","103.2"],"interacting":["24.7","57.7"],"non":["24.7","57.7"],"diegetic":["24.7","57.7"],"elements":["24.7","57.7","81.0"],"reduced":["24.7","57.7"],"tend":["24.7","57.7"],"repurcussions":["24.7","57.7"],"misplaying":["24.7","57.7"],"rarely":["24.7","57.7"],"fail":["24.7","57.7"],"states":["24.7","57.7"],"where":["24.7","27.1","56.1","57.7","64.0","66.0","72.4","74.0","83.0","87.0","90.0","94.0","97.3","105.0","107.0","109.0","113.5","115.0","117.3"],"largest":["24.7","26.0","52.0","57.7"],"consequence":["24.7","57.7"],"through":["24.8","57.8","76.0","98.0","118.0"],"some":["24.8","24.9","45.5","57.8","57.9","72.2","80.35","80.41","102.17","102.23"],"sort":["24.8","45.5","57.8"],"towards":["24.8","57.8"],"amount":["24.8","57.8","69.0","80.46","86.0","102.28","108.0"],"resource":["24.8","24.9","57.8","57.9"],"required":["24.8","57.8","65.0","106.0"],"unlock":["24.8","57.8","65.0","73.0","92.6","93.0","106.0","114.0"],"purchase":["24.8","27.4","56.4","57.8"],"management":["24.9","57.9"],"goal":["24.9","27.0","56.0","57.9"],"oriented":["24.9","57.9"],"probably":["24.9","57.9","61.5"],"apply":["24.9","57.9","64.0","83.0","90.0","105.0"],"think":["24.9","57.9"],"higher":["24.10","57.10"],"degree":["24.10","57.10"],"base":["24.10","57.10"],"layer":["24.10","57.10","61.8","80.9","95.0","97.1","117.1"],"antimatter":["24.10","57.10"],"dimensions":["24.10","57.10"],"swarm":["24.10","57.10"],"simulator":["24.10","57.10"],"upgrades":["24.10","27.3","56.3","57.10","72.3","80.25","80.46","102.7","102.28"],"category":["24.10","57.10"],"get":["24.11","27.0","56.0","57.11","81.2","103.2"],"translated":["24.11","57.11"],"english":["24.11","57.11"],"illustrate":["25.0","53.0"],"various":["25.0","53.0"],"points":["25.0","53.0","63.0","77.0","82.0","108.0","119.0"],"regarding":["25.0","53.0"],"balancing":["25.0","53.0"],"consider":["25.0","53.0"],"living":["25.0","53.0"],"passionate":["25.1","53.1"],"interest":["25.1","53.1"],"ludology":["25.1","53.1"],"classifying":["25.1","53.1"],"genres":["25.1","53.1"],"etc":["25.1","53.1"],"ve":["25.1","53.1"],"developers":["25.2","26.1","40.0","52.1","53.2"],"navigating":["25.3","53.3"],"affect":["26.0","52.0"],"no":["26.0","43.0","52.0","80.15","80.16","80.18","80.46","102.28"],"immune":["26.0","52.0"],"this":["26.0","39.0","52.0"],"content":["26.0","52.0"],"creators":["26.0","52.0"],"suggestions":["26.1","52.1"],"improvement":["26.1","52.1"],"while":["26.1","52.1"],"vague":["26.1","52.1"],"or":["26.1","27.0","40.0","44.0","52.1","56.0","70.0","72.2","72.4","89.0","97.0","111.0","113.2","117.0"],"hurtful":["26.1","52.1"],"prioritize":["26.1","52.1"],"former":["26.1","52.1"],"disregard":["26.1","52.1"],"said":["26.1","52.1"],"most":["26.1","27.3","28.0","52.1","56.3"],"will":["26.1","52.1","69.0","72.0","87.0"],"take":["26.1","27.1","52.1","56.1","72.1","80.15","92.1","113.1"],"trained":["26.2","52.2"],"themselves":["26.2","52.2"],"recognize":["26.2","52.2"],"good":["26.2","52.2","72.6"],"bad":["26.2","52.2"],"design":["26.2","52.2"],"articulate":["26.2","52.2"],"differences":["26.2","52.2","92.2"],"seem":["26.3","52.3"],"game":["26.3","52.3","80.40","81.2","102.22","103.2"],"state":["26.3","52.3"],"publicly":["26.3","52.3"],"share":["26.3","47.0","52.3","70.0","89.0","111.0"],"accomplishment":["26.3","52.3"],"nitpicky":["27.0","56.0"],"attack":["27.0","56.0"],"low":["27.0","56.0"],"nothing":["27.0","56.0"],"short":["27.0","56.0"],"big":["27.0","56.0"],"fan":["27.0","56.0"],"look":["27.1","40.0","56.1","70.1","89.1","111.1"],"opposite":["27.1","56.1"],"end":["27.1","56.1"],"spectrum":["27.1","56.1"],"frequent":["27.1","56.1"],"mindless":["27.1","56.1"],"mechanic":["27.1","56.1"],"need":["27.1","56.1"],"click":["27.1","56.1"],"progress":["27.1","27.3","56.1","56.3","72.2","113.2"],"buy":["27.2","27.3","56.2","56.3","73.0","80.6","93.0","114.0"],"amongst":["27.2","47.0","56.2"],"eternity":["27.2","56.2"],"respectively":["27.2","56.2"],"option":["27.2","56.2"],"mental":["27.2","56.2"],"queue":["27.2","56.2"],"reached":["27.2","56.2"],"optimal":["27.2","56.2"],"order":["27.2","56.2"],"trivial":["27.2","56.2"],"particularly":["27.2","56.2"],"engaging":["27.2","56.2"],"only":["27.2","27.3","40.0","56.2","56.3","80.35","102.17"],"offense":["27.2","56.2"],"further":["27.3","56.3"],"narrative":["27.3","56.3"],"throughline":["27.3","56.3"],"layers":["27.3","56.3","80.12","80.26","102.8","113.3"],"many":["27.3","41.0","56.3","66.0","107.0"],"justifications":["27.3","56.3"],"resetting":["27.3","56.3","80.37","102.19"],"wants":["27.3","56.3"],"inevitably":["27.3","56.3"],"generic":["27.3","56.3"],"increasingly":["27.3","56.3"],"loosely":["27.3","56.3"],"associated":["27.3","41.0","56.3"],"unfortunate":["27.3","56.3"],"opinion":["27.3","56.3"],"interesting":["27.3","56.3"],"innovative":["27.3","56.3"],"gets":["27.3","56.3"],"prestige":["27.3","56.3","80.22","102.4"],"unlocked":["27.3","56.3","68.0","71.0","72.5","91.0","96.0","112.0","113.6","116.0"],"recent":["27.3","56.3"],"really":["27.3","56.3"],"grass":["27.3","56.3"],"cutting":["27.3","56.3"],"criticizing":["27.3","56.3"],"roblox":["27.3","56.3"],"except":["27.3","56.3"],"continue":["27.3","56.3"],"after":["27.3","56.3","61.3","68.0","73.0","90.0","93.0","114.0"],"enough":["27.3","47.0","56.3"],"increase":["27.3","56.3"],"your":["27.3","56.3","80.54","92.4","102.36","113.4"],"impact":["27.4","56.4"],"multiply":["27.4","56.4"],"gain":["27.4","56.4","69.0","93.0","114.0"],"cost":["27.4","56.4"],"n":["27.4","56.4"],"costs":["27.4","56.4"],"times":["27.4","56.4","92.4","113.4"],"games":["28.0","50.0"],"notably":["28.0"],"hosts":["28.0"],"studio":["29.0","76.0","98.0","118.0"],"older":["30.0","80.11"],"version":["30.0"],"built":["30.0"],"open":["31.0","48.0"],"twitter":["33.0"],"me":["34.0"],"available":["34.0"],"planar":["35.0"],"pioneers":["35.0"],"profectus":["35.0"],"v":["35.0","35.2"],"going":["35.1"],"own":["35.1"],"pages":["35.1"],"buds":["35.2"],"grants":["37.0"],"users":["37.0"],"right":["37.0","80.24","102.6"],"a":["38.0","49.0","80.24","97.0","97.1","102.6","117.0","117.1"],"changes":["38.1"],"color":["38.1","92.6"],"red":["38.1","76.0","98.0","118.0"],"green":["38.1"],"oz42mkvlzqi":["38.1"],"namely":["38.2"],"carstens":["38.2"],"ag501":["38.2"],"png":["38.2"],"addition":["38.2","59.0","78.0","100.0"],"restrain":["40.0"],"behave":["40.0"],"belong":["41.0"],"groups":["41.0"],"person":["41.0","45.3"],"permanently":["41.0"],"server":["42.0"],"software":["42.0"],"relationships":["43.0"],"analyses":["43.0"],"undefined":["43.0"],"known":["44.0"],"typically":["44.0"],"having":["44.0","51.0"],"ads":["44.0"],"marketers":["44.0"],"individual":["45.0"],"sites":["45.0"],"random":["45.1"],"button":["45.1","80.17","80.31","85.0","96.0","102.13","116.0"],"and":["45.1","61.1","61.10","80.5","80.20","80.27","80.34","81.3","102.2","102.9","102.16"],"filters":["45.1"],"929ac2907c2e":["45.2"],"hosting":["45.2"],"static":["45.2"],"neocities":["45.2"],"kind":["45.3","62.2","81.3","92.2","103.3","113.2"],"rss":["45.4","46.0"],"allow":["45.4"],"ideally":["45.5"],"d":["45.5"],"use":["45.5","80.30","81.2","93.0","102.12","103.2","114.0"],"system":["45.5"],"automatic":["46.0"],"process":["46.0"],"exists":["46.0"],"we":["46.0"],"changelog":["46.0"],"creations":["47.0"],"never":["47.0","80.2","80.54","102.36"],"became":["47.0"],"performance":["47.0"],"parallelization":["47.0"],"involved":["47.0"],"grow":["50.0"],"cross":["50.0"],"pollinating":["50.0"],"host":["50.0"],"everyone":["51.0"],"plans":["51.0"],"paid":["51.0"],"cangenpoints":["59.0","73.0","78.0","93.0","100.0","114.0"],"js":["59.0","72.1","78.0","97.1","100.0","117.1"],"fulllayerreset":["59.0","78.0","100.0"],"layerdatareset":["59.0","78.0","100.0"],"array":["59.0","72.1","78.0","92.1","100.0"],"names":["59.0","78.0","88.0","100.0"],"values":["59.0","74.0","78.0","94.0","100.0","115.0","116.0"],"keep":["59.0","78.0","100.0"],"documentation":["60.0","80.10"],"api":["61.2"],"milestone":["61.2","80.23","102.5"],"hitting":["61.3"],"keepgoing":["61.3"],"buffed":["61.4"],"milestones":["61.5","80.15"],"favicon":["61.6"],"header":["61.6"],"f":["61.7"],"highlighted":["61.8","76.0","92.6","98.0","118.0"],"before":["61.8"],"implemented":["61.9","61.11","61.12"],"faster":["61.10"],"late":["61.10"],"row":["61.11","80.46","102.28"],"treated":["62.0"],"differently":["62.0"],"x":["62.0"],"value":["62.0","72.5","73.0","92.0","93.0","113.0","114.0"],"instead":["62.0","67.0","77.0"],"plain":["62.0"],"number":["62.0","72.4","92.4","113.4","113.5"],"perform":["62.0"],"operations":["62.0","80.49","102.31"],"calling":["62.0"],"functions":["62.0","72.3","80.51","92.3","92.5","97.3","102.33","117.3"],"e":["62.0"],"g":["62.0"],"tab":["62.1","80.24","95.0","102.6"],"layouts":["62.1"],"optional":["62.1","75.0"],"tabs":["62.1","95.0"],"layout":["62.1"],"generalized":["62.2","103.3"],"variant":["62.2","103.3"],"of":["62.2","70.2","80.15","80.49","89.2","102.31","103.3","111.2"],"inside":["62.3"],"achievements":["62.3","69.0","92.2","103.4","110.0","113.2"],"form":["63.0","64.0","66.0","74.0","75.0","83.0","86.0","87.0","90.0","94.0","105.0","107.0","108.0","109.0","115.0"],"keys":["63.0","64.0","66.0","72.4","74.0","75.0","83.0","86.0","87.0","90.0","92.5","94.0","97.3","105.0","107.0","108.0","109.0","113.5","115.0","116.0","117.3"],"attributes":["63.0","66.0","72.4","74.0","75.0","86.0","87.0","90.0","92.5","94.0","97.3","107.0","108.0","109.0","113.5","115.0","116.0","117.3"],"strings":["63.0","66.0","71.0","82.0","86.0","87.0","91.0","104.0","107.0","108.0","109.0","112.0","116.0"],"assigned":["63.0","66.0","82.0","85.0","86.0","87.0","104.0","107.0","108.0","109.0"],"automagically":["63.0","66.0","82.0","85.0","86.0","87.0","104.0","107.0","108.0","109.0"],"similar":["63.0","72.2","82.0","85.0","99.0","113.2","119.0"],"basestyle":["64.0","83.0","105.0"],"fillstyle":["64.0","83.0","105.0"],"borderstyle":["64.0","83.0","105.0"],"textstyle":["64.0","82.0","83.0","104.0","105.0"],"css":["64.0","66.0","72.4","74.0","75.0","83.0","86.0","90.0","94.0","97.3","105.0","107.0","108.0","109.0","113.5","115.0","117.3"],"unfilled":["64.0","83.0","105.0"],"border":["64.0","83.0","105.0"],"object":["64.0","72.4","74.0","75.0","83.0","94.0","97.3","102.38","105.0","113.5","115.0","116.0","117.3"],"currency":["65.0","106.0"],"type":["65.0","84.0","106.0"],"normal":["65.0","84.0","106.0"],"determines":["65.0","72.1","84.0","92.1","106.0","113.1"],"formula":["65.0","84.0","106.0"],"calculating":["65.0","84.0","106.0"],"exponent":["65.0","84.0","106.0"],"spending":["66.0"],"buymax":["66.0","107.0"],"possible":["66.0","107.0"],"applies":["66.0","74.0","75.0","86.0","94.0","107.0","108.0","109.0","115.0"],"name":["66.0","77.0","85.0","107.0","109.0"],"change":["67.0","99.0","119.0"],"currencydisplayname":["67.0","77.0","99.0","119.0"],"currencyinternalname":["67.0","77.0","99.0","119.0"],"currencylayer":["67.0","77.0"],"omit":["67.0","77.0"],"directly":["67.0","80.55"],"returning":["68.0","71.0","72.1","73.0","91.0","92.1","93.0","112.0","113.1","114.0"],"everything":["68.0","90.0"],"likely":["68.0"],"changing":["68.0","95.0"],"based":["68.0","80.21","80.43","102.3","102.25"],"basic":["68.0","103.0"],"html":["68.0","80.46","81.0","102.28","103.0"],"bool":["68.0","71.0","91.0","92.3","112.0","113.3"],"visible":["68.0","71.0","72.1","80.15","91.0","92.1","96.0","112.0","113.1"],"canclick":["68.0"],"challs":["69.0","80.46","102.28"],"challenges":["69.0","80.5","80.18","80.20","80.37","102.2","102.19","110.0"],"appropriate":["69.0","72.5","88.0","110.0"],"buyables":["69.0","80.20","80.40","88.0","102.2","102.22","110.0"],"clickables":["69.0","80.5","80.37","88.0","102.19","110.0"],"pixels":["69.0","88.0","110.0"],"microtabs":["69.0","88.0","110.0"],"area":["69.0","88.0","110.0"],"update":["70.0","89.0","95.0","111.0"],"extra":["70.0","80.6","89.0","92.2","111.0"],"effort":["70.0","89.0","111.0"],"githack":["70.0","89.0","111.0"],"cloning":["70.1","89.1","111.1"],"downloading":["70.1","89.1","111.1"],"bottom":["70.2","89.2","97.1","111.2","117.1"],"corner":["70.2","86.0","87.0","89.2","111.2"],"add":["70.2","81.2","89.2","95.0","103.2","111.2"],"summary":["70.2","89.2","111.2"],"master":["70.2","80.43","102.25"],"finally":["70.2"],"middle":["70.2"],"push":["70.2"],"origin":["70.2"],"onto":["70.2"],"crash":["72.0"],"isn":["72.0"],"included":["72.0"],"sometimes":["72.0","81.3","113.3"],"layershown":["72.1","92.1","113.1"],"ghost":["72.1","92.1","113.1"],"hide":["72.1","80.34","80.51","92.1","97.0","102.16","102.33","113.1","117.0"],"space":["72.1","80.15","92.1","113.1"],"hotkeys":["72.1","92.1"],"key":["72.1","85.0","99.0","119.0"],"bars":["72.2"],"display":["72.2","80.25","81.0","102.7","103.0"],"bar":["72.2","88.0","110.0","113.2"],"gague":["72.2","113.2"],"customizable":["72.2","113.2"],"vertical":["72.2","92.2","113.2"],"canbuymax":["72.3"],"buying":["72.3"],"max":["72.3","86.0"],"permitted":["72.3"],"gainmult":["72.3","80.10","84.0","92.3"],"gainexp":["72.3","92.3"],"calculate":["72.3","92.3"],"multiplier":["72.3","84.0","92.3"],"theme":["72.4","97.3","113.5","117.3"],"affected":["72.4","97.3","113.5","117.3"],"colors":["72.4","97.3","113.5","117.3"],"nodestyle":["72.4","97.3","113.5","117.3"],"styles":["72.4","92.5","97.3","113.5","117.3"],"resetsnothing":["72.5","113.6"],"returns":["72.5","73.0","81.0","92.4","93.0","103.0","113.4","113.6","114.0"],"true":["72.5","87.0","92.1","92.3","113.1","113.3"],"shouldn":["72.5","113.6"],"trigger":["72.5","113.6"],"increaseunlockorder":["72.5","113.6"],"first":["72.5","76.0","97.2","98.0","113.6","117.2","118.0"],"unlockorder":["72.5","113.6"],"yet":["72.5","80.15","113.6"],"list":["72.5","113.6"],"supporting":["72.6"],"examples":["73.0"],"taken":["73.0","93.0","114.0"],"care":["73.0","93.0","114.0"],"var":["73.0","93.0","114.0"],"doreset":["73.0","93.0","114.0"],"onpurchase":["73.0","93.0","114.0"],"blowupeverything":["73.0","93.0","114.0"],"getstartpoints":["73.0","93.0","114.0"],"starts":["73.0","93.0","114.0"],"boolean":["73.0","93.0","114.0"],"generated":["73.0","93.0","114.0"],"upgrade":["73.0","92.6","93.0","114.0"],"generating":["73.0","93.0","114.0"],"getpointgen":["73.0","93.0","114.0"],"calculates":["73.0","93.0","114.0"],"per":["73.0","93.0","114.0"],"second":["73.0","92.4","93.0","113.4","114.0"],"affects":["73.0","93.0","96.0","114.0","116.0"],"point":["73.0","93.0","114.0"],"becomes":["74.0"],"locked":["74.0","94.0","115.0"],"check":["74.0","94.0","115.0"],"switched":["75.0"],"visual":["76.0","80.41","98.0","102.23","118.0"],"scroll":["76.0","98.0","118.0"],"feature":["77.0"],"currencylocation":["77.0"],"commit":["79.0","101.0"],"inputs":["80.2"],"moves":["80.3"],"setspeed":["80.3"],"major":["80.4"],"related":["80.4","80.44","102.26"],"issue":["80.4"],"default":["80.5","83.0","96.0","105.0"],"stars":["80.5"],"multi":["80.5"],"completion":["80.5","86.0","108.0"],"buyable":["80.6","80.43","102.25"],"issues":["80.7","80.20","80.33","80.37","102.2","102.15","102.19"],"commas":["80.7","80.37","102.19"],"appearing":["80.7","80.25","80.45","102.7","102.27"],"fixed":["80.8","80.13","80.15","80.20","80.25","80.28","80.33","80.37","80.39","80.41","80.50","102.2","102.7","102.10","102.15","102.19","102.21","102.23","102.32"],"star":["80.9","86.0","87.0"],"originally":["80.9"],"jacorb":["80.9"],"proxy":["80.9"],"component":["80.9","80.25","102.7"],"exp":["80.10"],"compatibility":["80.11"],"small":["80.13"],"tabformat":["80.14"],"longer":["80.15","80.18"],"hidden":["80.15","81.4"],"tiny":["80.15"],"centered":["80.15"],"respec":["80.15","80.43","102.25"],"few":["80.16"],"prestigenotify":["80.17"],"subtabs":["80.17"],"highlights":["80.17"],"attempts":["80.18"],"automatically":["80.19","92.4","92.6","102.1","113.4"],"keeping":["80.19","80.20","102.1","102.2"],"decimal":["80.19","102.1"],"spacing":["80.21","102.3"],"types":["80.22","92.4","102.4","113.4"],"achievement":["80.23","102.5"],"side":["80.24","102.6"],"comma":["80.25","102.7"],"main":["80.25","102.7"],"was":["80.25","85.0","102.7"],"lets":["80.26","102.8"],"shown":["80.26","81.4","102.8"],"somewhere":["80.26","102.8"],"classed":["80.27","102.9"],"objects":["80.27","102.9"],"visually":["80.28","102.10"],"updating":["80.28","80.33","102.10","102.15"],"layerdata":["80.29","102.11"],"fixoldsaves":["80.30","102.12"],"nodes":["80.31","88.0","102.13"],"branches":["80.32","102.14"],"startdata":["80.33","102.15"],"thank":["80.33","102.15"],"handled":["80.34","102.16"],"intelligently":["80.34","102.16"],"renamed":["80.34","102.16"],"files":["80.34","102.16"],"moved":["80.34","80.51","102.16","102.33"],"folder":["80.34","102.16"],"specifying":["80.35","102.17"],"height":["80.35","102.17"],"outdated":["80.38","102.20"],"docs":["80.38","102.20","103.0"],"improvements":["80.38","102.20"],"buttons":["80.40","80.43","81.2","102.22","102.25","103.2"],"old":["80.40","80.51","102.22","102.33"],"demo":["80.40","102.22"],"clickableeffect":["80.41","102.23"],"interfering":["80.42","102.24"],"limit":["80.43","102.25"],"mechanics":["80.43","102.25"],"made":["80.43","102.25"],"clickable":["80.43","81.3","102.25"],"offline":["80.44","102.26"],"index":["80.46","102.28"],"editing":["80.46","102.28"],"needed":["80.46","102.28"],"tmp":["80.46","102.28"],"does":["80.46","92.4","102.28","113.4"],"manually":["80.46","102.28"],"updated":["80.46","102.28"],"tutorial":["80.47","102.29"],"started":["80.47","102.29"],"fix":["80.48","102.30"],"able":["80.48","102.30"],"immediately":["80.50","102.32"],"importing":["80.50","102.32"],"saves":["80.50","102.32"],"challeffect":["80.51","102.33"],"completed":["80.51","102.33"],"setting":["80.51","102.33"],"changelogs":["80.51","102.33"],"hasupg":["80.52","102.34"],"haschall":["80.52","102.34"],"hasmilestone":["80.52","102.34"],"inchallenge":["80.52","102.34"],"useful":["80.53","102.35"],"unique":["80.54","102.36"],"mod":["80.54","102.36"],"conflict":["80.54","102.36"],"mods":["80.54","102.36"],"third":["80.56","102.38"],"release":["80.57"],"almost":["81.0","92.0","103.0","113.0"],"dynamic":["81.0","92.0","103.0","113.0"],"putting":["81.0","103.0"],"function":["81.0","95.0","103.0"],"given":["81.0","103.0"],"text":["81.0","81.4","92.1","103.0","113.1"],"rid":["81.2","103.2"],"thing":["81.3"],"map":["81.4"],"tiles":["81.4"],"inventory":["81.4"],"grid":["81.4"],"infoboxes":["81.4"],"containing":["81.4","88.0"],"image":["85.0","86.0","87.0"],"url":["85.0","86.0","87.0"],"stored":["85.0"],"under":["85.0","99.0","119.0"],"convenient":["85.0","99.0","119.0"],"access":["85.0","99.0","119.0"],"sell":["85.0"],"sellone":["85.0"],"sellall":["85.0"],"cause":["85.0"],"appear":["85.0","95.0"],"beneath":["85.0"],"functionally":["85.0"],"identical":["85.0"],"completionlimit":["86.0","108.0"],"marked":["86.0","87.0"],"adds":["86.0","87.0"],"mark":["86.0","87.0"],"starred":["86.0"],"id":["88.0","110.0"],"infobox":["88.0","110.0"],"arrays":["88.0"],"creates":["89.2","111.2"],"snapshot":["89.2","111.2"],"looks":["89.2","111.2"],"moment":["89.2","111.2"],"allowing":["89.2","111.2"],"displayed":["90.0"],"top":["90.0"],"larger":["90.0"],"font":["90.0"],"title":["90.0"],"getstyle":["90.0"],"description":["92.1","113.1"],"stays":["92.1","113.1"],"defaults":["92.1","113.1"],"different":["92.2"],"roundupcost":["92.3","113.3"],"needs":["92.3","99.0","119.0"],"rounded":["92.3"],"passivegeneration":["92.4","113.4"],"regular":["92.4","113.4"],"generate":["92.4","113.4"],"tooltip":["92.5","97.3","117.3"],"tooltiplocked":["92.5","97.3","117.3"],"return":["92.5","92.6"],"shouldnotify":["92.6"],"whether":["92.6"],"glowcolor":["92.6"],"go":["93.0"],"calculation":["93.0"],"addedplayerdata":["93.0"],"position":["95.0"],"offset":["95.0"],"far":["95.0"],"start":["95.0"],"xvel":["95.0"],"yvel":["95.0"],"initially":["95.0"],"properties":["95.0"],"movement":["95.0"],"leaving":["95.0"],"erased":["95.0"],"must":["95.0","113.3"],"impliment":["95.0"],"effects":["95.0"],"yourself":["95.0"],"stay":["95.0"],"advanced":["95.0"],"appearance":["96.0","116.0"],"always":["96.0"],"keyword":["96.0"],"edit":["97.1","117.1"],"node":["97.2","117.2"],"duplicates":["97.2","117.2"],"include":["99.0","119.0"],"details":["103.0"],"working":["103.0"],"effectively":["108.0"],"onclick":["109.0"],"implements":["109.0"],"clicking":["109.0"],"applied":["113.1"],"effectdescription":["113.1"],"described":["113.3"],"absent":["113.3"],"greater":["113.3"],"otherwise":["113.6"],"supported":["113.6"],"resets":["113.6"],"buttonstyle":["116.0"]},{"1":["67.0"],"2":["61.11","80.16"],"3":["92.1"],"4":["61.2"],"6":["70.1","89.1","111.1"],"7":["89.2","111.2"],"8":["70.2","89.2","111.2"],"10":["24.5","57.5"],"26":["0.0"],"27":["0.0"],"39":["0.0"],"72":["73.0","93.0","114.0"],"100":["27.1","56.1"],"open":["0.0"],"source":["0.0","31.0"],"opti":["0.0","35.2"],"speech":["0.0"],"planar":["0.0"],"pioneers":["0.0"],"profectus":["0.0"],"media":["0.0","7.0"],"synapse":["0.0"],"beginner":["0.0"],"cozy":["0.0"],"web":["0.0"],"federated":["1.0","15.0","36.0"],"social":["1.0","7.0","14.0","36.0"],"than":["2.0","23.2","55.2","88.0"],"anticipated":["2.0"],"but":["2.0","35.1","72.2"],"end":["2.0","24.4","25.0","53.0","57.4"],"result":["2.0"],"is":["2.0","15.4","43.0","45.5","62.2","76.0","80.47","90.0","98.0","102.29","103.3","118.0"],"large":["2.0"],"awesome":["2.0"],"tv":["2.0"],"designed":["3.0"],"small":["3.0","24.6","57.6","80.15"],"dice":["4.0"],"armor":["4.0"],"don":["4.0","24.0","57.0"],"t":["4.0","23.3","24.9","55.3","57.9","80.40","102.22","116.0"],"believe":["4.0","26.1","27.1","52.1","56.1"],"ever":["4.0"],"more":["5.0","9.0","24.10","26.2","27.4","52.2","56.4","57.10","70.0","80.27","80.35","80.48","80.50","89.0","102.9","102.17","102.30","102.32","111.0"],"details":["5.0"],"visit":["5.0"],"page":["5.0","80.47","102.29"],"defined":["6.0","62.0"],"chatting":["6.0"],"stores":["7.0"],"knowledge":["7.0"],"overuses":["7.0"],"timelines":["7.0"],"and":["7.0","33.0","37.0","45.2","45.5","62.2","80.19","80.47","81.2","102.1","102.29","103.2","103.3"],"feeds":["7.0"],"the":["8.0","42.0","61.3","61.7","80.37","80.51","80.52","102.19","102.33","102.34"],"matrix":["8.0"],"accessible":["9.0"],"laxla":["9.0"],"tech":["9.0"],"lgbt":["9.0"],"creating":["9.0"],"gimli":["9.0"],"discord":["9.0","50.0","80.38","102.20"],"alternative":["9.0","18.0"],"activitypub":["9.0"],"guild":["9.0"],"based":["9.0"],"ways":["9.0"],"with":["10.0","14.0","23.4","55.4","70.0","70.2","80.35","80.40","80.50","80.56","89.0","89.2","92.6","102.17","102.22","102.32","102.38","111.0","111.2"],"game":["10.0","62.3","92.1","103.0","103.4","113.1"],"creator":["10.0"],"customize":["11.0","15.5","81.2","103.2"],"your":["11.0","67.0","72.1","77.0","92.1","99.0","113.1","119.0"],"experience":["11.0","26.2","27.1","52.2","56.1"],"single":["11.0","12.0","23.6","27.1","51.0","55.6","56.1"],"entity":["11.0"],"make":["11.0","23.1","23.6","27.0","55.1","55.6","56.0","72.5","80.25","81.4","102.7","113.6"],"worse":["11.0"],"for":["11.0","23.4","24.5","26.3","32.0","42.0","46.0","51.0","52.3","55.4","57.5","64.0","72.4","80.22","83.0","102.4","105.0","113.5"],"changed":["12.0","80.52","80.53","102.34","102.35"],"during":["12.0"],"checked":["12.0"],"owned":["12.0"],"generate":["12.0"],"sold":["12.0"],"indicators":["12.0"],"left":["12.0","97.2","117.2"],"choose":["12.0"],"filter":["12.0"],"options":["12.0"],"down":["12.0","92.1","113.1"],"effect":["12.0","23.1","55.1"],"updates":["12.0"],"only":["12.0","24.3","30.0","57.3","70.1","80.29","89.1","92.7","102.11","111.1","113.7"],"inventory":["12.0"],"works":["12.0","60.0"],"most":["12.0","50.0","92.3"],"same":["12.0","27.4","56.4","64.0","71.0","74.0","83.0","87.0","91.0","92.5","94.0","97.3","105.0","112.0","115.0","117.3"],"equipping":["12.0"],"allows":["12.0"],"drag":["12.0"],"individual":["12.0"],"entire":["12.0","23.6","27.2","55.6","56.2"],"equipped":["12.0"],"glyph":["12.0"],"while":["12.0","23.0","55.0","81.0","103.0"],"dragging":["12.0"],"highlight":["12.0","80.12"],"slots":["12.0"],"rolling":["12.0"],"uses":["12.0","14.0","86.0","108.0"],"physics":["12.0"],"engine":["12.0"],"detects":["12.0"],"once":["12.0","27.2","56.2"],"stopped":["12.0"],"moving":["12.0"],"determines":["12.0"],"com":["13.0","70.2","89.2","111.2"],"maggieappleton":["13.0"],"gardeners":["13.0"],"lyz":["13.0"],"code":["13.0","60.0","70.0","80.19","80.52","89.0","102.1","102.34","111.0"],"best":["13.0","23.0","26.1","52.1","55.0","76.0","98.0","118.0"],"pre":["14.0"],"configured":["14.0"],"explicitly":["14.0","45.1"],"allowed":["14.0"],"incremental":["14.0","24.11","57.11"],"these":["15.1","62.2","76.0","98.0","103.3","118.0"],"ideas":["15.1"],"are":["15.1","26.2","27.1","52.2","56.1","80.15","80.26","102.8"],"learned":["15.1"],"lessons":["15.1"],"from":["15.1","23.3","23.5","23.6","24.7","55.3","55.5","55.6","57.7","80.9","88.0"],"usenet":["15.1"],"days":["15.1"],"weird":["15.1"],"may":["15.1","24.11","27.4","45.0","56.4","57.11","81.0","103.0"],"eventually":["15.1","27.3","56.3"],"move":["15.1","27.2","56.2"],"in":["15.1","24.9","40.0","57.9","61.3","65.0","80.7","80.13","80.15","80.30","80.37","80.49","80.54","84.0","92.0","92.2","102.12","102.19","102.31","102.36","106.0","113.0","113.2"],"direction":["15.1","95.0"],"say":["15.2"],"author":["15.2"],"x":["15.2","72.1","92.1","113.1"],"handle":["15.2"],"losing":["15.2","24.7","57.7"],"do":["15.2","23.0","27.1","55.0","56.1","64.0","66.0","71.0","81.3","83.0","86.0","91.0","92.7","94.0","95.0","105.0","112.0","113.7","115.0"],"has":["15.2","30.0"],"new":["15.2","24.8","57.8","62.1"],"essentially":["15.3"],"like":["15.3","24.0","35.0","45.2","57.0","67.0","81.2","97.1","103.2","117.1"],"existing":["15.3","21.0"],"specific":["15.3","22.2","54.2"],"poster":["15.3"],"id":["15.3","69.0","71.0","91.0","92.6","112.0"],"will":["15.4","24.0","26.3","52.3","57.0","66.0","72.5","80.29","80.46","81.0","102.11","102.28","107.0"],"inevitably":["15.4"],"keep":["15.4","76.0","98.0","118.0"],"full":["15.4"],"history":["15.4"],"though":["15.4"],"groups":["15.4"],"communities":["15.4"],"just":["15.4","24.9","57.9","72.3","81.3","97.1","117.1"],"specially":["15.4"],"flagged":["15.4"],"posting":["15.4"],"community":["15.4","24.3","57.3"],"replying":["15.4"],"looking":["15.5"],"analyzing":["15.5"],"content":["15.5"],"ai":["15.5"],"this":["15.5","20.0","22.0","40.0","54.0","64.0","71.0","83.0","91.0","97.0","105.0","112.0","117.0"],"way":["15.5","23.5","40.0","55.5","67.0","72.2","77.0","99.0","113.2","119.0"],"effectively":["15.5","27.4","56.4"],"preferred":["15.5"],"also":["15.5","97.0","117.0"],"add":["15.5","87.0","109.0"],"additional":["15.5","25.1","53.1","66.0","107.0"],"redundancy":["15.6"],"multiple":["15.6","80.45","102.27"],"relay":["15.6"],"cannot":["15.6"],"trust":["15.6"],"several":["15.6","61.4","92.6"],"identical":["15.6","66.0","107.0"],"rules":["15.6"],"not":["15.6","38.1","61.1","61.2","80.1","80.14","80.39","95.0","102.21"],"relaying":["15.6"],"typically":["16.0","22.1","54.1"],"refers":["16.0"],"sites":["16.0"],"implementing":["16.0"],"repository":["17.0"],"hosting":["17.0"],"living":["18.0"],"documents":["18.0"],"theoretical":["18.0"],"mentions":["20.0","39.0"],"some":["20.0","24.6","39.0","57.6","76.0","85.0","98.0","118.0"],"of":["20.0","28.0","35.1","39.0","80.37","80.54","102.19","102.36","102.38"],"display":["21.0","63.0","73.0","80.29","80.30","82.0","93.0","102.11","102.12","104.0","114.0"],"changes":["21.0","70.0","80.16","86.0","89.0","108.0","111.0"],"similar":["21.0","27.2","56.2","66.0","71.0","86.0","87.0","91.0","104.0","107.0","108.0","109.0","112.0"],"git":["21.0","46.0"],"diffs":["21.0"],"s":["22.0","22.1","50.0","54.0","54.1","64.0","71.0","74.0","80.24","81.2","83.0","91.0","94.0","97.1","102.6","103.2","105.0","112.0","115.0","117.1"],"explore":["22.0","54.0"],"reasons":["22.0","26.3","52.3","54.0"],"why":["22.0","23.6","54.0","55.6"],"technically":["22.1","54.1"],"phone":["22.1","54.1"],"all":["22.1","24.4","27.2","54.1","56.2","57.4","59.0","60.0","62.0","78.0","80.46","92.0","100.0","102.28","107.0","109.0","113.0"],"javascript":["22.1","54.1"],"perfectly":["22.1","54.1"],"viable":["22.1","45.3","54.1"],"language":["22.1","54.1"],"making":["22.1","35.0","54.1"],"games":["22.1","54.1"],"whereas":["22.1","54.1"],"going":["22.1","54.1","70.2","89.2","111.2"],"general":["22.2","54.2"],"as":["22.2","45.3","54.2","75.0","92.5","97.3","117.3"],"well":["22.2","54.2"],"tend":["22.2","54.2"],"very":["22.2","23.6","54.2","55.6","80.15"],"developer":["22.2","54.2"],"friendly":["22.2","54.2"],"a":["22.2","35.1","41.0","54.2","80.18","80.25","80.30","80.35","80.40","80.41","80.43","92.7","102.7","102.12","102.17","102.22","102.23","102.25","113.7"],"lot":["22.2","47.0","54.2"],"expected":["22.3","54.3"],"if":["22.3","24.5","25.1","53.1","54.3","57.5","80.29","92.5","102.11","116.0"],"an":["22.3","28.0","54.3"],"it":["22.3","45.3","54.3","71.0","91.0","95.0","96.0","97.1","112.0","117.1"],"almost":["22.3","54.3","62.0"],"certainly":["22.3","24.1","24.2","54.3","57.1","57.2"],"accepting":["22.3","54.3"],"my":["23.0","24.0","24.9","25.0","25.1","26.2","52.2","53.0","53.1","55.0","57.0","57.9"],"contextualize":["23.0","55.0"],"generalize":["23.0","55.0"],"without":["23.0","55.0"],"requiring":["23.0","55.0"],"reader":["23.0","55.0"],"watch":["23.0","55.0"],"worth":["23.0","55.0"],"disagreed":["23.0","55.0"],"does":["23.1","27.1","55.1","56.1"],"detract":["23.1","23.3","55.1","55.3"],"however":["23.1","55.1"],"actually":["23.1","41.0","55.1","61.1"],"part":["23.1","23.6","55.1","55.6"],"makes":["23.1","23.5","55.1","55.5"],"augments":["23.1","55.1"],"increases":["23.1","55.1","72.5","113.6"],"naturally":["23.1","55.1"],"gaining":["23.1","55.1"],"they":["23.1","23.3","26.1","52.1","55.1","55.3","66.0","80.26","92.3","102.8","107.0"],"play":["23.1","23.5","23.6","24.6","55.1","55.5","55.6","57.6","72.1","92.1","113.1"],"replacing":["23.1","55.1"],"increase":["23.1","55.1"],"exaggerating":["23.1","55.1"],"exacerbate":["23.2","55.2"],"video":["23.2","55.2"],"other":["23.2","24.6","45.0","45.5","55.2","57.6","61.10","69.0","72.2","76.0","80.41","81.0","81.2","98.0","102.23","103.2","113.2","118.0"],"genres":["23.2","55.2"],"taking":["23.2","55.2"],"priority":["23.2","55.2"],"life":["23.2","55.2"],"manipulating":["23.2","55.2"],"sleep":["23.2","55.2"],"schedule":["23.2","55.2"],"prudent":["23.2","55.2"],"help":["23.2","55.2"],"r":["23.2","55.2"],"stopgaming":["23.2","55.2"],"resources":["23.2","55.2","92.7","113.7"],"since":["23.2","26.2","50.0","52.2","55.2"],"built":["23.2","55.2"],"on":["23.2","24.0","27.2","55.2","56.2","57.0","72.0","72.2","80.19","80.20","102.1","102.2","113.2"],"extrinsic":["23.2","55.2"],"motivations":["23.2","55.2"],"form":["23.2","46.0","55.2","67.0","68.0","77.0"],"progression":["23.2","55.2"],"systems":["23.2","55.2"],"whether":["23.2","55.2","72.5","85.0","113.6"],"continue":["23.2","55.2"],"because":["23.2","26.0","27.1","52.0","55.2","56.1"],"enjoying":["23.2","55.2"],"gameplay":["23.2","24.7","27.1","30.0","55.2","56.1","57.7"],"figured":["23.3","55.3"],"out":["23.3","55.3","72.0","81.0","89.2","111.2"],"optimized":["23.3","55.3"],"mastered":["23.3","55.3"],"doesn":["23.3","24.6","27.2","55.3","56.2","57.6","93.0"],"sense":["23.3","27.4","55.3","56.4"],"engaged":["23.4","55.4"],"longer":["23.4","55.4","80.37","80.46","102.19","102.28"],"compared":["23.4","55.4"],"ended":["23.5","55.5"],"up":["23.5","27.3","55.5","56.3","70.0","89.0","93.0","111.0","113.3"],"ruined":["23.5","24.1","55.5","57.1"],"them":["23.5","24.0","55.5","57.0","80.43","85.0","102.25"],"developers":["23.5","55.5"],"solved":["23.5","55.5"],"removing":["23.5","55.5"],"apart":["23.5","55.5"],"intentionally":["23.5","55.5"],"one":["23.5","24.2","50.0","55.5","57.2","70.1","76.0","88.0","89.1","98.0","111.1","118.0"],"mocking":["23.5","55.5"],"playstyle":["23.5","55.5"],"did":["23.5","55.5"],"its":["23.5","55.5","61.5","86.0","92.0","92.6","108.0","113.0"],"aggressively":["23.5","55.5"],"often":["23.5","55.5"],"bring":["23.5","55.5"],"conversation":["23.5","55.5"],"back":["23.5","55.5"],"incrementals":["23.5","55.5"],"incredibly":["23.5","55.5"],"opinionated":["23.5","55.5"],"what":["23.5","25.2","26.1","52.1","53.2","55.5","69.0","72.1","92.1","110.0","113.1"],"itself":["23.6","24.1","26.3","52.3","55.6","57.1"],"chose":["23.6","55.6"],"particular":["23.6","24.2","55.6","57.2"],"design":["23.6","26.1","52.1","55.6"],"decision":["23.6","55.6"],"hell":["23.6","55.6"],"you":["23.6","24.5","24.6","25.1","41.0","53.1","55.6","57.5","57.6","61.8","71.0","80.9","80.29","80.38","81.3","91.0","92.2","102.11","102.20","112.0"],"through":["23.6","55.6"],"thought":["23.6","27.2","55.6","56.2"],"feeling":["23.6","55.6"],"i":["24.0","35.0","57.0"],"d":["24.0","24.5","57.0","57.5"],"go":["24.0","27.4","56.4","57.0","73.0","114.0"],"over":["24.0","24.3","57.0","57.3"],"couple":["24.0","25.1","27.3","47.0","53.1","56.3","57.0"],"suggestions":["24.0","57.0"],"ve":["24.0","57.0"],"seen":["24.0","57.0"],"here":["24.0","24.4","35.1","57.0","57.4","72.3","92.3","92.7","113.7"],"personal":["24.0","57.0"],"preferences":["24.0","57.0"],"state":["24.0","57.0"],"about":["24.1","25.1","53.1","57.1","81.3"],"parody":["24.1","57.1"],"commentary":["24.1","57.1"],"popular":["24.1","24.10","57.1","57.10"],"videos":["24.1","57.1"],"good":["24.1","57.1","92.4","113.4"],"satire":["24.1","57.1"],"was":["24.1","25.0","53.0","57.1","63.0","66.0","82.0","86.0","87.0","104.0","107.0","108.0","109.0"],"interested":["24.1","45.3","57.1"],"response":["24.1","57.1"],"latter":["24.1","57.1"],"fan":["24.1","24.11","57.1","57.11"],"definition":["24.1","57.1"],"ascribes":["24.1","57.1"],"motive":["24.1","57.1"],"happens":["24.1","57.1","80.46","102.28"],"apply":["24.1","57.1"],"there":["24.1","57.1"],"commenting":["24.1","57.1"],"different":["24.1","24.5","27.1","56.1","57.1","57.5","72.2","92.6","113.2"],"including":["24.1","57.1","92.0","113.0"],"case":["24.1","27.3","56.3","57.1"],"prestige":["24.1","57.1","92.5","97.3","117.3"],"tree":["24.1","30.0","57.1","70.2","72.5","80.21","102.3","110.0","113.6"],"classic":["24.1","57.1"],"ascension":["24.1","57.1"],"omega":["24.1","57.1"],"layers":["24.1","57.1","60.0","80.5","80.27","80.28","80.51","102.9","102.10","102.33"],"course":["24.1","57.1"],"optimal":["24.2","57.2"],"progress":["24.2","24.7","57.2","57.7"],"get":["24.2","27.3","56.3","57.2","92.2"],"complex":["24.2","57.2"],"we":["24.2","57.2"],"accept":["24.2","57.2"],"premise":["24.2","57.2"],"could":["24.2","27.2","56.2","57.2"],"fall":["24.2","57.2"],"under":["24.2","57.2","63.0","66.0","82.0","86.0","87.0","104.0","107.0","108.0","109.0"],"still":["24.2","45.0","57.2"],"need":["24.2","57.2","88.0"],"bit":["24.2","27.3","56.3","57.2","70.0","89.0","111.0"],"tricky":["24.2","57.2"],"due":["24.2","57.2"],"factory":["24.2","57.2"],"builders":["24.2","57.2"],"factorio":["24.2","57.2"],"satisfactory":["24.2","57.2"],"aren":["24.3","57.3"],"genre":["24.3","57.3"],"have":["24.3","41.0","57.3","72.3","72.5","80.53","102.35","113.6"],"difficulties":["24.3","57.3"],"defining":["24.3","57.3"],"themselves":["24.3","57.3"],"seems":["24.3","57.3"],"roguelikes":["24.3","57.3"],"another":["24.3","57.3","80.9","80.21","88.0","102.3"],"where":["24.3","24.8","50.0","57.3","57.8","68.0","80.26","102.8"],"argues":["24.3","57.3"],"formal":["24.3","57.3"],"incrementalness":["24.4","57.4"],"ll":["24.4","57.4"],"propose":["24.4","57.4"],"such":["24.4","57.4","72.3","92.3","113.3"],"no":["24.4","27.4","56.4","57.4","80.25","80.37","81.0","102.7","102.19","103.0"],"means":["24.4","57.4"],"considered":["24.4","57.4"],"note":["24.4","57.4"],"temple":["24.4","57.4"],"congruent":["24.5","57.5"],"so":["24.5","27.2","56.2","57.5","64.0","71.0","83.0","86.0","87.0","91.0","94.0","105.0","109.0","112.0","115.0"],"ultimately":["24.5","26.0","52.0","57.5"],"m":["24.5","57.5"],"sure":["24.5","27.0","56.0","57.5"],"asked":["24.5","26.1","52.1","57.5"],"people":["24.5","51.0","57.5"],"their":["24.5","57.5","80.43","102.25"],"node":["24.6","57.6","80.24","96.0","102.6"],"might":["24.6","57.6"],"impact":["24.6","57.6"],"qualify":["24.6","57.6"],"players":["24.6","57.6"],"percentage":["24.6","57.6"],"modifier":["24.6","57.6"],"stat":["24.6","57.6"],"simply":["24.7","57.7"],"progressing":["24.7","57.7"],"never":["24.7","27.2","56.2","57.7"],"optimization":["24.7","57.7"],"problems":["24.7","57.7"],"predominant":["24.7","57.7"],"solving":["24.7","57.7"],"deciding":["24.7","57.7"],"which":["24.7","27.3","46.0","56.3","57.7","63.0","66.0","73.0","80.5","82.0","86.0","93.0","97.0","104.0","107.0","108.0","114.0","117.0"],"purchase":["24.7","57.7"],"save":["24.7","57.7","73.0","93.0","114.0"],"reasoning":["24.7","57.7"],"something":["24.8","57.8","67.0","77.0","85.0","96.0","99.0","119.0"],"waiting":["24.8","57.8"],"mechanic":["24.8","57.8"],"come":["24.8","57.8"],"across":["24.8","57.8"],"times":["24.8","57.8","80.45","102.27"],"action":["24.8","57.8"],"can":["24.8","57.8","61.8"],"take":["24.8","57.8","93.0"],"those":["24.9","27.0","37.0","56.0","57.9","64.0","74.0","75.0","83.0","90.0","105.0"],"stretch":["24.9","57.9"],"opinion":["24.9","57.9"],"isn":["24.9","57.9","81.0","103.0"],"flash":["24.10","57.10"],"websites":["24.10","57.10"],"featured":["24.10","57.10"],"focused":["24.10","49.0","57.10"],"buying":["24.10","27.2","27.3","56.2","56.3","57.10"],"would":["24.10","26.1","45.3","50.0","52.1","57.10","85.0"],"allow":["24.10","57.10"],"attain":["24.10","57.10"],"currency":["24.10","27.3","56.3","57.10","80.18","80.51","86.0","102.33","108.0"],"sort":["24.10","57.10"],"minigame":["24.10","57.10"],"earn":["24.10","57.10"],"see":["25.0","53.0"],"changelog":["25.0","53.0","80.16"],"at":["25.0","34.0","53.0","60.0","80.34","80.54","102.16","102.36"],"made":["25.0","27.2","27.4","53.0","56.2","56.4","80.27","80.35","102.9","102.17"],"before":["25.0","27.2","41.0","53.0","56.2"],"switch":["25.0","53.0","97.1","117.1"],"myself":["25.1","27.0","47.0","53.1","56.0"],"any":["25.1","45.2","53.1","65.0","84.0","106.0"],"questions":["25.1","53.1"],"criticism":["25.3","53.3"],"important":["26.0","52.0"],"be":["26.0","45.0","52.0","72.5","76.0","80.33","98.0","102.15","113.6","118.0"],"able":["26.0","27.3","52.0","56.3","80.35","102.17"],"process":["26.0","52.0"],"navigate":["26.0","52.0"],"collecting":["26.0","52.0"],"feedback":["26.0","38.0","52.0"],"essential":["26.0","52.0"],"journey":["26.0","26.3","52.0","52.3"],"becoming":["26.0","52.0"],"better":["26.0","52.0"],"grain":["26.1","52.1"],"salt":["26.1","52.1"],"determine":["26.1","52.1","90.0","116.0"],"actual":["26.1","52.1"],"problem":["26.1","52.1"],"experiencing":["26.1","52.1"],"solution":["26.1","52.1"],"regardless":["26.1","52.1"],"player":["26.1","27.1","52.1","56.1","64.0","71.0","91.0","96.0","112.0"],"much":["26.2","52.2"],"likely":["26.2","52.2"],"leave":["26.2","52.2","72.0","81.0"],"positive":["26.2","52.2"],"constructive":["26.2","52.2"],"comments":["26.2","52.2"],"been":["26.2","52.2","61.5"],"remember":["26.3","52.3"],"passion":["26.3","52.3"],"initial":["26.3","52.3"],"into":["26.3","52.3","73.0","114.0"],"development":["26.3","52.3"],"mostly":["27.0","56.0","59.0","78.0","100.0"],"targeted":["27.0","56.0"],"toward":["27.0","56.0"],"who":["27.0","44.0","45.4","56.0"],"ask":["27.0","56.0"],"settle":["27.0","56.0"],"long":["27.0","27.2","35.1","56.0","56.2"],"provide":["27.0","56.0"],"constitutes":["27.1","56.1"],"either":["27.1","56.1"],"consecutive":["27.1","56.1"],"blends":["27.1","56.1"],"together":["27.1","56.1"],"individually":["27.1","56.1"],"change":["27.1","46.0","56.1"],"clicks":["27.1","56.1"],"meaningfully":["27.1","56.1"],"series":["27.2","56.2"],"static":["27.2","48.0","56.2","80.51","102.33"],"press":["27.2","56.2"],"tab":["27.2","56.2","92.1","113.1"],"button":["27.2","56.2","72.1","75.0","80.33","81.4","92.1","102.15","107.0","109.0","113.1"],"term":["27.3","35.1","56.3"],"reset":["27.3","56.3","80.19","80.26","85.0","102.1","102.8"],"won":["27.3","56.3","80.40","102.22"],"future":["27.3","56.3"],"prestiges":["27.3","56.3","72.3"],"crystallize":["27.3","56.3"],"crystallizes":["27.3","56.3"],"complete":["27.3","56.3","67.0"],"challenges":["27.3","56.3","80.34","102.16"],"finally":["27.3","56.3","89.2","111.2"],"grasshop":["27.3","56.3"],"grasshopping":["27.3","56.3"],"resource":["27.3","56.3"],"difference":["27.4","56.4"],"directly":["27.4","56.4","92.3"],"instance":["28.0","45.2"],"mbin":["28.0"],"forgejo":["28.0"],"karla":["29.0"],"modding":["30.0","70.2"],"goes":["30.0"],"outlining":["31.0"],"decentralized":["32.0"],"posts":["33.0"],"reddit":["33.0"],"https":["34.0","70.2","89.2","111.2"],"ecs":["35.0","35.2"],"project":["35.1"],"modify":["37.0","97.1","117.1"],"redistribute":["37.0"],"3d":["38.0"],"visual":["38.0","80.4","80.10"],"system":["38.0","81.4"],"american":["38.1"],"learning":["38.1"],"novel":["38.1"],"sound":["38.1"],"found":["38.1"],"english":["38.1"],"program":["38.2"],"now":["38.2","80.46","80.51","102.28","102.33"],"includes":["38.2"],"documentation":["38.2","81.0","103.0"],"unit":["38.2"],"tests":["38.2"],"improve":["38.2"],"cool":["39.0"],"everything":["40.0"],"garden":["40.0"],"getting":["41.0"],"trial":["41.0"],"period":["41.0"],"ensure":["41.0"],"artist":["43.0"],"absent":["43.0","74.0","85.0","90.0","92.4","94.0","113.4","115.0"],"popularized":["44.0"],"article":["44.0"],"written":["44.0"],"maggie":["44.0"],"appleton":["44.0"],"chronological":["45.0"],"link":["45.0"],"between":["45.0","62.2","80.21","97.1","102.3","103.3","117.1"],"each":["45.0","73.0","92.6","93.0","114.0"],"amongst":["45.1"],"codeberg":["45.2"],"pages":["45.2"],"server":["45.2"],"how":["45.3","72.1","92.1","113.1"],"include":["45.3"],"chat":["45.3"],"messages":["45.3"],"stream":["45.3","46.0"],"want":["45.4"],"receive":["45.4"],"easily":["45.5","80.25","102.7"],"transferrable":["45.5"],"servers":["45.5","50.0"],"possibly":["45.5","85.0"],"even":["45.5","62.1","97.1","117.1"],"supports":["45.5"],"nomadic":["45.5"],"identities":["45.5"],"rtser0crjy8":["45.6"],"gives":["46.0"],"diff":["46.0"],"summary":["46.0"],"pushed":["46.0"],"indieweb":["46.0"],"overhead":["47.0"],"severely":["47.0"],"limited":["47.0"],"instead":["47.0","99.0","119.0"],"infinite":["47.0"],"procedurally":["47.0"],"generated":["47.0"],"simple":["47.0"],"site":["48.0","70.0","89.0","111.0"],"narrative":["49.0"],"bridge":["50.0"],"channel":["50.0"],"tiers":["51.0"],"giving":["51.0"],"access":["51.0","63.0","66.0","67.0","77.0","82.0","86.0","87.0","104.0","107.0","108.0","109.0"],"many":["59.0","78.0","100.0"],"were":["59.0","78.0","100.0"],"expanding":["59.0","78.0","100.0"],"abbreviations":["59.0","78.0","100.0"],"instances":["59.0","78.0","100.0"],"chall":["59.0","78.0","100.0"],"challenge":["59.0","78.0","92.6","100.0"],"unl":["59.0","78.0","100.0"],"unlocked":["59.0","75.0","78.0","80.46","92.5","97.3","100.0","102.28","113.5","117.3"],"upg":["59.0","78.0","100.0"],"upgrade":["59.0","72.5","78.0","100.0","113.6"],"besides":["59.0","78.0","100.0"],"css":["59.0","67.0","68.0","72.1","77.0","78.0","92.6","100.0"],"amt":["59.0","78.0","100.0"],"or":["60.0","70.2","72.3","80.17","81.2","103.2"],"affecting":["61.1"],"victory":["61.3"],"tas":["61.4"],"stuff":["61.5"],"lol":["61.5"],"bar":["61.6","69.0"],"layer":["61.7","64.0","71.0","73.0","80.55","83.0","91.0","96.0","102.37","105.0","112.0"],"beneath":["61.7","66.0","107.0"],"unlock":["61.8","72.5","113.6"],"slower":["61.10"],"row":["61.12","97.3","117.3"],"y":["62.0"],"constant":["62.0"],"dynamic":["62.0"],"putting":["62.0"],"function":["62.0","80.36","90.0","92.0","102.18","113.0"],"create":["62.1"],"entirely":["62.1"],"use":["62.1","72.1","80.9","80.22","80.52","102.4","102.34"],"updating":["62.1","80.1","80.14"],"tmt":["62.1","80.47","102.29"],"using":["62.1","92.0","113.0"],"thing":["62.2","103.3"],"that":["62.2","80.25","80.40","102.7","102.22","103.3"],"sometimes":["62.2","81.0","103.0","103.3"],"clickable":["62.2","103.3"],"whole":["62.3","103.4"],"infoboxes":["62.3","92.2","103.4","113.2"],"boxes":["62.3","103.4"],"key":["63.0","66.0","81.0","82.0","86.0","87.0","92.1","103.0","104.0","107.0","108.0","109.0","113.1"],"stored":["63.0","66.0","82.0","87.0","104.0","107.0","109.0"],"convenient":["63.0","66.0","82.0","86.0","87.0","104.0","107.0","108.0","109.0"],"example":["63.0","66.0","82.0","86.0","87.0","92.6","97.2","104.0","107.0","108.0","109.0","117.2"],"goaltooltip":["63.0","82.0","104.0"],"depracated":["63.0"],"locked":["63.0","82.0","92.5","97.3","104.0","117.3"],"overrides":["63.0","82.0","104.0"],"hint":["63.0","82.0","104.0"],"attributes":["64.0","68.0","77.0","83.0","105.0"],"values":["64.0","75.0","80.19","83.0","90.0","102.1","105.0"],"both":["64.0","68.0","74.0","83.0","90.0","94.0","105.0","115.0"],"assigned":["64.0","71.0","74.0","83.0","91.0","94.0","105.0","112.0","115.0"],"automagically":["64.0","71.0","74.0","83.0","91.0","94.0","105.0","112.0","115.0"],"name":["64.0","71.0","83.0","87.0","91.0","105.0","112.0"],"gainmult":["65.0","106.0","113.3"],"multiplier":["65.0","106.0","113.3"],"factor":["65.0","84.0","106.0"],"bonuses":["65.0","84.0","106.0"],"multiplying":["65.0","84.0","106.0"],"gainexp":["65.0","84.0","106.0","113.3"],"points":["66.0","71.0","87.0","91.0","104.0","109.0","112.0"],"sellone":["66.0","107.0"],"sellall":["66.0","107.0"],"cause":["66.0","80.40","102.22","107.0"],"functionally":["66.0","107.0"],"above":["66.0","85.0","87.0","107.0","109.0"],"next":["67.0","99.0","119.0"],"feature":["67.0","99.0","119.0"],"currencylocation":["67.0","99.0","119.0"],"inside":["67.0","77.0","99.0","119.0"],"e":["67.0","77.0","80.26","99.0","102.8","119.0"],"g":["67.0","77.0","99.0","119.0"],"buyable":["67.0","77.0","99.0","119.0"],"contains":["67.0","77.0","80.17","92.6"],"buyables":["67.0","77.0","80.48","102.30"],"completionlimit":["67.0"],"completion":["67.0"],"style":["67.0","68.0","72.1","72.2","77.0","113.2"],"applies":["67.0","68.0","77.0"],"onclick":["68.0","95.0"],"implements":["68.0","90.0"],"clicking":["68.0","80.42","90.0","102.24"],"keys":["68.0","77.0"],"strings":["68.0","74.0","75.0","90.0","94.0","115.0"],"infobox":["69.0"],"toggles":["69.0","88.0","110.0"],"bool":["69.0","88.0","90.0","110.0"],"identifies":["69.0","88.0","110.0"],"rest":["69.0","110.0"],"sub":["69.0","110.0"],"set":["70.0","89.0","111.0"],"io":["70.0","89.0","111.0"],"undo":["70.0","89.0","111.0"],"list":["70.1","89.1","111.1"],"repositiories":["70.1","89.1","111.1"],"select":["70.1","89.1","111.1"],"online":["70.2","89.2","111.2"],"line":["70.2","73.0","89.2","93.0","111.2","114.0"],"share":["70.2","89.2","111.2"],"others":["70.2","89.2","111.2"],"raw":["70.2","89.2","111.2"],"githack":["70.2","89.2","111.2"],"username":["70.2"],"value":["71.0","80.39","91.0","102.21","112.0"],"depending":["72.0","81.0","103.0"],"things":["72.0","72.3","80.35","102.17"],"optional":["72.0","80.46","80.50","81.0","102.28","102.32"],"p":["72.1","92.1","97.2","113.1","117.2"],"hotkey":["72.1","92.1","113.1"],"uppercase":["72.1","92.1","113.1"],"combined":["72.1","92.1","113.1"],"shift":["72.1","92.1","113.1"],"ctrl":["72.1","92.1","113.1"],"desc":["72.1"],"onpress":["72.1","92.1","113.1"],"called":["72.1","85.0"],"when":["72.1","72.3","72.4","80.5","80.18","80.40","81.0","85.0","92.2","102.22","103.0","113.5"],"pressed":["72.1","85.0"],"achievements":["72.2","81.3"],"kind":["72.2"],"differences":["72.2","113.2"],"extra":["72.2","113.2"],"boosts":["72.3","92.3","113.3"],"plug":["72.3","92.3"],"onprestige":["72.3"],"triggers":["72.3"],"secondary":["72.3"],"recalculate":["72.3"],"whatnot":["72.3"],"resetdesc":["72.3"],"tooltip":["72.4","80.31","102.13","113.5"],"tooltiplocked":["72.4","113.5"],"functions":["72.4","80.6","92.6","113.3","113.5"],"return":["72.4","72.5","73.0","92.7","93.0","113.5","113.6","113.7","114.0"],"used":["72.5","81.0","103.0","113.6"],"harder":["72.5","113.6"],"shouldnotify":["72.5","96.0","113.6","116.0"],"should":["72.5","113.6","116.0"],"highlighted":["72.5","96.0","113.6"],"buy":["72.5","80.48","102.30"],"gain":["73.0"],"calculation":["73.0","114.0"],"addedplayerdata":["73.0","114.0"],"non":["73.0","81.4"],"related":["73.0","93.0","114.0"],"added":["73.0","93.0","114.0"],"object":["73.0","80.56","92.6","93.0","114.0"],"weather":["73.0","93.0","114.0"],"yes":["73.0","93.0","114.0"],"happiness":["73.0","93.0","114.0"],"displaythings":["73.0","93.0","114.0"],"html":["73.0","80.30","80.54","102.12","102.36"],"support":["73.0","80.15","93.0","114.0"],"shown":["74.0","94.0","103.4","115.0"],"always":["74.0","85.0","90.0","94.0","115.0","116.0"],"buttonstyle":["75.0"],"affects":["75.0","88.0"],"appearance":["75.0"],"green":["76.0","98.0","118.0"],"modified":["76.0","98.0","118.0"],"by":["76.0","80.15","88.0","92.2","98.0","108.0","110.0","118.0"],"edit":["76.0","98.0","118.0"],"amount":["77.0","99.0","119.0"],"updated":["79.0","101.0"],"give":["80.2"],"nans":["80.2"],"setdir":["80.3","95.0"],"particles":["80.3"],"autoupgrade":["80.4"],"minor":["80.4"],"maxed":["80.5"],"deactivated":["80.5"],"moved":["80.6"],"basic":["80.6"],"getter":["80.6"],"setter":["80.6"],"decimal":["80.7","80.37","86.0","102.19"],"places":["80.7","80.15","80.37","102.19"],"thanks":["80.7"],"clickables":["80.8","80.20","102.2"],"lets":["80.9"],"components":["80.9","80.43","80.46","92.6","102.25","102.28"],"ability":["80.9","80.25","102.7"],"fixed":["80.10","80.11","80.40","80.51","102.22","102.33"],"issue":["80.10","80.24","80.49","80.50","102.6","102.31","102.32"],"mobile":["80.10"],"browsers":["80.11"],"missing":["80.11"],"pixel":["80.11"],"incorrectly":["80.12"],"issues":["80.13","80.40","80.41","102.22","102.23"],"buttons":["80.15"],"force":["80.15"],"displayed":["80.15","92.1","113.1"],"tooltips":["80.15","92.5","97.3","117.3"],"resets":["80.15"],"formatting":["80.15"],"numbers":["80.15","80.17"],"disabled":["80.15","92.5"],"default":["80.15","80.54","92.2","102.36","116.0"],"undocumented":["80.16"],"version":["80.17"],"number":["80.17"],"special":["80.17"],"characters":["80.17"],"irrational":["80.17"],"ctrldown":["80.17"],"shiftdown":["80.17"],"variables":["80.17"],"base":["80.18"],"reorganization":["80.19","102.1"],"improved":["80.20","102.2"],"unlocking":["80.20","102.2"],"nodes":["80.21","80.33","81.4","102.3","102.15","110.0"],"attempt":["80.21","102.3"],"features":["80.22","81.0","102.4","103.0"],"popups":["80.23","102.5"],"spacing":["80.24","102.6"],"symbol":["80.24","102.6"],"effectdescription":["80.25","102.7"],"collection":["80.25","102.7"],"order":["80.26","80.51","102.8","102.33"],"tmp":["80.27","102.9"],"hard":["80.27","102.9"],"resetting":["80.27","102.9"],"side":["80.28","80.31","80.33","102.10","102.13","102.15"],"appearing":["80.28","80.50","102.10","102.32"],"main":["80.30","102.12"],"setting":["80.31","80.34","102.13","102.16"],"offset":["80.32","102.14"],"fix":["80.32","102.14"],"jacorb":["80.33","102.15"],"completed":["80.34","102.16"],"hides":["80.34","102.16"],"max":["80.34","102.16"],"completions":["80.34","102.16"],"thank":["80.34","80.38","102.16","102.20"],"thepaperpilot":["80.34","80.38","102.16","102.20"],"displaying":["80.35","102.17"],"enough":["80.35","102.17"],"digits":["80.35","102.17"],"few":["80.35","80.41","102.17","102.23"],"update":["80.36","80.46","102.18","102.28"],"appear":["80.37","102.19","107.0"],"links":["80.38","80.44","102.20","102.26"],"replaced":["80.40","102.22"],"minimal":["80.40","102.22"],"edited":["80.40","102.22"],"bars":["80.41","102.23"],"own":["80.43","102.25"],"gave":["80.43","102.25"],"hide":["80.43","102.25"],"show":["80.43","80.51","85.0","102.25","102.33"],"being":["80.44","102.26"],"defaults":["80.46","102.28"],"true":["80.46","92.2","92.4","92.7","96.0","102.28","113.4","113.7","116.0"],"displays":["80.46","92.2","102.28","113.2"],"correctly":["80.46","102.28"],"generation":["80.46","102.28"],"github":["80.47","102.29"],"title":["80.47","102.29"],"probably":["80.50","102.32"],"separate":["80.51","102.33"],"place":["80.51","92.0","102.33","113.0"],"hasmilestone":["80.51","92.1","102.33"],"incr":["80.51","102.33"],"sample":["80.52","102.34"],"to":["80.52","80.53","102.34","102.35"],"blanks":["80.53","102.35"],"configurable":["80.54","102.36"],"offline":["80.54","102.36"],"time":["80.54","102.36"],"limit":["80.54","102.36"],"modinfo":["80.54","102.36"],"top":["80.54","102.36"],"index":["80.54","102.36"],"config":["80.55","102.37"],"parameters":["80.56","102.38"],"lots":["80.56","102.38"],"reading":["81.0","103.0"],"describing":["81.0","103.0"],"label":["81.0","103.0"],"required":["81.0","86.0","103.0","108.0"],"crash":["81.0","103.0"],"included":["81.0","103.0"],"anything":["81.3"],"trees":["81.4","103.4"],"too":["81.4"],"particle":["81.4"],"deprecated":["82.0","86.0","104.0","108.0"],"layershown":["84.0"],"appears":["85.0","97.3","107.0","117.3"],"standard":["85.0"],"decrease":["85.0"],"cansellone":["85.0"],"cansellall":["85.0"],"booleans":["85.0"],"determining":["85.0"],"present":["85.0"],"appropriate":["85.0"],"respec":["85.0"],"beat":["86.0","108.0"],"currencydisplayname":["86.0","108.0"],"then":["88.0","110.0"],"information":["88.0","110.0","113.1"],"location":["88.0"],"grid":["88.0"],"gridable":["88.0"],"proxy":["88.0"],"consisting":["88.0"],"master":["89.2","111.2"],"middle":["89.2","111.2"],"push":["89.2","111.2"],"origin":["89.2","111.2"],"onto":["89.2","111.2"],"returning":["90.0","92.6"],"click":["90.0"],"onhold":["90.0"],"js":["92.1","92.6","97.2","113.1","117.2"],"holding":["92.1","113.1"],"later":["92.2","113.2"],"date":["92.2","113.2"],"achievementpopups":["92.2"],"milestonepopups":["92.2"],"false":["92.2"],"disables":["92.2"],"popup":["92.2"],"message":["92.2"],"achievement":["92.2"],"milestone":["92.2"],"text":["92.2","103.4","113.2"],"box":["92.2","113.2"],"upgrades":["92.3","113.3"],"divide":["92.3"],"root":["92.3"],"directmult":["92.3"],"multiplies":["92.3"],"exponents":["92.3"],"softcaps":["92.3"],"nothing":["92.4","93.0","113.4"],"automating":["92.4","113.4"],"normal":["92.4","97.1","113.4","117.1"],"autoprestige":["92.4","113.4"],"boolean":["92.4","113.4"],"respectively":["92.5","97.3","117.3"],"behave":["92.5","97.3","117.3"],"original":["92.5","97.3","117.3"],"notify":["92.6","96.0"],"red":["92.6"],"notification":["92.6"],"types":["92.6"],"componentstyles":["92.6"],"objects":["92.6"],"applied":["92.6"],"type":["92.6"],"height":["92.6"],"200px":["92.6"],"canreset":["92.7","113.7"],"isendgame":["93.0"],"tick":["95.0"],"onmouseover":["95.0"],"onmouseleave":["95.0"],"interacted":["95.0"],"setspeed":["95.0"],"clearparticles":["95.0"],"check":["95.0"],"delete":["95.0"],"deletes":["95.0"],"takes":["95.0"],"prestigenotify":["96.0"],"glowcolor":["96.0"],"specifies":["96.0"],"color":["96.0"],"glows":["96.0"],"causing":["96.0"],"glow":["96.0"],"altogether":["97.0","117.0"],"introduces":["97.0","117.0"],"component":["97.0","117.0"],"blank":["97.2","117.2"],"currencylayer":["99.0","119.0"],"omit":["99.0","119.0"],"elements":["103.0"],"following":["103.0"],"containing":["103.4","110.0"],"hidden":["103.4"],"sell":["107.0"],"currencyinternalname":["108.0"],"internal":["108.0"],"arrays":["110.0"],"names":["110.0"],"hotkeys":["113.1"],"array":["113.1"],"needs":["113.3"],"rounded":["113.3"],"calculate":["113.3"],"automatically":["113.6"],"visible":["116.0"],"keyword":["116.0"]},{"0":["22.1","54.1","92.3","113.3"],"1":["61.12","80.54","102.36"],"2":["30.0","47.0"],"5":["92.3","113.3"],"7":["76.0","98.0","118.0"],"8":["76.0","98.0","118.0"],"25":["90.0"],"51":["0.0"],"77":["0.0"],"1427":["0.0"],"small":["0.0","46.0"],"knowledge":["0.0","22.1","54.1"],"hub":["0.0"],"v":["0.0"],"ecs":["0.0"],"vitepress":["0.0","46.0"],"wanderstop":["0.0"],"webrings":["0.0","45.0"],"weird":["0.0","45.2"],"files":["0.0","70.1","80.24","89.1","102.6","111.1"],"changed":["0.0","80.46","102.28"],"insertions":["0.0"],"media":["1.0","36.0"],"tropes":["2.0"],"page":["2.0","26.0","40.0","52.0"],"on":["2.0","5.0","15.2","25.1","26.0","27.4","37.0","41.0","45.2","52.0","53.1","56.4"],"mentions":["2.0"],"some":["2.0","66.0","107.0"],"cool":["2.0","20.0"],"things":["2.0","20.0","27.4","39.0","45.5","56.4","72.1","80.46","80.56","81.4","92.1","102.28","102.38","113.1"],"about":["2.0","20.0","39.0","44.0","62.2","103.3"],"number":["3.0","27.4","56.4","80.5","80.30","80.37","80.40","102.12","102.19","102.22"],"of":["3.0","21.0","51.0","80.25","80.30","80.56","102.7","102.12"],"large":["3.0","24.1","50.0","57.1"],"instances":["3.0","51.0"],"but":["4.0","26.3","52.3","72.3","92.5"],"find":["4.0","24.11","26.1","52.1","57.11"],"code":["4.0"],"here":["4.0","27.2","30.0","38.1","56.2","72.1","72.6","113.3"],"screenshot":["5.0"],"png":["5.0"],"with":["6.0","15.3","24.4","45.3","57.4","72.3","72.5","80.4","80.15","80.17","80.25","102.7","113.6"],"comic":["6.0"],"rss":["7.0"],"work":["7.0"],"really":["7.0","24.6","57.6","73.0","93.0","114.0"],"well":["7.0","9.0","23.5","27.2","45.3","46.0","55.5","56.2","97.0","99.0","117.0","119.0"],"this":["7.0","24.5","57.5","80.17","80.38","102.20"],"form":["7.0","45.0"],"content":["7.0","18.0","25.2","53.2","76.0","98.0","118.0"],"messaging":["8.0","32.0"],"protocol":["8.0","42.0"],"not":["9.0","81.0","96.0","103.0"],"integrate":["9.0"],"f3":["9.0"],"as":["9.0","25.0","38.1","46.0","53.0","72.4","77.0","97.0","113.5","117.0"],"wants":["9.0"],"handle":["9.0"],"blogging":["9.0"],"certainly":["9.0"],"seems":["9.0"],"s":["9.0","18.0","22.3","24.2","54.3","57.2","62.1","90.0"],"message":["9.0","85.0","113.2"],"gardening":["9.0"],"concept":["9.0"],"playing":["10.0"],"stories":["10.0"],"aalto":["10.0"],"university":["10.0"],"games":["10.0","35.0"],"now":["10.0","24.10","57.10","80.17"],"everyone":["11.0","26.1","52.1"],"anyone":["11.0"],"try":["11.0"],"their":["11.0","22.3","54.3","92.2"],"hand":["11.0"],"at":["11.0","80.16"],"improving":["11.0","80.34","102.16"],"ecosystem":["11.0"],"side":["12.0","80.26","102.8"],"based":["12.0","15.2","27.4","56.4"],"normals":["12.0"],"closest":["12.0"],"straight":["12.0"],"flags":["12.0"],"cocked":["12.0"],"smallest":["12.0"],"angle":["12.0"],"above":["12.0","80.52","102.34"],"threshold":["12.0"],"sink":["12.0"],"table":["12.0","62.0"],"interfere":["12.0"],"any":["12.0","15.5","62.0"],"missile":["12.0"],"storm":["12.0"],"certain":["12.0"],"events":["12.0"],"winning":["12.0"],"having":["12.0","15.2","27.0","27.4","56.0","56.4"],"broken":["12.0"],"flash":["12.0"],"emotion":["12.0"],"second":["12.0","13.0"],"after":["12.0","15.6"],"random":["12.0"],"living":["12.0"],"chosen":["12.0"],"finisher":["12.0"],"move":["12.0"],"flashy":["12.0"],"dramatic":["12.0"],"shown":["12.0","62.3","72.2","92.2","113.2"],"arcane":["12.0"],"mechana":["12.0"],"became":["12.0"],"open":["12.0","22.2","54.2"],"source":["12.0"],"kasperzutterman":["13.0"],"brain":["13.0"],"zitadel":["14.0"],"does":["14.0"],"support":["14.0"],"probably":["14.0","24.2","57.2"],"won":["14.0"],"t":["14.0","25.0","53.0","73.0","75.0","114.0"],"implementing":["15.1"],"something":["15.1","24.1","57.1","72.3","73.0","86.0","93.0","108.0","114.0","116.0"],"like":["15.1","27.2","27.3","27.4","41.0","56.2","56.3","56.4","60.0","80.40","81.4","86.0","102.22","108.0"],"next":["15.1","27.1","56.1","80.51","86.0","102.33","108.0"],"gen":["15.1"],"iroh":["15.1","15.2"],"graph":["15.1"],"linked":["15.1"],"documents":["15.1"],"layers":["15.1","80.20","80.25","97.0","102.2","102.7","117.0"],"vouch":["15.2"],"clients":["15.2"],"decide":["15.2"],"also":["15.2","23.1","44.0","55.1","81.4","92.5"],"applies":["15.2"],"stolen":["15.2"],"compromised":["15.2"],"believe":["15.2"],"works":["15.2","70.2","89.2","111.2"],"way":["15.2","23.0","55.0","108.0"],"created":["15.3"],"shallow":["15.3"],"subscriptions":["15.3"],"lighten":["15.3"],"load":["15.3"],"communities":["15.3"],"subscribing":["15.4"],"effectively":["15.4"],"owns":["15.4"],"group":["15.4"],"rules":["15.5"],"hiding":["15.5"],"followed":["15.5"],"perhaps":["15.5","45.3"],"pull":["15.5"],"double":["15.5"],"duty":["15.5"],"themselves":["15.5"],"don":["15.6","25.0","53.0","72.0","81.0","103.0"],"pass":["15.6"],"whatever":["15.6","90.0"],"moderation":["15.6"],"heuristic":["15.6"],"therefore":["15.6","22.3","54.3"],"filtering":["15.6"],"out":["15.6","25.1","53.1"],"has":["15.6","27.2","44.0","56.2","73.0","93.0","114.0"],"done":["15.6"],"by":["15.6","72.3","80.19","94.0","102.1","113.2","115.0"],"downloading":["15.6"],"activitypub":["16.0"],"implementations":["16.0"],"nostr":["16.0"],"software":["17.0","31.0"],"better":["18.0","81.0"],"for":["18.0","24.3","24.8","38.0","57.3","57.8","72.0","80.38","80.52","102.20","102.34"],"manner":["19.0"],"specification":["21.0"],"proposal":["21.0"],"build":["21.0"],"set":["21.0","24.4","57.4"],"extensions":["21.0"],"appeals":["22.0","23.6","54.0","55.6"],"require":["22.1","54.1"],"using":["22.1","24.1","54.1","57.1","70.1","81.2","89.1","97.1","103.2","111.1","117.1"],"more":["22.1","24.6","54.1","57.6","72.1","80.3","92.1","99.0","113.1","119.0"],"difficult":["22.1","54.1"],"languages":["22.1","54.1"],"countless":["22.1","54.1"],"tutorials":["22.1","54.1"],"start":["22.1","27.2","54.1","56.2"],"from":["22.1","54.1","80.27","80.47","102.9","102.29"],"programming":["22.1","22.2","54.1","54.2"],"it":["22.1","54.1","80.31","92.4","102.13","113.4","116.0"],"incredibly":["22.1","54.1"],"accessible":["22.1","54.1"],"beginners":["22.1","54.1"],"know":["22.2","54.2"],"each":["22.2","54.2","72.5","113.6"],"other":["22.2","54.2","66.0","70.0","80.20","80.34","80.35","88.0","89.0","102.2","102.16","102.17","107.0","110.0","111.0"],"welcome":["22.2","54.2"],"arms":["22.2","54.2"],"often":["22.2","54.2"],"dedicated":["22.2","54.2"],"channels":["22.2","54.2"],"help":["22.2","54.2"],"discussions":["22.2","54.2"],"tend":["22.3","54.3"],"make":["22.3","54.3","80.46","97.1","102.28","103.4","117.1"],"lot":["22.3","24.7","44.0","54.3","57.7"],"money":["22.3","24.1","24.10","54.3","57.1","57.10"],"very":["22.3","54.3"],"lucrative":["22.3","54.3"],"these":["22.3","54.3","85.0"],"quite":["22.3","24.2","54.3","57.2"],"abundant":["22.3","54.3"],"storefronts":["22.3","54.3"],"actually":["23.0","55.0","92.3"],"liked":["23.0","55.0"],"went":["23.0","55.0"],"thinking":["23.0","55.0"],"consider":["23.0","55.0"],"continuation":["23.0","55.0"],"discussion":["23.0","23.1","55.0","55.1"],"real":["23.1","55.1"],"note":["23.1","55.1"],"there":["23.1","23.2","55.1","55.2","62.0"],"exploring":["23.1","55.1"],"mechanics":["23.1","55.1"],"discovering":["23.1","55.1"],"synergies":["23.1","55.1"],"unlocking":["23.1","27.3","55.1","56.3"],"new":["23.1","24.4","55.1","57.4"],"weapons":["23.1","55.1"],"playable":["23.1","55.1"],"characters":["23.1","55.1"],"etc":["23.1","55.1","69.0","76.0","88.0","98.0","110.0","118.0"],"relevant":["23.1","27.3","55.1","56.3"],"appeal":["23.1","55.1"],"just":["23.2","26.1","52.1","55.2","62.2","103.3"],"conditioned":["23.2","55.2"],"keep":["23.2","24.7","26.1","52.1","55.2","57.7"],"keeps":["23.2","55.2"],"rewarding":["23.2","55.2"],"unfortunately":["23.2","55.2"],"latter":["23.2","55.2"],"typically":["23.2","55.2","69.0","88.0","110.0"],"compelling":["23.2","55.2"],"clicking":["23.2","27.1","55.2","56.1"],"button":["23.2","55.2","72.5","90.0","92.6","103.4","113.6"],"waiting":["23.2","55.2"],"significant":["23.2","55.2","96.0","116.0"],"overlap":["23.2","24.2","55.2","57.2"],"between":["23.2","24.7","55.2","57.7","72.1","92.1","113.1"],"who":["23.2","24.1","50.0","55.2","57.1"],"enjoy":["23.2","55.2"],"posts":["23.2","55.2"],"someone":["23.2","55.2"],"either":["23.2","55.2"],"struggling":["23.2","55.2"],"overcoming":["23.2","55.2"],"accomplishment":["23.3","55.3"],"much":["23.3","24.6","55.3","57.6"],"allows":["23.3","55.3"],"users":["23.3","55.3"],"able":["23.3","55.3","81.0","99.0","119.0"],"reach":["23.3","25.1","53.1","55.3"],"point":["23.3","55.3"],"gain":["23.3","55.3"],"repetitive":["23.4","55.4"],"static":["23.4","55.4"],"ll":["23.5","26.0","26.1","52.0","52.1","55.5"],"discuss":["23.5","55.5"],"section":["23.5","55.5"],"suffice":["23.5","55.5"],"say":["23.5","24.2","55.5","57.2"],"rely":["23.5","55.5"],"genres":["23.5","55.5"],"due":["23.5","26.1","52.1","55.5"],"distract":["23.5","55.5"],"helps":["23.5","55.5"],"although":["23.5","24.3","55.5","57.3"],"imperfectly":["23.5","55.5"],"gamers":["23.5","23.6","55.5","55.6"],"tolerant":["23.5","55.5"],"rise":["23.5","55.5"],"top":["23.5","55.5"],"within":["23.5","55.5"],"genre":["23.5","55.5"],"elicited":["23.6","55.6"],"nothing":["23.6","55.6","73.0","114.0"],"m":["23.6","24.0","55.6","57.0"],"major":["23.6","55.6"],"may":["23.6","24.6","27.3","55.6","56.3","57.6"],"taking":["23.6","55.6"],"somewhat":["23.6","55.6"],"extreme":["23.6","55.6"],"take":["23.6","41.0","55.6","73.0","114.0"],"overall":["23.6","55.6"],"stands":["23.6","55.6"],"specifically":["23.6","55.6"],"think":["24.0","24.2","57.0","57.2"],"truly":["24.0","57.0"],"perfect":["24.0","57.0"],"answer":["24.0","57.0"],"disclaimer":["24.0","57.0"],"mostly":["24.0","57.0"],"play":["24.0","57.0"],"computer":["24.0","57.0"],"definitions":["24.0","57.0"],"heavily":["24.0","57.0"],"biased":["24.0","57.0"],"towards":["24.0","24.6","57.0","57.6"],"familiar":["24.0","57.0"],"additionally":["24.1","57.1"],"majority":["24.1","57.1"],"mobile":["24.1","57.1"],"strategies":["24.1","57.1"],"get":["24.1","57.1","113.2"],"players":["24.1","57.1","93.0"],"spend":["24.1","57.1"],"possible":["24.1","57.1"],"hell":["24.1","57.1"],"ostensibly":["24.1","57.1"],"critique":["24.1","57.1"],"features":["24.1","57.1","62.0","80.5"],"microtransactions":["24.1","57.1"],"gameplay":["24.1","47.0","57.1"],"buying":["24.1","57.1"],"belong":["24.1","24.10","57.1","57.10"],"hardly":["24.1","57.1"],"manipulation":["24.1","57.1"],"serve":["24.1","57.1"],"interests":["24.1","57.1"],"own":["24.1","57.1","92.2","103.4"],"anecdotal":["24.1","57.1"],"seem":["24.1","57.1"],"so":["24.1","45.4","57.1","67.0","68.0","74.0","77.0"],"fairly":["24.1","57.1"],"surface":["24.1","57.1"],"familiarity":["24.1","57.1"],"context":["24.1","57.1"],"criticizing":["24.1","57.1"],"fans":["24.1","57.1"],"thereof":["24.1","57.1"],"gaining":["24.2","57.2"],"ever":["24.2","57.2"],"resources":["24.2","24.7","57.2","57.7","72.6"],"optimizing":["24.2","57.2"],"production":["24.2","57.2"],"expanding":["24.2","57.2"],"sounds":["24.2","57.2"],"pretty":["24.2","57.2"],"similar":["24.2","45.0","57.2","64.0","67.0","68.0","74.0","77.0","83.0","94.0","105.0","115.0"],"doesn":["24.2","57.2","73.0","114.0"],"fact":["24.2","57.2"],"been":["24.2","57.2"],"debate":["24.2","57.2"],"whether":["24.2","57.2","87.0","107.0","109.0"],"umbrella":["24.2","57.2"],"safe":["24.2","57.2"],"two":["24.2","57.2","80.16","99.0","119.0"],"related":["24.2","57.2","80.33","102.15"],"playerbase":["24.2","57.2"],"means":["24.3","57.3","80.17"],"we":["24.3","26.0","52.0","57.3"],"borrow":["24.3","57.3"],"process":["24.3","57.3"],"coming":["24.3","57.3"],"consensus":["24.3","57.3"],"and":["24.3","28.0","29.0","35.0","57.3","70.0","80.41","80.53","89.0","92.0","102.23","102.35","111.0","113.0"],"maybe":["24.3","57.3"],"come":["24.3","57.3"],"across":["24.3","57.3","69.0","88.0","110.0"],"viable":["24.3","57.3"],"an":["24.4","57.4"],"authority":["24.4","57.4"],"since":["24.4","27.2","56.2","57.4"],"replaced":["24.4","57.4"],"https":["24.4","57.4"],"blog":["24.4","57.4"],"roguetemple":["24.4","57.4"],"com":["24.4","57.4"],"traditional":["24.4","57.4"],"answers":["24.5","57.5"],"should":["24.5","57.5","62.0","65.0","75.0","80.48","84.0","102.30","106.0"],"sufficiently":["24.5","57.5"],"allow":["24.5","57.5"],"us":["24.5","57.5"],"determine":["24.5","57.5","75.0"],"what":["24.5","57.5","60.0","62.0","63.0","82.0","84.0","104.0"],"factors":["24.5","57.5"],"have":["24.5","26.3","52.3","57.5","70.0","70.2","89.0","89.2","96.0","111.0","111.2","116.0"],"higher":["24.5","57.5"],"incrementalness":["24.5","57.5"],"than":["24.6","57.6","80.48","102.30"],"slight":["24.6","57.6"],"bias":["24.6","57.6"],"already":["24.6","50.0","57.6"],"established":["24.6","57.6"],"newly":["24.6","57.6"],"buffed":["24.6","57.6"],"show":["24.6","57.6","87.0","88.0","107.0","109.0"],"amongst":["24.6","57.6"],"easily":["24.6","57.6"],"indicate":["24.6","57.6","92.7","113.7"],"re":["24.6","27.0","56.0","57.6","70.1","89.1","111.1"],"general":["24.6","57.6","80.10","80.43","102.25"],"different":["24.7","26.1","27.3","52.1","56.3","57.7"],"mutually":["24.7","57.7"],"exclusive":["24.7","57.7"],"options":["24.7","57.7"],"presents":["24.7","57.7"],"resource":["24.7","57.7"],"management":["24.7","57.7"],"track":["24.7","57.7","95.0"],"will":["24.8","27.4","56.4","57.8","70.1","89.1","92.4","109.0","111.1","113.4"],"progress":["24.8","57.8"],"instead":["24.8","57.8","86.0","95.0","96.0","108.0","116.0"],"must":["24.8","57.8"],"wait":["24.8","57.8"],"automatic":["24.8","57.8"],"occur":["24.8","57.8"],"before":["24.8","26.2","52.2","57.8"],"resume":["24.8","57.8"],"qualify":["24.9","57.9"],"totally":["24.9","57.9"],"honest":["24.9","57.9"],"was":["24.9","47.0","57.9","64.0","67.0","68.0","71.0","74.0","83.0","91.0","94.0","105.0","112.0","115.0"],"never":["24.9","57.9"],"expecting":["24.9","57.9"],"conclude":["24.9","57.9"],"otherwise":["24.9","57.9","96.0"],"though":["24.9","57.9"],"buy":["24.10","57.10","80.51","99.0","102.33","119.0"],"which":["24.10","57.10","64.0","67.0","71.0","74.0","77.0","83.0","91.0","94.0","105.0","112.0","115.0"],"i":["24.10","45.3","57.10"],"d":["24.10","27.1","56.1","57.10"],"under":["24.10","57.10","64.0","67.0","68.0","71.0","74.0","77.0","83.0","91.0","94.0","105.0","112.0","115.0"],"fold":["24.10","57.10"],"learn":["24.10","57.10"],"fly":["24.10","57.10"],"series":["24.10","57.10"],"upgrade":["24.10","57.10","69.0","88.0","110.0"],"complete":["24.10","57.10"],"the":["24.11","57.11","61.8"],"available":["24.11","57.11"],"interesting":["24.11","57.11"],"digital":["25.0","53.0"],"garden":["25.0","53.0"],"written":["25.0","46.0","53.0"],"prose":["25.0","53.0"],"hope":["25.0","53.0"],"you":["25.0","45.3","53.0","62.2","80.48","102.30","103.3","113.2"],"mind":["25.0","26.1","52.1","53.0"],"credentials":["25.1","53.1"],"or":["25.1","53.1","74.0","80.15","94.0","115.0"],"anything":["25.1","53.1","62.2","103.3"],"site":["25.1","53.1"],"feel":["25.1","53.1"],"free":["25.1","53.1"],"is":["25.2","35.1","53.2","80.24","102.6"],"developer":["26.0","52.0"],"explore":["26.0","52.0"],"how":["26.0","52.0","70.2","89.2","111.2"],"embrace":["26.0","52.0"],"grow":["26.0","52.0"],"continue":["26.0","52.0","70.1","76.0","89.1","98.0","111.1","118.0"],"post":["26.0","38.1","52.0"],"publicly":["26.0","52.0"],"confidence":["26.0","52.0"],"preferences":["26.1","52.1"],"satisfy":["26.1","52.1"],"ultimately":["26.1","27.0","52.1","56.0"],"even":["26.1","52.1"],"fun":["26.1","52.1"],"then":["26.1","52.1"],"success":["26.1","52.1"],"in":["26.2","45.2","52.2","80.9","80.10","80.34","80.39","102.16","102.21"],"shoes":["26.2","52.2"],"understand":["26.2","52.2"],"struggles":["26.2","52.2"],"offer":["26.2","52.2"],"guidance":["26.2","52.2"],"emotional":["26.2","52.2"],"its":["26.3","52.3","72.5","113.6"],"ups":["26.3","52.3"],"downs":["26.3","52.3"],"staying":["26.3","52.3"],"true":["26.3","52.3","65.0","72.6","92.5","95.0","109.0","113.2"],"vision":["26.3","52.3"],"motivated":["26.3","52.3"],"artificially":["27.0","27.1","56.0","56.1"],"inflating":["27.0","56.0"],"suppose":["27.0","56.0"],"reduce":["27.0","56.0"],"inflated":["27.0","56.0"],"sake":["27.0","56.0"],"longer":["27.0","56.0"],"terms":["27.1","56.1"],"engaging":["27.1","56.1"],"go":["27.1","56.1"],"far":["27.1","27.3","56.1","56.3"],"would":["27.1","56.1","66.0","96.0","107.0"],"actively":["27.1","56.1"],"worse":["27.1","56.1"],"delaying":["27.1","56.1"],"piece":["27.1","56.1"],"actual":["27.1","56.1"],"alongside":["27.1","56.1"],"issues":["27.1","56.1","61.10","76.0","80.15","98.0","118.0"],"accessibility":["27.1","56.1"],"potentially":["27.1","56.1"],"causing":["27.1","56.1"],"rsi":["27.1","56.1"],"difference":["27.2","56.2"],"layer":["27.2","56.2","116.0"],"technically":["27.2","56.2"],"problem":["27.2","56.2"],"constantly":["27.2","56.2"],"getting":["27.2","56.2"],"feels":["27.2","56.2"],"larger":["27.2","56.2"],"impact":["27.2","56.2"],"right":["27.2","56.2","97.2","117.2"],"up":["27.2","30.0","56.2","69.0","73.0","88.0","110.0","114.0"],"until":["27.2","56.2"],"compromise":["27.2","56.2"],"highlighting":["27.2","56.2"],"most":["27.2","56.2"],"egregious":["27.2","56.2"],"unlock":["27.3","56.3"],"modifiers":["27.3","56.3"],"everything":["27.3","56.3"],"amount":["27.3","56.3","80.51","102.33"],"gotten":["27.3","56.3"],"steelie":["27.3","56.3"],"resets":["27.3","56.3"],"steel":["27.3","56.3"],"reason":["27.3","56.3"],"factory":["27.3","56.3"],"various":["27.3","51.0","56.3"],"machines":["27.3","56.3"],"none":["27.3","56.3","80.18"],"directly":["27.3","56.3","86.0","108.0"],"tied":["27.3","56.3"],"gathering":["27.3","56.3"],"oil":["27.3","56.3"],"rocket":["27.3","56.3"],"parts":["27.3","56.3"],"space":["27.3","56.3"],"throughout":["27.3","56.3"],"absolutely":["27.3","56.3"],"direction":["27.3","56.3"],"still":["27.3","56.3"],"collecting":["27.3","56.3"],"little":["27.3","56.3"],"hard":["27.3","56.3","93.0"],"gci":["27.3","56.3"],"alone":["27.3","56.3"],"said":["27.4","56.4"],"purchases":["27.4","56.4"],"quickly":["27.4","56.4"],"invalidate":["27.4","56.4"],"tip":["27.4","56.4"],"synapse":["28.0"],"cinny":["28.0"],"kimonja":["29.0"],"c418":["29.0"],"to":["30.0","80.6","80.7","80.21","80.31","80.32","102.3","102.13","102.14"],"chapter":["30.0","47.0"],"can":["30.0","45.0"],"played":["30.0"],"threads":["33.0"],"thepaperpilot":["34.0","80.10"],"org":["34.0"],"tools":["35.0","51.0"],"mine":["35.1"],"called":["35.1","66.0","107.0"],"kronos":["35.1","47.0"],"exception":["35.1"],"speech":["35.2"],"changes":["37.0"],"depending":["37.0"],"license":["37.0"],"training":["38.0"],"ndi":["38.1"],"serves":["38.1"],"input":["38.1"],"stability":["38.2"],"maintainability":["38.2"],"going":["38.2"],"forward":["38.2"],"unittests":["38.2"],"entries":["40.0"],"creation":["40.0"],"jam":["40.0"],"primordia":["40.0"],"jacorb":["40.0"],"my":["41.0"],"ideal":["41.0"],"matrix":["42.0"],"errant":["43.0"],"signal":["43.0"],"spoilers":["43.0"],"a":["44.0","61.5","72.6","97.2","117.2"],"ways":["45.0"],"wikis":["45.0"],"useful":["45.1"],"incremental":["45.2"],"social":["45.2"],"github":["45.2"],"development":["45.2"],"glue":["45.3"],"link":["45.3"],"specific":["45.3"],"branches":["45.3"],"chatted":["45.3"],"do":["45.4","62.2","67.0","72.6","74.0","77.0","90.0","92.4","103.3","113.4"],"creative":["45.5"],"love":["45.5"],"creating":["45.5"],"feed":["46.0"],"logseq":["46.0"],"rendered":["46.0"],"suggested":["46.0"],"web":["46.0"],"complex":["47.0"],"call":["47.0","87.0","109.0"],"sands":["47.0"],"time":["47.0"],"sandsoftime":["47.0"],"replicated":["47.0"],"generator":["48.0"],"cozy":["49.0"],"appealing":["50.0"],"overwhelming":["50.0"],"moderate":["50.0"],"user":["51.0"],"fediverse":["51.0"],"desc":["59.0","78.0","100.0"],"description":["59.0","78.0","100.0"],"resceil":["59.0","78.0","100.0"],"roundupcost":["59.0","78.0","100.0"],"order":["59.0","78.0","97.3","100.0","117.3"],"unlockorder":["59.0","78.0","100.0"],"incr":["59.0","78.0","100.0"],"increaseunlockorder":["59.0","78.0","100.0"],"challengedescription":["59.0","78.0","100.0"],"reward":["59.0","78.0","100.0"],"rewarddescription":["59.0","78.0","100.0"],"rewardeffect":["59.0","78.0","100.0"],"rewarddisplay":["59.0","78.0","100.0"],"active":["59.0","78.0","100.0"],"challengeactive":["59.0","78.0","100.0"],"js":["60.0","72.5","80.6","113.6"],"see":["60.0","70.2","72.1","80.46","84.0","89.2","92.1","102.28","111.2","113.1"],"looks":["60.0"],"productivity":["61.1"],"working":["61.2"],"screen":["61.3","73.0","93.0","114.0"],"week":["61.5"],"changelog":["61.6"],"buyables":["61.7","86.0","92.6","99.0","108.0","119.0"],"minor":["61.10","80.20","80.30","80.34","80.35","80.41","80.54","80.56","102.2","102.12","102.16","102.17","102.23","102.36","102.38"],"returns":["62.0","95.0"],"given":["62.0"],"display":["62.0","80.9","92.0","113.0"],"text":["62.0","62.3","72.2"],"basic":["62.0"],"html":["62.0"],"vue":["62.0","95.0"],"contents":["62.0"],"update":["62.1","80.38","81.2","102.20","103.2"],"version":["62.1","81.2","103.2"],"containing":["62.3"],"hidden":["62.3","72.2","92.2","113.2"],"donetooltip":["63.0","82.0","104.0"],"achieved":["63.0","82.0","104.0"],"rewards":["63.0","82.0","104.0"],"points":["64.0","68.0","74.0","83.0","90.0","92.3","105.0","113.3"],"id":["64.0","72.5","83.0","96.0","105.0","113.6","116.0"],"key":["64.0","67.0","68.0","71.0","74.0","77.0","83.0","91.0","94.0","105.0","112.0","115.0"],"stored":["64.0","68.0","71.0","83.0","91.0","105.0","112.0"],"convenient":["64.0","67.0","68.0","71.0","74.0","77.0","83.0","91.0","94.0","105.0","112.0","115.0"],"access":["64.0","68.0","71.0","74.0","80.15","83.0","91.0","94.0","105.0","112.0","115.0"],"example":["64.0","67.0","68.0","69.0","71.0","72.5","74.0","77.0","83.0","88.0","91.0","94.0","105.0","110.0","112.0","113.6","115.0"],"layershown":["65.0","106.0"],"bool":["65.0","84.0","106.0"],"if":["65.0","75.0","80.51","84.0","102.33","106.0","113.5"],"node":["65.0","84.0","106.0"],"be":["65.0","80.35","84.0","97.0","102.17","106.0","117.0"],"visible":["65.0","75.0","84.0","106.0"],"tree":["65.0","80.4","80.33","80.37","84.0","89.2","102.15","102.19","106.0","111.2"],"when":["66.0","107.0","113.2"],"pressed":["66.0","107.0"],"standard":["66.0","107.0"],"decrease":["66.0","107.0"],"possibly":["66.0","92.6","107.0"],"cansellone":["66.0","107.0"],"cansellall":["66.0","107.0"],"booleans":["66.0","107.0"],"present":["66.0","87.0","107.0","109.0"],"appropriate":["66.0","107.0"],"always":["66.0","75.0","92.4","107.0","113.4"],"keys":["67.0","72.1","92.1","113.1"],"attributes":["67.0","72.1","92.1","113.1"],"both":["67.0","77.0"],"strings":["67.0","77.0","92.0","113.0"],"assigned":["67.0","68.0","77.0","81.0","90.0","103.0"],"automagically":["67.0","68.0","77.0","81.0","90.0","103.0"],"same":["68.0","72.4","77.0","81.0","92.2","113.5"],"name":["68.0","80.47","80.50","90.0","102.29","102.32"],"player":["68.0","83.0","105.0","116.0"],"part":["69.0","88.0","110.0"],"another":["69.0","110.0"],"milestone":["69.0","88.0","110.0","113.2"],"chall":["69.0"],"buyable":["69.0","80.13","86.0","88.0","108.0","110.0"],"clickable":["69.0","88.0","110.0"],"achievement":["69.0","88.0","110.0","113.2"],"individual":["69.0","85.0","88.0","110.0"],"challenge":["69.0","72.5","73.0","88.0","93.0","110.0","113.6","114.0"],"want":["69.0","70.0","72.1","88.0","89.0","92.1","99.0","110.0","111.0","113.1","119.0"],"split":["69.0","88.0","110.0"],"multiple":["69.0","70.0","88.0","89.0","110.0","111.0"],"respec":["69.0","87.0","88.0","109.0","110.0"],"master":["69.0","87.0","88.0","109.0","110.0"],"buttons":["69.0","88.0","107.0","110.0"],"respectively":["69.0","72.4","88.0","110.0","113.5"],"sell":["69.0","88.0","110.0"],"one":["69.0","80.51","102.33","110.0"],"versions":["70.0","89.0","103.0","111.0"],"collaborate":["70.0","89.0","111.0"],"purposes":["70.1","89.1","111.1"],"download":["70.1","89.1","111.1"],"successfully":["70.2","89.2","111.2"],"documentation":["70.2","80.46","89.2","102.28","111.2"],"reality":["70.2","89.2","111.2"],"bar":["71.0"],"bigbar":["71.0"],"intend":["72.0","81.0","103.0"],"use":["72.0"],"that":["72.0","97.1","117.1"],"feature":["72.0","80.43","80.50","81.0","86.0","102.25","102.32","103.0","108.0"],"entire":["72.1","92.1","96.0","113.1","116.0"],"tab":["72.1"],"tabformat":["72.1","92.1","113.1"],"extra":["72.1","92.1","113.1"],"change":["72.1","92.1","113.1"],"layout":["72.1","92.1","113.1"],"info":["72.1","92.1","113.1"],"midsection":["72.1","92.1","113.1"],"alternative":["72.1","92.1","113.1"],"inserted":["72.1","92.1","113.1"],"milestones":["72.1","92.1","113.1"],"cannot":["72.1","88.0","92.1","113.1"],"subtabs":["72.1","80.25","92.1","102.7","113.1"],"later":["72.2"],"date":["72.2"],"infoboxes":["72.2"],"displays":["72.2"],"box":["72.2"],"replace":["72.3","80.17"],"else":["72.3"],"prestigebuttontext":["72.3"],"entirety":["72.3"],"contains":["72.3","72.5","86.0","99.0","108.0","113.6","119.0"],"only":["72.3","72.6","73.0","93.0","114.0"],"usable":["72.3"],"all":["72.3","76.0","87.0","98.0","118.0"],"types":["72.3"],"unlocked":["72.4"],"locked":["72.4","113.5"],"tooltips":["72.4","113.5"],"behave":["72.4","92.2","113.5"],"original":["72.4","113.5"],"prestige":["72.4","113.5"],"componentstyles":["72.5","113.6"],"object":["72.5","113.6"],"functions":["72.5","80.3","80.35","80.52","102.17","102.34","113.6"],"returning":["72.5","113.6"],"css":["72.5","92.1","113.1","113.6"],"objects":["72.5","113.6"],"applied":["72.5","113.6"],"components":["72.5","113.6"],"type":["72.5","113.6"],"height":["72.5","80.53","102.35","113.6"],"200px":["72.5","113.6"],"color":["72.5","92.0","113.0","113.6"],"aa66aa":["72.5","92.6","113.6"],"canreset":["72.6"],"return":["72.6"],"isendgame":["73.0","114.0"],"reached":["73.0","93.0","114.0"],"end":["73.0","93.0","114.0"],"win":["73.0","93.0","114.0"],"appears":["73.0","93.0","114.0"],"less":["73.0","93.0","114.0"],"beyond":["73.0","92.3","93.0","113.3","114.0"],"maxticklength":["73.0","93.0","114.0"],"length":["73.0","93.0","114.0"],"milliseconds":["73.0","93.0","114.0"],"reduces":["73.0","93.0","99.0","114.0","119.0"],"over":["73.0","93.0","114.0"],"long":["73.0","114.0"],"ticks":["73.0","93.0","114.0"],"mess":["73.0","93.0","114.0"],"usually":["73.0","93.0","114.0"],"default":["75.0","92.3","113.2","113.3"],"keyword":["75.0"],"updated":["76.0","80.33","80.54","98.0","102.15","102.36","118.0"],"remaining":["76.0","98.0","118.0"],"challenges":["76.0"],"required":["76.0","98.0","118.0"],"run":["76.0","98.0","118.0"],"game":["76.0","81.3","93.0","98.0","114.0","118.0"],"fix":["76.0","80.21","98.0","102.3","118.0"],"those":["77.0"],"push":["79.0","101.0"],"trig":["80.3"],"nodes":["80.4","103.4"],"disables":["80.5","113.2"],"many":["80.5","80.34","80.46","102.16","102.28"],"improved":["80.5","80.25","80.46","102.7","102.28"],"formatting":["80.5","80.40","102.22"],"slightly":["80.5"],"easyaccess":["80.6"],"pg132":["80.7"],"non":["80.9","103.4"],"whole":["80.9","81.3"],"numbers":["80.9"],"main":["80.9","80.46","85.0","102.28"],"thanks":["80.10"],"vertical":["80.11"],"docs":["80.13","80.33","80.34","80.54","84.0","102.15","102.16","102.36"],"because":["80.15","81.0"],"rounding":["80.15"],"errors":["80.15","80.34","102.16"],"might":["80.15"],"cause":["80.15"],"formatsmall":["80.15"],"enable":["80.15"],"globally":["80.15"],"adding":["80.15","82.0","94.0","104.0","115.0"],"allowsmall":["80.15"],"modinfo":["80.15"],"bottom":["80.16"],"newlines":["80.17"],"br":["80.17"],"style":["80.19","92.1","102.1","113.1"],"fudo":["80.19","102.1"],"custom":["80.20","80.22","85.0","102.2","102.4"],"fixes":["80.20","80.34","80.35","102.2","102.16","102.17"],"tooltip":["80.21","80.43","102.3","102.25"],"flickering":["80.21","102.3"],"removed":["80.24","80.27","102.6","102.9","103.0"],"old":["80.24","102.6"],"unneeded":["80.24","102.6"],"spacing":["80.25","102.7"],"embedding":["80.25","96.0","102.7"],"into":["80.25","102.7"],"g":["80.26","86.0","102.8","108.0"],"fixed":["80.26","80.29","102.8","102.11"],"autoupgrade":["80.26","102.8"],"issue":["80.26","80.37","80.40","102.8","102.19","102.22"],"effective":["80.27","102.9"],"herobrine":["80.27","102.9"],"getstartclickables":["80.27","80.28","80.29","102.9","102.10","102.11"],"again":["80.28","102.10"],"add":["80.29","102.11"],"yourself":["80.29","92.6","102.11"],"oddities":["80.30","102.12"],"hides":["80.31","102.13"],"entirely":["80.31","102.13"],"lastsafetab":["80.32","102.14"],"highlighted":["80.33","92.7","102.15","113.7","116.0"],"fixing":["80.34","102.16"],"infobox":["80.34","102.16"],"appearance":["80.34","102.16"],"potential":["80.37","102.19"],"displaying":["80.37","96.0","102.19","116.0"],"contributing":["80.38","102.20"],"updating":["80.39","81.2","102.21","103.2"],"making":["80.40","102.22"],"10e9":["80.40","102.22"],"appear":["80.40","87.0","97.1","102.22","109.0","117.1"],"tweaks":["80.41","102.23"],"improvements":["80.41","102.23"],"them":["80.42","102.24","107.0"],"achievements":["80.43","102.25"],"too":["80.44","102.26","103.4"],"wide":["80.44","102.26"],"loop":["80.46","102.28"],"keeping":["80.46","102.28"],"easier":["80.46","81.0","102.28"],"renamed":["80.46","102.28"],"increase":["80.46","102.28"],"readability":["80.46","102.28"],"list":["80.46","102.28"],"below":["80.46","102.28"],"feedback":["80.46","102.28"],"automatically":["80.47","81.0","102.29","103.0"],"taken":["80.47","102.29"],"mod":["80.47","102.29"],"temp":["80.49","102.31"],"used":["80.50","81.4","97.0","102.32","117.0"],"confirmation":["80.50","85.0","102.32"],"messages":["80.50","102.32"],"needed":["80.51","102.33"],"max":["80.51","102.33"],"convenience":["80.52","102.34"],"customizable":["80.53","102.35"],"width":["80.53","102.35"],"hour":["80.54","102.36"],"few":["80.54","102.36"],"information":["80.54","102.36"],"good":["80.56","102.38"],"override":["81.0","96.0","103.0","116.0"],"deprecated":["81.0","103.0"],"newer":["81.0"],"achieve":["81.0"],"thing":["81.0"],"tmt":["81.2","103.0","103.2"],"particles":["81.4"],"visual":["81.4"],"effects":["81.4","92.6"],"interactable":["81.4"],"golden":["81.4"],"cookies":["81.4"],"collectables":["81.4"],"disable":["82.0","92.6","104.0"],"popups":["82.0","94.0","104.0","115.0"],"achievementspopups":["82.0","104.0"],"false":["82.0","94.0","104.0","113.2","115.0"],"upgrades":["84.0"],"look":["84.0"],"goes":["84.0"],"respecbuyables":["85.0"],"along":["85.0"],"toggleable":["85.0"],"respectext":["85.0"],"showrespec":["85.0"],"defined":["85.0","87.0"],"defaults":["85.0","87.0","109.0"],"respecmessage":["85.0"],"place":["85.0"],"currencyinternalname":["86.0"],"internal":["86.0"],"currencylayer":["86.0","108.0"],"omit":["86.0","108.0"],"currencylocation":["86.0","108.0"],"your":["86.0","97.0","108.0","117.0"],"inside":["86.0","108.0"],"e":["86.0","108.0"],"masterbuttonpress":["87.0","109.0"],"additional":["87.0","109.0"],"pressing":["87.0","109.0"],"masterbuttontext":["87.0","109.0"],"showmasterbutton":["87.0","109.0"],"determining":["87.0","99.0","107.0","109.0","119.0"],"absent":["87.0","107.0","109.0"],"microtab":["88.0"],"rest":["88.0"],"sub":["88.0"],"username":["89.2","111.2"],"modding":["89.2","111.2"],"20x":["90.0"],"sec":["90.0"],"held":["90.0"],"least":["90.0"],"seconds":["90.0"],"geteffect":["90.0"],"calculates":["90.0"],"styling":["92.0","113.0"],"grid":["92.2"],"data":["92.2"],"reducing":["92.3"],"softcap":["92.3","113.3"],"softcappower":["92.3","113.3"],"put":["92.3","113.3"],"th":["92.3","113.3"],"power":["92.3","113.3"],"e1e7":["92.3","113.3"],"marked":["92.5"],"adds":["92.5"],"mark":["92.5"],"corner":["92.5"],"star":["92.5"],"deactivated":["92.6"],"hasupgrade":["92.6"],"haschallenge":["92.6"],"hasachievement":["92.6"],"hasmilestone":["92.6"],"unable":["92.6"],"click":["92.6"],"innate":["92.6"],"effect":["92.6"],"prestigenotify":["92.7","113.7"],"subtly":["92.7","113.7"],"meaningful":["92.7","113.7"],"fixoldsave":["93.0"],"modify":["93.0"],"loading":["93.0"],"undo":["93.0"],"inflation":["93.0"],"forcibly":["93.0"],"disaable":["94.0","115.0"],"milestonepopups":["94.0","113.2","115.0"],"deleted":["95.0"],"itself":["95.0"],"mousex":["95.0"],"mousey":["95.0"],"variables":["95.0"],"sin":["95.0"],"cos":["95.0"],"tan":["95.0"],"operations":["95.0"],"radians":["95.0"],"asin":["95.0"],"acos":["95.0"],"atan":["95.0"],"returned":["95.0"],"overridden":["96.0"],"embedlayer":["96.0","116.0"],"tabs":["97.1","117.1"],"shownavtab":["97.1","117.1"],"b":["97.2","117.2"],"c":["97.2","117.2"],"weirdbutton":["97.2","117.2"],"position":["97.3","117.3"],"horizontal":["97.3","117.3"],"uses":["97.3","117.3"],"sorted":["97.3","117.3"],"alphabetical":["97.3","117.3"],"complicated":["99.0","119.0"],"currencies":["99.0","119.0"],"purchase":["99.0","119.0"],"system":["99.0","119.0"],"need":["99.0","119.0"],"canafford":["99.0","119.0"],"pay":["99.0","119.0"],"optional":["103.0"],"leave":["103.0"],"anymore":["103.0"],"future":["103.0"],"achievementpopups":["113.2"],"popup":["113.2"],"plug":["113.3"],"disabled":["113.5"],"notify":["116.0"]}]'},t={"0.0":{t:'
',p:`<h1 class="p-name"> -<a href="/changelo ...`,l:"changelog/index.html",a:"section-class-h-feed"},"1.0":{t:"# ActivityPub",p:` -Referenced by: Fediverse - - -Tags: Decentralized - -ActivityPub i ...`,l:"garden/activitypub/index.html",a:"activitypub"},"2.0":{t:"# Advent Incremental",p:` -Tags: My Projects, Profectus - -Play it here! -An Open Source ga ...`,l:"garden/advent-incremental/index.html",a:"advent-incremental"},"3.0":{t:"# ATProto",p:` -Referenced by: Fediverse - - -Tags: Decentralized - -The AT Protoc ...`,l:"garden/atproto/index.html",a:"atproto"},"4.0":{t:"# Babble Buds",p:` -Tags: My Projects - -Babble Buds is a tool for creating puppets ...`,l:"garden/babble-buds/index.html",a:"babble-buds"},"5.0":{t:"# Capture the Citadel",p:` -Tags: My Projects - -A 3D VR re-envisioning of a Slay the Spire ...`,l:"garden/capture-the-citadel/index.html",a:"capture-the-citadel"},"6.0":{t:"# Chat Glue",p:` -Referenced by: Commune, My Personal Website, The Small Web - -A ...`,l:"garden/chat-glue/index.html",a:"chat-glue"},"7.0":{t:"# Chronological",p:` -Referenced by: Digital Gardens, Freeform vs Chronological Dic ...`,l:"garden/chronological/index.html",a:"chronological"},"8.0":{t:"# Cinny",p:` -Referenced by: Incremental Social - -Cinny is an Open Source we ...`,l:"garden/cinny/index.html",a:"cinny"},"9.0":{t:"# Commune",p:` -Referenced by: Federated Identity, Fedi v2, My Personal Websi ...`,l:"garden/commune/index.html",a:"commune"},"10.0":{t:"# Davey Wreden",p:` -Referenced by: Ivy Road, The Beginner's Guide - - -Tagged by: Iv ...`,l:"garden/davey-wreden/index.html",a:"davey-wreden"},"11.0":{t:"# Decentralized",p:` -Referenced by: Commune, Fedi v2, Matrix, Social Media - - -Tagge ...`,l:"garden/decentralized/index.html",a:"decentralized"},"12.0":{t:"# Dice Armor",p:` -Referenced by: Babble Buds - - -Tags: My Projects - -Download it h ...`,l:"garden/dice-armor/index.html",a:"dice-armor"},"13.0":{t:"# Digital Gardens",p:` -Referenced by: Chronological, Commune, Garden-RSS, The Cozy W ...`,l:"garden/digital-gardens/index.html",a:"digital-gardens"},"14.0":{t:"# Federated Identity",p:` -Referenced by: Commune, Fedi v2, Weird - - -Tags: Decentralized - ...`,l:"garden/federated-identity/index.html",a:"federated-identity"},"15.0":{t:"# Fedi v2",p:` -Referenced by: Social Media - -My take on a theoretical success ...`,l:"garden/fedi-v2/index.html",a:"fedi-v2"},"15.1":{t:"Inspiration",p:` -A Plan for Social Media - Rethinking Federation - -This article ...`,l:"garden/fedi-v2/index.html#inspiration",a:"inspiration"},"15.2":{t:"Identity",p:` -Federated Identity -Private and public keys anyone can create ...`,l:"garden/fedi-v2/index.html#identity",a:"identity"},"15.3":{t:"Servers",p:` -Act as relays, merely storing messages and sending them to an ...`,l:"garden/fedi-v2/index.html#servers",a:"servers"},"15.4":{t:"Content",p:` -Protocol should dictate how to convey text, image, audio, vid ...`,l:"garden/fedi-v2/index.html#content",a:"content"},"15.5":{t:"Moderation",p:` -In general, edits and delete requests are made by replying wi ...`,l:"garden/fedi-v2/index.html#moderation",a:"moderation"},"15.6":{t:"Problems to solve",p:` -No anonymity - -All upvotes, downvotes, etc. are linked to your ...`,l:"garden/fedi-v2/index.html#problems-to-solve",a:"problems-to-solve"},"16.0":{t:"# Fediverse",p:` -Referenced by: ATProto, Decentralized, Incremental Social, Mb ...`,l:"garden/fediverse/index.html",a:"fediverse"},"17.0":{t:"# Forgejo",p:` -Referenced by: Incremental Social - -Forgejo is an Open Source ...`,l:"garden/forgejo/index.html",a:"forgejo"},"18.0":{t:"# Freeform",p:` -Referenced by: Commune, Digital Gardens, Freeform vs Chronolo ...`,l:"garden/freeform/index.html",a:"freeform"},"19.0":{t:"# Freeform vs Chronological Dichotomy",p:` -Referenced by: Chronological, Freeform - -Describes a dichotomy ...`,l:"garden/freeform-vs-chronological-dichotomy/index.html",a:"freeform-vs-chronological-dichotomy"},"20.0":{t:"# Game Dev Tree",p:` -Tags: My Projects - -Play it here! -My first (good) incremental ...`,l:"garden/game-dev-tree/index.html",a:"game-dev-tree"},"21.0":{t:"# Garden-RSS",p:` -Referenced by: Freeform, The Small Web, This Knowledge Hub - -A ...`,l:"garden/garden-rss/index.html",a:"garden-rss"},"22.0":{t:"# Guide to Incrementals/Appeal to Developers",p:"There are a lot of developers in the incremental games communi ...",l:"garden/guide-to-incrementals/appeal-to-developers/index.html",a:"guide-to-incrementals-appeal-to-developers"},"22.1":{t:"Incrementals are Easy to Make",p:"Compared to other genres, incrementals have quite low expectat ...",l:"garden/guide-to-incrementals/appeal-to-developers/index.html#incrementals-are-easy-to-make",a:"incrementals-are-easy-to-make"},"22.2":{t:"Players are Easy to Find",p:"Once you've finished your game and uploaded it on github pages ...",l:"garden/guide-to-incrementals/appeal-to-developers/index.html#players-are-easy-to-find",a:"players-are-easy-to-find"},"22.3":{t:"Monetization",p:"I'd like to clarify that everything I've said above mainly app ...",l:"garden/guide-to-incrementals/appeal-to-developers/index.html#monetization",a:"monetization"},"23.0":{t:"# Guide to Incrementals/Appeal to Players",p:"This is something that has been discussed and analyzed by many ...",l:"garden/guide-to-incrementals/appeal-to-players/index.html",a:"guide-to-incrementals-appeal-to-players"},"23.1":{t:"Numbers Going Up",p:"This is a very common response to why people enjoy incremental ...",l:"garden/guide-to-incrementals/appeal-to-players/index.html#numbers-going-up",a:"numbers-going-up"},"23.2":{t:"Effortlessness",p:"Incremental games are so easy, a lot of them even have you pro ...",l:"garden/guide-to-incrementals/appeal-to-players/index.html#effortlessness",a:"effortlessness"},"23.3":{t:"Strategy",p:"Incremental games could be considered a subset of strategy gam ...",l:"garden/guide-to-incrementals/appeal-to-players/index.html#strategy",a:"strategy"},"23.4":{t:"Avoiding Staleness",p:"Incremental games tend to have "paradigm shifts", wh ...",l:"garden/guide-to-incrementals/appeal-to-players/index.html#avoiding-staleness",a:"avoiding-staleness"},"23.5":{t:"Good Game Design",p:"Incremental games tend to show their game design "plainly ...",l:"garden/guide-to-incrementals/appeal-to-players/index.html#good-game-design",a:"good-game-design"},"23.6":{t:"Artistic Merit",p:"The Vampire Survivors video made me think back to the old argu ...",l:"garden/guide-to-incrementals/appeal-to-players/index.html#artistic-merit",a:"artistic-merit"},"24.0":{t:"# Guide to Incrementals/Defining the Genre",p:"Video games are placed into genres for a variety of reasons. T ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html",a:"guide-to-incrementals-defining-the-genre"},"24.1":{t:"Incrementals vs Idlers vs Clickers",p:"Oftentimes people refer to this genre as idle games and/or cli ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#incrementals-vs-idlers-vs-clickers",a:"incrementals-vs-idlers-vs-clickers"},"24.2":{t:"Incrementals as NGU",p:"Another broad definition often used is that incremental games ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#incrementals-as-ngu",a:"incrementals-as-ngu"},"24.3":{t:"Roguelites as Incrementals?",p:"Earlier on, I mentioned reset mechanics shouldn't be used in t ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#roguelites-as-incrementals",a:"roguelites-as-incrementals"},"24.4":{t:"The Berlin Interpretation",p:"By far the most popular way of defining roguelikes is the &quo ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#the-berlin-interpretation",a:"the-berlin-interpretation"},"24.5":{t:"The Incremental Games Canon",p:"Alright, time to get controversial. Up til now, I've been tryi ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#the-incremental-games-canon",a:"the-incremental-games-canon"},"24.6":{t:"The Paradigm Shift",p:"The Paradigm Shift is probably the highest possible value fact ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#the-paradigm-shift",a:"the-paradigm-shift"},"24.7":{t:"High-Value Factors",p:"I won't take as long to discuss the high and low-value factors ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#high-value-factors",a:"high-value-factors"},"24.8":{t:"Low-Value Factors",p:"These are low-value factors, meaning they aren't as strongly c ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#low-value-factors",a:"low-value-factors"},"24.9":{t:"Are Roguelites Incrementals?",p:"Having made our variation of the Berlin Interpretation for inc ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#are-roguelites-incrementals",a:"are-roguelites-incrementals"},"24.10":{t:"Sub-Genres",p:"There are some trends in incremental games that go beyond just ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#sub-genres",a:"sub-genres"},"24.11":{t:"Other Related Genres",p:"Cultivation RPGs are a genre of games, books, and anime popula ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#other-related-genres",a:"other-related-genres"},"25.0":{t:"# Guide to Incrementals",p:"This is a comprehensive guide to Incremental Games, a genre of ...",l:"garden/guide-to-incrementals/index.html",a:"guide-to-incrementals"},"25.1":{t:"Why am I making this?",p:"That's a good question! What authority do I have to be making ...",l:"garden/guide-to-incrementals/index.html#why-am-i-making-this",a:"why-am-i-making-this"},"25.2":{t:"Ludology",p:` -Guide to Incrementals/Defining the Genre -Guide to Incremental ...`,l:"garden/guide-to-incrementals/index.html#ludology",a:"ludology"},"25.3":{t:"Making an Incremental",p:` -Guide to Incrementals/Navigating Criticism - -`,l:"garden/guide-to-incrementals/index.html#making-an-incremental",a:"making-an-incremental"},"26.0":{t:"# Guide to Incrementals/Navigating Criticism",p:"Developing games is fun and exciting and teaches a lot of wond ...",l:"garden/guide-to-incrementals/navigating-criticism/index.html",a:"guide-to-incrementals-navigating-criticism"},"26.1":{t:"Reading Feedback",p:"Game development is a skill that takes time and practice to ge ...",l:"garden/guide-to-incrementals/navigating-criticism/index.html#reading-feedback",a:"reading-feedback"},"26.2":{t:"Seeking Feedback",p:"When deciding where to share your game, consider the type of p ...",l:"garden/guide-to-incrementals/navigating-criticism/index.html#seeking-feedback",a:"seeking-feedback"},"26.3":{t:"Responding to Feedback",p:"Negative feedback can naturally feel like an attack, and it's ...",l:"garden/guide-to-incrementals/navigating-criticism/index.html#responding-to-feedback",a:"responding-to-feedback"},"27.0":{t:"# Guide to Incrementals/What is Content?",p:"If you've been in the incremental games community for any amou ...",l:"garden/guide-to-incrementals/what-is-content/index.html",a:"guide-to-incrementals-what-is-content"},"27.1":{t:"Interaction",p:"I think it should be a fairly non-controversial opinion that t ...",l:"garden/guide-to-incrementals/what-is-content/index.html#interaction",a:"interaction"},"27.2":{t:"Repeatable Purchases",p:"Imagine an entity in a game that you can purchase multiple tim ...",l:"garden/guide-to-incrementals/what-is-content/index.html#repeatable-purchases",a:"repeatable-purchases"},"27.3":{t:"Following Instructions",p:"We're getting more and more controversial as we go along! Let' ...",l:"garden/guide-to-incrementals/what-is-content/index.html#following-instructions",a:"following-instructions"},"27.4":{t:"Tips for Developers",p:"If you're a developer, by this point you should have a pretty ...",l:"garden/guide-to-incrementals/what-is-content/index.html#tips-for-developers",a:"tips-for-developers"},"28.0":{t:"# Incremental Social",p:` -Referenced by: Federated Identity, My Personal Website, Webri ...`,l:"garden/incremental-social/index.html",a:"incremental-social"},"29.0":{t:"# Ivy Road",p:` -Referenced by: Davey Wreden, Wanderstop - - -Tags: Davey Wreden - ...`,l:"garden/ivy-road/index.html",a:"ivy-road"},"30.0":{t:"# Kronos",p:` -Referenced by: V-ecs - - -Tags: My Projects, Profectus - -My large ...`,l:"garden/kronos/index.html",a:"kronos"},"31.0":{t:"# Logseq",p:` -Referenced by: This Knowledge Hub - -Logseq is an Open Source o ...`,l:"garden/logseq/index.html",a:"logseq"},"32.0":{t:"# Matrix",p:` -Referenced by: Cinny, Commune, Synapse - -Matrix is a protocol ...`,l:"garden/matrix/index.html",a:"matrix"},"33.0":{t:"# Mbin",p:` -Referenced by: Incremental Social - -Mbin is an Open Source Fed ...`,l:"garden/mbin/index.html",a:"mbin"},"34.0":{t:"# My Personal Website",p:` -Referenced by: The Small Web - -A Personal Websites for me, ava ...`,l:"garden/my-personal-website/index.html",a:"my-personal-website"},"35.0":{t:"# My Projects",p:` -Tagged by: Advent Incremental, Babble Buds, Capture the Citad ...`,l:"garden/my-projects/index.html",a:"my-projects"},"35.1":{t:"Games",p:` -Planar Pioneers (play) -Advent Incremental (play) -Game Dev Tre ...`,l:"garden/my-projects/index.html#games",a:"games"},"35.2":{t:"Tools (and other non-games)",p:` -Profectus -Incremental Social -Babble Buds -V-ecs -Opti-Speech - -`,l:"garden/my-projects/index.html#tools-and-other-non-games",a:"tools-and-other-non-games"},"36.0":{t:"# Nostr",p:` -Referenced by: Fediverse - - -Tags: Decentralized - -Nostr is a pr ...`,l:"garden/nostr/index.html",a:"nostr"},"37.0":{t:"# Open Source",p:` -Referenced by: Advent Incremental, Cinny, Commune, Dice Armor ...`,l:"garden/open-source/index.html",a:"open-source"},"38.0":{t:"# Opti-Speech",p:` -Tags: My Projects - -In college I continued development on the ...`,l:"garden/opti-speech/index.html",a:"opti-speech"},"38.1":{t:"The Original Project",p:"The Optispeech project involves designing and testing a real-t ...",l:"garden/opti-speech/index.html#the-original-project",a:"the-original-project"},"38.2":{t:"My Work",p:"As the sole programmer at UT Dallas Speech Production Lab at t ...",l:"garden/opti-speech/index.html#my-work",a:"my-work"},"39.0":{t:"# Planar Pioneers",p:` -Tags: My Projects, Profectus - -Play it here! -An Open Source ga ...`,l:"garden/planar-pioneers/index.html",a:"planar-pioneers"},"40.0":{t:"# Profectus",p:` -Referenced by: Advent Incremental, Planar Pioneers - - -Tagged b ...`,l:"garden/profectus/index.html",a:"profectus"},"41.0":{t:"# Social Media",p:` -Referenced by: Commune, Fedi v2, Fediverse - -Traditional socia ...`,l:"garden/social-media/index.html",a:"social-media"},"42.0":{t:"# Synapse",p:` -Referenced by: Incremental Social - -Synapse is an Open Source ...`,l:"garden/synapse/index.html",a:"synapse"},"43.0":{t:"# The Beginner's Guide",p:` -Tags: Davey Wreden - -My favorite video game of all time, bar n ...`,l:"garden/the-beginner-s-guide/index.html",a:"the-beginner-s-guide"},"44.0":{t:"# The Cozy Web",p:` -Referenced by: Digital Gardens, The Small Web - -The Cozy Web i ...`,l:"garden/the-cozy-web/index.html",a:"the-cozy-web"},"45.0":{t:"# The Small Web",p:` -Referenced by: This Knowledge Hub - -Small personal websites cr ...`,l:"garden/the-small-web/index.html",a:"the-small-web"},"45.1":{t:"Browsing the small web",p:` -Follow Webrings or other links from known small websites -Marg ...`,l:"garden/the-small-web/index.html#browsing-the-small-web",a:"browsing-the-small-web"},"45.2":{t:"Building personal websites",p:`IndieWeb contains various resources - -Their building blocks are ...`,l:"garden/the-small-web/index.html#building-personal-websites",a:"building-personal-websites"},"45.3":{t:"Streams",p:`Microsub is a proposed protocol to support this - -That way, peo ...`,l:"garden/the-small-web/index.html#streams",a:"streams"},"45.4":{t:"Digital Gardens",p:"These sites may be useful to occasionally check up on rather t ...",l:"garden/the-small-web/index.html#digital-gardens",a:"digital-gardens"},"45.5":{t:"Why people want the small web",p:"There are tools these days that make making websites incredibl ...",l:"garden/the-small-web/index.html#why-people-want-the-small-web",a:"why-people-want-the-small-web"},"45.6":{t:"Recommended videos about the small web",p:"<iframe width="560" height="315" src=&q ...",l:"garden/the-small-web/index.html#recommended-videos-about-the-small-web",a:"recommended-videos-about-the-small-web"},"46.0":{t:"# This Knowledge Hub",p:` -Referenced by: Digital Gardens - -This is my knowledge hub! - -It ...`,l:"garden/this-knowledge-hub/index.html",a:"this-knowledge-hub"},"47.0":{t:"# V-ecs",p:` -Tags: My Projects - -!screenshot.png -V-ecs (pronounced "Ve ...`,l:"garden/v-ecs/index.html",a:"v-ecs"},"48.0":{t:"# Vitepress",p:` -Referenced by: This Knowledge Hub - -Vitepress is an Open Sourc ...`,l:"garden/vitepress/index.html",a:"vitepress"},"49.0":{t:"# Wanderstop",p:` -Tags: Davey Wreden - -Wanderstop is the first game by Ivy Road. ...`,l:"garden/wanderstop/index.html",a:"wanderstop"},"50.0":{t:"# Webrings",p:` -Referenced by: The Small Web - -A collection of Personal Websit ...`,l:"garden/webrings/index.html",a:"webrings"},"51.0":{t:"# Weird",p:` -Referenced by: Commune, Fedi v2, The Small Web - -Weird is an O ...`,l:"garden/weird/index.html",a:"weird"},"52.0":{t:"# Guide to Incrementals/Navigating Criticism",p:"Developing games is fun and exciting and teaches a lot of wond ...",l:"guide-to-incrementals/design/criticism/index.html",a:"guide-to-incrementals-navigating-criticism"},"52.1":{t:"Reading Feedback",p:"Game development is a skill that takes time and practice to ge ...",l:"guide-to-incrementals/design/criticism/index.html#reading-feedback",a:"reading-feedback"},"52.2":{t:"Seeking Feedback",p:"When deciding where to share your game, consider the type of p ...",l:"guide-to-incrementals/design/criticism/index.html#seeking-feedback",a:"seeking-feedback"},"52.3":{t:"Responding to Feedback",p:"Negative feedback can naturally feel like an attack, and it's ...",l:"guide-to-incrementals/design/criticism/index.html#responding-to-feedback",a:"responding-to-feedback"},"53.0":{t:"# Guide to Incrementals",p:"This is a comprehensive guide to Incremental Games, a genre of ...",l:"guide-to-incrementals/index.html",a:"guide-to-incrementals"},"53.1":{t:"Why am I making this?",p:"That's a good question! What authority do I have to be making ...",l:"guide-to-incrementals/index.html#why-am-i-making-this",a:"why-am-i-making-this"},"53.2":{t:"Ludology",p:` -Guide to Incrementals/Defining the Genre -Guide to Incremental ...`,l:"guide-to-incrementals/index.html#ludology",a:"ludology"},"53.3":{t:"Making an Incremental",p:` -Guide to Incrementals/Navigating Criticism - -`,l:"guide-to-incrementals/index.html#making-an-incremental",a:"making-an-incremental"},"54.0":{t:"# Guide to Incrementals/Appeal to Developers",p:"There are a lot of developers in the incremental games communi ...",l:"guide-to-incrementals/ludology/appeal-developers/index.html",a:"guide-to-incrementals-appeal-to-developers"},"54.1":{t:"Incrementals are Easy to Make",p:"Compared to other genres, incrementals have quite low expectat ...",l:"guide-to-incrementals/ludology/appeal-developers/index.html#incrementals-are-easy-to-make",a:"incrementals-are-easy-to-make"},"54.2":{t:"Players are Easy to Find",p:"Once you've finished your game and uploaded it on github pages ...",l:"guide-to-incrementals/ludology/appeal-developers/index.html#players-are-easy-to-find",a:"players-are-easy-to-find"},"54.3":{t:"Monetization",p:"I'd like to clarify that everything I've said above mainly app ...",l:"guide-to-incrementals/ludology/appeal-developers/index.html#monetization",a:"monetization"},"55.0":{t:"# Guide to Incrementals/Appeal to Players",p:"This is something that has been discussed and analyzed by many ...",l:"guide-to-incrementals/ludology/appeal-gamers/index.html",a:"guide-to-incrementals-appeal-to-players"},"55.1":{t:"Numbers Going Up",p:"This is a very common response to why people enjoy incremental ...",l:"guide-to-incrementals/ludology/appeal-gamers/index.html#numbers-going-up",a:"numbers-going-up"},"55.2":{t:"Effortlessness",p:"Incremental games are so easy, a lot of them even have you pro ...",l:"guide-to-incrementals/ludology/appeal-gamers/index.html#effortlessness",a:"effortlessness"},"55.3":{t:"Strategy",p:"Incremental games could be considered a subset of strategy gam ...",l:"guide-to-incrementals/ludology/appeal-gamers/index.html#strategy",a:"strategy"},"55.4":{t:"Avoiding Staleness",p:"Incremental games tend to have "paradigm shifts", wh ...",l:"guide-to-incrementals/ludology/appeal-gamers/index.html#avoiding-staleness",a:"avoiding-staleness"},"55.5":{t:"Good Game Design",p:"Incremental games tend to show their game design "plainly ...",l:"guide-to-incrementals/ludology/appeal-gamers/index.html#good-game-design",a:"good-game-design"},"55.6":{t:"Artistic Merit",p:"The Vampire Survivors video made me think back to the old argu ...",l:"guide-to-incrementals/ludology/appeal-gamers/index.html#artistic-merit",a:"artistic-merit"},"56.0":{t:"# Guide to Incrementals/What is Content?",p:"If you've been in the incremental games community for any amou ...",l:"guide-to-incrementals/ludology/content/index.html",a:"guide-to-incrementals-what-is-content"},"56.1":{t:"Interaction",p:"I think it should be a fairly non-controversial opinion that t ...",l:"guide-to-incrementals/ludology/content/index.html#interaction",a:"interaction"},"56.2":{t:"Repeatable Purchases",p:"Imagine an entity in a game that you can purchase multiple tim ...",l:"guide-to-incrementals/ludology/content/index.html#repeatable-purchases",a:"repeatable-purchases"},"56.3":{t:"Following Instructions",p:"We're getting more and more controversial as we go along! Let' ...",l:"guide-to-incrementals/ludology/content/index.html#following-instructions",a:"following-instructions"},"56.4":{t:"Tips for Developers",p:"If you're a developer, by this point you should have a pretty ...",l:"guide-to-incrementals/ludology/content/index.html#tips-for-developers",a:"tips-for-developers"},"57.0":{t:"# Guide to Incrementals/Defining the Genre",p:"Video games are placed into genres for a variety of reasons. T ...",l:"guide-to-incrementals/ludology/definition/index.html",a:"guide-to-incrementals-defining-the-genre"},"57.1":{t:"Incrementals vs Idlers vs Clickers",p:"Oftentimes people refer to this genre as idle games and/or cli ...",l:"guide-to-incrementals/ludology/definition/index.html#incrementals-vs-idlers-vs-clickers",a:"incrementals-vs-idlers-vs-clickers"},"57.2":{t:"Incrementals as NGU",p:"Another broad definition often used is that incremental games ...",l:"guide-to-incrementals/ludology/definition/index.html#incrementals-as-ngu",a:"incrementals-as-ngu"},"57.3":{t:"Roguelites as Incrementals?",p:"Earlier on, I mentioned reset mechanics shouldn't be used in t ...",l:"guide-to-incrementals/ludology/definition/index.html#roguelites-as-incrementals",a:"roguelites-as-incrementals"},"57.4":{t:"The Berlin Interpretation",p:"By far the most popular way of defining roguelikes is the &quo ...",l:"guide-to-incrementals/ludology/definition/index.html#the-berlin-interpretation",a:"the-berlin-interpretation"},"57.5":{t:"The Incremental Games Canon",p:"Alright, time to get controversial. Up til now, I've been tryi ...",l:"guide-to-incrementals/ludology/definition/index.html#the-incremental-games-canon",a:"the-incremental-games-canon"},"57.6":{t:"The Paradigm Shift",p:"The Paradigm Shift is probably the highest possible value fact ...",l:"guide-to-incrementals/ludology/definition/index.html#the-paradigm-shift",a:"the-paradigm-shift"},"57.7":{t:"High-Value Factors",p:"I won't take as long to discuss the high and low-value factors ...",l:"guide-to-incrementals/ludology/definition/index.html#high-value-factors",a:"high-value-factors"},"57.8":{t:"Low-Value Factors",p:"These are low-value factors, meaning they aren't as strongly c ...",l:"guide-to-incrementals/ludology/definition/index.html#low-value-factors",a:"low-value-factors"},"57.9":{t:"Are Roguelites Incrementals?",p:"Having made our variation of the Berlin Interpretation for inc ...",l:"guide-to-incrementals/ludology/definition/index.html#are-roguelites-incrementals",a:"are-roguelites-incrementals"},"57.10":{t:"Sub-Genres",p:"There are some trends in incremental games that go beyond just ...",l:"guide-to-incrementals/ludology/definition/index.html#sub-genres",a:"sub-genres"},"57.11":{t:"Other Related Genres",p:"Cultivation RPGs are a genre of games, books, and anime popula ...",l:"guide-to-incrementals/ludology/definition/index.html#other-related-genres",a:"other-related-genres"},"59.0":{t:"# 2.0 format changes",p:` -Temp format is changed from temp.something[layer] to temp[lay ...`,l:"public/gamedevtree/2.0-format-changes.html",a:"_2-0-format-changes"},"60.0":{t:"# The-Modding-Tree",p:"A modified version of The Prestige Tree that is much easier to ...",l:"public/gamedevtree/README.html",a:"the-modding-tree"},"61.0":{t:"# The Game Dev Tree changelog:",p:"",l:"public/gamedevtree/changelog.html",a:"the-game-dev-tree-changelog"},"61.1":{t:"v1.0.4 Version Bump [rebalanced,debuggedx3] - 2020-11-09",p:` -Fixed refactorings 2, 3, and 4 not actually affecting product ...`,l:"public/gamedevtree/changelog.html#v1-0-4-version-bump-rebalanced-debuggedx3-2020-11-09",a:"v1-0-4-version-bump-rebalanced-debuggedx3-2020-11-09"},"61.2":{t:"v1.0.3 Version Bump [rebalanced,debuggedx2] - 2020-11-08",p:` -Fixed API milestone 4 not working - -`,l:"public/gamedevtree/changelog.html#v1-0-3-version-bump-rebalanced-debuggedx2-2020-11-08",a:"v1-0-3-version-bump-rebalanced-debuggedx2-2020-11-08"},"61.3":{t:"v1.0.2 Version Bump [rebalanced,debugged] - 2020-11-08",p:` -Fixed tree lines being hidden after hitting "keepGoing&q ...`,l:"public/gamedevtree/changelog.html#v1-0-2-version-bump-rebalanced-debugged-2020-11-08",a:"v1-0-2-version-bump-rebalanced-debugged-2020-11-08"},"61.4":{t:"v1.0.1 Version Bump [rebalanced] - 2020-11-08",p:` -Buffed several TAs - -`,l:"public/gamedevtree/changelog.html#v1-0-1-version-bump-rebalanced-2020-11-08",a:"v1-0-1-version-bump-rebalanced-2020-11-08"},"61.5":{t:"v1.0 Version Bump - 2020-11-08",p:` -Finished row 4 -Added colored text to lore -Fixed some visual b ...`,l:"public/gamedevtree/changelog.html#v1-0-version-bump-2020-11-08",a:"v1-0-version-bump-2020-11-08"},"61.6":{t:"v0.2.3 Stylish - 2020-10-30",p:` -Re-styled basically everything -Added favicon -Added header bar ...`,l:"public/gamedevtree/changelog.html#v0-2-3-stylish-2020-10-30",a:"v0-2-3-stylish-2020-10-30"},"61.7":{t:"v0.2.2 Row 3 - 2020-10-22",p:` -Removed debug statement -Moved milestones in F layer beneath t ...`,l:"public/gamedevtree/changelog.html#v0-2-2-row-3-2020-10-22",a:"v0-2-2-row-3-2020-10-22"},"61.8":{t:"v0.2.1 Row 3 - 2020-10-21",p:` -Fixed layers hiding -Fixed typos/minor issues -Fixed S layer be ...`,l:"public/gamedevtree/changelog.html#v0-2-1-row-3-2020-10-21",a:"v0-2-1-row-3-2020-10-21"},"61.9":{t:"v0.2 Row 3 - 2020-10-21",p:` -Implemented row 3 - -`,l:"public/gamedevtree/changelog.html#v0-2-row-3-2020-10-21",a:"v0-2-row-3-2020-10-21"},"61.10":{t:"v0.1.1 Cash Influx [rebalanced] - 2020-10-19",p:` -Fixed notification issue -Rebalanced to make early game faster ...`,l:"public/gamedevtree/changelog.html#v0-1-1-cash-influx-rebalanced-2020-10-19",a:"v0-1-1-cash-influx-rebalanced-2020-10-19"},"61.11":{t:"v0.1 Cash Influx - 2020-10-19",p:` -Implemented row 2 - -`,l:"public/gamedevtree/changelog.html#v0-1-cash-influx-2020-10-19",a:"v0-1-cash-influx-2020-10-19"},"61.12":{t:"v0.0 Initial Commit - 2020-10-18",p:` -Implemented row 1 - -`,l:"public/gamedevtree/changelog.html#v0-0-initial-commit-2020-10-18",a:"v0-0-initial-commit-2020-10-18"},"62.0":{t:"# The-Modding-Tree",p:"The main way to add content is through creating layers. You ca ...",l:"public/gamedevtree/docs/!general-info.html",a:"the-modding-tree"},"62.1":{t:"General:",p:` -Getting Started: Getting your own copy of the code set up wit ...`,l:"public/gamedevtree/docs/!general-info.html#general",a:"general"},"62.2":{t:"Common components",p:` -Upgrades: How to create upgrades for a layer. -Milestones: How ...`,l:"public/gamedevtree/docs/!general-info.html#common-components",a:"common-components"},"62.3":{t:"Other components",p:` -Challenges: How to create challenges for a layer. -Bars: Displ ...`,l:"public/gamedevtree/docs/!general-info.html#other-components",a:"other-components"},"63.0":{t:"# Achievements",p:"Achievements are awarded to the player when they meet a certai ...",l:"public/gamedevtree/docs/achievements.html",a:"achievements"},"64.0":{t:"# Bars",p:"Bars let you display information in a more direct way. It can ...",l:"public/gamedevtree/docs/bars.html",a:"bars"},"65.0":{t:"# Basic layer breakdown",p:"This is a very minimal layer with minimal features. Most thing ...",l:"public/gamedevtree/docs/basic-layer-breakdown.html",a:"basic-layer-breakdown"},"66.0":{t:"# Buyables",p:"Buyables are usually things that can be bought multiple times ...",l:"public/gamedevtree/docs/buyables.html",a:"buyables"},"67.0":{t:"# Challenges",p:"Useful functions for dealing with Challenges and implementing ...",l:"public/gamedevtree/docs/challenges.html",a:"challenges"},"68.0":{t:"# Clickables",p:"Clickables are any kind of thing that you can click for an eff ...",l:"public/gamedevtree/docs/clickables.html",a:"clickables"},"69.0":{t:"# Custom tab layouts",p:"Note: If you are using subtabs, tabFormat is used differently, ...",l:"public/gamedevtree/docs/custom-tab-layouts.html",a:"custom-tab-layouts"},"70.0":{t:"# Getting started",p:`Welcome to The Modding Tree! -Using the Modding Tree, at its si ...`,l:"public/gamedevtree/docs/getting-started.html",a:"getting-started"},"70.1":{t:"Getting set up with Github and The Modding Tree:",p:` - -Install Github Desktop and Visual Studio Code. - - -Make a Gith ...`,l:"public/gamedevtree/docs/getting-started.html#getting-set-up-with-github-and-the-modding-tree",a:"getting-set-up-with-github-and-the-modding-tree"},"70.2":{t:"Using your repository",p:` - -Click on "show in finder" to the right, and then o ...`,l:"public/gamedevtree/docs/getting-started.html#using-your-repository",a:"using-your-repository"},"71.0":{t:"# Infoboxes",p:"Infoboxes are good for displaying "lore", or story e ...",l:"public/gamedevtree/docs/infoboxes.html",a:"infoboxes"},"72.0":{t:"# Layer Features",p:"This is a more comprehensive list of established features to a ...",l:"public/gamedevtree/docs/layer-features.html",a:"layer-features"},"72.1":{t:"Layer Definition features",p:` - -layer: Assigned automagically. It's the same value as the na ...`,l:"public/gamedevtree/docs/layer-features.html#layer-definition-features",a:"layer-definition-features"},"72.2":{t:"Big features (all optional)",p:` - -upgrades: A grid of one-time purchases which can have unique ...`,l:"public/gamedevtree/docs/layer-features.html#big-features-all-optional",a:"big-features-all-optional"},"72.3":{t:"Prestige formula features",p:` - -type: optional, Determines which prestige formula you use. D ...`,l:"public/gamedevtree/docs/layer-features.html#prestige-formula-features",a:"prestige-formula-features"},"72.4":{t:"Tree/node features",p:` - -symbol: optional, the text that appears on this layer's node ...`,l:"public/gamedevtree/docs/layer-features.html#tree-node-features",a:"tree-node-features"},"72.5":{t:"Other features",p:` - -doReset(resettingLayer): optional, is triggered when a layer ...`,l:"public/gamedevtree/docs/layer-features.html#other-features",a:"other-features"},"72.6":{t:"Custom Prestige type ",p:` - -getResetGain(): For custom prestige type, Returns how many p ...`,l:"public/gamedevtree/docs/layer-features.html#custom-prestige-type",a:"custom-prestige-type"},"73.0":{t:"# mod.js",p:"All of the code and data that you're likely to edit is here in ...",l:"public/gamedevtree/docs/main-mod-info.html",a:"mod-js"},"74.0":{t:"# Milestones",p:"Milestones are awarded to the player when they meet a certain ...",l:"public/gamedevtree/docs/milestones.html",a:"milestones"},"75.0":{t:"# Subtabs and Microtabs",p:"Subtabs are separate sections of a tab that you can view by se ...",l:"public/gamedevtree/docs/subtabs-and-microtabs.html",a:"subtabs-and-microtabs"},"76.0":{t:"# Updating The Modding Tree",p:"This tutorial assumes that you have used the Getting Started T ...",l:"public/gamedevtree/docs/updating-tmt.html",a:"updating-the-modding-tree"},"77.0":{t:"# Upgrades",p:"Useful functions for dealing with Upgrades and implementing th ...",l:"public/gamedevtree/docs/upgrades.html",a:"upgrades"},"78.0":{t:"# 2.0 format changes",p:` -Temp format is changed from temp.something[layer] to temp[lay ...`,l:"public/kronos/Old Things/2.0-format-changes.html",a:"_2-0-format-changes"},"79.0":{t:"# Kronos",p:`Play here. -Updating the website: - -git submodule update --remot ...`,l:"public/kronos/README.html",a:"kronos"},"80.0":{t:"# The Modding Tree changelog:",p:"",l:"public/kronos/changelog.html",a:"the-modding-tree-changelog"},"80.1":{t:"v2.5.9.2 - 5/19/21",p:` -Fixed many issues with things not updating. - -`,l:"public/kronos/changelog.html#v2-5-9-2-5-19-21",a:"v2-5-9-2-5-19-21"},"80.2":{t:"v2.5.9.1 - 5/18/21",p:` -Made text inputs never give NaNs. - -`,l:"public/kronos/changelog.html#v2-5-9-1-5-18-21",a:"v2-5-9-1-5-18-21"},"80.3":{t:"v2.5.9 - 5/18/21",p:` -Fixed issue when using text inputs for Numbers. -Added particl ...`,l:"public/kronos/changelog.html#v2-5-9-5-18-21",a:"v2-5-9-5-18-21"},"80.4":{t:"v2.5.8 - 5/17/21",p:` -Added makeShinies, which creates a stationary particle in a r ...`,l:"public/kronos/changelog.html#v2-5-8-5-17-21",a:"v2-5-8-5-17-21"},"80.5":{t:"v2.5.7 - 5/15/21",p:` -Added a particle system! Not only can it be used for visual e ...`,l:"public/kronos/changelog.html#v2-5-7-5-15-21",a:"v2-5-7-5-15-21"},"80.6":{t:"v2.5.6 - 5/14/21",p:` -You can now use non-numeric ids for upgrades, buyables, etc. - ...`,l:"public/kronos/changelog.html#v2-5-6-5-14-21",a:"v2-5-6-5-14-21"},"80.7":{t:"v2.5.5.2 - 5/12/21",p:` -Fixed a major issue with buyables. -Fixed a variety of tabForm ...`,l:"public/kronos/changelog.html#v2-5-5-2-5-12-21",a:"v2-5-5-2-5-12-21"},"80.8":{t:"v2.5.5.1 - 5/12/21",p:` -Fixed clickables. - -`,l:"public/kronos/changelog.html#v2-5-5-1-5-12-21",a:"v2-5-5-1-5-12-21"},"80.9":{t:"v2.5.5 - 5/12/21",p:` -Added grids! They are a grid of buttons which behave the same ...`,l:"public/kronos/changelog.html#v2-5-5-5-12-21",a:"v2-5-5-5-12-21"},"80.10":{t:"v2.5.4 - 5/10/21",p:` -Added a setting to always use single-tab mode. -Added directMu ...`,l:"public/kronos/changelog.html#v2-5-4-5-10-21",a:"v2-5-4-5-10-21"},"80.11":{t:"v2.5.3 - 5/8/21",p:` -Improved performance of tab formats and bars. -Respec confirma ...`,l:"public/kronos/changelog.html#v2-5-3-5-8-21",a:"v2-5-3-5-8-21"},"80.12":{t:"v2.5.2.1 - 5/7/21",p:` -Fixed microtabs making layers highlight incorrectly. - -`,l:"public/kronos/changelog.html#v2-5-2-1-5-7-21",a:"v2-5-2-1-5-7-21"},"80.13":{t:"v2.5.2 - 5/7/21",p:` -Added glowColor for subtabs. -Improved the display for extreme ...`,l:"public/kronos/changelog.html#v2-5-2-5-7-21",a:"v2-5-2-5-7-21"},"80.14":{t:"v2.5.1 - 5/7/21",p:` -Fixed dynamic things in tabFormat not updating. - -`,l:"public/kronos/changelog.html#v2-5-1-5-7-21",a:"v2-5-1-5-7-21"},"80.15":{t:"v2.5: Dreams Really Do Come True - 5/7/21",p:` -Optimizations, hopefully a significant amount. -Added OOM/s po ...`,l:"public/kronos/changelog.html#v2-5-dreams-really-do-come-true-5-7-21",a:"v2-5-dreams-really-do-come-true-5-7-21"},"80.16":{t:"v2.4.1 - 4/29/21",p:` -A number of minor fixes, many thanks to thepaperpilot. -The re ...`,l:"public/kronos/changelog.html#v2-4-1-4-29-21",a:"v2-4-1-4-29-21"},"80.17":{t:"v2.4: Rationalized Edition - 4/29/21",p:` - -Completely reworked tooltips. Shift-click a node to force it ...`,l:"public/kronos/changelog.html#v2-4-rationalized-edition-4-29-21",a:"v2-4-rationalized-edition-4-29-21"},"80.18":{t:"v2.π.1 - 4/7/21",p:` -Fixed formatting for some larger numbers. -Upgrades will expan ...`,l:"public/kronos/changelog.html#v2-π-1-4-7-21",a:"v2-π-1-4-7-21"},"80.19":{t:"v2.π: Incrementally Updated - 2/5/21",p:` -Performance improvements. -Fixed tooltips overlapping with the ...`,l:"public/kronos/changelog.html#v2-π-incrementally-updated-2-5-21",a:"v2-π-incrementally-updated-2-5-21"},"80.20":{t:"v2.3.5 - 12/21/20",p:` -Added resetTime, which tracks the time since a layer prestige ...`,l:"public/kronos/changelog.html#v2-3-5-12-21-20",a:"v2-3-5-12-21-20"},"80.21":{t:"v2.3.4 - 12/16/20",p:` -Added a node image feature. -Resource display now always shows ...`,l:"public/kronos/changelog.html#v2-3-4-12-16-20",a:"v2-3-4-12-16-20"},"80.22":{t:"v2.3.3 - 12/13/20",p:` -Fixed the first node in a row always taking up space. -layerSh ...`,l:"public/kronos/changelog.html#v2-3-3-12-13-20",a:"v2-3-3-12-13-20"},"80.23":{t:"v2.3.2 - 12/13/20",p:` -Fixed achievement/milestone popups. - -`,l:"public/kronos/changelog.html#v2-3-2-12-13-20",a:"v2-3-2-12-13-20"},"80.24":{t:"v2.3.1 - 12/12/20",p:` -Another attempt to fix flickering tooltips. -The "this&qu ...`,l:"public/kronos/changelog.html#v2-3-1-12-12-20",a:"v2-3-1-12-12-20"},"80.25":{t:"v2.3: Cooler and Newer Edition - 12/10/20",p:` -Added achievement/milestone popups (thank you to Jacorb for t ...`,l:"public/kronos/changelog.html#v2-3-cooler-and-newer-edition-12-10-20",a:"v2-3-cooler-and-newer-edition-12-10-20"},"80.26":{t:"v2.2.8 - 12/03/20",p:` -Double-clicking a layer node brings you to the main subtab fo ...`,l:"public/kronos/changelog.html#v2-2-8-12-03-20",a:"v2-2-8-12-03-20"},"80.27":{t:"v2.2.7 - 11/30/20",p:` -Added autoUpgrade feature. -resource-display now shows resourc ...`,l:"public/kronos/changelog.html#v2-2-7-11-30-20",a:"v2-2-7-11-30-20"},"80.28":{t:"v2.2.6 - 11/30/20",p:` -Added goalDescription for challenges and made the new "c ...`,l:"public/kronos/changelog.html#v2-2-6-11-30-20",a:"v2-2-6-11-30-20"},"80.29":{t:"v2.2.5 - 11/29/20",p:` -Added features for overriding the displays and costs/goals of ...`,l:"public/kronos/changelog.html#v2-2-5-11-29-20",a:"v2-2-5-11-29-20"},"80.30":{t:"v2.2.4 - 11/28/20",p:` -Added softcap and softcapPower features (for Normal layers) -O ...`,l:"public/kronos/changelog.html#v2-2-4-11-28-20",a:"v2-2-4-11-28-20"},"80.31":{t:"v2.2.3 - 11/28/20",p:` -Layers will be highlighted if you can finish a challenge. -The ...`,l:"public/kronos/changelog.html#v2-2-3-11-28-20",a:"v2-2-3-11-28-20"},"80.32":{t:"v2.2.2 - 11/22/20",p:` -Fixed right half of the screen being unclickable in some circ ...`,l:"public/kronos/changelog.html#v2-2-2-11-22-20",a:"v2-2-2-11-22-20"},"80.33":{t:"v2.2.1 - 11/7/20",p:` -Added a small highlight to layers you can meaningfully presti ...`,l:"public/kronos/changelog.html#v2-2-1-11-7-20",a:"v2-2-1-11-7-20"},"80.34":{t:"v2.2: Uprooted - 11/7/20",p:` -You can now embed a layer inside of a subtab or microtab! -Add ...`,l:"public/kronos/changelog.html#v2-2-uprooted-11-7-20",a:"v2-2-uprooted-11-7-20"},"80.35":{t:"v2.1.4 - 10/25/20",p:` -Added an infobox component. Thank you to thepaperpilot for th ...`,l:"public/kronos/changelog.html#v2-1-4-10-25-20",a:"v2-1-4-10-25-20"},"80.36":{t:"v2.1.3.1 - 10/21/20",p:` -Fixed the update function. - -`,l:"public/kronos/changelog.html#v2-1-3-1-10-21-20",a:"v2-1-3-1-10-21-20"},"80.37":{t:"v2.1.3 - 10/21/20",p:` -gainMult and gainExp are now optional. -Layer unlocking is now ...`,l:"public/kronos/changelog.html#v2-1-3-10-21-20",a:"v2-1-3-10-21-20"},"80.38":{t:"v2.1.2 - 10/19/20",p:` -Added buyUpgrade function (buyUpg still works though) -Added a ...`,l:"public/kronos/changelog.html#v2-1-2-10-19-20",a:"v2-1-2-10-19-20"},"80.39":{t:"v2.1.1 - 10/17/20",p:` -Added resource-display component, which displays the base cur ...`,l:"public/kronos/changelog.html#v2-1-1-10-17-20",a:"v2-1-1-10-17-20"},"80.40":{t:"v2.1: We should have thought of this sooner! - 10/17/20",p:` -Moved most of the code users will want to edit to mod.js, add ...`,l:"public/kronos/changelog.html#v2-1-we-should-have-thought-of-this-sooner-10-17-20",a:"v2-1-we-should-have-thought-of-this-sooner-10-17-20"},"80.41":{t:"v2.0.5 - 10/16/20",p:` -Made more features (including prestige parameters) able to be ...`,l:"public/kronos/changelog.html#v2-0-5-10-16-20",a:"v2-0-5-10-16-20"},"80.42":{t:"v2.0.4 - 10/16/20",p:` -Fixed HTML on buttons interfering with clicking on them. - -`,l:"public/kronos/changelog.html#v2-0-4-10-16-20",a:"v2-0-4-10-16-20"},"80.43":{t:"v2.0.3 - 10/16/20",p:` -Fixed hotkeys not displaying in info. -Fixed the game supressi ...`,l:"public/kronos/changelog.html#v2-0-3-10-16-20",a:"v2-0-3-10-16-20"},"80.44":{t:"v2.0.2 - 10/15/20",p:` -Branches are now dynamic (they can be functions). -Fixed a cra ...`,l:"public/kronos/changelog.html#v2-0-2-10-15-20",a:"v2-0-2-10-15-20"},"80.45":{t:"v2.0.1 - 10/15/20",p:` -Fixed side layers appearing multiple times. - -`,l:"public/kronos/changelog.html#v2-0-1-10-15-20",a:"v2-0-1-10-15-20"},"80.46":{t:"v2.0: The Pinnacle of Achievement Mountain - 10/15/20",p:` -Added progress bars, which are highly customizable and can be ...`,l:"public/kronos/changelog.html#v2-0-the-pinnacle-of-achievement-mountain-10-15-20",a:"v2-0-the-pinnacle-of-achievement-mountain-10-15-20"},"80.47":{t:"v1.3.5:",p:` -Completely automated convertToDecimal, now you never have to ...`,l:"public/kronos/changelog.html#v1-3-5",a:"v1-3-5"},"80.48":{t:"v1.3.4 - 10/8/20",p:` -Added "midsection" feature to add things to a tab's ...`,l:"public/kronos/changelog.html#v1-3-4-10-8-20",a:"v1-3-4-10-8-20"},"80.49":{t:"v1.3.3 - 10/7/20",p:` -Fix for the "order of operations" issue in temp. - -`,l:"public/kronos/changelog.html#v1-3-3-10-7-20",a:"v1-3-3-10-7-20"},"80.50":{t:"v1.3.1 - 10/7/20",p:` -Added custom CSS and tooltips for Layer Nodes. -Added custom C ...`,l:"public/kronos/changelog.html#v1-3-1-10-7-20",a:"v1-3-1-10-7-20"},"80.51":{t:"v1.3: Tabception... ception! - 10/7/20",p:` -Added subtabs! And also a Micro-tab component to let you make ...`,l:"public/kronos/changelog.html#v1-3-tabception-ception-10-7-20",a:"v1-3-tabception-ception-10-7-20"},"80.52":{t:"v1.2.4 - 10/4/20",p:` -Layers are now highlighted if you can buy an upgrade, and a n ...`,l:"public/kronos/changelog.html#v1-2-4-10-4-20",a:"v1-2-4-10-4-20"},"80.53":{t:"v1.2.3 - 10/3/20",p:` -Added a row component, which displays a list of objects in a ...`,l:"public/kronos/changelog.html#v1-2-3-10-3-20",a:"v1-2-3-10-3-20"},"80.54":{t:"v1.2: This Changes Everything! - 10/3/20",p:` -Many layer features can now be static values or functions. (T ...`,l:"public/kronos/changelog.html#v1-2-this-changes-everything-10-3-20",a:"v1-2-this-changes-everything-10-3-20"},"80.55":{t:"v1.1.1 - 9/30/20",p:` -You can define hotkeys directly from layer config. - -`,l:"public/kronos/changelog.html#v1-1-1-9-30-20",a:"v1-1-1-9-30-20"},"80.56":{t:"v1.1: Enhanced Edition - 9/30/20",p:` -Added "Buyables", which can function like Space Bui ...`,l:"public/kronos/changelog.html#v1-1-enhanced-edition-9-30-20",a:"v1-1-enhanced-edition-9-30-20"},"80.57":{t:"v1.0 - 9/27/20",p:` -First release. - -`,l:"public/kronos/changelog.html#v1-0-9-27-20",a:"v1-0-9-27-20"},"81.0":{t:"# The-Modding-Tree",p:"Making a game in The Modding Tree mostly involves defining par ...",l:"public/kronos/docs/!general-info.html",a:"the-modding-tree"},"81.1":{t:"Table of Contents",p:"",l:"public/kronos/docs/!general-info.html#table-of-contents",a:"table-of-contents"},"81.2":{t:"General",p:` -Getting Started: Getting your own copy of the code set up wit ...`,l:"public/kronos/docs/!general-info.html#general",a:"general"},"81.3":{t:"Common components",p:` -Upgrades: How to create upgrades for a layer. -Milestones: How ...`,l:"public/kronos/docs/!general-info.html#common-components",a:"common-components"},"81.4":{t:"Other components and features",p:` -Challenges: How to create challenges for a layer. -Bars: Displ ...`,l:"public/kronos/docs/!general-info.html#other-components-and-features",a:"other-components-and-features"},"82.0":{t:"# Achievements",p:"Achievements are awarded to the player when they meet a certai ...",l:"public/kronos/docs/achievements.html",a:"achievements"},"83.0":{t:"# Bars",p:"Bars let you display information in a more direct way. It can ...",l:"public/kronos/docs/bars.html",a:"bars"},"84.0":{t:"# Basic layer breakdown",p:"This is a very minimal layer with minimal features. Most thing ...",l:"public/kronos/docs/basic-layer-breakdown.html",a:"basic-layer-breakdown"},"85.0":{t:"# Buyables",p:"Buyables are usually things that can be bought multiple times ...",l:"public/kronos/docs/buyables.html",a:"buyables"},"86.0":{t:"# Challenges",p:"Challenges can have fully customizable win conditions. Useful ...",l:"public/kronos/docs/challenges.html",a:"challenges"},"87.0":{t:"# Clickables",p:"Clickables are any kind of thing that you can click for an eff ...",l:"public/kronos/docs/clickables.html",a:"clickables"},"88.0":{t:"# Custom tab layouts",p:"Note: If you are using subtabs, tabFormat is used differently, ...",l:"public/kronos/docs/custom-tab-layouts.html",a:"custom-tab-layouts"},"89.0":{t:"# Getting started",p:`Welcome to The Modding Tree! -Using the Modding Tree, at its si ...`,l:"public/kronos/docs/getting-started.html",a:"getting-started"},"89.1":{t:"Getting set up with Github Desktop, Visual Studio Code, and The Modding Tree:",p:` - -Install Github Desktop and Visual Studio Code. - - -Make a Gith ...`,l:"public/kronos/docs/getting-started.html#getting-set-up-with-github-desktop-visual-studio-code-and-the-modding-tree",a:"getting-set-up-with-github-desktop-visual-studio-code-and-the-modding-tree"},"89.2":{t:"Using your repository",p:` - -Click on "show in explorer/finder" to the right, a ...`,l:"public/kronos/docs/getting-started.html#using-your-repository",a:"using-your-repository"},"90.0":{t:"# Grids",p:"Grids are an easier way of making a group of similar clickable ...",l:"public/kronos/docs/grids.html",a:"grids"},"91.0":{t:"# Infoboxes",p:"Infoboxes are good for displaying "lore", or story e ...",l:"public/kronos/docs/infoboxes.html",a:"infoboxes"},"92.0":{t:"# Layer Features",p:"This is a more comprehensive list of established features to a ...",l:"public/kronos/docs/layer-features.html",a:"layer-features"},"92.1":{t:"Layer Definition features",p:` - -layer: assigned automagically. It's the same value as the na ...`,l:"public/kronos/docs/layer-features.html#layer-definition-features",a:"layer-definition-features"},"92.2":{t:"Big features (all optional)",p:` - -upgrades: A set of one-time purchases which can have unique ...`,l:"public/kronos/docs/layer-features.html#big-features-all-optional",a:"big-features-all-optional"},"92.3":{t:"Prestige formula features",p:` - -type: optional. Determines which prestige formula you use. D ...`,l:"public/kronos/docs/layer-features.html#prestige-formula-features",a:"prestige-formula-features"},"92.4":{t:"Other prestige-related features",p:` - -canBuyMax(): sometimes required. required for static layers, ...`,l:"public/kronos/docs/layer-features.html#other-prestige-related-features",a:"other-prestige-related-features"},"92.5":{t:"Tree/node features",p:` - -symbol: optional. The text that appears on this layer's node ...`,l:"public/kronos/docs/layer-features.html#tree-node-features",a:"tree-node-features"},"92.6":{t:"Other features",p:` - -doReset(resettingLayer): optional. Is triggered when a layer ...`,l:"public/kronos/docs/layer-features.html#other-features",a:"other-features"},"92.7":{t:"Custom Prestige type ",p:`(All of these can also be used by other prestige types) - - -getR ...`,l:"public/kronos/docs/layer-features.html#custom-prestige-type",a:"custom-prestige-type"},"93.0":{t:"# mod.js",p:"Most of the non-layer code and data that you're likely to edit ...",l:"public/kronos/docs/main-mod-info.html",a:"mod-js"},"94.0":{t:"# Milestones",p:"Milestones are awarded to the player when they meet a certain ...",l:"public/kronos/docs/milestones.html",a:"milestones"},"95.0":{t:"# Particles",p:"Particles are free-floating elements that can move and have ma ...",l:"public/kronos/docs/particles.html",a:"particles"},"96.0":{t:"# Subtabs and Microtabs",p:"Subtabs are separate sections of a tab that you can view by se ...",l:"public/kronos/docs/subtabs-and-microtabs.html",a:"subtabs-and-microtabs"},"97.0":{t:"# Trees and tree customization",p:"If you want to have something beyond the standard tree on the ...",l:"public/kronos/docs/trees-and-tree-customization.html",a:"trees-and-tree-customization"},"97.1":{t:"layoutInfo",p:`The most important part is layoutInfo, containing: - -startTab: ...`,l:"public/kronos/docs/trees-and-tree-customization.html#layoutinfo",a:"layoutinfo"},"97.2":{t:"Trees",p:"The tree component is defined as an array of arrays of names o ...",l:"public/kronos/docs/trees-and-tree-customization.html#trees",a:"trees"},"97.3":{t:"Nodes",p:"Nodes are non-layer buttons that can go in trees. They are def ...",l:"public/kronos/docs/trees-and-tree-customization.html#nodes",a:"nodes"},"98.0":{t:"# Updating The Modding Tree",p:"This tutorial assumes that you have used the Getting Started T ...",l:"public/kronos/docs/updating-tmt.html",a:"updating-the-modding-tree"},"99.0":{t:"# Upgrades",p:"Useful functions for dealing with Upgrades and implementing th ...",l:"public/kronos/docs/upgrades.html",a:"upgrades"},"100.0":{t:"# 2.0 format changes",p:` -Temp format is changed from temp.something[layer] to temp[lay ...`,l:"public/lit/Old Things/2.0-format-changes.html",a:"_2-0-format-changes"},"101.0":{t:"# Kronos",p:`Play here. -Updating the website: - -git submodule update --remot ...`,l:"public/lit/README.html",a:"kronos"},"102.0":{t:"# The Modding Tree changelog:",p:"",l:"public/lit/changelog.html",a:"the-modding-tree-changelog"},"102.1":{t:"v2.π: Incrementally Updated - 2/5/21",p:` -Performance improvements. -Fixed tooltips overlapping with the ...`,l:"public/lit/changelog.html#v2-π-incrementally-updated-2-5-21",a:"v2-π-incrementally-updated-2-5-21"},"102.2":{t:"v2.3.5 - 12/21/20",p:` -Added resetTime, which tracks the time since a layer prestige ...`,l:"public/lit/changelog.html#v2-3-5-12-21-20",a:"v2-3-5-12-21-20"},"102.3":{t:"v2.3.4 - 12/16/20",p:` -Added a node image feature. -Resource display now always shows ...`,l:"public/lit/changelog.html#v2-3-4-12-16-20",a:"v2-3-4-12-16-20"},"102.4":{t:"v2.3.3 - 12/13/20",p:` -Fixed the first node in a row always taking up space. -layerSh ...`,l:"public/lit/changelog.html#v2-3-3-12-13-20",a:"v2-3-3-12-13-20"},"102.5":{t:"v2.3.2 - 12/13/20",p:` -Fixed achievement/milestone popups. - -`,l:"public/lit/changelog.html#v2-3-2-12-13-20",a:"v2-3-2-12-13-20"},"102.6":{t:"v2.3.1 - 12/12/20",p:` -Another attempt to fix flickering tooltips. -The "this&qu ...`,l:"public/lit/changelog.html#v2-3-1-12-12-20",a:"v2-3-1-12-12-20"},"102.7":{t:"v2.3: Cooler and Newer Edition - 12/10/20",p:` -Added achievement/milestone popups (thank you to Jacorb for t ...`,l:"public/lit/changelog.html#v2-3-cooler-and-newer-edition-12-10-20",a:"v2-3-cooler-and-newer-edition-12-10-20"},"102.8":{t:"v2.2.8 - 12/03/20",p:` -Double-clicking a layer node brings you to the main subtab fo ...`,l:"public/lit/changelog.html#v2-2-8-12-03-20",a:"v2-2-8-12-03-20"},"102.9":{t:"v2.2.7 - 11/30/20",p:` -Added autoUpgrade feature. -resource-display now shows resourc ...`,l:"public/lit/changelog.html#v2-2-7-11-30-20",a:"v2-2-7-11-30-20"},"102.10":{t:"v2.2.6 - 11/30/20",p:` -Added goalDescription for challenges and made the new "c ...`,l:"public/lit/changelog.html#v2-2-6-11-30-20",a:"v2-2-6-11-30-20"},"102.11":{t:"v2.2.5 - 11/29/20",p:` -Added features for overriding the displays and costs/goals of ...`,l:"public/lit/changelog.html#v2-2-5-11-29-20",a:"v2-2-5-11-29-20"},"102.12":{t:"v2.2.4 - 11/28/20",p:` -Added softcap and softcapPower features (for Normal layers) -O ...`,l:"public/lit/changelog.html#v2-2-4-11-28-20",a:"v2-2-4-11-28-20"},"102.13":{t:"v2.2.3 - 11/28/20",p:` -Layers will be highlighted if you can finish a challenge. -The ...`,l:"public/lit/changelog.html#v2-2-3-11-28-20",a:"v2-2-3-11-28-20"},"102.14":{t:"v2.2.2 - 11/22/20",p:` -Fixed right half of the screen being unclickable in some circ ...`,l:"public/lit/changelog.html#v2-2-2-11-22-20",a:"v2-2-2-11-22-20"},"102.15":{t:"v2.2.1 - 11/7/20",p:` -Added a small highlight to layers you can meaningfully presti ...`,l:"public/lit/changelog.html#v2-2-1-11-7-20",a:"v2-2-1-11-7-20"},"102.16":{t:"v2.2: Uprooted - 11/7/20",p:` -You can now embed a layer inside of a subtab or microtab! -Add ...`,l:"public/lit/changelog.html#v2-2-uprooted-11-7-20",a:"v2-2-uprooted-11-7-20"},"102.17":{t:"v2.1.4 - 10/25/20",p:` -Added an infobox component. Thank you to thepaperpilot for th ...`,l:"public/lit/changelog.html#v2-1-4-10-25-20",a:"v2-1-4-10-25-20"},"102.18":{t:"v2.1.3.1 - 10/21/20",p:` -Fixed the update function. - -`,l:"public/lit/changelog.html#v2-1-3-1-10-21-20",a:"v2-1-3-1-10-21-20"},"102.19":{t:"v2.1.3 - 10/21/20",p:` -gainMult and gainExp are now optional. -Layer unlocking is now ...`,l:"public/lit/changelog.html#v2-1-3-10-21-20",a:"v2-1-3-10-21-20"},"102.20":{t:"v2.1.2 - 10/19/20",p:` -Added buyUpgrade function (buyUpg still works though) -Added a ...`,l:"public/lit/changelog.html#v2-1-2-10-19-20",a:"v2-1-2-10-19-20"},"102.21":{t:"v2.1.1 - 10/17/20",p:` -Added resource-display component, which displays the base cur ...`,l:"public/lit/changelog.html#v2-1-1-10-17-20",a:"v2-1-1-10-17-20"},"102.22":{t:"v2.1: We should have thought of this sooner! - 10/17/20",p:` -Moved most of the code users will want to edit to mod.js, add ...`,l:"public/lit/changelog.html#v2-1-we-should-have-thought-of-this-sooner-10-17-20",a:"v2-1-we-should-have-thought-of-this-sooner-10-17-20"},"102.23":{t:"v2.0.5 - 10/16/20",p:` -Made more features (including prestige parameters) able to be ...`,l:"public/lit/changelog.html#v2-0-5-10-16-20",a:"v2-0-5-10-16-20"},"102.24":{t:"v2.0.4 - 10/16/20",p:` -Fixed HTML on buttons interfering with clicking on them. - -`,l:"public/lit/changelog.html#v2-0-4-10-16-20",a:"v2-0-4-10-16-20"},"102.25":{t:"v2.0.3 - 10/16/20",p:` -Fixed hotkeys not displaying in info. -Fixed the game supressi ...`,l:"public/lit/changelog.html#v2-0-3-10-16-20",a:"v2-0-3-10-16-20"},"102.26":{t:"v2.0.2 - 10/15/20",p:` -Branches are now dynamic (they can be functions). -Fixed a cra ...`,l:"public/lit/changelog.html#v2-0-2-10-15-20",a:"v2-0-2-10-15-20"},"102.27":{t:"v2.0.1 - 10/15/20",p:` -Fixed side layers appearing multiple times. - -`,l:"public/lit/changelog.html#v2-0-1-10-15-20",a:"v2-0-1-10-15-20"},"102.28":{t:"v2.0: The Pinnacle of Achievement Mountain - 10/15/20",p:` -Added progress bars, which are highly customizable and can be ...`,l:"public/lit/changelog.html#v2-0-the-pinnacle-of-achievement-mountain-10-15-20",a:"v2-0-the-pinnacle-of-achievement-mountain-10-15-20"},"102.29":{t:"v1.3.5:",p:` -Completely automated convertToDecimal, now you never have to ...`,l:"public/lit/changelog.html#v1-3-5",a:"v1-3-5"},"102.30":{t:"v1.3.4 - 10/8/20",p:` -Added "midsection" feature to add things to a tab's ...`,l:"public/lit/changelog.html#v1-3-4-10-8-20",a:"v1-3-4-10-8-20"},"102.31":{t:"v1.3.3 - 10/7/20",p:` -Fix for the "order of operations" issue in temp. - -`,l:"public/lit/changelog.html#v1-3-3-10-7-20",a:"v1-3-3-10-7-20"},"102.32":{t:"v1.3.1 - 10/7/20",p:` -Added custom CSS and tooltips for Layer Nodes. -Added custom C ...`,l:"public/lit/changelog.html#v1-3-1-10-7-20",a:"v1-3-1-10-7-20"},"102.33":{t:"v1.3: Tabception... ception! - 10/7/20",p:` -Added subtabs! And also a Micro-tab component to let you make ...`,l:"public/lit/changelog.html#v1-3-tabception-ception-10-7-20",a:"v1-3-tabception-ception-10-7-20"},"102.34":{t:"v1.2.4 - 10/4/20",p:` -Layers are now highlighted if you can buy an upgrade, and a n ...`,l:"public/lit/changelog.html#v1-2-4-10-4-20",a:"v1-2-4-10-4-20"},"102.35":{t:"v1.2.3 - 10/3/20",p:` -Added a row component, which displays a list of objects in a ...`,l:"public/lit/changelog.html#v1-2-3-10-3-20",a:"v1-2-3-10-3-20"},"102.36":{t:"v1.2: This Changes Everything! - 10/3/20",p:` -Many layer features can now be static values or functions. (T ...`,l:"public/lit/changelog.html#v1-2-this-changes-everything-10-3-20",a:"v1-2-this-changes-everything-10-3-20"},"102.37":{t:"v1.1.1:",p:` -You can define hotkeys directly from layer config. - -`,l:"public/lit/changelog.html#v1-1-1",a:"v1-1-1"},"102.38":{t:"v1.1: Enhanced Edition",p:` -Added "Buyables", which can function like Space Bui ...`,l:"public/lit/changelog.html#v1-1-enhanced-edition",a:"v1-1-enhanced-edition"},"102.39":{t:"v1.0:",p:` -First release. - -`,l:"public/lit/changelog.html#v1-0",a:"v1-0"},"103.0":{t:"# The-Modding-Tree",p:"The main way to add content is through creating layers. You ca ...",l:"public/lit/docs/!general-info.html",a:"the-modding-tree"},"103.1":{t:"Table of Contents",p:"",l:"public/lit/docs/!general-info.html#table-of-contents",a:"table-of-contents"},"103.2":{t:"General",p:` -Getting Started: Getting your own copy of the code set up wit ...`,l:"public/lit/docs/!general-info.html#general",a:"general"},"103.3":{t:"Common components",p:` -Upgrades: How to create upgrades for a layer. -Milestones: How ...`,l:"public/lit/docs/!general-info.html#common-components",a:"common-components"},"103.4":{t:"Other components and features",p:` -Challenges: How to create challenges for a layer. -Bars: Displ ...`,l:"public/lit/docs/!general-info.html#other-components-and-features",a:"other-components-and-features"},"104.0":{t:"# Achievements",p:"Achievements are awarded to the player when they meet a certai ...",l:"public/lit/docs/achievements.html",a:"achievements"},"105.0":{t:"# Bars",p:"Bars let you display information in a more direct way. It can ...",l:"public/lit/docs/bars.html",a:"bars"},"106.0":{t:"# Basic layer breakdown",p:"This is a very minimal layer with minimal features. Most thing ...",l:"public/lit/docs/basic-layer-breakdown.html",a:"basic-layer-breakdown"},"107.0":{t:"# Buyables",p:"Buyables are usually things that can be bought multiple times ...",l:"public/lit/docs/buyables.html",a:"buyables"},"108.0":{t:"# Challenges",p:"Challenges can have fully customizable win conditions. Useful ...",l:"public/lit/docs/challenges.html",a:"challenges"},"109.0":{t:"# Clickables",p:"Clickables are any kind of thing that you can click for an eff ...",l:"public/lit/docs/clickables.html",a:"clickables"},"110.0":{t:"# Custom tab layouts",p:"Note: If you are using subtabs, tabFormat is used differently, ...",l:"public/lit/docs/custom-tab-layouts.html",a:"custom-tab-layouts"},"111.0":{t:"# Getting started",p:`Welcome to The Modding Tree! -Using the Modding Tree, at its si ...`,l:"public/lit/docs/getting-started.html",a:"getting-started"},"111.1":{t:"Getting set up with Github Desktop, Visual Studio Code, and The Modding Tree:",p:` - -Install Github Desktop and Visual Studio Code. - - -Make a Gith ...`,l:"public/lit/docs/getting-started.html#getting-set-up-with-github-desktop-visual-studio-code-and-the-modding-tree",a:"getting-set-up-with-github-desktop-visual-studio-code-and-the-modding-tree"},"111.2":{t:"Using your repository",p:` - -Click on "show in explorer/finder" to the right, a ...`,l:"public/lit/docs/getting-started.html#using-your-repository",a:"using-your-repository"},"112.0":{t:"# Infoboxes",p:"Infoboxes are good for displaying "lore", or story e ...",l:"public/lit/docs/infoboxes.html",a:"infoboxes"},"113.0":{t:"# Layer Features",p:"This is a more comprehensive list of established features to a ...",l:"public/lit/docs/layer-features.html",a:"layer-features"},"113.1":{t:"Layer Definition features",p:` - -layer: assigned automagically. It's the same value as the na ...`,l:"public/lit/docs/layer-features.html#layer-definition-features",a:"layer-definition-features"},"113.2":{t:"Big features (all optional)",p:` - -upgrades: A grid of one-time purchases which can have unique ...`,l:"public/lit/docs/layer-features.html#big-features-all-optional",a:"big-features-all-optional"},"113.3":{t:"Prestige formula features",p:` - -type: optional. Determines which prestige formula you use. D ...`,l:"public/lit/docs/layer-features.html#prestige-formula-features",a:"prestige-formula-features"},"113.4":{t:"Other prestige-related features",p:` - -canBuyMax(): sometimes required. required for static layers, ...`,l:"public/lit/docs/layer-features.html#other-prestige-related-features",a:"other-prestige-related-features"},"113.5":{t:"Tree/node features",p:` - -symbol: optional. The text that appears on this layer's node ...`,l:"public/lit/docs/layer-features.html#tree-node-features",a:"tree-node-features"},"113.6":{t:"Other features",p:` - -doReset(resettingLayer): optional. Is triggered when a layer ...`,l:"public/lit/docs/layer-features.html#other-features",a:"other-features"},"113.7":{t:"Custom Prestige type ",p:`(All of these can also be used by other prestige types) - - -getR ...`,l:"public/lit/docs/layer-features.html#custom-prestige-type",a:"custom-prestige-type"},"114.0":{t:"# mod.js",p:"All of the non-layer code and data that you're likely to edit ...",l:"public/lit/docs/main-mod-info.html",a:"mod-js"},"115.0":{t:"# Milestones",p:"Milestones are awarded to the player when they meet a certain ...",l:"public/lit/docs/milestones.html",a:"milestones"},"116.0":{t:"# Subtabs and Microtabs",p:"Subtabs are separate sections of a tab that you can view by se ...",l:"public/lit/docs/subtabs-and-microtabs.html",a:"subtabs-and-microtabs"},"117.0":{t:"# Trees and tree customization",p:"If you want to have something beyond the standard tree on the ...",l:"public/lit/docs/trees-and-tree-customization.html",a:"trees-and-tree-customization"},"117.1":{t:"layoutInfo",p:`The most important part is layoutInfo, containing: - -startTab: ...`,l:"public/lit/docs/trees-and-tree-customization.html#layoutinfo",a:"layoutinfo"},"117.2":{t:"Trees",p:"The tree component is defined as an array of arrays of names o ...",l:"public/lit/docs/trees-and-tree-customization.html#trees",a:"trees"},"117.3":{t:"Nodes",p:"Nodes are non-layer buttons that can go in trees. They are def ...",l:"public/lit/docs/trees-and-tree-customization.html#nodes",a:"nodes"},"118.0":{t:"# Updating The Modding Tree",p:"This tutorial assumes that you have used the Getting Started T ...",l:"public/lit/docs/updating-tmt.html",a:"updating-the-modding-tree"},"119.0":{t:"# Upgrades",p:"Useful functions for dealing with Upgrades and implementing th ...",l:"public/lit/docs/upgrades.html",a:"upgrades"}},a={previewLength:62,buttonLabel:"Search",placeholder:"Search website",allow:[],ignore:[]},n={INDEX_DATA:e,PREVIEW_LOOKUP:t,Options:a};export{n as default}; diff --git a/assets/chunks/virtual_search-data.CUABEQwy.js b/assets/chunks/virtual_search-data.CUABEQwy.js new file mode 100644 index 00000000..4cbe47f4 --- /dev/null +++ b/assets/chunks/virtual_search-data.CUABEQwy.js @@ -0,0 +1,480 @@ +const e={map:'[{"section":["0.0"],"activitypub":["1.0"],"advent":["2.0"],"atproto":["3.0"],"babble":["4.0"],"capture":["5.0"],"chat":["6.0"],"chronological":["7.0"],"cinny":["8.0"],"commune":["9.0"],"davey":["10.0"],"decentralized":["11.0"],"dice":["12.0"],"digital":["13.0","45.4"],"federated":["14.0"],"fedi":["15.0"],"inspiration":["15.1"],"identity":["15.2"],"servers":["15.3"],"content":["15.4"],"moderation":["15.5"],"problems":["15.6"],"fediverse":["16.0"],"forgejo":["17.0"],"freeform":["18.0","19.0"],"game":["20.0"],"garden":["21.0"],"guide":["22.0","23.0","24.0","25.0","26.0","27.0","52.0","53.0","54.0","55.0","56.0","57.0"],"incrementals":["22.1","24.1","24.2","54.1","57.1","57.2"],"players":["22.2","54.2"],"monetization":["22.3","54.3"],"numbers":["23.1","55.1"],"effortlessness":["23.2","55.2"],"strategy":["23.3","55.3"],"avoiding":["23.4","55.4"],"good":["23.5","55.5"],"artistic":["23.6","55.6"],"roguelites":["24.3","57.3"],"the":["24.4","24.5","24.6","38.1","43.0","44.0","45.0","57.4","57.5","57.6","60.0","61.0","62.0","80.0","81.0","102.0","103.0"],"high":["24.7","57.7"],"low":["24.8","57.8"],"are":["24.9","57.9"],"sub":["24.10","57.10"],"other":["24.11","57.11","62.3","72.5","81.4","92.4","92.6","103.4","113.4","113.6"],"why":["25.1","45.5","53.1"],"ludology":["25.2","53.2"],"making":["25.3","53.3"],"reading":["26.1","52.1"],"seeking":["26.2","52.2"],"responding":["26.3","52.3"],"interaction":["27.1","56.1"],"repeatable":["27.2","56.2"],"following":["27.3","56.3"],"tips":["27.4","56.4"],"incremental":["28.0"],"ivy":["29.0"],"kronos":["30.0","79.0","101.0"],"logseq":["31.0"],"matrix":["32.0"],"mbin":["33.0"],"my":["34.0","35.0","38.2"],"games":["35.1"],"tools":["35.2"],"nostr":["36.0"],"open":["37.0"],"opti":["38.0"],"planar":["39.0"],"profectus":["40.0"],"social":["41.0"],"synapse":["42.0"],"browsing":["45.1"],"building":["45.2"],"streams":["45.3"],"recommended":["45.6"],"this":["46.0"],"v":["47.0"],"vitepress":["48.0"],"wanderstop":["49.0"],"webrings":["50.0"],"weird":["51.0"],"v1":["61.1","61.2","61.3","61.4","61.5","80.47","80.48","80.49","80.50","80.51","80.52","80.53","80.54","80.55","80.56","80.57","102.29","102.30","102.31","102.32","102.33","102.34","102.35","102.36","102.37","102.38","102.39"],"v0":["61.6","61.7","61.8","61.9","61.10","61.11","61.12"],"general":["62.1","81.2","103.2"],"common":["62.2","81.3","103.3"],"achievements":["63.0","82.0","104.0"],"bars":["64.0","83.0","105.0"],"basic":["65.0","84.0","106.0"],"buyables":["66.0","85.0","107.0"],"challenges":["67.0","86.0","108.0"],"clickables":["68.0","87.0","109.0"],"custom":["69.0","72.6","88.0","92.7","110.0","113.7"],"getting":["70.0","70.1","89.0","89.1","111.0","111.1"],"using":["70.2","89.2","111.2"],"infoboxes":["71.0","91.0","112.0"],"layer":["72.0","72.1","92.0","92.1","113.0","113.1"],"big":["72.2","92.2","113.2"],"prestige":["72.3","92.3","113.3"],"tree":["72.4","92.5","113.5"],"mod":["73.0","93.0","114.0"],"milestones":["74.0","94.0","115.0"],"subtabs":["75.0","96.0","116.0"],"updating":["76.0","98.0","118.0"],"upgrades":["77.0","99.0","119.0"],"v2":["80.1","80.2","80.3","80.4","80.5","80.6","80.7","80.8","80.9","80.10","80.11","80.12","80.13","80.14","80.15","80.16","80.17","80.18","80.19","80.20","80.21","80.22","80.23","80.24","80.25","80.26","80.27","80.28","80.29","80.30","80.31","80.32","80.33","80.34","80.35","80.36","80.37","80.38","80.39","80.40","80.41","80.42","80.43","80.44","80.45","80.46","102.1","102.2","102.3","102.4","102.5","102.6","102.7","102.8","102.9","102.10","102.11","102.12","102.13","102.14","102.15","102.16","102.17","102.18","102.19","102.20","102.21","102.22","102.23","102.24","102.25","102.26","102.27","102.28"],"table":["81.1","103.1"],"grids":["90.0"],"particles":["95.0"],"trees":["97.0","97.2","117.0","117.2"],"layoutinfo":["97.1","117.1"],"nodes":["97.3","117.3"]},{"0":["0.0","59.0","61.1","61.2","61.3","61.4","61.5","61.12","74.0","78.0","80.41","80.42","80.43","80.44","80.45","80.46","80.57","94.0","100.0","102.23","102.24","102.25","102.26","102.27","102.28","102.39","115.0"],"1":["0.0","61.8","61.10","61.11","70.1","70.2","80.16","80.18","80.24","80.33","80.35","80.36","80.37","80.38","80.39","80.40","80.50","80.55","80.56","89.1","89.2","102.6","102.15","102.17","102.18","102.19","102.20","102.21","102.22","102.32","102.37","102.38","111.1","111.2"],"2":["0.0","59.0","61.3","61.6","61.7","61.8","61.9","70.1","70.2","78.0","80.7","80.13","80.19","80.26","80.27","80.28","80.29","80.30","80.31","80.32","80.33","80.34","80.38","80.44","80.52","80.53","80.54","100.0","102.1","102.8","102.9","102.10","102.11","102.12","102.13","102.14","102.15","102.16","102.20","102.26","102.34","102.35","102.36"],"3":["12.0","61.2","61.6","80.11","80.20","80.21","80.22","80.23","80.24","80.25","80.31","80.37","80.43","80.47","80.48","80.49","80.50","80.51","80.53","80.54","102.2","102.3","102.4","102.5","102.6","102.7","102.13","102.19","102.25","102.29","102.30","102.31","102.32","102.33","102.35","102.36"],"4":["0.0","61.1","80.10","80.16","80.17","80.18","80.21","80.30","80.35","80.48","80.52","102.3","102.12","102.17","102.30","102.34"],"5":["0.0","80.1","80.2","80.3","80.4","80.5","80.6","80.7","80.8","80.9","80.10","80.11","80.12","80.13","80.14","80.15","80.19","80.20","80.29","80.41","80.47","102.1","102.2","102.11","102.23","102.29"],"6":["0.0","80.6","80.28","102.10"],"7":["0.0","80.5","80.15","80.18","80.27","80.33","80.34","80.50","80.51","102.9","102.15","102.16","102.32","102.33"],"8":["0.0","80.4","80.11","80.26","80.48","102.8","102.30"],"9":["0.0","80.3","80.56"],"10":["0.0","80.10","80.25","80.35","80.37","80.38","80.39","80.40","80.41","80.43","80.44","80.46","80.48","80.50","80.51","80.52","80.53","80.54","90.0","102.7","102.17","102.19","102.20","102.21","102.22","102.23","102.25","102.26","102.28","102.30","102.32","102.33","102.34","102.35","102.36"],"11":["80.27","80.28","80.29","80.30","80.31","80.32","80.33","80.34","99.0","102.9","102.10","102.11","102.12","102.13","102.14","102.15","102.16","119.0"],"12":["80.9","80.20","80.21","80.22","80.24","80.25","80.26","102.2","102.3","102.4","102.6","102.7","102.8"],"13":["0.0","80.22","102.4"],"14":["80.6"],"15":["0.0","80.5","80.46","102.28"],"16":["0.0","80.21","80.41","80.43","102.3","102.23","102.25"],"17":["80.4","80.39","80.40","102.21","102.22"],"18":["80.3"],"19":["80.38","102.20"],"20":["80.20","80.24","80.25","80.26","80.27","80.29","80.30","80.31","80.33","80.34","80.35","80.37","80.38","80.39","80.40","80.41","80.43","80.46","80.50","80.51","80.52","80.53","80.54","102.2","102.6","102.7","102.8","102.9","102.11","102.12","102.13","102.15","102.16","102.17","102.19","102.20","102.21","102.22","102.23","102.25","102.28","102.32","102.33","102.34","102.35","102.36"],"21":["0.0","80.5","80.9","80.10","80.15","80.16","80.17","80.20","80.37","102.2","102.19"],"22":["0.0"],"25":["80.35","102.17"],"28":["80.30","80.31","102.12","102.13"],"29":["80.16","80.17","80.29","102.11"],"30":["80.27","80.28","80.56","102.9","102.10"],"42":["0.0"],"49":["0.0"],"58":["0.0"],"75":["0.0"],"79":["0.0"],"84":["0.0"],"100":["90.0","99.0"],"111":["0.0"],"113":["0.0"],"123":["74.0","94.0","115.0"],"178":["0.0"],"179":["0.0"],"497":["0.0"],"747":["0.0"],"776":["0.0"],"797":["0.0"],"974":["0.0"],"2024":["0.0"],"class":["0.0"],"h":["0.0"],"feed":["0.0"],"h1":["0.0"],"p":["0.0","65.0","84.0","106.0"],"name":["0.0","72.1","73.0","92.1","93.0","113.1","114.0"],"a":["0.0","4.0","12.0","15.1","15.2","15.5","15.6","23.1","23.2","23.3","23.5","23.6","24.0","24.1","24.2","24.6","24.10","24.11","25.0","25.1","26.0","26.1","27.1","27.2","27.3","27.4","38.1","45.3","46.0","47.0","50.0","52.0","52.1","53.0","53.1","55.1","55.2","55.3","55.5","55.6","56.1","56.2","56.3","56.4","57.0","57.1","57.2","57.6","57.10","57.11","60.0","62.0","62.2","62.3","63.0","64.0","65.0","66.0","67.0","68.0","69.0","70.0","70.1","72.0","72.2","72.5","73.0","74.0","75.0","80.5","80.10","80.15","80.16","80.17","80.33","80.34","80.51","81.0","81.3","81.4","82.0","83.0","84.0","85.0","86.0","87.0","88.0","89.0","90.0","92.0","92.2","92.6","93.0","94.0","95.0","96.0","97.3","102.15","102.16","102.33","103.0","103.3","103.4","104.0","105.0","106.0","107.0","108.0","109.0","110.0","111.0","113.0","113.2","113.6","114.0","115.0","116.0","117.3"],"href":["0.0"],"changelog":["0.0"],"u":["0.0"],"url":["0.0","92.5"],"rss":["0.0","13.0","21.0"],"svg":["0.0"],"viewbox":["0.0"],"octicon":["0.0"],"aria":["0.0"],"hidden":["0.0"],"true":["0.0","27.3","27.4","56.3","56.4","80.15"],"width":["0.0"],"height":["0.0"],"path":["0.0"],"d":["0.0","22.3","24.1","27.3","54.3","56.3","57.1"],"m2":["0.0"],"002":["0.0"],"725a":["0.0"],"699c8":["0.0"],"201a":["0.0"],"098":["0.0"],"798zm2":["0.0"],"05h":["0.0"],"002a7":["0.0"],"489m2":["0.0"],"13a1":["0.0"],"this":["0.0","15.1","21.0","23.0","23.1","23.2","23.3","24.1","24.2","24.6","25.0","25.1","27.3","27.4","45.0","45.3","53.0","53.1","55.0","55.1","55.2","55.3","56.3","56.4","57.1","57.2","57.6","65.0","67.0","69.0","70.2","72.0","72.1","72.4","72.5","74.0","76.0","80.40","80.54","84.0","86.0","88.0","89.2","92.0","92.1","92.5","92.6","94.0","98.0","102.22","102.36","106.0","108.0","110.0","111.2","113.0","113.1","113.5","113.6","115.0","118.0"],"starts":["0.0"],"when":["0.0","26.2","52.2","63.0","72.5","74.0","82.0","92.6","94.0","104.0","113.6","115.0"],"i":["0.0","12.0","22.3","23.0","23.1","24.1","24.3","24.5","24.7","25.1","26.0","27.1","27.3","47.0","52.0","53.1","54.3","55.0","55.1","56.1","56.3","57.1","57.3","57.5","57.7","88.0","110.0"],"formatted":["0.0","74.0","94.0","115.0"],"the":["0.0","5.0","7.0","10.0","12.0","13.0","15.2","15.5","21.0","23.2","23.3","23.6","24.0","24.1","24.2","24.3","24.7","24.9","24.10","26.1","26.2","27.0","27.1","27.2","27.3","38.2","45.1","45.5","45.6","50.0","51.0","52.1","52.2","55.2","55.3","55.6","56.0","56.1","56.2","56.3","57.0","57.1","57.2","57.3","57.7","57.9","57.10","62.1","63.0","66.0","67.0","68.0","69.0","70.0","70.1","70.2","71.0","72.1","72.3","72.4","72.5","73.0","74.0","75.0","76.0","77.0","80.46","81.2","82.0","85.0","86.0","87.0","88.0","89.0","89.1","89.2","90.0","91.0","92.1","92.3","92.5","92.6","93.0","94.0","95.0","96.0","97.1","97.2","97.3","98.0","99.0","102.28","103.2","104.0","107.0","108.0","109.0","110.0","111.0","111.1","111.2","112.0","113.1","113.3","113.5","113.6","114.0","115.0","116.0","117.1","117.2","117.3","118.0","119.0"],"site":["0.0","12.0"],"to":["0.0","9.0","12.0","15.2","15.3","15.4","15.6","22.0","22.1","22.2","22.3","23.0","23.1","23.2","23.4","23.5","23.6","24.0","24.1","24.2","24.5","24.6","24.7","25.0","25.2","26.0","26.1","26.2","26.3","27.0","27.2","27.4","45.3","50.0","52.0","52.1","52.2","52.3","53.0","53.2","54.0","54.1","54.2","54.3","55.0","55.1","55.2","55.4","55.5","55.6","56.0","56.2","56.4","57.0","57.1","57.2","57.5","57.6","57.7","59.0","62.0","62.2","62.3","63.0","66.0","68.0","69.0","70.0","70.2","72.0","72.1","72.3","72.5","73.0","74.0","76.0","78.0","80.17","80.33","80.46","81.0","81.3","81.4","82.0","87.0","88.0","89.0","89.2","90.0","92.1","92.3","92.4","92.6","93.0","94.0","95.0","97.0","97.3","98.0","100.0","102.15","102.28","103.0","103.3","103.4","104.0","107.0","109.0","110.0","111.0","111.2","113.1","113.3","113.4","113.6","114.0","115.0","117.0","117.3","118.0"],"be":["0.0","9.0","23.1","23.3","23.6","24.2","24.3","27.1","27.3","38.1","55.1","55.3","55.6","56.1","56.3","57.2","57.3","63.0","64.0","66.0","69.0","73.0","74.0","80.46","80.54","83.0","85.0","88.0","90.0","92.7","93.0","94.0","102.28","102.36","104.0","105.0","107.0","110.0","113.7","114.0","115.0"],"garden":["0.0","13.0","46.0"],"digital":["0.0","7.0","18.0","44.0","46.0"],"gardens":["0.0","7.0","13.0","18.0","44.0","45.4","46.0"],"if":["0.0","15.1","23.5","24.3","27.0","27.3","27.4","55.5","56.0","56.3","56.4","57.3","66.0","67.0","69.0","72.1","72.5","72.6","74.0","77.0","81.0","82.0","86.0","88.0","92.1","92.4","92.6","97.0","99.0","107.0","108.0","110.0","113.1","113.4","113.6","117.0","119.0"],"you":["0.0","15.2","22.1","22.2","23.2","23.5","24.1","24.7","26.2","27.0","27.2","27.3","27.4","52.2","54.1","54.2","55.2","55.5","56.0","56.2","56.3","56.4","57.1","57.7","62.0","63.0","64.0","66.0","68.0","69.0","70.2","72.1","72.3","72.6","73.0","74.0","75.0","76.0","80.25","80.34","81.0","82.0","83.0","87.0","88.0","89.2","90.0","92.1","92.3","92.7","93.0","94.0","96.0","97.0","98.0","102.7","102.16","103.0","104.0","105.0","107.0","109.0","110.0","111.2","113.1","113.3","113.7","114.0","115.0","116.0","117.0","118.0"],"like":["0.0","12.0","22.3","23.0","23.1","23.2","24.1","26.3","52.3","54.3","55.0","55.1","55.2","57.1","64.0","69.0","72.3","74.0","83.0","88.0","92.3","94.0","105.0","110.0","113.3","115.0"],"look":["0.0","26.1","52.1"],"further":["0.0"],"into":["0.0","24.0","57.0","69.0","88.0","110.0"],"s":["0.0","23.1","23.5","24.0","24.6","25.1","26.1","26.3","27.3","43.0","46.0","52.1","52.3","53.1","55.1","55.5","56.3","57.0","57.6","72.1","72.4","73.0","76.0","77.0","80.15","81.0","87.0","92.1","92.5","93.0","97.3","98.0","99.0","109.0","113.1","113.5","114.0","117.3","118.0","119.0"],"history":["0.0"],"check":["0.0"],"https":["0.0"],"code":["0.0","62.1","70.1","72.1","73.0","81.2","89.1","92.1","93.0","103.2","111.1","113.1","114.0"],"incremental":["0.0","2.0","22.3","23.1","23.2","23.3","23.4","23.5","24.1","24.2","24.5","24.6","24.8","24.9","24.10","25.0","27.0","27.3","35.1","37.0","40.0","53.0","54.3","55.1","55.2","55.3","55.4","55.5","56.0","56.3","57.1","57.2","57.5","57.6","57.8","57.9","57.10"],"social":["0.0","11.0","15.1","28.0"],"thepaperpilot":["0.0"],"pages":["0.0","22.2","54.2"],"commits":["0.0"],"branch":["0.0"],"master":["0.0"],"here":["0.0","2.0","12.0","69.0","73.0","76.0","79.0","88.0","92.2","93.0","98.0","101.0","110.0","113.2","114.0","118.0"],"article":["0.0","15.1"],"entry":["0.0"],"h2":["0.0"],"fix":["0.0"],"dead":["0.0"],"links":["0.0"],"pushed":["0.0"],"on":["0.0","12.0","22.2","22.3","23.6","24.3","24.7","27.3","54.2","54.3","55.6","56.3","57.3","57.7","67.0","69.0","70.2","72.3","72.4","72.5","81.0","86.0","88.0","89.2","90.0","92.3","92.5","92.6","108.0","110.0","111.2","113.5","113.6"],"time":["0.0","23.6","24.5","26.1","27.0","27.1","27.2","38.1","52.1","55.6","56.0","56.1","56.2","57.5","72.2","92.2","113.2"],"dt":["0.0"],"published":["0.0"],"06":["0.0"],"09":["0.0"],"content":["0.0","23.1","27.0","27.1","27.2","27.3","27.4","55.1","56.0","56.1","56.2","56.3","56.4","62.0","103.0"],"table":["0.0"],"thead":["0.0"],"tr":["0.0"],"th":["0.0"],"style":["0.0","27.3","56.3","69.0","88.0","110.0"],"align":["0.0"],"center":["0.0"],"page":["0.0","89.2","111.2"],"changes":["0.0","59.0","78.0","80.54","100.0","102.36"],"tbody":["0.0"],"td":["0.0"],"davey":["0.0","43.0","49.0"],"wreden":["0.0","10.0","43.0"],"span":["0.0"],"color":["0.0","88.0","97.3","117.3"],"a3be8c":["0.0"],"ivy":["0.0","10.0"],"road":["0.0","10.0","29.0"],"beginner":["0.0","10.0","43.0"],"guide":["0.0","23.1","25.2","43.0","53.2","55.1","81.0"],"wanderstop":["0.0"],"referenced":["1.0","3.0","6.0","7.0","8.0","9.0","10.0","11.0","12.0","13.0","14.0","15.0","16.0","17.0","18.0","21.0","28.0","29.0","30.0","31.0","32.0","33.0","36.0","37.0","40.0","41.0","42.0","44.0","45.0","46.0","48.0","50.0","51.0"],"tags":["2.0","3.0","4.0","5.0","12.0","14.0","20.0","30.0","38.0","39.0","43.0","47.0","49.0"],"my":["2.0","4.0","5.0","9.0","12.0","20.0","24.5","30.0","38.0","39.0","43.0","46.0","47.0","57.5"],"projects":["2.0","4.0","5.0","12.0","20.0","30.0","35.0","38.0","39.0","47.0"],"profectus":["2.0","30.0"],"play":["2.0","23.2","35.1","55.2","79.0","101.0"],"it":["2.0","12.0","22.2","23.1","23.5","24.1","24.2","24.3","24.6","26.1","26.3","27.1","27.2","46.0","52.1","52.3","54.2","55.1","55.5","56.1","56.2","57.1","57.2","57.3","57.6","62.0","64.0","72.1","72.5","73.0","81.0","83.0","88.0","92.1","92.6","93.0","103.0","105.0","113.1","113.6","114.0"],"an":["2.0","9.0","12.0","24.2","24.6","25.3","26.0","26.3","27.2","52.0","52.3","53.3","56.2","57.2","57.6","68.0","69.0","77.0","80.35","87.0","88.0","90.0","97.2","99.0","102.17","103.0","109.0","110.0","117.2","119.0"],"open":["2.0","9.0","70.2","89.2","111.2"],"source":["2.0","9.0","37.0"],"game":["2.0","12.0","22.2","23.2","23.5","24.1","24.2","24.10","26.1","26.2","27.2","27.3","52.1","52.2","54.2","55.2","55.5","56.2","56.3","57.1","57.2","57.10","61.0","81.0"],"made":["2.0","15.5","23.6","24.9","47.0","55.6","57.9"],"in":["2.0","15.5","23.1","23.2","24.3","24.10","27.0","27.1","27.2","27.3","38.1","47.0","55.1","55.2","56.0","56.1","56.2","56.3","57.3","57.10","62.0","63.0","64.0","67.0","69.0","70.2","71.0","72.1","72.2","72.5","73.0","75.0","77.0","81.0","82.0","83.0","86.0","88.0","89.2","90.0","91.0","92.1","92.6","93.0","96.0","97.3","99.0","103.0","104.0","105.0","108.0","110.0","111.2","112.0","113.1","113.6","114.0","116.0","117.3","119.0"],"by":["3.0","6.0","7.0","8.0","9.0","10.0","11.0","12.0","13.0","14.0","15.5","16.0","18.0","21.0","23.0","24.4","27.3","27.4","28.0","29.0","30.0","33.0","35.0","37.0","40.0","41.0","44.0","45.0","46.0","50.0","51.0","55.0","56.3","56.4","57.4","63.0","72.5","73.0","75.0","81.0","82.0","92.6","92.7","93.0","96.0","103.0","104.0","113.6","113.7","114.0","116.0"],"fediverse":["3.0","41.0"],"buds":["4.0","12.0"],"is":["4.0","12.0","23.0","23.1","23.2","23.6","24.1","24.2","24.4","24.6","25.0","26.0","26.1","27.0","27.1","27.2","27.3","45.3","46.0","47.0","52.0","52.1","53.0","55.0","55.1","55.2","55.6","56.0","56.1","56.2","56.3","57.1","57.2","57.4","57.6","59.0","62.0","65.0","66.0","67.0","68.0","69.0","72.0","72.1","72.3","72.4","72.5","73.0","77.0","78.0","84.0","85.0","86.0","87.0","88.0","92.0","92.1","92.3","92.4","92.5","92.6","93.0","95.0","97.1","97.2","99.0","100.0","103.0","106.0","107.0","108.0","109.0","110.0","113.0","113.1","113.3","113.4","113.5","113.6","114.0","117.1","117.2","119.0"],"tool":["4.0"],"for":["4.0","9.0","12.0","15.1","15.6","23.1","23.5","24.0","24.6","24.9","27.0","27.1","27.2","27.4","47.0","55.1","55.5","56.0","56.1","56.2","56.4","57.0","57.6","57.9","59.0","62.2","62.3","63.0","67.0","68.0","69.0","71.0","72.6","73.0","76.0","77.0","78.0","81.3","81.4","82.0","85.0","86.0","87.0","88.0","91.0","92.2","92.4","92.6","92.7","93.0","98.0","99.0","100.0","103.3","103.4","104.0","107.0","108.0","109.0","110.0","112.0","113.2","113.4","113.7","114.0","118.0","119.0"],"creating":["4.0","62.0","103.0"],"puppets":["4.0"],"and":["4.0","12.0","15.2","15.3","15.4","15.5","22.2","23.0","23.1","23.2","23.3","23.5","23.6","24.1","24.4","24.7","24.8","26.0","26.1","26.3","27.2","27.3","35.2","38.1","47.0","52.0","52.1","52.3","54.2","55.0","55.1","55.2","55.3","55.5","55.6","56.2","56.3","57.1","57.4","57.7","57.8","63.0","66.0","67.0","70.1","70.2","72.1","72.2","73.0","74.0","75.0","76.0","77.0","80.25","80.37","80.46","80.51","81.4","82.0","85.0","86.0","89.1","89.2","92.1","92.2","93.0","94.0","95.0","96.0","97.0","98.0","99.0","102.7","102.19","102.28","102.33","103.0","103.4","104.0","107.0","108.0","111.1","111.2","113.1","113.2","114.0","115.0","116.0","117.0","118.0","119.0"],"interacting":["4.0"],"citadel":["5.0"],"glue":["6.0"],"commune":["6.0","11.0","13.0","14.0","18.0","41.0","51.0"],"freeform":["7.0","21.0"],"vs":["7.0","18.0","19.0","24.1","57.1"],"dichotomy":["7.0"],"small":["7.0","21.0","44.0","45.0","45.1","45.5","45.6","50.0","80.33","102.15"],"federated":["9.0","15.2","28.0"],"identity":["9.0","14.0","28.0"],"fedi":["9.0","11.0","14.0","41.0","51.0"],"v2":["9.0","11.0","14.0","15.0","41.0","51.0"],"personal":["9.0","34.0","45.0","45.2","50.0"],"website":["9.0","34.0"],"webrings":["9.0"],"weird":["9.0","14.0"],"matrix":["9.0","11.0"],"web":["9.0","21.0","22.3","27.3","44.0","45.0","45.1","45.5","50.0","54.3","56.3"],"client":["9.0","15.6"],"built":["9.0"],"better":["9.0","24.1","57.1"],"communities":["9.0"],"media":["11.0","15.1","41.0"],"tagged":["11.0","35.0","40.0"],"atproto":["11.0","16.0"],"activitypub":["11.0"],"armor":["12.0"],"babble":["12.0"],"download":["12.0"],"that":["12.0","15.3","22.3","23.0","23.5","24.1","24.2","24.3","24.6","24.10","25.1","26.1","27.1","27.2","27.3","38.1","45.3","45.5","50.0","52.1","53.1","54.3","55.0","55.5","56.1","56.2","56.3","57.1","57.2","57.3","57.6","57.10","65.0","66.0","67.0","68.0","72.4","73.0","75.0","76.0","84.0","85.0","86.0","87.0","92.5","93.0","95.0","96.0","97.3","98.0","106.0","107.0","108.0","109.0","113.5","114.0","116.0","117.3","118.0"],"started":["12.0","62.1","70.0","76.0","81.0","81.2","89.0","98.0","103.2","111.0","118.0"],"development":["12.0","26.1","52.1"],"as":["12.0","15.2","15.3","24.1","24.2","24.3","24.6","24.7","24.8","26.1","27.3","38.2","52.1","56.3","57.1","57.2","57.3","57.6","57.7","57.8","67.0","71.0","72.1","81.4","86.0","87.0","91.0","92.1","95.0","97.2","108.0","112.0","113.1","117.2"],"semester":["12.0"],"long":["12.0","24.7","57.7"],"project":["12.0","38.1","70.2"],"team":["12.0"],"of":["12.0","23.2","23.3","23.5","23.6","24.0","24.1","24.2","24.4","24.6","24.7","24.8","24.9","24.10","25.0","26.0","26.2","27.0","27.3","27.4","50.0","52.0","52.2","53.0","55.2","55.3","55.5","55.6","56.0","56.3","56.4","57.0","57.1","57.2","57.4","57.6","57.7","57.8","57.9","57.10","60.0","62.1","63.0","66.0","67.0","68.0","69.0","72.0","72.1","72.2","72.3","73.0","75.0","77.0","80.34","80.40","80.46","81.1","81.2","82.0","85.0","86.0","87.0","88.0","90.0","92.1","92.2","92.3","92.7","93.0","96.0","97.1","97.3","99.0","102.16","102.22","102.28","103.1","103.2","104.0","107.0","108.0","109.0","110.0","113.1","113.2","113.3","113.7","114.0","116.0","117.1","117.3","119.0"],"nine":["12.0"],"producer":["12.0"],"creative":["12.0"],"director":["12.0"],"narrative":["12.0"],"writer":["12.0"],"artist":["12.0"],"two":["12.0","68.0","87.0","109.0"],"programmers":["12.0"],"designers":["12.0"],"information":["12.0","15.2","64.0","81.4","83.0","105.0"],"about":["12.0","23.2","23.6","24.2","27.3","45.6","55.2","55.6","56.3","57.2"],"contributions":["12.0"],"lead":["12.0"],"programmer":["12.0","38.2"],"over":["12.0"],"because":["12.0","24.3","57.3","68.0","87.0","109.0"],"can":["12.0","15.2","23.0","24.0","26.3","27.2","27.3","38.1","41.0","52.3","55.0","56.2","56.3","57.0","62.0","63.0","64.0","66.0","68.0","69.0","72.1","72.2","72.6","74.0","75.0","80.34","80.46","80.54","82.0","83.0","85.0","86.0","87.0","88.0","92.1","92.2","92.7","94.0","95.0","96.0","97.3","102.16","102.28","102.36","103.0","104.0","105.0","107.0","108.0","109.0","110.0","113.1","113.2","113.7","115.0","116.0","117.3"],"show":["12.0","23.5","55.5","70.2","89.2","111.2"],"off":["12.0","80.46","102.28"],"stuff":["12.0"],"editor":["12.0"],"scripts":["12.0"],"wrote":["12.0"],"was":["12.0","72.5","92.6","113.6"],"doing":["12.0","23.2","55.2"],"everything":["12.0","22.3","23.0","54.3","55.0","72.5","73.0","80.54","92.6","93.0","102.36","113.6","114.0"],"from":["12.0","24.1","27.2","27.3","56.2","56.3","57.1","59.0","78.0","90.0","100.0"],"interface":["12.0"],"coding":["12.0"],"integrating":["12.0"],"course":["12.0"],"related":["12.0","24.11","57.11","92.4","113.4"],"gameplay":["12.0","27.3","56.3"],"itself":["12.0"],"date":["12.0"],"m":["12.0"],"still":["12.0","69.0","110.0"],"more":["12.0","23.2","23.5","27.3","55.2","55.5","56.3","64.0","68.0","69.0","72.0","83.0","87.0","88.0","92.0","92.2","105.0","109.0","110.0","113.0","113.2"],"up":["12.0","23.1","24.0","24.2","24.5","24.7","55.1","57.0","57.2","57.5","57.7","62.1","70.1","81.0","81.2","89.1","89.2","103.2","111.1","111.2"],"current":["12.0","67.0","72.3","77.0","85.0","86.0","92.3","99.0","108.0","113.3","119.0"],"state":["12.0"],"please":["12.0"],"visit":["12.0"],"official":["12.0"],"chronological":["13.0","19.0"],"cozy":["13.0","44.0"],"decentralized":["14.0","16.0","41.0"],"allow":["14.0"],"plan":["15.1"],"rethinking":["15.1"],"federation":["15.1"],"doesn":["15.1"],"t":["15.1","22.1","24.3","24.7","24.8","27.3","54.1","56.3","57.3","57.7","57.8","81.0"],"address":["15.1"],"many":["15.1","23.0","55.0","67.0","72.6","80.54","86.0","92.7","95.0","102.36","108.0","113.7"],"implementation":["15.1"],"details":["15.1"],"private":["15.2"],"public":["15.2","15.6"],"keys":["15.2"],"anyone":["15.2","26.0","52.0"],"create":["15.2","27.4","56.4","62.2","62.3","81.3","81.4","103.3","103.4"],"store":["15.2"],"how":["15.2","15.4","27.2","27.3","27.4","56.2","56.3","56.4","62.2","62.3","67.0","72.6","81.3","81.4","86.0","92.7","103.3","103.4","108.0","113.7"],"they":["15.2","15.5","23.6","24.0","24.8","24.10","27.3","55.6","56.3","57.0","57.8","57.10","63.0","68.0","74.0","80.9","82.0","85.0","87.0","90.0","94.0","95.0","97.3","104.0","109.0","115.0","117.3"],"want":["15.2","27.0","45.5","56.0","97.0","117.0"],"fully":["15.2","86.0","108.0"],"free":["15.2","95.0"],"with":["15.2","15.4","15.5","22.3","23.6","24.8","26.0","27.3","52.0","54.3","55.6","56.3","57.8","65.0","66.0","67.0","69.0","70.1","72.4","77.0","81.2","82.0","84.0","85.0","86.0","88.0","89.1","92.5","95.0","97.3","99.0","103.2","104.0","106.0","107.0","108.0","110.0","111.1","113.5","117.3","119.0"],"no":["15.2","15.6","24.2","27.3","56.3","57.2"],"server":["15.2"],"dependencies":["15.2"],"profile":["15.2"],"sent":["15.2"],"signed":["15.2"],"message":["15.2","15.5"],"through":["15.2","62.0","103.0"],"all":["15.2","15.6","24.3","57.3","72.1","72.2","73.0","90.0","92.1","92.2","92.7","113.1","113.2","113.7","114.0"],"relays":["15.2","15.3"],"would":["15.2"],"act":["15.3"],"merely":["15.3"],"storing":["15.3"],"messages":["15.3","15.5"],"sending":["15.3"],"them":["15.3","23.2","24.1","24.7","55.2","57.1","57.7","63.0","82.0","104.0"],"any":["15.3","27.0","27.3","56.0","56.3","67.0","68.0","77.0","86.0","87.0","99.0","108.0","109.0","119.0"],"clients":["15.3"],"or":["15.3","22.1","22.2","23.1","24.1","27.1","27.3","54.1","54.2","55.1","56.1","56.3","57.1","62.0","64.0","66.0","67.0","71.0","72.1","72.5","80.46","81.0","83.0","85.0","86.0","91.0","92.1","92.5","92.6","102.28","103.0","105.0","108.0","112.0","113.1","113.6"],"have":["15.3","15.5","22.1","23.2","23.4","23.5","24.8","27.4","54.1","55.2","55.4","55.5","56.4","57.8","72.2","76.0","80.40","86.0","88.0","90.0","92.2","95.0","97.0","98.0","102.22","108.0","110.0","113.2","117.0","118.0"],"subscribed":["15.3"],"may":["15.3","24.8","45.4","57.8"],"decide":["15.3"],"protocol":["15.4","45.3"],"should":["15.4","24.2","24.4","27.1","27.4","56.1","56.4","57.2","57.4","72.6","74.0","80.40","81.0","89.2","92.7","94.0","102.22","111.2","113.7","115.0"],"dictate":["15.4"],"convey":["15.4"],"text":["15.4","69.0","72.4","88.0","92.5","110.0","113.5"],"image":["15.4","92.5","95.0","113.5"],"audio":["15.4"],"video":["15.4","23.6","24.0","25.0","43.0","53.0","55.6","57.0"],"binary":["15.4"],"include":["15.4"],"reacting":["15.4"],"arbitrary":["15.4"],"general":["15.5"],"edits":["15.5"],"delete":["15.5"],"requests":["15.5"],"are":["15.5","15.6","22.1","22.2","22.3","23.2","23.5","23.6","24.0","24.1","24.2","24.8","24.10","24.11","26.1","27.2","45.5","50.0","52.1","54.1","54.2","54.3","55.2","55.5","55.6","56.2","57.0","57.1","57.2","57.8","57.10","57.11","59.0","63.0","64.0","66.0","68.0","69.0","71.0","72.2","74.0","75.0","76.0","77.0","78.0","80.9","80.37","80.46","82.0","83.0","85.0","86.0","87.0","88.0","90.0","91.0","94.0","95.0","96.0","97.3","98.0","99.0","100.0","102.19","102.28","104.0","105.0","107.0","108.0","109.0","110.0","112.0","115.0","116.0","117.3","118.0","119.0"],"replying":["15.5"],"specially":["15.5"],"flagged":["15.5"],"edit":["15.5","70.2","73.0","93.0","114.0"],"deletion":["15.5"],"ignored":["15.5"],"unless":["15.5"],"solve":["15.6"],"anonymity":["15.6"],"upvotes":["15.6"],"downvotes":["15.6"],"etc":["15.6","74.0","94.0","115.0"],"linked":["15.6"],"your":["15.6","22.2","26.2","27.1","52.2","54.2","56.1","62.1","69.0","70.2","73.0","76.0","81.0","81.2","88.0","89.2","93.0","98.0","103.2","110.0","111.2","114.0","118.0"],"key":["15.6"],"perhaps":["15.6"],"could":["15.6","23.3","24.3","45.3","55.3","57.3"],"generate":["15.6"],"new":["15.6","72.1","73.0","92.1","93.0","99.0","113.1","114.0"],"keypairs":["15.6"],"every":["15.6","23.2","55.2"],"action":["15.6"],"dev":["20.0"],"tree":["20.0","60.0","62.0","70.0","70.1","76.0","81.0","89.0","89.1","97.0","97.2","98.0","103.0","111.0","111.1","117.0","117.2","118.0"],"knowledge":["21.0","45.0","46.0"],"incrementals":["22.0","22.3","23.0","23.1","24.0","24.3","24.6","24.9","25.0","25.2","26.0","27.0","52.0","53.0","53.2","54.0","54.3","55.0","55.1","56.0","57.0","57.3","57.6","57.9"],"appeal":["22.0","23.0","23.2","23.3","54.0","55.0","55.2","55.3"],"developers":["22.0","27.4","54.0","56.4"],"easy":["22.1","22.2","23.2","54.1","54.2","55.2"],"make":["22.1","24.3","27.3","45.5","54.1","56.3","57.3","63.0","68.0","70.1","82.0","87.0","95.0","104.0","109.0"],"compared":["22.1","54.1"],"other":["22.1","24.2","26.1","50.0","52.1","54.1","57.2","64.0","72.1","83.0","85.0","92.7","95.0","105.0","113.7"],"genres":["22.1","24.0","24.2","24.10","24.11","54.1","57.0","57.2","57.10","57.11"],"quite":["22.1","54.1","90.0"],"low":["22.1","24.7","54.1","57.7"],"expectations":["22.1","24.0","54.1","57.0"],"don":["22.1","27.3","54.1","56.3"],"need":["22.1","54.1"],"fancy":["22.1","54.1"],"art":["22.1","23.6","54.1","55.6"],"music":["22.1","54.1"],"lay":["22.1","54.1"],"things":["22.1","27.3","54.1","56.3","65.0","66.0","68.0","69.0","71.0","73.0","84.0","85.0","87.0","88.0","91.0","93.0","95.0","106.0","107.0","109.0","110.0","112.0","114.0"],"out":["22.1","54.1"],"find":["22.2","23.1","24.1","27.0","54.2","55.1","56.0","57.1"],"once":["22.2","27.3","54.2","56.3"],"ve":["22.2","22.3","24.5","24.7","27.0","54.2","54.3","56.0","57.5","57.7"],"finished":["22.2","54.2"],"uploaded":["22.2","54.2"],"github":["22.2","54.2","70.1","76.0","81.2","89.1","98.0","103.2","111.1","118.0"],"itch":["22.2","54.2"],"just":["22.2","23.1","24.1","24.10","54.2","55.1","57.1","57.10","70.0","89.0","92.1","111.0","113.1"],"clarify":["22.3","54.3"],"said":["22.3","54.3"],"above":["22.3","54.3"],"mainly":["22.3","54.3"],"applies":["22.3","54.3"],"based":["22.3","23.6","47.0","54.3","55.6","72.3","90.0","92.3","113.3"],"games":["22.3","23.1","23.2","23.3","23.4","23.5","23.6","24.0","24.1","24.2","24.4","24.5","24.6","24.8","24.9","24.10","25.0","26.0","27.0","27.3","47.0","52.0","53.0","54.3","55.1","55.2","55.3","55.4","55.5","55.6","56.0","56.3","57.0","57.1","57.2","57.4","57.5","57.6","57.8","57.9","57.10"],"also":["22.3","54.3","72.1","80.51","92.1","92.7","95.0","96.0","102.33","113.1","113.7","116.0"],"incredibly":["22.3","27.2","54.3","56.2"],"popular":["22.3","24.4","54.3","57.4"],"mobile":["22.3","54.3"],"but":["22.3","23.1","23.2","24.1","24.2","24.3","27.1","27.2","27.3","54.3","55.1","55.2","56.1","56.2","56.3","57.1","57.2","57.3","63.0","69.0","72.5","88.0","90.0","92.6","97.3","104.0","110.0","113.6","117.3"],"players":["23.0","23.5","26.2","27.0","27.3","52.2","55.0","55.5","56.0","56.3"],"something":["23.0","23.2","55.0","55.2","59.0","78.0","100.0"],"has":["23.0","23.5","24.1","55.0","55.5","57.1","67.0","77.0","82.0","85.0","86.0","99.0","107.0","108.0","119.0"],"been":["23.0","24.5","27.0","55.0","56.0","57.5"],"discussed":["23.0","55.0"],"analyzed":["23.0","55.0"],"people":["23.0","23.1","24.1","24.6","45.3","45.5","55.0","55.1","57.1","57.6"],"some":["23.0","23.1","24.10","27.3","55.0","55.1","56.3","57.10","63.0","74.0","81.4","82.0","90.0","94.0","104.0","115.0"],"extent":["23.0","55.0"],"feel":["23.0","23.2","26.3","52.3","55.0","55.2"],"going":["23.1","24.2","55.1","57.2"],"very":["23.1","55.1","65.0","84.0","106.0"],"common":["23.1","24.6","27.2","55.1","56.2","57.6"],"response":["23.1","55.1"],"why":["23.1","55.1"],"enjoy":["23.1","23.5","55.1","55.5"],"although":["23.1","55.1"],"not":["23.1","23.2","23.5","24.1","24.4","27.1","27.3","41.0","55.1","55.2","55.5","56.1","56.3","57.1","57.4","68.0","73.0","80.43","87.0","93.0","102.25","109.0","114.0"],"one":["23.1","27.0","55.1","56.0","67.0","68.0","72.2","72.5","75.0","86.0","87.0","92.2","92.6","96.0","108.0","109.0","113.2","113.6","116.0"],"compels":["23.1","55.1"],"me":["23.1","23.6","55.1","55.6"],"personally":["23.1","55.1"],"suspect":["23.1","55.1"],"might":["23.1","23.5","55.1","55.5"],"stand":["23.1","55.1"],"progression":["23.1","55.1"],"what":["23.1","24.3","25.1","27.0","53.1","55.1","56.0","57.3","73.0","76.0","93.0","98.0","114.0","118.0"],"reportedly":["23.1","55.1"],"do":["23.1","25.1","53.1","55.1","68.0","69.0","72.1","80.15","87.0","88.0","92.1","109.0","110.0","113.1"],"seeing":["23.1","55.1"],"big":["23.1","55.1","64.0","83.0","105.0"],"so":["23.2","23.5","24.6","55.2","55.5","57.6","72.1","90.0","92.1","113.1"],"lot":["23.2","26.0","52.0","55.2"],"even":["23.2","23.5","24.1","55.2","55.5","57.1"],"progress":["23.2","55.2","64.0","80.46","83.0","102.28","105.0"],"while":["23.2","23.5","24.6","38.1","55.2","55.5","57.6"],"re":["23.2","23.5","27.3","27.4","55.2","55.5","56.3","56.4","68.0","73.0","87.0","93.0","109.0","114.0"],"playing":["23.2","23.5","55.2","55.5"],"part":["23.2","55.2","97.1","117.1"],"being":["23.2","24.10","55.2","57.10"],"able":["23.2","55.2"],"making":["23.2","25.1","27.1","47.0","53.1","55.2","56.1","81.0","82.0","90.0","104.0"],"actually":["23.2","55.2"],"productive":["23.2","55.2"],"multitasking":["23.2","55.2"],"way":["23.2","24.2","24.4","45.3","55.2","57.2","57.4","62.0","64.0","83.0","90.0","96.0","103.0","105.0","116.0"],"sense":["23.2","55.2"],"fidget":["23.2","55.2"],"toy":["23.2","55.2"],"think":["23.2","23.6","27.1","55.2","55.6","56.1"],"hard":["23.2","55.2"],"actively":["23.2","55.2"],"click":["23.2","24.1","55.2","57.1","68.0","70.2","80.17","87.0","89.2","109.0","111.2"],"few":["23.2","55.2","90.0","95.0"],"buttons":["23.2","55.2","85.0","97.3","117.3"],"often":["23.2","24.2","55.2","57.2"],"paying":["23.2","55.2"],"attention":["23.2","55.2"],"considered":["23.3","55.3"],"subset":["23.3","55.3"],"inherit":["23.3","55.3"],"appeals":["23.3","55.3"],"includes":["23.3","55.3"],"feeling":["23.3","55.3"],"staleness":["23.4","55.4"],"tend":["23.4","23.5","55.4","55.5"],"paradigm":["23.4","24.6","55.4","57.6"],"design":["23.5","24.10","55.5","57.10"],"their":["23.5","23.6","45.2","55.5","55.6","66.0","67.0","77.0","82.0","85.0","86.0","88.0","90.0","99.0","107.0","108.0","119.0"],"plainly":["23.5","55.5"],"readily":["23.5","55.5"],"apparent":["23.5","55.5"],"looking":["23.5","55.5"],"different":["23.5","55.5","90.0","95.0"],"preferences":["23.5","55.5"],"types":["23.5","55.5","92.7","113.7"],"than":["23.5","55.5","72.5","92.6","113.6"],"others":["23.5","55.5"],"there":["23.5","24.2","24.10","45.5","55.5","57.2","57.10","68.0","87.0","95.0","103.0","109.0"],"underlying":["23.5","55.5"],"bad":["23.5","27.3","55.5","56.3"],"principles":["23.5","55.5"],"will":["23.5","27.3","55.5","56.3","63.0","65.0","70.2","71.0","73.0","84.0","89.2","91.0","93.0","104.0","106.0","111.2","112.0","114.0"],"merit":["23.6","55.6"],"vampire":["23.6","55.6"],"survivors":["23.6","55.6"],"back":["23.6","55.6","66.0","107.0"],"old":["23.6","55.6"],"arguments":["23.6","55.6"],"whether":["23.6","55.6"],"ought":["23.6","55.6"],"seems":["23.6","55.6"],"preoccupied":["23.6","55.6"],"attaching":["23.6","55.6"],"value":["23.6","24.6","24.7","24.8","55.6","57.6","57.7","57.8","72.1","92.1","113.1"],"solely":["23.6","27.1","55.6","56.1"],"mechanics":["23.6","24.3","55.6","57.3"],"depth":["23.6","55.6"],"thereof":["23.6","55.6"],"point":["23.6","24.6","27.3","27.4","55.6","56.3","56.4","57.6","77.0","80.15","99.0","119.0"],"arguing":["23.6","55.6"],"waste":["23.6","55.6"],"due":["23.6","24.6","55.6","57.6"],"defining":["24.0","24.4","57.0","57.4","81.0","88.0","95.0"],"genre":["24.0","24.1","24.4","25.0","53.0","57.0","57.1","57.4"],"placed":["24.0","57.0"],"variety":["24.0","57.0"],"reasons":["24.0","57.0"],"give":["24.0","57.0","63.0","74.0","82.0","94.0","104.0","115.0"],"mental":["24.0","57.0"],"shorthand":["24.0","57.0"],"set":["24.0","57.0","62.1","66.0","70.1","81.0","81.2","85.0","89.1","92.2","103.2","107.0","111.1"],"player":["24.0","27.3","56.3","57.0","63.0","66.0","67.0","72.1","74.0","77.0","82.0","85.0","86.0","88.0","92.1","94.0","99.0","104.0","107.0","108.0","110.0","113.1","115.0","119.0"],"help":["24.0","57.0","63.0","104.0"],"idlers":["24.1","57.1"],"clickers":["24.1","57.1"],"oftentimes":["24.1","57.1"],"refer":["24.1","57.1"],"idle":["24.1","57.1"],"clicker":["24.1","27.2","56.2","57.1"],"ll":["24.1","27.0","27.3","56.0","56.3","57.1"],"trend":["24.1","27.3","56.3","57.1"],"oxymoronic":["24.1","57.1"],"titles":["24.1","57.1"],"contain":["24.1","57.1"],"both":["24.1","27.3","56.3","57.1"],"terms":["24.1","57.1"],"umbrella":["24.1","57.1"],"term":["24.1","24.6","57.1","57.6"],"those":["24.1","57.1","68.0","87.0","109.0"],"fall":["24.1","57.1"],"under":["24.1","57.1"],"however":["24.1","26.3","27.2","52.3","56.2","57.1"],"argue":["24.1","27.3","56.3","57.1"],"only":["24.1","24.2","57.1","57.2","72.5","92.6","113.6"],"use":["24.1","24.2","45.3","57.1","57.2","66.0","68.0","69.0","72.3","74.0","87.0","90.0","92.3","94.0","95.0","109.0","110.0","113.3","115.0"],"calling":["24.1","57.1","103.0"],"wrong":["24.1","57.1"],"almost":["24.1","57.1"],"universally":["24.1","57.1"],"these":["24.1","24.8","24.10","27.2","45.4","45.5","50.0","56.2","57.1","57.8","57.10","68.0","87.0","90.0","92.7","109.0","113.7"],"used":["24.1","24.2","24.3","24.10","57.1","57.2","57.3","57.10","69.0","72.1","76.0","85.0","88.0","92.1","92.4","92.7","93.0","98.0","110.0","113.1","113.4","113.7","118.0"],"interchangeably":["24.1","57.1"],"same":["24.1","27.2","56.2","57.1","67.0","69.0","72.1","86.0","88.0","90.0","92.1","96.0","108.0","110.0","113.1","116.0"],"kind":["24.1","57.1","68.0","87.0","109.0"],"where":["24.1","24.2","26.2","27.3","52.2","56.3","57.1","57.2","73.0","93.0","114.0"],"start":["24.1","57.1","81.0"],"spamming":["24.1","57.1"],"eventually":["24.1","57.1"],"automate":["24.1","57.1"],"process":["24.1","57.1"],"frankly":["24.1","57.1"],"deserves":["24.1","57.1"],"neither":["24.1","57.1"],"title":["24.1","57.1","92.1","113.1"],"trended":["24.1","57.1"],"away":["24.1","57.1"],"ever":["24.1","57.1"],"requiring":["24.1","57.1"],"ngu":["24.2","57.2"],"another":["24.2","57.2","62.0","67.0","80.24","86.0","102.6","103.0","108.0"],"broad":["24.2","57.2"],"definition":["24.2","24.3","24.4","57.2","57.3","57.4","72.1","92.1","113.1"],"focus":["24.2","57.2"],"numbers":["24.2","57.2"],"proposes":["24.2","57.2"],"simply":["24.2","27.3","56.3","57.2"],"increasing":["24.2","57.2"],"means":["24.2","57.2"],"end":["24.2","57.2","95.0"],"uniquely":["24.2","57.2"],"care":["24.2","57.2"],"themselves":["24.2","57.2"],"put":["24.2","57.2"],"implies":["24.2","57.2"],"earlier":["24.3","24.7","57.3","57.7"],"mentioned":["24.3","57.3"],"reset":["24.3","57.3","66.0","72.1","72.5","72.6","92.1","92.6","107.0","113.1","113.6"],"shouldn":["24.3","57.3"],"berlin":["24.4","24.9","57.4","57.9"],"interpretation":["24.4","24.9","57.4","57.9"],"far":["24.4","57.4"],"most":["24.4","24.7","57.4","57.7","65.0","73.0","80.40","84.0","93.0","97.1","102.22","106.0","114.0","117.1"],"roguelikes":["24.4","57.4"],"which":["24.4","57.4","72.2","72.3","80.46","92.2","92.3","95.0","102.28","113.2","113.3"],"acknowledged":["24.4","57.4"],"diversity":["24.4","57.4"],"within":["24.4","57.4","69.0","110.0"],"argued":["24.4","57.4"],"canon":["24.5","57.5"],"alright":["24.5","57.5"],"get":["24.5","26.1","26.3","52.1","52.3","57.5","66.0","72.6","85.0","107.0"],"controversial":["24.5","27.1","27.3","56.1","56.3","57.5"],"til":["24.5","57.5"],"now":["24.5","27.3","56.3","57.5","72.6","80.34","80.47","80.54","102.16","102.29","102.36"],"trying":["24.5","24.6","57.5","57.6"],"best":["24.5","57.5"],"stay":["24.5","57.5"],"objective":["24.5","57.5"],"shift":["24.6","57.6","80.17"],"probably":["24.6","57.6"],"highest":["24.6","57.6"],"possible":["24.6","57.6"],"factor":["24.6","57.6"],"referred":["24.6","57.6"],"exhibit":["24.6","57.6"],"trait":["24.6","57.6"],"unfolding":["24.6","57.6"],"replace":["24.6","57.6"],"factors":["24.7","24.8","57.7","57.8"],"won":["24.7","57.7"],"take":["24.7","57.7"],"discuss":["24.7","57.7"],"already":["24.7","57.7"],"seen":["24.7","57.7"],"brought":["24.7","57.7"],"meaning":["24.8","57.8"],"aren":["24.8","57.8","81.0"],"strongly":["24.8","57.8"],"correlated":["24.8","57.8"],"none":["24.8","57.8","72.3","92.3","113.3"],"non":["24.8","27.1","56.1","57.8","93.0","97.3","114.0","117.3"],"roguelites":["24.9","57.9"],"having":["24.9","57.9"],"our":["24.9","57.9"],"variation":["24.9","57.9"],"we":["24.9","27.3","56.3","57.9","80.40","102.22"],"trends":["24.10","57.10"],"go":["24.10","27.3","56.3","57.10","97.3","117.3"],"beyond":["24.10","27.2","56.2","57.10"],"commonly":["24.10","57.10"],"mechanic":["24.10","57.10"],"such":["24.10","57.10","72.1","92.1","113.1"],"deeply":["24.10","57.10"],"affect":["24.10","57.10"],"rest":["24.10","57.10"],"cultivation":["24.11","57.11"],"rpgs":["24.11","57.11"],"comprehensive":["25.0","53.0","72.0","92.0","113.0"],"am":["25.1","53.1"],"good":["25.1","53.1","71.0","91.0","112.0"],"question":["25.1","53.1"],"authority":["25.1","53.1"],"navigating":["26.0","52.0"],"criticism":["26.0","26.1","52.0","52.1"],"developing":["26.0","52.0"],"fun":["26.0","52.0"],"exciting":["26.0","52.0"],"teaches":["26.0","52.0"],"wonderful":["26.0","52.0"],"skills":["26.0","52.0"],"enthusiastically":["26.0","52.0"],"encourage":["26.0","52.0"],"interest":["26.0","52.0"],"feedback":["26.1","26.2","26.3","52.1","52.2","52.3"],"skill":["26.1","52.1"],"takes":["26.1","52.1"],"practice":["26.1","52.1"],"truly":["26.1","52.1"],"great":["26.1","52.1"],"at":["26.1","38.2","52.1","70.0","75.0","80.15","89.0","95.0","96.0","111.0","116.0"],"constructive":["26.1","52.1"],"vital":["26.1","52.1"],"continually":["26.1","52.1"],"improving":["26.1","52.1"],"useful":["26.1","52.1","63.0","67.0","77.0","82.0","85.0","86.0","95.0","99.0","104.0","107.0","108.0","119.0"],"deciding":["26.2","52.2"],"share":["26.2","52.2"],"consider":["26.2","52.2"],"type":["26.2","52.2","72.3","72.6","92.3","92.7","113.3","113.7"],"anticipate":["26.2","52.2"],"getting":["26.2","27.3","52.2","56.3","62.1","76.0","81.0","81.2","98.0","103.2","118.0"],"negative":["26.3","52.3"],"naturally":["26.3","52.3"],"attack":["26.3","52.3"],"okay":["26.3","52.3"],"angry":["26.3","52.3"],"community":["27.0","56.0"],"amount":["27.0","56.0","66.0","72.3","80.15","85.0","87.0","92.3","95.0","107.0","113.3"],"quickly":["27.0","56.0"],"number":["27.0","56.0","63.0","82.0","104.0"],"thing":["27.0","27.2","27.3","56.0","56.2","56.3","68.0","87.0","109.0"],"fairly":["27.1","56.1"],"opinion":["27.1","56.1"],"spent":["27.1","56.1"],"waiting":["27.1","56.1"],"count":["27.1","56.1"],"towards":["27.1","56.1"],"including":["27.1","56.1"],"reading":["27.1","56.1"],"various":["27.1","45.2","56.1"],"effects":["27.1","27.3","56.1","56.3","67.0","77.0","82.0","85.0","86.0","99.0","107.0","108.0","119.0"],"decisions":["27.1","27.3","56.1","56.3"],"head":["27.1","38.1","56.1"],"rather":["27.1","56.1"],"purchases":["27.2","56.2","66.0","72.2","92.2","107.0","113.2"],"imagine":["27.2","56.2"],"entity":["27.2","56.2"],"purchase":["27.2","27.3","56.2","56.3"],"multiple":["27.2","56.2","66.0","85.0","107.0"],"times":["27.2","56.2","66.0","67.0","85.0","86.0","107.0","108.0"],"each":["27.2","50.0","56.2","69.0","110.0"],"performs":["27.2","56.2"],"higher":["27.2","56.2","72.5","92.6","113.6"],"cost":["27.2","56.2","72.3","99.0"],"buildings":["27.2","56.2"],"cookie":["27.2","56.2"],"units":["27.2","56.2"],"swarm":["27.2","56.2"],"sim":["27.2","56.2"],"ip":["27.2","56.2"],"ep":["27.2","56.2"],"multipliers":["27.2","56.2"],"antimatter":["27.2","56.2"],"dimensions":["27.2","56.2"],"much":["27.2","56.2","96.0","116.0"],"specific":["27.2","27.3","56.2","56.3"],"first":["27.2","56.2","71.0","72.4","91.0","92.5","112.0","113.5"],"does":["27.2","56.2","72.5","92.6","113.6"],"instructions":["27.3","56.3"],"along":["27.3","56.3"],"let":["27.3","56.3","64.0","70.2","83.0","89.2","105.0","111.2"],"talk":["27.3","56.3"],"linear":["27.3","56.3"],"circumstances":["27.3","56.3"],"adding":["27.3","56.3"],"difficulty":["27.3","56.3"],"abstract":["27.3","56.3"],"change":["27.3","56.3"],"expect":["27.3","56.3"],"decision":["27.3","56.3"],"sufficiently":["27.3","56.3"],"abstracts":["27.3","56.3"],"effect":["27.3","56.3","68.0","87.0","109.0"],"then":["27.3","56.3","70.2","89.2","111.2"],"longer":["27.3","56.3"],"engaging":["27.3","56.3"],"clicking":["27.3","56.3","80.26","102.8"],"become":["27.3","56.3"],"available":["27.3","56.3"],"isn":["27.3","56.3"],"necessarily":["27.3","56.3"],"plenty":["27.3","56.3"],"mind":["27.3","56.3","90.0"],"reach":["27.3","56.3"],"developer":["27.4","56.4"],"pretty":["27.4","56.4","63.0","104.0"],"decent":["27.4","56.4"],"idea":["27.4","56.4"],"v":["30.0"],"ecs":["30.0","47.0"],"advent":["35.0","35.1","37.0","40.0"],"planar":["35.1","40.0"],"pioneers":["35.1","39.0","40.0"],"speech":["38.0","38.2"],"original":["38.1"],"optispeech":["38.1"],"involves":["38.1","81.0"],"designing":["38.1"],"testing":["38.1"],"real":["38.1"],"tongue":["38.1"],"model":["38.1"],"viewed":["38.1"],"transparent":["38.1"],"subject":["38.1"],"work":["38.2"],"sole":["38.2"],"ut":["38.2"],"dallas":["38.2"],"kronos":["40.0"],"traditional":["41.0"],"favorite":["43.0"],"hub":["45.0","46.0"],"follow":["45.1"],"websites":["45.2","50.0"],"indieweb":["45.2"],"contains":["45.2","73.0","93.0","114.0"],"resources":["45.2"],"blocks":["45.2"],"microsub":["45.3"],"proposed":["45.3"],"support":["45.3"],"sites":["45.4"],"tools":["45.5","47.0"],"days":["45.5"],"videos":["45.6"],"collecting":["46.0"],"screenshot":["47.0"],"png":["47.0"],"pronounced":["47.0"],"vex":["47.0"],"vulkan":["47.0"],"engine":["47.0"],"highly":["47.0","80.46","102.28"],"moddable":["47.0"],"lua":["47.0"],"collection":["50.0"],"link":["50.0"],"format":["59.0","69.0","77.0","78.0","88.0","99.0","100.0","110.0","119.0"],"temp":["59.0","78.0","100.0"],"changed":["59.0","78.0","100.0"],"layer":["59.0","62.0","62.3","63.0","65.0","66.0","67.0","69.0","72.4","72.5","74.0","77.0","78.0","80.34","80.54","81.3","81.4","82.0","84.0","85.0","86.0","88.0","92.5","92.6","93.0","97.3","99.0","100.0","102.16","102.36","103.0","103.4","104.0","106.0","107.0","108.0","110.0","113.5","113.6","114.0","117.3","119.0"],"consistency":["59.0","78.0","100.0"],"challenges":["59.0","62.3","78.0","81.4","100.0","103.4"],"modding":["60.0","62.0","70.0","70.1","76.0","80.0","81.0","89.0","89.1","98.0","102.0","103.0","111.0","111.1","118.0"],"modified":["60.0"],"version":["60.0","61.5","68.0","87.0","109.0"],"prestige":["60.0","69.0","72.6","88.0","92.4","92.7","110.0","113.4","113.7"],"bump":["61.5"],"row":["61.8","63.0","72.5","82.0","92.6","104.0","113.6"],"cash":["61.10"],"main":["62.0","69.0","81.2","88.0","103.0","103.2","110.0"],"add":["62.0","72.0","103.0"],"layers":["62.0","72.1","80.46","92.1","92.4","92.6","96.0","97.3","102.28","103.0","113.1","113.4","116.0","117.3"],"either":["62.0","103.0"],"directly":["62.0","77.0","99.0","103.0","119.0"],"object":["62.0","95.0","103.0"],"layerssupportjs":["62.0"],"declare":["62.0","103.0"],"file":["62.0","72.2","89.2","103.0","111.2"],"own":["62.1","81.2","103.2"],"copy":["62.1","70.0","81.2","89.0","103.2","111.0"],"components":["62.2","62.3","81.3","81.4","90.0","103.3","103.4"],"upgrades":["62.2","72.1","72.2","81.3","88.0","92.1","92.2","103.3","113.1","113.2"],"awarded":["63.0","74.0","82.0","94.0","104.0","115.0"],"meet":["63.0","74.0","82.0","94.0","104.0","115.0"],"certain":["63.0","74.0","82.0","94.0","104.0","115.0"],"goal":["63.0","74.0","82.0","94.0","104.0","115.0"],"benefit":["63.0","74.0","82.0","94.0","104.0","115.0"],"currently":["63.0","104.0"],"basic":["63.0","73.0","77.0","81.0","93.0","99.0","104.0","114.0","119.0"],"additional":["63.0","65.0","84.0","104.0","106.0"],"features":["63.0","64.0","65.0","72.0","72.1","72.2","72.3","72.4","72.5","80.54","81.4","83.0","84.0","92.0","92.1","92.2","92.3","92.4","92.5","92.6","95.0","97.3","102.36","103.4","104.0","105.0","106.0","113.0","113.1","113.2","113.3","113.4","113.5","113.6","117.3"],"added":["63.0","80.5","80.9","80.10","80.15","80.20","80.25","80.27","80.29","80.33","80.35","80.38","80.46","80.50","80.51","102.2","102.7","102.9","102.11","102.15","102.17","102.20","102.28","102.32","102.33","102.38","104.0"],"later":["63.0","104.0"],"global":["63.0","82.0","104.0"],"putting":["63.0","82.0","104.0"],"side":["63.0","80.46","82.0","92.6","102.28","104.0"],"its":["63.0","70.0","72.3","82.0","87.0","89.0","92.3","104.0","111.0","113.3"],"instead":["63.0","82.0","90.0","97.3","104.0","117.3"],"functions":["63.0","67.0","77.0","81.0","82.0","85.0","86.0","99.0","104.0","107.0","108.0","119.0"],"display":["64.0","69.0","80.15","81.4","83.0","88.0","105.0","110.0"],"direct":["64.0","83.0","105.0"],"bar":["64.0","83.0","105.0"],"health":["64.0","83.0","105.0"],"capacity":["64.0","83.0","105.0"],"gague":["64.0"],"anything":["64.0","69.0","83.0","88.0","105.0","110.0"],"else":["64.0","83.0","105.0"],"defined":["64.0","83.0","97.2","97.3","105.0","117.2","117.3"],"js":["64.0","65.0","69.0","73.0","74.0","77.0","81.0","83.0","84.0","88.0","93.0","94.0","95.0","99.0","103.0","105.0","106.0","110.0","114.0","115.0","119.0"],"breakdown":["65.0","73.0","84.0","93.0","106.0","114.0"],"minimal":["65.0","84.0","106.0"],"require":["65.0","84.0","106.0"],"startdata":["65.0","84.0","106.0"],"return":["65.0","69.0","84.0","88.0","94.0","106.0","110.0","115.0"],"function":["65.0","66.0","69.0","75.0","84.0","88.0","92.4","96.0","99.0","106.0","107.0","110.0","113.4","116.0","119.0"],"returns":["65.0","67.0","72.6","77.0","84.0","85.0","86.0","92.7","99.0","106.0","108.0","113.7","119.0"],"default":["65.0","71.0","72.4","72.5","84.0","91.0","92.1","92.5","92.6","97.1","112.0","113.1","113.5","113.6","117.1"],"usually":["66.0","85.0","107.0"],"bought":["66.0","85.0","107.0"],"scaling":["66.0","85.0","107.0"],"costs":["66.0","72.2","85.0","92.2","107.0","113.2"],"respec":["66.0","107.0"],"currency":["66.0","72.2","72.3","92.2","92.3","107.0","113.2","113.3"],"buyable":["66.0","85.0","87.0","107.0","109.0"],"owned":["66.0","85.0","107.0"],"decimal":["66.0","85.0","99.0","107.0"],"getbuyableamt":["66.0"],"id":["66.0","67.0","72.4","73.0","74.0","77.0","81.0","82.0","85.0","86.0","92.5","93.0","97.1","99.0","107.0","108.0","113.5","114.0","117.1","119.0"],"setbuyableamt":["66.0"],"amt":["66.0"],"buyableeffect":["66.0","85.0"],"dealing":["67.0","77.0","82.0","85.0","86.0","99.0","104.0","107.0","108.0","119.0"],"implementing":["67.0","77.0","82.0","85.0","86.0","99.0","107.0","108.0","119.0"],"inchallenge":["67.0","86.0","108.0"],"determine":["67.0","74.0","77.0","82.0","86.0","92.4","93.0","99.0","108.0","113.4","119.0"],"given":["67.0","86.0","108.0"],"challenge":["67.0","86.0","108.0"],"counts":["67.0","86.0","108.0"],"haschallenge":["67.0","86.0","108.0"],"completed":["67.0","86.0","108.0"],"challengecompletions":["67.0","86.0","108.0"],"challeffect":["67.0"],"generalized":["68.0","87.0","109.0"],"buyables":["68.0","72.1","87.0","92.1","109.0","113.1"],"repeatedly":["68.0","87.0","109.0"],"bonus":["68.0","87.0","109.0"],"awful":["68.0","87.0","109.0"],"several":["68.0","87.0","109.0"],"differences":["68.0","87.0","109.0"],"between":["68.0","87.0","109.0"],"tab":["69.0","71.0","75.0","88.0","91.0","96.0","97.1","110.0","112.0","116.0","117.1"],"layouts":["69.0","88.0","110.0"],"note":["69.0","88.0","90.0","110.0"],"using":["69.0","70.0","76.0","88.0","89.0","98.0","110.0","111.0","118.0"],"subtabs":["69.0","80.51","88.0","102.33","110.0"],"tabformat":["69.0","88.0","110.0"],"differently":["69.0","88.0","110.0"],"see":["69.0","88.0","92.2","110.0","113.2"],"basically":["69.0","88.0","110.0"],"window":["69.0","88.0","110.0"],"especially":["69.0","88.0","110.0"],"combined":["69.0","88.0","110.0"],"feature":["69.0","88.0","110.0"],"array":["69.0","88.0","110.0"],"button":["69.0","88.0","110.0"],"melt":["69.0","88.0","110.0"],"points":["69.0","72.1","72.6","88.0","92.1","92.7","94.0","110.0","113.1","113.7","115.0"],"blank":["69.0","88.0","110.0"],"welcome":["70.0","89.0","111.0"],"simplest":["70.0","89.0","111.0"],"level":["70.0","89.0","111.0"],"requires":["70.0","89.0","111.0"],"install":["70.1","89.1","111.1"],"desktop":["70.1","76.0","81.2","89.1","98.0","103.2","111.1","118.0"],"visual":["70.1","89.1","111.1"],"studio":["70.1","89.1","111.1"],"repository":["70.2","89.2","111.2"],"finder":["70.2","89.2","111.2"],"right":["70.2","89.2","111.2"],"index":["70.2","89.2","111.2"],"html":["70.2","89.2","111.2"],"view":["70.2","75.0","89.2","96.0","111.2","116.0"],"test":["70.2","89.2","111.2"],"displaying":["71.0","80.43","91.0","102.25","112.0"],"lore":["71.0","91.0","112.0"],"story":["71.0","91.0","112.0"],"elements":["71.0","91.0","95.0","112.0"],"well":["71.0","91.0","112.0"],"explaining":["71.0","91.0","112.0"],"complicated":["71.0","91.0","112.0"],"layout":["71.0","91.0","112.0"],"infobox":["71.0","80.35","91.0","92.1","102.17","112.0","113.1"],"list":["72.0","92.0","92.2","113.0","113.2"],"established":["72.0"],"assigned":["72.1","92.1","113.1"],"automagically":["72.1","92.1","113.1"],"similar":["72.1","90.0","92.1","113.1"],"access":["72.1","92.1","113.1"],"save":["72.1"],"makes":["72.1","92.1","113.1"],"copying":["72.1","92.1","113.1"],"easier":["72.1","90.0","92.1","113.1"],"optional":["72.1","72.2","72.3","72.4","72.5","85.0","92.1","92.2","92.3","92.5","92.6","97.3","113.1","113.2","113.3","113.5","113.6","117.3"],"confirmations":["72.1","92.1","113.1"],"maybe":["72.1"],"places":["72.1"],"grid":["72.2","113.2"],"unique":["72.2","92.2","93.0","113.2"],"upgrade":["72.2","77.0","92.2","99.0","113.2","119.0"],"conditions":["72.2","86.0","92.2","108.0","113.2"],"bonuses":["72.2","72.3","92.2","92.3","113.2","113.3"],"explanations":["72.2"],"separate":["72.2","75.0","96.0","116.0"],"milestones":["72.2","81.3","88.0","92.2","113.2"],"formula":["72.3","92.3","113.3"],"determines":["72.3","86.0","92.3","113.3"],"defaults":["72.3","92.3","95.0","113.3"],"normal":["72.3","90.0","92.3","113.3"],"gain":["72.3","77.0","92.3","99.0","113.3","119.0"],"independent":["72.3","92.3","113.3"],"before":["72.3","92.3","113.3"],"baseresource":["72.3","92.3"],"exponent":["72.3","92.3"],"static":["72.3","80.54","92.3","92.4","102.36","113.4"],"dependent":["72.3"],"node":["72.4","80.17","92.5","97.3","113.5","117.3"],"symbol":["72.4","92.5","113.5"],"appears":["72.4","92.5","113.5"],"doreset":["72.5","92.6","113.6"],"resettinglayer":["72.5","92.6","113.6"],"triggered":["72.5","92.6","113.6"],"greater":["72.5","92.6","113.6"],"equal":["72.5","82.0","92.6","104.0","113.6"],"behavior":["72.5","90.0","92.6","113.6"],"getresetgain":["72.6","92.7","113.7"],"data":["73.0","87.0","90.0","93.0","114.0"],"likely":["73.0","93.0","114.0"],"altered":["73.0","93.0","114.0"],"updates":["73.0","93.0","114.0"],"besides":["73.0","93.0","114.0"],"addition":["73.0","93.0","114.0"],"modinfo":["73.0","93.0","114.0"],"configuration":["73.0","93.0","114.0"],"string":["73.0","93.0","97.3","114.0","117.3"],"requirementdesc":["74.0"],"waffles":["74.0","94.0","115.0"],"hasmilestone":["74.0","94.0","115.0"],"microtabs":["75.0","96.0","116.0"],"sections":["75.0","96.0","116.0"],"selecting":["75.0","96.0","116.0"],"top":["75.0","96.0","116.0"],"smaller":["75.0","80.46","96.0","102.28","116.0"],"areas":["75.0","96.0","116.0"],"tutorial":["76.0","98.0","118.0"],"assumes":["76.0","98.0","118.0"],"vscode":["76.0","98.0","118.0"],"mod":["76.0","77.0","81.0","98.0","99.0","118.0","119.0"],"hasupgrade":["77.0","99.0","119.0"],"upgradeeffect":["77.0","99.0","119.0"],"buyupgrade":["77.0","99.0","119.0"],"buys":["77.0","99.0","119.0"],"affordable":["77.0","99.0","119.0"],"hint":["77.0","99.0","119.0"],"calculated":["77.0","99.0","119.0"],"getpointgen":["77.0","99.0","119.0"],"stored":["77.0","86.0","99.0","108.0","119.0"],"following":["77.0","81.0","99.0","108.0","119.0"],"particle":["80.5","95.0"],"grids":["80.9"],"setting":["80.10","81.0"],"dreams":["80.15"],"really":["80.15"],"come":["80.15","85.0"],"optimizations":["80.15"],"hopefully":["80.15"],"significant":["80.15"],"oom":["80.15"],"gen":["80.15"],"rationalized":["80.17"],"edition":["80.17","80.25","80.56","102.7","102.38"],"completely":["80.17","80.47","102.29"],"reworked":["80.17"],"tooltips":["80.17"],"force":["80.17"],"π":["80.18","80.19","102.1"],"incrementally":["80.19","102.1"],"updated":["80.19","102.1"],"cooler":["80.25","102.7"],"newer":["80.25","102.7"],"achievement":["80.25","80.46","102.7","102.28"],"milestone":["80.25","102.7"],"popups":["80.25","102.7"],"thank":["80.25","102.7"],"03":["80.26","102.8"],"double":["80.26","102.8"],"highlight":["80.33","102.15"],"uprooted":["80.34","102.16"],"embed":["80.34","96.0","102.16","116.0"],"inside":["80.34","96.0","102.16"],"component":["80.35","97.2","102.17","117.2"],"gainmult":["80.37","102.19"],"gainexp":["80.37","102.19"],"thought":["80.40","102.22"],"sooner":["80.40","102.22"],"moved":["80.40","102.22"],"fixed":["80.43","102.25"],"hotkeys":["80.43","102.25"],"pinnacle":["80.46","102.28"],"mountain":["80.46","102.28"],"bars":["80.46","81.4","102.28","103.4"],"customizable":["80.46","86.0","102.28","108.0"],"horizontal":["80.46","102.28"],"vertical":["80.46","102.28"],"displayed":["80.46","102.28"],"automated":["80.47","102.29"],"converttodecimal":["80.47","102.29"],"custom":["80.50","102.32"],"css":["80.50","102.32"],"tabception":["80.51","102.33"],"ception":["80.51","102.33"],"micro":["80.51","102.33"],"values":["80.54","102.36"],"enhanced":["80.56","102.38"],"mostly":["81.0","92.7","113.7"],"parameters":["81.0"],"objects":["81.0"],"info":["81.0","92.2","113.2"],"important":["81.0","97.1","117.1"],"ensure":["81.0"],"saving":["81.0"],"optionally":["82.0","104.0"],"hasachievement":["82.0"],"gauge":["83.0","105.0"],"addlayer":["84.0","97.3","103.0","106.0","117.3"],"respeccing":["85.0"],"selling":["85.0"],"among":["85.0"],"getbuyableamount":["85.0","107.0"],"setbuyableamount":["85.0","107.0"],"win":["86.0","108.0"],"maxedchallenge":["86.0"],"reached":["86.0"],"maximum":["86.0"],"completions":["86.0"],"challengeeffect":["86.0","108.0"],"saved":["87.0","92.1","109.0","113.1"],"pointy":["88.0","110.0"],"red":["88.0"],"font":["88.0"],"size":["88.0"],"32px":["88.0"],"family":["88.0"],"comic":["88.0"],"sans":["88.0"],"ms":["88.0"],"toggle":["88.0"],"c":["88.0"],"beep":["88.0"],"explorer":["89.2","111.2"],"folder":["89.2","111.2"],"browser":["89.2","111.2"],"group":["90.0"],"clickables":["90.0"],"gridables":["90.0"],"respects":["90.0"],"fundamentally":["90.0"],"tmt":["90.0"],"ways":["90.0"],"sure":["90.0"],"keep":["90.0"],"gridable":["90.0"],"ids":["90.0"],"base":["90.0"],"absent":["92.1","113.1"],"uses":["92.1","95.0","113.1"],"gained":["92.2"],"canbuymax":["92.4","113.4"],"sometimes":["92.4","113.4"],"required":["92.4","113.4"],"buying":["92.4","113.4"],"max":["92.4","113.4"],"letter":["92.5","113.5"],"capitalized":["92.5","113.5"],"override":["92.5","113.5"],"local":["92.5"],"always":["92.6"],"called":["92.6"],"requirementdescription":["94.0","115.0"],"effectdescription":["94.0","115.0"],"blah":["94.0","99.0","115.0"],"done":["94.0","115.0"],"w":["94.0","115.0"],"gte":["94.0","115.0"],"floating":["95.0"],"move":["95.0"],"behaviors":["95.0"],"interact":["95.0"],"mouse":["95.0"],"makeparticles":["95.0"],"explained":["95.0"],"below":["95.0"],"makeshinies":["95.0"],"creates":["95.0"],"stationary":["95.0"],"random":["95.0"],"location":["95.0"],"listed":["95.0"],"const":["95.0"],"myparticle":["95.0"],"options":["95.0"],"wheel":["95.0"],"customization":["97.0","117.0"],"containing":["97.1","117.1"],"starttab":["97.1","117.1"],"trees":["97.3","117.3"],"similarly":["97.3","117.3"],"addnode":["97.3","117.3"],"hex":["97.3","117.3"],"description":["99.0"],"layersupport":["103.0"],"register":["103.0"],"layername":["103.0"],"layerdata":["103.0"],"example":["103.0"],"registration":["103.0"],"showing":["103.0"],"recommended":["103.0"],"rows":["119.0"],"cols":["119.0"],"columns":["119.0"]},{"0":["65.0","83.0","84.0","105.0","106.0"],"1":["2.0","61.4","76.0","80.2","80.12","80.14","80.45","85.0","95.0","98.0","102.27","107.0","118.0"],"2":["80.1","80.12","80.23","89.1","89.2","95.0","102.5","111.1","111.2"],"3":["0.0","61.7","61.8","70.1","70.2","80.36","89.1","89.2","95.0","102.18","111.1","111.2"],"4":["80.42","102.24"],"7":["80.13"],"8":["95.0"],"9":["80.1","80.2","80.55","80.57"],"10":["61.8","80.42","80.45","80.49","102.24","102.27","102.31"],"11":["0.0","61.5","63.0","67.0","77.0","82.0","85.0","86.0","104.0","107.0","108.0"],"12":["80.7"],"14":["0.0"],"15":["80.44","102.26"],"20":["80.21","80.22","80.28","80.32","80.44","80.48","80.56","95.0","102.3","102.4","102.10","102.14","102.26","102.30"],"21":["80.3","80.4","80.6","80.7","80.11","80.13","80.18","80.19","102.1"],"22":["80.32","102.14"],"38":["0.0"],"48":["0.0"],"50":["83.0","105.0"],"72":["0.0"],"81":["0.0"],"100":["86.0","108.0","119.0"],"101":["90.0"],"102":["90.0"],"200":["83.0","105.0"],"201":["90.0"],"202":["90.0"],"560":["45.6"],"2020":["61.5","61.6","61.8","61.10"],"files":["0.0","62.0"],"changed":["0.0"],"insertions":["0.0"],"update":["0.0","76.0","98.0","118.0"],"small":["0.0","13.0","18.0","45.2","51.0"],"web":["0.0","7.0","13.0","18.0","45.6","51.0"],"there":["0.0","9.0","12.0","22.0","24.4","24.6","24.9","26.0","52.0","54.0","57.4","57.6","57.9","76.0","81.0","98.0","118.0"],"some":["0.0","12.0","24.5","27.4","56.4","57.5","62.3","80.18","80.54","88.0","102.36","103.4"],"new":["0.0","65.0","81.0","84.0","85.0","106.0","107.0","108.0","119.0"],"that":["0.0","7.0","9.0","15.2","15.5","21.0","23.1","23.2","23.3","23.6","24.4","24.7","24.9","27.4","55.1","55.2","55.3","55.6","56.4","57.4","57.7","57.9","60.0","64.0","70.2","74.0","77.0","81.0","83.0","88.0","90.0","92.4","94.0","99.0","105.0","113.4","115.0","119.0"],"are":["0.0","9.0","12.0","13.0","15.3","15.4","22.0","23.0","23.3","24.4","24.6","24.7","26.0","27.3","27.4","45.2","47.0","52.0","54.0","55.0","55.3","56.3","56.4","57.4","57.6","57.7","62.0","67.0","80.52","81.4","102.34","103.4"],"not":["0.0","12.0","15.1","23.0","23.6","24.7","24.8","46.0","55.0","55.6","57.7","57.8","64.0","66.0","72.1","72.3","80.5","80.15","83.0","90.0","92.1","105.0","113.1"],"quite":["0.0"],"ready":["0.0"],"yet":["0.0"],"so":["0.0","24.0","27.0","27.1","56.0","56.1","57.0"],"left":["0.0","64.0","83.0","97.0","97.1","105.0","117.0","117.1"],"those":["0.0","23.0","23.5","27.3","55.0","55.5","56.3"],"out":["0.0","9.0","26.0","27.3","52.0","56.3","103.0"],"file":["0.0"],"deletions":["0.0"],"fedi":["0.0"],"v2":["0.0"],"05":["0.0"],"activitypub":["0.0"],"advent":["0.0"],"atproto":["0.0"],"by":["1.0","2.0","4.0","15.0","17.0","24.0","24.1","24.10","31.0","32.0","34.0","36.0","42.0","43.0","48.0","57.0","57.1","57.10","72.4","80.46","92.5","97.3","102.28","117.3"],"fediverse":["1.0","11.0","36.0"],"over":["2.0","27.2","27.3","56.2","56.3"],"the":["2.0","3.0","4.0","6.0","15.1","15.4","18.0","22.1","22.2","22.3","23.0","23.1","23.4","23.5","25.0","25.1","25.2","26.3","45.2","47.0","52.3","53.0","53.1","53.2","54.1","54.2","54.3","55.0","55.1","55.4","55.5","59.0","64.0","65.0","72.2","78.0","79.0","80.9","80.15","80.20","80.22","80.24","80.25","80.26","80.29","80.34","80.40","80.43","83.0","84.0","92.2","92.4","97.0","100.0","101.0","102.2","102.4","102.6","102.7","102.8","102.11","102.16","102.22","102.25","105.0","106.0","113.2","113.4","117.0"],"course":["2.0","23.2","55.2"],"of":["2.0","5.0","7.0","11.0","13.0","15.5","22.0","22.1","22.2","23.0","23.1","24.3","24.5","24.11","27.1","27.2","38.1","43.0","44.0","46.0","47.0","54.0","54.1","54.2","55.0","55.1","56.1","56.2","57.3","57.5","57.11","59.0","70.0","71.0","72.4","78.0","80.9","80.11","80.16","81.0","89.0","91.0","92.0","92.5","92.6","95.0","97.2","100.0","103.0","111.0","112.0","113.0","113.5","117.2"],"month":["2.0"],"myself":["2.0"],"and":["2.0","15.6","22.1","22.3","24.0","24.2","24.5","24.11","25.0","26.2","27.0","27.1","30.0","45.3","52.2","53.0","54.1","54.3","56.0","56.1","57.0","57.2","57.5","57.11","62.0","69.0","72.3","72.4","72.5","80.17","80.29","80.30","80.33","80.50","81.0","87.0","88.0","90.0","92.6","102.11","102.12","102.15","102.32","109.0","110.0","113.6"],"other":["2.0","12.0","23.5","24.0","27.3","27.4","35.2","45.1","55.5","56.3","56.4","57.0","71.0","72.0","73.0","91.0","93.0","96.0","112.0","114.0","116.0"],"devs":["2.0"],"i":["2.0","4.0","23.5","23.6","27.2","27.4","30.0","38.0","46.0","55.5","55.6","56.2","56.4","69.0"],"know":["2.0"],"decentralized":["3.0","15.2"],"at":["3.0","12.0","23.1","23.2","23.3","55.1","55.2","55.3","70.2","71.0","72.3","76.0","77.0","82.0","85.0","89.2","91.0","92.3","97.1","98.0","99.0","103.0","111.2","112.0","117.1","118.0","119.0"],"protocol":["3.0"],"is":["3.0","7.0","15.1","24.5","26.3","40.0","44.0","51.0","52.3","57.5","60.0","64.0","75.0","80.15","80.25","80.37","81.0","82.0","83.0","96.0","97.3","102.7","102.19","104.0","105.0","116.0","117.3"],"with":["4.0","11.0","12.0","23.0","23.5","24.3","24.6","27.1","38.1","47.0","55.0","55.5","56.1","57.3","57.6","59.0","62.1","63.0","78.0","87.0","90.0","100.0","109.0"],"controlled":["4.0"],"others":["4.0"],"on":["4.0","14.0","23.0","24.1","24.4","27.0","46.0","50.0","55.0","56.0","57.1","57.4","66.0","68.0","70.1","73.0","80.33","80.37","87.0","89.1","93.0","95.0","97.0","97.1","97.3","102.15","102.19","109.0","111.1","113.3","114.0","117.0","117.1","117.3"],"shared":["4.0"],"stage":["4.0"],"note":["4.0","27.3","56.3"],"need":["4.0","24.7","57.7","72.1","86.0","103.0","108.0"],"to":["4.0","7.0","15.1","15.5","21.0","23.3","24.4","24.9","24.10","25.1","27.1","27.3","38.2","45.0","45.2","45.4","53.1","55.3","56.1","56.3","57.4","57.9","57.10","60.0","62.1","64.0","65.0","70.1","72.6","80.10","80.15","80.16","80.24","80.25","80.26","80.35","80.40","80.47","80.51","81.2","84.0","86.0","92.0","92.7","97.1","99.0","102.6","102.7","102.8","102.17","102.22","102.29","102.33","103.2","106.0","108.0","113.0","113.7","117.1"],"move":["4.0"],"a":["5.0","7.0","14.0","15.4","18.0","21.0","22.0","22.1","22.3","23.0","23.4","24.3","24.4","24.5","24.7","24.8","45.0","54.0","54.1","54.3","55.0","55.4","57.3","57.4","57.5","57.7","57.8","72.1","76.0","77.0","80.9","80.20","80.21","80.26","80.46","80.53","89.1","89.2","92.1","92.4","92.5","98.0","99.0","102.2","102.3","102.8","102.28","102.35","111.1","111.2","113.1","113.4","118.0","119.0"],"3d":["5.0"],"vr":["5.0"],"re":["5.0","22.2","23.3","24.8","27.1","27.2","54.2","55.3","56.1","56.2","57.8"],"envisioning":["5.0"],"my":["6.0","23.5","28.0","40.0","45.0","55.5"],"personal":["6.0","28.0"],"website":["6.0","28.0","45.0","79.0","101.0"],"collection":["7.0"],"information":["7.0","62.3","103.4"],"tied":["7.0","24.6","57.6"],"its":["7.0","15.3","23.6","24.0","24.4","55.6","57.0","57.4","68.0","72.4","80.17","90.0","92.5","109.0","113.5"],"creation":["7.0"],"incremental":["8.0","16.0","17.0","22.1","24.7","25.3","26.0","30.0","33.0","35.0","42.0","52.0","53.3","54.1","57.7"],"social":["8.0","15.0","16.0","33.0"],"than":["9.0","24.1","24.2","57.1","57.2","90.0","92.1","113.1"],"anything":["9.0","46.0","76.0","98.0","118.0"],"else":["9.0","24.1","57.1"],"currently":["9.0"],"in":["9.0","12.0","15.2","22.3","23.4","23.5","24.8","26.0","26.3","27.4","38.0","45.3","45.5","46.0","50.0","52.0","52.3","54.3","55.4","55.5","56.4","57.8","59.0","70.0","70.1","72.4","78.0","80.43","81.2","85.0","89.0","89.1","92.5","95.0","100.0","102.25","103.2","111.0","111.1","113.5"],"development":["9.0","26.0","52.0"],"exposes":["9.0"],"certain":["9.0","72.2","92.2","113.2"],"channels":["9.0"],"such":["9.0","12.0","15.6","24.2","57.2","72.5","92.6","113.6"],"they":["9.0","23.2","23.5","24.2","24.4","27.0","27.2","50.0","55.2","55.5","56.0","56.2","57.2","57.4","80.46","81.4","92.2","102.28","103.4"],"indexable":["9.0"],"will":["9.0","22.3","24.1","25.0","26.2","52.2","53.0","54.3","57.1","59.0","70.0","76.0","78.0","80.15","80.31","80.40","80.54","86.0","89.0","95.0","98.0","99.0","100.0","102.13","102.22","102.36","108.0","111.0","118.0","119.0"],"include":["9.0","92.6"],"features":["9.0","67.0","68.0","71.0","74.0","77.0","80.29","80.30","80.33","80.41","82.0","85.0","86.0","87.0","91.0","94.0","96.0","99.0","102.11","102.12","102.15","102.23","108.0","109.0","112.0","115.0","116.0","119.0"],"like":["9.0","23.3","23.5","55.3","55.5","63.0","66.0","71.0","75.0","82.0","85.0","90.0","91.0","92.6","96.0","102.38","104.0","107.0","112.0","116.0"],"chat":["9.0"],"glue":["9.0"],"s":["10.0","12.0","14.0","15.4","21.0","23.2","23.6","24.1","24.5","24.9","25.0","53.0","55.2","55.6","57.1","57.5","57.9","68.0","69.0","88.0","89.2","103.0","110.0","111.2"],"guide":["10.0","24.1","25.1","27.3","53.1","56.3","57.1"],"tagged":["10.0"],"federated":["11.0","45.3"],"identity":["11.0"],"nostr":["11.0"],"something":["11.0","97.0","117.0"],"no":["11.0"],"central":["11.0"],"source":["11.0","40.0"],"authority":["11.0"],"common":["11.0","24.2","57.2"],"build":["12.0"],"available":["12.0"],"created":["12.0","43.0","45.0"],"showing":["12.0","81.0"],"end":["12.0"],"has":["12.0","22.3","24.8","38.1","54.3","57.8","63.0","74.0","89.2","94.0","104.0","111.2","115.0"],"buttons":["12.0","80.9"],"present":["12.0"],"make":["12.0","23.2","23.5","55.2","55.5","80.51","89.1","92.1","92.2","102.33","111.1","113.1","113.2"],"easier":["12.0","60.0"],"skip":["12.0"],"parts":["12.0"],"see":["12.0","23.2","23.6","24.1","55.2","55.6","57.1","68.0","72.3","87.0","92.3","109.0"],"all":["12.0","22.2","23.2","24.7","27.3","43.0","50.0","54.2","55.2","56.3","57.7","80.43","93.0","95.0","102.25"],"content":["12.0","15.1","23.2","55.2","81.0","96.0","116.0"],"you":["12.0","15.5","23.1","23.3","26.1","27.1","52.1","55.1","55.3","56.1","65.0","70.0","70.1","72.0","72.5","80.6","80.26","80.33","80.35","80.43","80.47","80.51","80.52","80.54","84.0","86.0","89.0","89.1","92.0","92.4","92.6","99.0","102.8","102.15","102.17","102.25","102.29","102.33","102.34","102.36","106.0","108.0","111.0","111.1","113.0","113.4","113.6","119.0"],"start":["12.0","23.1","24.5","55.1","57.5","93.0","97.1","117.1"],"already":["12.0","23.0","24.0","55.0","57.0"],"shop":["12.0"],"button":["12.0","22.1","23.1","54.1","55.1","66.0","72.3","92.3","97.3","117.3"],"give":["12.0","66.0","90.0"],"yourself":["12.0","72.3","92.3"],"free":["12.0"],"money":["12.0"],"buy":["12.0","85.0","107.0"],"these":["12.0","15.3","23.0","23.2","24.2","24.7","27.1","55.0","55.2","56.1","57.2","57.7","67.0","72.5","77.0","82.0","86.0","88.0","92.6","95.0","99.0","108.0","110.0","113.6","119.0"],"duel":["12.0"],"force":["12.0"],"win":["12.0"],"or":["12.0","15.2","15.6","23.2","23.3","24.2","27.2","45.1","55.2","55.3","56.2","57.2","62.3","68.0","69.0","72.0","72.6","73.0","76.0","80.34","80.54","81.4","87.0","88.0","92.7","93.0","95.0","97.2","98.0","102.16","102.36","103.4","109.0","110.0","113.5","113.7","114.0","117.2","118.0"],"loss":["12.0"],"which":["12.0","22.2","47.0","54.2","68.0","69.0","80.4","80.9","80.10","80.20","80.39","80.53","80.54","80.56","87.0","88.0","102.2","102.21","102.35","102.36","102.38","109.0","110.0"],"be":["12.0","15.1","15.2","15.6","23.0","23.2","23.5","24.1","24.4","24.6","24.7","24.10","25.1","26.1","27.2","45.4","50.0","52.1","53.1","55.0","55.2","55.5","56.2","57.1","57.4","57.6","57.7","57.10","62.0","67.0","68.0","71.0","72.1","72.6","77.0","80.5","80.25","80.31","81.4","82.0","86.0","87.0","91.0","95.0","99.0","102.7","102.13","103.0","108.0","109.0","112.0","119.0"],"used":["12.0","15.2","24.4","26.1","27.2","52.1","56.2","57.4","72.2","73.0","80.5","80.46","92.2","102.28","113.2","114.0"],"tutorial":["12.0"],"recommended":["12.0","81.0"],"first":["12.0","20.0","67.0","69.0","77.0","80.22","82.0","86.0","88.0","99.0","102.4","102.39","103.0","104.0","108.0","110.0","119.0"],"time":["12.0","23.2","27.3","38.2","43.0","55.2","56.3","80.20","95.0","102.2"],"players":["12.0","23.6","55.6"],"dueling":["12.0"],"use":["12.0","45.2","62.0","67.0","77.0","80.10","86.0","88.0","92.1","99.0","103.0","108.0","113.1","119.0"],"abilities":["12.0"],"flip":["12.0"],"attack":["12.0"],"each":["12.0","15.4","24.7","57.7","59.0","63.0","67.0","75.0","77.0","78.0","82.0","86.0","95.0","96.0","100.0","104.0","108.0","116.0","119.0"],"puts":["12.0"],"chance":["12.0"],"into":["12.0","62.0","90.0"],"freeform":["13.0"],"collections":["13.0","47.0"],"for":["14.0","15.4","15.5","22.3","24.1","24.2","26.1","38.1","52.1","54.3","57.1","57.2","62.0","65.0","72.1","72.2","72.5","74.0","80.5","80.18","80.25","80.28","80.29","80.30","80.34","80.35","80.40","80.46","80.50","81.2","84.0","90.0","92.1","94.0","102.7","102.10","102.11","102.12","102.16","102.17","102.22","102.28","102.32","103.0","103.2","106.0","113.1","113.6","115.0"],"validating":["14.0"],"one":["14.0","45.3","80.15"],"without":["14.0"],"relying":["14.0"],"specific":["14.0","27.4","56.4"],"server":["15.1","73.0","93.0","114.0"],"relay":["15.1"],"can":["15.1","15.5","22.1","22.2","23.5","23.6","24.1","24.3","24.4","24.9","24.10","26.2","27.1","45.2","52.2","54.1","54.2","55.5","55.6","56.1","57.1","57.3","57.4","57.9","57.10","65.0","67.0","70.1","72.0","72.3","73.0","77.0","80.5","80.6","80.25","80.33","80.56","81.0","81.4","84.0","89.1","90.0","92.3","92.6","93.0","99.0","102.7","102.15","102.38","106.0","111.1","113.3","114.0","119.0"],"viewed":["15.1"],"anonymously":["15.1"],"how":["15.1","15.3","24.1","25.0","53.0","57.1","62.1","81.2","103.2"],"handle":["15.1","70.1","89.1","111.1"],"storing":["15.1"],"large":["15.1"],"amounts":["15.1"],"trust":["15.2"],"username":["15.2"],"petnames":["15.2"],"could":["15.2","23.6","55.6"],"display":["15.2","15.3","62.3","71.0","80.27","80.39","85.0","102.9","102.21","103.4","107.0"],"human":["15.2"],"readable":["15.2"],"names":["15.2","92.6","97.2","117.2"],"via":["15.2"],"contacts":["15.2"],"naming":["15.2"],"hubs":["15.2"],"most":["15.2","27.0","30.0","56.0"],"conversations":["15.2"],"online":["15.2","23.6","55.6"],"their":["15.2","24.6","57.6","63.0","68.0","87.0","104.0","109.0"],"name":["15.2","63.0","65.0","67.0","69.0","75.0","82.0","84.0","86.0","88.0","89.2","96.0","103.0","104.0","106.0","108.0","110.0","111.2","116.0"],"add":["15.2","65.0","72.1","73.0","81.0","84.0","85.0","92.0","92.1","93.0","106.0","113.0","113.1","114.0"],"them":["15.2","45.3","62.0","65.0","84.0","90.0","106.0"],"contact":["15.2"],"publicly":["15.3"],"received":["15.3"],"discovery":["15.3"],"would":["15.3","72.6","92.7","113.7"],"work":["15.3","23.2","38.1","47.0","55.2"],"different":["15.3","22.3","26.2","27.2","52.2","54.3","56.2"],"offer":["15.3"],"unique":["15.3","73.0","114.0"],"displays":["15.3","80.29","80.39","80.53","88.0","102.11","102.21","102.35"],"including":["15.4","80.41","102.23"],"url":["15.4","113.5"],"upvotes":["15.4"],"downvotes":["15.4"],"implemented":["15.4"],"this":["15.4","22.1","22.3","23.5","24.0","24.7","26.1","27.1","27.2","31.0","38.1","48.0","52.1","54.1","54.3","55.5","56.1","56.2","57.0","57.7","59.0","63.0","66.0","70.1","72.3","72.6","73.0","75.0","78.0","80.24","80.25","80.35","82.0","85.0","89.1","90.0","92.4","92.7","93.0","95.0","96.0","100.0","102.6","102.7","102.17","104.0","107.0","111.1","113.4","113.7","114.0","116.0"],"system":["15.4","47.0","80.5"],"message":["15.4"],"contains":["15.4"],"fields":["15.4"],"poster":["15.4"],"id":["15.4","63.0","72.1","87.0","90.0","92.1","94.0","95.0","97.3","103.0","104.0","113.1","115.0","117.3"],"public":["15.4","15.5"],"correct":["15.5"],"key":["15.5"],"signature":["15.5"],"parent":["15.5"],"form":["15.5","50.0"],"hierarchy":["15.5"],"permission":["15.5"],"if":["15.5","15.6","22.1","22.2","23.1","23.6","24.8","24.9","27.2","54.1","54.2","55.1","55.6","56.2","57.8","57.9","63.0","70.0","72.0","73.0","76.0","80.15","80.31","80.52","85.0","89.0","90.0","92.2","92.7","93.0","94.0","97.1","97.3","98.0","102.13","102.34","104.0","111.0","113.7","114.0","115.0","117.1","117.3","118.0"],"someone":["15.5","24.1","57.1"],"replies":["15.5"],"your":["15.5","23.2","27.4","41.0","55.2","56.4","65.0","66.0","70.0","70.1","72.3","72.6","84.0","89.0","89.1","92.3","92.7","103.0","106.0","111.0","111.1","113.3","113.7"],"send":["15.5"],"request":["15.5"],"but":["15.6","23.5","24.4","24.5","24.6","24.7","45.5","55.5","57.4","57.5","57.6","57.7","68.0","80.9","87.0","92.1","109.0","113.1"],"then":["15.6","23.6","55.6","62.0","72.5","92.6","113.6"],"it":["15.6","20.0","23.2","23.6","24.0","24.5","24.9","25.0","26.0","27.0","27.3","39.0","52.0","53.0","55.2","55.6","56.0","56.3","57.0","57.5","57.9","60.0","66.0","69.0","70.0","70.2","72.4","74.0","76.0","77.0","80.5","80.40","80.47","85.0","86.0","89.0","89.2","94.0","98.0","99.0","102.22","102.29","108.0","110.0","111.0","111.2","115.0","118.0","119.0"],"d":["15.6","27.4","56.4"],"hard":["15.6"],"determine":["15.6","24.9","24.10","57.9","57.10","63.0","72.5","73.0","92.6","94.0","104.0","113.6","114.0","115.0"],"an":["15.6","22.1","23.2","24.1","24.7","24.8","27.4","39.0","40.0","44.0","51.0","54.1","55.2","56.4","57.1","57.7","57.8","59.0","63.0","67.0","78.0","81.0","82.0","86.0","92.5","92.6","95.0","100.0","104.0","108.0","113.5"],"account":["15.6","70.1","89.1","111.1"],"was":["15.6","45.5"],"genuine":["15.6"],"user":["15.6"],"bot":["15.6"],"servers":["15.6"],"mbin":["16.0"],"weird":["16.0"],"tags":["16.0","28.0","40.0"],"chronological":["18.0"],"dichotomy":["18.0","19.0"],"garden":["18.0"],"rss":["18.0"],"referenced":["19.0","34.0"],"play":["20.0","22.2","39.0","54.2"],"here":["20.0","24.5","24.6","27.4","39.0","56.4","57.5","57.6","65.0","84.0","106.0"],"good":["20.0","23.3","55.3","62.0"],"hub":["21.0"],"theoretical":["21.0"],"alternative":["21.0"],"better":["21.0","23.5","55.5"],"lot":["22.0","23.0","24.3","54.0","55.0","57.3"],"nicely":["22.1","54.1"],"learn":["22.1","54.1"],"few":["22.1","54.1"],"lines":["22.1","54.1","70.2"],"code":["22.1","54.1","80.40","102.22"],"necessary":["22.1","54.1"],"number":["22.1","54.1","68.0","80.16","87.0","109.0"],"go":["22.1","54.1","70.1","90.0"],"up":["22.1","54.1","62.0","64.0","83.0","105.0"],"copied":["22.2","54.2"],"link":["22.2","54.2","73.0","93.0","114.0"],"using":["22.2","24.2","54.2","57.2","75.0","80.3","96.0","116.0"],"glitch":["22.2","54.2"],"replit":["22.2","54.2"],"do":["22.2","24.1","27.2","27.3","54.2","56.2","56.3","57.1","62.0","70.0","76.0","89.0","98.0","103.0","111.0","118.0"],"anyone":["22.2","54.2"],"now":["22.2","54.2","59.0","78.0","80.6","80.27","80.37","80.52","92.7","100.0","102.9","102.19","102.34","113.7"],"much":["22.3","23.0","27.0","54.3","55.0","56.0","60.0","75.0"],"culture":["22.3","54.3"],"community":["22.3","54.3"],"many":["22.3","24.1","24.6","26.0","52.0","54.3","57.1","57.6","70.0","80.16","89.0","111.0"],"gamers":["22.3","54.3"],"still":["22.3","27.1","54.3","56.1","60.0","80.38","102.20"],"participate":["22.3","54.3"],"focused":["22.3","54.3"],"said":["23.0","55.0"],"topic":["23.0","55.0"],"however":["23.0","23.5","23.6","26.0","27.4","52.0","55.0","55.5","55.6","56.4","70.0","89.0","111.0"],"analyses":["23.0","55.0"],"from":["23.0","23.1","38.1","45.1","55.0","55.1","64.0","72.3","92.3","113.3"],"perspective":["23.0","55.0"],"as":["23.0","23.1","23.2","27.0","55.0","55.1","55.2","56.0","59.0","62.0","62.3","64.0","68.0","78.0","83.0","100.0","103.0","103.4","105.0","109.0"],"experience":["23.0","23.5","24.1","55.0","55.5","57.1"],"involvement":["23.0","55.0"],"within":["23.0","24.10","55.0","57.10"],"must":["23.1","55.1"],"reiterate":["23.1","55.1"],"actual":["23.1","55.1"],"cause":["23.1","55.1"],"context":["23.1","55.1"],"though":["23.1","55.1","80.38","102.20"],"1e1000":["23.1","55.1"],"currency":["23.1","55.1","72.1","73.0","92.1","92.4","93.0","113.1","113.4","114.0"],"get":["23.1","26.0","27.1","45.3","52.0","55.1","56.1","80.46","87.0","92.7","102.28","113.7"],"1e1001":["23.1","55.1"],"isn":["23.1","23.5","27.4","55.1","55.5","56.4"],"t":["23.1","23.2","23.5","24.2","24.6","25.1","27.2","27.4","41.0","53.1","55.1","55.2","55.5","56.2","56.4","57.2","57.6","80.46","93.0","102.28"],"feel":["23.1","23.5","27.2","55.1","55.5","56.2"],"satisfying":["23.1","55.1"],"1e10":["23.1","55.1"],"1e100":["23.1","55.1"],"any":["23.1","23.6","24.4","55.1","55.6","57.4","63.0","72.1","76.0","82.0","85.0","92.1","98.0","104.0","107.0","113.1","118.0"],"case":["23.1","55.1"],"don":["23.1","23.5","24.2","27.2","55.1","55.5","56.2","57.2","80.46","93.0","102.28"],"think":["23.1","24.5","55.1","57.5"],"lecture":["23.2","55.2"],"studying":["23.2","55.2"],"working":["23.2","55.2"],"lend":["23.2","55.2"],"themselves":["23.2","26.1","52.1","55.2"],"played":["23.2","55.2"],"specifically":["23.2","55.2"],"idle":["23.2","55.2"],"take":["23.2","27.2","55.2","56.2"],"incredibly":["23.2","45.5","55.2"],"long":["23.2","24.1","55.2","57.1"],"amount":["23.2","55.2","59.0","68.0","78.0","92.1","100.0","109.0","113.1"],"stretching":["23.2","27.0","55.2","56.0"],"thin":["23.2","55.2"],"possible":["23.2","27.0","55.2","56.0"],"aren":["23.2","24.6","55.2","57.6"],"expecting":["23.2","55.2"],"sitting":["23.2","55.2"],"device":["23.2","55.2"],"entire":["23.2","55.2"],"expect":["23.2","55.2"],"leave":["23.2","55.2"],"come":["23.2","55.2"],"back":["23.2","26.3","45.5","52.3","55.2","70.1","80.25","102.7"],"later":["23.2","55.2","93.0"],"ve":["23.3","27.3","30.0","55.3","56.3"],"found":["23.3","55.3"],"solution":["23.3","55.3"],"puzzle":["23.3","55.3"],"learning":["23.3","55.3"],"more":["23.3","27.1","55.3","56.1","63.0","65.0","72.3","77.0","80.41","80.46","82.0","84.0","90.0","92.3","102.23","102.28","104.0","106.0"],"about":["23.3","23.5","24.4","55.3","55.5","57.4","80.47","102.29"],"game":["23.3","24.0","24.7","24.8","26.0","27.1","27.4","30.0","35.1","37.0","40.0","43.0","52.0","55.3","56.1","56.4","57.0","57.7","57.8","80.43","92.2","102.25"],"improving":["23.3","55.3"],"shifts":["23.4","24.6","55.4","57.6"],"where":["23.4","23.5","24.10","55.4","55.5","57.10","67.0","70.2","72.5","75.0","77.0","82.0","86.0","88.0","89.2","92.6","96.0","99.0","104.0","108.0","110.0","111.2","113.6","116.0","119.0"],"gameplay":["23.4","23.6","24.6","55.4","55.6","57.6"],"changes":["23.4","24.6","38.2","55.4","57.6","73.0","76.0","93.0","98.0","114.0","118.0"],"meaningful":["23.4","27.2","55.4","56.2"],"notice":["23.5","55.5"],"effects":["23.5","55.5","63.0","66.0","87.0","104.0"],"clear":["23.5","55.5"],"talking":["23.5","55.5"],"stuff":["23.5","55.5"],"big":["23.5","24.2","55.5","57.2","71.0","91.0","112.0"],"numbers":["23.5","24.8","55.5","57.8","92.1","113.1"],"being":["23.5","55.5","95.0"],"enjoyable":["23.5","55.5"],"comfortably":["23.5","55.5"],"agree":["23.5","55.5"],"disagree":["23.5","55.5"],"intrinsically":["23.5","55.5"],"m":["23.5","55.5"],"aware":["23.5","55.5"],"whom":["23.5","55.5"],"does":["23.5","24.3","24.7","55.5","57.3","57.7","72.3","73.0","93.0","114.0"],"won":["23.5","55.5"],"argue":["23.5","55.5"],"against":["23.5","26.1","27.2","52.1","55.5","56.2"],"feelings":["23.5","55.5"],"designer":["23.5","55.5"],"me":["23.5","55.5"],"lack":["23.6","55.6"],"even":["23.6","55.6"],"setting":["23.6","55.6","73.0","114.0"],"aside":["23.6","55.6"],"fact":["23.6","27.1","55.6","56.1"],"having":["23.6","24.2","24.10","55.6","57.2","57.10","66.0"],"fun":["23.6","55.6"],"wasted":["23.6","55.6"],"have":["23.6","25.1","26.2","27.0","27.2","46.0","52.2","53.1","55.6","56.0","56.2","63.0","67.0","68.0","69.0","72.0","72.1","73.0","77.0","80.47","82.0","87.0","92.1","93.0","99.0","102.29","104.0","109.0","113.1","114.0","119.0"],"supersedes":["23.6","55.6"],"necessity":["23.6","55.6"],"engaging":["23.6","55.6"],"deep":["23.6","55.6"],"consensus":["23.6","55.6"],"definitively":["23.6","55.6"],"although":["23.6","55.6"],"argument":["23.6","55.6","88.0","95.0"],"market":["24.0","57.0"],"itself":["24.0","57.0"],"similarities":["24.0","57.0"],"popular":["24.0","27.0","27.1","56.0","56.1","57.0"],"honestly":["24.0","57.0"],"people":["24.0","45.2","57.0"],"just":["24.0","27.0","56.0","57.0","62.0","69.0","72.1","81.0","88.0","92.4","103.0","110.0","113.4"],"love":["24.0","57.0"],"categorization":["24.0","57.0"],"own":["24.0","41.0","57.0","70.1","89.1","103.0","111.1"],"sake":["24.0","57.0"],"important":["24.0","57.0","73.0","114.0"],"define":["24.0","24.2","57.0","57.2","72.3","92.3","113.3"],"bad":["24.1","57.1"],"mechanic":["24.1","24.6","27.0","56.0","57.1","57.6"],"anyways":["24.1","57.1"],"while":["24.1","24.2","57.1","57.2","68.0","87.0","109.0"],"span":["24.1","57.1"],"spectrum":["24.1","27.3","56.3","57.1"],"active":["24.1","57.1"],"requires":["24.1","57.1","60.0"],"sorting":["24.1","41.0","57.1"],"metric":["24.1","57.1"],"useful":["24.1","27.2","45.4","56.2","57.1","87.0","109.0"],"looking":["24.1","57.1"],"particular":["24.1","57.1"],"borders":["24.1","57.1"],"when":["24.1","24.6","27.2","56.2","57.1","57.6","76.0","80.3","92.4","93.0","95.0","97.3","98.0","113.4","117.3","118.0"],"counts":["24.1","57.1"],"idler":["24.1","57.1"],"too":["24.1","24.6","27.2","27.3","56.2","56.3","57.1","57.6"],"blurry":["24.1","57.1"],"may":["24.1","57.1"],"great":["24.1","57.1"],"descriptive":["24.1","57.1"],"hence":["24.1","57.1"],"thousands":["24.1","57.1"],"words":["24.1","57.1"],"page":["24.1","24.7","57.1","57.7","68.0","87.0","109.0"],"defining":["24.1","25.0","25.2","53.0","53.2","57.1"],"what":["24.1","24.4","27.2","56.2","57.1","57.4","67.0","72.5","72.6","86.0","92.6","92.7","108.0","113.6","113.7"],"strictly":["24.1","57.1"],"always":["24.1","57.1","72.5","80.10","92.1","113.1","113.6"],"unless":["24.1","57.1"],"quoting":["24.1","57.1"],"typically":["24.1","24.6","57.1","57.6"],"narrative":["24.2","57.2"],"justification":["24.2","57.2"],"why":["24.2","25.0","53.0","57.2"],"shouldn":["24.2","57.2"],"because":["24.2","57.2","93.0"],"feels":["24.2","57.2"],"easy":["24.2","45.5","57.2"],"understand":["24.2","57.2"],"difficult":["24.2","57.2"],"formally":["24.2","57.2"],"phrases":["24.2","57.2"],"describe":["24.2","57.2"],"framework":["24.2","57.2"],"exaggerated":["24.2","57.2"],"sense":["24.2","24.3","57.2","57.3"],"progression":["24.2","24.3","27.3","56.3","57.2","57.3"],"terms":["24.2","57.2"],"vague":["24.2","57.2"],"described":["24.3","57.3"],"games":["24.3","24.11","26.1","27.1","52.1","56.1","57.3","57.11"],"strong":["24.3","24.7","57.3","57.7"],"often":["24.3","57.3","72.2","81.0","92.2","113.2"],"layers":["24.3","57.3","72.0","72.5","80.31","80.33","80.52","81.0","92.0","97.2","102.13","102.15","102.34","113.0","113.6","117.2"],"meta":["24.3","57.3"],"fit":["24.3","57.3"],"bill":["24.3","57.3"],"based":["24.4","27.3","56.3","57.4","72.5","92.6","95.0","113.6"],"ideals":["24.4","57.4"],"ought":["24.4","57.4"],"rather":["24.4","57.4","92.1","113.1"],"defined":["24.4","24.10","57.4","57.10","71.0","75.0","90.0","91.0","96.0","112.0","116.0"],"canon":["24.4","57.4"],"handful":["24.4","57.4"],"analytical":["24.5","57.5"],"making":["24.5","45.5","57.5","93.0"],"opinionated":["24.5","57.5"],"decisions":["24.5","57.5"],"list":["24.5","24.6","57.5","57.6","69.0","72.2","88.0","110.0"],"popularity":["24.6","57.6"],"refer":["24.6","57.6"],"significantly":["24.6","57.6"],"examples":["24.6","57.6","62.0"],"notably":["24.6","57.6"],"every":["24.6","57.6","80.46","102.28"],"single":["24.6","57.6","80.10"],"reset":["24.6","57.6","72.3","80.37","80.46","92.3","92.7","102.19","102.28","113.3","113.7"],"going":["24.6","57.6"],"reminder":["24.7","57.7"],"indicate":["24.7","57.7"],"possibility":["24.7","57.7"],"incrementals":["24.8","57.8"],"several":["24.8","57.8"],"only":["24.8","57.8","80.5","80.15","92.1"],"probably":["24.8","57.8"],"fast":["24.8","57.8"],"numeric":["24.8","57.8"],"growth":["24.8","57.8"],"compare":["24.9","57.9"],"enough":["24.9","57.9","80.15"],"overlap":["24.9","57.9"],"umbrella":["24.10","57.10"],"loops":["24.10","57.10"],"genre":["24.10","24.11","25.2","53.2","57.10","57.11"],"core":["24.10","57.10"],"related":["24.10","50.0","57.10"],"loop":["24.10","57.10"],"books":["24.11","57.11"],"anime":["24.11","57.11"],"explore":["25.0","53.0"],"appealing":["25.0","53.0"],"design":["25.0","47.0","53.0"],"haven":["25.1","53.1"],"made":["25.1","53.1","80.41","80.54","95.0","102.23","102.36"],"best":["25.1","26.3","52.3","53.1","92.6"],"try":["26.0","27.1","52.0","56.1"],"way":["26.0","52.0","70.0","75.0","81.0","89.0","111.0"],"started":["26.0","52.0"],"challenges":["26.0","52.0","72.2","92.2","113.2"],"young":["26.0","52.0"],"solely":["26.1","52.1"],"tool":["26.1","52.1"],"future":["26.1","52.1"],"say":["26.1","27.1","52.1","56.1"],"should":["26.1","52.1","63.0","66.0","67.0","77.0","82.0","85.0","86.0","97.1","99.0","104.0","107.0","108.0","117.1","119.0"],"never":["26.1","26.3","52.1","52.3","80.47","102.29"],"person":["26.1","52.1"],"insults":["26.1","52.1"],"towards":["26.1","52.1"],"developer":["26.1","52.1"],"okay":["26.1","52.1"],"kind":["26.2","52.2"],"receiving":["26.2","52.2"],"communities":["26.2","52.2"],"levels":["26.2","46.0","52.2"],"lashing":["26.3","52.3"],"appropriate":["26.3","52.3","90.0"],"response":["26.3","52.3"],"cool":["26.3","52.3"],"off":["26.3","52.3"],"irl":["26.3","52.3"],"keep":["26.3","27.0","52.3","56.0","72.5","92.6","113.6"],"mind":["26.3","52.3"],"tons":["27.0","56.0"],"introducing":["27.0","56.0"],"after":["27.0","56.0","72.3","92.3","113.3"],"condition":["27.1","56.1"],"met":["27.1","56.1"],"engage":["27.1","56.1"],"necessarily":["27.1","56.1"],"minimize":["27.1","56.1"],"plenty":["27.1","56.1"],"lead":["27.1","56.1"],"infrequent":["27.1","56.1"],"appeal":["27.1","56.1"],"diminishing":["27.2","56.2"],"returns":["27.2","56.2","63.0","74.0","82.0","88.0","94.0","97.3","104.0","107.0","115.0","117.3"],"oscillating":["27.2","56.2"],"between":["27.2","56.2"],"two":["27.2","56.2"],"lost":["27.2","56.2"],"automate":["27.2","56.2"],"away":["27.2","56.2"],"want":["27.2","56.2","72.0","72.5","76.0","80.40","92.6","98.0","102.22","113.6","118.0"],"harsh":["27.2","56.2"],"stance":["27.2","56.2"],"tools":["27.2","56.2"],"myriad":["27.2","56.2"],"interesting":["27.2","56.2"],"ways":["27.2","56.2","70.0","89.0","111.0"],"become":["27.2","56.2"],"stale":["27.2","56.2"],"less":["27.2","56.2"],"bother":["27.3","56.3"],"reading":["27.3","56.3"],"interactions":["27.3","56.3"],"truly":["27.3","56.3"],"unlike":["27.3","56.3"],"previous":["27.3","56.3"],"qualifiers":["27.3","56.3"],"mentioned":["27.3","56.3"],"qualifier":["27.3","56.3"],"therefore":["27.3","56.3","72.3"],"subjective":["27.3","56.3"],"complicated":["27.3","45.5","56.3"],"becomes":["27.3","56.3"],"likely":["27.3","56.3"],"disengage":["27.3","56.3"],"complicatedness":["27.3","56.3"],"leading":["27.3","56.3"],"disengaging":["27.3","56.3"],"also":["27.3","56.3","62.0","68.0","74.0","77.0","80.15","85.0","86.0","87.0","88.0","94.0","99.0","103.0","109.0","115.0","119.0"],"happen":["27.3","56.3"],"non":["27.3","35.2","56.3","80.34","102.16"],"finding":["27.3","56.3"],"optimal":["27.3","56.3"],"route":["27.3","56.3"],"consuming":["27.3","56.3"],"discover":["27.3","56.3"],"seek":["27.3","56.3"],"guides":["27.3","56.3"],"who":["27.3","56.3"],"completed":["27.3","56.3"],"second":["27.3","56.3","67.0","69.0","77.0","82.0","86.0","88.0","99.0","104.0","108.0","110.0","119.0"],"effectively":["27.3","45.3","56.3"],"linearly":["27.3","56.3"],"suggest":["27.4","56.4"],"upgrade":["27.4","56.4"],"simply":["27.4","56.4"],"unlocks":["27.4","56.4"],"another":["27.4","56.4","72.6","92.7","113.7"],"trivially":["27.4","56.4"],"webrings":["28.0","45.1"],"davey":["29.0"],"wreden":["29.0","49.0"],"wanderstop":["29.0"],"largest":["30.0"],"ambitious":["30.0"],"cinny":["32.0","37.0"],"babble":["35.0"],"buds":["35.0"],"capture":["35.0","35.1"],"dev":["35.1","61.0"],"tree":["35.1","80.0","80.34","97.1","102.0","102.16","117.1"],"dice":["35.1","37.0"],"armor":["35.1","37.0"],"commune":["37.0"],"forgejo":["37.0"],"college":["38.0"],"continued":["38.0"],"talks":["38.1"],"purposes":["38.1"],"treating":["38.1"],"speech":["38.1"],"errors":["38.1"],"teaching":["38.1"],"foreign":["38.1"],"language":["38.1"],"sounds":["38.1"],"been":["38.1"],"conducted":["38.1"],"partnership":["38.1"],"vulintus":["38.1"],"support":["38.1","80.34","102.16"],"production":["38.2"],"lab":["38.2"],"involved":["38.2"],"updating":["38.2","74.0","77.0","79.0","86.0","88.0","94.0","99.0","101.0","115.0","119.0"],"profectus":["39.0"],"projects":["40.0"],"open":["40.0","51.0"],"engine":["40.0"],"choose":["41.0"],"rules":["41.0"],"methods":["41.0"],"data":["41.0","65.0","68.0","69.0","72.1","84.0","88.0","92.1","106.0","109.0","110.0","113.1"],"queries":["41.0"],"etc":["41.0","63.0","64.0","67.0","71.0","77.0","82.0","83.0","85.0","86.0","91.0","95.0","96.0","99.0","104.0","105.0","108.0","112.0","119.0"],"overrun":["41.0"],"scams":["41.0"],"bar":["43.0","62.3","81.4","91.0","103.4","112.0"],"none":["43.0"],"extension":["44.0"],"websites":["45.0","45.5"],"individuals":["45.0"],"callback":["45.0"],"links":["45.1"],"standards":["45.2"],"help":["45.2","70.0","89.0","111.0"],"clients":["45.3"],"subscribe":["45.3"],"multiple":["45.3"],"feed":["45.3"],"occasionally":["45.4"],"day":["45.5"],"geocities":["45.5"],"pretty":["45.5"],"iframe":["45.6"],"width":["45.6","83.0","105.0"],"height":["45.6","83.0","105.0"],"thoughts":["46.0"],"varying":["46.0"],"completeness":["46.0"],"basically":["46.0"],"interest":["46.0"],"wikipedia":["46.0"],"centered":["47.0"],"around":["47.0"],"pattern":["47.0"],"stealing":["47.0"],"job":["47.0"],"works":["47.0","80.38","81.0","102.20"],"worlds":["47.0"],"systems":["47.0"],"renderers":["47.0"],"comes":["47.0"],"endorsing":["50.0"],"network":["50.0"],"sites":["50.0"],"readers":["50.0"],"might":["50.0","90.0"],"interested":["50.0"],"built":["50.0"],"saved":["59.0","68.0","78.0","100.0"],"object":["59.0","68.0","78.0","87.0","88.0","89.2","90.0","100.0","109.0","110.0","111.2"],"completions":["59.0","78.0","100.0"],"spot":["59.0","78.0","100.0"],"break":["59.0","76.0","78.0","80.54","98.0","100.0","102.36","118.0"],"saves":["59.0","78.0","93.0","100.0"],"effectdisplay":["59.0","78.0","100.0"],"mod":["60.0","62.1","70.2","80.40","81.2","89.2","102.22","103.0","103.2","111.2"],"version":["61.1","61.2","61.3","61.4"],"bump":["61.1","61.2","61.3"],"rebalanced":["61.1","61.3","61.10"],"08":["61.5"],"finished":["61.5"],"stylish":["61.6"],"row":["61.7","61.9","67.0","72.4","77.0","80.53","86.0","90.0","92.5","99.0","102.35","108.0","119.0"],"influx":["61.10"],"cash":["61.11"],"initial":["61.12"],"addlayer":["62.0","81.0"],"layername":["62.0","81.0"],"layerdata":["62.0","81.0"],"breaking":["62.0"],"things":["62.0","62.1","72.5","80.54","81.2","92.6","96.0","102.36","103.2","113.6","116.0"],"smaller":["62.0","68.0","80.51","87.0","102.33","109.0"],"existing":["62.0","88.0"],"freely":["62.0","72.0","103.0"],"deleted":["62.0","103.0"],"github":["62.1","70.2","89.2","111.2"],"desktop":["62.1","70.2","89.2","111.2"],"main":["62.1","72.1","73.0","75.0","80.26","81.0","84.0","92.1","93.0","96.0","102.8","113.1","114.0","116.0"],"info":["62.1","73.0","80.43","81.2","93.0","102.25","103.2","114.0"],"layer":["62.2","72.3","72.6","80.26","80.35","80.37","80.50","81.0","87.0","92.4","92.7","94.0","102.8","102.17","102.19","102.32","103.3","113.4","113.7","115.0"],"milestones":["62.2","69.0","72.5","92.6","103.3","110.0","113.6"],"bars":["62.3"],"progress":["62.3","81.4","103.4"],"gague":["62.3"],"dealing":["63.0","87.0","109.0"],"implementing":["63.0","87.0","104.0","109.0"],"hasachievement":["63.0","104.0"],"achievement":["63.0","82.0","104.0"],"achievementeffect":["63.0","82.0","104.0"],"current":["63.0","66.0","82.0","104.0","107.0"],"formatted":["63.0","66.0","82.0","85.0","104.0","107.0"],"js":["63.0","66.0","67.0","70.2","71.0","75.0","80.40","81.2","82.0","85.0","86.0","89.2","91.0","96.0","102.22","103.2","104.0","107.0","108.0","111.2","112.0","116.0"],"rows":["63.0","66.0","67.0","77.0","104.0","107.0","108.0"],"cols":["63.0","66.0","67.0","77.0","104.0","107.0","108.0"],"columns":["63.0","66.0","67.0","77.0","104.0","107.0","108.0"],"blah":["63.0","64.0","71.0","77.0","82.0","85.0","104.0","107.0","119.0"],"bigbar":["64.0","83.0","105.0"],"return":["64.0","71.0","72.1","83.0","85.0","86.0","91.0","92.1","95.0","105.0","107.0","112.0","113.1"],"direction":["64.0","83.0","105.0"],"down":["64.0","83.0","105.0"],"right":["64.0","70.0","83.0","89.0","105.0","111.0"],"strings":["64.0","83.0","105.0"],"determines":["64.0","72.4","83.0","92.5","105.0","113.5"],"filled":["64.0","83.0","105.0"],"progresses":["64.0","83.0","105.0"],"means":["64.0","90.0"],"unlocked":["65.0","72.1","84.0","92.1","106.0","113.1"],"false":["65.0"],"variables":["65.0","72.1","84.0","92.1","106.0","113.1"],"points":["65.0","73.0","84.0","85.0","86.0","92.6","93.0","106.0","107.0","114.0"],"decimal":["65.0","68.0","72.1","84.0","87.0","92.1","106.0","108.0","109.0","113.1","119.0"],"internal":["65.0","84.0","106.0"],"optional":["66.0","69.0","77.0","80.37","82.0","88.0","92.4","95.0","99.0","102.19","110.0","113.4","119.0"],"implement":["66.0","86.0","99.0","108.0"],"makes":["66.0","67.0","86.0","108.0"],"appear":["66.0"],"respectext":["66.0"],"text":["66.0","72.3","73.0","74.0","77.0","80.17","86.0","92.3","93.0","94.0","97.3","99.0","113.3","114.0","115.0","117.3","119.0"],"appears":["66.0"],"showrespecbutton":["66.0"],"determining":["66.0","72.1","92.1","113.1"],"whether":["66.0"],"show":["66.0","97.1","117.1"],"defaults":["66.0"],"true":["66.0","84.0","97.1","97.3","106.0","117.1","117.3"],"stored":["67.0"],"following":["67.0","86.0"],"format":["67.0","75.0","86.0","96.0","97.3","108.0","116.0","117.3"],"ouch":["67.0","86.0","108.0"],"digit":["67.0","77.0","82.0","86.0","99.0","104.0","108.0","119.0"],"column":["67.0","77.0","82.0","86.0","99.0","108.0","119.0"],"individual":["67.0","77.0","82.0","86.0","90.0","99.0","108.0","119.0"],"string":["67.0","68.0","74.0","86.0","87.0","94.0","108.0","109.0","115.0"],"function":["67.0","72.1","74.0","77.0","80.38","85.0","86.0","92.1","94.0","97.3","102.20","102.38","108.0","113.1","115.0","117.3"],"basic":["67.0","74.0","81.2","86.0","88.0","94.0","103.2","108.0","115.0"],"html":["67.0","74.0","86.0","88.0","94.0","99.0","108.0","115.0","119.0"],"challengedescription":["67.0","86.0","108.0"],"description":["67.0","77.0","86.0","108.0","119.0"],"buyable":["68.0"],"store":["68.0","87.0","109.0"],"state":["68.0","87.0","109.0"],"array":["68.0","87.0","92.6","97.2","109.0","117.2"],"extra":["68.0","87.0","109.0"],"default":["68.0","72.1","80.46","87.0","95.0","97.3","102.28","106.0","109.0","117.3"],"player":["69.0","72.2","92.2","97.3","113.2","117.3"],"pointy":["69.0"],"color":["69.0","110.0"],"red":["69.0","110.0"],"font":["69.0","77.0","85.0","99.0","110.0","119.0"],"size":["69.0","87.0","109.0","110.0"],"32px":["69.0","110.0"],"family":["69.0","110.0"],"comic":["69.0","110.0"],"sans":["69.0","110.0"],"ms":["69.0","110.0"],"toggle":["69.0","110.0"],"c":["69.0","110.0"],"beep":["69.0","110.0"],"upgrades":["69.0","110.0"],"components":["69.0","80.17","88.0","110.0"],"either":["69.0","88.0","110.0"],"arguments":["69.0","88.0","90.0","110.0"],"item":["69.0","88.0","110.0"],"component":["69.0","80.39","80.51","80.53","88.0","102.21","102.33","102.35","110.0"],"passed":["69.0","88.0","110.0"],"third":["69.0","88.0","110.0"],"applies":["69.0","88.0","110.0"],"css":["69.0","88.0","110.0"],"onto":["70.0","89.0","111.0"],"computer":["70.0","89.0","111.0"],"log":["70.1","89.1","111.1"],"browser":["70.1","89.1","111.1"],"vscode":["70.2","89.2","111.2"],"look":["70.2","76.0","89.2","90.0","98.0","111.2","118.0"],"top":["70.2","71.0","77.0","85.0","89.2","91.0","99.0","103.0","111.2","112.0","119.0"],"part":["70.2","89.2","111.2"],"says":["70.2"],"modinfo":["70.2","89.2","103.0","111.2"],"below":["70.2"],"change":["70.2","80.54","93.0","102.36"],"displayed":["71.0","73.0","77.0","80.17","82.0","85.0","91.0","93.0","99.0","112.0","114.0","119.0"],"very":["71.0","91.0","112.0"],"functions":["72.0","80.54","87.0","90.0","95.0","102.36","109.0"],"absent":["72.1"],"uses":["72.1","72.4"],"startdata":["72.1","92.1","113.1"],"nonstandard":["72.1"],"added":["72.1","80.4","80.17","80.21","80.28","80.30","80.34","80.39","80.40","80.48","80.53","80.56","102.3","102.10","102.12","102.16","102.21","102.22","102.30","102.35"],"converttodecimal":["72.1"],"well":["72.1"],"standard":["72.1","92.1","92.5","97.0","113.1","117.0"],"values":["72.1","80.15","92.1","113.1"],"required":["72.1","92.1","113.1"],"bool":["72.1","92.1","113.1"],"gained":["72.2","113.2"],"upon":["72.2","92.2","113.2"],"reaching":["72.2","92.2","113.2"],"thresholds":["72.2","92.2","113.2"],"resource":["72.2","80.27","80.39","92.2","102.9","102.21","113.2"],"automation":["72.2","92.2","113.2"],"qol":["72.2","92.2","113.2"],"enter":["72.2","92.2","113.2"],"total":["72.3","74.0","92.1","92.3","92.6","94.0","113.1","113.3","115.0"],"base":["72.3","92.3","103.0","113.3"],"x":["72.3","85.0","92.3","107.0","113.3"],"custom":["72.3","92.3","113.3"],"everything":["72.3","92.3","113.3"],"calculations":["72.3","92.3","113.3"],"bottom":["72.3","92.3"],"letter":["72.4"],"capitalized":["72.4","97.3","117.3"],"position":["72.4","92.5","113.5"],"horizontal":["72.4","81.4","92.5","113.5"],"called":["72.5","90.0","95.0","97.3","113.6","117.3"],"side":["72.5","113.6"],"nothing":["72.5","92.6","113.6"],"call":["72.5","72.6","92.6","92.7","113.6","113.7"],"resetlayerdata":["72.5"],"usetype":["72.6","92.7","113.7"],"static":["72.6","92.7","113.3","113.7"],"similar":["72.6","81.4","92.7","103.4","113.7"],"calculate":["72.6","92.7","113.7"],"gain":["72.6","92.4","92.7","113.4","113.7"],"under":["72.6","92.7","113.7"],"provided":["72.6"],"savefile":["73.0","93.0","114.0"],"location":["73.0","93.0","114.0"],"author":["73.0","93.0","114.0"],"tab":["73.0","80.10","80.15","80.25","80.34","80.51","93.0","102.7","102.16","102.33","114.0"],"pointsname":["73.0","93.0","114.0"],"instead":["73.0","93.0","114.0"],"affect":["73.0","93.0","114.0"],"discordname":["73.0","93.0","114.0"],"discordlink":["73.0","93.0","114.0"],"discord":["73.0","93.0","114.0"],"discussion":["73.0","93.0","114.0"],"place":["73.0","93.0","114.0"],"given":["74.0","75.0","94.0","96.0","115.0","116.0"],"milestone":["74.0","94.0","115.0"],"describing":["74.0","94.0","115.0"],"requirement":["74.0","94.0","115.0"],"unlocking":["74.0","80.37","94.0","102.19","115.0"],"suggestion":["74.0","94.0","115.0"],"effectdesc":["74.0"],"same":["75.0","80.9"],"element":["75.0","96.0","116.0"],"tabformat":["75.0","96.0","116.0"],"subtab":["75.0","80.34","80.51","96.0","102.16","102.33","116.0"],"tmt":["76.0","98.0","118.0"],"changelog":["76.0","80.25","98.0","102.7","118.0"],"warn":["76.0","98.0","118.0"],"require":["76.0","98.0","118.0"],"decide":["76.0","98.0","118.0"],"title":["77.0","85.0","91.0","99.0","112.0","119.0"],"larger":["77.0","85.0","99.0","119.0"],"fixed":["80.3","80.7","80.17","80.18","80.19","80.22","80.32","102.1","102.4","102.14"],"issue":["80.3"],"makeshinies":["80.4"],"creates":["80.4"],"grid":["80.9","90.0"],"behave":["80.9"],"mode":["80.10"],"directmult":["80.10"],"improved":["80.11"],"performance":["80.11","80.19","102.1"],"high":["80.15"],"thanks":["80.15","80.16"],"ducdat":["80.15"],"window":["80.15"],"wide":["80.15"],"holding":["80.15"],"minor":["80.16"],"fixes":["80.16"],"tooltip":["80.17"],"stay":["80.17"],"hopefully":["80.17"],"finally":["80.17"],"flickering":["80.17","80.24","102.6"],"input":["80.17"],"slider":["80.17"],"formatting":["80.18"],"improvements":["80.19","102.1"],"tooltips":["80.19","80.24","80.50","102.1","102.6","102.32"],"overlapping":["80.19","102.1"],"resettime":["80.20","102.2"],"tracks":["80.20","92.1","102.2","113.1"],"since":["80.20","102.2"],"node":["80.21","80.26","102.3","102.8"],"image":["80.21","102.3"],"attempt":["80.24","102.6"],"fix":["80.24","102.6"],"jacorb":["80.25","102.7"],"contribution":["80.25","80.35","102.7","102.17"],"set":["80.25","93.0","102.7","103.0"],"brings":["80.26","102.8"],"autoupgrade":["80.27","102.9"],"feature":["80.27","80.48","102.9","102.30"],"shows":["80.27","102.9"],"goaldescription":["80.28","102.10"],"overriding":["80.29","102.11"],"softcap":["80.30","102.12"],"softcappower":["80.30","102.12"],"highlighted":["80.31","80.52","102.13","102.34"],"meaningfully":["80.33","102.15"],"prestige":["80.33","80.41","92.1","102.15","102.23","113.1"],"passivegeneration":["80.33","102.15"],"autoprestige":["80.33","102.15"],"microtab":["80.34","102.16"],"hiding":["80.34","102.16"],"reformatting":["80.34","102.16"],"thank":["80.35","102.17"],"thepaperpilot":["80.35","102.17"],"type":["80.35","102.17"],"kept":["80.37","102.19"],"buyupgrade":["80.38","102.20"],"buyupg":["80.38","102.20"],"users":["80.40","102.22"],"edit":["80.40","89.2","102.22","111.2"],"documentation":["80.40","102.22"],"parameters":["80.41","102.23"],"supressing":["80.43","102.25"],"external":["80.43","102.25"],"branches":["80.44","102.26"],"global":["80.46","92.5","102.28","113.5"],"achievements":["80.46","102.28","109.0"],"statistics":["80.46","102.28"],"speaking":["80.46","102.28"],"clickables":["80.46","102.28"],"generalized":["80.46","102.28"],"variant":["80.46","102.28"],"buyables":["80.46","80.56","81.3","102.28","102.38"],"almost":["80.46","102.28"],"value":["80.46","95.0","102.28"],"worry":["80.47","102.29"],"midsection":["80.48","102.30"],"nodes":["80.50","102.32"],"let":["80.51","102.33"],"esque":["80.51","102.33"],"areas":["80.51","102.33"],"anywhere":["80.51","102.33"],"formats":["80.54","102.36"],"old":["80.54","102.36"],"properly":["81.0"],"beyond":["81.0","97.0","117.0"],"through":["81.0"],"creating":["81.0"],"calling":["81.0"],"example":["81.0"],"method":["81.0","103.0"],"contents":["81.1","103.1"],"rebuyable":["81.3"],"gauge":["81.4","103.4"],"highly":["81.4","103.4"],"customizable":["81.4"],"vertical":["81.4"],"usually":["82.0","86.0","99.0"],"cost":["85.0","92.3","107.0","113.3","119.0"],"mul":["85.0","107.0"],"canafford":["85.0","107.0"],"gte":["85.0","86.0","107.0"],"sub":["85.0"],"ouchie":["86.0","108.0"],"cancomplete":["86.0"],"elsewhere":["86.0","108.0"],"getclickablestate":["87.0"],"clickable":["87.0"],"keys":["88.0","110.0"],"attributes":["88.0","110.0"],"create":["88.0"],"raw":["88.0"],"project":["89.2","111.2"],"locally":["89.2","111.2"],"fill":["89.2","103.0","111.2"],"tiles":["90.0"],"individually":["90.0"],"properties":["90.0"],"directly":["90.0"],"associated":["90.0"],"appearance":["90.0"],"foo":["91.0","112.0"],"body":["91.0","112.0"],"established":["92.0","113.0"],"save":["92.1","113.1"],"sure":["92.1","93.0","113.1"],"normal":["92.1","113.1"],"tracked":["92.1","113.1"],"shown":["92.1"],"harder":["92.2"],"reach":["92.2"],"dependent":["92.3","113.3"],"permitted":["92.4","113.4"],"onprestige":["92.4","113.4"],"triggers":["92.4","113.4"],"prestiges":["92.4","113.4"],"before":["92.4","113.4"],"goes":["92.5","113.5"],"overrides":["92.5","113.5"],"layerdatareset":["92.6","113.6"],"erase":["93.0"],"png":["95.0"],"spread":["95.0"],"gravity":["95.0"],"speed":["95.0"],"randomize":["95.0"],"bit":["95.0"],"math":["95.0"],"constant":["95.0"],"assigned":["95.0"],"spawned":["95.0"],"distances":["95.0"],"pixels":["95.0"],"angles":["95.0"],"degrees":["95.0"],"showtree":["97.1","117.1"],"arrays":["97.2","117.2"],"symbol":["97.3","117.3"],"canclick":["97.3","117.3"],"click":["97.3","117.3"],"onclick":["97.3","117.3"],"clicked":["97.3","117.3"],"effect":["99.0","119.0"],"reference":["103.0"],"thing":["103.0"],"buyableeffect":["107.0"],"getbuyableamt":["107.0"],"goal":["108.0"],"baseresource":["113.3"],"exponent":["113.3"],"local":["113.5"],"inside":["116.0"]},{"0":["38.1","72.1","95.0"],"1":["80.8"],"2":["76.0","96.0","98.0","118.0"],"3":["61.9","76.0","98.0","118.0"],"4":["61.5","90.0"],"7":["80.12","80.14","80.49","102.31"],"10":["61.6","61.7","61.10","80.36","102.18"],"11":["61.3","66.0","87.0","109.0"],"12":["80.23","102.5"],"13":["80.23","102.5"],"15":["80.45","102.27"],"16":["80.42","102.24"],"18":["80.2"],"19":["61.10","80.1"],"20":["80.42","80.49","80.55","102.24","102.31"],"21":["61.8","80.14"],"22":["61.7"],"27":["80.57"],"30":["0.0","61.6","80.55"],"315":["38.1","45.6"],"560":["38.1"],"600":["38.1"],"2020":["61.1","61.3","61.7","61.9","61.11"],"8263":["23.1","55.1"],"babble":["0.0"],"buds":["0.0"],"capture":["0.0"],"citadel":["0.0","35.0","35.1"],"chat":["0.0"],"glue":["0.0"],"chronological":["0.0"],"cinny":["0.0"],"commune":["0.0","32.0","50.0"],"decentralized":["0.0","1.0","36.0"],"dice":["0.0","35.0"],"armor":["0.0","35.0"],"federated":["0.0","3.0","41.0"],"identity":["0.0","15.3","15.6"],"fediverse":["0.0"],"forgejo":["0.0"],"freeform":["0.0"],"vs":["0.0"],"dichotomy":["0.0"],"game":["0.0","23.6","24.4","24.5","24.6","24.9","25.0","39.0","47.0","53.0","55.6","57.4","57.5","57.6","57.9","62.0","72.2","73.0","80.37","92.6","97.1","102.19","113.2","117.1"],"dev":["0.0","37.0"],"tree":["0.0","37.0","40.0","61.0"],"tags":["1.0","29.0","36.0"],"games":["2.0","22.0","24.7","25.1","26.2","27.4","35.2","52.2","53.1","54.0","56.4","57.7"],"community":["2.0","13.0","22.0","26.1","52.1","54.0"],"had":["2.0"],"idea":["2.0","24.1","57.1"],"style":["2.0","5.0"],"a":["3.0","6.0","9.0","11.0","16.0","26.3","27.0","30.0","38.2","45.5","52.3","56.0","71.0","72.3","72.4","80.4","80.7","80.19","80.22","80.31","80.37","80.48","80.52","81.2","91.0","92.3","102.1","102.4","102.13","102.19","102.30","102.34","103.2","112.0","113.5"],"for":["3.0","15.2","21.0","22.1","23.0","24.4","26.2","27.3","50.0","52.2","54.1","55.0","56.3","57.4","62.1","66.0","80.3","80.6","80.9","80.13","80.26","80.39","80.43","81.0","102.8","102.21","102.25"],"website":["4.0"],"off":["4.0"],"replit":["4.0"],"because":["4.0","73.0","114.0"],"of":["4.0","15.1","15.6","16.0","18.0","22.3","23.4","30.0","38.2","45.5","54.3","55.4","62.0","64.0","65.0","72.5","72.6","80.29","80.32","80.51","80.53","83.0","84.0","102.11","102.14","102.33","102.35","105.0","106.0","113.6"],"their":["4.0","15.3","15.6","22.2","23.2","24.1","54.2","55.2","57.1","80.9","103.0"],"monetization":["4.0"],"strategy":["4.0"],"changing":["4.0","103.0"],"in":["4.0","11.0","22.0","22.2","23.6","24.0","24.1","24.6","24.11","26.1","38.2","52.1","54.0","54.2","55.6","57.0","57.1","57.6","57.11","62.1","66.0","72.3","72.6","80.4","80.22","80.25","80.46","80.53","87.0","92.3","92.7","97.0","97.2","102.4","102.7","102.28","102.35","107.0","113.3","113.7","117.0","117.2"],"meantime":["4.0"],"you":["4.0","15.1","24.10","26.0","26.3","35.1","52.0","52.3","57.10","67.0","77.0","80.31","81.4","102.13","102.37"],"can":["4.0","15.3","23.3","24.6","27.4","35.1","55.3","56.4","57.6","59.0","62.3","70.2","71.0","72.5","78.0","80.31","80.43","80.47","80.52","89.2","91.0","92.0","92.4","97.0","100.0","102.13","102.25","102.29","102.34","102.37","103.4","111.2","112.0","113.0","113.4","113.6","117.0"],"check":["4.0","27.1","45.4","56.1"],"slay":["5.0","23.2","55.2"],"spire":["5.0","23.2","55.2"],"small":["6.0","34.0"],"web":["6.0","45.2"],"theoretical":["6.0"],"or":["7.0","13.0","24.0","26.2","27.4","52.2","56.4","57.0","77.0","80.20","80.56","92.4","99.0","102.2","102.38","113.4","119.0"],"edit":["7.0","12.0","62.0"],"date":["7.0"],"part":["7.0","95.0"],"is":["8.0","15.6","18.0","21.0","23.5","24.0","24.7","24.10","28.0","33.0","41.0","45.1","49.0","55.5","57.0","57.7","57.10","63.0","70.2","80.16","80.35","89.2","102.17","111.2"],"and":["9.0","14.0","21.0","24.6","24.10","41.0","46.0","57.6","57.10","59.0","62.3","68.0","71.0","78.0","80.10","80.11","80.28","80.35","80.40","80.43","80.52","91.0","92.3","92.5","100.0","102.10","102.17","102.22","102.25","102.34","112.0","113.3","113.5"],"communal":["9.0"],"digital":["9.0","21.0"],"gardens":["9.0","21.0"],"created":["9.0"],"erlend":["9.0"],"sogge":["9.0"],"heggen":["9.0"],"ex":["9.0"],"employee":["9.0"],"from":["9.0","24.4","25.0","53.0","57.4","67.0","72.4","77.0","83.0","92.5","99.0","103.0","105.0","119.0"],"discourse":["9.0"],"maintains":["9.0"],"the":["9.0","11.0","14.0","15.3","15.6","22.0","24.8","26.0","34.0","35.0","35.1","38.0","40.0","46.0","49.0","52.0","54.0","57.8","72.6","80.5","80.16","80.17","80.19","80.28","80.33","80.35","80.39","80.54","81.3","92.7","102.1","102.10","102.15","102.17","102.21","102.36","113.7"],"blog":["9.0"],"with":["9.0","15.1","15.6","23.2","24.1","45.2","55.2","57.1","62.2","68.0","72.0","72.1","80.5","80.7","80.19","81.3","92.1","102.1","103.0","103.3","113.1"],"great":["9.0"],"write":["9.0"],"ups":["9.0"],"on":["9.0","15.1","24.6","27.1","38.0","40.0","43.0","45.4","56.1","57.6","92.4","113.4"],"wanderstop":["10.0"],"projects":["10.0","28.0"],"stanley":["10.0"],"examples":["11.0","23.5","24.10","25.0","53.0","55.5","57.10"],"rss":["11.0"],"email":["11.0"],"practice":["11.0"],"pick":["11.0"],"server":["11.0","14.0","15.3","15.5"],"problem":["11.0","24.0","57.0"],"hands":["12.0"],"this":["12.0","22.2","54.2","68.0","87.0","92.3","97.3","103.0","109.0","113.3","117.3"],"what":["12.0","23.3","24.0","55.3","57.0"],"scene":["12.0"],"looks":["12.0"],"cutscene":["12.0"],"happening":["12.0"],"top":["12.0","24.6","57.6","62.0","63.0","66.0","70.1","76.0","80.19","82.0","87.0","89.1","98.0","102.1","104.0","107.0","111.1","118.0"],"guide":["12.0","25.3","53.3"],"player":["12.0","23.6","24.6","24.10","55.6","57.6","57.10","73.0","87.0","92.6","93.0","109.0","114.0"],"through":["12.0","45.3"],"basics":["12.0"],"also":["12.0","24.9","24.10","45.3","57.9","57.10","63.0","66.0","67.0","69.0","80.54","81.0","82.0","97.3","102.36","104.0","107.0","108.0","110.0","117.3"],"constructed":["12.0"],"dynamically":["12.0"],"using":["12.0","45.3","47.0","66.0","73.0","86.0","93.0","108.0","114.0"],"quaternion":["12.0"],"math":["12.0"],"figure":["12.0"],"out":["12.0","27.1","56.1","95.0"],"placement":["12.0"],"component":["12.0","90.0","96.0","116.0"],"relative":["12.0"],"face":["12.0","26.0","52.0"],"going":["12.0","24.0","57.0","95.0"],"die":["12.0"],"middle":["12.0","76.0","98.0","118.0"],"one":["12.0","24.1","26.0","52.0","57.1","66.0","72.1","92.1","113.1"],"opponents":["12.0"],"portraits":["12.0"],"its":["12.0","23.1","24.1","55.1","57.1","97.3","117.3"],"sides":["12.0"],"editors":["12.0"],"many":["12.0","23.5","23.6","24.3","27.1","27.4","55.5","55.6","56.1","56.4","57.3","65.0","72.1","84.0","92.1","92.2","106.0","113.1"],"objects":["12.0","80.53","102.35"],"ve":["12.0","23.1","26.3","27.2","52.3","55.1","56.2"],"made":["12.0","13.0","15.4","23.1","30.0","40.0","55.1","80.28","102.10"],"scriptable":["12.0"],"so":["12.0","24.2","24.7","57.2","57.7"],"add":["12.0","80.48","102.30","107.0"],"modify":["12.0"],"them":["12.0","15.6","23.6","27.2","55.6","56.2","66.0","80.34","81.3","92.6","102.16"],"easily":["12.0","23.5","55.5"],"additionally":["12.0","22.1","24.2","54.1","57.2"],"would":["12.0","23.0","24.3","24.9","27.2","55.0","56.2","57.3","57.9"],"create":["12.0","69.0","81.0","103.0","110.0"],"custom":["12.0","80.17","80.51","102.33","102.38"],"inspectors":["12.0"],"help":["12.0"],"easy":["12.0","60.0"],"understand":["12.0","24.1","57.1"],"possible":["12.0"],"opponent":["12.0"],"artificial":["12.0"],"intelligence":["12.0"],"information":["13.0","18.0","76.0","98.0","103.0","118.0"],"an":["13.0","15.4","23.5","24.5","26.1","33.0","45.5","47.0","52.1","55.5","57.5","66.0","72.4","72.5","73.0","80.52","85.0","93.0","102.34","107.0","113.6","114.0"],"individual":["13.0","63.0","104.0"],"alternatives":["13.0"],"to":["13.0","24.3","24.8","45.5","46.0","47.0","57.3","57.8","67.0","71.0","77.0","80.34","80.38","80.41","80.48","80.54","83.0","85.0","89.1","91.0","97.2","102.16","102.20","102.23","102.30","102.36","105.0","111.1","112.0","117.2","119.0"],"centralized":["14.0"],"implementations":["14.0"],"private":["14.0"],"public":["14.0"],"keypairs":["14.0"],"indieauth":["14.0"],"media":["15.0","45.0","45.3"],"my":["15.0"],"data":["15.1","80.9","80.46","102.28"],"every":["15.1","27.2","56.2","92.6"],"client":["15.1"],"don":["15.1","24.3","57.3","70.0","89.0","89.2","111.0","111.2"],"still":["15.1","80.33","81.0","97.3","102.15","103.0","117.3"],"need":["15.1","15.2","62.0","67.0","72.3","80.46","81.0","90.0","92.3","102.28","113.3"],"associate":["15.1"],"people":["15.1","15.2","70.0","89.0","103.0","111.0"],"only":["15.2","15.6","63.0","82.0","104.0","113.1"],"verify":["15.2"],"are":["15.2","23.1","46.0","55.1","62.3","72.4","73.0","80.44","92.2","92.5","93.0","102.26","113.5","114.0"],"same":["15.2","27.3","56.3"],"person":["15.2"],"interacted":["15.2"],"previously":["15.2"],"send":["15.2","15.3"],"money":["15.2"],"otherwise":["15.2"],"important":["15.2"],"identities":["15.2"],"your":["15.2","23.1","25.0","26.0","26.1","52.0","52.1","53.0","55.1","62.0","62.2","72.0","81.3","81.4","103.3"],"forming":["15.2"],"filters":["15.3"],"etc":["15.3","15.5","26.0","52.0","66.0","72.5","75.0","87.0","92.6","107.0","113.6","116.0"],"users":["15.3"],"content":["15.3","45.0"],"no":["15.3","23.6","55.6","59.0","64.0","78.0","83.0","95.0","100.0","105.0"],"authentication":["15.3"],"account":["15.3"],"required":["15.3","72.6","92.7","113.7"],"suffices":["15.3"],"key":["15.4"],"signature":["15.4"],"that":["15.4","15.6","18.0","24.11","26.3","52.3","57.11","63.0","69.0","70.1","72.3","72.5","80.26","81.4","82.0","89.1","89.2","92.2","92.3","92.6","97.0","102.8","103.0","104.0","110.0","111.1","111.2","113.2","113.3","113.6","117.0"],"verifies":["15.4"],"was":["15.4","45.0","80.20","92.1","102.2","113.1"],"by":["15.4","19.0","23.5","55.5","80.25","92.1","102.7","113.1","113.5"],"serves":["15.4"],"as":["15.4","15.5","27.2","56.2","70.2","80.43","81.0","89.2","93.0","102.25","111.2","114.0"],"relay":["15.5"],"owners":["15.5"],"cannot":["15.5"],"fully":["15.5","23.0","27.1","55.0","56.1"],"but":["15.5","46.0","60.0","64.0","75.0","80.5","80.33","81.0","83.0","96.0","102.15","103.0","105.0","116.0"],"choose":["15.5"],"stop":["15.5"],"relaying":["15.5"],"owner":["15.5"],"wishes":["15.5"],"posts":["15.5","45.3"],"be":["15.5","25.0","27.4","53.0","56.4","62.3","70.1","70.2","80.41","80.47","81.0","89.1","89.2","92.2","92.4","97.1","97.3","102.23","102.29","103.4","111.1","111.2","113.2","113.4","117.1","117.3"],"publicly":["15.5"],"probably":["15.6","24.7","57.7","89.2","111.2"],"clients":["15.6"],"sending":["15.6"],"messages":["15.6","80.17"],"ever":["15.6","30.0"],"sends":["15.6"],"specific":["15.6","27.0","56.0","72.5","92.6","113.6"],"collection":["16.0","18.0"],"social":["17.0","42.0","45.0","45.3"],"not":["18.0","24.2","24.3","25.1","26.1","27.2","52.1","53.1","56.2","57.2","57.3","80.25","92.3","102.7","113.3"],"tied":["18.0"],"incremental":["20.0","22.0","23.6","24.0","24.3","25.1","27.1","47.0","53.1","54.0","55.6","56.1","57.0","57.3"],"actual":["20.0","24.2","57.2"],"websites":["21.0","45.1","45.3"],"specifically":["21.0","23.3","55.3","80.40","102.22"],"why":["21.0","27.3","56.3","93.0"],"it":["21.0","23.3","26.2","27.4","40.0","44.0","52.2","55.3","56.4","63.0","67.0","70.1","80.10","80.15","80.51","82.0","87.0","92.5","97.3","102.33","104.0","107.0","113.5","117.3"],"threshold":["22.1","24.2","54.1","57.2"],"makes":["22.1","54.1"],"genre":["22.1","23.0","27.3","54.1","55.0","56.3"],"perfect":["22.1","54.1"],"those":["22.1","24.4","54.1","57.4"],"who":["22.1","27.1","54.1","56.1"],"actively":["22.1","54.1"],"learning":["22.1","26.2","52.2","54.1"],"haven":["22.1","54.1"],"developed":["22.1","54.1"],"any":["22.1","24.9","27.2","54.1","56.2","57.9","70.2","72.3","72.5","73.0","80.46","89.2","92.3","92.6","93.0","102.28","111.2","113.3","113.6","114.0"],"gamedev":["22.1","54.1"],"related":["22.1","54.1","80.46","102.28"],"skills":["22.1","54.1"],"yet":["22.1","54.1"],"unlike":["22.1","24.1","54.1","57.1"],"browser":["22.2","54.2"],"low":["22.2","54.2"],"barrier":["22.2","54.2"],"entry":["22.2","54.2","75.0","96.0","116.0"],"has":["22.2","23.6","24.4","27.3","27.4","45.5","50.0","54.2","55.6","56.3","56.4","57.4","87.0","96.0","109.0"],"shown":["22.2","54.2","97.1","113.1","117.1"],"tremendous":["22.2","54.2"],"success":["22.2","54.2"],"getting":["22.2","54.2"],"completely":["22.2","22.3","54.2","54.3"],"unknown":["22.2","54.2"],"developers":["22.2","26.0","26.2","52.0","52.2","54.2","93.0"],"have":["22.2","24.0","24.2","26.0","27.1","27.3","35.1","50.0","52.0","54.2","56.1","56.3","57.0","57.2","66.0","72.6","74.0","80.9","80.37","85.0","92.4","92.7","94.0","102.19","103.0","107.0","113.4","113.7","115.0"],"been":["22.3","54.3"],"criticized":["22.3","54.3"],"being":["22.3","54.3"],"anti":["22.3","54.3"],"ads":["22.3","41.0","54.3"],"iaps":["22.3","54.3"],"similar":["22.3","54.3","62.3"],"forms":["22.3","54.3"],"often":["22.3","54.3"],"due":["22.3","54.3"],"abundance":["22.3","54.3"],"non":["22.3","24.2","54.3","57.2","80.6"],"monetized":["22.3","54.3"],"d":["23.0","23.2","55.0","55.2"],"argue":["23.0","23.2","24.10","55.0","55.2","57.10"],"necessary":["23.0","55.0"],"contextualized":["23.0","55.0"],"answer":["23.0","55.0"],"recently":["23.0","55.0","80.15"],"watched":["23.0","55.0"],"video":["23.0","55.0"],"about":["23.0","24.0","55.0","57.0","76.0","98.0","118.0"],"vampire":["23.0","23.1","23.3","55.0","55.1","55.3"],"survivors":["23.0","23.1","23.3","55.0","55.1","55.3"],"which":["23.0","27.4","45.0","55.0","56.4","65.0","84.0","96.0","97.3","106.0","116.0","117.3"],"since":["23.0","55.0","92.1","113.1"],"taken":["23.0","24.10","55.0","57.10"],"adds":["23.1","55.1","69.0","88.0","110.0"],"zero":["23.1","55.1"],"number":["23.1","55.1","73.0","80.51","86.0","92.1","93.0","102.33","108.0","113.1","114.0"],"will":["23.1","24.2","55.1","57.2","67.0","72.4","74.0","77.0","80.18","80.25","92.5","94.0","96.0","97.1","97.3","102.7","103.0","115.0","116.0","117.1","117.3"],"quite":["23.1","55.1"],"believe":["23.1","27.2","55.1","56.2"],"sense":["23.1","24.6","55.1","57.6"],"having":["23.1","24.7","55.1","57.7","74.0","85.0","94.0","115.0"],"progress":["23.1","24.10","55.1","57.10"],"comparing":["23.1","55.1"],"where":["23.1","23.3","55.1","55.3","63.0","69.0","76.0","98.0","118.0"],"started":["23.1","55.1","103.0"],"feeling":["23.1","55.1"],"earned":["23.1","55.1"],"way":["23.1","23.4","24.0","25.0","53.0","55.1","55.4","57.0"],"here":["23.1","24.3","55.1","57.3","92.1","113.1"],"enjoyable":["23.1","55.1"],"span":["23.1","27.3","46.0","55.1","56.3"],"id":["23.1","24.1","27.3","55.1","56.3","57.1","68.0","70.2","89.2","109.0","111.2"],"665ceed1":["23.1","55.1"],"704e":["23.1","55.1"],"4cd0":["23.1","55.1"],"9a1756b09f4a":["23.1","55.1"],"h2":["23.1","24.1","27.3","55.1","56.3","57.1"],"bit":["23.2","23.6","27.0","55.2","55.6","56.0"],"repeat":["23.2","55.2"],"cycle":["23.2","55.2"],"if":["23.2","26.1","52.1","55.2","68.0","72.2","80.27","87.0","92.0","102.9","109.0","113.0","113.2"],"look":["23.2","55.2","80.35","102.17"],"higher":["23.2","55.2"],"level":["23.2","27.3","55.2","56.3"],"most":["23.2","24.0","24.1","24.2","25.1","53.1","55.2","57.0","57.1","57.2","70.0","80.15","81.0","89.0","103.0","111.0"],"ll":["23.2","55.2","90.0"],"perform":["23.2","55.2"],"difficult":["23.2","55.2"],"feats":["23.2","55.2"],"ease":["23.2","55.2"],"speed":["23.2","55.2"],"achieve":["23.2","55.2"],"flow":["23.2","55.2"],"state":["23.2","55.2","90.0"],"takes":["23.2","55.2","59.0","78.0","100.0"],"knowledge":["23.2","31.0","48.0","55.2","60.0"],"experience":["23.2","55.2"],"uses":["23.2","24.1","55.2","57.1","92.2","92.5","113.5"],"instinctively":["23.2","55.2"],"incredible":["23.2","55.2"],"watch":["23.2","55.2"],"things":["23.2","23.6","55.2","55.6","60.0","80.43","80.48","81.0","92.4","102.25","102.30","103.0","113.4"],"runs":["23.2","55.2"],"competitive":["23.2","55.2"],"ddr":["23.2","55.2"],"likes":["23.2","55.2"],"i":["23.2","35.1","40.0","55.2","93.0"],"goal":["23.2","24.1","55.2","57.1","72.2","86.0","92.2","113.2"],"making":["23.3","27.2","55.3","56.2","80.54","102.36"],"decisions":["23.3","55.3"],"within":["23.3","23.6","26.1","52.1","55.3","55.6","88.0"],"applies":["23.3","55.3"],"evolutions":["23.3","55.3"],"synergies":["23.3","55.3"],"kinds":["23.3","55.3"],"enemies":["23.3","55.3"],"at":["23.4","24.1","24.2","27.3","55.4","56.3","57.1","57.2","62.0","63.0","64.0","66.0","70.1","72.1","83.0","87.0","89.1","104.0","105.0","107.0","111.1","113.3"],"various":["23.4","55.4"],"times":["23.4","55.4","92.2","113.2"],"throughout":["23.4","55.4"],"progression":["23.4","55.4"],"some":["23.5","23.6","24.0","24.2","27.1","47.0","55.5","55.6","56.1","57.0","57.2","69.0","110.0"],"extremely":["23.5","55.5"],"cut":["23.5","55.5"],"philosophies":["23.5","55.5"],"let":["23.5","23.6","24.1","55.5","55.6","57.1","70.0","89.0","111.0"],"start":["23.5","55.5","80.37","102.19"],"giving":["23.5","55.5"],"example":["23.5","27.2","55.5","56.2"],"mechanic":["23.5","27.3","55.5","56.3"],"think":["23.5","24.1","24.3","26.0","52.0","55.5","57.1","57.3"],"strongly":["23.5","55.5"],"argued":["23.5","55.5"],"course":["23.5","55.5"],"personal":["23.5","45.3","55.5"],"favorite":["23.5","55.5"],"mine":["23.5","55.5"],"how":["23.5","24.2","26.3","45.0","52.3","55.5","57.2","72.3","92.3"],"doom":["23.5","55.5"],"encourages":["23.5","55.5"],"aggressive":["23.5","55.5"],"gameplay":["23.5","24.2","55.5","57.2"],"linking":["23.5","55.5"],"health":["23.5","38.1","55.5"],"drops":["23.5","55.5"],"melee":["23.5","55.5"],"attacks":["23.5","55.5"],"genres":["23.6","24.1","24.8","55.6","57.1","57.8"],"like":["23.6","55.6","68.0","72.5","80.56","87.0","109.0","113.6"],"might":["23.6","55.6"],"grey":["23.6","55.6"],"area":["23.6","55.6"],"talk":["23.6","55.6"],"first":["23.6","49.0","55.6","62.0","63.0","96.0"],"though":["23.6","27.3","55.6","56.3","72.0"],"story":["23.6","55.6"],"tell":["23.6","55.6"],"lore":["23.6","55.6"],"characters":["23.6","55.6"],"drive":["23.6","55.6"],"encourage":["23.6","55.6"],"continue":["23.6","55.6"],"exploring":["23.6","55.6"],"discovering":["23.6","55.6"],"walking":["23.6","55.6"],"simulator":["23.6","55.6"],"clear":["24.0","57.0"],"even":["24.0","57.0"],"talking":["24.0","57.0"],"poses":["24.0","57.0"],"horribly":["24.0","57.0"],"vague":["24.0","57.0"],"numbers":["24.0","27.2","56.2","57.0","64.0","80.3","80.18","83.0","105.0"],"form":["24.0","57.0"],"another":["24.0","57.0","92.1","113.1"],"we":["24.0","57.0"],"all":["24.1","26.3","47.0","52.3","57.1","66.0","72.6"],"modern":["24.1","27.1","38.2","50.0","56.1","57.1"],"665cea25":["24.1","57.1"],"b1e5":["24.1","57.1"],"40bc":["24.1","57.1"],"8c82":["24.1","57.1"],"2296982ce1d1":["24.1","57.1"],"parodies":["24.1","57.1"],"interesting":["24.1","57.1"],"definitions":["24.1","57.1"],"appear":["24.1","57.1","72.4","92.5","96.0","116.0"],"distilled":["24.1","57.1"],"versions":["24.1","57.1"],"revealing":["24.1","57.1"],"naked":["24.1","57.1"],"design":["24.1","27.3","56.3","57.1"],"core":["24.1","57.1"],"comment":["24.1","26.1","52.1","57.1"],"upon":["24.1","26.1","52.1","57.1"],"source":["24.1","39.0","51.0","57.1"],"material":["24.1","57.1"],"means":["24.1","24.7","57.1","57.7","83.0","105.0"],"casino":["24.1","57.1"],"skinner":["24.1","57.1"],"boxes":["24.1","57.1"],"emotionally":["24.1","57.1"],"manipulate":["24.1","57.1"],"customers":["24.1","57.1"],"keep":["24.1","57.1","72.1","92.1","113.1"],"playing":["24.1","57.1","103.0"],"dressing":["24.1","57.1"],"up":["24.1","27.1","45.4","50.0","56.1","57.1","80.37","95.0","97.3","102.19","117.3"],"box":["24.1","57.1","71.0","91.0","112.0"],"tons":["24.1","57.1"],"stimuli":["24.1","57.1"],"hide":["24.1","57.1","97.3","117.3"],"ultimately":["24.1","57.1"],"condition":["24.1","57.1","86.0","108.0"],"into":["24.1","57.1","81.0","103.0"],"coming":["24.1","57.1"],"back":["24.1","57.1","89.1","111.1"],"compulsively":["24.1","57.1"],"taking":["24.1","57.1"],"demonstrate":["24.2","57.2"],"between":["24.2","27.1","43.0","56.1","57.2","93.0"],"when":["24.2","26.0","27.3","52.0","56.3","57.2","80.54","102.36"],"notably":["24.2","57.2"],"rpgs":["24.2","57.2"],"typically":["24.2","57.2"],"considered":["24.2","57.2"],"pass":["24.2","24.9","57.2","57.9"],"lot":["24.2","45.5","57.2"],"tend":["24.2","24.8","57.2","57.8"],"theme":["24.2","57.2"],"guiding":["24.2","57.2"],"least":["24.2","57.2"],"names":["24.2","57.2","72.5","113.6"],"mechanics":["24.2","24.6","26.2","52.2","57.2","57.6"],"honestly":["24.3","27.3","56.3","57.3"],"there":["24.3","24.8","26.3","27.0","52.3","56.0","57.3","57.8","70.1","85.0","89.1","111.1"],"s":["24.3","24.4","26.2","27.0","27.2","52.2","56.0","56.2","57.3","57.4","60.0","65.0","67.0","70.0","70.2","72.5","84.0","86.0","89.0","92.6","106.0","108.0","111.0","113.6"],"good":["24.3","57.3","80.9"],"explanation":["24.3","57.3"],"fans":["24.3","57.3"],"define":["24.4","57.4"],"list":["24.4","57.4","80.53","102.35"],"factors":["24.4","57.4"],"derived":["24.4","57.4"],"determine":["24.4","57.4","70.2","89.2","111.2"],"roguelikeness":["24.4","57.4"],"more":["24.4","24.8","27.2","35.1","38.2","56.2","57.4","57.8","80.43","102.25","113.3"],"could":["24.5","57.5"],"justifiably":["24.5","57.5"],"make":["24.5","57.5","70.2","72.0","72.2","73.0","76.0","80.34","80.54","81.3","89.2","93.0","98.0","102.16","102.36","111.2","114.0","118.0"],"dark":["24.5","24.6","44.0","57.5","57.6"],"room":["24.5","24.6","57.5","57.6"],"clicker":["24.5","57.5"],"heroes":["24.5","57.5"],"crank":["24.5","57.5"],"increlution":["24.5","24.10","57.5","57.10"],"kitten":["24.5","57.5"],"ngu":["24.5","57.5"],"idle":["24.5","24.10","57.5","57.10"],"include":["24.6","24.10","47.0","57.6","57.10","72.5","113.6"],"universal":["24.6","57.6"],"paperclips":["24.6","57.6"],"reasons":["24.6","57.6"],"appeal":["24.6","27.3","56.3","57.6"],"oftentimes":["24.6","57.6"],"each":["24.6","45.2","57.6"],"builds":["24.6","57.6"],"existing":["24.6","57.6","69.0","110.0"],"increasing":["24.6","57.6"],"complexity":["24.6","57.6"],"steps":["24.6","57.6"],"follow":["24.6","57.6"],"along":["24.6","25.0","53.0","57.6"],"they":["24.6","24.7","27.1","45.2","56.1","57.6","57.7","62.3","72.2","80.44","97.2","102.26","113.2","117.2"],"provide":["24.6","27.2","56.2","57.6"],"several":["24.7","47.0","57.7"],"apply":["24.7","27.3","56.3","57.7"],"canon":["24.7","57.7"],"pure":["24.7","57.7"],"ui":["24.7","57.7"],"display":["24.7","57.7","66.0","80.19","80.21","87.0","95.0","99.0","102.1","102.3","119.0"],"incrementals":["24.7","57.7"],"grow":["24.8","57.8"],"faster":["24.8","57.8","80.37","102.19"],"than":["24.8","26.0","45.4","50.0","52.0","57.8","70.0","89.0","111.0"],"other":["24.8","27.1","45.2","56.1","57.8","72.3","75.0","80.46","92.3","97.1","102.28","103.0","113.3","117.1"],"instances":["24.8","57.8"],"superlinear":["24.8","57.8"],"larger":["24.8","57.8","66.0","80.18","87.0","107.0"],"get":["24.8","57.8","68.0","76.0","90.0","98.0","109.0","118.0"],"stronger":["24.8","57.8"],"signal":["24.8","57.8"],"passes":["24.9","57.9"],"variant":["24.9","57.9"],"deciding":["24.10","57.10"],"actions":["24.10","57.10"],"per":["24.10","57.10","80.27","102.9"],"notable":["24.10","57.10"],"stuck":["24.10","57.10"],"time":["24.10","57.10","73.0","80.30","81.0","92.1","93.0","102.12","103.0","113.1","114.0"],"cavernous":["24.10","57.10"],"ii":["24.10","57.10"],"may":["24.10","26.2","52.2","57.10"],"groundhog":["24.10","57.10"],"life":["24.10","57.10"],"knight":["24.10","57.10"],"popular":["24.11","25.1","53.1","57.11"],"china":["24.11","57.11"],"center":["24.11","57.11"],"around":["24.11","57.11"],"build":["25.0","53.0"],"own":["25.0","53.0","62.0","80.9","81.0"],"interactive":["25.0","53.0"],"snippets":["25.0","53.0"],"nor":["25.1","53.1"],"certainly":["25.1","53.1"],"ones":["25.1","53.1"],"inexperienced":["26.0","52.0"],"hardest":["26.0","52.0"],"harder":["26.0","52.0","72.2","113.2"],"coding":["26.0","52.0"],"debugging":["26.0","52.0"],"balancing":["26.0","52.0"],"handling":["26.0","52.0"],"put":["26.0","52.0"],"heart":["26.0","52.0"],"allowed":["26.1","52.1"],"whatever":["26.1","52.1","70.2","89.2","111.2"],"re":["26.1","52.1","61.6"],"sharing":["26.1","52.1"],"works":["26.1","45.3","52.1"],"do":["26.1","52.1","97.0","117.0"],"come":["26.1","52.1"],"across":["26.1","52.1"],"interpret":["26.1","52.1"],"attack":["26.1","52.1"],"report":["26.1","52.1"],"negative":["26.1","52.1"],"comments":["26.1","26.3","43.0","52.1","52.3"],"support":["26.2","52.2","80.46","80.51","102.28","102.33"],"certain":["26.2","27.3","52.2","56.3"],"prefer":["26.2","52.2"],"types":["26.2","52.2"],"positive":["26.3","52.3"],"received":["26.3","52.3"],"concept":["26.3","52.3"],"psychology":["26.3","52.3"],"called":["26.3","52.3"],"bias":["26.3","52.3"],"explains":["26.3","52.3"],"love":["27.0","56.0"],"fact":["27.0","46.0","56.0"],"seem":["27.0","27.1","56.0","56.1"],"value":["27.0","56.0","70.2","72.3","77.0","85.0","88.0","89.2","99.0","110.0","111.2","119.0"],"over":["27.0","56.0","82.0","104.0"],"quality":["27.0","56.0"],"however":["27.0","56.0"],"lack":["27.0","56.0"],"understanding":["27.0","56.0"],"concerning":["27.0","56.0"],"gamers":["27.1","56.1"],"want":["27.1","56.1","70.2","81.0","89.2","92.0","111.2","113.0"],"something":["27.1","56.1","70.2","72.5","89.2","92.6","111.2","113.6"],"bursts":["27.1","56.1"],"working":["27.1","56.1"],"activity":["27.1","56.1"],"fallen":["27.1","56.1"],"slightly":["27.1","56.1"],"fashion":["27.1","56.1"],"amongst":["27.1","56.1"],"valid":["27.1","56.1"],"point":["27.1","56.1"],"happens":["27.2","27.3","56.2","56.3"],"exponentially":["27.2","56.2"],"quickly":["27.2","56.2"],"frequently":["27.2","56.2"],"purchased":["27.2","56.2"],"classic":["27.2","56.2"],"goes":["27.2","56.2"],"far":["27.2","56.2"],"go":["27.2","56.2","89.1","111.1"],"say":["27.2","56.2"],"chore":["27.2","27.3","56.2","56.3"],"after":["27.2","56.2","80.10","103.0"],"bought":["27.2","56.2","92.2","113.2"],"couple":["27.2","56.2"],"method":["27.2","56.2"],"inflating":["27.2","56.2"],"effectively":["27.2","56.2","72.2","92.2","113.2"],"oom":["27.2","56.2"],"above":["27.3","56.3","71.0","91.0","112.0"],"criticisms":["27.3","56.3"],"similarly":["27.3","56.3","75.0","96.0","116.0"],"before":["27.3","27.4","45.0","56.3","56.4","72.1","92.1","113.1"],"everyone":["27.3","56.3"],"665cf570":["27.3","56.3"],"e3d3":["27.3","56.3"],"48f6":["27.3","56.3"],"9fde":["27.3","56.3"],"aa94e68a8682":["27.3","56.3"],"automation":["27.3","56.3","80.33","102.15"],"staple":["27.3","56.3"],"implications":["27.3","56.3"],"new":["27.3","45.3","56.3","80.15","80.28","80.54","102.10","102.36"],"introduced":["27.3","56.3"],"must":["27.3","56.3"],"older":["27.3","56.3"],"automated":["27.3","56.3"],"away":["27.3","56.3","70.0","89.0","111.0"],"feels":["27.3","56.3"],"rewarding":["27.3","56.3"],"again":["27.3","56.3","80.47","89.2","102.29","111.2"],"does":["27.3","56.3","59.0","78.0","92.3","100.0","113.3"],"such":["27.3","56.3","93.0","114.0"],"know":["27.3","56.3"],"just":["27.3","27.4","56.3","56.4"],"later":["27.3","56.3","89.2","111.2"],"happy":["27.3","56.3"],"begs":["27.3","56.3"],"question":["27.3","56.3"],"feature":["27.4","56.4","75.0","80.21","96.0","102.3","116.0"],"then":["27.4","56.4"],"wait":["27.4","56.4"],"requirements":["27.4","56.4"],"used":["27.4","56.4","70.2","89.2","111.2"],"magnum":["30.0"],"opus":["30.0"],"sorts":["30.0"],"p":["30.0"],"open":["33.0","39.0","76.0","98.0","118.0"],"profectus":["35.2"],"logseq":["37.0"],"mbin":["37.0"],"planar":["37.0"],"pioneers":["37.0"],"development":["38.0"],"national":["38.1"],"institutes":["38.1"],"nih":["38.1"],"system":["38.1","86.0","108.0"],"architecture":["38.1"],"jpg":["38.1"],"iframe":["38.1"],"width":["38.1","64.0","88.0"],"height":["38.1","64.0","88.0","110.0"],"src":["38.1","45.6"],"https":["38.1","45.6"],"www":["38.1","45.6"],"youtube":["38.1","45.6"],"com":["38.1"],"embed":["38.1"],"9uhqirs7zjm":["38.1"],"frameborder":["38.1"],"allow":["38.1","86.0","108.0"],"accelerometer":["38.1"],"version":["38.2","80.40","102.22"],"unity":["38.2"],"improving":["38.2"],"interface":["38.2"],"designed":["39.0"],"loosely":["40.0"],"based":["40.0","46.0"],"modding":["40.0"],"acamaeda":["40.0"],"technically":["40.0"],"influencers":["41.0"],"partially":["41.0"],"self":["41.0"],"hosting":["41.0"],"too":["41.0","93.0","114.0"],"broadly":["43.0"],"relationship":["43.0"],"forest":["44.0"],"theory":["44.0"],"internet":["44.0"],"refers":["44.0"],"homogenized":["45.0"],"known":["45.1"],"marginalia":["45.1"],"connect":["45.2"],"consistently":["45.2"],"discourage":["45.2"],"announce":["45.3"],"websub":["45.3"],"allows":["45.3"],"rather":["45.4","50.0"],"managed":["45.5"],"pages":["45.5"],"neocities":["45.5"],"biased":["46.0"],"argumentative":["46.0"],"best":["46.0","72.1","72.5","92.1","113.1","113.6"],"ability":["46.0","80.17","80.40","102.22"],"expertise":["46.0"],"including":["47.0"],"voxel":["47.0"],"world":["47.0"],"test":["47.0"],"scenes":["47.0"],"these":["47.0","63.0","69.0","72.0","73.0","93.0","104.0","114.0"],"render":["47.0"],"hub":["48.0"],"human":["50.0"],"trust":["50.0"],"algorithms":["50.0"],"vision":["50.0"],"communities":["50.0"],"set":["50.0","62.0","68.0","73.0","87.0","90.0","92.6","96.0","109.0","114.0"],"matrix":["50.0"],"spaces":["50.0"],"project":["51.0"],"team":["51.0"],"currently":["51.0"],"upgrades":["59.0","72.5","78.0","80.18","80.29","80.50","92.6","100.0","102.11","102.32","113.6"],"longer":["59.0","78.0","100.0"],"argument":["59.0","66.0","69.0","78.0","85.0","100.0","107.0","110.0"],"neither":["59.0","78.0","100.0"],"effect":["59.0","67.0","77.0","78.0","85.0","86.0","90.0","100.0","108.0"],"buyables":["59.0","62.2","72.2","78.0","80.50","92.2","100.0","102.32","103.3","113.2"],"buyable":["59.0","78.0","80.15","100.0"],"cost":["59.0","66.0","78.0","100.0"],"take":["59.0","78.0","95.0","97.3","100.0","117.3"],"programming":["60.0"],"mostly":["60.0"],"pretty":["60.0"],"debuggedx3":["61.1"],"rebalanced":["61.2"],"debuggedx2":["61.2"],"debugged":["61.3"],"bump":["61.4"],"row":["61.5","72.1","80.22","84.0","88.0","92.1","102.4","113.5"],"added":["61.5","80.3","80.13"],"colored":["61.5"],"fixed":["61.8","61.10"],"layers":["61.8","72.4","80.30","80.54","92.5","102.12","102.36","113.5"],"hiding":["61.8"],"notification":["61.10"],"influx":["61.11"],"commit":["61.12"],"references":["62.0"],"base":["62.0","80.39","81.0","92.7","102.21","113.7"],"thing":["62.0"],"modinfo":["62.0","80.38","80.40","102.20","102.22"],"js":["62.0","62.1","68.0","80.25","87.0","90.0","97.0","102.7","109.0","117.0"],"modid":["62.0","103.0"],"string":["62.0","70.2","72.1","89.2","92.1","103.0","111.2","113.1"],"basic":["62.1","69.0","71.0","82.0","91.0","110.0","112.0"],"layer":["62.1","68.0","80.17","80.20","80.25","80.41","80.46","81.2","90.0","92.3","102.2","102.7","102.23","102.28","103.2","109.0","113.3"],"breakdown":["62.1","81.2","103.2"],"breaking":["62.1","81.2","103.2"],"down":["62.1","80.15","81.2","103.2"],"rebuyable":["62.2","103.3"],"highly":["62.3"],"customizable":["62.3","103.4"],"horizontal":["62.3","103.4"],"digit":["63.0"],"second":["63.0","80.27","96.0","102.9"],"column":["63.0","88.0","104.0"],"optional":["63.0","67.0","68.0","80.35","86.0","87.0","102.17","104.0","107.0","108.0"],"displayed":["63.0","66.0","87.0","104.0","107.0"],"visible":["63.0","82.0","97.3","104.0","117.3"],"text":["63.0","67.0","71.0","80.3","82.0","85.0","91.0","104.0","107.0","108.0","112.0"],"function":["63.0","64.0","71.0","72.3","80.46","80.56","82.0","83.0","87.0","91.0","92.3","92.6","102.28","104.0","105.0","112.0"],"updating":["63.0","66.0","67.0","69.0","82.0","85.0","104.0","107.0","108.0","110.0"],"use":["63.0","70.0","71.0","73.0","75.0","80.6","80.43","80.54","81.0","82.0","89.0","91.0","92.4","96.0","102.25","102.36","104.0","111.0","112.0","113.4","116.0"],"html":["63.0","69.0","71.0","77.0","82.0","91.0","104.0","110.0","112.0"],"done":["63.0","74.0","82.0","104.0"],"returning":["63.0","74.0","82.0","86.0","94.0","97.3","104.0","108.0","115.0","117.3"],"size":["64.0","68.0","83.0","105.0"],"pixels":["64.0","83.0","105.0"],"px":["64.0","83.0","105.0"],"end":["64.0","83.0","105.0"],"returns":["64.0","66.0","69.0","83.0","87.0","105.0","109.0","110.0"],"portion":["64.0","83.0","105.0"],"main":["65.0","71.0","72.3","91.0","92.3","106.0","112.0"],"resource":["65.0","72.3","80.21","84.0","92.3","92.4","102.3","106.0","113.3","113.4"],"color":["65.0","72.1","84.0","92.1","106.0","113.1"],"fe0102":["65.0"],"affects":["65.0","84.0","106.0"],"elements":["65.0","84.0","106.0"],"prestige":["65.0","72.1","72.5","80.10","80.39","80.46","80.51","84.0","92.6","102.21","102.28","102.33","106.0","113.6"],"absent":["66.0"],"sellonetext":["66.0"],"sellalltext":["66.0"],"sell":["66.0"],"buttons":["66.0","80.25","80.34","102.7","102.16"],"respectively":["66.0"],"return":["66.0","77.0","87.0","97.3","99.0","117.3","119.0"],"blah":["66.0","87.0"],"features":["66.0","72.6","75.0","80.51","81.2","92.7","102.33","103.2","107.0","113.7"],"title":["66.0","71.0","87.0","107.0"],"font":["66.0","87.0","107.0"],"buying":["66.0","85.0","107.0"],"next":["66.0","85.0","107.0"],"x":["66.0","69.0","88.0","110.0"],"calculate":["66.0","85.0","107.0"],"implement":["67.0","74.0","77.0","94.0","115.0","119.0"],"elsewhere":["67.0","74.0","94.0","115.0"],"rewarddescription":["67.0","86.0","108.0"],"reward":["67.0","74.0","82.0","86.0","94.0","108.0","115.0"],"applied":["67.0","77.0","86.0","99.0","119.0"],"rewardeffect":["67.0"],"calculates":["67.0","77.0","85.0","99.0","119.0"],"values":["67.0","72.0","77.0","85.0","99.0","119.0"],"bonuses":["67.0","77.0","85.0","99.0","119.0"],"clickable":["68.0","109.0"],"getclickablestate":["68.0","109.0"],"setclickablestate":["68.0","87.0","109.0"],"clickableeffect":["68.0","87.0","109.0"],"current":["68.0","76.0","87.0","98.0","109.0","118.0"],"effects":["68.0","80.5","109.0"],"should":["68.0","70.1","80.24","80.37","87.0","89.1","90.0","95.0","97.3","102.6","102.19","109.0","111.1","117.3"],"formatted":["68.0","87.0","90.0","109.0"],"rows":["68.0","90.0","109.0"],"cols":["68.0","109.0"],"columns":["68.0","88.0","109.0"],"masterbuttonpress":["68.0"],"object":["69.0","77.0","85.0","99.0","119.0"],"keys":["69.0"],"attributes":["69.0"],"v":["69.0"],"displays":["69.0","99.0","110.0","119.0"],"raw":["69.0","110.0"],"empty":["69.0","88.0","110.0"],"space":["69.0","80.56","88.0","97.3","102.38","110.0","117.3"],"default":["69.0","82.0","88.0","99.0","104.0","110.0","119.0"],"dimensions":["69.0","88.0","110.0"],"8px":["69.0","88.0","110.0"],"17px":["69.0","88.0","110.0"],"t":["70.0","89.0","89.2","103.0","111.0","111.2"],"word":["70.0","89.0","111.0"],"github":["70.0","89.0","111.0"],"scare":["70.0","89.0","111.0"],"actually":["70.0","80.10","89.0","111.0"],"much":["70.0","72.3","89.0","92.3","93.0","111.0","114.0"],"easier":["70.0","80.54","89.0","102.36","111.0"],"page":["70.1","73.0","89.1","111.1"],"right":["70.1","80.32","89.1","102.14","111.1"],"button":["70.1","80.15","80.34","89.1","102.16","111.1","113.3"],"says":["70.1","76.0","89.1","98.0","111.1","118.0"],"fork":["70.1","89.1","111.1"],"click":["70.1","76.0","89.1","98.0","111.1","118.0"],"name":["70.2","72.3","80.38","92.3","102.20","113.3"],"well":["70.2","81.4","89.2","103.4","111.2"],"savefile":["70.2","89.2","111.2"],"dynamic":["71.0","80.41","80.44","91.0","102.23","102.26","112.0"],"body":["71.0"],"inside":["71.0"],"associated":["72.0","72.1","92.1","113.1"],"special":["72.0"],"functionality":["72.0"],"total":["72.1","72.5","95.0","113.6"],"tracks":["72.1"],"amount":["72.1","73.0","93.0","114.0"],"highest":["72.1","92.1","113.1"],"unlockorder":["72.1","92.1","113.1"],"track":["72.1","92.1","113.1"],"relevant":["72.1","92.1","113.1"],"hex":["72.1","92.1"],"format":["72.1","92.1"],"starting":["72.1"],"reach":["72.2","113.2"],"beat":["72.2","92.2","113.2"],"challenge":["72.2","80.31","92.2","102.13","113.2"],"recieve":["72.2","92.2","113.2"],"bonus":["72.2","92.2","113.2"],"section":["72.3","92.3","113.3"],"baseamount":["72.3","92.3"],"gets":["72.3"],"requires":["72.3"],"sorted":["72.4","92.5","113.5"],"alphabetical":["72.4","92.5","113.5"],"order":["72.4","92.5","113.5"],"branches":["72.4","80.47","92.5","102.29","113.5"],"array":["72.4","72.5","92.5","113.5","113.6"],"ids":["72.4","80.6","92.5"],"line":["72.4","92.5"],"points":["72.5","113.6"],"currency":["72.5","80.39","88.0","92.6","102.21","113.6"],"unique":["72.5","89.2","92.6","103.0","111.2","113.6"],"variables":["72.5","92.6","113.6"],"generatorpower":["72.5","92.6","113.6"],"getnextat":["72.6","92.7","113.7"],"canmax":["72.6","92.7","113.7"],"false":["72.6","92.7","113.7"],"url":["73.0","93.0","114.0"],"invite":["73.0","93.0","114.0"],"please":["73.0","93.0","114.0"],"sure":["73.0","114.0"],"never":["73.0","93.0","114.0"],"expire":["73.0","93.0","114.0"],"changeloglink":["73.0"],"changelog":["73.0","80.0","102.0"],"offlinelimit":["73.0","93.0","114.0"],"maximum":["73.0","93.0","114.0"],"offline":["73.0","80.30","93.0","102.12","114.0"],"accumulate":["73.0","93.0","114.0"],"hours":["73.0","93.0","114.0"],"extra":["73.0","93.0","114.0"],"lost":["73.0","93.0","114.0"],"useful":["73.0","88.0","90.0","93.0","114.0"],"mods":["73.0","93.0","103.0","114.0"],"fast":["73.0","93.0","114.0"],"boolean":["74.0","82.0","94.0","104.0","115.0"],"group":["75.0","96.0","116.0"],"try":["76.0","98.0","118.0"],"fetch":["76.0","98.0","118.0"],"origin":["76.0","98.0","118.0"],"containing":["77.0","85.0","99.0","119.0"],"git":["79.0","101.0"],"submodule":["79.0","101.0"],"inputs":["80.3"],"stationary":["80.4"],"particle":["80.4"],"visual":["80.5"],"particles":["80.5"],"interact":["80.5"],"mouse":["80.5"],"numeric":["80.6"],"major":["80.7"],"issue":["80.7"],"inventory":["80.9"],"map":["80.9"],"tiles":["80.9"],"multiplies":["80.10"],"gain":["80.10","80.27","102.9"],"exponents":["80.10"],"softcaps":["80.10"],"tab":["80.11","97.0","117.0"],"formats":["80.11"],"bars":["80.11"],"glowcolor":["80.13"],"now":["80.15","80.16","80.21","80.35","80.44","102.3","102.17","102.26"],"buys":["80.15"],"continuously":["80.15"],"milestone":["80.15"],"setting":["80.15"],"show":["80.15","97.2","117.2"],"unlocked":["80.15"],"renamed":["80.15"],"thepaperpilot":["80.16"],"respec":["80.16","80.17","80.25","81.3","102.7"],"confirmation":["80.16","80.17"],"checkbox":["80.16"],"toggle":["80.17"],"confirmations":["80.17"],"red":["80.17"],"highlight":["80.17"],"expand":["80.18"],"clicking":["80.19","102.1"],"prestiged":["80.20","92.1","102.2","113.1"],"reset":["80.20","102.2","103.0"],"always":["80.21","102.3"],"node":["80.22","102.4"],"keyword":["80.24","80.54","102.6","102.36"],"work":["80.24","80.33","97.2","102.6","102.15","117.2"],"everywhere":["80.24","102.6"],"except":["80.24","102.6"],"tabformat":["80.24","102.6"],"arrays":["80.24","102.6"],"mod":["80.25","102.7"],"nodes":["80.25","80.34","80.41","97.2","102.7","102.16","102.23","117.2"],"clicked":["80.25","102.7"],"pressing":["80.25","102.7"],"enter":["80.25","102.7"],"subtab":["80.26","102.8"],"attempted":["80.26","102.8"],"fix":["80.26","80.38","102.8","102.20"],"challenges":["80.26","80.28","80.29","80.46","80.50","102.8","102.10","102.11","102.28","102.32"],"passivegain":["80.27","102.9"],"costs":["80.29","80.43","102.11","102.25"],"goals":["80.29","102.11"],"normal":["80.30","102.12"],"limit":["80.30","102.12"],"finish":["80.31","102.13"],"half":["80.32","102.14"],"standardize":["80.33","102.15"],"old":["80.33","86.0","102.15","108.0"],"ways":["80.33","102.15"],"shouldnotify":["80.34","102.16"],"highlighted":["80.34","102.16"],"commas":["80.34","102.16"],"defaults":["80.35","102.17"],"none":["80.35","80.46","96.0","102.17","102.28"],"improved":["80.35","102.17"],"updates":["80.37","102.19"],"author":["80.38","102.20"],"cangenpoints":["80.40","102.22"],"getpointgen":["80.40","102.22"],"maxticklength":["80.40","102.22"],"getstartpoints":["80.40","102.22"],"store":["80.40","102.22"],"able":["80.41","102.23"],"currencies":["80.43","85.0","102.25"],"upgrade":["80.43","80.52","102.25","102.34"],"either":["80.46","102.28"],"constant":["80.46","102.28"],"multiple":["80.46","92.2","99.0","102.28","113.2","119.0"],"completions":["80.46","102.28"],"type":["80.46","80.51","102.28","102.33"],"removes":["80.46","102.28"],"defined":["80.47","102.29"],"without":["80.47","102.29"],"milestones":["80.50","102.32"],"both":["80.50","102.32"],"individually":["80.50","102.32"],"formula":["80.51","102.33"],"buy":["80.52","102.34"],"code":["80.54","81.0","102.36","103.0"],"transfer":["80.54","102.36"],"buildings":["80.56","102.38"],"freely":["81.0","92.0","113.0"],"deleted":["81.0"],"reference":["81.0"],"won":["81.0","103.0"],"dive":["81.0","103.0"],"deep":["81.0","103.0"],"really":["81.0"],"vue":["81.0"],"components":["81.0","81.2","103.2"],"minimal":["81.2","103.2"],"explanations":["81.2","103.2"],"option":["81.3"],"subtabs":["81.4","103.4"],"microtabs":["81.4","103.4"],"tabs":["81.4","96.0","116.0"],"microtab":["81.4"],"tooltip":["82.0","104.0"],"appears":["82.0","104.0"],"hovered":["82.0","104.0"],"convey":["82.0"],"completing":["82.0","86.0","108.0"],"4bdc13":["84.0","106.0"],"1th":["85.0"],"purchase":["85.0"],"goaldescription":["86.0","108.0"],"true":["86.0","108.0"],"meet":["86.0","108.0"],"bulk":["86.0","108.0"],"changes":["88.0","110.0"],"single":["88.0","110.0"],"e":["88.0","110.0"],"g":["88.0","110.0"],"20px":["88.0","110.0"],"determines":["88.0","97.3","110.0","117.3"],"pair":["88.0","110.0"],"horizontally":["88.0"],"layout":["88.0"],"vertically":["88.0"],"change":["89.2","111.2"],"two":["90.0"],"unrelated":["90.0"],"proxy":["90.0"],"dealing":["90.0"],"getgriddata":["90.0"],"chosen":["90.0"],"setgriddata":["90.0"],"grideffect":["90.0"],"resettime":["92.1","113.1"],"last":["92.1","95.0","113.1"],"places":["92.1","113.1"],"optionally":["92.2"],"respeccable":["92.2"],"therefore":["92.3","113.3"],"secondary":["92.4","113.4"],"recalculate":["92.4","113.4"],"whatnot":["92.4","113.4"],"resetdescription":["92.4","113.4"],"save":["92.6","113.6"],"separate":["92.6"],"variable":["92.6"],"saved":["92.6"],"update":["92.6"],"diff":["92.6"],"tick":["92.6"],"provided":["92.7","113.7"],"paced":["93.0","114.0"],"enough":["93.0","114.0"],"ruins":["93.0","114.0"],"balance":["93.0","114.0"],"suggest":["93.0"],"disable":["93.0"],"clockwise":["95.0"],"seconds":["95.0"],"fadeouttime":["95.0"],"fading":["95.0"],"lifetime":["95.0"],"fadeintime":["95.0"],"stuff":["96.0"],"otherstuff":["96.0"],"fill":["97.1","117.1"],"whole":["97.1","117.1"],"layershown":["97.3","117.3"],"bool":["97.3","117.3"],"ghost":["97.3","117.3"],"effectdisplay":["99.0","119.0"],"formatting":["99.0","119.0"],"nothing":["99.0","119.0"],"fulldisplay":["99.0"],"enhancers":["102.38"],"release":["102.39"],"prevent":["103.0"],"saves":["103.0"],"conflicting":["103.0"],"note":["103.0"],"vertical":["103.4"],"sub":["107.0"],"cancomplete":["108.0"],"yourself":["113.3"],"see":["113.3"],"bottom":["113.3"],"standard":["113.5"]},{"0":["27.1","56.1","64.0","90.0","92.1","113.1"],"1":["64.0","72.3","83.0","92.3","105.0"],"2":["72.4","75.0","92.5","116.0"],"4":["70.1","70.2","76.0","89.1","89.2","98.0","111.1","111.2","118.0"],"5":["90.0"],"10":["61.9","61.11"],"11":["61.1","61.2","68.0"],"20":["80.23","80.45","80.57","102.5","102.27"],"21":["80.1","80.2","80.12","80.36","102.18"],"35":["95.0"],"2020":["61.2","61.4","61.12"],"3603":["46.0"],"incrementals":["0.0","23.6","55.6"],"appeal":["0.0","25.2","53.2"],"developers":["0.0","22.1","22.3","54.1","54.3","73.0","114.0"],"players":["0.0","25.2","53.2"],"defining":["0.0"],"genre":["0.0","22.0","24.2","54.0","57.2"],"navigating":["0.0"],"criticism":["0.0"],"what":["0.0","23.0","23.6","24.6","24.7","55.0","55.6","57.6","57.7"],"is":["0.0","17.0","22.2","24.8","24.9","27.4","29.0","42.0","54.2","56.4","57.8","57.9","70.0","72.6","74.0","80.17","80.18","80.27","80.54","89.0","92.7","94.0","102.9","102.36","111.0","113.7","115.0"],"kronos":["0.0"],"logseq":["0.0"],"matrix":["0.0"],"mbin":["0.0"],"my":["0.0","35.1"],"personal":["0.0","13.0"],"website":["0.0","45.3"],"projects":["0.0","9.0","37.0"],"nostr":["0.0"],"that":["2.0","16.0","24.0","44.0","45.2","47.0","57.0","72.2","81.2","103.2","103.4"],"unlocked":["2.0","72.3","74.0","77.0","80.17","82.0","85.0","86.0","87.0","94.0","99.0","104.0","115.0","119.0"],"new":["2.0","12.0","15.4","22.1","22.2","54.1","54.2","80.33","80.52","102.15","102.34","103.0"],"pieces":["2.0"],"content":["2.0","24.6","45.3","57.6"],"every":["2.0","27.1","46.0","56.1","72.5","113.6"],"real":["2.0"],"life":["2.0","24.1","57.1"],"day":["2.0","46.0"],"a":["2.0","13.0","15.3","19.0","26.2","28.0","34.0","40.0","45.1","52.2","62.1","80.47","102.29","113.3"],"couple":["2.0"],"days":["2.0"],"before":["2.0","24.6","57.6","80.17","88.0","95.0"],"social":["3.0","9.0"],"media":["3.0","9.0","16.0","38.1"],"currently":["3.0","80.34","102.16"],"only":["3.0","23.1","55.1","72.2","80.34","92.2","102.16","113.2"],"used":["3.0","72.6","80.43","81.3","102.25"],"it":["4.0","15.2","18.0","24.4","38.2","43.0","57.4","59.0","68.0","72.3","78.0","80.19","89.1","92.7","100.0","102.1","109.0","111.1","113.7"],"out":["4.0","15.2","23.1","55.1","64.0","83.0","105.0"],"from":["4.0","15.3","22.3","24.0","26.1","45.4","52.1","54.3","57.0","62.0","82.0","86.0","97.3","104.0","108.0","113.5","117.3"],"its":["4.0","72.0","88.0","110.0"],"github":["4.0"],"repository":["4.0"],"inspired":["4.0"],"puppet":["4.0"],"pals":["4.0"],"robert":["4.0"],"moran":["4.0"],"intended":["4.0","23.5","55.5"],"game":["5.0","22.3","23.1","23.4","25.1","35.0","49.0","53.1","54.3","55.1","55.4","70.2","72.5","113.6"],"by":["5.0","23.1","23.2","24.8","26.1","47.0","49.0","52.1","55.1","55.2","57.8","67.0","72.0","72.1","77.0","99.0","119.0"],"anthony":["5.0"],"lawn":["5.0"],"and":["5.0","11.0","23.4","35.1","43.0","45.0","55.4","60.0","64.0","80.9","80.54","83.0","97.1","102.36","105.0","117.1"],"grant":["5.0"],"system":["6.0","80.28","102.10"],"designed":["6.0"],"to":["6.0","11.0","18.0","25.3","39.0","41.0","43.0","44.0","51.0","53.3","61.5","61.10","72.4","80.5","80.9","80.29","92.5","102.11","113.5"],"solve":["6.0"],"anything":["7.0","15.4"],"with":["7.0","24.0","24.11","26.3","27.4","37.0","52.3","56.4","57.0","57.11","62.0","72.6","73.0","80.33","80.37","92.0","92.2","92.4","92.7","93.0","102.15","102.19","113.0","113.4","113.7","114.0"],"timeline":["7.0"],"feed":["7.0"],"considered":["7.0","22.3","24.9","54.3","57.9"],"even":["7.0","12.0","15.3","15.5","24.3","27.3","56.3","57.3","80.15","81.4"],"if":["7.0","12.0","24.1","57.1","59.0","64.0","72.3","78.0","80.18","80.20","80.34","83.0","100.0","102.2","102.16","103.0","105.0"],"an":["8.0","24.9","25.0","27.1","42.0","53.0","56.1","57.9","72.6","74.0","80.15","80.34","81.2","92.2","92.7","94.0","97.3","102.16","103.2","113.7","115.0","117.3"],"open":["8.0","70.1"],"issues":["9.0","80.27","102.9"],"of":["9.0","15.2","40.0","45.2","45.3","70.1","74.0","76.0","80.21","80.35","80.38","89.1","94.0","97.0","98.0","102.3","102.17","102.20","111.1","115.0","117.0","118.0"],"modern":["9.0"],"etc":["9.0","22.1","23.6","54.1","55.6","80.6","90.0","109.0"],"how":["9.0","15.5","23.3","24.0","27.0","45.5","55.3","56.0","57.0","113.3"],"can":["9.0","15.4","16.0","23.1","26.0","26.1","27.0","38.2","43.0","45.5","50.0","52.0","52.1","55.1","56.0","62.2","72.4","80.41","80.44","80.50","80.51","80.55","81.2","81.3","92.5","102.23","102.26","102.32","102.33","103.2","103.3"],"improved":["9.0","80.13","80.33","102.15"],"or":["9.0","15.5","18.0","22.3","23.6","45.2","54.3","55.6","70.1","81.3","82.0","89.1","89.2","90.0","92.0","104.0","107.0","111.1","111.2","113.0"],"related":["9.0","80.40","102.22"],"also":["9.0","72.3","80.47","92.3","102.29"],"parable":["10.0"],"causes":["11.0"],"trend":["11.0"],"towards":["11.0","24.5","57.5"],"handful":["11.0"],"large":["11.0","80.34","81.0","102.16","103.0"],"strategies":["12.0"],"prioritized":["12.0"],"list":["12.0","72.4","92.5","97.3","113.5","117.3"],"when":["12.0","18.0","23.5","27.4","55.5","56.4","80.38","80.46","99.0","102.20","102.28"],"turn":["12.0"],"they":["12.0","24.1","24.3","57.1","57.3","80.5","80.34","80.47","88.0","102.16","102.29"],"go":["12.0","24.1","57.1"],"strategy":["12.0","24.0","24.4","57.0","57.4"],"check":["12.0"],"run":["12.0"],"then":["12.0","24.1","57.1","70.1","89.1","111.1"],"performs":["12.0"],"starts":["12.0","80.37","102.19"],"back":["12.0"],"sign":["12.0"],"under":["12.0","23.3","55.3"],"opens":["12.0"],"organized":["12.0"],"dropdown":["12.0"],"various":["12.0"],"simulator":["12.0"],"addition":["12.0"],"inspector":["12.0"],"code":["12.0","62.0","96.0"],"tools":["12.0"],"our":["12.0"],"will":["12.0","15.6","23.2","24.3","24.6","30.0","55.2","57.3","57.6","62.0","68.0","72.1","75.0","80.4","80.17","80.20","88.0","92.1","92.6","102.2","113.1","113.5"],"take":["12.0","15.0","80.41","102.23"],"simulate":["12.0"],"arbitrary":["12.0"],"number":["12.0","64.0","67.0","72.1","77.0","81.0","83.0","105.0"],"duels":["12.0"],"between":["12.0","13.0","24.3","57.3","73.0","80.35","92.7","102.17","113.7","114.0"],"output":["12.0"],"results":["12.0"],"summarize":["12.0"],"much":["12.0","26.3","52.3","73.0","80.18","113.3"],"quicker":["12.0"],"than":["12.0","23.1","23.6","26.3","52.3","55.1","55.6"],"manually":["12.0"],"blogs":["13.0"],"exist":["13.0"],"in":["13.0","15.4","22.1","25.1","30.0","51.0","53.1","54.1","72.0","74.0","80.50","94.0","102.32","109.0","115.0"],"middleground":["13.0"],"dark":["13.0"],"indieweb":["14.0"],"supported":["14.0"],"rauthy":["14.0"],"which":["14.0","23.5","55.5","70.0","72.1","75.0","80.43","89.0","92.1","102.25","111.0","113.1"],"community":["14.0","22.2","54.2"],"endorses":["14.0"],"self":["14.0"],"on":["15.0","23.5","24.10","26.1","26.2","35.1","45.5","52.1","52.2","55.5","57.10","60.0","65.0","72.1","74.0","80.27","80.54","84.0","85.0","92.1","94.0","102.9","102.36","106.0","107.0","113.1","115.0"],"direct":["15.1"],"their":["15.1","24.2","24.3","27.3","56.3","57.2","57.3","73.0","93.0","114.0"],"messages":["15.1"],"single":["15.1","69.0"],"user":["15.1"],"mastodon":["15.1"],"instance":["15.1","41.0"],"bad":["15.1","64.0","83.0","105.0"],"idea":["15.1"],"focuses":["15.1"],"chain":["15.2"],"authoritative":["15.2"],"hub":["15.2","31.0"],"e":["15.2","69.0"],"g":["15.2","69.0"],"white":["15.2"],"house":["15.2"],"ran":["15.2"],"verifies":["15.2"],"president":["15.2"],"congress":["15.2"],"typically":["15.2","24.7","45.0","57.7"],"wouldn":["15.2"],"t":["15.2","15.6","20.0","24.0","45.0","57.0","62.0","70.2"],"reach":["15.2","23.2","55.2"],"replies":["15.3","15.4"],"this":["15.3","24.4","24.8","24.10","57.4","57.8","57.10","80.16","81.0","99.0","119.0"],"way":["15.3","24.1","57.1","80.26","102.8"],"need":["15.3","24.0","27.2","56.2","57.0","72.6","80.17","92.7","113.7"],"know":["15.3","25.1","53.1"],"where":["15.3","72.1","92.1","113.1"],"given":["15.3"],"message":["15.3"],"originated":["15.3"],"private":["15.3"],"could":["15.3","27.1","56.1","80.5","96.0","116.0"],"itself":["15.4"],"be":["15.4","24.0","24.9","27.0","30.0","45.3","45.5","56.0","57.0","57.9","62.2","72.2","72.4","80.15","80.20","80.43","80.44","80.51","81.3","92.5","96.0","102.2","102.25","102.26","102.33","102.38","103.3","116.0"],"replied":["15.4"],"using":["15.4","72.0","72.1","80.43","92.1","102.25","113.1"],"parent":["15.4"],"property":["15.4"],"post":["15.4"],"edits":["15.4"],"handled":["15.4"],"reported":["15.5"],"reply":["15.5"],"make":["15.5","27.1","27.4","51.0","56.1","56.4","62.2","72.3","80.29","80.52","90.0","92.3","102.11","102.34","103.3"],"anonymous":["15.5"],"reports":["15.5"],"users":["15.5"],"without":["15.5"],"matching":["15.5"],"unlikely":["15.6"],"server":["15.6"],"doesn":["15.6"],"subscribe":["15.6"],"illegal":["15.6"],"material":["15.6","25.0","53.0"],"likely":["15.6","76.0","85.0","87.0","98.0","118.0"],"websites":["16.0"],"all":["16.0","23.3","26.1","52.1","55.3","72.0","72.4","80.15","81.2","92.5","97.3","103.2","113.5","117.3"],"was":["18.0","20.0","72.3"],"created":["18.0"],"edited":["18.0"],"part":["18.0","27.3","44.0","56.3","80.16"],"describes":["19.0","21.0"],"shape":["20.0"],"tycoon":["20.0"],"i":["20.0","24.2","24.6","25.0","27.0","53.0","56.0","57.2","57.6","73.0","80.24","102.6","114.0"],"don":["20.0","70.2"],"useful":["21.0","26.3","52.3","72.1","92.1","110.0","113.1"],"feeds":["21.0"],"are":["21.0","45.0","72.1","80.11","81.0","92.1","103.0","113.1","113.2"],"not":["21.0","23.3","55.3","80.17","85.0","99.0","119.0"],"fit":["21.0"],"gardening":["21.0"],"seems":["22.0","54.0"],"draw":["22.0","54.0"],"uniquely":["22.1","54.1"],"implement":["22.1","54.1"],"normal":["22.1","54.1","96.0"],"web":["22.1","34.0","40.0","54.1"],"page":["22.1","35.1","45.5","54.1","97.1","117.1"],"no":["22.1","24.8","27.1","54.1","56.1","57.8","80.17"],"worry":["22.1","54.1"],"about":["22.1","50.0","54.1"],"rendering":["22.1","54.1"],"sprites":["22.1","54.1"],"moving":["22.1","54.1"],"them":["22.1","23.0","23.3","24.8","26.1","27.4","52.1","54.1","55.0","55.3","56.4","57.8","62.2","72.1","72.5","80.29","81.4","92.1","102.11","103.3","113.1","113.6"],"around":["22.1","22.2","54.1","54.2"],"implementing":["22.1","54.1"],"physics":["22.1","54.1"],"thousands":["22.2","54.2"],"plays":["22.2","54.2"],"incremental":["22.2","35.2","54.2"],"games":["22.2","23.0","40.0","54.2","55.0"],"mostly":["22.2","54.2"],"centers":["22.2","40.0","54.2"],"r":["22.2","24.1","54.2","57.1"],"always":["22.2","54.2","80.22","102.4"],"looking":["22.2","54.2"],"for":["22.2","23.6","30.0","40.0","41.0","45.1","45.3","54.2","55.6","60.0","80.10","80.15","80.49","96.0","102.31"],"available":["22.3","54.3"],"hobbyist":["22.3","54.3"],"there":["22.3","24.7","27.4","54.3","56.4","57.7","66.0","80.18","96.0","107.0","116.0"],"exceptions":["22.3","54.3"],"paid":["22.3","54.3"],"fine":["22.3","54.3"],"increlution":["22.3","54.3"],"stuck":["22.3","54.3"],"time":["22.3","54.3","62.0","72.5","92.6","113.6"],"donation":["22.3","54.3"],"ware":["22.3","54.3"],"kittens":["22.3","54.3"],"down":["23.0","55.0"],"due":["23.0","24.3","55.0","57.3"],"drawing":["23.0","55.0"],"negative":["23.0","55.0"],"attention":["23.0","55.0"],"made":["23.0","55.0"],"me":["23.0","55.0","68.0"],"think":["23.0","26.2","27.0","52.2","55.0","56.0","70.0","89.0","111.0"],"interesting":["23.0","55.0"],"arguments":["23.0","55.0"],"makes":["23.0","24.2","55.0","57.2"],"good":["23.0","23.2","27.2","55.0","55.2","56.2","93.0"],"s":["23.0","26.0","40.0","41.0","52.0","55.0","62.0","80.48","80.54","92.7","102.30","102.36","113.7"],"argument":["23.0","27.2","55.0","56.2"],"argued":["23.1","55.1"],"have":["23.1","24.7","24.10","45.0","55.1","57.7","57.10","70.1","80.24","80.34","81.0","89.1","92.0","102.6","102.16","111.1","113.0"],"comparatively":["23.1","55.1"],"low":["23.1","23.5","55.1","55.5"],"depth":["23.1","55.1"],"combat":["23.1","24.2","55.1","57.2"],"compared":["23.1","55.1"],"many":["23.1","55.1","72.2","81.0","103.0","113.2"],"other":["23.1","24.1","25.0","27.2","53.0","55.1","56.2","57.1","62.0","80.33","86.0","92.0","99.0","102.15","113.0","119.0"],"d":["23.1","27.0","55.1","56.0"],"argue":["23.1","55.1"],"has":["23.1","55.1","75.0","116.0"],"sufficient":["23.1","55.1"],"more":["23.1","23.6","24.0","24.1","26.3","40.0","52.3","55.1","55.6","57.0","57.1","80.9","80.40","102.22"],"someone":["23.1","55.1"],"expect":["23.1","55.1"],"who":["23.1","23.5","55.1","55.5"],"played":["23.1","55.1"],"short":["23.1","55.1"],"while":["23.1","26.0","52.0","55.1","80.48","102.30"],"still":["23.1","30.0","41.0","55.1","80.41","102.23"],"definitely":["23.1","55.1"],"gets":["23.1","24.6","27.2","55.1","56.2","57.6","92.3","93.0","113.3"],"beat":["23.1","55.1","67.0"],"focused":["23.1","26.2","52.2","55.1"],"scene":["23.2","55.2"],"get":["23.2","26.2","45.4","52.2","55.2"],"becomes":["23.2","55.2"],"effortless":["23.2","55.2"],"allows":["23.2","55.2"],"point":["23.2","24.2","27.2","55.2","56.2","57.2","72.6","92.7","113.7"],"earlier":["23.2","24.8","55.2","57.8","80.37","102.19"],"isn":["23.2","24.7","55.2","57.7"],"any":["23.2","24.0","24.1","47.0","55.2","57.0","57.1","72.0"],"less":["23.2","23.6","55.2","55.6"],"legitimate":["23.2","23.6","55.2","55.6"],"rather":["23.2","55.2"],"lowers":["23.2","55.2"],"barrier":["23.2","55.2"],"entry":["23.2","55.2","72.4","92.5","97.3","113.5","117.3"],"allowing":["23.2","24.4","24.6","55.2","57.4","57.6","88.0"],"people":["23.2","55.2"],"really":["23.2","55.2","103.0"],"clear":["23.2","55.2"],"vampire":["23.2","55.2"],"survivors":["23.2","55.2"],"trivially":["23.2","55.2"],"extent":["23.2","55.2"],"spawn":["23.3","55.3"],"conditions":["23.3","55.3"],"best":["23.3","24.2","55.3","57.2","80.29","88.0","102.11"],"handle":["23.3","55.3"],"note":["23.3","25.0","53.0","55.3"],"same":["23.3","50.0","55.3"],"difficulty":["23.3","55.3"],"as":["23.3","23.5","23.6","24.4","27.1","47.0","55.3","55.5","55.6","56.1","57.4","66.0","73.0","74.0","80.39","88.0","90.0","94.0","97.1","102.21","107.0","115.0","117.1"],"well":["23.3","47.0","55.3","62.3","80.39","88.0","90.0","102.21"],"these":["23.4","27.3","45.0","55.4","56.3","64.0","83.0","105.0"],"upset":["23.4","55.4"],"change":["23.4","55.4","97.0","117.0"],"trying":["23.5","27.1","55.5","56.1"],"give":["23.5","27.3","27.4","55.5","56.3","56.4","81.2","103.2"],"player":["23.5","24.3","24.8","27.2","55.5","56.2","57.3","57.8","72.5","80.15","84.0","90.0","113.6"],"immersing":["23.5","55.5"],"themselves":["23.5","55.5"],"guy":["23.5","55.5"],"would":["23.5","24.0","24.7","55.5","57.0","57.7"],"hide":["23.5","55.5"],"behind":["23.5","55.5"],"cover":["23.5","55.5"],"great":["23.5","55.5"],"job":["23.5","55.5"],"at":["23.5","55.5","73.0","80.40","80.46","92.1","93.0","102.22","102.28","109.0","113.1","114.0"],"encouraging":["23.5","55.5"],"effectively":["23.5","55.5","89.2","111.2"],"teaching":["23.5","55.5"],"behave":["23.5","55.5"],"properly":["23.5","55.5"],"sharp":["23.5","55.5"],"contrast":["23.5","55.5"],"shooters":["23.5","55.5"],"call":["23.5","55.5","68.0"],"duty":["23.5","55.5"],"regen":["23.5","55.5"],"passively":["23.5","55.5"],"label":["23.6","55.6"],"because":["23.6","24.0","27.3","55.6","56.3","57.0","70.0","89.0","111.0"],"perceived":["23.6","55.6"],"worth":["23.6","55.6"],"most":["23.6","46.0","55.6","62.0","80.46","102.28"],"consumed":["23.6","55.6"],"ease":["23.6","55.6"],"vs":["23.6","55.6"],"painting":["23.6","55.6"],"movie":["23.6","55.6"],"sculpture":["23.6","55.6"],"lot":["23.6","55.6"],"narrative":["23.6","55.6"],"context":["23.6","55.6"],"similarly":["23.6","24.1","55.6","57.1"],"qualify":["23.6","55.6"],"cookie":["23.6","55.6"],"clicker":["23.6","55.6"],"specific":["24.0","24.4","57.0","57.4"],"definition":["24.0","27.0","56.0","57.0"],"similar":["24.0","24.3","57.0","57.3"],"mean":["24.0","57.0"],"amount":["24.0","57.0","67.0","80.21","88.0","90.0","102.3"],"specifically":["24.0","57.0"],"differentiates":["24.0","57.0"],"stance":["24.1","57.1"],"some":["24.1","25.1","53.1","57.1","80.24","102.6"],"level":["24.1","57.1"],"manipulating":["24.1","57.1"],"giving":["24.1","27.2","56.2","57.1"],"dopamine":["24.1","57.1"],"rewards":["24.1","57.1"],"manipulates":["24.1","57.1"],"necessarily":["24.1","57.1"],"value":["24.1","57.1","64.0","66.0","67.0","69.0","72.0","74.0","81.0","82.0","83.0","86.0","87.0","90.0","92.3","92.6","94.0","104.0","105.0","107.0","108.0","109.0","113.3","115.0"],"fulfillment":["24.1","57.1"],"plainly":["24.1","57.1"],"display":["24.1","38.1","57.1","67.0","68.0","72.0","77.0","80.40","80.46","80.51","86.0","90.0","102.22","102.28","102.33","108.0","109.0"],"manipulative":["24.1","57.1"],"forefront":["24.1","57.1"],"fun":["24.1","57.1"],"healthy":["24.1","57.1"],"certain":["24.1","57.1"],"contexts":["24.1","57.1"],"exacerbate":["24.1","57.1"],"video":["24.1","38.1","57.1"],"addiction":["24.1","57.1"],"feel":["24.1","26.0","52.0","57.1"],"priority":["24.1","57.1"],"over":["24.1","57.1","63.0"],"things":["24.1","57.1","80.24","80.33","80.40","102.6","102.15","102.22"],"your":["24.1","45.3","57.1","103.4"],"sleep":["24.1","57.1"],"schedule":["24.1","57.1"],"prudent":["24.1","57.1"],"seek":["24.1","57.1"],"help":["24.1","57.1"],"stopgaming":["24.1","57.1"],"resources":["24.1","57.1"],"undressing":["24.1","57.1"],"tends":["24.1","26.3","52.3","57.1"],"hand":["24.1","57.1"],"line":["24.2","57.2","80.51","97.3","102.33","113.5","117.3"],"blurred":["24.2","57.2"],"own":["24.2","26.1","52.1","57.2","73.0","93.0","114.0"],"sake":["24.2","57.2"],"versus":["24.2","57.2"],"contextual":["24.2","57.2"],"reason":["24.2","57.2"],"believe":["24.2","24.3","57.2","57.3"],"illustrated":["24.2","57.2"],"sub":["24.2","57.2"],"relates":["24.2","57.2"],"perform":["24.2","57.2","81.0"],"automatically":["24.2","24.8","57.2","57.8","83.0","105.0"],"does":["24.2","57.2"],"support":["24.2","57.2"],"state":["24.3","24.7","57.3","57.7"],"do":["24.3","26.0","27.4","41.0","52.0","56.4","57.3","59.0","78.0","100.0"],"two":["24.3","57.3"],"genres":["24.3","27.3","56.3","57.3"],"unrelated":["24.3","57.3"],"significant":["24.3","57.3"],"overlap":["24.3","57.3"],"bases":["24.3","57.3"],"having":["24.3","24.8","57.3","57.8"],"roguelike":["24.4","57.4"],"very":["24.4","26.0","27.3","52.0","56.3","57.4"],"lenient":["24.4","57.4"],"present":["24.4","57.4","68.0","97.1","117.1"],"factor":["24.4","24.8","57.4","57.8"],"so":["24.4","26.3","38.2","52.3","57.4","80.34","102.16"],"long":["24.4","30.0","57.4","93.0"],"shows":["24.4","38.1","57.4","80.21","102.3"],"enough":["24.4","27.2","56.2","57.4","73.0"],"accounts":["24.4","57.4"],"blurriness":["24.4","57.4"],"realm":["24.5","57.5"],"grinder":["24.5","57.5"],"synergism":["24.5","57.5"],"universal":["24.5","57.5"],"paperclips":["24.5","57.5"],"learn":["24.5","45.5","57.5"],"fly":["24.5","57.5"],"hades":["24.5","57.5"],"just":["24.5","27.1","27.2","56.1","56.2","57.5","67.0","77.0","86.0","97.2","108.0","117.2"],"kidding":["24.5","57.5"],"chose":["24.5","57.5"],"variety":["24.5","57.5"],"biasing":["24.5","57.5"],"newer":["24.5","57.5"],"mystery":["24.6","57.6"],"anticipating":["24.6","57.6"],"happen":["24.6","24.8","57.6","57.8"],"next":["24.6","57.6","72.6","92.7","113.7"],"shake":["24.6","57.6"],"up":["24.6","38.2","45.2","57.6","80.22","102.4"],"stale":["24.6","57.6"],"entertain":["24.6","57.6"],"longer":["24.6","24.8","57.6","57.8","80.17"],"guide":["24.6","57.6"],"dissipates":["24.6","57.6"],"canon":["24.6","57.6"],"selected":["24.6","57.6"],"above":["24.6","57.6","68.0"],"textual":["24.7","57.7"],"presentation":["24.7","57.7"],"visual":["24.7","57.7"],"representation":["24.7","57.7"],"entities":["24.7","57.7"],"within":["24.7","57.7"],"interface":["24.7","57.7"],"closer":["24.7","57.7"],"automation":["24.8","57.8","80.37","102.19"],"progresses":["24.8","57.8"],"often":["24.8","24.10","57.8","57.10"],"deal":["24.8","57.8"],"mechanics":["24.8","27.3","56.3","57.8"],"either":["24.8","25.1","27.3","53.1","56.3","57.8"],"say":["24.9","57.9","76.0","88.0","98.0","118.0"],"whether":["24.9","57.9","68.0"],"roguelite":["24.9","57.9"],"meta":["24.9","57.9"],"fall":["24.10","57.10"],"into":["24.10","26.0","52.0","57.10","76.0","98.0","118.0"],"itrtg":["24.10","57.10"],"like":["24.10","27.0","56.0","57.10","92.2","97.2","117.2"],"based":["24.10","57.10","65.0","84.0","87.0","88.0","106.0"],"clearing":["24.10","57.10"],"increasingly":["24.10","57.10"],"difficult":["24.10","57.10"],"battles":["24.10","57.10"],"tend":["24.10","57.10"],"being":["24.11","57.11","80.32","102.14"],"fantasy":["24.11","57.11"],"world":["24.11","57.11"],"creators":["25.0","43.0","53.0"],"relevant":["25.0","50.0","53.0"],"contextualize":["25.0","27.3","53.0","56.3"],"everything":["25.0","53.0","66.0","85.0","87.0","107.0"],"incomplete":["25.0","53.0"],"document":["25.0","53.0"],"but":["25.1","53.1","59.0","66.0","78.0","80.41","80.47","100.0","102.23","102.29","107.0"],"formal":["25.1","53.1"],"education":["25.1","53.1"],"development":["25.1","30.0","51.0","53.1"],"soul":["26.0","52.0"],"natural":["26.0","52.0"],"vulnerable":["26.0","52.0"],"communities":["26.0","52.0"],"ensure":["26.0","52.0"],"try":["26.1","27.4","52.1","56.4"],"internalize":["26.1","52.1"],"instead":["26.1","27.2","27.3","52.1","56.2","56.3","72.1","72.3","81.0","92.1","92.3","97.1","113.1","117.1"],"focus":["26.1","52.1"],"distancing":["26.1","52.1"],"identity":["26.1","52.1"],"work":["26.1","52.1"],"emotionally":["26.1","52.1"],"better":["26.1","52.1","80.33","102.15"],"analyze":["26.1","52.1"],"use":["26.1","52.1","72.5","80.50","81.4","85.0","92.6","102.32","107.0","113.6"],"advantage":["26.1","52.1"],"important":["26.2","52.2"],"diverse":["26.2","45.0","52.2"],"set":["26.2","52.2","72.5","75.0","86.0","99.0","113.6","116.0","119.0"],"enjoy":["26.2","52.2"],"stick":["26.3","52.3"],"us":["26.3","52.3"],"prominently":["26.3","52.3"],"explore":["27.0","56.0"],"counts":["27.0","56.0"],"we":["27.0","56.0"],"measure":["27.0","56.0"],"baseline":["27.0","56.0"],"described":["27.0","56.0"],"parts":["27.0","56.0"],"m":["27.1","46.0","56.1"],"here":["27.1","56.1","60.0","96.0","116.0"],"extreme":["27.1","56.1"],"example":["27.1","27.4","56.1","56.4"],"interactions":["27.1","56.1"],"counter":["27.1","56.1"],"goes":["27.1","56.1","64.0","83.0","105.0"],"second":["27.1","56.1","75.0","116.0"],"safely":["27.1","56.1"],"said":["27.1","56.1"],"beyond":["27.1","56.1"],"5x":["27.2","56.2"],"step":["27.2","56.2"],"10x":["27.2","56.2"],"punishes":["27.2","56.2"],"progression":["27.2","56.2"],"wise":["27.2","56.2"],"whenever":["27.2","56.2"],"forget":["27.2","56.2"],"max":["27.2","56.2","80.30","90.0","102.12"],"again":["27.2","56.2","70.2"],"eventually":["27.2","56.2"],"automated":["27.2","56.2"],"reward":["27.2","27.3","56.2","56.3","63.0","104.0"],"progress":["27.2","56.2"],"voice":["27.2","56.2"],"side":["27.2","56.2","72.1","92.1","113.1"],"acamaeda":["27.2","56.2"],"defended":["27.2","56.2"],"multiplier":["27.2","56.2"],"upgrade":["27.2","56.2"],"understand":["27.2","56.2"],"clarify":["27.2","56.2"],"framework":["27.3","56.3"],"introducing":["27.3","56.3"],"automating":["27.3","56.3"],"old":["27.3","56.3"],"enjoyable":["27.3","56.3"],"nearly":["27.3","56.3"],"nonexistent":["27.3","56.3"],"going":["27.3","56.3"],"platformer":["27.3","56.3"],"automate":["27.3","56.3","92.6"],"jumping":["27.3","56.3"],"core":["27.3","56.3"],"platformers":["27.3","56.3"],"add":["27.3","56.3","80.9"],"build":["27.3","56.3"],"least":["27.3","56.3"],"however":["27.3","56.3"],"frequently":["27.3","56.3"],"means":["27.3","56.3","81.0","103.0"],"replacing":["27.3","56.3"],"opposed":["27.3","56.3"],"augmenting":["27.3","56.3"],"admittedly":["27.3","56.3"],"paragraph":["27.3","56.3"],"ignores":["27.3","56.3"],"obvious":["27.3","56.3"],"answer":["27.3","56.3"],"separates":["27.3","56.3"],"regard":["27.3","56.3"],"chores":["27.3","56.3"],"frequency":["27.3","56.3"],"increases":["27.3","56.3"],"sense":["27.3","56.3"],"seen":["27.3","56.3"],"sure":["27.4","56.4"],"unlock":["27.4","56.4","72.3","92.3"],"immediately":["27.4","56.4","80.19","102.1"],"something":["27.4","46.0","56.4","92.4","113.4"],"the":["27.4","45.3","56.4","62.2","80.13","80.21","80.31","80.32","80.38","81.4","102.3","102.13","102.14","102.20","103.3"],"perhaps":["27.4","56.4"],"fediverse":["28.0","33.0"],"hosted":["28.0"],"synapse":["32.0","37.0"],"source":["33.0","45.3"],"dev":["35.0"],"tree":["35.0","61.3","72.1","73.0","80.46","92.1","93.0","97.3","102.28","113.1","114.0","117.3"],"find":["35.1"],"itch":["35.1"],"io":["35.1"],"profectus":["37.0"],"vitepress":["37.0"],"weird":["37.0"],"project":["38.0"],"originally":["38.0"],"built":["38.0"],"autoplay":["38.1"],"clipboard":["38.1"],"write":["38.1"],"encrypted":["38.1"],"gyroscope":["38.1"],"picture":["38.1"],"allowfullscreen":["38.1"],"style":["38.1","71.0","91.0","95.0","112.0"],"block":["38.1"],"margin":["38.1"],"auto":["38.1"],"talker":["38.1"],"wave":["38.1"],"sensors":["38.1"],"placed":["38.1"],"general":["38.2"],"cleaning":["38.2"],"tech":["38.2"],"debt":["38.2"],"easily":["38.2"],"show":["39.0","47.0","68.0","80.34","102.16"],"off":["39.0","72.1","92.1","113.1"],"dynamic":["39.0","72.0","90.0"],"template":["40.0"],"making":["40.0"],"hard":["41.0","70.0","89.0","111.0"],"everyone":["41.0"],"subject":["41.0"],"moderation":["41.0"],"limitations":["41.0"],"consumers":["43.0"],"apply":["43.0","71.0","91.0","95.0","112.0"],"pages":["45.0"],"won":["45.0","62.0"],"ads":["45.0"],"search":["45.1"],"engine":["45.1"],"site":["45.2"],"builders":["45.2"],"templates":["45.2"],"end":["45.2"],"truth":["45.3"],"posted":["45.3"],"notifications":["45.4"],"extensive":["45.5"],"hosting":["45.5"],"expensive":["45.5"],"com":["45.6"],"embed":["45.6","81.4"],"00qwzmmrtok":["45.6"],"title":["45.6","47.0","70.2","89.2","109.0","111.2"],"frameborder":["45.6"],"id":["46.0","80.47","102.29"],"6637b86a":["46.0"],"45ef":["46.0"],"a21e":["46.0"],"b33c7d96c529":["46.0"],"writing":["46.0"],"essentially":["46.0"],"fps":["47.0"],"debug":["47.0","61.7"],"console":["47.0"],"typing":["47.0"],"grave":["47.0"],"key":["47.0","70.0","89.0","111.0"],"default":["47.0","63.0","66.0","67.0","77.0","80.30","85.0","86.0","90.0","102.12","107.0","108.0"],"screen":["47.0","80.25","80.32","80.46","102.7","102.14","102.28"],"detects":["47.0"],"chatting":["50.0"],"multiple":["50.0","67.0","72.2","77.0","82.0","86.0","87.0","104.0","108.0","109.0"],"contain":["50.0"],"room":["50.0"],"share":["50.0"],"aims":["51.0"],"creating":["51.0"],"needs":["59.0","66.0","78.0","100.0","107.0"],"function":["59.0","68.0","72.0","72.5","78.0","100.0","109.0","113.3","113.6"],"supplied":["59.0","78.0","100.0"],"should":["59.0","73.0","78.0","88.0","93.0","100.0","114.0"],"copy":["60.0","70.1","89.1","111.1"],"pasting":["60.0"],"look":["60.0"],"tutorial":["60.0"],"changelog":["61.0","93.0","114.0"],"09":["61.1"],"fixed":["61.1","61.3","80.1","80.6","80.14","80.27","80.30","80.42","80.45","102.9","102.12","102.24","102.27"],"08":["61.3"],"rebalanced":["61.4"],"text":["61.5","68.0","80.25","87.0","95.0","102.7","109.0"],"lore":["61.5"],"styled":["61.6"],"basically":["61.6"],"removed":["61.7"],"typos":["61.8"],"minor":["61.8"],"issue":["61.10"],"unique":["62.0","70.2"],"prevent":["62.0"],"mod":["62.0"],"saves":["62.0","89.2","111.2"],"conflicting":["62.0"],"mods":["62.0"],"dive":["62.0"],"deep":["62.0"],"create":["62.0","80.5"],"components":["62.1","103.0"],"minimal":["62.1"],"features":["62.1","80.46","90.0","102.28"],"explanations":["62.1"],"option":["62.2","103.3"],"respec":["62.2","80.11","103.3"],"able":["62.2","81.3","103.3"],"vertical":["62.3"],"subtabs":["62.3","80.13","92.2"],"microtabs":["62.3","92.2","113.2"],"boolean":["63.0","92.6"],"tooltip":["63.0"],"appears":["63.0","72.1","76.0","92.1","98.0","113.1","118.0"],"hovered":["63.0"],"convey":["63.0","104.0"],"completing":["63.0","104.0"],"effect":["63.0","66.0","82.0","104.0","107.0"],"calculates":["63.0","66.0","82.0","86.0","87.0","104.0","107.0","108.0","109.0"],"empty":["64.0","83.0","105.0"],"full":["64.0","83.0","86.0","99.0","105.0","119.0"],"nothing":["64.0","83.0","105.0"],"happens":["64.0","83.0","105.0"],"bounds":["64.0","83.0","105.0"],"decimal":["64.0","67.0","72.3","73.0","77.0","81.0","83.0","92.3","93.0","103.0","105.0","113.3","114.0"],"optional":["64.0","71.0","72.6","74.0","91.0","92.7","94.0","109.0","112.0","113.7","115.0"],"row":["65.0","69.0","106.0","110.0","113.1"],"first":["65.0","72.3","75.0","84.0","106.0","116.0"],"baseresource":["65.0","84.0","106.0"],"gain":["65.0","72.1","84.0","88.0","106.0"],"baseamount":["65.0","84.0","113.3"],"1th":["66.0","107.0"],"object":["66.0","67.0","82.0","86.0","104.0","107.0","108.0"],"currencies":["66.0","107.0"],"values":["66.0","81.0","82.0","86.0","87.0","88.0","92.0","103.0","104.0","107.0","108.0","109.0","113.0"],"bonuses":["66.0","82.0","86.0","87.0","104.0","107.0","108.0","109.0"],"containing":["66.0","67.0","82.0","86.0","87.0","104.0","107.0","108.0","109.0"],"returning":["66.0","77.0","85.0","87.0","99.0","107.0","119.0"],"return":["67.0","68.0","82.0","90.0","104.0","108.0","109.0"],"rewarddisplay":["67.0","86.0","108.0"],"formatting":["67.0","77.0","80.27","86.0","102.9","108.0"],"behavior":["67.0","77.0","86.0","108.0"],"appropriately":["67.0","77.0","86.0"],"formatted":["67.0","77.0","86.0"],"goal":["67.0"],"currency":["67.0","72.6","77.0","85.0","92.7","99.0","110.0","113.7","119.0"],"required":["67.0","72.3","92.3"],"points":["67.0","80.46","80.51","102.28","102.33"],"additional":["68.0"],"button":["68.0","80.16","92.4","113.4"],"appear":["68.0","72.1","74.0","75.0","80.17","92.1","94.0","97.3","113.1","113.5","115.0","117.3"],"pressing":["68.0"],"masterbuttontext":["68.0"],"press":["68.0"],"master":["68.0","76.0","98.0","118.0"],"showmasterbutton":["68.0"],"determining":["68.0"],"defaults":["68.0","92.6"],"true":["68.0","90.0","92.6"],"absent":["68.0"],"blah":["68.0","109.0"],"changes":["69.0","92.1"],"20px":["69.0"],"determines":["69.0"],"height":["69.0","95.0"],"pair":["69.0","74.0","94.0","115.0"],"width":["69.0","95.0","110.0"],"horizontally":["69.0","110.0"],"layout":["69.0","80.48","96.0","97.0","97.1","102.30","110.0","117.0","117.1"],"column":["69.0","80.53","102.35","110.0"],"vertically":["69.0","110.0"],"especially":["70.0","89.0","111.0"],"desktop":["70.0","89.0","111.0"],"lets":["70.0","80.52","86.0","89.0","95.0","99.0","102.34","111.0","119.0"],"username":["70.1","89.1","111.1"],"now":["70.1","80.50","80.56","89.1","89.2","102.32","102.38","111.1","111.2"],"probably":["70.2"],"later":["70.2"],"save":["70.2","72.5","89.2","111.2"],"reload":["70.2","89.2","111.2"],"tab":["70.2","80.35","80.48","81.2","89.2","102.17","102.30","103.2","111.2"],"info":["70.2","89.2","111.2"],"titlestyle":["71.0","91.0","112.0"],"bodystyle":["71.0","91.0","112.0"],"css":["71.0","80.56","91.0","95.0","102.38","112.0"],"almost":["72.0"],"place":["72.0"],"including":["72.0","85.0","97.0","117.0"],"affects":["72.1","92.1","113.1"],"node":["72.1","80.20","92.1","102.2","113.1"],"resets":["72.1","92.1","113.1"],"affect":["72.1","92.1","113.1"],"cause":["72.1","92.1","113.1"],"smaller":["72.1","92.1","113.1"],"achievements":["72.1","92.1","113.1"],"statistics":["72.1","92.1","113.1"],"affected":["72.1","92.1","113.1"],"unless":["72.1","92.1","113.1"],"doreset":["72.1","92.1","113.1"],"resource":["72.1","72.5","88.0","92.6","110.0","113.6"],"bought":["72.2"],"times":["72.2"],"optionally":["72.2","113.2"],"respeccable":["72.2","113.2"],"uses":["72.2","81.0","103.0","113.2"],"clickables":["72.2","80.15","92.2","113.2"],"extremely":["72.2","92.2","113.2"],"versatile":["72.2","92.2","113.2"],"generalized":["72.2","92.2","113.2"],"buttons":["72.2","74.0","80.35","92.2","94.0","102.17","113.2","115.0"],"needed":["72.3","90.0","92.3","113.3"],"harder":["72.3"],"another":["72.3","81.4","96.0","116.0"],"alternatively":["72.4","92.5","97.3","113.5","117.3"],"element":["72.4","92.5"],"separate":["72.5","113.6"],"variable":["72.5","72.6","88.0","92.7","113.6","113.7"],"layerdatareset":["72.5"],"saved":["72.5","113.6"],"update":["72.5","79.0","101.0","113.6"],"diff":["72.5","113.6"],"tick":["72.5","80.30","102.12","113.6"],"passive":["72.5","92.6","113.6"],"production":["72.5","92.6","113.6"],"base":["72.6"],"ish":["72.6","92.7","113.7"],"layers":["72.6","80.10","80.37","92.7","102.19","113.7"],"paced":["73.0"],"too":["73.0","80.18"],"ruins":["73.0"],"balance":["73.0"],"such":["73.0"],"why":["73.0","114.0"],"suggest":["73.0","114.0"],"disable":["73.0","114.0"],"initialstartpoints":["73.0","93.0","114.0"],"start":["73.0","114.0"],"version":["73.0","93.0","114.0"],"describe":["73.0","93.0","97.1","114.0","117.1"],"current":["73.0","80.54","93.0","102.36","114.0"],"num":["73.0","93.0","114.0"],"top":["73.0","80.40","80.46","93.0","102.22","102.28","109.0","114.0"],"right":["73.0","93.0","114.0"],"toggles":["74.0","94.0","115.0"],"creates":["74.0","94.0","115.0"],"toggle":["74.0","94.0","115.0"],"defined":["74.0","94.0","115.0"],"array":["74.0","94.0","97.3","115.0","117.3"],"paired":["74.0","94.0","115.0"],"items":["74.0","94.0","115.0"],"one":["74.0","85.0","94.0","115.0"],"per":["74.0","94.0","115.0"],"tabs":["75.0","103.4"],"component":["75.0","80.16"],"stuff":["75.0","116.0"],"otherstuff":["75.0","116.0"],"none":["75.0","116.0"],"branch":["76.0","98.0","118.0"],"bottom":["76.0","98.0","118.0"],"thing":["76.0","98.0","118.0"],"choose":["76.0","98.0","118.0"],"merge":["76.0","98.0","118.0"],"select":["76.0","98.0","118.0"],"upstream":["76.0","98.0","118.0"],"effectdisplay":["77.0","80.34","102.16"],"cost":["77.0"],"main":["77.0","97.2","99.0","113.3","117.2","119.0"],"prestige":["77.0","99.0","119.0"],"remote":["79.0","101.0"],"particle":["80.3"],"color":["80.3","80.31","80.47","92.5","95.0","102.13","102.29"],"feature":["80.3","80.9","80.15","80.52","102.34"],"random":["80.4"],"spot":["80.4"],"bars":["80.4","80.35","102.17"],"visually":["80.4","80.26","80.33","102.8","102.15"],"golden":["80.5"],"cookies":["80.5"],"upgrades":["80.6","80.34","102.16"],"buyables":["80.6","80.7"],"marked":["80.9"],"mark":["80.9"],"static":["80.10"],"onenter":["80.10"],"onexit":["80.10"],"confirmation":["80.11"],"settings":["80.11","80.15"],"clearer":["80.15"],"onhold":["80.15"],"layer":["80.15","80.39","80.40","102.21","102.22"],"nodes":["80.15","97.1","117.1"],"highlighted":["80.15","80.20","102.2"],"unlocking":["80.17"],"hotkeys":["80.17"],"you":["80.17","80.50","80.55","81.2","85.0","95.0","97.1","102.32","103.2","103.4","117.1"],"popup":["80.19","102.1"],"dismisses":["80.19","102.1"],"added":["80.19","80.26","80.43","80.54","102.1","102.8","102.25","102.36"],"red":["80.20","102.2"],"taking":["80.22","102.4"],"space":["80.22","81.3","102.4"],"although":["80.24","102.6"],"may":["80.24","102.6"],"missed":["80.24","102.6"],"possible":["80.25","102.7"],"fix":["80.25","80.49","102.7","102.31"],"flickering":["80.25","102.7"],"tooltips":["80.25","102.7"],"strange":["80.25","102.7"],"transitions":["80.25","102.7"],"victory":["80.25","102.7"],"configurable":["80.25","102.7"],"updating":["80.26","83.0","87.0","102.8","105.0","109.0"],"different":["80.26","81.2","102.8","103.2"],"softcap":["80.26","102.8"],"active":["80.27","102.9"],"cancomplete":["80.28","102.10"],"standard":["80.28","102.10"],"fully":["80.29","102.11"],"custom":["80.29","80.56","81.2","102.11","103.2"],"length":["80.30","102.12"],"were":["80.30","102.12"],"complete":["80.31","102.13"],"ones":["80.33","102.15"],"milestones":["80.33","102.15"],"exponents":["80.34","102.16"],"spacing":["80.35","102.17"],"determined":["80.37","102.19"],"order":["80.37","102.19"],"rowed":["80.37","102.19"],"crash":["80.38","102.20"],"caused":["80.38","102.20"],"non":["80.40","88.0","102.22"],"data":["80.40","102.22"],"hidden":["80.41","102.23"],"html":["80.42","80.50","85.0","87.0","93.0","95.0","102.24","102.32"],"challenge":["80.43","102.25"],"goals":["80.43","102.25"],"currencylocation":["80.43","102.25"],"maxticklength":["80.43","102.25"],"functions":["80.44","80.46","92.0","92.2","102.26","102.28","113.0"],"gui":["80.46","102.28"],"elements":["80.46","102.28"],"stay":["80.46","102.28"],"scrolls":["80.46","102.28"],"getter":["80.46","102.28"],"setter":["80.46","102.28"],"amounts":["80.46","102.28"],"effects":["80.46","88.0","102.28","110.0"],"big":["80.46","102.28"],"wide":["80.50","102.32"],"sec":["80.51","102.33"],"disabled":["80.51","102.33"],"h":["80.51","102.33"],"v":["80.51","102.33","103.0"],"image":["80.51","102.33"],"shouldnotify":["80.52","102.34"],"name":["80.54","102.36"],"works":["80.54","102.36"],"existing":["80.54","89.2","102.36","111.2"],"subfeatures":["80.54","102.36"],"enhancers":["80.56","81.3"],"break":["81.0","103.0"],"eternity":["81.0","103.0"],"store":["81.0","103.0"],"numbers":["81.0","88.0","103.0"],"must":["81.0","103.0"],"treated":["81.0","103.0"],"differently":["81.0","103.0"],"x":["81.0","103.0"],"plain":["81.0"],"operations":["81.0"],"properties":["81.2","103.2"],"layouts":["81.2","103.2"],"buildings":["81.3"],"put":["81.4","88.0","93.0","103.4"],"inside":["81.4","91.0","112.0"],"grids":["81.4"],"setting":["82.0","104.0"],"disables":["82.0","104.0"],"bool":["82.0","85.0","99.0","119.0"],"after":["85.0","87.0","92.6"],"description":["85.0"],"basic":["85.0","87.0","95.0"],"determine":["85.0"],"visible":["85.0","99.0","119.0"],"implements":["85.0"],"spending":["85.0"],"buymax":["85.0"],"rewardeffect":["86.0","108.0"],"fulldisplay":["86.0","119.0"],"override":["86.0","92.1","99.0","119.0"],"overrides":["86.0","97.1","99.0","117.1","119.0"],"displays":["86.0","95.0"],"descriptions":["86.0","99.0","119.0"],"changing":["87.0"],"precision":["88.0"],"whole":["88.0"],"total":["88.0"],"startdata":["88.0"],"string":["88.0"],"input":["88.0"],"box":["88.0"],"else":["89.2","92.4","111.2","113.4"],"ll":["89.2","111.2"],"wipe":["89.2","111.2"],"updated":["89.2","111.2"],"cols":["90.0"],"getstartdata":["90.0"],"getunlocked":["90.0"],"getcanclick":["90.0"],"onclick":["90.0"],"getdisplay":["90.0"],"columns":["90.0","110.0"],"maxrows":["90.0"],"maxcols":["90.0"],"sometimes":["90.0","92.2","113.2"],"associated":["92.0","113.0"],"starting":["92.1","113.1"],"displayrow":["92.1"],"clicked":["92.2","113.2"],"area":["92.2"],"requires":["92.3","113.3"],"replace":["92.4","113.4"],"reset":["92.4","113.4"],"prestigebuttontext":["92.4","113.4"],"consisting":["92.5"],"since":["92.6","113.6"],"last":["92.6"],"autoupgrade":["92.6"],"attempt":["92.6"],"buy":["92.6"],"false":["92.6"],"differentiate":["92.7","113.7"],"alongside":["93.0","114.0"],"particularly":["93.0"],"might":["93.0"],"generic":["95.0"],"styling":["95.0"],"dimensions":["95.0"],"sets":["95.0"],"angle":["95.0"],"face":["95.0"],"dir":["95.0"],"initial":["95.0"],"factored":["95.0"],"microtab":["96.0","103.4"],"both":["96.0"],"treelayout":["97.1","117.1"],"places":["97.1","117.1"],"branches":["97.3","117.3"],"ids":["97.3","113.5","117.3"],"onpurchase":["99.0","119.0"],"called":["99.0"],"define":["102.37"],"want":["103.0"],"vue":["103.0"],"objects":["103.0"],"applied":["108.0"],"displayed":["109.0"],"larger":["109.0"],"font":["109.0"],"hex":["113.1"],"format":["113.1"]},{"0":["45.6","80.10","87.0"],"1":["65.0","84.0","92.5","97.3","106.0","113.3","117.3"],"2":["23.3","55.3","61.1","72.3","92.3","97.3","113.5","117.3"],"3":["61.1","88.0","92.5","97.3","117.3"],"5":["70.2","76.0","89.2","98.0","111.2","118.0"],"6":["70.2"],"10":["61.12","84.0","106.0"],"11":["61.4"],"12":["80.8"],"15":["95.0"],"18":["61.12"],"19":["61.11"],"20":["10.0","80.36","102.18"],"21":["61.9","80.8"],"25":["87.0"],"30":["95.0"],"47":["0.0"],"124":["0.0"],"200":["65.0"],"8445":["24.2","57.2"],"9215":["23.2","55.2"],"open":["0.0","17.0","20.0","42.0","89.1","111.1"],"source":["0.0","8.0","15.2","20.0","42.0"],"opti":["0.0","35.0"],"speech":["0.0","35.0"],"planar":["0.0"],"pioneers":["0.0"],"profectus":["0.0"],"media":["0.0"],"synapse":["0.0"],"cozy":["0.0","45.0"],"knowledge":["0.0","13.0"],"hub":["0.0","13.0"],"v":["0.0"],"ecs":["0.0"],"vitepress":["0.0"],"webrings":["0.0"],"weird":["0.0"],"make":["0.0","24.0","24.1","45.3","57.0","57.1","61.10","80.50","92.4","102.32","102.38","113.3","113.4"],"tracked":["0.0"],"via":["0.0","24.1","57.1"],"git":["0.0","70.2","89.2","111.2"],"03":["0.0"],"is":["1.0","9.0","15.2","15.5","22.1","23.3","26.2","31.0","32.0","36.0","38.1","48.0","52.2","54.1","55.3","70.1","80.20","80.22","80.34","80.38","80.46","89.1","102.2","102.4","102.16","102.20","102.28","111.1"],"a":["1.0","15.0","24.9","29.0","32.0","36.0","57.9","59.0","70.2","78.0","79.0","80.38","80.44","80.54","100.0","101.0","102.20","102.26","102.36"],"december":["2.0"],"started":["2.0","60.0"],"this":["2.0","13.0","15.2","23.4","24.3","27.0","44.0","50.0","55.4","56.0","57.3","62.0","77.0","80.39","102.21"],"was":["2.0","4.0","15.2","27.3","56.3","77.0","92.3","99.0","113.3","119.0"],"one":["2.0","24.6","27.1","41.0","56.1","57.6","80.20","80.40","102.2","102.22","107.0"],"most":["2.0","35.1","80.50","102.32"],"hectic":["2.0"],"months":["2.0"],"m":["2.0","24.6","27.2","56.2","57.6"],"bluesky":["3.0"],"in":["3.0","5.0","23.3","24.7","35.1","45.0","55.3","57.7","68.0","80.26","80.32","97.1","102.8","102.14","117.1"],"comparison":["3.0","81.0","103.0"],"to":["3.0","14.0","16.0","40.0","80.18","80.28","80.43","96.0","102.10","102.25","116.0"],"use":["4.0","22.1","27.2","54.1","56.2","64.0","80.17","80.25","80.26","80.47","83.0","102.7","102.8","102.29","103.4","105.0"],"rpg":["4.0"],"campaigns":["4.0"],"renderer":["4.0"],"separated":["4.0"],"into":["4.0","23.6","55.6","70.2","89.2","97.0","111.2","117.0"],"own":["4.0","23.6","55.6","81.4"],"project":["4.0","70.1"],"js":["4.0","80.46","102.28"],"barbee":["5.0"],"for":["5.0","15.3","23.2","28.0","34.0","38.2","45.5","55.2","72.3","75.0","80.17","80.19","80.27","80.47","80.51","92.3","102.1","102.9","102.29","102.33","116.0"],"their":["5.0","12.0","26.0","41.0","52.0","81.4"],"class":["5.0"],"problems":["6.0","45.3"],"of":["6.0","25.1","26.1","26.3","52.1","52.3","53.1","80.7","80.20","80.39","81.3","92.4","102.2","102.21","113.4"],"transcribing":["6.0"],"there":["7.0","27.2","27.3","56.2","56.3","75.0","80.16","90.0"],"s":["7.0","15.2","20.0","27.1","38.1","56.1","61.8","72.6","80.21","85.0","102.3"],"algorithmic":["7.0"],"sortings":["7.0"],"take":["7.0","24.6","57.6"],"things":["7.0","15.3","76.0","80.14","98.0","118.0"],"other":["7.0","15.3","16.0","24.4","25.1","26.2","52.2","53.1","57.4","67.0","80.52","97.0","102.34","108.0","117.0"],"than":["7.0","23.3","55.3","72.3","92.3"],"web":["8.0","27.4","56.4"],"about":["9.0"],"similar":["9.0","72.5","92.2"],"topics":["9.0"],"community":["9.0"],"very":["9.0","73.0","93.0","114.0"],"interested":["9.0"],"various":["9.0","23.6","55.6"],"relate":["9.0"],"together":["9.0"],"talks":["10.0"],"and":["10.0","13.0","22.0","24.9","25.1","27.4","38.2","40.0","53.1","54.0","56.4","57.9","72.0","80.3","80.15","80.39","97.3","102.21","117.3"],"interviews":["10.0"],"later":["10.0","80.37","102.19"],"tone":["10.0"],"control":["10.0","12.0","24.7","57.7"],"servers":["11.0"],"that":["11.0","24.8","26.0","27.0","45.0","52.0","56.0","57.8","62.0","62.1","62.3","72.1","80.6","92.1","113.1"],"still":["11.0","15.2","23.3","24.1","24.7","55.3","57.1","57.7","62.0","80.48","102.30"],"suffer":["11.0"],"from":["11.0","23.4","24.3","26.2","52.2","55.4","57.3","63.0","80.43","80.46","102.25","102.28"],"some":["11.0","15.3","15.4","22.3","23.2","26.0","52.0","54.3","55.2","61.5","80.27","80.32","92.2","102.9","102.14","113.2"],"issues":["11.0","21.0","61.8","80.1"],"centralization":["11.0"],"advantages":["11.0"],"absurdly":["12.0"],"high":["12.0"],"timescale":["12.0"],"become":["12.0","24.10","57.10"],"incredibly":["12.0","22.2","26.2","52.2","54.2"],"useful":["12.0","15.3","69.0"],"making":["12.0","26.2","45.2","52.2","70.2","89.2","97.0","111.2","117.0"],"balance":["12.0"],"changes":["12.0","67.0","70.2","89.2","111.2","113.1"],"testing":["12.0"],"against":["12.0"],"existing":["12.0"],"sets":["12.0"],"screenshot":["12.0"],"mode":["12.0"],"but":["12.0","24.0","27.0","56.0","57.0","62.0","73.0","76.0","77.0","81.4","85.0","92.4","93.0","97.2","98.0","113.4","114.0","117.2","118.0"],"play":["12.0","23.3","55.3"],"removes":["12.0"],"managers":["12.0"],"field":["12.0"],"whatever":["12.0","95.0"],"settings":["12.0"],"allowing":["12.0"],"gds":["12.0"],"test":["12.0"],"freely":["12.0"],"without":["12.0","23.1","55.1","70.0","89.0","92.1","111.0","113.1"],"worrying":["12.0"],"undoing":["12.0"],"afterward":["12.0"],"da1":["12.0"],"png":["12.0"],"puppet":["12.0"],"ported":["12.0"],"rendering":["12.0"],"library":["12.0"],"c":["12.0"],"could":["12.0","24.0","24.6","24.9","47.0","57.0","57.6","57.9","75.0"],"unity":["12.0"],"full":["12.0","30.0","108.0"],"campaign":["12.0"],"cutscenes":["12.0"],"taking":["12.0"],"advantage":["12.0"],"support":["12.0","38.2","80.19","80.27","102.1","102.9"],"commands":["12.0"],"fields":["12.0"],"forest":["13.0"],"hosted":["14.0","45.3"],"providers":["14.0"],"are":["14.0","80.3","80.29","80.33","80.34","102.11","102.15","102.16"],"not":["14.0","15.2","44.0","59.0","63.0","67.0","74.0","77.0","78.0","80.24","80.34","82.0","86.0","88.0","92.6","94.0","97.1","100.0","102.6","102.16","104.0","107.0","108.0","115.0","117.1"],"enough":["14.0"],"be":["14.0","22.2","22.3","24.5","24.8","54.2","54.3","57.5","57.8","72.3","75.0","80.9","80.56","92.3","92.6","113.5"],"considered":["14.0","24.1","27.1","56.1","57.1"],"theoretical":["15.0"],"non":["15.1","23.0","45.1","55.0","97.0","117.0"],"feasibility":["15.1"],"self":["15.1"],"hosting":["15.1"],"contributing":["15.1"],"federated":["15.1","51.0"],"actually":["15.1"],"having":["15.1","22.2","23.5","24.0","54.2","55.5","57.0"],"all":["15.1","24.0","57.0","62.1","67.0","86.0","88.0"],"upsides":["15.1"],"it":["15.1","15.4","30.0","47.0","72.6","80.52","90.0","92.3","97.0","102.34","113.3","117.0"],"necessary":["15.2"],"supercede":["15.2"],"so":["15.2","27.3","46.0","47.0","56.3","99.0","119.0"],"if":["15.2","15.4","24.2","24.7","27.1","56.1","57.2","57.7","62.0","80.33","92.3","95.0","102.15","113.3"],"breached":["15.2"],"i":["15.2","24.4","57.4"],"ve":["15.2","26.2","52.2"],"added":["15.2","38.2","61.6","80.41","102.23"],"truth":["15.2"],"fails":["15.2"],"key":["15.2","72.0"],"itself":["15.2"],"require":["15.3"],"password":["15.3"],"when":["15.3","23.6","38.1","55.6","67.0","77.0","80.16","80.24","86.0","87.0","90.0","96.0","102.6","108.0","116.0","119.0"],"subscribing":["15.3"],"school":["15.3"],"entity":["15.3"],"wants":["15.3"],"an":["15.3","17.0","21.0","31.0","38.1","41.0","43.0","48.0","71.0","72.1","72.2","80.6","80.9","80.25","91.0","92.1","96.0","102.7","112.0","113.1","113.2"],"flag":["15.4"],"indicate":["15.4"],"updating":["15.4","68.0","80.24","102.6"],"messages":["15.4"],"naturally":["15.4"],"reply":["15.4"],"would":["15.4","24.6","57.6"],"only":["15.4","46.0","80.33","92.4","97.2","102.15","113.4","117.2"],"respected":["15.4"],"matches":["15.4"],"clients":["15.5"],"relays":["15.5"],"respect":["15.5"],"those":["15.5","23.2","24.0","27.1","55.2","56.1","57.0","67.0","73.0","82.0","85.0","86.0","93.0","96.0","99.0","114.0","119.0"],"whitelisted":["15.5"],"moderator":["15.5","15.6"],"extension":["15.5"],"groups":["15.5"],"placed":["15.6"],"on":["15.6","24.2","24.8","38.1","47.0","57.2","57.8","64.0","80.11","80.15","80.42","80.46","80.56","83.0","97.2","102.24","102.28","102.38","103.0","105.0","117.2"],"drive":["15.6"],"at":["15.6","24.3","27.2","38.1","56.2","57.3","68.0","72.2","72.6","90.0","92.2","92.7","113.2","113.7"],"least":["15.6","27.2","56.2","87.0"],"temporarily":["15.6"],"downloaded":["15.6"],"even":["15.6","22.3","54.3","70.0","81.2","89.0","103.2","103.4","111.0"],"you":["15.6","60.0","62.1","62.3"],"follow":["15.6"],"looks":["15.6"],"talk":["16.0","23.5","55.5"],"each":["16.0","27.1","27.3","47.0","56.1","56.3"],"anything":["18.0"],"wiki":["18.0"],"between":["19.0","23.1","23.3","26.1","52.1","55.1","55.3","72.6","80.10","97.2","117.2"],"displaying":["19.0","80.10"],"recommend":["20.0"],"with":["21.0","22.2","40.0","41.0","45.1","51.0","54.2","60.0","72.2","80.41","81.0","102.23","113.2"],"proposes":["21.0"],"creating":["21.0"],"them":["22.0","23.4","24.2","24.3","47.0","54.0","55.4","57.2","57.3","76.0","77.0","81.0","88.0","98.0","103.0","103.4","118.0"],"convert":["22.0","54.0"],"just":["22.1","24.2","24.6","24.7","54.1","57.2","57.6","57.7"],"html":["22.1","54.1","64.0","66.0","80.17","83.0","105.0","107.0","109.0","114.0"],"add":["22.1","25.0","53.0","54.1","79.0","101.0"],"game":["22.1","23.0","27.0","29.0","50.0","54.1","55.0","56.0","59.0","61.10","72.0","78.0","80.46","90.0","100.0","102.28"],"now":["22.1","54.1","70.2","80.11","80.22","80.31","80.33","102.4","102.13","102.15"],"available":["22.1","51.0","54.1"],"your":["22.1","26.3","52.3","54.1","62.3","92.0","113.0"],"browser":["22.1","54.1"],"choose":["22.1","54.1","70.1","89.1","111.1"],"engine":["22.1","54.1"],"admin":["22.1","54.1"],"privileges":["22.1","54.1"],"tends":["22.2","54.2"],"flood":["22.2","54.2"],"any":["22.2","54.2","72.6","80.17","80.56","81.3","92.7","102.38","113.7"],"ones":["22.2","27.3","54.2","56.3","70.2","73.0","93.0","114.0"],"posted":["22.2","54.2"],"initial":["22.2","54.2"],"played":["22.2","54.2"],"motivating":["22.2","54.2"],"have":["22.3","24.4","30.0","54.3","57.4","80.54","81.4","102.36"],"iap":["22.3","54.3"],"see":["22.3","24.6","54.3","57.6","81.0","103.0"],"level":["22.3","54.3"],"regular":["22.3","54.3","90.0"],"criticism":["22.3","24.1","54.3","57.1"],"ngu":["22.3","24.10","54.3","57.10"],"idle":["22.3","27.1","54.3","56.1"],"skilling":["22.3","54.3"],"pins":["22.3","54.3"],"large":["22.3","27.4","54.3","56.4","62.0","80.27","102.9"],"part":["22.3","24.3","54.3","57.3","80.34","102.16"],"can":["22.3","33.0","45.3","54.3","60.0","62.1","80.9","80.17","113.5"],"mirrors":["23.0","55.0"],"claim":["23.0","55.0"],"developer":["23.0","55.0"],"cookie":["23.0","23.3","55.0","55.3"],"clicker":["23.0","23.3","55.0","55.3"],"his":["23.0","55.0"],"using":["23.0","27.2","40.0","55.0","56.2","80.27","102.9"],"instead":["23.1","55.1","80.9","103.0","113.3"],"lot":["23.1","24.10","25.1","53.1","55.1","57.10"],"comes":["23.1","27.3","55.1","56.3"],"meta":["23.1","55.1"],"system":["23.1","39.0","55.1","70.2","89.2","111.2"],"which":["23.1","23.4","27.2","55.1","55.4","56.2","81.0","103.0"],"base":["23.1","27.3","55.1","56.3","65.0","84.0","106.0"],"stats":["23.1","55.1"],"increased":["23.1","55.1"],"spending":["23.1","55.1","107.0"],"persists":["23.1","55.1"],"runs":["23.1","55.1"],"technically":["23.1","55.1"],"possible":["23.1","55.1","85.0"],"win":["23.1","55.1"],"indeed":["23.1","23.2","23.6","55.1","55.2","55.6"],"roguelikes":["23.1","55.1"],"players":["23.1","55.1"],"challenge":["23.1","55.1","80.19","102.1"],"themselves":["23.1","55.1"],"beating":["23.1","55.1"],"learning":["23.2","55.2"],"improvement":["23.2","55.2"],"over":["23.2","24.11","55.2","57.11"],"span":["23.2","24.2","45.2","55.2","57.2"],"id":["23.2","24.2","45.2","55.2","57.2","80.54","102.36"],"665ceed1":["23.2","55.2"],"72a9":["23.2","55.2"],"49f2":["23.2","55.2"],"dd690f89aee3":["23.2","55.2"],"h2":["23.2","24.2","55.2","57.2"],"addiction":["23.2","55.2"],"reasons":["23.2","55.2"],"why":["23.2","24.1","55.2","57.1"],"may":["23.2","55.2"],"reminded":["23.2","55.2"],"gambling":["23.2","55.2"],"appeals":["23.2","55.2"],"particularly":["23.2","24.1","55.2","57.1"],"prone":["23.2","55.2"],"quite":["23.2","55.2"],"criticized":["23.2","55.2"],"similarity":["23.2","55.2"],"skinner":["23.2","55.2"],"box":["23.2","55.2"],"gone":["23.2","55.2"],"far":["23.2","55.2"],"say":["23.2","24.6","27.4","55.2","56.4","57.6","69.0","110.0"],"genre":["23.2","24.5","24.6","24.7","55.2","57.5","57.6","57.7"],"commenting":["23.2","23.6","55.2","55.6"],"easier":["23.3","24.1","27.3","55.3","56.3","57.1"],"starcraft":["23.3","55.3"],"probably":["23.3","27.3","55.3","56.3"],"somewhere":["23.3","55.3"],"once":["23.3","55.3"],"progress":["23.3","55.3","92.2"],"sufficiently":["23.3","55.3"],"loop":["23.4","27.3","55.4","56.3","59.0","78.0","100.0"],"helps":["23.4","55.4"],"keep":["23.4","25.0","53.0","55.4","81.0","103.0"],"stagnating":["23.4","55.4"],"wait":["23.5","55.5"],"after":["23.5","27.1","55.5","56.1","66.0","72.5","107.0","109.0","113.6"],"getting":["23.5","24.11","55.5","57.11","60.0"],"hit":["23.5","27.1","38.1","55.5","56.1"],"note":["23.5","55.5"],"arguing":["23.5","55.5"],"cod":["23.5","55.5"],"poorly":["23.5","55.5"],"designed":["23.5","40.0","55.5"],"experiences":["23.5","55.5"],"specifically":["23.5","55.5","73.0","93.0","114.0"],"praising":["23.5","55.5"],"ensuring":["23.5","55.5"],"been":["23.6","27.2","55.6","56.2"],"pointed":["23.6","55.6"],"out":["23.6","45.5","55.6"],"numerous":["23.6","55.6"],"times":["23.6","27.1","55.6","56.1"],"before":["23.6","24.1","55.6","57.1","69.0","110.0"],"excess":["23.6","55.6"],"increasing":["23.6","55.6"],"production":["23.6","55.6"],"beyond":["23.6","55.6"],"reasonable":["23.6","55.6"],"limits":["23.6","55.6","80.30","88.0","102.12"],"devolving":["23.6","55.6"],"sake":["23.6","55.6"],"written":["23.6","55.6"],"comment":["23.6","55.6"],"upon":["23.6","27.3","55.6","56.3"],"concepts":["23.6","55.6"],"capitalism":["23.6","55.6"],"tropes":["23.6","39.0","55.6"],"discussed":["23.6","55.6"],"defining":["23.6","55.6"],"d":["23.6","24.3","38.1","55.6","57.3"],"argue":["23.6","24.6","55.6","57.6"],"rest":["24.0","57.0"],"implies":["24.0","57.0"],"defined":["24.0","57.0"],"mechanic":["24.0","57.0"],"mechanics":["24.0","24.10","57.0","57.10"],"imply":["24.0","57.0"],"exist":["24.0","57.0"],"many":["24.0","24.4","57.0","57.4","62.0","80.1","85.0"],"skill":["24.0","57.0"],"tree":["24.0","57.0","80.24","80.40","102.6","102.22"],"upgrades":["24.0","57.0","80.51","80.54","102.33","102.36"],"doesn":["24.0","57.0","88.0","110.0"],"reduced":["24.1","57.1"],"focus":["24.1","57.1"],"aesthetics":["24.1","57.1"],"often":["24.1","24.7","46.0","57.1","57.7"],"printing":["24.1","57.1"],"state":["24.1","57.1"],"directly":["24.1","57.1","102.37"],"screen":["24.1","57.1"],"text":["24.1","57.1","64.0","72.1","80.2","80.18","80.50","83.0","90.0","92.4","102.32","105.0","113.4"],"makes":["24.1","57.1","70.0","77.0","89.0","99.0","111.0","119.0"],"much":["24.1","27.3","56.3","57.1"],"develop":["24.1","57.1"],"programming":["24.1","57.1"],"skills":["24.1","57.1"],"art":["24.1","43.0","57.1"],"tangent":["24.1","57.1"],"appeal":["24.1","57.1"],"developers":["24.1","25.0","53.0","57.1"],"continue":["24.1","57.1"],"my":["24.1","57.1"],"clear":["24.1","57.1"],"love":["24.1","57.1"],"should":["24.1","24.6","57.1","57.6","69.0","103.0","110.0"],"inherently":["24.1","57.1"],"above":["24.1","57.1","72.3","92.3"],"logic":["24.1","27.2","56.2","57.1"],"behavior":["24.1","57.1"],"reward":["24.1","57.1"],"believe":["24.1","24.4","57.1","57.4"],"real":["24.1","57.1"],"here":["24.1","57.1","75.0"],"empty":["24.1","57.1"],"being":["24.2","24.3","57.2","57.3","61.3","74.0","94.0","115.0"],"distinct":["24.2","57.2"],"sides":["24.2","57.2"],"difference":["24.2","57.2"],"manual":["24.2","57.2"],"vs":["24.2","57.2"],"automatic":["24.2","57.2"],"665cea25":["24.2","57.2"],"437a":["24.2","57.2"],"49a4":["24.2","57.2"],"00422fb9ded1":["24.2","57.2"],"strategies":["24.2","57.2"],"rarer":["24.2","57.2"],"interpretation":["24.2","57.2"],"similarities":["24.2","57.2"],"strategy":["24.2","57.2"],"implying":["24.2","57.2"],"might":["24.2","57.2"],"appealing":["24.3","57.3"],"traits":["24.3","57.3"],"point":["24.3","57.3"],"appropriate":["24.3","57.3"],"consider":["24.3","57.3"],"precludes":["24.3","57.3"],"also":["24.3","43.0","57.3","80.16","80.35","80.46","84.0","102.17","102.28","113.3"],"reveals":["24.3","57.3"],"explicitly":["24.4","28.0","57.4"],"stating":["24.4","57.4"],"how":["24.4","57.4","85.0"],"must":["24.4","57.4","62.0","72.3","92.3"],"qualify":["24.4","57.4"],"definite":["24.4","57.4"],"genres":["24.4","57.4"],"applied":["24.4","57.4","72.1","92.1"],"purposefully":["24.5","57.5"],"avoid":["24.5","57.5"],"narrow":["24.5","57.5"],"or":["24.5","24.7","24.8","45.0","57.5","57.7","57.8","62.2","63.0","80.5","80.38","80.39","80.43","92.2","97.3","102.20","102.21","102.25","103.3","117.3"],"traditional":["24.5","57.5"],"definition":["24.5","24.6","57.5","57.6"],"growing":["24.5","57.5"],"shouldn":["24.5","57.5","92.6"],"t":["24.5","26.1","35.1","52.1","57.5","88.0","92.6","110.0","113.6"],"constrained":["24.5","57.5"],"by":["24.5","57.5","59.0","70.2","78.0","89.2","92.4","95.0","100.0","111.2","113.4"],"contains":["24.6","57.6","92.4","113.4"],"although":["24.6","45.4","57.6"],"someone":["24.6","57.6"],"disagreeing":["24.6","57.6"],"statement":["24.6","57.6","61.7"],"wrt":["24.6","57.6"],"increlution":["24.6","57.6"],"moment":["24.6","57.6"],"hyping":["24.6","57.6"],"specific":["24.6","26.1","26.2","41.0","52.1","52.2","57.6","80.25","102.7"],"we":["24.6","57.6"],"cannot":["24.6","57.6","90.0"],"reduce":["24.6","57.6"],"does":["24.6","57.6","88.0"],"another":["24.7","57.7","75.0","80.28","92.3","102.10","113.3"],"panel":["24.7","57.7"],"plane":["24.7","57.7"],"player":["24.7","27.0","56.0","57.7","65.0","106.0"],"otherwise":["24.8","57.8","92.6"],"replaced":["24.8","57.8","81.0","103.0"],"alternative":["24.8","57.8"],"requires":["24.8","57.8","65.0","84.0","106.0"],"less":["24.8","57.8"],"interaction":["24.8","57.8"],"goal":["24.8","57.8"],"oriented":["24.8","57.8"],"heavily":["24.8","57.8"],"reliant":["24.8","57.8"],"extrinsic":["24.8","57.8"],"motivation":["24.8","57.8"],"guide":["24.8","57.8"],"typically":["24.8","26.1","37.0","52.1","57.8"],"progression":["24.9","57.9"],"arguably":["24.9","57.9"],"paradigm":["24.9","57.9"],"shift":["24.9","57.9"],"certainly":["24.9","57.9"],"adds":["24.9","57.9","85.0"],"different":["24.10","57.10","62.1"],"progressively":["24.10","57.10"],"stronger":["24.10","24.11","27.3","56.3","57.10","57.11"],"idling":["24.10","57.10"],"rule":["24.10","57.10"],"gods":["24.10","57.10"],"wizard":["24.10","57.10"],"minion":["24.10","57.10"],"polynomial":["24.10","57.10"],"growth":["24.10","57.10"],"characters":["24.11","57.11"],"time":["24.11","30.0","57.11","70.2","80.43","89.2","102.25","111.2"],"while":["24.11","27.2","56.2","57.11"],"few":["24.11","57.11"],"want":["25.0","53.0","62.0","97.1","117.1"],"adding":["25.0","53.0","93.0"],"opinions":["25.0","53.0"],"opposing":["25.0","53.0"],"views":["25.0","53.0"],"devs":["25.1","53.1"],"as":["25.1","53.1","69.0","72.3","80.54","85.0","92.2","92.3","96.0","99.0","102.36","110.0","113.2","119.0"],"well":["25.1","53.1","69.0","80.54","102.36","110.0"],"incrementals":["25.3","53.3"],"they":["26.0","26.2","26.3","52.0","52.2","52.3","69.0","110.0"],"re":["26.0","26.2","52.0","52.2","76.0","98.0","118.0"],"welcoming":["26.0","52.0"],"positive":["26.0","52.0"],"constructive":["26.0","52.0"],"criticisms":["26.0","52.0"],"inevitably":["26.0","52.0"],"will":["26.0","27.2","52.0","56.2","82.0","85.0","97.2","110.0","113.6","117.2"],"eventually":["26.0","47.0","52.0"],"read":["26.0","26.1","52.0","52.1"],"potentially":["26.0","52.0"],"comments":["26.0","52.0"],"deeply":["26.0","52.0"],"made":["26.1","28.0","52.1","76.0","80.2","80.40","98.0","102.22","118.0"],"equal":["26.1","52.1"],"don":["26.1","27.4","52.1","56.4"],"need":["26.1","27.0","41.0","52.1","56.0","70.0","73.0","89.0","93.0","111.0","114.0"],"feel":["26.1","52.1"],"compelled":["26.1","52.1"],"obey":["26.1","52.1"],"every":["26.1","45.4","52.1","73.0","89.2","93.0","111.2","114.0"],"piece":["26.1","52.1"],"receive":["26.1","52.1"],"learn":["26.1","52.1"],"distinguish":["26.1","52.1"],"unhelpful":["26.1","52.1"],"offers":["26.1","52.1"],"collecting":["26.2","52.2"],"helpful":["26.2","52.2"],"regularly":["26.3","52.3"],"remind":["26.3","52.3"],"yourself":["26.3","52.3"],"celebrate":["26.3","52.3"],"successes":["26.3","52.3"],"no":["26.3","52.3","72.0","85.0"],"matter":["26.3","52.3"],"small":["26.3","27.4","52.3","56.4"],"engage":["27.0","56.0"],"truly":["27.0","56.0"],"understand":["27.0","27.1","56.0","56.1"],"contextualize":["27.0","56.0"],"means":["27.0","56.0","62.0"],"affects":["27.0","56.0"],"gameplay":["27.0","56.0"],"experience":["27.0","56.0"],"clarify":["27.0","56.0"],"purpose":["27.0","56.0"],"takes":["27.1","56.1"],"what":["27.1","27.3","56.1","56.3"],"going":["27.1","56.1"],"has":["27.1","56.1","80.37","102.19"],"list":["27.1","56.1","92.6"],"goals":["27.1","56.1"],"then":["27.1","27.2","56.1","56.2"],"understanding":["27.1","56.1"],"short":["27.1","27.2","56.1","56.2"],"achieving":["27.1","56.1"],"mainly":["27.2","56.2"],"criticizing":["27.2","56.2"],"introduced":["27.2","56.2"],"fact":["27.2","56.2"],"defend":["27.2","56.2"],"normal":["27.2","56.2","75.0","116.0"],"pre":["27.2","56.2"],"infinity":["27.2","56.2"],"had":["27.2","56.2"],"looking":["27.2","56.2","72.6","92.7","113.7"],"affordable":["27.2","56.2"],"next":["27.2","56.2","59.0","78.0","97.1","100.0","117.1"],"choosing":["27.2","56.2"],"manages":["27.3","56.3"],"becoming":["27.3","56.3"],"unmanageable":["27.3","56.3"],"continues":["27.3","56.3"],"good":["27.3","56.3","77.0","81.4","92.7","99.0","113.7","119.0"],"fine":["27.3","56.3","73.0","93.0","114.0"],"justification":["27.3","56.3"],"building":["27.3","56.3"],"layer":["27.3","39.0","56.3","80.21","97.0","102.3","117.0"],"essentially":["27.3","56.3"],"lets":["27.3","56.3","88.0","108.0"],"start":["27.3","56.3"],"needing":["27.3","56.3"],"think":["27.3","56.3"],"ideas":["27.3","56.3"],"conform":["27.3","56.3"],"original":["27.3","47.0","56.3"],"problem":["27.3","56.3"],"justified":["27.3","56.3"],"easy":["27.3","56.3"],"implement":["27.3","56.3","72.1","92.1","113.1"],"first":["27.3","56.3","72.6","74.0","80.57","92.3","92.6","92.7","94.0","113.3","113.7","115.0"],"off":["27.3","56.3"],"neutral":["27.3","56.3"],"cycle":["27.3","56.3"],"towards":["27.3","56.3"],"amount":["27.4","56.4","65.0","84.0","106.0","110.0"],"new":["27.4","38.2","56.4","70.2","81.2","103.2"],"currency":["27.4","56.4","69.0","80.21","84.0","102.3"],"applicable":["27.4","56.4"],"effects":["27.4","56.4","69.0","80.34","102.16"],"definitively":["27.4","56.4"],"me":["28.0"],"the":["28.0","37.0","39.0","72.0","80.30","80.48","80.49","102.12","102.30","102.31","103.4"],"indie":["29.0"],"intention":["30.0"],"completing":["30.0"],"however":["30.0"],"software":["33.0"],"show":["33.0"],"websites":["34.0","51.0"],"social":["35.0","35.2"],"kronos":["35.0"],"several":["35.1","95.0"],"development":["35.1","50.0"],"aren":["35.1","92.6","113.6"],"babble":["35.2"],"code":["37.0","72.4","75.0","89.2","92.5","97.3","111.2","116.0","117.3"],"publicly":["37.0"],"accessible":["37.0"],"alongside":["38.0","73.0"],"scientific":["38.0"],"paper":["38.0"],"hitting":["38.1"],"virtual":["38.1"],"target":["38.1"],"sphere":["38.1"],"located":["38.1"],"alveolar":["38.1"],"ridge":["38.1"],"consonant":["38.1"],"e":["38.1","50.0","74.0","80.54","81.0","94.0","102.36","103.0","115.0"],"g":["38.1","50.0","74.0","80.54","81.0","94.0","102.36","103.0","115.0"],"n":["38.1"],"features":["38.2","80.17","80.25","102.7"],"additional":["38.2"],"ema":["38.2"],"systems":["38.2"],"tv":["39.0"],"around":["40.0"],"vue":["40.0"],"reactivity":["40.0"],"intent":["40.0"],"users":["41.0"],"pick":["41.0"],"associating":["41.0"],"identity":["41.0","51.0"],"group":["41.0","81.4"],"people":["41.0","47.0"],"forms":["43.0"],"perhaps":["43.0"],"important":["43.0","93.0"],"commentary":["43.0"],"parasocial":["43.0"],"indexable":["44.0"],"marketers":["45.0"],"comparable":["45.0"],"way":["45.0","81.2","86.0","103.2"],"commercial":["45.1"],"content":["45.1","72.2","75.0","92.2","113.2"],"sites":["45.2"],"look":["45.2"],"too":["45.2","80.30","102.12"],"homogenized":["45.2"],"665b6ac0":["45.2"],"d3ca":["45.2"],"41d8":["45.2"],"solves":["45.3"],"described":["45.3","72.3","92.3"],"hey":["45.3"],"creators":["45.3"],"please":["45.3"],"firehoses":["45.3"],"post":["45.4"],"change":["45.4","77.0","95.0"],"garden":["45.4"],"static":["45.5"],"cheap":["45.5"],"plenty":["45.5"],"free":["45.5"],"options":["45.5"],"allowfullscreen":["45.6"],"pages":["46.0"],"private":["46.0"],"especially":["46.0"],"journal":["46.0"],"ll":["46.0"],"push":["46.0"],"updates":["46.0"],"site":["46.0"],"folder":["47.0"],"displays":["47.0","108.0"],"button":["47.0","71.0","87.0","91.0","112.0"],"plans":["47.0"],"were":["47.0"],"put":["47.0","69.0","110.0"],"steam":["47.0"],"workshop":["47.0"],"ivy":["49.0"],"road":["49.0"],"topic":["50.0"],"bunch":["50.0"],"libraries":["50.0"],"shared":["50.0"],"design":["50.0"],"allows":["50.0"],"smaller":["50.0"],"personal":["51.0"],"purchase":["59.0","78.0","100.0"],"generation":["59.0","78.0","100.0"],"points":["59.0","78.0","80.40","99.0","100.0","102.22"],"happens":["59.0","76.0","78.0","98.0","100.0","118.0"],"main":["59.0","78.0","97.1","100.0","117.1"],"update":["59.0","78.0","80.4","90.0","100.0"],"enabled":["59.0","78.0","100.0"],"tmt":["60.0","73.0","80.46","93.0","102.28","114.0"],"refactorings":["61.1"],"08":["61.2","61.4"],"fixed":["61.2","61.5","80.4","80.12","80.23","80.24","80.35","80.36","80.44","80.52","80.54","102.5","102.6","102.17","102.18","102.26","102.34","102.36"],"lines":["61.3"],"hidden":["61.3"],"visual":["61.5","95.0"],"bugs":["61.5","80.52","102.34"],"everything":["61.6","70.0","70.1","89.0","89.1","109.0","111.0","111.1"],"moved":["61.7","80.46","102.28"],"milestones":["61.7","80.51","102.33"],"early":["61.10"],"really":["62.0"],"uses":["62.0"],"break":["62.0"],"eternity":["62.0"],"store":["62.0","73.0","93.0","114.0"],"values":["62.0","63.0","68.0","69.0","71.0","80.47","91.0","96.0","102.29","110.0","112.0"],"numbers":["62.0","80.10","80.27","102.9"],"decimal":["62.0","88.0"],"objects":["62.0"],"properties":["62.1"],"give":["62.1"],"custom":["62.1","92.4","113.4"],"used":["62.2","72.3","80.56","92.3","102.38","103.3"],"enhancers":["62.2","103.3"],"space":["62.2","80.41","102.23","103.3"],"buildings":["62.2","103.3"],"clickables":["62.2","81.3","103.3"],"tabs":["62.3","81.2","103.2"],"microtab":["62.3","75.0","80.38","102.20","116.0"],"bonuses":["63.0","68.0","72.1","92.1","113.1"],"return":["63.0"],"value":["63.0","65.0","68.0","72.4","92.5","97.3","103.0","113.5","113.6","117.3"],"object":["63.0","71.0","72.1","91.0","92.1","92.5","96.0","112.0","113.1"],"containing":["63.0","68.0","72.1","92.1","113.1"],"multiple":["63.0","68.0","72.1","92.1","113.1"],"unlocked":["63.0","64.0","66.0","67.0","80.29","83.0","92.3","92.6","102.11","105.0","107.0","108.0","109.0","113.3"],"bool":["63.0","64.0","66.0","67.0","72.3","77.0","83.0","86.0","87.0","104.0","105.0","107.0","108.0","109.0"],"oncomplete":["63.0","67.0","82.0","86.0","104.0","108.0"],"called":["63.0","67.0","77.0","82.0","86.0","87.0","104.0","108.0","119.0"],"completed":["63.0","80.31","82.0","102.13","104.0"],"style":["63.0","82.0","85.0","87.0","96.0","99.0","104.0","116.0","119.0"],"applies":["63.0","81.0","82.0","85.0","87.0","96.0","99.0","103.0","104.0","116.0","119.0"],"css":["63.0","82.0","85.0","87.0","92.5","96.0","99.0","104.0","116.0","119.0"],"displayed":["64.0","68.0","80.33","83.0","102.15","105.0"],"top":["64.0","68.0","72.2","83.0","92.2","105.0","113.2"],"returning":["64.0","67.0","83.0","105.0","109.0"],"determine":["64.0","66.0","83.0","87.0","105.0","107.0","109.0"],"visible":["64.0","66.0","67.0","77.0","83.0","86.0","87.0","90.0","105.0","107.0","108.0","109.0"],"default":["64.0","80.34","102.16"],"current":["65.0","72.1","84.0","92.1","106.0","113.1"],"needed":["65.0","84.0","106.0"],"likely":["66.0","107.0","109.0"],"including":["66.0","107.0"],"description":["66.0","72.1","107.0"],"basic":["66.0","107.0","109.0"],"canafford":["66.0"],"buy":["66.0","113.6"],"implements":["66.0","87.0","107.0"],"its":["67.0","69.0","80.20","102.2"],"previously":["67.0","80.30","86.0","102.12","108.0"],"incomplete":["67.0","86.0","108.0"],"countsas":["67.0","86.0","108.0"],"combines":["67.0","86.0","108.0"],"array":["67.0","73.0","86.0","93.0","108.0","114.0"],"ids":["67.0","80.47","86.0","92.6","102.29","108.0"],"effectively":["67.0","86.0"],"etc":["68.0"],"title":["68.0"],"larger":["68.0"],"font":["68.0"],"returns":["68.0","72.1","90.0","92.1","92.6","113.1"],"calculates":["68.0","72.1","92.1","113.1"],"columns":["69.0"],"resource":["69.0","92.1","113.1"],"based":["69.0","80.46","102.28","109.0","110.0"],"best":["69.0","80.19","80.33","80.39","102.1","102.15","102.21","110.0"],"total":["69.0","80.29","80.33","80.39","102.11","102.15","102.21","110.0"],"startdata":["69.0","110.0"],"string":["69.0","72.4","92.5","110.0","113.5"],"touching":["70.0","89.0","111.0"],"command":["70.0","89.0","111.0"],"line":["70.0","89.0","111.0"],"benefits":["70.0","89.0","111.0"],"ignore":["70.1","89.1","111.1"],"else":["70.1","89.1","111.1"],"clone":["70.1","89.1","111.1"],"repository":["70.1","89.1","111.1"],"basically":["70.1","89.1","89.2","111.1","111.2"],"page":["70.2"],"go":["70.2","89.2","111.2"],"back":["70.2","89.2","111.2"],"commit":["70.2","89.2","111.2"],"form":["71.0","82.0","85.0","91.0","96.0","99.0","104.0","112.0","116.0","119.0"],"where":["71.0","85.0","91.0","92.5","112.0"],"keys":["71.0","82.0","85.0","91.0","96.0","99.0","104.0","112.0","119.0"],"attributes":["71.0","82.0","85.0","91.0","96.0","99.0","104.0","112.0","119.0"],"strings":["72.0","85.0","88.0","96.0","99.0","119.0"],"styling":["72.0","80.18"],"color":["72.0","72.4","113.5"],"label":["72.0"],"required":["72.0","84.0","113.3"],"resetting":["72.1","92.1","113.1"],"effect":["72.1","80.15","92.1","113.1"],"inherent":["72.1","92.1","113.1"],"effectdescription":["72.1","92.1"],"stays":["72.1"],"constant":["72.1","80.34","102.16"],"clicked":["72.2"],"sometimes":["72.2","72.3","92.3"],"microtabs":["72.2","80.12"],"area":["72.2","113.2"],"functions":["72.2","73.0","80.15","93.0","103.0","113.2","114.0"],"like":["72.2","77.0","99.0","113.2","119.0"],"set":["72.2","74.0","94.0","108.0","113.2","115.0"],"subtabs":["72.2","80.20","102.2","113.2"],"changing":["72.2","92.1","92.2","109.0","113.1","113.2"],"within":["72.2","92.2","113.2"],"advanced":["72.2","92.2","113.2"],"unlockorder":["72.3","92.3","92.6","113.3"],"layers":["72.3","73.0","80.45","92.3","93.0","102.27","114.0"],"absent":["72.3","92.3"],"greater":["72.3","92.3"],"roundupcost":["72.3"],"true":["72.3","85.0","113.6"],"needs":["72.3","77.0"],"rounded":["72.3"],"consisting":["72.4","97.3","113.5","117.3"],"either":["72.4","92.5","97.3","113.5","117.3"],"hex":["72.4","80.47","92.5","102.29","113.5"],"since":["72.5"],"last":["72.5","113.6"],"suggestion":["72.5"],"addpoints":["72.5"],"gain":["72.5","80.21","92.1","102.3","110.0","113.1"],"generating":["72.5"],"automatically":["72.5","80.15","80.29","102.11"],"amounts":["72.5"],"automate":["72.5","113.6"],"activate":["72.5","92.6","113.6"],"autobuyers":["72.5"],"auto":["72.5","74.0","94.0","115.0"],"resets":["72.5","80.11","92.6"],"differentiate":["72.6"],"requirement":["72.6","92.7","113.7"],"donotcallthesefunctionseverytick":["73.0","93.0","114.0"],"calls":["73.0","93.0","114.0"],"function":["73.0","80.26","93.0","102.8","114.0"],"anywhere":["73.0","93.0","114.0"],"tick":["73.0","93.0","114.0"],"result":["73.0","93.0","114.0"],"unless":["73.0","93.0","114.0"],"told":["73.0","93.0","114.0"],"do":["73.0","93.0","99.0","114.0","119.0"],"action":["73.0","93.0","114.0"],"identified":["73.0","93.0","114.0"],"official":["73.0","93.0","114.0"],"documentation":["73.0","80.17","93.0","114.0"],"names":["73.0","93.0","114.0"],"internal":["74.0","94.0","115.0"],"name":["74.0","94.0","99.0","115.0","119.0"],"toggled":["74.0","94.0","115.0"],"stored":["74.0","94.0","115.0"],"second":["74.0","94.0","115.0"],"variable":["74.0","94.0","115.0"],"b":["74.0","94.0","115.0"],"tip":["74.0","94.0","115.0"],"de":["74.0","94.0","115.0"],"both":["75.0","76.0","85.0","92.7","98.0","99.0","113.7","116.0","118.0","119.0"],"layout":["75.0","81.2","103.2","116.0"],"conflicts":["76.0","98.0","118.0"],"tools":["76.0","98.0","118.0"],"resolve":["76.0","98.0","118.0"],"conflict":["76.0","98.0","118.0"],"trying":["76.0","98.0","118.0"],"onpurchase":["77.0"],"purchased":["77.0","99.0","119.0"],"act":["77.0","99.0","119.0"],"include":["77.0","88.0","110.0"],"speed":["80.3"],"dir":["80.3"],"updated":["80.3"],"more":["80.4","81.0","81.3"],"quickly":["80.4","89.2","111.2"],"collectables":["80.5"],"example":["80.5","81.3"],"marked":["80.5","85.0"],"feature":["80.5","80.26","102.8"],"buyables":["80.5"],"exploit":["80.6"],"let":["80.6"],"variety":["80.7"],"tabformat":["80.7"],"related":["80.7"],"node":["80.9","80.15"],"image":["80.9","80.25","82.0","102.7","104.0"],"challenges":["80.10","80.51","88.0","102.33"],"improved":["80.10"],"0001":["80.10"],"kept":["80.11"],"display":["80.13","80.18","80.50","92.2","102.32","113.2"],"extremely":["80.13"],"dynamic":["80.14"],"same":["80.15","81.4","99.0","119.0"],"customizable":["80.15","80.40","92.2","102.22"],"glowcolor":["80.15"],"purchaselimit":["80.15","85.0"],"supplied":["80.15"],"cost":["80.15"],"locked":["80.15"],"appearing":["80.16"],"supply":["80.17"],"rows":["80.17","80.25","88.0","102.7","110.0"],"cols":["80.17"],"big":["80.17","80.54","102.36"],"symbols":["80.17"],"bulk":["80.19","102.1"],"completions":["80.19","102.1"],"layershown":["80.22","102.4"],"optional":["80.22","81.2","83.0","90.0","96.0","102.4","103.2","105.0","116.0"],"branches":["80.24","97.2","102.6","117.2"],"scrolling":["80.24","102.6"],"textstyle":["80.25","102.7"],"achievements":["80.25","80.34","88.0","102.7","102.16"],"argument":["80.25","102.7"],"formulas":["80.26","102.8"],"displayrow":["80.26","102.8","113.1"],"better":["80.27","102.9"],"attempt":["80.28","102.10","113.6"],"fix":["80.28","102.10"],"always":["80.29","102.11"],"1000x":["80.30","102.12"],"overrides":["80.31","102.13","108.0"],"already":["80.31","102.13"],"unclickable":["80.32","102.14"],"circumstances":["80.32","102.14"],"bit":["80.33","102.15"],"present":["80.33","102.15"],"format":["80.34","102.16"],"nan":["80.34","102.16"],"nodes":["80.35","97.0","102.17","117.0"],"thanks":["80.35","102.17"],"blank":["80.35","102.17"],"breaking":["80.35","80.43","102.17","102.25"],"subtab":["80.38","102.20"],"changed":["80.38","102.20"],"fixes":["80.38","102.20"],"tab":["80.40","80.43","102.22","102.25"],"below":["80.40","102.22"],"endgame":["80.40","102.22"],"condition":["80.40","102.22"],"sell":["80.40","102.22"],"up":["80.41","102.23"],"ghost":["80.41","102.23"],"visibility":["80.41","102.23"],"buttons":["80.42","81.4","102.24"],"prevent":["80.43","102.25"],"offline":["80.43","102.25"],"switching":["80.43","102.25"],"crash":["80.44","102.26"],"side":["80.45","102.27"],"modinfo":["80.46","102.28"],"spot":["80.46","102.28"],"discord":["80.46","102.28"],"link":["80.46","102.28"],"changelog":["80.46","102.28"],"separate":["80.46","93.0","102.28"],"mod":["80.46","102.28"],"version":["80.46","102.28"],"structure":["80.46","102.28"],"created":["80.47","102.29"],"keeping":["80.48","102.30"],"standard":["80.48","93.0","102.30"],"order":["80.49","92.1","102.31","113.1"],"unlockable":["80.50","102.32"],"components":["80.51","102.33"],"plus":["80.51","102.33"],"individual":["80.51","80.54","102.33","102.36"],"upgeffect":["80.51","102.33"],"buyableeffect":["80.51","102.33"],"highlight":["80.52","102.34"],"ways":["80.52","102.34"],"save":["80.54","102.36"],"issue":["80.54","102.36"],"define":["80.55","90.0"],"hotkeys":["80.55","102.37"],"component":["80.56","102.38"],"y":["81.0","95.0","103.0"],"mind":["81.0","103.0"],"operators":["81.0","103.0"],"gt":["81.0","103.0"],"gte":["81.0","103.0"],"lt":["81.0","103.0"],"lte":["81.0","103.0"],"eq":["81.0","103.0"],"neq":["81.0","103.0"],"docs":["81.0"],"details":["81.0"],"working":["81.0"],"create":["81.2","103.2"],"entirely":["81.2","103.2"],"generalized":["81.3"],"variant":["81.3"],"md":["81.4"],"behave":["81.4"],"data":["81.4"],"puts":["82.0","104.0"],"given":["82.0","104.0"],"url":["82.0","104.0"],"relative":["82.0","104.0"],"absolute":["82.0","104.0"],"unlock":["84.0","113.3"],"limit":["85.0"],"mark":["85.0"],"corner":["85.0"],"star":["85.0"],"onenter":["86.0"],"entering":["86.0"],"onexit":["86.0"],"exiting":["86.0"],"canclick":["87.0","109.0"],"onclick":["87.0"],"clicking":["87.0"],"onhold":["87.0"],"20x":["87.0"],"sec":["87.0"],"held":["87.0"],"seconds":["87.0"],"works":["88.0"],"decimals":["88.0"],"slider":["88.0"],"user":["88.0"],"element":["88.0","97.3","113.5","117.3"],"min":["88.0"],"max":["88.0"],"work":["88.0"],"easily":["89.2","111.2"],"maximum":["90.0"],"increase":["90.0"],"though":["90.0","92.0","113.0"],"creates":["90.0"],"position":["90.0"],"gettitle":["90.0"],"these":["92.0","113.0"],"special":["92.0","113.0"],"functionality":["92.0","113.0"],"bars":["92.2","113.2"],"information":["92.2","113.2"],"bar":["92.2"],"gague":["92.2"],"highly":["92.2"],"harder":["92.3","113.3"],"entirety":["92.4","113.4"],"usable":["92.4","113.4"],"number":["92.5","97.3","103.0","117.3"],"theme":["92.5"],"affected":["92.5"],"colors":["92.5"],"nodestyle":["92.5"],"automation":["92.6","113.6"],"supported":["92.6"],"resetsnothing":["92.6"],"trigger":["92.6"],"increaseunlockorder":["92.6"],"yet":["92.6"],"increases":["92.6"],"supporting":["92.7","113.7"],"file":["93.0"],"index":["93.0"],"examples":["93.0","114.0"],"becomes":["94.0","115.0"],"centered":["95.0"],"rotation":["95.0"],"starting":["95.0"],"accelerate":["95.0"],"downwards":["95.0"],"x":["95.0"],"coordinates":["95.0"],"whole":["96.0","116.0"],"switched":["96.0","116.0"],"buttonstyle":["96.0"],"explained":["97.1","117.1"],"section":["97.1","117.1"],"additionally":["97.1","117.1"],"assigned":["99.0","119.0"],"automagically":["99.0","119.0"],"plain":["103.0"],"perform":["103.0"],"operations":["103.0"],"inside":["103.4"],"embed":["103.4"],"baseamount":["106.0"],"appropriately":["108.0"],"formatted":["108.0"],"fulldisplay":["108.0"],"override":["108.0","113.1"],"descriptions":["108.0"],"autoupgrade":["113.6"],"boolean":["113.6"],"defaults":["113.6"],"false":["113.6"]},{"1":["72.4","80.10","86.0","108.0","113.5"],"2":["113.3"],"3":["72.4","113.5"],"5":["65.0","70.1","84.0","89.1","106.0","111.1"],"6":["76.0","89.2","98.0","111.2","118.0"],"7":["70.2"],"10":["95.0"],"12":["0.0"],"18":["0.0"],"20":["0.0"],"23":["0.0"],"28":["0.0"],"33":["0.0"],"55":["0.0"],"95":["0.0"],"9534":["45.2"],"protocol":["1.0","16.0","32.0","36.0"],"for":["1.0","8.0","13.0","24.7","36.0","43.0","44.0","45.2","57.7","70.1","80.41","80.48","89.1","92.5","95.0","97.3","102.23","102.30","111.1","113.3","117.3"],"super":["2.0"],"happy":["2.0","47.0"],"with":["2.0","24.5","24.7","26.1","27.0","27.2","46.0","50.0","52.1","56.0","56.2","57.5","57.7","61.5","80.1","80.11","80.20","80.42","80.47","80.52","80.54","102.2","102.24","102.29","102.34","102.36"],"how":["2.0","21.0","24.6","26.2","50.0","52.2","57.6","60.0","80.10","95.0"],"turned":["2.0"],"out":["2.0","23.2","55.2","70.2"],"ended":["2.0"],"up":["2.0","72.1","72.3","80.15","92.1","92.3","113.1"],"being":["2.0","15.1","23.3","24.8","55.3","57.8","61.8","80.48","102.30"],"way":["2.0","62.1","92.2"],"more":["2.0","24.2","47.0","57.2","60.0","62.2","80.34","81.4","95.0","102.16","103.0","103.3"],"ambitious":["2.0"],"other":["3.0","15.5","24.5","24.9","47.0","57.5","57.9","61.5","80.54","92.2","102.36"],"protocols":["3.0","15.1"],"so":["4.0","22.1","23.3","26.1","45.3","52.1","54.1","55.3","63.0","66.0","82.0","85.0","104.0","107.0","108.0"],"could":["4.0","21.0","45.4","50.0"],"be":["4.0","72.0","80.26","92.1","102.8","113.1","113.3"],"used":["4.0","65.0","84.0","92.6","95.0","106.0","113.3"],"stuff":["4.0"],"like":["4.0","46.0","70.1","89.1","89.2","111.1","111.2"],"cutscenes":["4.0"],"ported":["4.0"],"engine":["4.0"],"c":["4.0"],"college":["5.0"],"s":["5.0","15.3","15.6","49.0","63.0","66.0","80.39","82.0","102.21","104.0","107.0"],"final":["5.0","12.0"],"project":["5.0","89.1","111.1"],"branching":["6.0"],"conversations":["6.0"],"into":["6.0","7.0","22.0","23.2","24.11","27.2","40.0","54.0","55.2","56.2","57.11","93.0"],"linear":["6.0"],"timelines":["6.0"],"account":["7.0"],"displays":["7.0"],"are":["7.0","24.3","24.5","57.3","57.5"],"less":["7.0","23.1","23.5","55.1","55.5","80.34","102.16"],"suitable":["7.0"],"as":["7.0","24.0","45.0","57.0","63.0","72.2","80.3","80.31","82.0","102.13","104.0","113.3","116.0"],"client":["8.0"],"common":["9.0","24.1","57.1"],"themes":["9.0"],"here":["9.0","97.2","117.2"],"want":["9.0","73.0","93.0","114.0"],"these":["9.0","22.2","24.5","54.2","57.5","81.3","92.3"],"things":["9.0","12.0","27.2","56.2","80.1"],"decentralized":["9.0","15.1"],"freeform":["9.0","45.0"],"re":["9.0","24.3","45.3","57.3","80.15"],"building":["9.0"],"make":["9.0","46.0","80.56","92.0","92.6","113.0"],"several":["9.0","24.1","27.3","56.3","57.1"],"i":["10.0","24.9","57.9"],"played":["10.0"],"over":["11.0"],"data":["11.0"],"ownership":["11.0"],"increased":["11.0"],"privacy":["11.0"],"rules":["11.0"],"follow":["11.0"],"can":["11.0","23.2","23.4","55.2","55.4","70.0","80.22","80.30","89.0","97.1","102.4","102.12","111.0","117.1"],"fully":["11.0","27.3","56.3"],"talking":["12.0"],"giving":["12.0"],"starting":["12.0"],"controlling":["12.0"],"progression":["12.0"],"story":["12.0"],"action":["12.0"],"wheel":["12.0"],"ends":["12.0"],"command":["12.0"],"either":["12.0","81.0"],"set":["12.0","69.0","88.0","95.0","110.0"],"next":["12.0","24.2","27.4","56.4","57.2","76.0","77.0","98.0","118.0"],"latter":["12.0","26.1","52.1"],"case":["12.0","74.0","94.0","115.0"],"additional":["12.0","24.1","57.1","85.0"],"call":["12.0","21.0"],"location":["12.0"],"takes":["12.0","24.0","57.0"],"place":["12.0","76.0","98.0","118.0"],"added":["12.0","80.16"],"save":["12.0"],"file":["12.0","76.0","98.0","118.0"],"city":["12.0"],"locations":["12.0"],"greyed":["12.0"],"until":["12.0","46.0"],"have":["12.0","14.0","15.1","15.2","15.6","23.3","24.6","55.3","57.6","62.0","80.46","92.6","97.2","102.28","117.2"],"least":["12.0"],"do":["12.0","24.2","46.0","57.2","63.0","82.0","85.0","104.0","107.0","108.0"],"populated":["12.0"],"range":["12.0"],"acceptable":["12.0"],"angles":["12.0"],"resources":["13.0"],"creating":["13.0"],"them":["13.0","24.4","24.11","57.4","57.11","99.0","110.0","119.0"],"https":["13.0"],"github":["13.0"],"oidc":["14.0"],"oauth":["14.0"],"require":["14.0"],"service":["14.0"],"owner":["14.0","15.2"],"successor":["15.0"],"to":["15.0","35.1","37.0","38.1","75.0","80.44","102.26"],"should":["15.1","21.0","72.1","92.1","92.6","96.0","113.1"],"theoretically":["15.1"],"by":["15.1","22.3","24.2","45.3","54.3","57.2","62.0","80.5","80.9","86.0","92.0","113.0"],"virtue":["15.1","16.0"],"commune":["15.1"],"community":["15.1","28.0"],"existing":["15.1"],"nostr":["15.1"],"atproto":["15.1"],"lot":["15.1","24.5","57.5"],"m":["15.2","27.0","27.3","56.0","56.3","79.0","101.0"],"just":["15.2","24.3","57.3"],"thepaperpilot":["15.2"],"my":["15.2","27.0","27.3","56.0","56.3"],"communication":["15.2"],"sufficient":["15.2"],"website":["15.2"],"nameserver":["15.2"],"saying":["15.2"],"publickey":["15.2"],"site":["15.2","45.3"],"write":["15.2"],"paper":["15.2"],"at":["15.2","15.5","27.1","56.1","81.0","86.0"],"scientific":["15.2"],"journal":["15.2"],"internal":["15.3","67.0","77.0","99.0","119.0"],"social":["15.3","50.0"],"network":["15.3"],"ways":["15.3"],"subscribe":["15.3"],"all":["15.3","23.6","24.2","55.6","57.2","69.0","80.22","80.40","81.0","85.0","92.4","102.4","102.22","103.0","108.0","110.0","113.4"],"relay":["15.3"],"hears":["15.3"],"about":["15.3"],"new":["15.3","24.3","57.3","62.0"],"same":["15.4","63.0","66.0","76.0","80.46","82.0","85.0","98.0","102.28","104.0","107.0","109.0","118.0"],"creator":["15.4","23.6","55.6"],"servers":["15.4"],"replace":["15.4"],"original":["15.4"],"entirely":["15.4"],"one":["15.4","40.0","43.0"],"its":["15.4","22.3","54.3","72.1","92.1","113.1"],"edited":["15.4"],"granting":["15.5"],"removing":["15.5"],"ids":["15.5","72.5","113.6"],"level":["15.5"],"people":["15.5","26.3","52.3"],"setup":["15.5"],"accounts":["15.5"],"their":["15.5","23.3","35.1","47.0","55.3","95.0"],"desired":["15.5"],"heuristic":["15.5"],"sending":["15.5"],"such":["15.5","24.1","24.8","57.1","57.8"],"there":["15.6","22.1","24.0","54.1","57.0","80.25","102.7"],"delay":["15.6"],"between":["15.6","81.3"],"receiving":["15.6"],"initial":["15.6"],"message":["15.6"],"bots":["15.6"],"delete":["15.6"],"download":["15.6"],"spam":["15.6","27.1","56.1"],"shared":["16.0"],"source":["17.0","48.0"],"code":["17.0","47.0","76.0","98.0","113.5","118.0"],"style":["18.0","33.0","66.0","74.0","75.0","86.0","92.2","94.0","107.0","108.0","109.0","115.0"],"considered":["18.0"],"information":["19.0","60.0","72.1","72.2","80.38","92.1","102.20"],"in":["19.0","24.2","57.2","60.0","61.7","76.0","80.14","80.17","80.27","80.33","80.38","98.0","102.9","102.15","102.20","118.0"],"the":["20.0","30.0","41.0","62.3","80.36","80.56","102.18","102.38"],"tv":["20.0"],"tropes":["20.0"],"page":["20.0","27.0","39.0","56.0"],"on":["20.0","39.0","51.0","62.0","80.10","80.21","80.24","92.2","102.3","102.6"],"which":["21.0","23.6","55.6","59.0","72.4","78.0","80.26","85.0","92.5","99.0","100.0","102.8","113.5","119.0"],"they":["21.0","45.3"],"grdn":["21.0"],"work":["21.0","24.8","57.8","70.0","80.10","80.31","89.0","89.2","102.13","111.0","111.2"],"players":["22.0","22.3","23.2","23.3","23.4","54.0","54.3","55.2","55.3","55.4"],"let":["22.0","27.1","54.0","56.1"],"hell":["22.1","54.1"],"dedicated":["22.1","54.1"],"even":["22.1","54.1"],"computer":["22.1","54.1","70.1","89.1","111.1"],"tools":["22.1","54.1"],"development":["22.1","54.1"],"that":["22.1","22.2","24.5","30.0","40.0","41.0","54.1","54.2","57.5","80.9","81.3"],"run":["22.1","54.1"],"itself":["22.1","54.1"],"makes":["22.2","24.0","54.2","57.0"],"quite":["22.2","23.5","24.6","27.0","27.2","54.2","55.5","56.0","56.2","57.6"],"clear":["22.2","54.2"],"expect":["22.2","54.2"],"communities":["22.2","54.2"],"both":["22.2","33.0","54.2","63.0","66.0","71.0","72.6","82.0","86.0","87.0","91.0","104.0","107.0","108.0","109.0","112.0"],"explained":["22.3","54.3"],"hyper":["22.3","54.3"],"aware":["22.3","54.3"],"addictive":["22.3","23.2","54.3","55.2"],"nature":["22.3","54.3"],"genre":["22.3","54.3"],"susceptibility":["22.3","54.3"],"exploiting":["22.3","54.3"],"however":["22.3","54.3"],"is":["22.3","30.0","45.0","54.3","71.0","80.19","80.21","81.3","91.0","102.1","102.3","112.0"],"norm":["22.3","54.3"],"it":["23.0","49.0","55.0","72.0","80.3"],"framework":["23.0","24.1","55.0","57.1"],"ll":["23.0","55.0"],"answering":["23.0","55.0"],"why":["23.0","26.0","52.0","55.0"],"incremental":["23.0","24.4","50.0","55.0","57.4"],"criticism":["23.1","55.1"],"de":["23.1","55.1"],"emphasizes":["23.1","55.1"],"player":["23.1","24.2","55.1","57.2","80.27","102.9"],"skill":["23.1","24.6","55.1","57.6"],"making":["23.1","24.2","55.1","57.2","80.12"],"important":["23.1","55.1"],"certainly":["23.1","55.1"],"often":["23.1","26.1","27.2","52.1","55.1","56.2"],"literally":["23.1","55.1"],"impossible":["23.1","55.1"],"complete":["23.1","55.1","86.0","108.0"],"taking":["23.1","55.1","80.15"],"advantage":["23.1","55.1"],"systems":["23.1","55.1"],"boxes":["23.2","55.2","69.0","81.4","88.0","110.0"],"argument":["23.2","23.5","55.2","55.5","80.56","102.38"],"goes":["23.2","55.2"],"fun":["23.2","23.5","55.2","55.5"],"condition":["23.2","55.2"],"continuing":["23.2","55.2"],"without":["23.2","23.6","55.2","55.6"],"getting":["23.2","26.3","52.3","55.2","80.47","102.29"],"anything":["23.2","24.9","55.2","57.9","73.0","93.0","114.0"],"from":["23.2","26.0","50.0","52.0","55.2","80.26","80.55","95.0","102.8","102.37"],"when":["23.2","55.2","75.0","80.25","92.5","102.7"],"tied":["23.2","55.2"],"real":["23.2","38.0","55.2","80.41","102.23"],"world":["23.2","55.2"],"money":["23.2","55.2"],"seen":["23.2","55.2"],"predatory":["23.2","55.2"],"lesser":["23.2","55.2"],"free":["23.2","45.2","55.2"],"feeding":["23.2","55.2"],"sides":["23.2","55.2"],"seek":["23.2","55.2"],"micro":["23.2","55.2"],"transaction":["23.2","55.2"],"heavy":["23.2","55.2"],"healthy":["23.2","55.2"],"certain":["23.2","24.8","55.2","57.8"],"contexts":["23.2","55.2"],"successful":["23.3","55.3"],"may":["23.3","26.3","27.1","52.3","55.3","56.1","72.0"],"indicate":["23.3","55.3"],"strategies":["23.3","55.3"],"separate":["23.3","55.3","80.26","102.8"],"harder":["23.3","55.3","92.6"],"feel":["23.3","55.3"],"smart":["23.3","55.3"],"constant":["23.4","55.4","81.0","92.1","103.0","113.1"],"freshness":["23.4","55.4"],"shields":["23.5","55.5"],"souls":["23.5","55.5"],"likes":["23.5","24.3","55.5","57.3"],"bit":["23.5","55.5","80.15"],"famous":["23.5","55.5"],"highly":["23.5","55.5","72.2","113.2"],"recommend":["23.5","55.5"],"video":["23.5","55.5"],"essay":["23.5","55.5"],"spends":["23.5","55.5"],"time":["23.5","38.0","55.5","80.44","102.26"],"topic":["23.5","55.5"],"essentially":["23.5","55.5"],"boils":["23.5","55.5"],"down":["23.5","55.5","76.0","98.0","118.0"],"earlier":["23.5","55.5"],"using":["23.5","55.5","67.0"],"too":["23.5","27.0","55.5","56.0"],"much":["23.5","55.5"],"slowly":["23.5","55.5"],"conservatively":["23.5","55.5"],"ultimately":["23.5","55.5"],"wanted":["23.5","55.5"],"safe":["23.5","55.5"],"still":["23.6","55.6","72.1","92.1","113.1"],"concept":["23.6","55.6"],"pretty":["23.6","55.6"],"nebulous":["23.6","55.6"],"already":["23.6","55.6","73.0","93.0","114.0"],"but":["23.6","47.0","55.6","72.1","80.29","86.0","92.2","95.0","99.0","102.11","113.2","119.0"],"personally":["23.6","55.6"],"those":["23.6","27.2","45.4","55.6","56.2","63.0","66.0","71.0","91.0","94.0","104.0","107.0","108.0","112.0","115.0","116.0"],"who":["23.6","55.6"],"define":["23.6","55.6"],"an":["23.6","24.0","27.3","30.0","46.0","55.6","56.3","57.0","62.1","64.0","75.0","80.56","81.4","83.0","102.38","105.0","116.0"],"act":["23.6","55.6"],"expression":["23.6","55.6"],"physical":["23.6","55.6"],"result":["23.6","55.6"],"created":["23.6","29.0","55.6"],"meaning":["23.6","55.6"],"put":["23.6","27.2","55.6","56.2","62.3"],"relevant":["23.6","55.6","80.34","102.16"],"you":["24.0","45.5","57.0","80.30","80.46","97.2","102.12","102.28","117.2"],"if":["24.0","57.0","71.0","80.35","80.54","91.0","96.0","97.2","102.17","102.36","112.0","117.2"],"reset":["24.0","57.0","73.0","93.0","114.0"],"then":["24.0","57.0","95.0"],"every":["24.0","57.0","92.4","113.4"],"roguelite":["24.0","57.0"],"well":["24.0","24.4","57.0","57.4","72.2","92.2","113.2"],"clearly":["24.0","57.0"],"than":["24.0","24.9","57.0","57.9","97.0","113.3","117.0"],"doesn":["24.1","27.3","56.3","57.1"],"t":["24.1","57.1","72.0","72.5","96.0"],"offer":["24.1","57.1"],"sense":["24.1","57.1"],"don":["24.1","57.1"],"moderation":["24.1","57.1"],"although":["24.1","27.2","27.3","56.2","56.3","57.1"],"become":["24.1","24.6","27.1","56.1","57.1","57.6"],"problem":["24.1","24.3","57.1","57.3"],"profit":["24.1","57.1"],"seeking":["24.1","57.1"],"play":["24.1","57.1"],"detriment":["24.1","57.1"],"parts":["24.1","57.1","76.0","98.0","118.0"],"another":["24.1","27.2","56.2","57.1","80.34","102.16","103.4"],"interpretation":["24.1","57.1"],"comes":["24.1","57.1"],"mainstream":["24.1","57.1"],"also":["24.1","25.1","27.2","37.0","51.0","53.1","56.2","57.1","65.0","72.6","80.17","106.0"],"capitalism":["24.1","57.1"],"cookie":["24.1","57.1"],"adventure":["24.1","57.1"],"capitalist":["24.1","57.1"],"very":["24.1","24.7","57.1","57.7"],"portray":["24.1","57.1"],"increasing":["24.1","57.1"],"numbers":["24.1","57.1","80.13","80.35","102.17"],"insatiable":["24.1","57.1"],"hunger":["24.1","57.1"],"ones":["24.1","57.1","80.34","102.16"],"observed":["24.1","57.1"],"within":["24.1","57.1","80.53","102.35"],"therefore":["24.1","57.1"],"evidence":["24.1","57.1"],"whole":["24.1","45.0","57.1","75.0"],"approach":["24.2","57.2"],"would":["24.2","57.2"],"defined":["24.2","24.3","57.2","57.3","81.0","103.0"],"relation":["24.2","57.2"],"involve":["24.2","57.2"],"large":["24.2","24.6","57.2","57.6","80.30","102.12"],"optimization":["24.2","57.2"],"problems":["24.2","57.2"],"above":["24.2","57.2","113.3"],"else":["24.2","57.2"],"performing":["24.2","57.2"],"deciding":["24.2","57.2"],"what":["24.2","57.2","81.0","89.2","103.0","111.2"],"consequences":["24.2","24.7","57.2","57.7"],"wrong":["24.2","27.0","56.0","57.2"],"decisions":["24.2","57.2"],"lenient":["24.2","57.2"],"usually":["24.3","57.3"],"rogue":["24.3","57.3"],"pushes":["24.3","57.3"],"back":["24.3","57.3"],"step":["24.3","57.3"],"judge":["24.4","57.4"],"traits":["24.5","57.5"],"early":["24.5","27.2","56.2","57.5"],"popular":["24.5","57.5"],"titles":["24.5","57.5"],"easily":["24.5","47.0","57.5"],"replaced":["24.5","57.5"],"mechanically":["24.5","57.5"],"not":["24.6","27.0","40.0","56.0","57.6","71.0","72.5","80.28","80.33","80.35","80.46","80.50","91.0","102.10","102.15","102.17","102.28","102.32","112.0","113.6"],"indicator":["24.6","57.6"],"incrementalness":["24.6","57.6"],"additionally":["24.6","57.6"],"hard":["24.6","57.6"],"determine":["24.6","57.6","68.0","71.0","72.3","91.0","96.0","112.0"],"example":["24.6","27.3","56.3","57.6","62.0","85.0","99.0","119.0"],"any":["24.6","27.1","56.1","57.6","62.2","70.0","81.0","89.0","92.0","103.0","103.3","111.0","113.0"],"tree":["24.6","57.6","80.32","81.2","88.0","92.6","102.14","103.2"],"interacting":["24.7","57.7"],"non":["24.7","57.7"],"diegetic":["24.7","57.7"],"elements":["24.7","57.7","81.0"],"reduced":["24.7","57.7"],"tend":["24.7","57.7"],"repurcussions":["24.7","57.7"],"misplaying":["24.7","57.7"],"rarely":["24.7","57.7"],"fail":["24.7","57.7"],"states":["24.7","57.7"],"where":["24.7","27.1","56.1","57.7","64.0","66.0","72.4","74.0","83.0","87.0","90.0","94.0","97.3","105.0","107.0","109.0","113.5","115.0","117.3"],"largest":["24.7","26.0","52.0","57.7"],"consequence":["24.7","57.7"],"through":["24.8","57.8","76.0","98.0","118.0"],"some":["24.8","24.9","45.5","57.8","57.9","72.2","80.35","80.41","102.17","102.23"],"sort":["24.8","45.5","57.8"],"towards":["24.8","57.8"],"amount":["24.8","57.8","69.0","80.46","86.0","102.28","108.0"],"resource":["24.8","24.9","57.8","57.9"],"required":["24.8","57.8","65.0","106.0"],"unlock":["24.8","57.8","65.0","73.0","92.6","93.0","106.0","114.0"],"purchase":["24.8","27.4","56.4","57.8"],"management":["24.9","57.9"],"goal":["24.9","27.0","56.0","57.9"],"oriented":["24.9","57.9"],"probably":["24.9","57.9","61.5"],"apply":["24.9","57.9","64.0","83.0","90.0","105.0"],"think":["24.9","57.9"],"higher":["24.10","57.10"],"degree":["24.10","57.10"],"base":["24.10","57.10"],"layer":["24.10","57.10","61.8","80.9","95.0","97.1","117.1"],"antimatter":["24.10","57.10"],"dimensions":["24.10","57.10"],"swarm":["24.10","57.10"],"simulator":["24.10","57.10"],"upgrades":["24.10","27.3","56.3","57.10","72.3","80.25","80.46","102.7","102.28"],"category":["24.10","57.10"],"get":["24.11","27.0","56.0","57.11","81.2","103.2"],"translated":["24.11","57.11"],"english":["24.11","57.11"],"illustrate":["25.0","53.0"],"various":["25.0","53.0"],"points":["25.0","53.0","63.0","77.0","82.0","108.0","119.0"],"regarding":["25.0","53.0"],"balancing":["25.0","53.0"],"consider":["25.0","53.0"],"living":["25.0","53.0"],"passionate":["25.1","53.1"],"interest":["25.1","53.1"],"ludology":["25.1","53.1"],"classifying":["25.1","53.1"],"genres":["25.1","53.1"],"etc":["25.1","53.1"],"ve":["25.1","53.1"],"developers":["25.2","26.1","40.0","52.1","53.2"],"navigating":["25.3","53.3"],"affect":["26.0","52.0"],"no":["26.0","43.0","52.0","80.15","80.16","80.18","80.46","102.28"],"immune":["26.0","52.0"],"this":["26.0","39.0","52.0"],"content":["26.0","52.0"],"creators":["26.0","52.0"],"suggestions":["26.1","52.1"],"improvement":["26.1","52.1"],"while":["26.1","52.1"],"vague":["26.1","52.1"],"or":["26.1","27.0","40.0","44.0","52.1","56.0","70.0","72.2","72.4","89.0","97.0","111.0","113.2","117.0"],"hurtful":["26.1","52.1"],"prioritize":["26.1","52.1"],"former":["26.1","52.1"],"disregard":["26.1","52.1"],"said":["26.1","52.1"],"most":["26.1","27.3","28.0","52.1","56.3"],"will":["26.1","52.1","69.0","72.0","87.0"],"take":["26.1","27.1","52.1","56.1","72.1","80.15","92.1","113.1"],"trained":["26.2","52.2"],"themselves":["26.2","52.2"],"recognize":["26.2","52.2"],"good":["26.2","52.2","72.6"],"bad":["26.2","52.2"],"design":["26.2","52.2"],"articulate":["26.2","52.2"],"differences":["26.2","52.2","92.2"],"seem":["26.3","52.3"],"game":["26.3","52.3","80.40","81.2","102.22","103.2"],"state":["26.3","52.3"],"publicly":["26.3","52.3"],"share":["26.3","47.0","52.3","70.0","89.0","111.0"],"accomplishment":["26.3","52.3"],"nitpicky":["27.0","56.0"],"attack":["27.0","56.0"],"low":["27.0","56.0"],"nothing":["27.0","56.0"],"short":["27.0","56.0"],"big":["27.0","56.0"],"fan":["27.0","56.0"],"look":["27.1","40.0","56.1","70.1","89.1","111.1"],"opposite":["27.1","56.1"],"end":["27.1","56.1"],"spectrum":["27.1","56.1"],"frequent":["27.1","56.1"],"mindless":["27.1","56.1"],"mechanic":["27.1","56.1"],"need":["27.1","56.1"],"click":["27.1","56.1"],"progress":["27.1","27.3","56.1","56.3","72.2","113.2"],"buy":["27.2","27.3","56.2","56.3","73.0","80.6","93.0","114.0"],"amongst":["27.2","47.0","56.2"],"eternity":["27.2","56.2"],"respectively":["27.2","56.2"],"option":["27.2","56.2"],"mental":["27.2","56.2"],"queue":["27.2","56.2"],"reached":["27.2","56.2"],"optimal":["27.2","56.2"],"order":["27.2","56.2"],"trivial":["27.2","56.2"],"particularly":["27.2","56.2"],"engaging":["27.2","56.2"],"only":["27.2","27.3","40.0","56.2","56.3","80.35","102.17"],"offense":["27.2","56.2"],"further":["27.3","56.3"],"narrative":["27.3","56.3"],"throughline":["27.3","56.3"],"layers":["27.3","56.3","80.12","80.26","102.8","113.3"],"many":["27.3","41.0","56.3","66.0","107.0"],"justifications":["27.3","56.3"],"resetting":["27.3","56.3","80.37","102.19"],"wants":["27.3","56.3"],"inevitably":["27.3","56.3"],"generic":["27.3","56.3"],"increasingly":["27.3","56.3"],"loosely":["27.3","56.3"],"associated":["27.3","41.0","56.3"],"unfortunate":["27.3","56.3"],"opinion":["27.3","56.3"],"interesting":["27.3","56.3"],"innovative":["27.3","56.3"],"gets":["27.3","56.3"],"prestige":["27.3","56.3","80.22","102.4"],"unlocked":["27.3","56.3","68.0","71.0","72.5","91.0","96.0","112.0","113.6","116.0"],"recent":["27.3","56.3"],"really":["27.3","56.3"],"grass":["27.3","56.3"],"cutting":["27.3","56.3"],"criticizing":["27.3","56.3"],"roblox":["27.3","56.3"],"except":["27.3","56.3"],"continue":["27.3","56.3"],"after":["27.3","56.3","61.3","68.0","73.0","90.0","93.0","114.0"],"enough":["27.3","47.0","56.3"],"increase":["27.3","56.3"],"your":["27.3","56.3","80.54","92.4","102.36","113.4"],"impact":["27.4","56.4"],"multiply":["27.4","56.4"],"gain":["27.4","56.4","69.0","93.0","114.0"],"cost":["27.4","56.4"],"n":["27.4","56.4"],"costs":["27.4","56.4"],"times":["27.4","56.4","92.4","113.4"],"games":["28.0","50.0"],"notably":["28.0"],"hosts":["28.0"],"studio":["29.0","76.0","98.0","118.0"],"older":["30.0","80.11"],"version":["30.0"],"built":["30.0"],"open":["31.0","48.0"],"twitter":["33.0"],"me":["34.0"],"available":["34.0"],"planar":["35.0"],"pioneers":["35.0"],"profectus":["35.0"],"v":["35.0","35.2"],"going":["35.1"],"own":["35.1"],"pages":["35.1"],"buds":["35.2"],"grants":["37.0"],"users":["37.0"],"right":["37.0","80.24","102.6"],"a":["38.0","49.0","80.24","97.0","97.1","102.6","117.0","117.1"],"changes":["38.1"],"color":["38.1","92.6"],"red":["38.1","76.0","98.0","118.0"],"green":["38.1"],"oz42mkvlzqi":["38.1"],"namely":["38.2"],"carstens":["38.2"],"ag501":["38.2"],"png":["38.2"],"addition":["38.2","59.0","78.0","100.0"],"restrain":["40.0"],"behave":["40.0"],"belong":["41.0"],"groups":["41.0"],"person":["41.0","45.3"],"permanently":["41.0"],"server":["42.0"],"software":["42.0"],"relationships":["43.0"],"analyses":["43.0"],"undefined":["43.0"],"known":["44.0"],"typically":["44.0"],"having":["44.0","51.0"],"ads":["44.0"],"marketers":["44.0"],"individual":["45.0"],"sites":["45.0"],"random":["45.1"],"button":["45.1","80.17","80.31","85.0","96.0","102.13","116.0"],"and":["45.1","61.1","61.10","80.5","80.20","80.27","80.34","81.3","102.2","102.9","102.16"],"filters":["45.1"],"929ac2907c2e":["45.2"],"hosting":["45.2"],"static":["45.2"],"neocities":["45.2"],"kind":["45.3","62.2","81.3","92.2","103.3","113.2"],"rss":["45.4","46.0"],"allow":["45.4"],"ideally":["45.5"],"d":["45.5"],"use":["45.5","80.30","81.2","93.0","102.12","103.2","114.0"],"system":["45.5"],"automatic":["46.0"],"process":["46.0"],"exists":["46.0"],"we":["46.0"],"changelog":["46.0"],"creations":["47.0"],"never":["47.0","80.2","80.54","102.36"],"became":["47.0"],"performance":["47.0"],"parallelization":["47.0"],"involved":["47.0"],"grow":["50.0"],"cross":["50.0"],"pollinating":["50.0"],"host":["50.0"],"everyone":["51.0"],"plans":["51.0"],"paid":["51.0"],"cangenpoints":["59.0","73.0","78.0","93.0","100.0","114.0"],"js":["59.0","72.1","78.0","97.1","100.0","117.1"],"fulllayerreset":["59.0","78.0","100.0"],"layerdatareset":["59.0","78.0","100.0"],"array":["59.0","72.1","78.0","92.1","100.0"],"names":["59.0","78.0","88.0","100.0"],"values":["59.0","74.0","78.0","94.0","100.0","115.0","116.0"],"keep":["59.0","78.0","100.0"],"documentation":["60.0","80.10"],"api":["61.2"],"milestone":["61.2","80.23","102.5"],"hitting":["61.3"],"keepgoing":["61.3"],"buffed":["61.4"],"milestones":["61.5","80.15"],"favicon":["61.6"],"header":["61.6"],"f":["61.7"],"highlighted":["61.8","76.0","92.6","98.0","118.0"],"before":["61.8"],"implemented":["61.9","61.11","61.12"],"faster":["61.10"],"late":["61.10"],"row":["61.11","80.46","102.28"],"treated":["62.0"],"differently":["62.0"],"x":["62.0"],"value":["62.0","72.5","73.0","92.0","93.0","113.0","114.0"],"instead":["62.0","67.0","77.0"],"plain":["62.0"],"number":["62.0","72.4","92.4","113.4","113.5"],"perform":["62.0"],"operations":["62.0","80.49","102.31"],"calling":["62.0"],"functions":["62.0","72.3","80.51","92.3","92.5","97.3","102.33","117.3"],"e":["62.0"],"g":["62.0"],"tab":["62.1","80.24","95.0","102.6"],"layouts":["62.1"],"optional":["62.1","75.0"],"tabs":["62.1","95.0"],"layout":["62.1"],"generalized":["62.2","103.3"],"variant":["62.2","103.3"],"of":["62.2","70.2","80.15","80.49","89.2","102.31","103.3","111.2"],"inside":["62.3"],"achievements":["62.3","69.0","92.2","103.4","110.0","113.2"],"form":["63.0","64.0","66.0","74.0","75.0","83.0","86.0","87.0","90.0","94.0","105.0","107.0","108.0","109.0","115.0"],"keys":["63.0","64.0","66.0","72.4","74.0","75.0","83.0","86.0","87.0","90.0","92.5","94.0","97.3","105.0","107.0","108.0","109.0","113.5","115.0","116.0","117.3"],"attributes":["63.0","66.0","72.4","74.0","75.0","86.0","87.0","90.0","92.5","94.0","97.3","107.0","108.0","109.0","113.5","115.0","116.0","117.3"],"strings":["63.0","66.0","71.0","82.0","86.0","87.0","91.0","104.0","107.0","108.0","109.0","112.0","116.0"],"assigned":["63.0","66.0","82.0","85.0","86.0","87.0","104.0","107.0","108.0","109.0"],"automagically":["63.0","66.0","82.0","85.0","86.0","87.0","104.0","107.0","108.0","109.0"],"similar":["63.0","72.2","82.0","85.0","99.0","113.2","119.0"],"basestyle":["64.0","83.0","105.0"],"fillstyle":["64.0","83.0","105.0"],"borderstyle":["64.0","83.0","105.0"],"textstyle":["64.0","82.0","83.0","104.0","105.0"],"css":["64.0","66.0","72.4","74.0","75.0","83.0","86.0","90.0","94.0","97.3","105.0","107.0","108.0","109.0","113.5","115.0","117.3"],"unfilled":["64.0","83.0","105.0"],"border":["64.0","83.0","105.0"],"object":["64.0","72.4","74.0","75.0","83.0","94.0","97.3","102.38","105.0","113.5","115.0","116.0","117.3"],"currency":["65.0","106.0"],"type":["65.0","84.0","106.0"],"normal":["65.0","84.0","106.0"],"determines":["65.0","72.1","84.0","92.1","106.0","113.1"],"formula":["65.0","84.0","106.0"],"calculating":["65.0","84.0","106.0"],"exponent":["65.0","84.0","106.0"],"spending":["66.0"],"buymax":["66.0","107.0"],"possible":["66.0","107.0"],"applies":["66.0","74.0","75.0","86.0","94.0","107.0","108.0","109.0","115.0"],"name":["66.0","77.0","85.0","107.0","109.0"],"change":["67.0","99.0","119.0"],"currencydisplayname":["67.0","77.0","99.0","119.0"],"currencyinternalname":["67.0","77.0","99.0","119.0"],"currencylayer":["67.0","77.0"],"omit":["67.0","77.0"],"directly":["67.0","80.55"],"returning":["68.0","71.0","72.1","73.0","91.0","92.1","93.0","112.0","113.1","114.0"],"everything":["68.0","90.0"],"likely":["68.0"],"changing":["68.0","95.0"],"based":["68.0","80.21","80.43","102.3","102.25"],"basic":["68.0","103.0"],"html":["68.0","80.46","81.0","102.28","103.0"],"bool":["68.0","71.0","91.0","92.3","112.0","113.3"],"visible":["68.0","71.0","72.1","80.15","91.0","92.1","96.0","112.0","113.1"],"canclick":["68.0"],"challs":["69.0","80.46","102.28"],"challenges":["69.0","80.5","80.18","80.20","80.37","102.2","102.19","110.0"],"appropriate":["69.0","72.5","88.0","110.0"],"buyables":["69.0","80.20","80.40","88.0","102.2","102.22","110.0"],"clickables":["69.0","80.5","80.37","88.0","102.19","110.0"],"pixels":["69.0","88.0","110.0"],"microtabs":["69.0","88.0","110.0"],"area":["69.0","88.0","110.0"],"update":["70.0","89.0","95.0","111.0"],"extra":["70.0","80.6","89.0","92.2","111.0"],"effort":["70.0","89.0","111.0"],"githack":["70.0","89.0","111.0"],"cloning":["70.1","89.1","111.1"],"downloading":["70.1","89.1","111.1"],"bottom":["70.2","89.2","97.1","111.2","117.1"],"corner":["70.2","86.0","87.0","89.2","111.2"],"add":["70.2","81.2","89.2","95.0","103.2","111.2"],"summary":["70.2","89.2","111.2"],"master":["70.2","80.43","102.25"],"finally":["70.2"],"middle":["70.2"],"push":["70.2"],"origin":["70.2"],"onto":["70.2"],"crash":["72.0"],"isn":["72.0"],"included":["72.0"],"sometimes":["72.0","81.3","113.3"],"layershown":["72.1","92.1","113.1"],"ghost":["72.1","92.1","113.1"],"hide":["72.1","80.34","80.51","92.1","97.0","102.16","102.33","113.1","117.0"],"space":["72.1","80.15","92.1","113.1"],"hotkeys":["72.1","92.1"],"key":["72.1","85.0","99.0","119.0"],"bars":["72.2"],"display":["72.2","80.25","81.0","102.7","103.0"],"bar":["72.2","88.0","110.0","113.2"],"gague":["72.2","113.2"],"customizable":["72.2","113.2"],"vertical":["72.2","92.2","113.2"],"canbuymax":["72.3"],"buying":["72.3"],"max":["72.3","86.0"],"permitted":["72.3"],"gainmult":["72.3","80.10","84.0","92.3"],"gainexp":["72.3","92.3"],"calculate":["72.3","92.3"],"multiplier":["72.3","84.0","92.3"],"theme":["72.4","97.3","113.5","117.3"],"affected":["72.4","97.3","113.5","117.3"],"colors":["72.4","97.3","113.5","117.3"],"nodestyle":["72.4","97.3","113.5","117.3"],"styles":["72.4","92.5","97.3","113.5","117.3"],"resetsnothing":["72.5","113.6"],"returns":["72.5","73.0","81.0","92.4","93.0","103.0","113.4","113.6","114.0"],"true":["72.5","87.0","92.1","92.3","113.1","113.3"],"shouldn":["72.5","113.6"],"trigger":["72.5","113.6"],"increaseunlockorder":["72.5","113.6"],"first":["72.5","76.0","97.2","98.0","113.6","117.2","118.0"],"unlockorder":["72.5","113.6"],"yet":["72.5","80.15","113.6"],"list":["72.5","113.6"],"supporting":["72.6"],"examples":["73.0"],"taken":["73.0","93.0","114.0"],"care":["73.0","93.0","114.0"],"var":["73.0","93.0","114.0"],"doreset":["73.0","93.0","114.0"],"onpurchase":["73.0","93.0","114.0"],"blowupeverything":["73.0","93.0","114.0"],"getstartpoints":["73.0","93.0","114.0"],"starts":["73.0","93.0","114.0"],"boolean":["73.0","93.0","114.0"],"generated":["73.0","93.0","114.0"],"upgrade":["73.0","92.6","93.0","114.0"],"generating":["73.0","93.0","114.0"],"getpointgen":["73.0","93.0","114.0"],"calculates":["73.0","93.0","114.0"],"per":["73.0","93.0","114.0"],"second":["73.0","92.4","93.0","113.4","114.0"],"affects":["73.0","93.0","96.0","114.0","116.0"],"point":["73.0","93.0","114.0"],"becomes":["74.0"],"locked":["74.0","94.0","115.0"],"check":["74.0","94.0","115.0"],"switched":["75.0"],"visual":["76.0","80.41","98.0","102.23","118.0"],"scroll":["76.0","98.0","118.0"],"feature":["77.0"],"currencylocation":["77.0"],"commit":["79.0","101.0"],"inputs":["80.2"],"moves":["80.3"],"setspeed":["80.3"],"major":["80.4"],"related":["80.4","80.44","102.26"],"issue":["80.4"],"default":["80.5","83.0","96.0","105.0"],"stars":["80.5"],"multi":["80.5"],"completion":["80.5","86.0","108.0"],"buyable":["80.6","80.43","102.25"],"issues":["80.7","80.20","80.33","80.37","102.2","102.15","102.19"],"commas":["80.7","80.37","102.19"],"appearing":["80.7","80.25","80.45","102.7","102.27"],"fixed":["80.8","80.13","80.15","80.20","80.25","80.28","80.33","80.37","80.39","80.41","80.50","102.2","102.7","102.10","102.15","102.19","102.21","102.23","102.32"],"star":["80.9","86.0","87.0"],"originally":["80.9"],"jacorb":["80.9"],"proxy":["80.9"],"component":["80.9","80.25","102.7"],"exp":["80.10"],"compatibility":["80.11"],"small":["80.13"],"tabformat":["80.14"],"longer":["80.15","80.18"],"hidden":["80.15","81.4"],"tiny":["80.15"],"centered":["80.15"],"respec":["80.15","80.43","102.25"],"few":["80.16"],"prestigenotify":["80.17"],"subtabs":["80.17"],"highlights":["80.17"],"attempts":["80.18"],"automatically":["80.19","92.4","92.6","102.1","113.4"],"keeping":["80.19","80.20","102.1","102.2"],"decimal":["80.19","102.1"],"spacing":["80.21","102.3"],"types":["80.22","92.4","102.4","113.4"],"achievement":["80.23","102.5"],"side":["80.24","102.6"],"comma":["80.25","102.7"],"main":["80.25","102.7"],"was":["80.25","85.0","102.7"],"lets":["80.26","102.8"],"shown":["80.26","81.4","102.8"],"somewhere":["80.26","102.8"],"classed":["80.27","102.9"],"objects":["80.27","102.9"],"visually":["80.28","102.10"],"updating":["80.28","80.33","102.10","102.15"],"layerdata":["80.29","102.11"],"fixoldsaves":["80.30","102.12"],"nodes":["80.31","88.0","102.13"],"branches":["80.32","102.14"],"startdata":["80.33","102.15"],"thank":["80.33","102.15"],"handled":["80.34","102.16"],"intelligently":["80.34","102.16"],"renamed":["80.34","102.16"],"files":["80.34","102.16"],"moved":["80.34","80.51","102.16","102.33"],"folder":["80.34","102.16"],"specifying":["80.35","102.17"],"height":["80.35","102.17"],"outdated":["80.38","102.20"],"docs":["80.38","102.20","103.0"],"improvements":["80.38","102.20"],"buttons":["80.40","80.43","81.2","102.22","102.25","103.2"],"old":["80.40","80.51","102.22","102.33"],"demo":["80.40","102.22"],"clickableeffect":["80.41","102.23"],"interfering":["80.42","102.24"],"limit":["80.43","102.25"],"mechanics":["80.43","102.25"],"made":["80.43","102.25"],"clickable":["80.43","81.3","102.25"],"offline":["80.44","102.26"],"index":["80.46","102.28"],"editing":["80.46","102.28"],"needed":["80.46","102.28"],"tmp":["80.46","102.28"],"does":["80.46","92.4","102.28","113.4"],"manually":["80.46","102.28"],"updated":["80.46","102.28"],"tutorial":["80.47","102.29"],"started":["80.47","102.29"],"fix":["80.48","102.30"],"able":["80.48","102.30"],"immediately":["80.50","102.32"],"importing":["80.50","102.32"],"saves":["80.50","102.32"],"challeffect":["80.51","102.33"],"completed":["80.51","102.33"],"setting":["80.51","102.33"],"changelogs":["80.51","102.33"],"hasupg":["80.52","102.34"],"haschall":["80.52","102.34"],"hasmilestone":["80.52","102.34"],"inchallenge":["80.52","102.34"],"useful":["80.53","102.35"],"unique":["80.54","102.36"],"mod":["80.54","102.36"],"conflict":["80.54","102.36"],"mods":["80.54","102.36"],"third":["80.56","102.38"],"release":["80.57"],"almost":["81.0","92.0","103.0","113.0"],"dynamic":["81.0","92.0","103.0","113.0"],"putting":["81.0","103.0"],"function":["81.0","95.0","103.0"],"given":["81.0","103.0"],"text":["81.0","81.4","92.1","103.0","113.1"],"rid":["81.2","103.2"],"thing":["81.3"],"map":["81.4"],"tiles":["81.4"],"inventory":["81.4"],"grid":["81.4"],"infoboxes":["81.4"],"containing":["81.4","88.0"],"image":["85.0","86.0","87.0"],"url":["85.0","86.0","87.0"],"stored":["85.0"],"under":["85.0","99.0","119.0"],"convenient":["85.0","99.0","119.0"],"access":["85.0","99.0","119.0"],"sell":["85.0"],"sellone":["85.0"],"sellall":["85.0"],"cause":["85.0"],"appear":["85.0","95.0"],"beneath":["85.0"],"functionally":["85.0"],"identical":["85.0"],"completionlimit":["86.0","108.0"],"marked":["86.0","87.0"],"adds":["86.0","87.0"],"mark":["86.0","87.0"],"starred":["86.0"],"id":["88.0","110.0"],"infobox":["88.0","110.0"],"arrays":["88.0"],"creates":["89.2","111.2"],"snapshot":["89.2","111.2"],"looks":["89.2","111.2"],"moment":["89.2","111.2"],"allowing":["89.2","111.2"],"displayed":["90.0"],"top":["90.0"],"larger":["90.0"],"font":["90.0"],"title":["90.0"],"getstyle":["90.0"],"description":["92.1","113.1"],"stays":["92.1","113.1"],"defaults":["92.1","113.1"],"different":["92.2"],"roundupcost":["92.3","113.3"],"needs":["92.3","99.0","119.0"],"rounded":["92.3"],"passivegeneration":["92.4","113.4"],"regular":["92.4","113.4"],"generate":["92.4","113.4"],"tooltip":["92.5","97.3","117.3"],"tooltiplocked":["92.5","97.3","117.3"],"return":["92.5","92.6"],"shouldnotify":["92.6"],"whether":["92.6"],"glowcolor":["92.6"],"go":["93.0"],"calculation":["93.0"],"addedplayerdata":["93.0"],"position":["95.0"],"offset":["95.0"],"far":["95.0"],"start":["95.0"],"xvel":["95.0"],"yvel":["95.0"],"initially":["95.0"],"properties":["95.0"],"movement":["95.0"],"leaving":["95.0"],"erased":["95.0"],"must":["95.0","113.3"],"impliment":["95.0"],"effects":["95.0"],"yourself":["95.0"],"stay":["95.0"],"advanced":["95.0"],"appearance":["96.0","116.0"],"always":["96.0"],"keyword":["96.0"],"edit":["97.1","117.1"],"node":["97.2","117.2"],"duplicates":["97.2","117.2"],"include":["99.0","119.0"],"details":["103.0"],"working":["103.0"],"effectively":["108.0"],"onclick":["109.0"],"implements":["109.0"],"clicking":["109.0"],"applied":["113.1"],"effectdescription":["113.1"],"described":["113.3"],"absent":["113.3"],"greater":["113.3"],"otherwise":["113.6"],"supported":["113.6"],"resets":["113.6"],"buttonstyle":["116.0"]},{"1":["67.0"],"2":["61.11","80.16"],"3":["92.1"],"4":["61.2"],"6":["70.1","89.1","111.1"],"7":["89.2","111.2"],"8":["70.2","89.2","111.2"],"10":["24.5","57.5"],"17":["0.0"],"26":["0.0"],"27":["0.0"],"52":["0.0"],"60":["0.0"],"72":["73.0","93.0","114.0"],"100":["27.1","56.1"],"141":["0.0"],"federated":["1.0","15.0","36.0"],"social":["1.0","7.0","14.0","36.0"],"than":["2.0","23.2","55.2","88.0"],"anticipated":["2.0"],"but":["2.0","35.1","72.2"],"end":["2.0","24.4","25.0","53.0","57.4"],"result":["2.0"],"is":["2.0","15.4","43.0","45.5","62.2","76.0","80.47","90.0","98.0","102.29","103.3","118.0"],"large":["2.0"],"awesome":["2.0"],"tv":["2.0"],"designed":["3.0"],"small":["3.0","24.6","57.6","80.15"],"dice":["4.0"],"armor":["4.0"],"don":["4.0","24.0","57.0"],"t":["4.0","23.3","24.9","55.3","57.9","80.40","102.22","116.0"],"believe":["4.0","26.1","27.1","52.1","56.1"],"ever":["4.0"],"more":["5.0","9.0","24.10","26.2","27.4","52.2","56.4","57.10","70.0","80.27","80.35","80.48","80.50","89.0","102.9","102.17","102.30","102.32","111.0"],"details":["5.0"],"visit":["5.0"],"page":["5.0","80.47","102.29"],"defined":["6.0","62.0"],"chatting":["6.0"],"stores":["7.0"],"knowledge":["7.0"],"media":["7.0"],"overuses":["7.0"],"timelines":["7.0"],"and":["7.0","33.0","37.0","45.2","45.5","62.2","80.19","80.47","81.2","102.1","102.29","103.2","103.3"],"feeds":["7.0"],"the":["8.0","42.0","61.3","61.7","80.37","80.51","80.52","102.19","102.33","102.34"],"matrix":["8.0"],"accessible":["9.0"],"laxla":["9.0"],"tech":["9.0"],"lgbt":["9.0"],"creating":["9.0"],"gimli":["9.0"],"discord":["9.0","50.0","80.38","102.20"],"alternative":["9.0","18.0"],"activitypub":["9.0"],"guild":["9.0"],"based":["9.0"],"ways":["9.0"],"with":["10.0","14.0","23.4","55.4","70.0","70.2","80.35","80.40","80.50","80.56","89.0","89.2","92.6","102.17","102.22","102.32","102.38","111.0","111.2"],"game":["10.0","62.3","92.1","103.0","103.4","113.1"],"creator":["10.0"],"customize":["11.0","15.5","81.2","103.2"],"your":["11.0","67.0","72.1","77.0","92.1","99.0","113.1","119.0"],"experience":["11.0","26.2","27.1","52.2","56.1"],"single":["11.0","12.0","23.6","27.1","51.0","55.6","56.1"],"entity":["11.0"],"make":["11.0","23.1","23.6","27.0","55.1","55.6","56.0","72.5","80.25","81.4","102.7","113.6"],"worse":["11.0"],"for":["11.0","23.4","24.5","26.3","32.0","42.0","46.0","51.0","52.3","55.4","57.5","64.0","72.4","80.22","83.0","102.4","105.0","113.5"],"changed":["12.0","80.52","80.53","102.34","102.35"],"during":["12.0"],"checked":["12.0"],"owned":["12.0"],"generate":["12.0"],"sold":["12.0"],"indicators":["12.0"],"left":["12.0","97.2","117.2"],"choose":["12.0"],"filter":["12.0"],"options":["12.0"],"down":["12.0","92.1","113.1"],"effect":["12.0","23.1","55.1"],"updates":["12.0"],"only":["12.0","24.3","30.0","57.3","70.1","80.29","89.1","92.7","102.11","111.1","113.7"],"inventory":["12.0"],"works":["12.0","60.0"],"most":["12.0","50.0","92.3"],"same":["12.0","27.4","56.4","64.0","71.0","74.0","83.0","87.0","91.0","92.5","94.0","97.3","105.0","112.0","115.0","117.3"],"equipping":["12.0"],"allows":["12.0"],"drag":["12.0"],"individual":["12.0"],"entire":["12.0","23.6","27.2","55.6","56.2"],"equipped":["12.0"],"glyph":["12.0"],"while":["12.0","23.0","55.0","81.0","103.0"],"dragging":["12.0"],"highlight":["12.0","80.12"],"slots":["12.0"],"rolling":["12.0"],"uses":["12.0","14.0","86.0","108.0"],"physics":["12.0"],"engine":["12.0"],"detects":["12.0"],"once":["12.0","27.2","56.2"],"stopped":["12.0"],"moving":["12.0"],"determines":["12.0"],"com":["13.0","70.2","89.2","111.2"],"maggieappleton":["13.0"],"gardeners":["13.0"],"lyz":["13.0"],"code":["13.0","60.0","70.0","80.19","80.52","89.0","102.1","102.34","111.0"],"best":["13.0","23.0","26.1","52.1","55.0","76.0","98.0","118.0"],"pre":["14.0"],"configured":["14.0"],"explicitly":["14.0","45.1"],"allowed":["14.0"],"incremental":["14.0","24.11","57.11"],"these":["15.1","62.2","76.0","98.0","103.3","118.0"],"ideas":["15.1"],"are":["15.1","26.2","27.1","52.2","56.1","80.15","80.26","102.8"],"learned":["15.1"],"lessons":["15.1"],"from":["15.1","23.3","23.5","23.6","24.7","55.3","55.5","55.6","57.7","80.9","88.0"],"usenet":["15.1"],"days":["15.1"],"weird":["15.1"],"may":["15.1","24.11","27.4","45.0","56.4","57.11","81.0","103.0"],"eventually":["15.1","27.3","56.3"],"move":["15.1","27.2","56.2"],"in":["15.1","24.9","40.0","57.9","61.3","65.0","80.7","80.13","80.15","80.30","80.37","80.49","80.54","84.0","92.0","92.2","102.12","102.19","102.31","102.36","106.0","113.0","113.2"],"direction":["15.1","95.0"],"say":["15.2"],"author":["15.2"],"x":["15.2","72.1","92.1","113.1"],"handle":["15.2"],"losing":["15.2","24.7","57.7"],"do":["15.2","23.0","27.1","55.0","56.1","64.0","66.0","71.0","81.3","83.0","86.0","91.0","92.7","94.0","95.0","105.0","112.0","113.7","115.0"],"has":["15.2","30.0"],"new":["15.2","24.8","57.8","62.1"],"essentially":["15.3"],"like":["15.3","24.0","35.0","45.2","57.0","67.0","81.2","97.1","103.2","117.1"],"existing":["15.3","21.0"],"specific":["15.3","22.2","54.2"],"poster":["15.3"],"id":["15.3","69.0","71.0","91.0","92.6","112.0"],"will":["15.4","24.0","26.3","52.3","57.0","66.0","72.5","80.29","80.46","81.0","102.11","102.28","107.0"],"inevitably":["15.4"],"keep":["15.4","76.0","98.0","118.0"],"full":["15.4"],"history":["15.4"],"though":["15.4"],"groups":["15.4"],"communities":["15.4"],"just":["15.4","24.9","57.9","72.3","81.3","97.1","117.1"],"specially":["15.4"],"flagged":["15.4"],"posting":["15.4"],"community":["15.4","24.3","57.3"],"replying":["15.4"],"looking":["15.5"],"analyzing":["15.5"],"content":["15.5"],"ai":["15.5"],"this":["15.5","20.0","22.0","40.0","54.0","64.0","71.0","83.0","91.0","97.0","105.0","112.0","117.0"],"way":["15.5","23.5","40.0","55.5","67.0","72.2","77.0","99.0","113.2","119.0"],"effectively":["15.5","27.4","56.4"],"preferred":["15.5"],"also":["15.5","97.0","117.0"],"add":["15.5","87.0","109.0"],"additional":["15.5","25.1","53.1","66.0","107.0"],"redundancy":["15.6"],"multiple":["15.6","80.45","102.27"],"relay":["15.6"],"cannot":["15.6"],"trust":["15.6"],"several":["15.6","61.4","92.6"],"identical":["15.6","66.0","107.0"],"rules":["15.6"],"not":["15.6","38.1","61.1","61.2","80.1","80.14","80.39","95.0","102.21"],"relaying":["15.6"],"typically":["16.0","22.1","54.1"],"refers":["16.0"],"sites":["16.0"],"implementing":["16.0"],"repository":["17.0"],"hosting":["17.0"],"living":["18.0"],"documents":["18.0"],"theoretical":["18.0"],"mentions":["20.0","39.0"],"some":["20.0","24.6","39.0","57.6","76.0","85.0","98.0","118.0"],"of":["20.0","28.0","35.1","39.0","80.37","80.54","102.19","102.36","102.38"],"display":["21.0","63.0","73.0","80.29","80.30","82.0","93.0","102.11","102.12","104.0","114.0"],"changes":["21.0","70.0","80.16","86.0","89.0","108.0","111.0"],"similar":["21.0","27.2","56.2","66.0","71.0","86.0","87.0","91.0","104.0","107.0","108.0","109.0","112.0"],"git":["21.0","46.0"],"diffs":["21.0"],"s":["22.0","22.1","50.0","54.0","54.1","64.0","71.0","74.0","80.24","81.2","83.0","91.0","94.0","97.1","102.6","103.2","105.0","112.0","115.0","117.1"],"explore":["22.0","54.0"],"reasons":["22.0","26.3","52.3","54.0"],"why":["22.0","23.6","54.0","55.6"],"technically":["22.1","54.1"],"phone":["22.1","54.1"],"all":["22.1","24.4","27.2","54.1","56.2","57.4","59.0","60.0","62.0","78.0","80.46","92.0","100.0","102.28","107.0","109.0","113.0"],"javascript":["22.1","54.1"],"perfectly":["22.1","54.1"],"viable":["22.1","45.3","54.1"],"language":["22.1","54.1"],"making":["22.1","35.0","54.1"],"games":["22.1","54.1"],"whereas":["22.1","54.1"],"going":["22.1","54.1","70.2","89.2","111.2"],"general":["22.2","54.2"],"as":["22.2","45.3","54.2","75.0","92.5","97.3","117.3"],"well":["22.2","54.2"],"tend":["22.2","54.2"],"very":["22.2","23.6","54.2","55.6","80.15"],"developer":["22.2","54.2"],"friendly":["22.2","54.2"],"a":["22.2","35.1","41.0","54.2","80.18","80.25","80.30","80.35","80.40","80.41","80.43","92.7","102.7","102.12","102.17","102.22","102.23","102.25","113.7"],"lot":["22.2","47.0","54.2"],"expected":["22.3","54.3"],"if":["22.3","24.5","25.1","53.1","54.3","57.5","80.29","92.5","102.11","116.0"],"an":["22.3","28.0","54.3"],"it":["22.3","45.3","54.3","71.0","91.0","95.0","96.0","97.1","112.0","117.1"],"almost":["22.3","54.3","62.0"],"certainly":["22.3","24.1","24.2","54.3","57.1","57.2"],"accepting":["22.3","54.3"],"my":["23.0","24.0","24.9","25.0","25.1","26.2","52.2","53.0","53.1","55.0","57.0","57.9"],"contextualize":["23.0","55.0"],"generalize":["23.0","55.0"],"without":["23.0","55.0"],"requiring":["23.0","55.0"],"reader":["23.0","55.0"],"watch":["23.0","55.0"],"worth":["23.0","55.0"],"disagreed":["23.0","55.0"],"does":["23.1","27.1","55.1","56.1"],"detract":["23.1","23.3","55.1","55.3"],"however":["23.1","55.1"],"actually":["23.1","41.0","55.1","61.1"],"part":["23.1","23.6","55.1","55.6"],"makes":["23.1","23.5","55.1","55.5"],"augments":["23.1","55.1"],"increases":["23.1","55.1","72.5","113.6"],"naturally":["23.1","55.1"],"gaining":["23.1","55.1"],"they":["23.1","23.3","26.1","52.1","55.1","55.3","66.0","80.26","92.3","102.8","107.0"],"play":["23.1","23.5","23.6","24.6","55.1","55.5","55.6","57.6","72.1","92.1","113.1"],"replacing":["23.1","55.1"],"increase":["23.1","55.1"],"exaggerating":["23.1","55.1"],"exacerbate":["23.2","55.2"],"video":["23.2","55.2"],"other":["23.2","24.6","45.0","45.5","55.2","57.6","61.10","69.0","72.2","76.0","80.41","81.0","81.2","98.0","102.23","103.2","113.2","118.0"],"genres":["23.2","55.2"],"taking":["23.2","55.2"],"priority":["23.2","55.2"],"life":["23.2","55.2"],"manipulating":["23.2","55.2"],"sleep":["23.2","55.2"],"schedule":["23.2","55.2"],"prudent":["23.2","55.2"],"help":["23.2","55.2"],"r":["23.2","55.2"],"stopgaming":["23.2","55.2"],"resources":["23.2","55.2","92.7","113.7"],"since":["23.2","26.2","50.0","52.2","55.2"],"built":["23.2","55.2"],"on":["23.2","24.0","27.2","55.2","56.2","57.0","72.0","72.2","80.19","80.20","102.1","102.2","113.2"],"extrinsic":["23.2","55.2"],"motivations":["23.2","55.2"],"form":["23.2","46.0","55.2","67.0","68.0","77.0"],"progression":["23.2","55.2"],"systems":["23.2","55.2"],"whether":["23.2","55.2","72.5","85.0","113.6"],"continue":["23.2","55.2"],"because":["23.2","26.0","27.1","52.0","55.2","56.1"],"enjoying":["23.2","55.2"],"gameplay":["23.2","24.7","27.1","30.0","55.2","56.1","57.7"],"figured":["23.3","55.3"],"out":["23.3","55.3","72.0","81.0","89.2","111.2"],"optimized":["23.3","55.3"],"mastered":["23.3","55.3"],"doesn":["23.3","24.6","27.2","55.3","56.2","57.6","93.0"],"sense":["23.3","27.4","55.3","56.4"],"engaged":["23.4","55.4"],"longer":["23.4","55.4","80.37","80.46","102.19","102.28"],"compared":["23.4","55.4"],"ended":["23.5","55.5"],"up":["23.5","27.3","55.5","56.3","70.0","89.0","93.0","111.0","113.3"],"ruined":["23.5","24.1","55.5","57.1"],"them":["23.5","24.0","55.5","57.0","80.43","85.0","102.25"],"developers":["23.5","55.5"],"solved":["23.5","55.5"],"removing":["23.5","55.5"],"apart":["23.5","55.5"],"intentionally":["23.5","55.5"],"one":["23.5","24.2","50.0","55.5","57.2","70.1","76.0","88.0","89.1","98.0","111.1","118.0"],"mocking":["23.5","55.5"],"playstyle":["23.5","55.5"],"did":["23.5","55.5"],"its":["23.5","55.5","61.5","86.0","92.0","92.6","108.0","113.0"],"aggressively":["23.5","55.5"],"often":["23.5","55.5"],"bring":["23.5","55.5"],"conversation":["23.5","55.5"],"back":["23.5","55.5"],"incrementals":["23.5","55.5"],"incredibly":["23.5","55.5"],"opinionated":["23.5","55.5"],"what":["23.5","25.2","26.1","52.1","53.2","55.5","69.0","72.1","92.1","110.0","113.1"],"itself":["23.6","24.1","26.3","52.3","55.6","57.1"],"chose":["23.6","55.6"],"particular":["23.6","24.2","55.6","57.2"],"design":["23.6","26.1","52.1","55.6"],"decision":["23.6","55.6"],"hell":["23.6","55.6"],"you":["23.6","24.5","24.6","25.1","41.0","53.1","55.6","57.5","57.6","61.8","71.0","80.9","80.29","80.38","81.3","91.0","92.2","102.11","102.20","112.0"],"through":["23.6","55.6"],"thought":["23.6","27.2","55.6","56.2"],"feeling":["23.6","55.6"],"i":["24.0","35.0","57.0"],"d":["24.0","24.5","57.0","57.5"],"go":["24.0","27.4","56.4","57.0","73.0","114.0"],"over":["24.0","24.3","57.0","57.3"],"couple":["24.0","25.1","27.3","47.0","53.1","56.3","57.0"],"suggestions":["24.0","57.0"],"ve":["24.0","57.0"],"seen":["24.0","57.0"],"here":["24.0","24.4","35.1","57.0","57.4","72.3","92.3","92.7","113.7"],"personal":["24.0","57.0"],"preferences":["24.0","57.0"],"state":["24.0","57.0"],"about":["24.1","25.1","53.1","57.1","81.3"],"parody":["24.1","57.1"],"commentary":["24.1","57.1"],"popular":["24.1","24.10","57.1","57.10"],"videos":["24.1","57.1"],"good":["24.1","57.1","92.4","113.4"],"satire":["24.1","57.1"],"was":["24.1","25.0","53.0","57.1","63.0","66.0","82.0","86.0","87.0","104.0","107.0","108.0","109.0"],"interested":["24.1","45.3","57.1"],"response":["24.1","57.1"],"latter":["24.1","57.1"],"fan":["24.1","24.11","57.1","57.11"],"definition":["24.1","57.1"],"ascribes":["24.1","57.1"],"motive":["24.1","57.1"],"happens":["24.1","57.1","80.46","102.28"],"apply":["24.1","57.1"],"there":["24.1","57.1"],"commenting":["24.1","57.1"],"different":["24.1","24.5","27.1","56.1","57.1","57.5","72.2","92.6","113.2"],"including":["24.1","57.1","92.0","113.0"],"case":["24.1","27.3","56.3","57.1"],"prestige":["24.1","57.1","92.5","97.3","117.3"],"tree":["24.1","30.0","57.1","70.2","72.5","80.21","102.3","110.0","113.6"],"classic":["24.1","57.1"],"ascension":["24.1","57.1"],"omega":["24.1","57.1"],"layers":["24.1","57.1","60.0","80.5","80.27","80.28","80.51","102.9","102.10","102.33"],"course":["24.1","57.1"],"optimal":["24.2","57.2"],"progress":["24.2","24.7","57.2","57.7"],"get":["24.2","27.3","56.3","57.2","92.2"],"complex":["24.2","57.2"],"we":["24.2","57.2"],"accept":["24.2","57.2"],"premise":["24.2","57.2"],"could":["24.2","27.2","56.2","57.2"],"fall":["24.2","57.2"],"under":["24.2","57.2","63.0","66.0","82.0","86.0","87.0","104.0","107.0","108.0","109.0"],"still":["24.2","45.0","57.2"],"need":["24.2","57.2","88.0"],"bit":["24.2","27.3","56.3","57.2","70.0","89.0","111.0"],"tricky":["24.2","57.2"],"due":["24.2","57.2"],"factory":["24.2","57.2"],"builders":["24.2","57.2"],"factorio":["24.2","57.2"],"satisfactory":["24.2","57.2"],"aren":["24.3","57.3"],"genre":["24.3","57.3"],"have":["24.3","41.0","57.3","72.3","72.5","80.53","102.35","113.6"],"difficulties":["24.3","57.3"],"defining":["24.3","57.3"],"themselves":["24.3","57.3"],"seems":["24.3","57.3"],"roguelikes":["24.3","57.3"],"another":["24.3","57.3","80.9","80.21","88.0","102.3"],"where":["24.3","24.8","50.0","57.3","57.8","68.0","80.26","102.8"],"argues":["24.3","57.3"],"formal":["24.3","57.3"],"incrementalness":["24.4","57.4"],"ll":["24.4","57.4"],"propose":["24.4","57.4"],"such":["24.4","57.4","72.3","92.3","113.3"],"no":["24.4","27.4","56.4","57.4","80.25","80.37","81.0","102.7","102.19","103.0"],"means":["24.4","57.4"],"considered":["24.4","57.4"],"note":["24.4","57.4"],"temple":["24.4","57.4"],"congruent":["24.5","57.5"],"so":["24.5","27.2","56.2","57.5","64.0","71.0","83.0","86.0","87.0","91.0","94.0","105.0","109.0","112.0","115.0"],"ultimately":["24.5","26.0","52.0","57.5"],"m":["24.5","57.5"],"sure":["24.5","27.0","56.0","57.5"],"asked":["24.5","26.1","52.1","57.5"],"people":["24.5","51.0","57.5"],"their":["24.5","57.5","80.43","102.25"],"node":["24.6","57.6","80.24","96.0","102.6"],"might":["24.6","57.6"],"impact":["24.6","57.6"],"qualify":["24.6","57.6"],"players":["24.6","57.6"],"percentage":["24.6","57.6"],"modifier":["24.6","57.6"],"stat":["24.6","57.6"],"simply":["24.7","57.7"],"progressing":["24.7","57.7"],"never":["24.7","27.2","56.2","57.7"],"optimization":["24.7","57.7"],"problems":["24.7","57.7"],"predominant":["24.7","57.7"],"solving":["24.7","57.7"],"deciding":["24.7","57.7"],"which":["24.7","27.3","46.0","56.3","57.7","63.0","66.0","73.0","80.5","82.0","86.0","93.0","97.0","104.0","107.0","108.0","114.0","117.0"],"purchase":["24.7","57.7"],"save":["24.7","57.7","73.0","93.0","114.0"],"reasoning":["24.7","57.7"],"something":["24.8","57.8","67.0","77.0","85.0","96.0","99.0","119.0"],"waiting":["24.8","57.8"],"mechanic":["24.8","57.8"],"come":["24.8","57.8"],"across":["24.8","57.8"],"times":["24.8","57.8","80.45","102.27"],"action":["24.8","57.8"],"can":["24.8","57.8","61.8"],"take":["24.8","57.8","93.0"],"those":["24.9","27.0","37.0","56.0","57.9","64.0","74.0","75.0","83.0","90.0","105.0"],"stretch":["24.9","57.9"],"opinion":["24.9","57.9"],"isn":["24.9","57.9","81.0","103.0"],"flash":["24.10","57.10"],"websites":["24.10","57.10"],"featured":["24.10","57.10"],"focused":["24.10","49.0","57.10"],"buying":["24.10","27.2","27.3","56.2","56.3","57.10"],"would":["24.10","26.1","45.3","50.0","52.1","57.10","85.0"],"allow":["24.10","57.10"],"attain":["24.10","57.10"],"currency":["24.10","27.3","56.3","57.10","80.18","80.51","86.0","102.33","108.0"],"sort":["24.10","57.10"],"minigame":["24.10","57.10"],"earn":["24.10","57.10"],"see":["25.0","53.0"],"changelog":["25.0","53.0","80.16"],"at":["25.0","34.0","53.0","60.0","80.34","80.54","102.16","102.36"],"made":["25.0","27.2","27.4","53.0","56.2","56.4","80.27","80.35","102.9","102.17"],"before":["25.0","27.2","41.0","53.0","56.2"],"switch":["25.0","53.0","97.1","117.1"],"myself":["25.1","27.0","47.0","53.1","56.0"],"any":["25.1","45.2","53.1","65.0","84.0","106.0"],"questions":["25.1","53.1"],"criticism":["25.3","53.3"],"important":["26.0","52.0"],"be":["26.0","45.0","52.0","72.5","76.0","80.33","98.0","102.15","113.6","118.0"],"able":["26.0","27.3","52.0","56.3","80.35","102.17"],"process":["26.0","52.0"],"navigate":["26.0","52.0"],"collecting":["26.0","52.0"],"feedback":["26.0","38.0","52.0"],"essential":["26.0","52.0"],"journey":["26.0","26.3","52.0","52.3"],"becoming":["26.0","52.0"],"better":["26.0","52.0"],"grain":["26.1","52.1"],"salt":["26.1","52.1"],"determine":["26.1","52.1","90.0","116.0"],"actual":["26.1","52.1"],"problem":["26.1","52.1"],"experiencing":["26.1","52.1"],"solution":["26.1","52.1"],"regardless":["26.1","52.1"],"player":["26.1","27.1","52.1","56.1","64.0","71.0","91.0","96.0","112.0"],"much":["26.2","52.2"],"likely":["26.2","52.2"],"leave":["26.2","52.2","72.0","81.0"],"positive":["26.2","52.2"],"constructive":["26.2","52.2"],"comments":["26.2","52.2"],"been":["26.2","52.2","61.5"],"remember":["26.3","52.3"],"passion":["26.3","52.3"],"initial":["26.3","52.3"],"into":["26.3","52.3","73.0","114.0"],"development":["26.3","52.3"],"mostly":["27.0","56.0","59.0","78.0","100.0"],"targeted":["27.0","56.0"],"toward":["27.0","56.0"],"who":["27.0","44.0","45.4","56.0"],"ask":["27.0","56.0"],"settle":["27.0","56.0"],"long":["27.0","27.2","35.1","56.0","56.2"],"provide":["27.0","56.0"],"constitutes":["27.1","56.1"],"either":["27.1","56.1"],"consecutive":["27.1","56.1"],"blends":["27.1","56.1"],"together":["27.1","56.1"],"individually":["27.1","56.1"],"change":["27.1","46.0","56.1"],"clicks":["27.1","56.1"],"meaningfully":["27.1","56.1"],"series":["27.2","56.2"],"static":["27.2","48.0","56.2","80.51","102.33"],"press":["27.2","56.2"],"tab":["27.2","56.2","92.1","113.1"],"button":["27.2","56.2","72.1","75.0","80.33","81.4","92.1","102.15","107.0","109.0","113.1"],"term":["27.3","35.1","56.3"],"reset":["27.3","56.3","80.19","80.26","85.0","102.1","102.8"],"won":["27.3","56.3","80.40","102.22"],"future":["27.3","56.3"],"prestiges":["27.3","56.3","72.3"],"crystallize":["27.3","56.3"],"crystallizes":["27.3","56.3"],"complete":["27.3","56.3","67.0"],"challenges":["27.3","56.3","80.34","102.16"],"finally":["27.3","56.3","89.2","111.2"],"grasshop":["27.3","56.3"],"grasshopping":["27.3","56.3"],"resource":["27.3","56.3"],"difference":["27.4","56.4"],"directly":["27.4","56.4","92.3"],"instance":["28.0","45.2"],"mbin":["28.0"],"forgejo":["28.0"],"karla":["29.0"],"modding":["30.0","70.2"],"goes":["30.0"],"source":["31.0"],"outlining":["31.0"],"decentralized":["32.0"],"posts":["33.0"],"reddit":["33.0"],"https":["34.0","70.2","89.2","111.2"],"ecs":["35.0","35.2"],"project":["35.1"],"opti":["35.2"],"modify":["37.0","97.1","117.1"],"redistribute":["37.0"],"3d":["38.0"],"visual":["38.0","80.4","80.10"],"system":["38.0","81.4"],"american":["38.1"],"learning":["38.1"],"novel":["38.1"],"sound":["38.1"],"found":["38.1"],"english":["38.1"],"program":["38.2"],"now":["38.2","80.46","80.51","102.28","102.33"],"includes":["38.2"],"documentation":["38.2","81.0","103.0"],"unit":["38.2"],"tests":["38.2"],"improve":["38.2"],"cool":["39.0"],"everything":["40.0"],"garden":["40.0"],"getting":["41.0"],"trial":["41.0"],"period":["41.0"],"ensure":["41.0"],"artist":["43.0"],"absent":["43.0","74.0","85.0","90.0","92.4","94.0","113.4","115.0"],"popularized":["44.0"],"article":["44.0"],"written":["44.0"],"maggie":["44.0"],"appleton":["44.0"],"chronological":["45.0"],"link":["45.0"],"between":["45.0","62.2","80.21","97.1","102.3","103.3","117.1"],"each":["45.0","73.0","92.6","93.0","114.0"],"amongst":["45.1"],"codeberg":["45.2"],"pages":["45.2"],"server":["45.2"],"how":["45.3","72.1","92.1","113.1"],"include":["45.3"],"chat":["45.3"],"messages":["45.3"],"stream":["45.3","46.0"],"want":["45.4"],"receive":["45.4"],"easily":["45.5","80.25","102.7"],"transferrable":["45.5"],"servers":["45.5","50.0"],"possibly":["45.5","85.0"],"even":["45.5","62.1","97.1","117.1"],"supports":["45.5"],"nomadic":["45.5"],"identities":["45.5"],"rtser0crjy8":["45.6"],"gives":["46.0"],"diff":["46.0"],"summary":["46.0"],"pushed":["46.0"],"indieweb":["46.0"],"overhead":["47.0"],"severely":["47.0"],"limited":["47.0"],"instead":["47.0","99.0","119.0"],"infinite":["47.0"],"procedurally":["47.0"],"generated":["47.0"],"simple":["47.0"],"site":["48.0","70.0","89.0","111.0"],"narrative":["49.0"],"bridge":["50.0"],"channel":["50.0"],"tiers":["51.0"],"giving":["51.0"],"access":["51.0","63.0","66.0","67.0","77.0","82.0","86.0","87.0","104.0","107.0","108.0","109.0"],"many":["59.0","78.0","100.0"],"were":["59.0","78.0","100.0"],"expanding":["59.0","78.0","100.0"],"abbreviations":["59.0","78.0","100.0"],"instances":["59.0","78.0","100.0"],"chall":["59.0","78.0","100.0"],"challenge":["59.0","78.0","92.6","100.0"],"unl":["59.0","78.0","100.0"],"unlocked":["59.0","75.0","78.0","80.46","92.5","97.3","100.0","102.28","113.5","117.3"],"upg":["59.0","78.0","100.0"],"upgrade":["59.0","72.5","78.0","100.0","113.6"],"besides":["59.0","78.0","100.0"],"css":["59.0","67.0","68.0","72.1","77.0","78.0","92.6","100.0"],"amt":["59.0","78.0","100.0"],"or":["60.0","70.2","72.3","80.17","81.2","103.2"],"affecting":["61.1"],"victory":["61.3"],"tas":["61.4"],"stuff":["61.5"],"lol":["61.5"],"bar":["61.6","69.0"],"layer":["61.7","64.0","71.0","73.0","80.55","83.0","91.0","96.0","102.37","105.0","112.0"],"beneath":["61.7","66.0","107.0"],"unlock":["61.8","72.5","113.6"],"slower":["61.10"],"row":["61.12","97.3","117.3"],"y":["62.0"],"constant":["62.0"],"dynamic":["62.0"],"putting":["62.0"],"function":["62.0","80.36","90.0","92.0","102.18","113.0"],"create":["62.1"],"entirely":["62.1"],"use":["62.1","72.1","80.9","80.22","80.52","102.4","102.34"],"updating":["62.1","80.1","80.14"],"tmt":["62.1","80.47","102.29"],"using":["62.1","92.0","113.0"],"thing":["62.2","103.3"],"that":["62.2","80.25","80.40","102.7","102.22","103.3"],"sometimes":["62.2","81.0","103.0","103.3"],"clickable":["62.2","103.3"],"whole":["62.3","103.4"],"infoboxes":["62.3","92.2","103.4","113.2"],"boxes":["62.3","103.4"],"key":["63.0","66.0","81.0","82.0","86.0","87.0","92.1","103.0","104.0","107.0","108.0","109.0","113.1"],"stored":["63.0","66.0","82.0","87.0","104.0","107.0","109.0"],"convenient":["63.0","66.0","82.0","86.0","87.0","104.0","107.0","108.0","109.0"],"example":["63.0","66.0","82.0","86.0","87.0","92.6","97.2","104.0","107.0","108.0","109.0","117.2"],"goaltooltip":["63.0","82.0","104.0"],"depracated":["63.0"],"locked":["63.0","82.0","92.5","97.3","104.0","117.3"],"overrides":["63.0","82.0","104.0"],"hint":["63.0","82.0","104.0"],"attributes":["64.0","68.0","77.0","83.0","105.0"],"values":["64.0","75.0","80.19","83.0","90.0","102.1","105.0"],"both":["64.0","68.0","74.0","83.0","90.0","94.0","105.0","115.0"],"assigned":["64.0","71.0","74.0","83.0","91.0","94.0","105.0","112.0","115.0"],"automagically":["64.0","71.0","74.0","83.0","91.0","94.0","105.0","112.0","115.0"],"name":["64.0","71.0","83.0","87.0","91.0","105.0","112.0"],"gainmult":["65.0","106.0","113.3"],"multiplier":["65.0","106.0","113.3"],"factor":["65.0","84.0","106.0"],"bonuses":["65.0","84.0","106.0"],"multiplying":["65.0","84.0","106.0"],"gainexp":["65.0","84.0","106.0","113.3"],"points":["66.0","71.0","87.0","91.0","104.0","109.0","112.0"],"sellone":["66.0","107.0"],"sellall":["66.0","107.0"],"cause":["66.0","80.40","102.22","107.0"],"functionally":["66.0","107.0"],"above":["66.0","85.0","87.0","107.0","109.0"],"next":["67.0","99.0","119.0"],"feature":["67.0","99.0","119.0"],"currencylocation":["67.0","99.0","119.0"],"inside":["67.0","77.0","99.0","119.0"],"e":["67.0","77.0","80.26","99.0","102.8","119.0"],"g":["67.0","77.0","99.0","119.0"],"buyable":["67.0","77.0","99.0","119.0"],"contains":["67.0","77.0","80.17","92.6"],"buyables":["67.0","77.0","80.48","102.30"],"completionlimit":["67.0"],"completion":["67.0"],"style":["67.0","68.0","72.1","72.2","77.0","113.2"],"applies":["67.0","68.0","77.0"],"onclick":["68.0","95.0"],"implements":["68.0","90.0"],"clicking":["68.0","80.42","90.0","102.24"],"keys":["68.0","77.0"],"strings":["68.0","74.0","75.0","90.0","94.0","115.0"],"infobox":["69.0"],"toggles":["69.0","88.0","110.0"],"bool":["69.0","88.0","90.0","110.0"],"identifies":["69.0","88.0","110.0"],"rest":["69.0","110.0"],"sub":["69.0","110.0"],"set":["70.0","89.0","111.0"],"io":["70.0","89.0","111.0"],"undo":["70.0","89.0","111.0"],"list":["70.1","89.1","111.1"],"repositiories":["70.1","89.1","111.1"],"select":["70.1","89.1","111.1"],"online":["70.2","89.2","111.2"],"line":["70.2","73.0","89.2","93.0","111.2","114.0"],"share":["70.2","89.2","111.2"],"others":["70.2","89.2","111.2"],"raw":["70.2","89.2","111.2"],"githack":["70.2","89.2","111.2"],"username":["70.2"],"value":["71.0","80.39","91.0","102.21","112.0"],"depending":["72.0","81.0","103.0"],"things":["72.0","72.3","80.35","102.17"],"optional":["72.0","80.46","80.50","81.0","102.28","102.32"],"p":["72.1","92.1","97.2","113.1","117.2"],"hotkey":["72.1","92.1","113.1"],"uppercase":["72.1","92.1","113.1"],"combined":["72.1","92.1","113.1"],"shift":["72.1","92.1","113.1"],"ctrl":["72.1","92.1","113.1"],"desc":["72.1"],"onpress":["72.1","92.1","113.1"],"called":["72.1","85.0"],"when":["72.1","72.3","72.4","80.5","80.18","80.40","81.0","85.0","92.2","102.22","103.0","113.5"],"pressed":["72.1","85.0"],"achievements":["72.2","81.3"],"kind":["72.2"],"differences":["72.2","113.2"],"extra":["72.2","113.2"],"boosts":["72.3","92.3","113.3"],"plug":["72.3","92.3"],"onprestige":["72.3"],"triggers":["72.3"],"secondary":["72.3"],"recalculate":["72.3"],"whatnot":["72.3"],"resetdesc":["72.3"],"tooltip":["72.4","80.31","102.13","113.5"],"tooltiplocked":["72.4","113.5"],"functions":["72.4","80.6","92.6","113.3","113.5"],"return":["72.4","72.5","73.0","92.7","93.0","113.5","113.6","113.7","114.0"],"used":["72.5","81.0","103.0","113.6"],"harder":["72.5","113.6"],"shouldnotify":["72.5","96.0","113.6","116.0"],"should":["72.5","113.6","116.0"],"highlighted":["72.5","96.0","113.6"],"buy":["72.5","80.48","102.30"],"gain":["73.0"],"calculation":["73.0","114.0"],"addedplayerdata":["73.0","114.0"],"non":["73.0","81.4"],"related":["73.0","93.0","114.0"],"added":["73.0","93.0","114.0"],"object":["73.0","80.56","92.6","93.0","114.0"],"weather":["73.0","93.0","114.0"],"yes":["73.0","93.0","114.0"],"happiness":["73.0","93.0","114.0"],"displaythings":["73.0","93.0","114.0"],"html":["73.0","80.30","80.54","102.12","102.36"],"support":["73.0","80.15","93.0","114.0"],"shown":["74.0","94.0","103.4","115.0"],"always":["74.0","85.0","90.0","94.0","115.0","116.0"],"buttonstyle":["75.0"],"affects":["75.0","88.0"],"appearance":["75.0"],"green":["76.0","98.0","118.0"],"modified":["76.0","98.0","118.0"],"by":["76.0","80.15","88.0","92.2","98.0","108.0","110.0","118.0"],"edit":["76.0","98.0","118.0"],"amount":["77.0","99.0","119.0"],"updated":["79.0","101.0"],"give":["80.2"],"nans":["80.2"],"setdir":["80.3","95.0"],"particles":["80.3"],"autoupgrade":["80.4"],"minor":["80.4"],"maxed":["80.5"],"deactivated":["80.5"],"moved":["80.6"],"basic":["80.6"],"getter":["80.6"],"setter":["80.6"],"decimal":["80.7","80.37","86.0","102.19"],"places":["80.7","80.15","80.37","102.19"],"thanks":["80.7"],"clickables":["80.8","80.20","102.2"],"lets":["80.9"],"components":["80.9","80.43","80.46","92.6","102.25","102.28"],"ability":["80.9","80.25","102.7"],"fixed":["80.10","80.11","80.40","80.51","102.22","102.33"],"issue":["80.10","80.24","80.49","80.50","102.6","102.31","102.32"],"mobile":["80.10"],"browsers":["80.11"],"missing":["80.11"],"pixel":["80.11"],"incorrectly":["80.12"],"issues":["80.13","80.40","80.41","102.22","102.23"],"buttons":["80.15"],"force":["80.15"],"displayed":["80.15","92.1","113.1"],"tooltips":["80.15","92.5","97.3","117.3"],"resets":["80.15"],"formatting":["80.15"],"numbers":["80.15","80.17"],"disabled":["80.15","92.5"],"default":["80.15","80.54","92.2","102.36","116.0"],"undocumented":["80.16"],"version":["80.17"],"number":["80.17"],"special":["80.17"],"characters":["80.17"],"irrational":["80.17"],"ctrldown":["80.17"],"shiftdown":["80.17"],"variables":["80.17"],"base":["80.18"],"reorganization":["80.19","102.1"],"improved":["80.20","102.2"],"unlocking":["80.20","102.2"],"nodes":["80.21","80.33","81.4","102.3","102.15","110.0"],"attempt":["80.21","102.3"],"features":["80.22","81.0","102.4","103.0"],"popups":["80.23","102.5"],"spacing":["80.24","102.6"],"symbol":["80.24","102.6"],"effectdescription":["80.25","102.7"],"collection":["80.25","102.7"],"order":["80.26","80.51","102.8","102.33"],"tmp":["80.27","102.9"],"hard":["80.27","102.9"],"resetting":["80.27","102.9"],"side":["80.28","80.31","80.33","102.10","102.13","102.15"],"appearing":["80.28","80.50","102.10","102.32"],"main":["80.30","102.12"],"setting":["80.31","80.34","102.13","102.16"],"offset":["80.32","102.14"],"fix":["80.32","102.14"],"jacorb":["80.33","102.15"],"completed":["80.34","102.16"],"hides":["80.34","102.16"],"max":["80.34","102.16"],"completions":["80.34","102.16"],"thank":["80.34","80.38","102.16","102.20"],"thepaperpilot":["80.34","80.38","102.16","102.20"],"displaying":["80.35","102.17"],"enough":["80.35","102.17"],"digits":["80.35","102.17"],"few":["80.35","80.41","102.17","102.23"],"update":["80.36","80.46","102.18","102.28"],"appear":["80.37","102.19","107.0"],"links":["80.38","80.44","102.20","102.26"],"replaced":["80.40","102.22"],"minimal":["80.40","102.22"],"edited":["80.40","102.22"],"bars":["80.41","102.23"],"own":["80.43","102.25"],"gave":["80.43","102.25"],"hide":["80.43","102.25"],"show":["80.43","80.51","85.0","102.25","102.33"],"being":["80.44","102.26"],"defaults":["80.46","102.28"],"true":["80.46","92.2","92.4","92.7","96.0","102.28","113.4","113.7","116.0"],"displays":["80.46","92.2","102.28","113.2"],"correctly":["80.46","102.28"],"generation":["80.46","102.28"],"github":["80.47","102.29"],"title":["80.47","102.29"],"probably":["80.50","102.32"],"separate":["80.51","102.33"],"place":["80.51","92.0","102.33","113.0"],"hasmilestone":["80.51","92.1","102.33"],"incr":["80.51","102.33"],"sample":["80.52","102.34"],"to":["80.52","80.53","102.34","102.35"],"blanks":["80.53","102.35"],"configurable":["80.54","102.36"],"offline":["80.54","102.36"],"time":["80.54","102.36"],"limit":["80.54","102.36"],"modinfo":["80.54","102.36"],"top":["80.54","102.36"],"index":["80.54","102.36"],"config":["80.55","102.37"],"parameters":["80.56","102.38"],"lots":["80.56","102.38"],"reading":["81.0","103.0"],"describing":["81.0","103.0"],"label":["81.0","103.0"],"required":["81.0","86.0","103.0","108.0"],"crash":["81.0","103.0"],"included":["81.0","103.0"],"anything":["81.3"],"trees":["81.4","103.4"],"too":["81.4"],"particle":["81.4"],"deprecated":["82.0","86.0","104.0","108.0"],"layershown":["84.0"],"appears":["85.0","97.3","107.0","117.3"],"standard":["85.0"],"decrease":["85.0"],"cansellone":["85.0"],"cansellall":["85.0"],"booleans":["85.0"],"determining":["85.0"],"present":["85.0"],"appropriate":["85.0"],"respec":["85.0"],"beat":["86.0","108.0"],"currencydisplayname":["86.0","108.0"],"then":["88.0","110.0"],"information":["88.0","110.0","113.1"],"location":["88.0"],"grid":["88.0"],"gridable":["88.0"],"proxy":["88.0"],"consisting":["88.0"],"master":["89.2","111.2"],"middle":["89.2","111.2"],"push":["89.2","111.2"],"origin":["89.2","111.2"],"onto":["89.2","111.2"],"returning":["90.0","92.6"],"click":["90.0"],"onhold":["90.0"],"js":["92.1","92.6","97.2","113.1","117.2"],"holding":["92.1","113.1"],"later":["92.2","113.2"],"date":["92.2","113.2"],"achievementpopups":["92.2"],"milestonepopups":["92.2"],"false":["92.2"],"disables":["92.2"],"popup":["92.2"],"message":["92.2"],"achievement":["92.2"],"milestone":["92.2"],"text":["92.2","103.4","113.2"],"box":["92.2","113.2"],"upgrades":["92.3","113.3"],"divide":["92.3"],"root":["92.3"],"directmult":["92.3"],"multiplies":["92.3"],"exponents":["92.3"],"softcaps":["92.3"],"nothing":["92.4","93.0","113.4"],"automating":["92.4","113.4"],"normal":["92.4","97.1","113.4","117.1"],"autoprestige":["92.4","113.4"],"boolean":["92.4","113.4"],"respectively":["92.5","97.3","117.3"],"behave":["92.5","97.3","117.3"],"original":["92.5","97.3","117.3"],"notify":["92.6","96.0"],"red":["92.6"],"notification":["92.6"],"types":["92.6"],"componentstyles":["92.6"],"objects":["92.6"],"applied":["92.6"],"type":["92.6"],"height":["92.6"],"200px":["92.6"],"canreset":["92.7","113.7"],"isendgame":["93.0"],"tick":["95.0"],"onmouseover":["95.0"],"onmouseleave":["95.0"],"interacted":["95.0"],"setspeed":["95.0"],"clearparticles":["95.0"],"check":["95.0"],"delete":["95.0"],"deletes":["95.0"],"takes":["95.0"],"prestigenotify":["96.0"],"glowcolor":["96.0"],"specifies":["96.0"],"color":["96.0"],"glows":["96.0"],"causing":["96.0"],"glow":["96.0"],"altogether":["97.0","117.0"],"introduces":["97.0","117.0"],"component":["97.0","117.0"],"blank":["97.2","117.2"],"currencylayer":["99.0","119.0"],"omit":["99.0","119.0"],"elements":["103.0"],"following":["103.0"],"containing":["103.4","110.0"],"hidden":["103.4"],"sell":["107.0"],"currencyinternalname":["108.0"],"internal":["108.0"],"arrays":["110.0"],"names":["110.0"],"hotkeys":["113.1"],"array":["113.1"],"needs":["113.3"],"rounded":["113.3"],"calculate":["113.3"],"automatically":["113.6"],"visible":["116.0"],"keyword":["116.0"]},{"0":["22.1","54.1","92.3","113.3"],"1":["61.12","80.54","102.36"],"2":["30.0","47.0"],"5":["92.3","113.3"],"7":["76.0","98.0","118.0"],"8":["76.0","98.0","118.0"],"24":["0.0"],"25":["0.0","90.0"],"37":["0.0"],"1226":["0.0"],"media":["1.0","36.0"],"tropes":["2.0"],"page":["2.0","26.0","40.0","52.0"],"on":["2.0","5.0","15.2","25.1","26.0","27.4","37.0","41.0","45.2","52.0","53.1","56.4"],"mentions":["2.0"],"some":["2.0","66.0","107.0"],"cool":["2.0","20.0"],"things":["2.0","20.0","27.4","39.0","45.5","56.4","72.1","80.46","80.56","81.4","92.1","102.28","102.38","113.1"],"about":["2.0","20.0","39.0","44.0","62.2","103.3"],"number":["3.0","27.4","56.4","80.5","80.30","80.37","80.40","102.12","102.19","102.22"],"of":["3.0","21.0","51.0","80.25","80.30","80.56","102.7","102.12"],"large":["3.0","24.1","50.0","57.1"],"instances":["3.0","51.0"],"but":["4.0","26.3","52.3","72.3","92.5"],"find":["4.0","24.11","26.1","52.1","57.11"],"code":["4.0"],"here":["4.0","27.2","30.0","38.1","56.2","72.1","72.6","113.3"],"screenshot":["5.0"],"png":["5.0"],"with":["6.0","15.3","24.4","45.3","57.4","72.3","72.5","80.4","80.15","80.17","80.25","102.7","113.6"],"comic":["6.0"],"rss":["7.0"],"work":["7.0"],"really":["7.0","24.6","57.6","73.0","93.0","114.0"],"well":["7.0","9.0","23.5","27.2","45.3","46.0","55.5","56.2","97.0","99.0","117.0","119.0"],"this":["7.0","24.5","57.5","80.17","80.38","102.20"],"form":["7.0","45.0"],"content":["7.0","18.0","25.2","53.2","76.0","98.0","118.0"],"messaging":["8.0","32.0"],"protocol":["8.0","42.0"],"not":["9.0","81.0","96.0","103.0"],"integrate":["9.0"],"f3":["9.0"],"as":["9.0","25.0","38.1","46.0","53.0","72.4","77.0","97.0","113.5","117.0"],"wants":["9.0"],"handle":["9.0"],"blogging":["9.0"],"certainly":["9.0"],"seems":["9.0"],"s":["9.0","18.0","22.3","24.2","54.3","57.2","62.1","90.0"],"message":["9.0","85.0","113.2"],"gardening":["9.0"],"concept":["9.0"],"playing":["10.0"],"stories":["10.0"],"aalto":["10.0"],"university":["10.0"],"games":["10.0","35.0"],"now":["10.0","24.10","57.10","80.17"],"everyone":["11.0","26.1","52.1"],"anyone":["11.0"],"try":["11.0"],"their":["11.0","22.3","54.3","92.2"],"hand":["11.0"],"at":["11.0","80.16"],"improving":["11.0","80.34","102.16"],"ecosystem":["11.0"],"side":["12.0","80.26","102.8"],"based":["12.0","15.2","27.4","56.4"],"normals":["12.0"],"closest":["12.0"],"straight":["12.0"],"flags":["12.0"],"cocked":["12.0"],"smallest":["12.0"],"angle":["12.0"],"above":["12.0","80.52","102.34"],"threshold":["12.0"],"sink":["12.0"],"table":["12.0","62.0"],"interfere":["12.0"],"any":["12.0","15.5","62.0"],"missile":["12.0"],"storm":["12.0"],"certain":["12.0"],"events":["12.0"],"winning":["12.0"],"having":["12.0","15.2","27.0","27.4","56.0","56.4"],"broken":["12.0"],"flash":["12.0"],"emotion":["12.0"],"second":["12.0","13.0"],"after":["12.0","15.6"],"random":["12.0"],"living":["12.0"],"chosen":["12.0"],"finisher":["12.0"],"move":["12.0"],"flashy":["12.0"],"dramatic":["12.0"],"shown":["12.0","62.3","72.2","92.2","113.2"],"arcane":["12.0"],"mechana":["12.0"],"became":["12.0"],"open":["12.0","22.2","54.2"],"source":["12.0"],"kasperzutterman":["13.0"],"brain":["13.0"],"zitadel":["14.0"],"does":["14.0"],"support":["14.0"],"probably":["14.0","24.2","57.2"],"won":["14.0"],"t":["14.0","25.0","53.0","73.0","75.0","114.0"],"implementing":["15.1"],"something":["15.1","24.1","57.1","72.3","73.0","86.0","93.0","108.0","114.0","116.0"],"like":["15.1","27.2","27.3","27.4","41.0","56.2","56.3","56.4","60.0","80.40","81.4","86.0","102.22","108.0"],"next":["15.1","27.1","56.1","80.51","86.0","102.33","108.0"],"gen":["15.1"],"iroh":["15.1","15.2"],"graph":["15.1"],"linked":["15.1"],"documents":["15.1"],"layers":["15.1","80.20","80.25","97.0","102.2","102.7","117.0"],"vouch":["15.2"],"clients":["15.2"],"decide":["15.2"],"also":["15.2","23.1","44.0","55.1","81.4","92.5"],"applies":["15.2"],"stolen":["15.2"],"compromised":["15.2"],"believe":["15.2"],"works":["15.2","70.2","89.2","111.2"],"way":["15.2","23.0","55.0","108.0"],"created":["15.3"],"shallow":["15.3"],"subscriptions":["15.3"],"lighten":["15.3"],"load":["15.3"],"communities":["15.3"],"subscribing":["15.4"],"effectively":["15.4"],"owns":["15.4"],"group":["15.4"],"rules":["15.5"],"hiding":["15.5"],"followed":["15.5"],"perhaps":["15.5","45.3"],"pull":["15.5"],"double":["15.5"],"duty":["15.5"],"themselves":["15.5"],"don":["15.6","25.0","53.0","72.0","81.0","103.0"],"pass":["15.6"],"whatever":["15.6","90.0"],"moderation":["15.6"],"heuristic":["15.6"],"therefore":["15.6","22.3","54.3"],"filtering":["15.6"],"out":["15.6","25.1","53.1"],"has":["15.6","27.2","44.0","56.2","73.0","93.0","114.0"],"done":["15.6"],"by":["15.6","72.3","80.19","94.0","102.1","113.2","115.0"],"downloading":["15.6"],"activitypub":["16.0"],"implementations":["16.0"],"nostr":["16.0"],"software":["17.0","31.0"],"better":["18.0","81.0"],"for":["18.0","24.3","24.8","38.0","57.3","57.8","72.0","80.38","80.52","102.20","102.34"],"manner":["19.0"],"specification":["21.0"],"proposal":["21.0"],"build":["21.0"],"set":["21.0","24.4","57.4"],"extensions":["21.0"],"appeals":["22.0","23.6","54.0","55.6"],"require":["22.1","54.1"],"using":["22.1","24.1","54.1","57.1","70.1","81.2","89.1","97.1","103.2","111.1","117.1"],"more":["22.1","24.6","54.1","57.6","72.1","80.3","92.1","99.0","113.1","119.0"],"difficult":["22.1","54.1"],"languages":["22.1","54.1"],"countless":["22.1","54.1"],"tutorials":["22.1","54.1"],"start":["22.1","27.2","54.1","56.2"],"from":["22.1","54.1","80.27","80.47","102.9","102.29"],"knowledge":["22.1","54.1"],"programming":["22.1","22.2","54.1","54.2"],"it":["22.1","54.1","80.31","92.4","102.13","113.4","116.0"],"incredibly":["22.1","54.1"],"accessible":["22.1","54.1"],"beginners":["22.1","54.1"],"know":["22.2","54.2"],"each":["22.2","54.2","72.5","113.6"],"other":["22.2","54.2","66.0","70.0","80.20","80.34","80.35","88.0","89.0","102.2","102.16","102.17","107.0","110.0","111.0"],"welcome":["22.2","54.2"],"arms":["22.2","54.2"],"often":["22.2","54.2"],"dedicated":["22.2","54.2"],"channels":["22.2","54.2"],"help":["22.2","54.2"],"discussions":["22.2","54.2"],"tend":["22.3","54.3"],"make":["22.3","54.3","80.46","97.1","102.28","103.4","117.1"],"lot":["22.3","24.7","44.0","54.3","57.7"],"money":["22.3","24.1","24.10","54.3","57.1","57.10"],"very":["22.3","54.3"],"lucrative":["22.3","54.3"],"these":["22.3","54.3","85.0"],"quite":["22.3","24.2","54.3","57.2"],"abundant":["22.3","54.3"],"storefronts":["22.3","54.3"],"actually":["23.0","55.0","92.3"],"liked":["23.0","55.0"],"went":["23.0","55.0"],"thinking":["23.0","55.0"],"consider":["23.0","55.0"],"continuation":["23.0","55.0"],"discussion":["23.0","23.1","55.0","55.1"],"real":["23.1","55.1"],"note":["23.1","55.1"],"there":["23.1","23.2","55.1","55.2","62.0"],"exploring":["23.1","55.1"],"mechanics":["23.1","55.1"],"discovering":["23.1","55.1"],"synergies":["23.1","55.1"],"unlocking":["23.1","27.3","55.1","56.3"],"new":["23.1","24.4","55.1","57.4"],"weapons":["23.1","55.1"],"playable":["23.1","55.1"],"characters":["23.1","55.1"],"etc":["23.1","55.1","69.0","76.0","88.0","98.0","110.0","118.0"],"relevant":["23.1","27.3","55.1","56.3"],"appeal":["23.1","55.1"],"just":["23.2","26.1","52.1","55.2","62.2","103.3"],"conditioned":["23.2","55.2"],"keep":["23.2","24.7","26.1","52.1","55.2","57.7"],"keeps":["23.2","55.2"],"rewarding":["23.2","55.2"],"unfortunately":["23.2","55.2"],"latter":["23.2","55.2"],"typically":["23.2","55.2","69.0","88.0","110.0"],"compelling":["23.2","55.2"],"clicking":["23.2","27.1","55.2","56.1"],"button":["23.2","55.2","72.5","90.0","92.6","103.4","113.6"],"waiting":["23.2","55.2"],"significant":["23.2","55.2","96.0","116.0"],"overlap":["23.2","24.2","55.2","57.2"],"between":["23.2","24.7","55.2","57.7","72.1","92.1","113.1"],"who":["23.2","24.1","50.0","55.2","57.1"],"enjoy":["23.2","55.2"],"posts":["23.2","55.2"],"someone":["23.2","55.2"],"either":["23.2","55.2"],"struggling":["23.2","55.2"],"overcoming":["23.2","55.2"],"accomplishment":["23.3","55.3"],"much":["23.3","24.6","55.3","57.6"],"allows":["23.3","55.3"],"users":["23.3","55.3"],"able":["23.3","55.3","81.0","99.0","119.0"],"reach":["23.3","25.1","53.1","55.3"],"point":["23.3","55.3"],"gain":["23.3","55.3"],"repetitive":["23.4","55.4"],"static":["23.4","55.4"],"ll":["23.5","26.0","26.1","52.0","52.1","55.5"],"discuss":["23.5","55.5"],"section":["23.5","55.5"],"suffice":["23.5","55.5"],"say":["23.5","24.2","55.5","57.2"],"rely":["23.5","55.5"],"genres":["23.5","55.5"],"due":["23.5","26.1","52.1","55.5"],"distract":["23.5","55.5"],"helps":["23.5","55.5"],"although":["23.5","24.3","55.5","57.3"],"imperfectly":["23.5","55.5"],"gamers":["23.5","23.6","55.5","55.6"],"tolerant":["23.5","55.5"],"rise":["23.5","55.5"],"top":["23.5","55.5"],"within":["23.5","55.5"],"genre":["23.5","55.5"],"elicited":["23.6","55.6"],"nothing":["23.6","55.6","73.0","114.0"],"m":["23.6","24.0","55.6","57.0"],"major":["23.6","55.6"],"may":["23.6","24.6","27.3","55.6","56.3","57.6"],"taking":["23.6","55.6"],"somewhat":["23.6","55.6"],"extreme":["23.6","55.6"],"take":["23.6","41.0","55.6","73.0","114.0"],"overall":["23.6","55.6"],"stands":["23.6","55.6"],"specifically":["23.6","55.6"],"think":["24.0","24.2","57.0","57.2"],"truly":["24.0","57.0"],"perfect":["24.0","57.0"],"answer":["24.0","57.0"],"disclaimer":["24.0","57.0"],"mostly":["24.0","57.0"],"play":["24.0","57.0"],"computer":["24.0","57.0"],"definitions":["24.0","57.0"],"heavily":["24.0","57.0"],"biased":["24.0","57.0"],"towards":["24.0","24.6","57.0","57.6"],"familiar":["24.0","57.0"],"additionally":["24.1","57.1"],"majority":["24.1","57.1"],"mobile":["24.1","57.1"],"strategies":["24.1","57.1"],"get":["24.1","57.1","113.2"],"players":["24.1","57.1","93.0"],"spend":["24.1","57.1"],"possible":["24.1","57.1"],"hell":["24.1","57.1"],"ostensibly":["24.1","57.1"],"critique":["24.1","57.1"],"features":["24.1","57.1","62.0","80.5"],"microtransactions":["24.1","57.1"],"gameplay":["24.1","47.0","57.1"],"buying":["24.1","57.1"],"belong":["24.1","24.10","57.1","57.10"],"hardly":["24.1","57.1"],"manipulation":["24.1","57.1"],"serve":["24.1","57.1"],"interests":["24.1","57.1"],"own":["24.1","57.1","92.2","103.4"],"anecdotal":["24.1","57.1"],"seem":["24.1","57.1"],"so":["24.1","45.4","57.1","67.0","68.0","74.0","77.0"],"fairly":["24.1","57.1"],"surface":["24.1","57.1"],"familiarity":["24.1","57.1"],"context":["24.1","57.1"],"criticizing":["24.1","57.1"],"fans":["24.1","57.1"],"thereof":["24.1","57.1"],"gaining":["24.2","57.2"],"ever":["24.2","57.2"],"resources":["24.2","24.7","57.2","57.7","72.6"],"optimizing":["24.2","57.2"],"production":["24.2","57.2"],"expanding":["24.2","57.2"],"sounds":["24.2","57.2"],"pretty":["24.2","57.2"],"similar":["24.2","45.0","57.2","64.0","67.0","68.0","74.0","77.0","83.0","94.0","105.0","115.0"],"doesn":["24.2","57.2","73.0","114.0"],"fact":["24.2","57.2"],"been":["24.2","57.2"],"debate":["24.2","57.2"],"whether":["24.2","57.2","87.0","107.0","109.0"],"umbrella":["24.2","57.2"],"safe":["24.2","57.2"],"two":["24.2","57.2","80.16","99.0","119.0"],"related":["24.2","57.2","80.33","102.15"],"playerbase":["24.2","57.2"],"means":["24.3","57.3","80.17"],"we":["24.3","26.0","52.0","57.3"],"borrow":["24.3","57.3"],"process":["24.3","57.3"],"coming":["24.3","57.3"],"consensus":["24.3","57.3"],"and":["24.3","28.0","29.0","35.0","57.3","70.0","80.41","80.53","89.0","92.0","102.23","102.35","111.0","113.0"],"maybe":["24.3","57.3"],"come":["24.3","57.3"],"across":["24.3","57.3","69.0","88.0","110.0"],"viable":["24.3","57.3"],"an":["24.4","57.4"],"authority":["24.4","57.4"],"since":["24.4","27.2","56.2","57.4"],"replaced":["24.4","57.4"],"https":["24.4","57.4"],"blog":["24.4","57.4"],"roguetemple":["24.4","57.4"],"com":["24.4","57.4"],"traditional":["24.4","57.4"],"answers":["24.5","57.5"],"should":["24.5","57.5","62.0","65.0","75.0","80.48","84.0","102.30","106.0"],"sufficiently":["24.5","57.5"],"allow":["24.5","57.5"],"us":["24.5","57.5"],"determine":["24.5","57.5","75.0"],"what":["24.5","57.5","60.0","62.0","63.0","82.0","84.0","104.0"],"factors":["24.5","57.5"],"have":["24.5","26.3","52.3","57.5","70.0","70.2","89.0","89.2","96.0","111.0","111.2","116.0"],"higher":["24.5","57.5"],"incrementalness":["24.5","57.5"],"than":["24.6","57.6","80.48","102.30"],"slight":["24.6","57.6"],"bias":["24.6","57.6"],"already":["24.6","50.0","57.6"],"established":["24.6","57.6"],"newly":["24.6","57.6"],"buffed":["24.6","57.6"],"show":["24.6","57.6","87.0","88.0","107.0","109.0"],"amongst":["24.6","57.6"],"easily":["24.6","57.6"],"indicate":["24.6","57.6","92.7","113.7"],"re":["24.6","27.0","56.0","57.6","70.1","89.1","111.1"],"general":["24.6","57.6","80.10","80.43","102.25"],"different":["24.7","26.1","27.3","52.1","56.3","57.7"],"mutually":["24.7","57.7"],"exclusive":["24.7","57.7"],"options":["24.7","57.7"],"presents":["24.7","57.7"],"resource":["24.7","57.7"],"management":["24.7","57.7"],"track":["24.7","57.7","95.0"],"will":["24.8","27.4","56.4","57.8","70.1","89.1","92.4","109.0","111.1","113.4"],"progress":["24.8","57.8"],"instead":["24.8","57.8","86.0","95.0","96.0","108.0","116.0"],"must":["24.8","57.8"],"wait":["24.8","57.8"],"automatic":["24.8","57.8"],"occur":["24.8","57.8"],"before":["24.8","26.2","52.2","57.8"],"resume":["24.8","57.8"],"qualify":["24.9","57.9"],"totally":["24.9","57.9"],"honest":["24.9","57.9"],"was":["24.9","47.0","57.9","64.0","67.0","68.0","71.0","74.0","83.0","91.0","94.0","105.0","112.0","115.0"],"never":["24.9","57.9"],"expecting":["24.9","57.9"],"conclude":["24.9","57.9"],"otherwise":["24.9","57.9","96.0"],"though":["24.9","57.9"],"buy":["24.10","57.10","80.51","99.0","102.33","119.0"],"which":["24.10","57.10","64.0","67.0","71.0","74.0","77.0","83.0","91.0","94.0","105.0","112.0","115.0"],"i":["24.10","45.3","57.10"],"d":["24.10","27.1","56.1","57.10"],"under":["24.10","57.10","64.0","67.0","68.0","71.0","74.0","77.0","83.0","91.0","94.0","105.0","112.0","115.0"],"fold":["24.10","57.10"],"learn":["24.10","57.10"],"fly":["24.10","57.10"],"series":["24.10","57.10"],"upgrade":["24.10","57.10","69.0","88.0","110.0"],"complete":["24.10","57.10"],"the":["24.11","57.11","61.8"],"available":["24.11","57.11"],"interesting":["24.11","57.11"],"digital":["25.0","53.0"],"garden":["25.0","53.0"],"written":["25.0","46.0","53.0"],"prose":["25.0","53.0"],"hope":["25.0","53.0"],"you":["25.0","45.3","53.0","62.2","80.48","102.30","103.3","113.2"],"mind":["25.0","26.1","52.1","53.0"],"credentials":["25.1","53.1"],"or":["25.1","53.1","74.0","80.15","94.0","115.0"],"anything":["25.1","53.1","62.2","103.3"],"site":["25.1","53.1"],"feel":["25.1","53.1"],"free":["25.1","53.1"],"is":["25.2","35.1","53.2","80.24","102.6"],"developer":["26.0","52.0"],"explore":["26.0","52.0"],"how":["26.0","52.0","70.2","89.2","111.2"],"embrace":["26.0","52.0"],"grow":["26.0","52.0"],"continue":["26.0","52.0","70.1","76.0","89.1","98.0","111.1","118.0"],"post":["26.0","38.1","52.0"],"publicly":["26.0","52.0"],"confidence":["26.0","52.0"],"preferences":["26.1","52.1"],"satisfy":["26.1","52.1"],"ultimately":["26.1","27.0","52.1","56.0"],"even":["26.1","52.1"],"fun":["26.1","52.1"],"then":["26.1","52.1"],"success":["26.1","52.1"],"in":["26.2","45.2","52.2","80.9","80.10","80.34","80.39","102.16","102.21"],"shoes":["26.2","52.2"],"understand":["26.2","52.2"],"struggles":["26.2","52.2"],"offer":["26.2","52.2"],"guidance":["26.2","52.2"],"emotional":["26.2","52.2"],"its":["26.3","52.3","72.5","113.6"],"ups":["26.3","52.3"],"downs":["26.3","52.3"],"staying":["26.3","52.3"],"true":["26.3","52.3","65.0","72.6","92.5","95.0","109.0","113.2"],"vision":["26.3","52.3"],"motivated":["26.3","52.3"],"artificially":["27.0","27.1","56.0","56.1"],"inflating":["27.0","56.0"],"suppose":["27.0","56.0"],"reduce":["27.0","56.0"],"inflated":["27.0","56.0"],"sake":["27.0","56.0"],"longer":["27.0","56.0"],"terms":["27.1","56.1"],"engaging":["27.1","56.1"],"go":["27.1","56.1"],"far":["27.1","27.3","56.1","56.3"],"would":["27.1","56.1","66.0","96.0","107.0"],"actively":["27.1","56.1"],"worse":["27.1","56.1"],"delaying":["27.1","56.1"],"piece":["27.1","56.1"],"actual":["27.1","56.1"],"alongside":["27.1","56.1"],"issues":["27.1","56.1","61.10","76.0","80.15","98.0","118.0"],"accessibility":["27.1","56.1"],"potentially":["27.1","56.1"],"causing":["27.1","56.1"],"rsi":["27.1","56.1"],"difference":["27.2","56.2"],"layer":["27.2","56.2","116.0"],"technically":["27.2","56.2"],"problem":["27.2","56.2"],"constantly":["27.2","56.2"],"getting":["27.2","56.2"],"feels":["27.2","56.2"],"larger":["27.2","56.2"],"impact":["27.2","56.2"],"right":["27.2","56.2","97.2","117.2"],"up":["27.2","30.0","56.2","69.0","73.0","88.0","110.0","114.0"],"until":["27.2","56.2"],"compromise":["27.2","56.2"],"highlighting":["27.2","56.2"],"most":["27.2","56.2"],"egregious":["27.2","56.2"],"unlock":["27.3","56.3"],"modifiers":["27.3","56.3"],"everything":["27.3","56.3"],"amount":["27.3","56.3","80.51","102.33"],"gotten":["27.3","56.3"],"steelie":["27.3","56.3"],"resets":["27.3","56.3"],"steel":["27.3","56.3"],"reason":["27.3","56.3"],"factory":["27.3","56.3"],"various":["27.3","51.0","56.3"],"machines":["27.3","56.3"],"none":["27.3","56.3","80.18"],"directly":["27.3","56.3","86.0","108.0"],"tied":["27.3","56.3"],"gathering":["27.3","56.3"],"oil":["27.3","56.3"],"rocket":["27.3","56.3"],"parts":["27.3","56.3"],"space":["27.3","56.3"],"throughout":["27.3","56.3"],"absolutely":["27.3","56.3"],"direction":["27.3","56.3"],"still":["27.3","56.3"],"collecting":["27.3","56.3"],"little":["27.3","56.3"],"hard":["27.3","56.3","93.0"],"gci":["27.3","56.3"],"alone":["27.3","56.3"],"said":["27.4","56.4"],"purchases":["27.4","56.4"],"quickly":["27.4","56.4"],"invalidate":["27.4","56.4"],"tip":["27.4","56.4"],"synapse":["28.0"],"cinny":["28.0"],"kimonja":["29.0"],"c418":["29.0"],"to":["30.0","80.6","80.7","80.21","80.31","80.32","102.3","102.13","102.14"],"chapter":["30.0","47.0"],"can":["30.0","45.0"],"played":["30.0"],"threads":["33.0"],"thepaperpilot":["34.0","80.10"],"org":["34.0"],"tools":["35.0","51.0"],"mine":["35.1"],"called":["35.1","66.0","107.0"],"kronos":["35.1","47.0"],"exception":["35.1"],"speech":["35.2"],"changes":["37.0"],"depending":["37.0"],"license":["37.0"],"training":["38.0"],"ndi":["38.1"],"serves":["38.1"],"input":["38.1"],"stability":["38.2"],"maintainability":["38.2"],"going":["38.2"],"forward":["38.2"],"unittests":["38.2"],"entries":["40.0"],"creation":["40.0"],"jam":["40.0"],"primordia":["40.0"],"jacorb":["40.0"],"my":["41.0"],"ideal":["41.0"],"matrix":["42.0"],"errant":["43.0"],"signal":["43.0"],"spoilers":["43.0"],"a":["44.0","61.5","72.6","97.2","117.2"],"ways":["45.0"],"wikis":["45.0"],"webrings":["45.0"],"useful":["45.1"],"incremental":["45.2"],"social":["45.2"],"github":["45.2"],"weird":["45.2"],"development":["45.2"],"glue":["45.3"],"link":["45.3"],"specific":["45.3"],"branches":["45.3"],"chatted":["45.3"],"do":["45.4","62.2","67.0","72.6","74.0","77.0","90.0","92.4","103.3","113.4"],"creative":["45.5"],"love":["45.5"],"creating":["45.5"],"feed":["46.0"],"logseq":["46.0"],"rendered":["46.0"],"vitepress":["46.0"],"suggested":["46.0"],"small":["46.0"],"web":["46.0"],"complex":["47.0"],"call":["47.0","87.0","109.0"],"sands":["47.0"],"time":["47.0"],"sandsoftime":["47.0"],"replicated":["47.0"],"generator":["48.0"],"cozy":["49.0"],"appealing":["50.0"],"overwhelming":["50.0"],"moderate":["50.0"],"user":["51.0"],"fediverse":["51.0"],"desc":["59.0","78.0","100.0"],"description":["59.0","78.0","100.0"],"resceil":["59.0","78.0","100.0"],"roundupcost":["59.0","78.0","100.0"],"order":["59.0","78.0","97.3","100.0","117.3"],"unlockorder":["59.0","78.0","100.0"],"incr":["59.0","78.0","100.0"],"increaseunlockorder":["59.0","78.0","100.0"],"challengedescription":["59.0","78.0","100.0"],"reward":["59.0","78.0","100.0"],"rewarddescription":["59.0","78.0","100.0"],"rewardeffect":["59.0","78.0","100.0"],"rewarddisplay":["59.0","78.0","100.0"],"active":["59.0","78.0","100.0"],"challengeactive":["59.0","78.0","100.0"],"js":["60.0","72.5","80.6","113.6"],"see":["60.0","70.2","72.1","80.46","84.0","89.2","92.1","102.28","111.2","113.1"],"looks":["60.0"],"productivity":["61.1"],"working":["61.2"],"screen":["61.3","73.0","93.0","114.0"],"week":["61.5"],"changelog":["61.6"],"buyables":["61.7","86.0","92.6","99.0","108.0","119.0"],"minor":["61.10","80.20","80.30","80.34","80.35","80.41","80.54","80.56","102.2","102.12","102.16","102.17","102.23","102.36","102.38"],"returns":["62.0","95.0"],"given":["62.0"],"display":["62.0","80.9","92.0","113.0"],"text":["62.0","62.3","72.2"],"basic":["62.0"],"html":["62.0"],"vue":["62.0","95.0"],"contents":["62.0"],"update":["62.1","80.38","81.2","102.20","103.2"],"version":["62.1","81.2","103.2"],"containing":["62.3"],"hidden":["62.3","72.2","92.2","113.2"],"donetooltip":["63.0","82.0","104.0"],"achieved":["63.0","82.0","104.0"],"rewards":["63.0","82.0","104.0"],"points":["64.0","68.0","74.0","83.0","90.0","92.3","105.0","113.3"],"id":["64.0","72.5","83.0","96.0","105.0","113.6","116.0"],"key":["64.0","67.0","68.0","71.0","74.0","77.0","83.0","91.0","94.0","105.0","112.0","115.0"],"stored":["64.0","68.0","71.0","83.0","91.0","105.0","112.0"],"convenient":["64.0","67.0","68.0","71.0","74.0","77.0","83.0","91.0","94.0","105.0","112.0","115.0"],"access":["64.0","68.0","71.0","74.0","80.15","83.0","91.0","94.0","105.0","112.0","115.0"],"example":["64.0","67.0","68.0","69.0","71.0","72.5","74.0","77.0","83.0","88.0","91.0","94.0","105.0","110.0","112.0","113.6","115.0"],"layershown":["65.0","106.0"],"bool":["65.0","84.0","106.0"],"if":["65.0","75.0","80.51","84.0","102.33","106.0","113.5"],"node":["65.0","84.0","106.0"],"be":["65.0","80.35","84.0","97.0","102.17","106.0","117.0"],"visible":["65.0","75.0","84.0","106.0"],"tree":["65.0","80.4","80.33","80.37","84.0","89.2","102.15","102.19","106.0","111.2"],"when":["66.0","107.0","113.2"],"pressed":["66.0","107.0"],"standard":["66.0","107.0"],"decrease":["66.0","107.0"],"possibly":["66.0","92.6","107.0"],"cansellone":["66.0","107.0"],"cansellall":["66.0","107.0"],"booleans":["66.0","107.0"],"present":["66.0","87.0","107.0","109.0"],"appropriate":["66.0","107.0"],"always":["66.0","75.0","92.4","107.0","113.4"],"keys":["67.0","72.1","92.1","113.1"],"attributes":["67.0","72.1","92.1","113.1"],"both":["67.0","77.0"],"strings":["67.0","77.0","92.0","113.0"],"assigned":["67.0","68.0","77.0","81.0","90.0","103.0"],"automagically":["67.0","68.0","77.0","81.0","90.0","103.0"],"same":["68.0","72.4","77.0","81.0","92.2","113.5"],"name":["68.0","80.47","80.50","90.0","102.29","102.32"],"player":["68.0","83.0","105.0","116.0"],"part":["69.0","88.0","110.0"],"another":["69.0","110.0"],"milestone":["69.0","88.0","110.0","113.2"],"chall":["69.0"],"buyable":["69.0","80.13","86.0","88.0","108.0","110.0"],"clickable":["69.0","88.0","110.0"],"achievement":["69.0","88.0","110.0","113.2"],"individual":["69.0","85.0","88.0","110.0"],"challenge":["69.0","72.5","73.0","88.0","93.0","110.0","113.6","114.0"],"want":["69.0","70.0","72.1","88.0","89.0","92.1","99.0","110.0","111.0","113.1","119.0"],"split":["69.0","88.0","110.0"],"multiple":["69.0","70.0","88.0","89.0","110.0","111.0"],"respec":["69.0","87.0","88.0","109.0","110.0"],"master":["69.0","87.0","88.0","109.0","110.0"],"buttons":["69.0","88.0","107.0","110.0"],"respectively":["69.0","72.4","88.0","110.0","113.5"],"sell":["69.0","88.0","110.0"],"one":["69.0","80.51","102.33","110.0"],"versions":["70.0","89.0","103.0","111.0"],"collaborate":["70.0","89.0","111.0"],"purposes":["70.1","89.1","111.1"],"download":["70.1","89.1","111.1"],"files":["70.1","80.24","89.1","102.6","111.1"],"successfully":["70.2","89.2","111.2"],"documentation":["70.2","80.46","89.2","102.28","111.2"],"reality":["70.2","89.2","111.2"],"bar":["71.0"],"bigbar":["71.0"],"intend":["72.0","81.0","103.0"],"use":["72.0"],"that":["72.0","97.1","117.1"],"feature":["72.0","80.43","80.50","81.0","86.0","102.25","102.32","103.0","108.0"],"entire":["72.1","92.1","96.0","113.1","116.0"],"tab":["72.1"],"tabformat":["72.1","92.1","113.1"],"extra":["72.1","92.1","113.1"],"change":["72.1","92.1","113.1"],"layout":["72.1","92.1","113.1"],"info":["72.1","92.1","113.1"],"midsection":["72.1","92.1","113.1"],"alternative":["72.1","92.1","113.1"],"inserted":["72.1","92.1","113.1"],"milestones":["72.1","92.1","113.1"],"cannot":["72.1","88.0","92.1","113.1"],"subtabs":["72.1","80.25","92.1","102.7","113.1"],"later":["72.2"],"date":["72.2"],"infoboxes":["72.2"],"displays":["72.2"],"box":["72.2"],"replace":["72.3","80.17"],"else":["72.3"],"prestigebuttontext":["72.3"],"entirety":["72.3"],"contains":["72.3","72.5","86.0","99.0","108.0","113.6","119.0"],"only":["72.3","72.6","73.0","93.0","114.0"],"usable":["72.3"],"all":["72.3","76.0","87.0","98.0","118.0"],"types":["72.3"],"unlocked":["72.4"],"locked":["72.4","113.5"],"tooltips":["72.4","113.5"],"behave":["72.4","92.2","113.5"],"original":["72.4","113.5"],"prestige":["72.4","113.5"],"componentstyles":["72.5","113.6"],"object":["72.5","113.6"],"functions":["72.5","80.3","80.35","80.52","102.17","102.34","113.6"],"returning":["72.5","113.6"],"css":["72.5","92.1","113.1","113.6"],"objects":["72.5","113.6"],"applied":["72.5","113.6"],"components":["72.5","113.6"],"type":["72.5","113.6"],"height":["72.5","80.53","102.35","113.6"],"200px":["72.5","113.6"],"color":["72.5","92.0","113.0","113.6"],"aa66aa":["72.5","92.6","113.6"],"canreset":["72.6"],"return":["72.6"],"isendgame":["73.0","114.0"],"reached":["73.0","93.0","114.0"],"end":["73.0","93.0","114.0"],"win":["73.0","93.0","114.0"],"appears":["73.0","93.0","114.0"],"less":["73.0","93.0","114.0"],"beyond":["73.0","92.3","93.0","113.3","114.0"],"maxticklength":["73.0","93.0","114.0"],"length":["73.0","93.0","114.0"],"milliseconds":["73.0","93.0","114.0"],"reduces":["73.0","93.0","99.0","114.0","119.0"],"over":["73.0","93.0","114.0"],"long":["73.0","114.0"],"ticks":["73.0","93.0","114.0"],"mess":["73.0","93.0","114.0"],"usually":["73.0","93.0","114.0"],"default":["75.0","92.3","113.2","113.3"],"keyword":["75.0"],"updated":["76.0","80.33","80.54","98.0","102.15","102.36","118.0"],"remaining":["76.0","98.0","118.0"],"challenges":["76.0"],"required":["76.0","98.0","118.0"],"run":["76.0","98.0","118.0"],"game":["76.0","81.3","93.0","98.0","114.0","118.0"],"fix":["76.0","80.21","98.0","102.3","118.0"],"those":["77.0"],"push":["79.0","101.0"],"trig":["80.3"],"nodes":["80.4","103.4"],"disables":["80.5","113.2"],"many":["80.5","80.34","80.46","102.16","102.28"],"improved":["80.5","80.25","80.46","102.7","102.28"],"formatting":["80.5","80.40","102.22"],"slightly":["80.5"],"easyaccess":["80.6"],"pg132":["80.7"],"non":["80.9","103.4"],"whole":["80.9","81.3"],"numbers":["80.9"],"main":["80.9","80.46","85.0","102.28"],"thanks":["80.10"],"vertical":["80.11"],"docs":["80.13","80.33","80.34","80.54","84.0","102.15","102.16","102.36"],"because":["80.15","81.0"],"rounding":["80.15"],"errors":["80.15","80.34","102.16"],"might":["80.15"],"cause":["80.15"],"formatsmall":["80.15"],"enable":["80.15"],"globally":["80.15"],"adding":["80.15","82.0","94.0","104.0","115.0"],"allowsmall":["80.15"],"modinfo":["80.15"],"bottom":["80.16"],"newlines":["80.17"],"br":["80.17"],"style":["80.19","92.1","102.1","113.1"],"fudo":["80.19","102.1"],"custom":["80.20","80.22","85.0","102.2","102.4"],"fixes":["80.20","80.34","80.35","102.2","102.16","102.17"],"tooltip":["80.21","80.43","102.3","102.25"],"flickering":["80.21","102.3"],"removed":["80.24","80.27","102.6","102.9","103.0"],"old":["80.24","102.6"],"unneeded":["80.24","102.6"],"spacing":["80.25","102.7"],"embedding":["80.25","96.0","102.7"],"into":["80.25","102.7"],"g":["80.26","86.0","102.8","108.0"],"fixed":["80.26","80.29","102.8","102.11"],"autoupgrade":["80.26","102.8"],"issue":["80.26","80.37","80.40","102.8","102.19","102.22"],"effective":["80.27","102.9"],"herobrine":["80.27","102.9"],"getstartclickables":["80.27","80.28","80.29","102.9","102.10","102.11"],"again":["80.28","102.10"],"add":["80.29","102.11"],"yourself":["80.29","92.6","102.11"],"oddities":["80.30","102.12"],"hides":["80.31","102.13"],"entirely":["80.31","102.13"],"lastsafetab":["80.32","102.14"],"highlighted":["80.33","92.7","102.15","113.7","116.0"],"fixing":["80.34","102.16"],"infobox":["80.34","102.16"],"appearance":["80.34","102.16"],"potential":["80.37","102.19"],"displaying":["80.37","96.0","102.19","116.0"],"contributing":["80.38","102.20"],"updating":["80.39","81.2","102.21","103.2"],"making":["80.40","102.22"],"10e9":["80.40","102.22"],"appear":["80.40","87.0","97.1","102.22","109.0","117.1"],"tweaks":["80.41","102.23"],"improvements":["80.41","102.23"],"them":["80.42","102.24","107.0"],"achievements":["80.43","102.25"],"too":["80.44","102.26","103.4"],"wide":["80.44","102.26"],"loop":["80.46","102.28"],"changed":["80.46","102.28"],"keeping":["80.46","102.28"],"easier":["80.46","81.0","102.28"],"renamed":["80.46","102.28"],"increase":["80.46","102.28"],"readability":["80.46","102.28"],"list":["80.46","102.28"],"below":["80.46","102.28"],"feedback":["80.46","102.28"],"automatically":["80.47","81.0","102.29","103.0"],"taken":["80.47","102.29"],"mod":["80.47","102.29"],"temp":["80.49","102.31"],"used":["80.50","81.4","97.0","102.32","117.0"],"confirmation":["80.50","85.0","102.32"],"messages":["80.50","102.32"],"needed":["80.51","102.33"],"max":["80.51","102.33"],"convenience":["80.52","102.34"],"customizable":["80.53","102.35"],"width":["80.53","102.35"],"hour":["80.54","102.36"],"few":["80.54","102.36"],"information":["80.54","102.36"],"good":["80.56","102.38"],"override":["81.0","96.0","103.0","116.0"],"deprecated":["81.0","103.0"],"newer":["81.0"],"achieve":["81.0"],"thing":["81.0"],"tmt":["81.2","103.0","103.2"],"particles":["81.4"],"visual":["81.4"],"effects":["81.4","92.6"],"interactable":["81.4"],"golden":["81.4"],"cookies":["81.4"],"collectables":["81.4"],"disable":["82.0","92.6","104.0"],"popups":["82.0","94.0","104.0","115.0"],"achievementspopups":["82.0","104.0"],"false":["82.0","94.0","104.0","113.2","115.0"],"upgrades":["84.0"],"look":["84.0"],"goes":["84.0"],"respecbuyables":["85.0"],"along":["85.0"],"toggleable":["85.0"],"respectext":["85.0"],"showrespec":["85.0"],"defined":["85.0","87.0"],"defaults":["85.0","87.0","109.0"],"respecmessage":["85.0"],"place":["85.0"],"currencyinternalname":["86.0"],"internal":["86.0"],"currencylayer":["86.0","108.0"],"omit":["86.0","108.0"],"currencylocation":["86.0","108.0"],"your":["86.0","97.0","108.0","117.0"],"inside":["86.0","108.0"],"e":["86.0","108.0"],"masterbuttonpress":["87.0","109.0"],"additional":["87.0","109.0"],"pressing":["87.0","109.0"],"masterbuttontext":["87.0","109.0"],"showmasterbutton":["87.0","109.0"],"determining":["87.0","99.0","107.0","109.0","119.0"],"absent":["87.0","107.0","109.0"],"microtab":["88.0"],"rest":["88.0"],"sub":["88.0"],"username":["89.2","111.2"],"modding":["89.2","111.2"],"20x":["90.0"],"sec":["90.0"],"held":["90.0"],"least":["90.0"],"seconds":["90.0"],"geteffect":["90.0"],"calculates":["90.0"],"styling":["92.0","113.0"],"grid":["92.2"],"data":["92.2"],"reducing":["92.3"],"softcap":["92.3","113.3"],"softcappower":["92.3","113.3"],"put":["92.3","113.3"],"th":["92.3","113.3"],"power":["92.3","113.3"],"e1e7":["92.3","113.3"],"marked":["92.5"],"adds":["92.5"],"mark":["92.5"],"corner":["92.5"],"star":["92.5"],"deactivated":["92.6"],"hasupgrade":["92.6"],"haschallenge":["92.6"],"hasachievement":["92.6"],"hasmilestone":["92.6"],"unable":["92.6"],"click":["92.6"],"innate":["92.6"],"effect":["92.6"],"prestigenotify":["92.7","113.7"],"subtly":["92.7","113.7"],"meaningful":["92.7","113.7"],"fixoldsave":["93.0"],"modify":["93.0"],"loading":["93.0"],"undo":["93.0"],"inflation":["93.0"],"forcibly":["93.0"],"disaable":["94.0","115.0"],"milestonepopups":["94.0","113.2","115.0"],"deleted":["95.0"],"itself":["95.0"],"mousex":["95.0"],"mousey":["95.0"],"variables":["95.0"],"sin":["95.0"],"cos":["95.0"],"tan":["95.0"],"operations":["95.0"],"radians":["95.0"],"asin":["95.0"],"acos":["95.0"],"atan":["95.0"],"returned":["95.0"],"overridden":["96.0"],"embedlayer":["96.0","116.0"],"tabs":["97.1","117.1"],"shownavtab":["97.1","117.1"],"b":["97.2","117.2"],"c":["97.2","117.2"],"weirdbutton":["97.2","117.2"],"position":["97.3","117.3"],"horizontal":["97.3","117.3"],"uses":["97.3","117.3"],"sorted":["97.3","117.3"],"alphabetical":["97.3","117.3"],"complicated":["99.0","119.0"],"currencies":["99.0","119.0"],"purchase":["99.0","119.0"],"system":["99.0","119.0"],"need":["99.0","119.0"],"canafford":["99.0","119.0"],"pay":["99.0","119.0"],"optional":["103.0"],"leave":["103.0"],"anymore":["103.0"],"future":["103.0"],"achievementpopups":["113.2"],"popup":["113.2"],"plug":["113.3"],"disabled":["113.5"],"notify":["116.0"]}]'},t={"0.0":{t:'
',p:`<h1 class="p-name"> +<a href="/changelo ...`,l:"changelog/index.html",a:"section-class-h-feed"},"1.0":{t:"# ActivityPub",p:` +Referenced by: Fediverse + + +Tags: Decentralized + +ActivityPub i ...`,l:"garden/activitypub/index.html",a:"activitypub"},"2.0":{t:"# Advent Incremental",p:` +Tags: My Projects, Profectus + +Play it here! +An Open Source ga ...`,l:"garden/advent-incremental/index.html",a:"advent-incremental"},"3.0":{t:"# ATProto",p:` +Referenced by: Fediverse + + +Tags: Decentralized + +The AT Protoc ...`,l:"garden/atproto/index.html",a:"atproto"},"4.0":{t:"# Babble Buds",p:` +Tags: My Projects + +Babble Buds is a tool for creating puppets ...`,l:"garden/babble-buds/index.html",a:"babble-buds"},"5.0":{t:"# Capture the Citadel",p:` +Tags: My Projects + +A 3D VR re-envisioning of a Slay the Spire ...`,l:"garden/capture-the-citadel/index.html",a:"capture-the-citadel"},"6.0":{t:"# Chat Glue",p:` +Referenced by: Commune, My Personal Website, The Small Web + +A ...`,l:"garden/chat-glue/index.html",a:"chat-glue"},"7.0":{t:"# Chronological",p:` +Referenced by: Digital Gardens, Freeform vs Chronological Dic ...`,l:"garden/chronological/index.html",a:"chronological"},"8.0":{t:"# Cinny",p:` +Referenced by: Incremental Social + +Cinny is an Open Source we ...`,l:"garden/cinny/index.html",a:"cinny"},"9.0":{t:"# Commune",p:` +Referenced by: Federated Identity, Fedi v2, My Personal Websi ...`,l:"garden/commune/index.html",a:"commune"},"10.0":{t:"# Davey Wreden",p:` +Referenced by: Ivy Road, The Beginner's Guide + + +Tagged by: Iv ...`,l:"garden/davey-wreden/index.html",a:"davey-wreden"},"11.0":{t:"# Decentralized",p:` +Referenced by: Commune, Fedi v2, Matrix, Social Media + + +Tagge ...`,l:"garden/decentralized/index.html",a:"decentralized"},"12.0":{t:"# Dice Armor",p:` +Referenced by: Babble Buds + + +Tags: My Projects + +Download it h ...`,l:"garden/dice-armor/index.html",a:"dice-armor"},"13.0":{t:"# Digital Gardens",p:` +Referenced by: Chronological, Commune, Garden-RSS, The Cozy W ...`,l:"garden/digital-gardens/index.html",a:"digital-gardens"},"14.0":{t:"# Federated Identity",p:` +Referenced by: Commune, Fedi v2, Weird + + +Tags: Decentralized + ...`,l:"garden/federated-identity/index.html",a:"federated-identity"},"15.0":{t:"# Fedi v2",p:` +Referenced by: Social Media + +My take on a theoretical success ...`,l:"garden/fedi-v2/index.html",a:"fedi-v2"},"15.1":{t:"Inspiration",p:` +A Plan for Social Media - Rethinking Federation + +This article ...`,l:"garden/fedi-v2/index.html#inspiration",a:"inspiration"},"15.2":{t:"Identity",p:` +Federated Identity +Private and public keys anyone can create ...`,l:"garden/fedi-v2/index.html#identity",a:"identity"},"15.3":{t:"Servers",p:` +Act as relays, merely storing messages and sending them to an ...`,l:"garden/fedi-v2/index.html#servers",a:"servers"},"15.4":{t:"Content",p:` +Protocol should dictate how to convey text, image, audio, vid ...`,l:"garden/fedi-v2/index.html#content",a:"content"},"15.5":{t:"Moderation",p:` +In general, edits and delete requests are made by replying wi ...`,l:"garden/fedi-v2/index.html#moderation",a:"moderation"},"15.6":{t:"Problems to solve",p:` +No anonymity + +All upvotes, downvotes, etc. are linked to your ...`,l:"garden/fedi-v2/index.html#problems-to-solve",a:"problems-to-solve"},"16.0":{t:"# Fediverse",p:` +Referenced by: ATProto, Decentralized, Incremental Social, Mb ...`,l:"garden/fediverse/index.html",a:"fediverse"},"17.0":{t:"# Forgejo",p:` +Referenced by: Incremental Social + +Forgejo is an Open Source ...`,l:"garden/forgejo/index.html",a:"forgejo"},"18.0":{t:"# Freeform",p:` +Referenced by: Commune, Digital Gardens, Freeform vs Chronolo ...`,l:"garden/freeform/index.html",a:"freeform"},"19.0":{t:"# Freeform vs Chronological Dichotomy",p:` +Referenced by: Chronological, Freeform + +Describes a dichotomy ...`,l:"garden/freeform-vs-chronological-dichotomy/index.html",a:"freeform-vs-chronological-dichotomy"},"20.0":{t:"# Game Dev Tree",p:` +Tags: My Projects + +Play it here! +My first (good) incremental ...`,l:"garden/game-dev-tree/index.html",a:"game-dev-tree"},"21.0":{t:"# Garden-RSS",p:` +Referenced by: Freeform, The Small Web, This Knowledge Hub + +A ...`,l:"garden/garden-rss/index.html",a:"garden-rss"},"22.0":{t:"# Guide to Incrementals/Appeal to Developers",p:"There are a lot of developers in the incremental games communi ...",l:"garden/guide-to-incrementals/appeal-to-developers/index.html",a:"guide-to-incrementals-appeal-to-developers"},"22.1":{t:"Incrementals are Easy to Make",p:"Compared to other genres, incrementals have quite low expectat ...",l:"garden/guide-to-incrementals/appeal-to-developers/index.html#incrementals-are-easy-to-make",a:"incrementals-are-easy-to-make"},"22.2":{t:"Players are Easy to Find",p:"Once you've finished your game and uploaded it on github pages ...",l:"garden/guide-to-incrementals/appeal-to-developers/index.html#players-are-easy-to-find",a:"players-are-easy-to-find"},"22.3":{t:"Monetization",p:"I'd like to clarify that everything I've said above mainly app ...",l:"garden/guide-to-incrementals/appeal-to-developers/index.html#monetization",a:"monetization"},"23.0":{t:"# Guide to Incrementals/Appeal to Players",p:"This is something that has been discussed and analyzed by many ...",l:"garden/guide-to-incrementals/appeal-to-players/index.html",a:"guide-to-incrementals-appeal-to-players"},"23.1":{t:"Numbers Going Up",p:"This is a very common response to why people enjoy incremental ...",l:"garden/guide-to-incrementals/appeal-to-players/index.html#numbers-going-up",a:"numbers-going-up"},"23.2":{t:"Effortlessness",p:"Incremental games are so easy, a lot of them even have you pro ...",l:"garden/guide-to-incrementals/appeal-to-players/index.html#effortlessness",a:"effortlessness"},"23.3":{t:"Strategy",p:"Incremental games could be considered a subset of strategy gam ...",l:"garden/guide-to-incrementals/appeal-to-players/index.html#strategy",a:"strategy"},"23.4":{t:"Avoiding Staleness",p:"Incremental games tend to have "paradigm shifts", wh ...",l:"garden/guide-to-incrementals/appeal-to-players/index.html#avoiding-staleness",a:"avoiding-staleness"},"23.5":{t:"Good Game Design",p:"Incremental games tend to show their game design "plainly ...",l:"garden/guide-to-incrementals/appeal-to-players/index.html#good-game-design",a:"good-game-design"},"23.6":{t:"Artistic Merit",p:"The Vampire Survivors video made me think back to the old argu ...",l:"garden/guide-to-incrementals/appeal-to-players/index.html#artistic-merit",a:"artistic-merit"},"24.0":{t:"# Guide to Incrementals/Defining the Genre",p:"Video games are placed into genres for a variety of reasons. T ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html",a:"guide-to-incrementals-defining-the-genre"},"24.1":{t:"Incrementals vs Idlers vs Clickers",p:"Oftentimes people refer to this genre as idle games and/or cli ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#incrementals-vs-idlers-vs-clickers",a:"incrementals-vs-idlers-vs-clickers"},"24.2":{t:"Incrementals as NGU",p:"Another broad definition often used is that incremental games ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#incrementals-as-ngu",a:"incrementals-as-ngu"},"24.3":{t:"Roguelites as Incrementals?",p:"Earlier on, I mentioned reset mechanics shouldn't be used in t ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#roguelites-as-incrementals",a:"roguelites-as-incrementals"},"24.4":{t:"The Berlin Interpretation",p:"By far the most popular way of defining roguelikes is the &quo ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#the-berlin-interpretation",a:"the-berlin-interpretation"},"24.5":{t:"The Incremental Games Canon",p:"Alright, time to get controversial. Up til now, I've been tryi ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#the-incremental-games-canon",a:"the-incremental-games-canon"},"24.6":{t:"The Paradigm Shift",p:"The Paradigm Shift is probably the highest possible value fact ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#the-paradigm-shift",a:"the-paradigm-shift"},"24.7":{t:"High-Value Factors",p:"I won't take as long to discuss the high and low-value factors ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#high-value-factors",a:"high-value-factors"},"24.8":{t:"Low-Value Factors",p:"These are low-value factors, meaning they aren't as strongly c ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#low-value-factors",a:"low-value-factors"},"24.9":{t:"Are Roguelites Incrementals?",p:"Having made our variation of the Berlin Interpretation for inc ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#are-roguelites-incrementals",a:"are-roguelites-incrementals"},"24.10":{t:"Sub-Genres",p:"There are some trends in incremental games that go beyond just ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#sub-genres",a:"sub-genres"},"24.11":{t:"Other Related Genres",p:"Cultivation RPGs are a genre of games, books, and anime popula ...",l:"garden/guide-to-incrementals/defining-the-genre/index.html#other-related-genres",a:"other-related-genres"},"25.0":{t:"# Guide to Incrementals",p:"This is a comprehensive guide to Incremental Games, a genre of ...",l:"garden/guide-to-incrementals/index.html",a:"guide-to-incrementals"},"25.1":{t:"Why am I making this?",p:"That's a good question! What authority do I have to be making ...",l:"garden/guide-to-incrementals/index.html#why-am-i-making-this",a:"why-am-i-making-this"},"25.2":{t:"Ludology",p:` +Guide to Incrementals/Defining the Genre +Guide to Incremental ...`,l:"garden/guide-to-incrementals/index.html#ludology",a:"ludology"},"25.3":{t:"Making an Incremental",p:` +Guide to Incrementals/Navigating Criticism + +`,l:"garden/guide-to-incrementals/index.html#making-an-incremental",a:"making-an-incremental"},"26.0":{t:"# Guide to Incrementals/Navigating Criticism",p:"Developing games is fun and exciting and teaches a lot of wond ...",l:"garden/guide-to-incrementals/navigating-criticism/index.html",a:"guide-to-incrementals-navigating-criticism"},"26.1":{t:"Reading Feedback",p:"Game development is a skill that takes time and practice to ge ...",l:"garden/guide-to-incrementals/navigating-criticism/index.html#reading-feedback",a:"reading-feedback"},"26.2":{t:"Seeking Feedback",p:"When deciding where to share your game, consider the type of p ...",l:"garden/guide-to-incrementals/navigating-criticism/index.html#seeking-feedback",a:"seeking-feedback"},"26.3":{t:"Responding to Feedback",p:"Negative feedback can naturally feel like an attack, and it's ...",l:"garden/guide-to-incrementals/navigating-criticism/index.html#responding-to-feedback",a:"responding-to-feedback"},"27.0":{t:"# Guide to Incrementals/What is Content?",p:"If you've been in the incremental games community for any amou ...",l:"garden/guide-to-incrementals/what-is-content/index.html",a:"guide-to-incrementals-what-is-content"},"27.1":{t:"Interaction",p:"I think it should be a fairly non-controversial opinion that t ...",l:"garden/guide-to-incrementals/what-is-content/index.html#interaction",a:"interaction"},"27.2":{t:"Repeatable Purchases",p:"Imagine an entity in a game that you can purchase multiple tim ...",l:"garden/guide-to-incrementals/what-is-content/index.html#repeatable-purchases",a:"repeatable-purchases"},"27.3":{t:"Following Instructions",p:"We're getting more and more controversial as we go along! Let' ...",l:"garden/guide-to-incrementals/what-is-content/index.html#following-instructions",a:"following-instructions"},"27.4":{t:"Tips for Developers",p:"If you're a developer, by this point you should have a pretty ...",l:"garden/guide-to-incrementals/what-is-content/index.html#tips-for-developers",a:"tips-for-developers"},"28.0":{t:"# Incremental Social",p:` +Referenced by: Federated Identity, My Personal Website, Webri ...`,l:"garden/incremental-social/index.html",a:"incremental-social"},"29.0":{t:"# Ivy Road",p:` +Referenced by: Davey Wreden, Wanderstop + + +Tags: Davey Wreden + ...`,l:"garden/ivy-road/index.html",a:"ivy-road"},"30.0":{t:"# Kronos",p:` +Referenced by: V-ecs + + +Tags: My Projects, Profectus + +My large ...`,l:"garden/kronos/index.html",a:"kronos"},"31.0":{t:"# Logseq",p:` +Referenced by: This Knowledge Hub + +Logseq is an Open Source o ...`,l:"garden/logseq/index.html",a:"logseq"},"32.0":{t:"# Matrix",p:` +Referenced by: Cinny, Commune, Synapse + +Matrix is a protocol ...`,l:"garden/matrix/index.html",a:"matrix"},"33.0":{t:"# Mbin",p:` +Referenced by: Incremental Social + +Mbin is an Open Source Fed ...`,l:"garden/mbin/index.html",a:"mbin"},"34.0":{t:"# My Personal Website",p:` +Referenced by: The Small Web + +A Personal Websites for me, ava ...`,l:"garden/my-personal-website/index.html",a:"my-personal-website"},"35.0":{t:"# My Projects",p:` +Tagged by: Advent Incremental, Babble Buds, Capture the Citad ...`,l:"garden/my-projects/index.html",a:"my-projects"},"35.1":{t:"Games",p:` +Planar Pioneers (play) +Advent Incremental (play) +Game Dev Tre ...`,l:"garden/my-projects/index.html#games",a:"games"},"35.2":{t:"Tools (and other non-games)",p:` +Profectus +Incremental Social +Babble Buds +V-ecs +Opti-Speech + +`,l:"garden/my-projects/index.html#tools-and-other-non-games",a:"tools-and-other-non-games"},"36.0":{t:"# Nostr",p:` +Referenced by: Fediverse + + +Tags: Decentralized + +Nostr is a pr ...`,l:"garden/nostr/index.html",a:"nostr"},"37.0":{t:"# Open Source",p:` +Referenced by: Advent Incremental, Cinny, Commune, Dice Armor ...`,l:"garden/open-source/index.html",a:"open-source"},"38.0":{t:"# Opti-Speech",p:` +Tags: My Projects + +In college I continued development on the ...`,l:"garden/opti-speech/index.html",a:"opti-speech"},"38.1":{t:"The Original Project",p:"The Optispeech project involves designing and testing a real-t ...",l:"garden/opti-speech/index.html#the-original-project",a:"the-original-project"},"38.2":{t:"My Work",p:"As the sole programmer at UT Dallas Speech Production Lab at t ...",l:"garden/opti-speech/index.html#my-work",a:"my-work"},"39.0":{t:"# Planar Pioneers",p:` +Tags: My Projects, Profectus + +Play it here! +An Open Source ga ...`,l:"garden/planar-pioneers/index.html",a:"planar-pioneers"},"40.0":{t:"# Profectus",p:` +Referenced by: Advent Incremental, Planar Pioneers + + +Tagged b ...`,l:"garden/profectus/index.html",a:"profectus"},"41.0":{t:"# Social Media",p:` +Referenced by: Commune, Fedi v2, Fediverse + +Traditional socia ...`,l:"garden/social-media/index.html",a:"social-media"},"42.0":{t:"# Synapse",p:` +Referenced by: Incremental Social + +Synapse is an Open Source ...`,l:"garden/synapse/index.html",a:"synapse"},"43.0":{t:"# The Beginner's Guide",p:` +Tags: Davey Wreden + +My favorite video game of all time, bar n ...`,l:"garden/the-beginner-s-guide/index.html",a:"the-beginner-s-guide"},"44.0":{t:"# The Cozy Web",p:` +Referenced by: Digital Gardens, The Small Web + +The Cozy Web i ...`,l:"garden/the-cozy-web/index.html",a:"the-cozy-web"},"45.0":{t:"# The Small Web",p:` +Referenced by: This Knowledge Hub + +Small personal websites cr ...`,l:"garden/the-small-web/index.html",a:"the-small-web"},"45.1":{t:"Browsing the small web",p:` +Follow Webrings or other links from known small websites +Marg ...`,l:"garden/the-small-web/index.html#browsing-the-small-web",a:"browsing-the-small-web"},"45.2":{t:"Building personal websites",p:`IndieWeb contains various resources + +Their building blocks are ...`,l:"garden/the-small-web/index.html#building-personal-websites",a:"building-personal-websites"},"45.3":{t:"Streams",p:`Microsub is a proposed protocol to support this + +That way, peo ...`,l:"garden/the-small-web/index.html#streams",a:"streams"},"45.4":{t:"Digital Gardens",p:"These sites may be useful to occasionally check up on rather t ...",l:"garden/the-small-web/index.html#digital-gardens",a:"digital-gardens"},"45.5":{t:"Why people want the small web",p:"There are tools these days that make making websites incredibl ...",l:"garden/the-small-web/index.html#why-people-want-the-small-web",a:"why-people-want-the-small-web"},"45.6":{t:"Recommended videos about the small web",p:"<iframe width="560" height="315" src=&q ...",l:"garden/the-small-web/index.html#recommended-videos-about-the-small-web",a:"recommended-videos-about-the-small-web"},"46.0":{t:"# This Knowledge Hub",p:` +Referenced by: Digital Gardens + +This is my knowledge hub! + +It ...`,l:"garden/this-knowledge-hub/index.html",a:"this-knowledge-hub"},"47.0":{t:"# V-ecs",p:` +Tags: My Projects + +!screenshot.png +V-ecs (pronounced "Ve ...`,l:"garden/v-ecs/index.html",a:"v-ecs"},"48.0":{t:"# Vitepress",p:` +Referenced by: This Knowledge Hub + +Vitepress is an Open Sourc ...`,l:"garden/vitepress/index.html",a:"vitepress"},"49.0":{t:"# Wanderstop",p:` +Tags: Davey Wreden + +Wanderstop is the first game by Ivy Road. ...`,l:"garden/wanderstop/index.html",a:"wanderstop"},"50.0":{t:"# Webrings",p:` +Referenced by: The Small Web + +A collection of Personal Websit ...`,l:"garden/webrings/index.html",a:"webrings"},"51.0":{t:"# Weird",p:` +Referenced by: Commune, Fedi v2, The Small Web + +Weird is an O ...`,l:"garden/weird/index.html",a:"weird"},"52.0":{t:"# Guide to Incrementals/Navigating Criticism",p:"Developing games is fun and exciting and teaches a lot of wond ...",l:"guide-to-incrementals/design/criticism/index.html",a:"guide-to-incrementals-navigating-criticism"},"52.1":{t:"Reading Feedback",p:"Game development is a skill that takes time and practice to ge ...",l:"guide-to-incrementals/design/criticism/index.html#reading-feedback",a:"reading-feedback"},"52.2":{t:"Seeking Feedback",p:"When deciding where to share your game, consider the type of p ...",l:"guide-to-incrementals/design/criticism/index.html#seeking-feedback",a:"seeking-feedback"},"52.3":{t:"Responding to Feedback",p:"Negative feedback can naturally feel like an attack, and it's ...",l:"guide-to-incrementals/design/criticism/index.html#responding-to-feedback",a:"responding-to-feedback"},"53.0":{t:"# Guide to Incrementals",p:"This is a comprehensive guide to Incremental Games, a genre of ...",l:"guide-to-incrementals/index.html",a:"guide-to-incrementals"},"53.1":{t:"Why am I making this?",p:"That's a good question! What authority do I have to be making ...",l:"guide-to-incrementals/index.html#why-am-i-making-this",a:"why-am-i-making-this"},"53.2":{t:"Ludology",p:` +Guide to Incrementals/Defining the Genre +Guide to Incremental ...`,l:"guide-to-incrementals/index.html#ludology",a:"ludology"},"53.3":{t:"Making an Incremental",p:` +Guide to Incrementals/Navigating Criticism + +`,l:"guide-to-incrementals/index.html#making-an-incremental",a:"making-an-incremental"},"54.0":{t:"# Guide to Incrementals/Appeal to Developers",p:"There are a lot of developers in the incremental games communi ...",l:"guide-to-incrementals/ludology/appeal-developers/index.html",a:"guide-to-incrementals-appeal-to-developers"},"54.1":{t:"Incrementals are Easy to Make",p:"Compared to other genres, incrementals have quite low expectat ...",l:"guide-to-incrementals/ludology/appeal-developers/index.html#incrementals-are-easy-to-make",a:"incrementals-are-easy-to-make"},"54.2":{t:"Players are Easy to Find",p:"Once you've finished your game and uploaded it on github pages ...",l:"guide-to-incrementals/ludology/appeal-developers/index.html#players-are-easy-to-find",a:"players-are-easy-to-find"},"54.3":{t:"Monetization",p:"I'd like to clarify that everything I've said above mainly app ...",l:"guide-to-incrementals/ludology/appeal-developers/index.html#monetization",a:"monetization"},"55.0":{t:"# Guide to Incrementals/Appeal to Players",p:"This is something that has been discussed and analyzed by many ...",l:"guide-to-incrementals/ludology/appeal-gamers/index.html",a:"guide-to-incrementals-appeal-to-players"},"55.1":{t:"Numbers Going Up",p:"This is a very common response to why people enjoy incremental ...",l:"guide-to-incrementals/ludology/appeal-gamers/index.html#numbers-going-up",a:"numbers-going-up"},"55.2":{t:"Effortlessness",p:"Incremental games are so easy, a lot of them even have you pro ...",l:"guide-to-incrementals/ludology/appeal-gamers/index.html#effortlessness",a:"effortlessness"},"55.3":{t:"Strategy",p:"Incremental games could be considered a subset of strategy gam ...",l:"guide-to-incrementals/ludology/appeal-gamers/index.html#strategy",a:"strategy"},"55.4":{t:"Avoiding Staleness",p:"Incremental games tend to have "paradigm shifts", wh ...",l:"guide-to-incrementals/ludology/appeal-gamers/index.html#avoiding-staleness",a:"avoiding-staleness"},"55.5":{t:"Good Game Design",p:"Incremental games tend to show their game design "plainly ...",l:"guide-to-incrementals/ludology/appeal-gamers/index.html#good-game-design",a:"good-game-design"},"55.6":{t:"Artistic Merit",p:"The Vampire Survivors video made me think back to the old argu ...",l:"guide-to-incrementals/ludology/appeal-gamers/index.html#artistic-merit",a:"artistic-merit"},"56.0":{t:"# Guide to Incrementals/What is Content?",p:"If you've been in the incremental games community for any amou ...",l:"guide-to-incrementals/ludology/content/index.html",a:"guide-to-incrementals-what-is-content"},"56.1":{t:"Interaction",p:"I think it should be a fairly non-controversial opinion that t ...",l:"guide-to-incrementals/ludology/content/index.html#interaction",a:"interaction"},"56.2":{t:"Repeatable Purchases",p:"Imagine an entity in a game that you can purchase multiple tim ...",l:"guide-to-incrementals/ludology/content/index.html#repeatable-purchases",a:"repeatable-purchases"},"56.3":{t:"Following Instructions",p:"We're getting more and more controversial as we go along! Let' ...",l:"guide-to-incrementals/ludology/content/index.html#following-instructions",a:"following-instructions"},"56.4":{t:"Tips for Developers",p:"If you're a developer, by this point you should have a pretty ...",l:"guide-to-incrementals/ludology/content/index.html#tips-for-developers",a:"tips-for-developers"},"57.0":{t:"# Guide to Incrementals/Defining the Genre",p:"Video games are placed into genres for a variety of reasons. T ...",l:"guide-to-incrementals/ludology/definition/index.html",a:"guide-to-incrementals-defining-the-genre"},"57.1":{t:"Incrementals vs Idlers vs Clickers",p:"Oftentimes people refer to this genre as idle games and/or cli ...",l:"guide-to-incrementals/ludology/definition/index.html#incrementals-vs-idlers-vs-clickers",a:"incrementals-vs-idlers-vs-clickers"},"57.2":{t:"Incrementals as NGU",p:"Another broad definition often used is that incremental games ...",l:"guide-to-incrementals/ludology/definition/index.html#incrementals-as-ngu",a:"incrementals-as-ngu"},"57.3":{t:"Roguelites as Incrementals?",p:"Earlier on, I mentioned reset mechanics shouldn't be used in t ...",l:"guide-to-incrementals/ludology/definition/index.html#roguelites-as-incrementals",a:"roguelites-as-incrementals"},"57.4":{t:"The Berlin Interpretation",p:"By far the most popular way of defining roguelikes is the &quo ...",l:"guide-to-incrementals/ludology/definition/index.html#the-berlin-interpretation",a:"the-berlin-interpretation"},"57.5":{t:"The Incremental Games Canon",p:"Alright, time to get controversial. Up til now, I've been tryi ...",l:"guide-to-incrementals/ludology/definition/index.html#the-incremental-games-canon",a:"the-incremental-games-canon"},"57.6":{t:"The Paradigm Shift",p:"The Paradigm Shift is probably the highest possible value fact ...",l:"guide-to-incrementals/ludology/definition/index.html#the-paradigm-shift",a:"the-paradigm-shift"},"57.7":{t:"High-Value Factors",p:"I won't take as long to discuss the high and low-value factors ...",l:"guide-to-incrementals/ludology/definition/index.html#high-value-factors",a:"high-value-factors"},"57.8":{t:"Low-Value Factors",p:"These are low-value factors, meaning they aren't as strongly c ...",l:"guide-to-incrementals/ludology/definition/index.html#low-value-factors",a:"low-value-factors"},"57.9":{t:"Are Roguelites Incrementals?",p:"Having made our variation of the Berlin Interpretation for inc ...",l:"guide-to-incrementals/ludology/definition/index.html#are-roguelites-incrementals",a:"are-roguelites-incrementals"},"57.10":{t:"Sub-Genres",p:"There are some trends in incremental games that go beyond just ...",l:"guide-to-incrementals/ludology/definition/index.html#sub-genres",a:"sub-genres"},"57.11":{t:"Other Related Genres",p:"Cultivation RPGs are a genre of games, books, and anime popula ...",l:"guide-to-incrementals/ludology/definition/index.html#other-related-genres",a:"other-related-genres"},"59.0":{t:"# 2.0 format changes",p:` +Temp format is changed from temp.something[layer] to temp[lay ...`,l:"public/gamedevtree/2.0-format-changes.html",a:"_2-0-format-changes"},"60.0":{t:"# The-Modding-Tree",p:"A modified version of The Prestige Tree that is much easier to ...",l:"public/gamedevtree/README.html",a:"the-modding-tree"},"61.0":{t:"# The Game Dev Tree changelog:",p:"",l:"public/gamedevtree/changelog.html",a:"the-game-dev-tree-changelog"},"61.1":{t:"v1.0.4 Version Bump [rebalanced,debuggedx3] - 2020-11-09",p:` +Fixed refactorings 2, 3, and 4 not actually affecting product ...`,l:"public/gamedevtree/changelog.html#v1-0-4-version-bump-rebalanced-debuggedx3-2020-11-09",a:"v1-0-4-version-bump-rebalanced-debuggedx3-2020-11-09"},"61.2":{t:"v1.0.3 Version Bump [rebalanced,debuggedx2] - 2020-11-08",p:` +Fixed API milestone 4 not working + +`,l:"public/gamedevtree/changelog.html#v1-0-3-version-bump-rebalanced-debuggedx2-2020-11-08",a:"v1-0-3-version-bump-rebalanced-debuggedx2-2020-11-08"},"61.3":{t:"v1.0.2 Version Bump [rebalanced,debugged] - 2020-11-08",p:` +Fixed tree lines being hidden after hitting "keepGoing&q ...`,l:"public/gamedevtree/changelog.html#v1-0-2-version-bump-rebalanced-debugged-2020-11-08",a:"v1-0-2-version-bump-rebalanced-debugged-2020-11-08"},"61.4":{t:"v1.0.1 Version Bump [rebalanced] - 2020-11-08",p:` +Buffed several TAs + +`,l:"public/gamedevtree/changelog.html#v1-0-1-version-bump-rebalanced-2020-11-08",a:"v1-0-1-version-bump-rebalanced-2020-11-08"},"61.5":{t:"v1.0 Version Bump - 2020-11-08",p:` +Finished row 4 +Added colored text to lore +Fixed some visual b ...`,l:"public/gamedevtree/changelog.html#v1-0-version-bump-2020-11-08",a:"v1-0-version-bump-2020-11-08"},"61.6":{t:"v0.2.3 Stylish - 2020-10-30",p:` +Re-styled basically everything +Added favicon +Added header bar ...`,l:"public/gamedevtree/changelog.html#v0-2-3-stylish-2020-10-30",a:"v0-2-3-stylish-2020-10-30"},"61.7":{t:"v0.2.2 Row 3 - 2020-10-22",p:` +Removed debug statement +Moved milestones in F layer beneath t ...`,l:"public/gamedevtree/changelog.html#v0-2-2-row-3-2020-10-22",a:"v0-2-2-row-3-2020-10-22"},"61.8":{t:"v0.2.1 Row 3 - 2020-10-21",p:` +Fixed layers hiding +Fixed typos/minor issues +Fixed S layer be ...`,l:"public/gamedevtree/changelog.html#v0-2-1-row-3-2020-10-21",a:"v0-2-1-row-3-2020-10-21"},"61.9":{t:"v0.2 Row 3 - 2020-10-21",p:` +Implemented row 3 + +`,l:"public/gamedevtree/changelog.html#v0-2-row-3-2020-10-21",a:"v0-2-row-3-2020-10-21"},"61.10":{t:"v0.1.1 Cash Influx [rebalanced] - 2020-10-19",p:` +Fixed notification issue +Rebalanced to make early game faster ...`,l:"public/gamedevtree/changelog.html#v0-1-1-cash-influx-rebalanced-2020-10-19",a:"v0-1-1-cash-influx-rebalanced-2020-10-19"},"61.11":{t:"v0.1 Cash Influx - 2020-10-19",p:` +Implemented row 2 + +`,l:"public/gamedevtree/changelog.html#v0-1-cash-influx-2020-10-19",a:"v0-1-cash-influx-2020-10-19"},"61.12":{t:"v0.0 Initial Commit - 2020-10-18",p:` +Implemented row 1 + +`,l:"public/gamedevtree/changelog.html#v0-0-initial-commit-2020-10-18",a:"v0-0-initial-commit-2020-10-18"},"62.0":{t:"# The-Modding-Tree",p:"The main way to add content is through creating layers. You ca ...",l:"public/gamedevtree/docs/!general-info.html",a:"the-modding-tree"},"62.1":{t:"General:",p:` +Getting Started: Getting your own copy of the code set up wit ...`,l:"public/gamedevtree/docs/!general-info.html#general",a:"general"},"62.2":{t:"Common components",p:` +Upgrades: How to create upgrades for a layer. +Milestones: How ...`,l:"public/gamedevtree/docs/!general-info.html#common-components",a:"common-components"},"62.3":{t:"Other components",p:` +Challenges: How to create challenges for a layer. +Bars: Displ ...`,l:"public/gamedevtree/docs/!general-info.html#other-components",a:"other-components"},"63.0":{t:"# Achievements",p:"Achievements are awarded to the player when they meet a certai ...",l:"public/gamedevtree/docs/achievements.html",a:"achievements"},"64.0":{t:"# Bars",p:"Bars let you display information in a more direct way. It can ...",l:"public/gamedevtree/docs/bars.html",a:"bars"},"65.0":{t:"# Basic layer breakdown",p:"This is a very minimal layer with minimal features. Most thing ...",l:"public/gamedevtree/docs/basic-layer-breakdown.html",a:"basic-layer-breakdown"},"66.0":{t:"# Buyables",p:"Buyables are usually things that can be bought multiple times ...",l:"public/gamedevtree/docs/buyables.html",a:"buyables"},"67.0":{t:"# Challenges",p:"Useful functions for dealing with Challenges and implementing ...",l:"public/gamedevtree/docs/challenges.html",a:"challenges"},"68.0":{t:"# Clickables",p:"Clickables are any kind of thing that you can click for an eff ...",l:"public/gamedevtree/docs/clickables.html",a:"clickables"},"69.0":{t:"# Custom tab layouts",p:"Note: If you are using subtabs, tabFormat is used differently, ...",l:"public/gamedevtree/docs/custom-tab-layouts.html",a:"custom-tab-layouts"},"70.0":{t:"# Getting started",p:`Welcome to The Modding Tree! +Using the Modding Tree, at its si ...`,l:"public/gamedevtree/docs/getting-started.html",a:"getting-started"},"70.1":{t:"Getting set up with Github and The Modding Tree:",p:` + +Install Github Desktop and Visual Studio Code. + + +Make a Gith ...`,l:"public/gamedevtree/docs/getting-started.html#getting-set-up-with-github-and-the-modding-tree",a:"getting-set-up-with-github-and-the-modding-tree"},"70.2":{t:"Using your repository",p:` + +Click on "show in finder" to the right, and then o ...`,l:"public/gamedevtree/docs/getting-started.html#using-your-repository",a:"using-your-repository"},"71.0":{t:"# Infoboxes",p:"Infoboxes are good for displaying "lore", or story e ...",l:"public/gamedevtree/docs/infoboxes.html",a:"infoboxes"},"72.0":{t:"# Layer Features",p:"This is a more comprehensive list of established features to a ...",l:"public/gamedevtree/docs/layer-features.html",a:"layer-features"},"72.1":{t:"Layer Definition features",p:` + +layer: Assigned automagically. It's the same value as the na ...`,l:"public/gamedevtree/docs/layer-features.html#layer-definition-features",a:"layer-definition-features"},"72.2":{t:"Big features (all optional)",p:` + +upgrades: A grid of one-time purchases which can have unique ...`,l:"public/gamedevtree/docs/layer-features.html#big-features-all-optional",a:"big-features-all-optional"},"72.3":{t:"Prestige formula features",p:` + +type: optional, Determines which prestige formula you use. D ...`,l:"public/gamedevtree/docs/layer-features.html#prestige-formula-features",a:"prestige-formula-features"},"72.4":{t:"Tree/node features",p:` + +symbol: optional, the text that appears on this layer's node ...`,l:"public/gamedevtree/docs/layer-features.html#tree-node-features",a:"tree-node-features"},"72.5":{t:"Other features",p:` + +doReset(resettingLayer): optional, is triggered when a layer ...`,l:"public/gamedevtree/docs/layer-features.html#other-features",a:"other-features"},"72.6":{t:"Custom Prestige type ",p:` + +getResetGain(): For custom prestige type, Returns how many p ...`,l:"public/gamedevtree/docs/layer-features.html#custom-prestige-type",a:"custom-prestige-type"},"73.0":{t:"# mod.js",p:"All of the code and data that you're likely to edit is here in ...",l:"public/gamedevtree/docs/main-mod-info.html",a:"mod-js"},"74.0":{t:"# Milestones",p:"Milestones are awarded to the player when they meet a certain ...",l:"public/gamedevtree/docs/milestones.html",a:"milestones"},"75.0":{t:"# Subtabs and Microtabs",p:"Subtabs are separate sections of a tab that you can view by se ...",l:"public/gamedevtree/docs/subtabs-and-microtabs.html",a:"subtabs-and-microtabs"},"76.0":{t:"# Updating The Modding Tree",p:"This tutorial assumes that you have used the Getting Started T ...",l:"public/gamedevtree/docs/updating-tmt.html",a:"updating-the-modding-tree"},"77.0":{t:"# Upgrades",p:"Useful functions for dealing with Upgrades and implementing th ...",l:"public/gamedevtree/docs/upgrades.html",a:"upgrades"},"78.0":{t:"# 2.0 format changes",p:` +Temp format is changed from temp.something[layer] to temp[lay ...`,l:"public/kronos/Old Things/2.0-format-changes.html",a:"_2-0-format-changes"},"79.0":{t:"# Kronos",p:`Play here. +Updating the website: + +git submodule update --remot ...`,l:"public/kronos/README.html",a:"kronos"},"80.0":{t:"# The Modding Tree changelog:",p:"",l:"public/kronos/changelog.html",a:"the-modding-tree-changelog"},"80.1":{t:"v2.5.9.2 - 5/19/21",p:` +Fixed many issues with things not updating. + +`,l:"public/kronos/changelog.html#v2-5-9-2-5-19-21",a:"v2-5-9-2-5-19-21"},"80.2":{t:"v2.5.9.1 - 5/18/21",p:` +Made text inputs never give NaNs. + +`,l:"public/kronos/changelog.html#v2-5-9-1-5-18-21",a:"v2-5-9-1-5-18-21"},"80.3":{t:"v2.5.9 - 5/18/21",p:` +Fixed issue when using text inputs for Numbers. +Added particl ...`,l:"public/kronos/changelog.html#v2-5-9-5-18-21",a:"v2-5-9-5-18-21"},"80.4":{t:"v2.5.8 - 5/17/21",p:` +Added makeShinies, which creates a stationary particle in a r ...`,l:"public/kronos/changelog.html#v2-5-8-5-17-21",a:"v2-5-8-5-17-21"},"80.5":{t:"v2.5.7 - 5/15/21",p:` +Added a particle system! Not only can it be used for visual e ...`,l:"public/kronos/changelog.html#v2-5-7-5-15-21",a:"v2-5-7-5-15-21"},"80.6":{t:"v2.5.6 - 5/14/21",p:` +You can now use non-numeric ids for upgrades, buyables, etc. + ...`,l:"public/kronos/changelog.html#v2-5-6-5-14-21",a:"v2-5-6-5-14-21"},"80.7":{t:"v2.5.5.2 - 5/12/21",p:` +Fixed a major issue with buyables. +Fixed a variety of tabForm ...`,l:"public/kronos/changelog.html#v2-5-5-2-5-12-21",a:"v2-5-5-2-5-12-21"},"80.8":{t:"v2.5.5.1 - 5/12/21",p:` +Fixed clickables. + +`,l:"public/kronos/changelog.html#v2-5-5-1-5-12-21",a:"v2-5-5-1-5-12-21"},"80.9":{t:"v2.5.5 - 5/12/21",p:` +Added grids! They are a grid of buttons which behave the same ...`,l:"public/kronos/changelog.html#v2-5-5-5-12-21",a:"v2-5-5-5-12-21"},"80.10":{t:"v2.5.4 - 5/10/21",p:` +Added a setting to always use single-tab mode. +Added directMu ...`,l:"public/kronos/changelog.html#v2-5-4-5-10-21",a:"v2-5-4-5-10-21"},"80.11":{t:"v2.5.3 - 5/8/21",p:` +Improved performance of tab formats and bars. +Respec confirma ...`,l:"public/kronos/changelog.html#v2-5-3-5-8-21",a:"v2-5-3-5-8-21"},"80.12":{t:"v2.5.2.1 - 5/7/21",p:` +Fixed microtabs making layers highlight incorrectly. + +`,l:"public/kronos/changelog.html#v2-5-2-1-5-7-21",a:"v2-5-2-1-5-7-21"},"80.13":{t:"v2.5.2 - 5/7/21",p:` +Added glowColor for subtabs. +Improved the display for extreme ...`,l:"public/kronos/changelog.html#v2-5-2-5-7-21",a:"v2-5-2-5-7-21"},"80.14":{t:"v2.5.1 - 5/7/21",p:` +Fixed dynamic things in tabFormat not updating. + +`,l:"public/kronos/changelog.html#v2-5-1-5-7-21",a:"v2-5-1-5-7-21"},"80.15":{t:"v2.5: Dreams Really Do Come True - 5/7/21",p:` +Optimizations, hopefully a significant amount. +Added OOM/s po ...`,l:"public/kronos/changelog.html#v2-5-dreams-really-do-come-true-5-7-21",a:"v2-5-dreams-really-do-come-true-5-7-21"},"80.16":{t:"v2.4.1 - 4/29/21",p:` +A number of minor fixes, many thanks to thepaperpilot. +The re ...`,l:"public/kronos/changelog.html#v2-4-1-4-29-21",a:"v2-4-1-4-29-21"},"80.17":{t:"v2.4: Rationalized Edition - 4/29/21",p:` + +Completely reworked tooltips. Shift-click a node to force it ...`,l:"public/kronos/changelog.html#v2-4-rationalized-edition-4-29-21",a:"v2-4-rationalized-edition-4-29-21"},"80.18":{t:"v2.π.1 - 4/7/21",p:` +Fixed formatting for some larger numbers. +Upgrades will expan ...`,l:"public/kronos/changelog.html#v2-π-1-4-7-21",a:"v2-π-1-4-7-21"},"80.19":{t:"v2.π: Incrementally Updated - 2/5/21",p:` +Performance improvements. +Fixed tooltips overlapping with the ...`,l:"public/kronos/changelog.html#v2-π-incrementally-updated-2-5-21",a:"v2-π-incrementally-updated-2-5-21"},"80.20":{t:"v2.3.5 - 12/21/20",p:` +Added resetTime, which tracks the time since a layer prestige ...`,l:"public/kronos/changelog.html#v2-3-5-12-21-20",a:"v2-3-5-12-21-20"},"80.21":{t:"v2.3.4 - 12/16/20",p:` +Added a node image feature. +Resource display now always shows ...`,l:"public/kronos/changelog.html#v2-3-4-12-16-20",a:"v2-3-4-12-16-20"},"80.22":{t:"v2.3.3 - 12/13/20",p:` +Fixed the first node in a row always taking up space. +layerSh ...`,l:"public/kronos/changelog.html#v2-3-3-12-13-20",a:"v2-3-3-12-13-20"},"80.23":{t:"v2.3.2 - 12/13/20",p:` +Fixed achievement/milestone popups. + +`,l:"public/kronos/changelog.html#v2-3-2-12-13-20",a:"v2-3-2-12-13-20"},"80.24":{t:"v2.3.1 - 12/12/20",p:` +Another attempt to fix flickering tooltips. +The "this&qu ...`,l:"public/kronos/changelog.html#v2-3-1-12-12-20",a:"v2-3-1-12-12-20"},"80.25":{t:"v2.3: Cooler and Newer Edition - 12/10/20",p:` +Added achievement/milestone popups (thank you to Jacorb for t ...`,l:"public/kronos/changelog.html#v2-3-cooler-and-newer-edition-12-10-20",a:"v2-3-cooler-and-newer-edition-12-10-20"},"80.26":{t:"v2.2.8 - 12/03/20",p:` +Double-clicking a layer node brings you to the main subtab fo ...`,l:"public/kronos/changelog.html#v2-2-8-12-03-20",a:"v2-2-8-12-03-20"},"80.27":{t:"v2.2.7 - 11/30/20",p:` +Added autoUpgrade feature. +resource-display now shows resourc ...`,l:"public/kronos/changelog.html#v2-2-7-11-30-20",a:"v2-2-7-11-30-20"},"80.28":{t:"v2.2.6 - 11/30/20",p:` +Added goalDescription for challenges and made the new "c ...`,l:"public/kronos/changelog.html#v2-2-6-11-30-20",a:"v2-2-6-11-30-20"},"80.29":{t:"v2.2.5 - 11/29/20",p:` +Added features for overriding the displays and costs/goals of ...`,l:"public/kronos/changelog.html#v2-2-5-11-29-20",a:"v2-2-5-11-29-20"},"80.30":{t:"v2.2.4 - 11/28/20",p:` +Added softcap and softcapPower features (for Normal layers) +O ...`,l:"public/kronos/changelog.html#v2-2-4-11-28-20",a:"v2-2-4-11-28-20"},"80.31":{t:"v2.2.3 - 11/28/20",p:` +Layers will be highlighted if you can finish a challenge. +The ...`,l:"public/kronos/changelog.html#v2-2-3-11-28-20",a:"v2-2-3-11-28-20"},"80.32":{t:"v2.2.2 - 11/22/20",p:` +Fixed right half of the screen being unclickable in some circ ...`,l:"public/kronos/changelog.html#v2-2-2-11-22-20",a:"v2-2-2-11-22-20"},"80.33":{t:"v2.2.1 - 11/7/20",p:` +Added a small highlight to layers you can meaningfully presti ...`,l:"public/kronos/changelog.html#v2-2-1-11-7-20",a:"v2-2-1-11-7-20"},"80.34":{t:"v2.2: Uprooted - 11/7/20",p:` +You can now embed a layer inside of a subtab or microtab! +Add ...`,l:"public/kronos/changelog.html#v2-2-uprooted-11-7-20",a:"v2-2-uprooted-11-7-20"},"80.35":{t:"v2.1.4 - 10/25/20",p:` +Added an infobox component. Thank you to thepaperpilot for th ...`,l:"public/kronos/changelog.html#v2-1-4-10-25-20",a:"v2-1-4-10-25-20"},"80.36":{t:"v2.1.3.1 - 10/21/20",p:` +Fixed the update function. + +`,l:"public/kronos/changelog.html#v2-1-3-1-10-21-20",a:"v2-1-3-1-10-21-20"},"80.37":{t:"v2.1.3 - 10/21/20",p:` +gainMult and gainExp are now optional. +Layer unlocking is now ...`,l:"public/kronos/changelog.html#v2-1-3-10-21-20",a:"v2-1-3-10-21-20"},"80.38":{t:"v2.1.2 - 10/19/20",p:` +Added buyUpgrade function (buyUpg still works though) +Added a ...`,l:"public/kronos/changelog.html#v2-1-2-10-19-20",a:"v2-1-2-10-19-20"},"80.39":{t:"v2.1.1 - 10/17/20",p:` +Added resource-display component, which displays the base cur ...`,l:"public/kronos/changelog.html#v2-1-1-10-17-20",a:"v2-1-1-10-17-20"},"80.40":{t:"v2.1: We should have thought of this sooner! - 10/17/20",p:` +Moved most of the code users will want to edit to mod.js, add ...`,l:"public/kronos/changelog.html#v2-1-we-should-have-thought-of-this-sooner-10-17-20",a:"v2-1-we-should-have-thought-of-this-sooner-10-17-20"},"80.41":{t:"v2.0.5 - 10/16/20",p:` +Made more features (including prestige parameters) able to be ...`,l:"public/kronos/changelog.html#v2-0-5-10-16-20",a:"v2-0-5-10-16-20"},"80.42":{t:"v2.0.4 - 10/16/20",p:` +Fixed HTML on buttons interfering with clicking on them. + +`,l:"public/kronos/changelog.html#v2-0-4-10-16-20",a:"v2-0-4-10-16-20"},"80.43":{t:"v2.0.3 - 10/16/20",p:` +Fixed hotkeys not displaying in info. +Fixed the game supressi ...`,l:"public/kronos/changelog.html#v2-0-3-10-16-20",a:"v2-0-3-10-16-20"},"80.44":{t:"v2.0.2 - 10/15/20",p:` +Branches are now dynamic (they can be functions). +Fixed a cra ...`,l:"public/kronos/changelog.html#v2-0-2-10-15-20",a:"v2-0-2-10-15-20"},"80.45":{t:"v2.0.1 - 10/15/20",p:` +Fixed side layers appearing multiple times. + +`,l:"public/kronos/changelog.html#v2-0-1-10-15-20",a:"v2-0-1-10-15-20"},"80.46":{t:"v2.0: The Pinnacle of Achievement Mountain - 10/15/20",p:` +Added progress bars, which are highly customizable and can be ...`,l:"public/kronos/changelog.html#v2-0-the-pinnacle-of-achievement-mountain-10-15-20",a:"v2-0-the-pinnacle-of-achievement-mountain-10-15-20"},"80.47":{t:"v1.3.5:",p:` +Completely automated convertToDecimal, now you never have to ...`,l:"public/kronos/changelog.html#v1-3-5",a:"v1-3-5"},"80.48":{t:"v1.3.4 - 10/8/20",p:` +Added "midsection" feature to add things to a tab's ...`,l:"public/kronos/changelog.html#v1-3-4-10-8-20",a:"v1-3-4-10-8-20"},"80.49":{t:"v1.3.3 - 10/7/20",p:` +Fix for the "order of operations" issue in temp. + +`,l:"public/kronos/changelog.html#v1-3-3-10-7-20",a:"v1-3-3-10-7-20"},"80.50":{t:"v1.3.1 - 10/7/20",p:` +Added custom CSS and tooltips for Layer Nodes. +Added custom C ...`,l:"public/kronos/changelog.html#v1-3-1-10-7-20",a:"v1-3-1-10-7-20"},"80.51":{t:"v1.3: Tabception... ception! - 10/7/20",p:` +Added subtabs! And also a Micro-tab component to let you make ...`,l:"public/kronos/changelog.html#v1-3-tabception-ception-10-7-20",a:"v1-3-tabception-ception-10-7-20"},"80.52":{t:"v1.2.4 - 10/4/20",p:` +Layers are now highlighted if you can buy an upgrade, and a n ...`,l:"public/kronos/changelog.html#v1-2-4-10-4-20",a:"v1-2-4-10-4-20"},"80.53":{t:"v1.2.3 - 10/3/20",p:` +Added a row component, which displays a list of objects in a ...`,l:"public/kronos/changelog.html#v1-2-3-10-3-20",a:"v1-2-3-10-3-20"},"80.54":{t:"v1.2: This Changes Everything! - 10/3/20",p:` +Many layer features can now be static values or functions. (T ...`,l:"public/kronos/changelog.html#v1-2-this-changes-everything-10-3-20",a:"v1-2-this-changes-everything-10-3-20"},"80.55":{t:"v1.1.1 - 9/30/20",p:` +You can define hotkeys directly from layer config. + +`,l:"public/kronos/changelog.html#v1-1-1-9-30-20",a:"v1-1-1-9-30-20"},"80.56":{t:"v1.1: Enhanced Edition - 9/30/20",p:` +Added "Buyables", which can function like Space Bui ...`,l:"public/kronos/changelog.html#v1-1-enhanced-edition-9-30-20",a:"v1-1-enhanced-edition-9-30-20"},"80.57":{t:"v1.0 - 9/27/20",p:` +First release. + +`,l:"public/kronos/changelog.html#v1-0-9-27-20",a:"v1-0-9-27-20"},"81.0":{t:"# The-Modding-Tree",p:"Making a game in The Modding Tree mostly involves defining par ...",l:"public/kronos/docs/!general-info.html",a:"the-modding-tree"},"81.1":{t:"Table of Contents",p:"",l:"public/kronos/docs/!general-info.html#table-of-contents",a:"table-of-contents"},"81.2":{t:"General",p:` +Getting Started: Getting your own copy of the code set up wit ...`,l:"public/kronos/docs/!general-info.html#general",a:"general"},"81.3":{t:"Common components",p:` +Upgrades: How to create upgrades for a layer. +Milestones: How ...`,l:"public/kronos/docs/!general-info.html#common-components",a:"common-components"},"81.4":{t:"Other components and features",p:` +Challenges: How to create challenges for a layer. +Bars: Displ ...`,l:"public/kronos/docs/!general-info.html#other-components-and-features",a:"other-components-and-features"},"82.0":{t:"# Achievements",p:"Achievements are awarded to the player when they meet a certai ...",l:"public/kronos/docs/achievements.html",a:"achievements"},"83.0":{t:"# Bars",p:"Bars let you display information in a more direct way. It can ...",l:"public/kronos/docs/bars.html",a:"bars"},"84.0":{t:"# Basic layer breakdown",p:"This is a very minimal layer with minimal features. Most thing ...",l:"public/kronos/docs/basic-layer-breakdown.html",a:"basic-layer-breakdown"},"85.0":{t:"# Buyables",p:"Buyables are usually things that can be bought multiple times ...",l:"public/kronos/docs/buyables.html",a:"buyables"},"86.0":{t:"# Challenges",p:"Challenges can have fully customizable win conditions. Useful ...",l:"public/kronos/docs/challenges.html",a:"challenges"},"87.0":{t:"# Clickables",p:"Clickables are any kind of thing that you can click for an eff ...",l:"public/kronos/docs/clickables.html",a:"clickables"},"88.0":{t:"# Custom tab layouts",p:"Note: If you are using subtabs, tabFormat is used differently, ...",l:"public/kronos/docs/custom-tab-layouts.html",a:"custom-tab-layouts"},"89.0":{t:"# Getting started",p:`Welcome to The Modding Tree! +Using the Modding Tree, at its si ...`,l:"public/kronos/docs/getting-started.html",a:"getting-started"},"89.1":{t:"Getting set up with Github Desktop, Visual Studio Code, and The Modding Tree:",p:` + +Install Github Desktop and Visual Studio Code. + + +Make a Gith ...`,l:"public/kronos/docs/getting-started.html#getting-set-up-with-github-desktop-visual-studio-code-and-the-modding-tree",a:"getting-set-up-with-github-desktop-visual-studio-code-and-the-modding-tree"},"89.2":{t:"Using your repository",p:` + +Click on "show in explorer/finder" to the right, a ...`,l:"public/kronos/docs/getting-started.html#using-your-repository",a:"using-your-repository"},"90.0":{t:"# Grids",p:"Grids are an easier way of making a group of similar clickable ...",l:"public/kronos/docs/grids.html",a:"grids"},"91.0":{t:"# Infoboxes",p:"Infoboxes are good for displaying "lore", or story e ...",l:"public/kronos/docs/infoboxes.html",a:"infoboxes"},"92.0":{t:"# Layer Features",p:"This is a more comprehensive list of established features to a ...",l:"public/kronos/docs/layer-features.html",a:"layer-features"},"92.1":{t:"Layer Definition features",p:` + +layer: assigned automagically. It's the same value as the na ...`,l:"public/kronos/docs/layer-features.html#layer-definition-features",a:"layer-definition-features"},"92.2":{t:"Big features (all optional)",p:` + +upgrades: A set of one-time purchases which can have unique ...`,l:"public/kronos/docs/layer-features.html#big-features-all-optional",a:"big-features-all-optional"},"92.3":{t:"Prestige formula features",p:` + +type: optional. Determines which prestige formula you use. D ...`,l:"public/kronos/docs/layer-features.html#prestige-formula-features",a:"prestige-formula-features"},"92.4":{t:"Other prestige-related features",p:` + +canBuyMax(): sometimes required. required for static layers, ...`,l:"public/kronos/docs/layer-features.html#other-prestige-related-features",a:"other-prestige-related-features"},"92.5":{t:"Tree/node features",p:` + +symbol: optional. The text that appears on this layer's node ...`,l:"public/kronos/docs/layer-features.html#tree-node-features",a:"tree-node-features"},"92.6":{t:"Other features",p:` + +doReset(resettingLayer): optional. Is triggered when a layer ...`,l:"public/kronos/docs/layer-features.html#other-features",a:"other-features"},"92.7":{t:"Custom Prestige type ",p:`(All of these can also be used by other prestige types) + + +getR ...`,l:"public/kronos/docs/layer-features.html#custom-prestige-type",a:"custom-prestige-type"},"93.0":{t:"# mod.js",p:"Most of the non-layer code and data that you're likely to edit ...",l:"public/kronos/docs/main-mod-info.html",a:"mod-js"},"94.0":{t:"# Milestones",p:"Milestones are awarded to the player when they meet a certain ...",l:"public/kronos/docs/milestones.html",a:"milestones"},"95.0":{t:"# Particles",p:"Particles are free-floating elements that can move and have ma ...",l:"public/kronos/docs/particles.html",a:"particles"},"96.0":{t:"# Subtabs and Microtabs",p:"Subtabs are separate sections of a tab that you can view by se ...",l:"public/kronos/docs/subtabs-and-microtabs.html",a:"subtabs-and-microtabs"},"97.0":{t:"# Trees and tree customization",p:"If you want to have something beyond the standard tree on the ...",l:"public/kronos/docs/trees-and-tree-customization.html",a:"trees-and-tree-customization"},"97.1":{t:"layoutInfo",p:`The most important part is layoutInfo, containing: + +startTab: ...`,l:"public/kronos/docs/trees-and-tree-customization.html#layoutinfo",a:"layoutinfo"},"97.2":{t:"Trees",p:"The tree component is defined as an array of arrays of names o ...",l:"public/kronos/docs/trees-and-tree-customization.html#trees",a:"trees"},"97.3":{t:"Nodes",p:"Nodes are non-layer buttons that can go in trees. They are def ...",l:"public/kronos/docs/trees-and-tree-customization.html#nodes",a:"nodes"},"98.0":{t:"# Updating The Modding Tree",p:"This tutorial assumes that you have used the Getting Started T ...",l:"public/kronos/docs/updating-tmt.html",a:"updating-the-modding-tree"},"99.0":{t:"# Upgrades",p:"Useful functions for dealing with Upgrades and implementing th ...",l:"public/kronos/docs/upgrades.html",a:"upgrades"},"100.0":{t:"# 2.0 format changes",p:` +Temp format is changed from temp.something[layer] to temp[lay ...`,l:"public/lit/Old Things/2.0-format-changes.html",a:"_2-0-format-changes"},"101.0":{t:"# Kronos",p:`Play here. +Updating the website: + +git submodule update --remot ...`,l:"public/lit/README.html",a:"kronos"},"102.0":{t:"# The Modding Tree changelog:",p:"",l:"public/lit/changelog.html",a:"the-modding-tree-changelog"},"102.1":{t:"v2.π: Incrementally Updated - 2/5/21",p:` +Performance improvements. +Fixed tooltips overlapping with the ...`,l:"public/lit/changelog.html#v2-π-incrementally-updated-2-5-21",a:"v2-π-incrementally-updated-2-5-21"},"102.2":{t:"v2.3.5 - 12/21/20",p:` +Added resetTime, which tracks the time since a layer prestige ...`,l:"public/lit/changelog.html#v2-3-5-12-21-20",a:"v2-3-5-12-21-20"},"102.3":{t:"v2.3.4 - 12/16/20",p:` +Added a node image feature. +Resource display now always shows ...`,l:"public/lit/changelog.html#v2-3-4-12-16-20",a:"v2-3-4-12-16-20"},"102.4":{t:"v2.3.3 - 12/13/20",p:` +Fixed the first node in a row always taking up space. +layerSh ...`,l:"public/lit/changelog.html#v2-3-3-12-13-20",a:"v2-3-3-12-13-20"},"102.5":{t:"v2.3.2 - 12/13/20",p:` +Fixed achievement/milestone popups. + +`,l:"public/lit/changelog.html#v2-3-2-12-13-20",a:"v2-3-2-12-13-20"},"102.6":{t:"v2.3.1 - 12/12/20",p:` +Another attempt to fix flickering tooltips. +The "this&qu ...`,l:"public/lit/changelog.html#v2-3-1-12-12-20",a:"v2-3-1-12-12-20"},"102.7":{t:"v2.3: Cooler and Newer Edition - 12/10/20",p:` +Added achievement/milestone popups (thank you to Jacorb for t ...`,l:"public/lit/changelog.html#v2-3-cooler-and-newer-edition-12-10-20",a:"v2-3-cooler-and-newer-edition-12-10-20"},"102.8":{t:"v2.2.8 - 12/03/20",p:` +Double-clicking a layer node brings you to the main subtab fo ...`,l:"public/lit/changelog.html#v2-2-8-12-03-20",a:"v2-2-8-12-03-20"},"102.9":{t:"v2.2.7 - 11/30/20",p:` +Added autoUpgrade feature. +resource-display now shows resourc ...`,l:"public/lit/changelog.html#v2-2-7-11-30-20",a:"v2-2-7-11-30-20"},"102.10":{t:"v2.2.6 - 11/30/20",p:` +Added goalDescription for challenges and made the new "c ...`,l:"public/lit/changelog.html#v2-2-6-11-30-20",a:"v2-2-6-11-30-20"},"102.11":{t:"v2.2.5 - 11/29/20",p:` +Added features for overriding the displays and costs/goals of ...`,l:"public/lit/changelog.html#v2-2-5-11-29-20",a:"v2-2-5-11-29-20"},"102.12":{t:"v2.2.4 - 11/28/20",p:` +Added softcap and softcapPower features (for Normal layers) +O ...`,l:"public/lit/changelog.html#v2-2-4-11-28-20",a:"v2-2-4-11-28-20"},"102.13":{t:"v2.2.3 - 11/28/20",p:` +Layers will be highlighted if you can finish a challenge. +The ...`,l:"public/lit/changelog.html#v2-2-3-11-28-20",a:"v2-2-3-11-28-20"},"102.14":{t:"v2.2.2 - 11/22/20",p:` +Fixed right half of the screen being unclickable in some circ ...`,l:"public/lit/changelog.html#v2-2-2-11-22-20",a:"v2-2-2-11-22-20"},"102.15":{t:"v2.2.1 - 11/7/20",p:` +Added a small highlight to layers you can meaningfully presti ...`,l:"public/lit/changelog.html#v2-2-1-11-7-20",a:"v2-2-1-11-7-20"},"102.16":{t:"v2.2: Uprooted - 11/7/20",p:` +You can now embed a layer inside of a subtab or microtab! +Add ...`,l:"public/lit/changelog.html#v2-2-uprooted-11-7-20",a:"v2-2-uprooted-11-7-20"},"102.17":{t:"v2.1.4 - 10/25/20",p:` +Added an infobox component. Thank you to thepaperpilot for th ...`,l:"public/lit/changelog.html#v2-1-4-10-25-20",a:"v2-1-4-10-25-20"},"102.18":{t:"v2.1.3.1 - 10/21/20",p:` +Fixed the update function. + +`,l:"public/lit/changelog.html#v2-1-3-1-10-21-20",a:"v2-1-3-1-10-21-20"},"102.19":{t:"v2.1.3 - 10/21/20",p:` +gainMult and gainExp are now optional. +Layer unlocking is now ...`,l:"public/lit/changelog.html#v2-1-3-10-21-20",a:"v2-1-3-10-21-20"},"102.20":{t:"v2.1.2 - 10/19/20",p:` +Added buyUpgrade function (buyUpg still works though) +Added a ...`,l:"public/lit/changelog.html#v2-1-2-10-19-20",a:"v2-1-2-10-19-20"},"102.21":{t:"v2.1.1 - 10/17/20",p:` +Added resource-display component, which displays the base cur ...`,l:"public/lit/changelog.html#v2-1-1-10-17-20",a:"v2-1-1-10-17-20"},"102.22":{t:"v2.1: We should have thought of this sooner! - 10/17/20",p:` +Moved most of the code users will want to edit to mod.js, add ...`,l:"public/lit/changelog.html#v2-1-we-should-have-thought-of-this-sooner-10-17-20",a:"v2-1-we-should-have-thought-of-this-sooner-10-17-20"},"102.23":{t:"v2.0.5 - 10/16/20",p:` +Made more features (including prestige parameters) able to be ...`,l:"public/lit/changelog.html#v2-0-5-10-16-20",a:"v2-0-5-10-16-20"},"102.24":{t:"v2.0.4 - 10/16/20",p:` +Fixed HTML on buttons interfering with clicking on them. + +`,l:"public/lit/changelog.html#v2-0-4-10-16-20",a:"v2-0-4-10-16-20"},"102.25":{t:"v2.0.3 - 10/16/20",p:` +Fixed hotkeys not displaying in info. +Fixed the game supressi ...`,l:"public/lit/changelog.html#v2-0-3-10-16-20",a:"v2-0-3-10-16-20"},"102.26":{t:"v2.0.2 - 10/15/20",p:` +Branches are now dynamic (they can be functions). +Fixed a cra ...`,l:"public/lit/changelog.html#v2-0-2-10-15-20",a:"v2-0-2-10-15-20"},"102.27":{t:"v2.0.1 - 10/15/20",p:` +Fixed side layers appearing multiple times. + +`,l:"public/lit/changelog.html#v2-0-1-10-15-20",a:"v2-0-1-10-15-20"},"102.28":{t:"v2.0: The Pinnacle of Achievement Mountain - 10/15/20",p:` +Added progress bars, which are highly customizable and can be ...`,l:"public/lit/changelog.html#v2-0-the-pinnacle-of-achievement-mountain-10-15-20",a:"v2-0-the-pinnacle-of-achievement-mountain-10-15-20"},"102.29":{t:"v1.3.5:",p:` +Completely automated convertToDecimal, now you never have to ...`,l:"public/lit/changelog.html#v1-3-5",a:"v1-3-5"},"102.30":{t:"v1.3.4 - 10/8/20",p:` +Added "midsection" feature to add things to a tab's ...`,l:"public/lit/changelog.html#v1-3-4-10-8-20",a:"v1-3-4-10-8-20"},"102.31":{t:"v1.3.3 - 10/7/20",p:` +Fix for the "order of operations" issue in temp. + +`,l:"public/lit/changelog.html#v1-3-3-10-7-20",a:"v1-3-3-10-7-20"},"102.32":{t:"v1.3.1 - 10/7/20",p:` +Added custom CSS and tooltips for Layer Nodes. +Added custom C ...`,l:"public/lit/changelog.html#v1-3-1-10-7-20",a:"v1-3-1-10-7-20"},"102.33":{t:"v1.3: Tabception... ception! - 10/7/20",p:` +Added subtabs! And also a Micro-tab component to let you make ...`,l:"public/lit/changelog.html#v1-3-tabception-ception-10-7-20",a:"v1-3-tabception-ception-10-7-20"},"102.34":{t:"v1.2.4 - 10/4/20",p:` +Layers are now highlighted if you can buy an upgrade, and a n ...`,l:"public/lit/changelog.html#v1-2-4-10-4-20",a:"v1-2-4-10-4-20"},"102.35":{t:"v1.2.3 - 10/3/20",p:` +Added a row component, which displays a list of objects in a ...`,l:"public/lit/changelog.html#v1-2-3-10-3-20",a:"v1-2-3-10-3-20"},"102.36":{t:"v1.2: This Changes Everything! - 10/3/20",p:` +Many layer features can now be static values or functions. (T ...`,l:"public/lit/changelog.html#v1-2-this-changes-everything-10-3-20",a:"v1-2-this-changes-everything-10-3-20"},"102.37":{t:"v1.1.1:",p:` +You can define hotkeys directly from layer config. + +`,l:"public/lit/changelog.html#v1-1-1",a:"v1-1-1"},"102.38":{t:"v1.1: Enhanced Edition",p:` +Added "Buyables", which can function like Space Bui ...`,l:"public/lit/changelog.html#v1-1-enhanced-edition",a:"v1-1-enhanced-edition"},"102.39":{t:"v1.0:",p:` +First release. + +`,l:"public/lit/changelog.html#v1-0",a:"v1-0"},"103.0":{t:"# The-Modding-Tree",p:"The main way to add content is through creating layers. You ca ...",l:"public/lit/docs/!general-info.html",a:"the-modding-tree"},"103.1":{t:"Table of Contents",p:"",l:"public/lit/docs/!general-info.html#table-of-contents",a:"table-of-contents"},"103.2":{t:"General",p:` +Getting Started: Getting your own copy of the code set up wit ...`,l:"public/lit/docs/!general-info.html#general",a:"general"},"103.3":{t:"Common components",p:` +Upgrades: How to create upgrades for a layer. +Milestones: How ...`,l:"public/lit/docs/!general-info.html#common-components",a:"common-components"},"103.4":{t:"Other components and features",p:` +Challenges: How to create challenges for a layer. +Bars: Displ ...`,l:"public/lit/docs/!general-info.html#other-components-and-features",a:"other-components-and-features"},"104.0":{t:"# Achievements",p:"Achievements are awarded to the player when they meet a certai ...",l:"public/lit/docs/achievements.html",a:"achievements"},"105.0":{t:"# Bars",p:"Bars let you display information in a more direct way. It can ...",l:"public/lit/docs/bars.html",a:"bars"},"106.0":{t:"# Basic layer breakdown",p:"This is a very minimal layer with minimal features. Most thing ...",l:"public/lit/docs/basic-layer-breakdown.html",a:"basic-layer-breakdown"},"107.0":{t:"# Buyables",p:"Buyables are usually things that can be bought multiple times ...",l:"public/lit/docs/buyables.html",a:"buyables"},"108.0":{t:"# Challenges",p:"Challenges can have fully customizable win conditions. Useful ...",l:"public/lit/docs/challenges.html",a:"challenges"},"109.0":{t:"# Clickables",p:"Clickables are any kind of thing that you can click for an eff ...",l:"public/lit/docs/clickables.html",a:"clickables"},"110.0":{t:"# Custom tab layouts",p:"Note: If you are using subtabs, tabFormat is used differently, ...",l:"public/lit/docs/custom-tab-layouts.html",a:"custom-tab-layouts"},"111.0":{t:"# Getting started",p:`Welcome to The Modding Tree! +Using the Modding Tree, at its si ...`,l:"public/lit/docs/getting-started.html",a:"getting-started"},"111.1":{t:"Getting set up with Github Desktop, Visual Studio Code, and The Modding Tree:",p:` + +Install Github Desktop and Visual Studio Code. + + +Make a Gith ...`,l:"public/lit/docs/getting-started.html#getting-set-up-with-github-desktop-visual-studio-code-and-the-modding-tree",a:"getting-set-up-with-github-desktop-visual-studio-code-and-the-modding-tree"},"111.2":{t:"Using your repository",p:` + +Click on "show in explorer/finder" to the right, a ...`,l:"public/lit/docs/getting-started.html#using-your-repository",a:"using-your-repository"},"112.0":{t:"# Infoboxes",p:"Infoboxes are good for displaying "lore", or story e ...",l:"public/lit/docs/infoboxes.html",a:"infoboxes"},"113.0":{t:"# Layer Features",p:"This is a more comprehensive list of established features to a ...",l:"public/lit/docs/layer-features.html",a:"layer-features"},"113.1":{t:"Layer Definition features",p:` + +layer: assigned automagically. It's the same value as the na ...`,l:"public/lit/docs/layer-features.html#layer-definition-features",a:"layer-definition-features"},"113.2":{t:"Big features (all optional)",p:` + +upgrades: A grid of one-time purchases which can have unique ...`,l:"public/lit/docs/layer-features.html#big-features-all-optional",a:"big-features-all-optional"},"113.3":{t:"Prestige formula features",p:` + +type: optional. Determines which prestige formula you use. D ...`,l:"public/lit/docs/layer-features.html#prestige-formula-features",a:"prestige-formula-features"},"113.4":{t:"Other prestige-related features",p:` + +canBuyMax(): sometimes required. required for static layers, ...`,l:"public/lit/docs/layer-features.html#other-prestige-related-features",a:"other-prestige-related-features"},"113.5":{t:"Tree/node features",p:` + +symbol: optional. The text that appears on this layer's node ...`,l:"public/lit/docs/layer-features.html#tree-node-features",a:"tree-node-features"},"113.6":{t:"Other features",p:` + +doReset(resettingLayer): optional. Is triggered when a layer ...`,l:"public/lit/docs/layer-features.html#other-features",a:"other-features"},"113.7":{t:"Custom Prestige type ",p:`(All of these can also be used by other prestige types) + + +getR ...`,l:"public/lit/docs/layer-features.html#custom-prestige-type",a:"custom-prestige-type"},"114.0":{t:"# mod.js",p:"All of the non-layer code and data that you're likely to edit ...",l:"public/lit/docs/main-mod-info.html",a:"mod-js"},"115.0":{t:"# Milestones",p:"Milestones are awarded to the player when they meet a certain ...",l:"public/lit/docs/milestones.html",a:"milestones"},"116.0":{t:"# Subtabs and Microtabs",p:"Subtabs are separate sections of a tab that you can view by se ...",l:"public/lit/docs/subtabs-and-microtabs.html",a:"subtabs-and-microtabs"},"117.0":{t:"# Trees and tree customization",p:"If you want to have something beyond the standard tree on the ...",l:"public/lit/docs/trees-and-tree-customization.html",a:"trees-and-tree-customization"},"117.1":{t:"layoutInfo",p:`The most important part is layoutInfo, containing: + +startTab: ...`,l:"public/lit/docs/trees-and-tree-customization.html#layoutinfo",a:"layoutinfo"},"117.2":{t:"Trees",p:"The tree component is defined as an array of arrays of names o ...",l:"public/lit/docs/trees-and-tree-customization.html#trees",a:"trees"},"117.3":{t:"Nodes",p:"Nodes are non-layer buttons that can go in trees. They are def ...",l:"public/lit/docs/trees-and-tree-customization.html#nodes",a:"nodes"},"118.0":{t:"# Updating The Modding Tree",p:"This tutorial assumes that you have used the Getting Started T ...",l:"public/lit/docs/updating-tmt.html",a:"updating-the-modding-tree"},"119.0":{t:"# Upgrades",p:"Useful functions for dealing with Upgrades and implementing th ...",l:"public/lit/docs/upgrades.html",a:"upgrades"}},a={previewLength:62,buttonLabel:"Search",placeholder:"Search website",allow:[],ignore:[]},n={INDEX_DATA:e,PREVIEW_LOOKUP:t,Options:a};export{n as default}; diff --git a/assets/garden_activitypub_index.md.BBeMc1Gf.js b/assets/garden_activitypub_index.md.BKxKk1GM.js similarity index 93% rename from assets/garden_activitypub_index.md.BBeMc1Gf.js rename to assets/garden_activitypub_index.md.BKxKk1GM.js index dd854bb3..c193bdfb 100644 --- a/assets/garden_activitypub_index.md.BBeMc1Gf.js +++ b/assets/garden_activitypub_index.md.BKxKk1GM.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"ActivityPub","description":"","frontmatter":{"public":"true","slug":"activitypub","tags":["Decentralized"],"title":"ActivityPub","prev":false,"next":false},"headers":[],"relativePath":"garden/activitypub/index.md","filePath":"garden/activitypub/index.md","lastUpdated":1718069968000}'),r={name:"garden/activitypub/index.md"},c=i('

ActivityPub

Referenced by: Fediverse

Tags: Decentralized

ActivityPub is a protocol for Federated Social Media

',4),o=[c];function d(n,s,l,p,_,u){return a(),t("div",null,o)}const v=e(r,[["render",d]]);export{f as __pageData,v as default}; +import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"ActivityPub","description":"","frontmatter":{"public":"true","slug":"activitypub","tags":["Decentralized"],"title":"ActivityPub","prev":false,"next":false},"headers":[],"relativePath":"garden/activitypub/index.md","filePath":"garden/activitypub/index.md","lastUpdated":1717647948000}'),r={name:"garden/activitypub/index.md"},c=i('

ActivityPub

Referenced by: Fediverse

Tags: Decentralized

ActivityPub is a protocol for Federated Social Media

',4),o=[c];function d(n,s,l,p,_,u){return a(),t("div",null,o)}const v=e(r,[["render",d]]);export{f as __pageData,v as default}; diff --git a/assets/garden_activitypub_index.md.BBeMc1Gf.lean.js b/assets/garden_activitypub_index.md.BKxKk1GM.lean.js similarity index 88% rename from assets/garden_activitypub_index.md.BBeMc1Gf.lean.js rename to assets/garden_activitypub_index.md.BKxKk1GM.lean.js index 74d2d7a9..ca0f7c2e 100644 --- a/assets/garden_activitypub_index.md.BBeMc1Gf.lean.js +++ b/assets/garden_activitypub_index.md.BKxKk1GM.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"ActivityPub","description":"","frontmatter":{"public":"true","slug":"activitypub","tags":["Decentralized"],"title":"ActivityPub","prev":false,"next":false},"headers":[],"relativePath":"garden/activitypub/index.md","filePath":"garden/activitypub/index.md","lastUpdated":1718069968000}'),r={name:"garden/activitypub/index.md"},c=i("",4),o=[c];function d(n,s,l,p,_,u){return a(),t("div",null,o)}const v=e(r,[["render",d]]);export{f as __pageData,v as default}; +import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"ActivityPub","description":"","frontmatter":{"public":"true","slug":"activitypub","tags":["Decentralized"],"title":"ActivityPub","prev":false,"next":false},"headers":[],"relativePath":"garden/activitypub/index.md","filePath":"garden/activitypub/index.md","lastUpdated":1717647948000}'),r={name:"garden/activitypub/index.md"},c=i("",4),o=[c];function d(n,s,l,p,_,u){return a(),t("div",null,o)}const v=e(r,[["render",d]]);export{f as __pageData,v as default}; diff --git a/assets/garden_advent-incremental_index.md.04u11BOM.js b/assets/garden_advent-incremental_index.md.Bi867NSD.js similarity index 96% rename from assets/garden_advent-incremental_index.md.04u11BOM.js rename to assets/garden_advent-incremental_index.md.Bi867NSD.js index a8ea7506..54694cd6 100644 --- a/assets/garden_advent-incremental_index.md.04u11BOM.js +++ b/assets/garden_advent-incremental_index.md.Bi867NSD.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Advent Incremental","description":"","frontmatter":{"public":"true","slug":"advent-incremental","tags":["My Projects","Profectus"],"title":"Advent Incremental","prev":false,"next":false},"headers":[],"relativePath":"garden/advent-incremental/index.md","filePath":"garden/advent-incremental/index.md","lastUpdated":1718069968000}'),r={name:"garden/advent-incremental/index.md"},o=n('

Advent Incremental

Tags: My Projects, Profectus

Play it here!

An Open Source game made in Profectus over the course of 1 month by myself and other devs I know in the Incremental Games community!

I had the idea of an advent-style game that unlocked new pieces of content every real-life day a couple days before December started.

This was one of the most hectic months of my life!

I'm super happy with how it turned out. It ended up being way more ambitious than I anticipated but the end result is super large and awesome!

The TV Tropes page on this game mentions some of the cool things about this game

',8),s=[o];function d(c,i,p,l,m,h){return a(),t("div",null,s)}const _=e(r,[["render",d]]);export{u as __pageData,_ as default}; +import{_ as e,c as t,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Advent Incremental","description":"","frontmatter":{"public":"true","slug":"advent-incremental","tags":["My Projects","Profectus"],"title":"Advent Incremental","prev":false,"next":false},"headers":[],"relativePath":"garden/advent-incremental/index.md","filePath":"garden/advent-incremental/index.md","lastUpdated":1717647948000}'),r={name:"garden/advent-incremental/index.md"},o=n('

Advent Incremental

Tags: My Projects, Profectus

Play it here!

An Open Source game made in Profectus over the course of 1 month by myself and other devs I know in the Incremental Games community!

I had the idea of an advent-style game that unlocked new pieces of content every real-life day a couple days before December started.

This was one of the most hectic months of my life!

I'm super happy with how it turned out. It ended up being way more ambitious than I anticipated but the end result is super large and awesome!

The TV Tropes page on this game mentions some of the cool things about this game

',8),s=[o];function d(c,i,p,l,m,h){return a(),t("div",null,s)}const _=e(r,[["render",d]]);export{u as __pageData,_ as default}; diff --git a/assets/garden_advent-incremental_index.md.04u11BOM.lean.js b/assets/garden_advent-incremental_index.md.Bi867NSD.lean.js similarity index 89% rename from assets/garden_advent-incremental_index.md.04u11BOM.lean.js rename to assets/garden_advent-incremental_index.md.Bi867NSD.lean.js index d49f28e6..87fe0d46 100644 --- a/assets/garden_advent-incremental_index.md.04u11BOM.lean.js +++ b/assets/garden_advent-incremental_index.md.Bi867NSD.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Advent Incremental","description":"","frontmatter":{"public":"true","slug":"advent-incremental","tags":["My Projects","Profectus"],"title":"Advent Incremental","prev":false,"next":false},"headers":[],"relativePath":"garden/advent-incremental/index.md","filePath":"garden/advent-incremental/index.md","lastUpdated":1718069968000}'),r={name:"garden/advent-incremental/index.md"},o=n("",8),s=[o];function d(c,i,p,l,m,h){return a(),t("div",null,s)}const _=e(r,[["render",d]]);export{u as __pageData,_ as default}; +import{_ as e,c as t,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Advent Incremental","description":"","frontmatter":{"public":"true","slug":"advent-incremental","tags":["My Projects","Profectus"],"title":"Advent Incremental","prev":false,"next":false},"headers":[],"relativePath":"garden/advent-incremental/index.md","filePath":"garden/advent-incremental/index.md","lastUpdated":1717647948000}'),r={name:"garden/advent-incremental/index.md"},o=n("",8),s=[o];function d(c,i,p,l,m,h){return a(),t("div",null,s)}const _=e(r,[["render",d]]);export{u as __pageData,_ as default}; diff --git a/assets/garden_atproto_index.md.-sODrTEJ.js b/assets/garden_atproto_index.md.BwFHx7Hd.js similarity index 90% rename from assets/garden_atproto_index.md.-sODrTEJ.js rename to assets/garden_atproto_index.md.BwFHx7Hd.js index 774b9f69..d36d1d1c 100644 --- a/assets/garden_atproto_index.md.-sODrTEJ.js +++ b/assets/garden_atproto_index.md.BwFHx7Hd.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"ATProto","description":"","frontmatter":{"alias":"The AT Protocol","public":"true","slug":"atproto","tags":["Decentralized"],"title":"ATProto","prev":false,"next":false},"headers":[],"relativePath":"garden/atproto/index.md","filePath":"garden/atproto/index.md","lastUpdated":1718069968000}'),o={name:"garden/atproto/index.md"},n=r('

ATProto

Referenced by: Fediverse

Tags: Decentralized

The AT Protocol is a protocol for Federated Social Media

Currently only used by Bluesky

In comparison to other Fediverse protocols, ATProto is designed for a small number of large instances

',6),s=[n];function d(l,i,c,p,_,f){return a(),t("div",null,s)}const T=e(o,[["render",d]]);export{u as __pageData,T as default}; +import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"ATProto","description":"","frontmatter":{"alias":"The AT Protocol","public":"true","slug":"atproto","tags":["Decentralized"],"title":"ATProto","prev":false,"next":false},"headers":[],"relativePath":"garden/atproto/index.md","filePath":"garden/atproto/index.md","lastUpdated":1717647948000}'),o={name:"garden/atproto/index.md"},n=r('

ATProto

Referenced by: Fediverse

Tags: Decentralized

The AT Protocol is a protocol for Federated Social Media

Currently only used by Bluesky

In comparison to other Fediverse protocols, ATProto is designed for a small number of large instances

',6),s=[n];function d(l,i,c,p,_,f){return a(),t("div",null,s)}const T=e(o,[["render",d]]);export{u as __pageData,T as default}; diff --git a/assets/garden_atproto_index.md.-sODrTEJ.lean.js b/assets/garden_atproto_index.md.BwFHx7Hd.lean.js similarity index 77% rename from assets/garden_atproto_index.md.-sODrTEJ.lean.js rename to assets/garden_atproto_index.md.BwFHx7Hd.lean.js index 23dd0080..d934ee98 100644 --- a/assets/garden_atproto_index.md.-sODrTEJ.lean.js +++ b/assets/garden_atproto_index.md.BwFHx7Hd.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"ATProto","description":"","frontmatter":{"alias":"The AT Protocol","public":"true","slug":"atproto","tags":["Decentralized"],"title":"ATProto","prev":false,"next":false},"headers":[],"relativePath":"garden/atproto/index.md","filePath":"garden/atproto/index.md","lastUpdated":1718069968000}'),o={name:"garden/atproto/index.md"},n=r("",6),s=[n];function d(l,i,c,p,_,f){return a(),t("div",null,s)}const T=e(o,[["render",d]]);export{u as __pageData,T as default}; +import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"ATProto","description":"","frontmatter":{"alias":"The AT Protocol","public":"true","slug":"atproto","tags":["Decentralized"],"title":"ATProto","prev":false,"next":false},"headers":[],"relativePath":"garden/atproto/index.md","filePath":"garden/atproto/index.md","lastUpdated":1717647948000}'),o={name:"garden/atproto/index.md"},n=r("",6),s=[n];function d(l,i,c,p,_,f){return a(),t("div",null,s)}const T=e(o,[["render",d]]);export{u as __pageData,T as default}; diff --git a/assets/garden_babble-buds_index.md.BkMcku2S.js b/assets/garden_babble-buds_index.md.IVJV-9eu.js similarity index 96% rename from assets/garden_babble-buds_index.md.BkMcku2S.js rename to assets/garden_babble-buds_index.md.IVJV-9eu.js index 8b78abcc..2789d994 100644 --- a/assets/garden_babble-buds_index.md.BkMcku2S.js +++ b/assets/garden_babble-buds_index.md.IVJV-9eu.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Babble Buds","description":"","frontmatter":{"public":"true","slug":"babble-buds","tags":["My Projects"],"title":"Babble Buds","prev":false,"next":false},"headers":[],"relativePath":"garden/babble-buds/index.md","filePath":"garden/babble-buds/index.md","lastUpdated":1718069968000}'),o={name:"garden/babble-buds/index.md"},s=r('

Babble Buds

Tags: My Projects

Babble Buds is a tool for creating puppets and interacting with puppets controlled by others on a shared stage

Note: I need to move the website off replit because of their monetization strategy changing. In the meantime, you can check it out from its github repository

Inspired by Puppet Pals by Robert Moran

Intended for use in RPG Campaigns

The renderer was separated into its own project, babble.js, so it could be used for stuff like cutscenes

I ported the engine to C# and used it for the cutscenes in Dice Armor

  • I don't believe I ever separated it out into its own project, but you can find the code here
',9),b=[s];function n(i,d,l,p,c,u){return a(),t("div",null,b)}const _=e(o,[["render",n]]);export{f as __pageData,_ as default}; +import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Babble Buds","description":"","frontmatter":{"public":"true","slug":"babble-buds","tags":["My Projects"],"title":"Babble Buds","prev":false,"next":false},"headers":[],"relativePath":"garden/babble-buds/index.md","filePath":"garden/babble-buds/index.md","lastUpdated":1717647948000}'),o={name:"garden/babble-buds/index.md"},s=r('

Babble Buds

Tags: My Projects

Babble Buds is a tool for creating puppets and interacting with puppets controlled by others on a shared stage

Note: I need to move the website off replit because of their monetization strategy changing. In the meantime, you can check it out from its github repository

Inspired by Puppet Pals by Robert Moran

Intended for use in RPG Campaigns

The renderer was separated into its own project, babble.js, so it could be used for stuff like cutscenes

I ported the engine to C# and used it for the cutscenes in Dice Armor

  • I don't believe I ever separated it out into its own project, but you can find the code here
',9),b=[s];function n(i,d,l,p,c,u){return a(),t("div",null,b)}const _=e(o,[["render",n]]);export{f as __pageData,_ as default}; diff --git a/assets/garden_babble-buds_index.md.BkMcku2S.lean.js b/assets/garden_babble-buds_index.md.IVJV-9eu.lean.js similarity index 88% rename from assets/garden_babble-buds_index.md.BkMcku2S.lean.js rename to assets/garden_babble-buds_index.md.IVJV-9eu.lean.js index 11989a84..92ff63c8 100644 --- a/assets/garden_babble-buds_index.md.BkMcku2S.lean.js +++ b/assets/garden_babble-buds_index.md.IVJV-9eu.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Babble Buds","description":"","frontmatter":{"public":"true","slug":"babble-buds","tags":["My Projects"],"title":"Babble Buds","prev":false,"next":false},"headers":[],"relativePath":"garden/babble-buds/index.md","filePath":"garden/babble-buds/index.md","lastUpdated":1718069968000}'),o={name:"garden/babble-buds/index.md"},s=r("",9),b=[s];function n(i,d,l,p,c,u){return a(),t("div",null,b)}const _=e(o,[["render",n]]);export{f as __pageData,_ as default}; +import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Babble Buds","description":"","frontmatter":{"public":"true","slug":"babble-buds","tags":["My Projects"],"title":"Babble Buds","prev":false,"next":false},"headers":[],"relativePath":"garden/babble-buds/index.md","filePath":"garden/babble-buds/index.md","lastUpdated":1717647948000}'),o={name:"garden/babble-buds/index.md"},s=r("",9),b=[s];function n(i,d,l,p,c,u){return a(),t("div",null,b)}const _=e(o,[["render",n]]);export{f as __pageData,_ as default}; diff --git a/assets/garden_capture-the-citadel_index.md.0xMEcFyt.js b/assets/garden_capture-the-citadel_index.md.CcwwplwM.js similarity index 94% rename from assets/garden_capture-the-citadel_index.md.0xMEcFyt.js rename to assets/garden_capture-the-citadel_index.md.CcwwplwM.js index 0a54524f..f8e014f3 100644 --- a/assets/garden_capture-the-citadel_index.md.0xMEcFyt.js +++ b/assets/garden_capture-the-citadel_index.md.CcwwplwM.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as r,aa as i}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Capture the Citadel","description":"","frontmatter":{"public":"true","slug":"capture-the-citadel","tags":["My Projects"],"title":"Capture the Citadel","prev":false,"next":false},"headers":[],"relativePath":"garden/capture-the-citadel/index.md","filePath":"garden/capture-the-citadel/index.md","lastUpdated":1718069968000}'),n={name:"garden/capture-the-citadel/index.md"},c=r('

Capture the Citadel

Tags: My Projects

A 3D VR re-envisioning of a Slay the Spire-style game by Anthony Lawn and Grant Barbee for their VR class in college's final project.

For more details, visit Grant's page on the game.

screenshot.png

',5),o=[c];function s(l,d,p,h,_,u){return a(),t("div",null,o)}const m=e(n,[["render",s]]);export{f as __pageData,m as default}; +import{_ as e,c as t,o as a,a9 as r,aa as i}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Capture the Citadel","description":"","frontmatter":{"public":"true","slug":"capture-the-citadel","tags":["My Projects"],"title":"Capture the Citadel","prev":false,"next":false},"headers":[],"relativePath":"garden/capture-the-citadel/index.md","filePath":"garden/capture-the-citadel/index.md","lastUpdated":1717647948000}'),n={name:"garden/capture-the-citadel/index.md"},c=r('

Capture the Citadel

Tags: My Projects

A 3D VR re-envisioning of a Slay the Spire-style game by Anthony Lawn and Grant Barbee for their VR class in college's final project.

For more details, visit Grant's page on the game.

screenshot.png

',5),o=[c];function s(l,d,p,h,_,u){return a(),t("div",null,o)}const m=e(n,[["render",s]]);export{f as __pageData,m as default}; diff --git a/assets/garden_capture-the-citadel_index.md.0xMEcFyt.lean.js b/assets/garden_capture-the-citadel_index.md.CcwwplwM.lean.js similarity index 89% rename from assets/garden_capture-the-citadel_index.md.0xMEcFyt.lean.js rename to assets/garden_capture-the-citadel_index.md.CcwwplwM.lean.js index bdcb96c3..312e1735 100644 --- a/assets/garden_capture-the-citadel_index.md.0xMEcFyt.lean.js +++ b/assets/garden_capture-the-citadel_index.md.CcwwplwM.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as r,aa as i}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Capture the Citadel","description":"","frontmatter":{"public":"true","slug":"capture-the-citadel","tags":["My Projects"],"title":"Capture the Citadel","prev":false,"next":false},"headers":[],"relativePath":"garden/capture-the-citadel/index.md","filePath":"garden/capture-the-citadel/index.md","lastUpdated":1718069968000}'),n={name:"garden/capture-the-citadel/index.md"},c=r("",5),o=[c];function s(l,d,p,h,_,u){return a(),t("div",null,o)}const m=e(n,[["render",s]]);export{f as __pageData,m as default}; +import{_ as e,c as t,o as a,a9 as r,aa as i}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Capture the Citadel","description":"","frontmatter":{"public":"true","slug":"capture-the-citadel","tags":["My Projects"],"title":"Capture the Citadel","prev":false,"next":false},"headers":[],"relativePath":"garden/capture-the-citadel/index.md","filePath":"garden/capture-the-citadel/index.md","lastUpdated":1717647948000}'),n={name:"garden/capture-the-citadel/index.md"},c=r("",5),o=[c];function s(l,d,p,h,_,u){return a(),t("div",null,o)}const m=e(n,[["render",s]]);export{f as __pageData,m as default}; diff --git a/assets/garden_chat-glue_index.md.BJK65pvS.js b/assets/garden_chat-glue_index.md.Cgbw8xnx.js similarity index 94% rename from assets/garden_chat-glue_index.md.BJK65pvS.js rename to assets/garden_chat-glue_index.md.Cgbw8xnx.js index 98bbd115..2b028222 100644 --- a/assets/garden_chat-glue_index.md.BJK65pvS.js +++ b/assets/garden_chat-glue_index.md.Cgbw8xnx.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Chat Glue","description":"","frontmatter":{"public":"true","slug":"chat-glue","title":"Chat Glue","prev":false,"next":false},"headers":[],"relativePath":"garden/chat-glue/index.md","filePath":"garden/chat-glue/index.md","lastUpdated":1718069968000}'),n={name:"garden/chat-glue/index.md"},l=r('

Chat Glue

Referenced by: Commune, My Personal Website, The Small Web

A theoretical chat system designed to solve the problems of transcribing branching conversations into linear timelines.

Defined by the Chatting with Glue comic.

',4),o=[l];function s(c,i,h,d,_,u){return t(),a("div",null,o)}const g=e(n,[["render",s]]);export{m as __pageData,g as default}; +import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Chat Glue","description":"","frontmatter":{"public":"true","slug":"chat-glue","title":"Chat Glue","prev":false,"next":false},"headers":[],"relativePath":"garden/chat-glue/index.md","filePath":"garden/chat-glue/index.md","lastUpdated":1717647948000}'),n={name:"garden/chat-glue/index.md"},l=r('

Chat Glue

Referenced by: Commune, My Personal Website, The Small Web

A theoretical chat system designed to solve the problems of transcribing branching conversations into linear timelines.

Defined by the Chatting with Glue comic.

',4),o=[l];function s(c,i,h,d,_,u){return t(),a("div",null,o)}const g=e(n,[["render",s]]);export{m as __pageData,g as default}; diff --git a/assets/garden_chat-glue_index.md.BJK65pvS.lean.js b/assets/garden_chat-glue_index.md.Cgbw8xnx.lean.js similarity index 87% rename from assets/garden_chat-glue_index.md.BJK65pvS.lean.js rename to assets/garden_chat-glue_index.md.Cgbw8xnx.lean.js index 351a2cb6..16db62bc 100644 --- a/assets/garden_chat-glue_index.md.BJK65pvS.lean.js +++ b/assets/garden_chat-glue_index.md.Cgbw8xnx.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Chat Glue","description":"","frontmatter":{"public":"true","slug":"chat-glue","title":"Chat Glue","prev":false,"next":false},"headers":[],"relativePath":"garden/chat-glue/index.md","filePath":"garden/chat-glue/index.md","lastUpdated":1718069968000}'),n={name:"garden/chat-glue/index.md"},l=r("",4),o=[l];function s(c,i,h,d,_,u){return t(),a("div",null,o)}const g=e(n,[["render",s]]);export{m as __pageData,g as default}; +import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Chat Glue","description":"","frontmatter":{"public":"true","slug":"chat-glue","title":"Chat Glue","prev":false,"next":false},"headers":[],"relativePath":"garden/chat-glue/index.md","filePath":"garden/chat-glue/index.md","lastUpdated":1717647948000}'),n={name:"garden/chat-glue/index.md"},l=r("",4),o=[l];function s(c,i,h,d,_,u){return t(),a("div",null,o)}const g=e(n,[["render",s]]);export{m as __pageData,g as default}; diff --git a/assets/garden_chronological_index.md.DcD47fhh.js b/assets/garden_chronological_index.md.g8ZA0BlN.js similarity index 95% rename from assets/garden_chronological_index.md.DcD47fhh.js rename to assets/garden_chronological_index.md.g8ZA0BlN.js index 30ea44d2..be68161a 100644 --- a/assets/garden_chronological_index.md.DcD47fhh.js +++ b/assets/garden_chronological_index.md.g8ZA0BlN.js @@ -1 +1 @@ -import{_ as e,c as o,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const _=JSON.parse('{"title":"Chronological","description":"","frontmatter":{"public":"true","slug":"chronological","title":"Chronological","prev":false,"next":false},"headers":[],"relativePath":"garden/chronological/index.md","filePath":"garden/chronological/index.md","lastUpdated":1718069968000}'),r={name:"garden/chronological/index.md"},i=t('

Chronological

Referenced by: Digital Gardens, Freeform vs Chronological Dichotomy, The Small Web

A collection of information that is tied to its creation or edit date

Part of the Freeform vs Chronological Dichotomy

Anything with a "timeline" or "feed" is considered chronological

  • Even if there's algorithmic sortings that take things other than creation or edit date into account!

Chronological displays are less suitable as stores of knowledge (Digital Gardens)

Social media overuses timelines and feeds

RSS feeds work really well with this form of content

',9),l=[i];function n(c,s,d,h,g,f){return a(),o("div",null,l)}const m=e(r,[["render",n]]);export{_ as __pageData,m as default}; +import{_ as e,c as o,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const _=JSON.parse('{"title":"Chronological","description":"","frontmatter":{"public":"true","slug":"chronological","title":"Chronological","prev":false,"next":false},"headers":[],"relativePath":"garden/chronological/index.md","filePath":"garden/chronological/index.md","lastUpdated":1717647948000}'),r={name:"garden/chronological/index.md"},i=t('

Chronological

Referenced by: Digital Gardens, Freeform vs Chronological Dichotomy, The Small Web

A collection of information that is tied to its creation or edit date

Part of the Freeform vs Chronological Dichotomy

Anything with a "timeline" or "feed" is considered chronological

  • Even if there's algorithmic sortings that take things other than creation or edit date into account!

Chronological displays are less suitable as stores of knowledge (Digital Gardens)

Social media overuses timelines and feeds

RSS feeds work really well with this form of content

',9),l=[i];function n(c,s,d,h,g,f){return a(),o("div",null,l)}const m=e(r,[["render",n]]);export{_ as __pageData,m as default}; diff --git a/assets/garden_chronological_index.md.DcD47fhh.lean.js b/assets/garden_chronological_index.md.g8ZA0BlN.lean.js similarity index 88% rename from assets/garden_chronological_index.md.DcD47fhh.lean.js rename to assets/garden_chronological_index.md.g8ZA0BlN.lean.js index ac1ed20e..bc270066 100644 --- a/assets/garden_chronological_index.md.DcD47fhh.lean.js +++ b/assets/garden_chronological_index.md.g8ZA0BlN.lean.js @@ -1 +1 @@ -import{_ as e,c as o,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const _=JSON.parse('{"title":"Chronological","description":"","frontmatter":{"public":"true","slug":"chronological","title":"Chronological","prev":false,"next":false},"headers":[],"relativePath":"garden/chronological/index.md","filePath":"garden/chronological/index.md","lastUpdated":1718069968000}'),r={name:"garden/chronological/index.md"},i=t("",9),l=[i];function n(c,s,d,h,g,f){return a(),o("div",null,l)}const m=e(r,[["render",n]]);export{_ as __pageData,m as default}; +import{_ as e,c as o,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const _=JSON.parse('{"title":"Chronological","description":"","frontmatter":{"public":"true","slug":"chronological","title":"Chronological","prev":false,"next":false},"headers":[],"relativePath":"garden/chronological/index.md","filePath":"garden/chronological/index.md","lastUpdated":1717647948000}'),r={name:"garden/chronological/index.md"},i=t("",9),l=[i];function n(c,s,d,h,g,f){return a(),o("div",null,l)}const m=e(r,[["render",n]]);export{_ as __pageData,m as default}; diff --git a/assets/garden_cinny_index.md.rVS5Vh1G.js b/assets/garden_cinny_index.md.DjdgGx9N.js similarity index 93% rename from assets/garden_cinny_index.md.rVS5Vh1G.js rename to assets/garden_cinny_index.md.DjdgGx9N.js index 82eee3ca..b08a7ea7 100644 --- a/assets/garden_cinny_index.md.rVS5Vh1G.js +++ b/assets/garden_cinny_index.md.DjdgGx9N.js @@ -1 +1 @@ -import{_ as e,c as n,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Cinny","description":"","frontmatter":{"public":"true","slug":"cinny","title":"Cinny","prev":false,"next":false},"headers":[],"relativePath":"garden/cinny/index.md","filePath":"garden/cinny/index.md","lastUpdated":1718069968000}'),r={name:"garden/cinny/index.md"},i=t('

Cinny

Referenced by: Incremental Social

Cinny is an Open Source web client for the Matrix messaging protocol

',3),c=[i];function o(s,d,l,_,p,f){return a(),n("div",null,c)}const u=e(r,[["render",o]]);export{m as __pageData,u as default}; +import{_ as e,c as n,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Cinny","description":"","frontmatter":{"public":"true","slug":"cinny","title":"Cinny","prev":false,"next":false},"headers":[],"relativePath":"garden/cinny/index.md","filePath":"garden/cinny/index.md","lastUpdated":1717647948000}'),r={name:"garden/cinny/index.md"},i=t('

Cinny

Referenced by: Incremental Social

Cinny is an Open Source web client for the Matrix messaging protocol

',3),c=[i];function o(s,d,l,_,p,f){return a(),n("div",null,c)}const u=e(r,[["render",o]]);export{m as __pageData,u as default}; diff --git a/assets/garden_cinny_index.md.rVS5Vh1G.lean.js b/assets/garden_cinny_index.md.DjdgGx9N.lean.js similarity index 87% rename from assets/garden_cinny_index.md.rVS5Vh1G.lean.js rename to assets/garden_cinny_index.md.DjdgGx9N.lean.js index a80cd2ca..ac94ed4d 100644 --- a/assets/garden_cinny_index.md.rVS5Vh1G.lean.js +++ b/assets/garden_cinny_index.md.DjdgGx9N.lean.js @@ -1 +1 @@ -import{_ as e,c as n,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Cinny","description":"","frontmatter":{"public":"true","slug":"cinny","title":"Cinny","prev":false,"next":false},"headers":[],"relativePath":"garden/cinny/index.md","filePath":"garden/cinny/index.md","lastUpdated":1718069968000}'),r={name:"garden/cinny/index.md"},i=t("",3),c=[i];function o(s,d,l,_,p,f){return a(),n("div",null,c)}const u=e(r,[["render",o]]);export{m as __pageData,u as default}; +import{_ as e,c as n,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Cinny","description":"","frontmatter":{"public":"true","slug":"cinny","title":"Cinny","prev":false,"next":false},"headers":[],"relativePath":"garden/cinny/index.md","filePath":"garden/cinny/index.md","lastUpdated":1717647948000}'),r={name:"garden/cinny/index.md"},i=t("",3),c=[i];function o(s,d,l,_,p,f){return a(),n("div",null,c)}const u=e(r,[["render",o]]);export{m as __pageData,u as default}; diff --git a/assets/garden_commune_index.md.Dz4Z13kZ.js b/assets/garden_commune_index.md.Cz6o7qRH.js similarity index 97% rename from assets/garden_commune_index.md.Dz4Z13kZ.js rename to assets/garden_commune_index.md.Cz6o7qRH.js index 95f00272..9cee35a0 100644 --- a/assets/garden_commune_index.md.Dz4Z13kZ.js +++ b/assets/garden_commune_index.md.Cz6o7qRH.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Commune","description":"","frontmatter":{"public":"true","slug":"commune","title":"Commune","prev":false,"next":false},"headers":[],"relativePath":"garden/commune/index.md","filePath":"garden/commune/index.md","lastUpdated":1718069968000}'),i={name:"garden/commune/index.md"},n=t('

Commune

Referenced by: Federated Identity, Fedi v2, My Personal Website, Webrings, Weird

An Open Source Matrix web client built to be better for communities than anything else out there

  • Currently in development
  • Exposes certain channels such that they are web indexable
  • Will include features like Chat Glue and communal Digital Gardens

Created by Erlend Sogge Heggen, a ex-employee from Discourse

  • Maintains the Commune Blog with great write ups on the issues of the modern web, social media, etc. and how they can be improved (by Commune or related projects)
  • Also maintains a Personal Blog about similar topics

The Commune community is very interested in various topics and how they can relate together:

Related projects:

  • @laxla@tech.lgbt is creating Gimli, a federated discord alternative
    • Built on ActivityPub
    • "Guild-based" in ways matrix is not?
    • Will integrate with F3 as well
    • Wants to handle blogging as well
    • Certainly seems similar to Commune's message gardening concept
',10),l=[n];function o(d,s,h,m,c,u){return r(),a("div",null,l)}const p=e(i,[["render",o]]);export{f as __pageData,p as default}; +import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Commune","description":"","frontmatter":{"public":"true","slug":"commune","title":"Commune","prev":false,"next":false},"headers":[],"relativePath":"garden/commune/index.md","filePath":"garden/commune/index.md","lastUpdated":1717647948000}'),i={name:"garden/commune/index.md"},n=t('

Commune

Referenced by: Federated Identity, Fedi v2, My Personal Website, Webrings, Weird

An Open Source Matrix web client built to be better for communities than anything else out there

  • Currently in development
  • Exposes certain channels such that they are web indexable
  • Will include features like Chat Glue and communal Digital Gardens

Created by Erlend Sogge Heggen, a ex-employee from Discourse

  • Maintains the Commune Blog with great write ups on the issues of the modern web, social media, etc. and how they can be improved (by Commune or related projects)
  • Also maintains a Personal Blog about similar topics

The Commune community is very interested in various topics and how they can relate together:

Related projects:

  • @laxla@tech.lgbt is creating Gimli, a federated discord alternative
    • Built on ActivityPub
    • "Guild-based" in ways matrix is not?
    • Will integrate with F3 as well
    • Wants to handle blogging as well
    • Certainly seems similar to Commune's message gardening concept
',10),l=[n];function o(d,s,h,m,c,u){return r(),a("div",null,l)}const p=e(i,[["render",o]]);export{f as __pageData,p as default}; diff --git a/assets/garden_commune_index.md.Dz4Z13kZ.lean.js b/assets/garden_commune_index.md.Cz6o7qRH.lean.js similarity index 87% rename from assets/garden_commune_index.md.Dz4Z13kZ.lean.js rename to assets/garden_commune_index.md.Cz6o7qRH.lean.js index 3d0c0ea8..5eaba721 100644 --- a/assets/garden_commune_index.md.Dz4Z13kZ.lean.js +++ b/assets/garden_commune_index.md.Cz6o7qRH.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Commune","description":"","frontmatter":{"public":"true","slug":"commune","title":"Commune","prev":false,"next":false},"headers":[],"relativePath":"garden/commune/index.md","filePath":"garden/commune/index.md","lastUpdated":1718069968000}'),i={name:"garden/commune/index.md"},n=t("",10),l=[n];function o(d,s,h,m,c,u){return r(),a("div",null,l)}const p=e(i,[["render",o]]);export{f as __pageData,p as default}; +import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Commune","description":"","frontmatter":{"public":"true","slug":"commune","title":"Commune","prev":false,"next":false},"headers":[],"relativePath":"garden/commune/index.md","filePath":"garden/commune/index.md","lastUpdated":1717647948000}'),i={name:"garden/commune/index.md"},n=t("",10),l=[n];function o(d,s,h,m,c,u){return r(),a("div",null,l)}const p=e(i,[["render",o]]);export{f as __pageData,p as default}; diff --git a/assets/garden_davey-wreden_index.md.D5jOgDow.js b/assets/garden_davey-wreden_index.md.BMlE9hYd.js similarity index 96% rename from assets/garden_davey-wreden_index.md.D5jOgDow.js rename to assets/garden_davey-wreden_index.md.BMlE9hYd.js index 75b21f1e..c80d368b 100644 --- a/assets/garden_davey-wreden_index.md.D5jOgDow.js +++ b/assets/garden_davey-wreden_index.md.BMlE9hYd.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as n}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Davey Wreden","description":"","frontmatter":{"public":"true","slug":"davey-wreden","title":"Davey Wreden","prev":false,"next":false},"headers":[],"relativePath":"garden/davey-wreden/index.md","filePath":"garden/davey-wreden/index.md","lastUpdated":1718069968000}'),t={name:"garden/davey-wreden/index.md"},d=n('

Davey Wreden

Referenced by: Ivy Road, The Beginner's Guide

Tagged by: Ivy Road, The Beginner's Guide, Wanderstop

Projects:

Talks and Interviews:

',7),o=[d];function i(l,s,h,c,g,_){return r(),a("div",null,o)}const y=e(t,[["render",i]]);export{u as __pageData,y as default}; +import{_ as e,c as a,o as r,a9 as n}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Davey Wreden","description":"","frontmatter":{"public":"true","slug":"davey-wreden","title":"Davey Wreden","prev":false,"next":false},"headers":[],"relativePath":"garden/davey-wreden/index.md","filePath":"garden/davey-wreden/index.md","lastUpdated":1717971545000}'),t={name:"garden/davey-wreden/index.md"},d=n('

Davey Wreden

Referenced by: Ivy Road, The Beginner's Guide

Tagged by: Ivy Road, The Beginner's Guide, Wanderstop

Projects:

Talks and Interviews:

',7),o=[d];function i(l,s,h,c,g,_){return r(),a("div",null,o)}const y=e(t,[["render",i]]);export{u as __pageData,y as default}; diff --git a/assets/garden_davey-wreden_index.md.D5jOgDow.lean.js b/assets/garden_davey-wreden_index.md.BMlE9hYd.lean.js similarity index 88% rename from assets/garden_davey-wreden_index.md.D5jOgDow.lean.js rename to assets/garden_davey-wreden_index.md.BMlE9hYd.lean.js index 710be5ee..25e7808a 100644 --- a/assets/garden_davey-wreden_index.md.D5jOgDow.lean.js +++ b/assets/garden_davey-wreden_index.md.BMlE9hYd.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as n}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Davey Wreden","description":"","frontmatter":{"public":"true","slug":"davey-wreden","title":"Davey Wreden","prev":false,"next":false},"headers":[],"relativePath":"garden/davey-wreden/index.md","filePath":"garden/davey-wreden/index.md","lastUpdated":1718069968000}'),t={name:"garden/davey-wreden/index.md"},d=n("",7),o=[d];function i(l,s,h,c,g,_){return r(),a("div",null,o)}const y=e(t,[["render",i]]);export{u as __pageData,y as default}; +import{_ as e,c as a,o as r,a9 as n}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Davey Wreden","description":"","frontmatter":{"public":"true","slug":"davey-wreden","title":"Davey Wreden","prev":false,"next":false},"headers":[],"relativePath":"garden/davey-wreden/index.md","filePath":"garden/davey-wreden/index.md","lastUpdated":1717971545000}'),t={name:"garden/davey-wreden/index.md"},d=n("",7),o=[d];function i(l,s,h,c,g,_){return r(),a("div",null,o)}const y=e(t,[["render",i]]);export{u as __pageData,y as default}; diff --git a/assets/garden_decentralized_index.md.BsoUG57G.js b/assets/garden_decentralized_index.md.DuxiPg9M.js similarity index 93% rename from assets/garden_decentralized_index.md.BsoUG57G.js rename to assets/garden_decentralized_index.md.DuxiPg9M.js index f28c3539..ba151112 100644 --- a/assets/garden_decentralized_index.md.BsoUG57G.js +++ b/assets/garden_decentralized_index.md.DuxiPg9M.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Decentralized","description":"","frontmatter":{"alias":"Federated","public":"true","slug":"decentralized","title":"Decentralized","prev":false,"next":false},"headers":[],"relativePath":"garden/decentralized/index.md","filePath":"garden/decentralized/index.md","lastUpdated":1718069968000}'),i={name:"garden/decentralized/index.md"},n=r('

Decentralized

Referenced by: Commune, Fedi v2, Matrix, Social Media

Tagged by: ATProto, ActivityPub, Federated Identity, Fediverse, Nostr

Something with no central source of authority

Common examples:

In practice, the "pick a server" problem causes email and the fediverse to trend towards a handful of large servers that still suffer from some of the issues of centralization

Advantages over centralization:

  • Data ownership
  • Increased privacy
  • No rules to follow
  • Can fully customize your experience
  • No single entity can make the experience worse for everyone
  • Anyone and everyone can try their hand at improving the ecosystem
',9),o=[n];function d(l,s,c,f,p,h){return t(),a("div",null,o)}const _=e(i,[["render",d]]);export{m as __pageData,_ as default}; +import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Decentralized","description":"","frontmatter":{"alias":"Federated","public":"true","slug":"decentralized","title":"Decentralized","prev":false,"next":false},"headers":[],"relativePath":"garden/decentralized/index.md","filePath":"garden/decentralized/index.md","lastUpdated":1717647948000}'),i={name:"garden/decentralized/index.md"},n=r('

Decentralized

Referenced by: Commune, Fedi v2, Matrix, Social Media

Tagged by: ATProto, ActivityPub, Federated Identity, Fediverse, Nostr

Something with no central source of authority

Common examples:

In practice, the "pick a server" problem causes email and the fediverse to trend towards a handful of large servers that still suffer from some of the issues of centralization

Advantages over centralization:

  • Data ownership
  • Increased privacy
  • No rules to follow
  • Can fully customize your experience
  • No single entity can make the experience worse for everyone
  • Anyone and everyone can try their hand at improving the ecosystem
',9),o=[n];function d(l,s,c,f,p,h){return t(),a("div",null,o)}const _=e(i,[["render",d]]);export{m as __pageData,_ as default}; diff --git a/assets/garden_decentralized_index.md.BsoUG57G.lean.js b/assets/garden_decentralized_index.md.DuxiPg9M.lean.js similarity index 77% rename from assets/garden_decentralized_index.md.BsoUG57G.lean.js rename to assets/garden_decentralized_index.md.DuxiPg9M.lean.js index 00ba9ae2..13c39eca 100644 --- a/assets/garden_decentralized_index.md.BsoUG57G.lean.js +++ b/assets/garden_decentralized_index.md.DuxiPg9M.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Decentralized","description":"","frontmatter":{"alias":"Federated","public":"true","slug":"decentralized","title":"Decentralized","prev":false,"next":false},"headers":[],"relativePath":"garden/decentralized/index.md","filePath":"garden/decentralized/index.md","lastUpdated":1718069968000}'),i={name:"garden/decentralized/index.md"},n=r("",9),o=[n];function d(l,s,c,f,p,h){return t(),a("div",null,o)}const _=e(i,[["render",d]]);export{m as __pageData,_ as default}; +import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Decentralized","description":"","frontmatter":{"alias":"Federated","public":"true","slug":"decentralized","title":"Decentralized","prev":false,"next":false},"headers":[],"relativePath":"garden/decentralized/index.md","filePath":"garden/decentralized/index.md","lastUpdated":1717647948000}'),i={name:"garden/decentralized/index.md"},n=r("",9),o=[n];function d(l,s,c,f,p,h){return t(),a("div",null,o)}const _=e(i,[["render",d]]);export{m as __pageData,_ as default}; diff --git a/assets/garden_dice-armor_index.md.DRqBzafS.js b/assets/garden_dice-armor_index.md.CztXuY1B.js similarity index 99% rename from assets/garden_dice-armor_index.md.DRqBzafS.js rename to assets/garden_dice-armor_index.md.CztXuY1B.js index 36608b64..a494af1e 100644 --- a/assets/garden_dice-armor_index.md.DRqBzafS.js +++ b/assets/garden_dice-armor_index.md.CztXuY1B.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as i,ab as o,ac as s,ad as r,ae as n,af as h,ag as l,ah as d,ai as c,aj as p}from"./chunks/framework.D8PMdl4T.js";const q=JSON.parse('{"title":"Dice Armor","description":"","frontmatter":{"public":"true","slug":"dice-armor","tags":["My Projects"],"title":"Dice Armor","prev":false,"next":false},"headers":[],"relativePath":"garden/dice-armor/index.md","filePath":"garden/dice-armor/index.md","lastUpdated":1718069968000}'),m={name:"garden/dice-armor/index.md"},u=i('

Dice Armor

Referenced by: Babble Buds

Tags: My Projects

Download it here

Dice Armor is a game that started development as a semester-long project by a team of nine: a producer, a creative director, a narrative writer, an artist, two programmers, and 3 game designers. The information here is about my contributions as the lead programmer over the semester because I can show off stuff like the editor scripts I wrote. I was doing everything from interface coding, editor scripts, integrating Babble Buds, and of course, everything related to the gameplay itself. To date I'm still the lead programmer for the game; for more up-to-date information on the current state of the game please visit the official site.

The build available here was created for showing off at the end of the semester, and as such has some buttons present to make the game easier to skip parts of the game to see all the content: You start with all the dice in the game already in the shop, there's a button to give yourself free money to buy these dice with, and in the duel, there are buttons to force a win or a loss, which can be used to skip the tutorial (not recommended for first-time players).

Tutorial

Dice Armor is a dice dueling game. Players can use abilities, flip dice, and attack each other to win in a dice game that puts chance into the hands of the players. This is what the dueling scene looks like, with a tutorial cutscene happening on top to guide the player through the basics. Also, all the dice are constructed dynamically, using quaternion math to figure out the placement of each component relative to the face it is going on. The die in the middle has one of the player' and opponents' portraits on each of its sides.

Editors

For many of the objects I've created, I've made scriptable objects so that game designers can add and modify them easily. Additionally, I would create custom inspectors for the objects to help make them as easy to understand and edit as possible. The opponent's artificial intelligence is made up of many strategies, in a prioritized list. When it is the opponents' turn they go through each strategy and check if they can be run, and if so then the opponent performs the strategy and starts back over at the top of the list of strategies. The + sign under the list of strategies opens an organized dropdown of all the various strategies.

Simulator

In addition to custom inspector code, I've created new tools for the editor for our game designers to use. This is a duel simulator that will take two opponents and simulate an arbitrary number of duels between them, and output the results and summarize them for you, much much quicker than manually going through the duels, even with an absurdly high timeScale. This will become incredibly useful in making balance changes and testing new dice against existing sets. This is a screenshot of it in edit mode, but in play mode it removes the "Dueling Managers" field and will use whatever the current duel balance settings are, allowing for the GDs to test freely in play mode without worrying about undoing all their changes afterward.

da1.png

I created the Babble Buds puppet editor and ported the rendering library I wrote for it to C# so it could be used in Unity. Dice Armor has a full campaign using cutscenes made using the Babble Buds cutscene editor, taking advantage of its support for custom commands and fields to control things like talking, giving the player dice and money, starting duels, and controlling player progression through the story.

Action Wheel

When a cutscene ends, its final command is to either start a duel or set the next cutscene in the story. In the latter case, there is an additional field for what to call the next cutscene, and what location it takes place. The cutscene is then added to the player's save file, and when they visit the city locations are greyed out until they have at least one action to do there. Each location has a dynamically populated action wheel with a custom range of acceptable angles.

Shop

The dice shop is dynamically populated by a list of dice available to the player, which can be changed during cutscenes, and is checked against the dice owned by the player to generate sold-out indicators. On the left, the player can choose to filter the options down to a single dice effect, which also updates the "Buy All" button to buy only all the dice in the current filter.

Inventory

The inventory works most the same as the shop, but for equipping dice. It also allows you to drag individual dice or entire sets to the equipped dice glyph. While dragging it will highlight all the slots the new dice will be equipped into.

Dice Rolling

The dice rolling uses the physics engine and detects once the dice have stopped moving, then determines which side is face up based on which of the normals is closest to straight up. It flags the die as cocked if that smallest angle is above a threshold. The dice sink into the table when not rolling to not interfere with any dice that are rolling.

Missile Storm

During certain events like winning the game or having the face of a die broken, the players' portraits will flash an emotion for a second. After winning, a random living die from the winning player is chosen to play their "finisher move", a flashy and dramatic effect to end the game. Shown is the arcane mechana's finisher, "Missile Storm".

After development stopped, the project became Open Source - check it out here

',25),g=[u];function f(y,b,w,_,v,k){return a(),t("div",null,g)}const I=e(m,[["render",f]]);export{q as __pageData,I as default}; +import{_ as e,c as t,o as a,a9 as i,ab as o,ac as s,ad as r,ae as n,af as h,ag as l,ah as d,ai as c,aj as p}from"./chunks/framework.D8PMdl4T.js";const q=JSON.parse('{"title":"Dice Armor","description":"","frontmatter":{"public":"true","slug":"dice-armor","tags":["My Projects"],"title":"Dice Armor","prev":false,"next":false},"headers":[],"relativePath":"garden/dice-armor/index.md","filePath":"garden/dice-armor/index.md","lastUpdated":1717647948000}'),m={name:"garden/dice-armor/index.md"},u=i('

Dice Armor

Referenced by: Babble Buds

Tags: My Projects

Download it here

Dice Armor is a game that started development as a semester-long project by a team of nine: a producer, a creative director, a narrative writer, an artist, two programmers, and 3 game designers. The information here is about my contributions as the lead programmer over the semester because I can show off stuff like the editor scripts I wrote. I was doing everything from interface coding, editor scripts, integrating Babble Buds, and of course, everything related to the gameplay itself. To date I'm still the lead programmer for the game; for more up-to-date information on the current state of the game please visit the official site.

The build available here was created for showing off at the end of the semester, and as such has some buttons present to make the game easier to skip parts of the game to see all the content: You start with all the dice in the game already in the shop, there's a button to give yourself free money to buy these dice with, and in the duel, there are buttons to force a win or a loss, which can be used to skip the tutorial (not recommended for first-time players).

Tutorial

Dice Armor is a dice dueling game. Players can use abilities, flip dice, and attack each other to win in a dice game that puts chance into the hands of the players. This is what the dueling scene looks like, with a tutorial cutscene happening on top to guide the player through the basics. Also, all the dice are constructed dynamically, using quaternion math to figure out the placement of each component relative to the face it is going on. The die in the middle has one of the player' and opponents' portraits on each of its sides.

Editors

For many of the objects I've created, I've made scriptable objects so that game designers can add and modify them easily. Additionally, I would create custom inspectors for the objects to help make them as easy to understand and edit as possible. The opponent's artificial intelligence is made up of many strategies, in a prioritized list. When it is the opponents' turn they go through each strategy and check if they can be run, and if so then the opponent performs the strategy and starts back over at the top of the list of strategies. The + sign under the list of strategies opens an organized dropdown of all the various strategies.

Simulator

In addition to custom inspector code, I've created new tools for the editor for our game designers to use. This is a duel simulator that will take two opponents and simulate an arbitrary number of duels between them, and output the results and summarize them for you, much much quicker than manually going through the duels, even with an absurdly high timeScale. This will become incredibly useful in making balance changes and testing new dice against existing sets. This is a screenshot of it in edit mode, but in play mode it removes the "Dueling Managers" field and will use whatever the current duel balance settings are, allowing for the GDs to test freely in play mode without worrying about undoing all their changes afterward.

da1.png

I created the Babble Buds puppet editor and ported the rendering library I wrote for it to C# so it could be used in Unity. Dice Armor has a full campaign using cutscenes made using the Babble Buds cutscene editor, taking advantage of its support for custom commands and fields to control things like talking, giving the player dice and money, starting duels, and controlling player progression through the story.

Action Wheel

When a cutscene ends, its final command is to either start a duel or set the next cutscene in the story. In the latter case, there is an additional field for what to call the next cutscene, and what location it takes place. The cutscene is then added to the player's save file, and when they visit the city locations are greyed out until they have at least one action to do there. Each location has a dynamically populated action wheel with a custom range of acceptable angles.

Shop

The dice shop is dynamically populated by a list of dice available to the player, which can be changed during cutscenes, and is checked against the dice owned by the player to generate sold-out indicators. On the left, the player can choose to filter the options down to a single dice effect, which also updates the "Buy All" button to buy only all the dice in the current filter.

Inventory

The inventory works most the same as the shop, but for equipping dice. It also allows you to drag individual dice or entire sets to the equipped dice glyph. While dragging it will highlight all the slots the new dice will be equipped into.

Dice Rolling

The dice rolling uses the physics engine and detects once the dice have stopped moving, then determines which side is face up based on which of the normals is closest to straight up. It flags the die as cocked if that smallest angle is above a threshold. The dice sink into the table when not rolling to not interfere with any dice that are rolling.

Missile Storm

During certain events like winning the game or having the face of a die broken, the players' portraits will flash an emotion for a second. After winning, a random living die from the winning player is chosen to play their "finisher move", a flashy and dramatic effect to end the game. Shown is the arcane mechana's finisher, "Missile Storm".

After development stopped, the project became Open Source - check it out here

',25),g=[u];function f(y,b,w,_,v,k){return a(),t("div",null,g)}const I=e(m,[["render",f]]);export{q as __pageData,I as default}; diff --git a/assets/garden_dice-armor_index.md.DRqBzafS.lean.js b/assets/garden_dice-armor_index.md.CztXuY1B.lean.js similarity index 89% rename from assets/garden_dice-armor_index.md.DRqBzafS.lean.js rename to assets/garden_dice-armor_index.md.CztXuY1B.lean.js index 39007c01..a78a1099 100644 --- a/assets/garden_dice-armor_index.md.DRqBzafS.lean.js +++ b/assets/garden_dice-armor_index.md.CztXuY1B.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as i,ab as o,ac as s,ad as r,ae as n,af as h,ag as l,ah as d,ai as c,aj as p}from"./chunks/framework.D8PMdl4T.js";const q=JSON.parse('{"title":"Dice Armor","description":"","frontmatter":{"public":"true","slug":"dice-armor","tags":["My Projects"],"title":"Dice Armor","prev":false,"next":false},"headers":[],"relativePath":"garden/dice-armor/index.md","filePath":"garden/dice-armor/index.md","lastUpdated":1718069968000}'),m={name:"garden/dice-armor/index.md"},u=i("",25),g=[u];function f(y,b,w,_,v,k){return a(),t("div",null,g)}const I=e(m,[["render",f]]);export{q as __pageData,I as default}; +import{_ as e,c as t,o as a,a9 as i,ab as o,ac as s,ad as r,ae as n,af as h,ag as l,ah as d,ai as c,aj as p}from"./chunks/framework.D8PMdl4T.js";const q=JSON.parse('{"title":"Dice Armor","description":"","frontmatter":{"public":"true","slug":"dice-armor","tags":["My Projects"],"title":"Dice Armor","prev":false,"next":false},"headers":[],"relativePath":"garden/dice-armor/index.md","filePath":"garden/dice-armor/index.md","lastUpdated":1717647948000}'),m={name:"garden/dice-armor/index.md"},u=i("",25),g=[u];function f(y,b,w,_,v,k){return a(),t("div",null,g)}const I=e(m,[["render",f]]);export{q as __pageData,I as default}; diff --git a/assets/garden_digital-gardens_index.md.B2uLVFGz.js b/assets/garden_digital-gardens_index.md.ChW8RG51.js similarity index 96% rename from assets/garden_digital-gardens_index.md.B2uLVFGz.js rename to assets/garden_digital-gardens_index.md.ChW8RG51.js index c53ce7e6..2979c38f 100644 --- a/assets/garden_digital-gardens_index.md.B2uLVFGz.js +++ b/assets/garden_digital-gardens_index.md.ChW8RG51.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Digital Gardens","description":"","frontmatter":{"alias":"Digital Garden, Second Brain, Personal Knowledge Management, The Zettelkasten Method","public":"true","slug":"digital-gardens","title":"Digital Gardens","prev":false,"next":false},"headers":[],"relativePath":"garden/digital-gardens/index.md","filePath":"garden/digital-gardens/index.md","lastUpdated":1718069968000}'),n={name:"garden/digital-gardens/index.md"},i=t('

Digital Gardens

Referenced by: Chronological, Commune, Garden-RSS, The Cozy Web, The Small Web

Digital Gardens are Freeform collections of information made by an individual or community

This Knowledge Hub

Collections of digital gardens and resources for creating them:

',7),o=[i];function l(d,s,g,h,c,f){return r(),a("div",null,o)}const u=e(n,[["render",l]]);export{m as __pageData,u as default}; +import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Digital Gardens","description":"","frontmatter":{"alias":"Digital Garden, Second Brain, Personal Knowledge Management, The Zettelkasten Method","public":"true","slug":"digital-gardens","title":"Digital Gardens","prev":false,"next":false},"headers":[],"relativePath":"garden/digital-gardens/index.md","filePath":"garden/digital-gardens/index.md","lastUpdated":1717655952000}'),n={name:"garden/digital-gardens/index.md"},i=t('

Digital Gardens

Referenced by: Chronological, Commune, Garden-RSS, The Cozy Web, The Small Web

Digital Gardens are Freeform collections of information made by an individual or community

This Knowledge Hub

Collections of digital gardens and resources for creating them:

',7),o=[i];function l(d,s,g,h,c,f){return r(),a("div",null,o)}const u=e(n,[["render",l]]);export{m as __pageData,u as default}; diff --git a/assets/garden_digital-gardens_index.md.B2uLVFGz.lean.js b/assets/garden_digital-gardens_index.md.ChW8RG51.lean.js similarity index 90% rename from assets/garden_digital-gardens_index.md.B2uLVFGz.lean.js rename to assets/garden_digital-gardens_index.md.ChW8RG51.lean.js index 664336c7..f44ca89d 100644 --- a/assets/garden_digital-gardens_index.md.B2uLVFGz.lean.js +++ b/assets/garden_digital-gardens_index.md.ChW8RG51.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Digital Gardens","description":"","frontmatter":{"alias":"Digital Garden, Second Brain, Personal Knowledge Management, The Zettelkasten Method","public":"true","slug":"digital-gardens","title":"Digital Gardens","prev":false,"next":false},"headers":[],"relativePath":"garden/digital-gardens/index.md","filePath":"garden/digital-gardens/index.md","lastUpdated":1718069968000}'),n={name:"garden/digital-gardens/index.md"},i=t("",7),o=[i];function l(d,s,g,h,c,f){return r(),a("div",null,o)}const u=e(n,[["render",l]]);export{m as __pageData,u as default}; +import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Digital Gardens","description":"","frontmatter":{"alias":"Digital Garden, Second Brain, Personal Knowledge Management, The Zettelkasten Method","public":"true","slug":"digital-gardens","title":"Digital Gardens","prev":false,"next":false},"headers":[],"relativePath":"garden/digital-gardens/index.md","filePath":"garden/digital-gardens/index.md","lastUpdated":1717655952000}'),n={name:"garden/digital-gardens/index.md"},i=t("",7),o=[i];function l(d,s,g,h,c,f){return r(),a("div",null,o)}const u=e(n,[["render",l]]);export{m as __pageData,u as default}; diff --git a/assets/garden_federated-identity_index.md.DQgk_kzS.js b/assets/garden_federated-identity_index.md.Bf4QWuIq.js similarity index 96% rename from assets/garden_federated-identity_index.md.DQgk_kzS.js rename to assets/garden_federated-identity_index.md.Bf4QWuIq.js index 008a7ef7..52ab572f 100644 --- a/assets/garden_federated-identity_index.md.DQgk_kzS.js +++ b/assets/garden_federated-identity_index.md.Bf4QWuIq.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const _=JSON.parse('{"title":"Federated Identity","description":"","frontmatter":{"public":"true","slug":"federated-identity","tags":["Decentralized"],"title":"Federated Identity","prev":false,"next":false},"headers":[],"relativePath":"garden/federated-identity/index.md","filePath":"garden/federated-identity/index.md","lastUpdated":1718069968000}'),d={name:"garden/federated-identity/index.md"},i=r('

Federated Identity

Referenced by: Commune, Fedi v2, Weird

Tags: Decentralized

Allow for validating one's identity without relying on a specific centralized server

Implementations:

Self hosted identity providers are NOT enough to be considered federated identity

  • OIDC and OAuth require the service owner to have pre-configured with explicitly allowed identity providers

Incremental Social uses Zitadel which does NOT support IndieAuth and probably won't

',9),n=[i];function o(l,s,c,h,p,u){return a(),t("div",null,n)}const m=e(d,[["render",o]]);export{_ as __pageData,m as default}; +import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const _=JSON.parse('{"title":"Federated Identity","description":"","frontmatter":{"public":"true","slug":"federated-identity","tags":["Decentralized"],"title":"Federated Identity","prev":false,"next":false},"headers":[],"relativePath":"garden/federated-identity/index.md","filePath":"garden/federated-identity/index.md","lastUpdated":1717647948000}'),d={name:"garden/federated-identity/index.md"},i=r('

Federated Identity

Referenced by: Commune, Fedi v2, Weird

Tags: Decentralized

Allow for validating one's identity without relying on a specific centralized server

Implementations:

Self hosted identity providers are NOT enough to be considered federated identity

  • OIDC and OAuth require the service owner to have pre-configured with explicitly allowed identity providers

Incremental Social uses Zitadel which does NOT support IndieAuth and probably won't

',9),n=[i];function o(l,s,c,h,p,u){return a(),t("div",null,n)}const m=e(d,[["render",o]]);export{_ as __pageData,m as default}; diff --git a/assets/garden_federated-identity_index.md.DQgk_kzS.lean.js b/assets/garden_federated-identity_index.md.Bf4QWuIq.lean.js similarity index 89% rename from assets/garden_federated-identity_index.md.DQgk_kzS.lean.js rename to assets/garden_federated-identity_index.md.Bf4QWuIq.lean.js index f28b1f6b..a5162e66 100644 --- a/assets/garden_federated-identity_index.md.DQgk_kzS.lean.js +++ b/assets/garden_federated-identity_index.md.Bf4QWuIq.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const _=JSON.parse('{"title":"Federated Identity","description":"","frontmatter":{"public":"true","slug":"federated-identity","tags":["Decentralized"],"title":"Federated Identity","prev":false,"next":false},"headers":[],"relativePath":"garden/federated-identity/index.md","filePath":"garden/federated-identity/index.md","lastUpdated":1718069968000}'),d={name:"garden/federated-identity/index.md"},i=r("",9),n=[i];function o(l,s,c,h,p,u){return a(),t("div",null,n)}const m=e(d,[["render",o]]);export{_ as __pageData,m as default}; +import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const _=JSON.parse('{"title":"Federated Identity","description":"","frontmatter":{"public":"true","slug":"federated-identity","tags":["Decentralized"],"title":"Federated Identity","prev":false,"next":false},"headers":[],"relativePath":"garden/federated-identity/index.md","filePath":"garden/federated-identity/index.md","lastUpdated":1717647948000}'),d={name:"garden/federated-identity/index.md"},i=r("",9),n=[i];function o(l,s,c,h,p,u){return a(),t("div",null,n)}const m=e(d,[["render",o]]);export{_ as __pageData,m as default}; diff --git a/assets/garden_fedi-v2_index.md.bYm2NX_V.js b/assets/garden_fedi-v2_index.md.B5ZguLke.js similarity index 99% rename from assets/garden_fedi-v2_index.md.bYm2NX_V.js rename to assets/garden_fedi-v2_index.md.B5ZguLke.js index b8017f66..0e632d45 100644 --- a/assets/garden_fedi-v2_index.md.bYm2NX_V.js +++ b/assets/garden_fedi-v2_index.md.B5ZguLke.js @@ -1 +1 @@ -import{_ as e,c as i,o as t,a9 as a}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Fedi v2","description":"","frontmatter":{"public":"true","slug":"fedi-v2","title":"Fedi v2","prev":false,"next":false},"headers":[],"relativePath":"garden/fedi-v2/index.md","filePath":"garden/fedi-v2/index.md","lastUpdated":1718069968000}'),l={name:"garden/fedi-v2/index.md"},s=a('

Fedi v2

Referenced by: Social Media

My take on a theoretical successor to federated Social Media

Inspiration

Weird may eventually move in the direction of implementing something like this

Identity

  • Federated Identity
  • Private and public keys anyone can create and store how they want
    • Fully free to create and store with no server dependencies
  • Profile information
    • Sent as a signed message through all the relays
    • How would you trust a username?
      • Petnames could be used to display human readable names via contacts or decentralized "naming hubs"
      • In most conversations online, you can trust their display name and add them as a contact as that display name
        • You only need to verify they are the same person you interacted with previously
        • You only need to trust people you want to send money to or otherwise "important identities"
        • For important identities, you can trust your contacts forming a chain of trust, or a authoritative naming hub
          • E.g. a white house ran naming hub that verifies the identities of the president and people of Congress
          • People typically wouldn't reach out to a naming hub, as it's not typically necessary
        • Contacts supercede naming hubs, so if a naming hub is breached, anyone I've previously added as a contact is still the source of truth
          • This only fails if the private key itself was breached
        • I'm just thepaperpilot, my display name. For most online communication, this is sufficient
          • My website can have a nameserver saying this publickey is the same as the site owner
          • If I write a paper at a scientific journal, they can say the author of x paper is my publickey
  • How to handle losing your private key
    • If you do have a naming hub you can verify with, they can say the identity has a new publickey
    • Contacts can "vouch" for a identity having a new publickey
    • Clients can decide to trust the new publickey based on contacts and naming hubs saying to
    • Also applies to stolen or compromised keys
  • I believe Iroh works this way

Servers

  • Act as relays, merely storing messages and sending them to any clients or servers that have subscribed
  • May decide to publicly display messages its received
    • These servers are how discovery would work
    • Different servers may offer unique displays, filters, etc.
  • Users can send their content to any server - no authentication or account required, as the identity suffices
    • Even replies can work this way - no need to know from where a given message originated
  • Private servers could require some password when sending messages or subscribing to things
    • Useful for a school or other entity that wants an internal social network
  • Different ways to subscribe to a server's messages
    • All messages the relay hears about (new relays essentially subscribe like this to some existing relay)
    • All messages from a specific poster ID
    • Any replies to a message created with a specific poster ID
    • Shallow subscriptions, to lighten the load when subscribing to communities

Content

  • Protocol should dictate how to convey text, image, audio, video, and binary content
  • Protocol should include reacting to content with arbitrary text, including a URL
    • Upvotes and downvotes are implemented with this system
  • Each message contains fields for the poster's ID (public key) and a signature that verifies the content was made by that poster
    • That signature serves as an ID for the message itself
      • Anything can be replied to using the ID as the "parent" property in a new post
  • Edits are handled as replies with some flag to indicate it's updating the parent messages' content
    • Naturally, this reply would only be respected if it matches the same creator ID
    • Servers should replace the original message entirely with this one and indicate its an edited message
      • Some servers will inevitably keep a full history though
  • Groups/communities are just specially flagged messages
    • Posting to a community is just replying to that message
    • Subscribing to a community is just subscribing to that message
    • The original message creator effectively owns the group

Moderation

  • In general, edits and delete requests are made by replying with a specially flagged message
  • Edit and deletion messages are ignored unless they have the correct public key and signature
    • Parent messages form a hierarchy of permission - if someone replies to your message, you can send a delete request for that message
    • Relay owners cannot fully delete messages, but can choose to stop relaying replies etc. of messages as the server owner wishes
  • Posts can be publicly reported with a specially flagged reply
    • How to make anonymous reports?
  • Users can send deletion or edit messages even without a matching public key, and clients (or relays) can choose to respect those messages if that public key is whitelisted as a moderator
    • Messages (and by extension, groups) can have replies granting or removing permission to other public IDs at that hierarchy level
    • People can setup accounts with their desired heuristic for sending delete messages, such as looking at public reports or analyzing the content with AI
      • This way clients can effectively customize their preferred moderation
  • Clients can also choose to add additional rules for hiding content, such as any reports by followed users
  • Perhaps delete messages pull double duty as public reports in and of themselves?

Problems to solve

  • No anonymity
    • All upvotes, downvotes, etc. are linked to your public key
    • Perhaps a client could generate new keypairs for every action for anonymity, but then it'd be hard to determine if such an account and action was a genuine user or a bot
  • Servers could probably determine the identity of clients sending their messages to them
    • A client that only ever sends messages with a specific public key is unlikely to be a server
    • A client that doesn't subscribe to all messages is unlikely to be a server
  • Illegal material will likely be placed on the hard drive at least temporarily
    • Messages will be downloaded and, even if you follow a moderator bot that looks for illegal material, there's likely to be a delay between receiving the initial message and receiving the bots delete message
  • You have to download all spam messages
    • For redundancy, you'd likely subscribe to multiple relay servers
    • You cannot trust several relay servers to have identical rules on not relaying messages that don't pass whatever moderation heuristic
    • Therefore, the filtering out of spam has to be done by the client, after downloading it all
',17),o=[s];function r(n,d,u,h,c,m){return t(),i("div",null,o)}const g=e(l,[["render",r]]);export{p as __pageData,g as default}; +import{_ as e,c as i,o as t,a9 as a}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Fedi v2","description":"","frontmatter":{"public":"true","slug":"fedi-v2","title":"Fedi v2","prev":false,"next":false},"headers":[],"relativePath":"garden/fedi-v2/index.md","filePath":"garden/fedi-v2/index.md","lastUpdated":1717655952000}'),l={name:"garden/fedi-v2/index.md"},s=a('

Fedi v2

Referenced by: Social Media

My take on a theoretical successor to federated Social Media

Inspiration

Weird may eventually move in the direction of implementing something like this

Identity

  • Federated Identity
  • Private and public keys anyone can create and store how they want
    • Fully free to create and store with no server dependencies
  • Profile information
    • Sent as a signed message through all the relays
    • How would you trust a username?
      • Petnames could be used to display human readable names via contacts or decentralized "naming hubs"
      • In most conversations online, you can trust their display name and add them as a contact as that display name
        • You only need to verify they are the same person you interacted with previously
        • You only need to trust people you want to send money to or otherwise "important identities"
        • For important identities, you can trust your contacts forming a chain of trust, or a authoritative naming hub
          • E.g. a white house ran naming hub that verifies the identities of the president and people of Congress
          • People typically wouldn't reach out to a naming hub, as it's not typically necessary
        • Contacts supercede naming hubs, so if a naming hub is breached, anyone I've previously added as a contact is still the source of truth
          • This only fails if the private key itself was breached
        • I'm just thepaperpilot, my display name. For most online communication, this is sufficient
          • My website can have a nameserver saying this publickey is the same as the site owner
          • If I write a paper at a scientific journal, they can say the author of x paper is my publickey
  • How to handle losing your private key
    • If you do have a naming hub you can verify with, they can say the identity has a new publickey
    • Contacts can "vouch" for a identity having a new publickey
    • Clients can decide to trust the new publickey based on contacts and naming hubs saying to
    • Also applies to stolen or compromised keys
  • I believe Iroh works this way

Servers

  • Act as relays, merely storing messages and sending them to any clients or servers that have subscribed
  • May decide to publicly display messages its received
    • These servers are how discovery would work
    • Different servers may offer unique displays, filters, etc.
  • Users can send their content to any server - no authentication or account required, as the identity suffices
    • Even replies can work this way - no need to know from where a given message originated
  • Private servers could require some password when sending messages or subscribing to things
    • Useful for a school or other entity that wants an internal social network
  • Different ways to subscribe to a server's messages
    • All messages the relay hears about (new relays essentially subscribe like this to some existing relay)
    • All messages from a specific poster ID
    • Any replies to a message created with a specific poster ID
    • Shallow subscriptions, to lighten the load when subscribing to communities

Content

  • Protocol should dictate how to convey text, image, audio, video, and binary content
  • Protocol should include reacting to content with arbitrary text, including a URL
    • Upvotes and downvotes are implemented with this system
  • Each message contains fields for the poster's ID (public key) and a signature that verifies the content was made by that poster
    • That signature serves as an ID for the message itself
      • Anything can be replied to using the ID as the "parent" property in a new post
  • Edits are handled as replies with some flag to indicate it's updating the parent messages' content
    • Naturally, this reply would only be respected if it matches the same creator ID
    • Servers should replace the original message entirely with this one and indicate its an edited message
      • Some servers will inevitably keep a full history though
  • Groups/communities are just specially flagged messages
    • Posting to a community is just replying to that message
    • Subscribing to a community is just subscribing to that message
    • The original message creator effectively owns the group

Moderation

  • In general, edits and delete requests are made by replying with a specially flagged message
  • Edit and deletion messages are ignored unless they have the correct public key and signature
    • Parent messages form a hierarchy of permission - if someone replies to your message, you can send a delete request for that message
    • Relay owners cannot fully delete messages, but can choose to stop relaying replies etc. of messages as the server owner wishes
  • Posts can be publicly reported with a specially flagged reply
    • How to make anonymous reports?
  • Users can send deletion or edit messages even without a matching public key, and clients (or relays) can choose to respect those messages if that public key is whitelisted as a moderator
    • Messages (and by extension, groups) can have replies granting or removing permission to other public IDs at that hierarchy level
    • People can setup accounts with their desired heuristic for sending delete messages, such as looking at public reports or analyzing the content with AI
      • This way clients can effectively customize their preferred moderation
  • Clients can also choose to add additional rules for hiding content, such as any reports by followed users
  • Perhaps delete messages pull double duty as public reports in and of themselves?

Problems to solve

  • No anonymity
    • All upvotes, downvotes, etc. are linked to your public key
    • Perhaps a client could generate new keypairs for every action for anonymity, but then it'd be hard to determine if such an account and action was a genuine user or a bot
  • Servers could probably determine the identity of clients sending their messages to them
    • A client that only ever sends messages with a specific public key is unlikely to be a server
    • A client that doesn't subscribe to all messages is unlikely to be a server
  • Illegal material will likely be placed on the hard drive at least temporarily
    • Messages will be downloaded and, even if you follow a moderator bot that looks for illegal material, there's likely to be a delay between receiving the initial message and receiving the bots delete message
  • You have to download all spam messages
    • For redundancy, you'd likely subscribe to multiple relay servers
    • You cannot trust several relay servers to have identical rules on not relaying messages that don't pass whatever moderation heuristic
    • Therefore, the filtering out of spam has to be done by the client, after downloading it all
',17),o=[s];function r(n,d,u,h,c,m){return t(),i("div",null,o)}const g=e(l,[["render",r]]);export{p as __pageData,g as default}; diff --git a/assets/garden_fedi-v2_index.md.bYm2NX_V.lean.js b/assets/garden_fedi-v2_index.md.B5ZguLke.lean.js similarity index 87% rename from assets/garden_fedi-v2_index.md.bYm2NX_V.lean.js rename to assets/garden_fedi-v2_index.md.B5ZguLke.lean.js index 117ea217..a644fa83 100644 --- a/assets/garden_fedi-v2_index.md.bYm2NX_V.lean.js +++ b/assets/garden_fedi-v2_index.md.B5ZguLke.lean.js @@ -1 +1 @@ -import{_ as e,c as i,o as t,a9 as a}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Fedi v2","description":"","frontmatter":{"public":"true","slug":"fedi-v2","title":"Fedi v2","prev":false,"next":false},"headers":[],"relativePath":"garden/fedi-v2/index.md","filePath":"garden/fedi-v2/index.md","lastUpdated":1718069968000}'),l={name:"garden/fedi-v2/index.md"},s=a("",17),o=[s];function r(n,d,u,h,c,m){return t(),i("div",null,o)}const g=e(l,[["render",r]]);export{p as __pageData,g as default}; +import{_ as e,c as i,o as t,a9 as a}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Fedi v2","description":"","frontmatter":{"public":"true","slug":"fedi-v2","title":"Fedi v2","prev":false,"next":false},"headers":[],"relativePath":"garden/fedi-v2/index.md","filePath":"garden/fedi-v2/index.md","lastUpdated":1717655952000}'),l={name:"garden/fedi-v2/index.md"},s=a("",17),o=[s];function r(n,d,u,h,c,m){return t(),i("div",null,o)}const g=e(l,[["render",r]]);export{p as __pageData,g as default}; diff --git a/assets/garden_fediverse_index.md.mvmrObxT.js b/assets/garden_fediverse_index.md.UJiYbaK2.js similarity index 95% rename from assets/garden_fediverse_index.md.mvmrObxT.js rename to assets/garden_fediverse_index.md.UJiYbaK2.js index ac619727..c5fb2187 100644 --- a/assets/garden_fediverse_index.md.mvmrObxT.js +++ b/assets/garden_fediverse_index.md.UJiYbaK2.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Fediverse","description":"","frontmatter":{"alias":"Federated Social Media","public":"true","slug":"fediverse","tags":["Decentralized"],"title":"Fediverse","prev":false,"next":false},"headers":[],"relativePath":"garden/fediverse/index.md","filePath":"garden/fediverse/index.md","lastUpdated":1718069968000}'),i={name:"garden/fediverse/index.md"},d=r('

Fediverse

Referenced by: ATProto, Decentralized, Incremental Social, Mbin, Weird

Tags: Decentralized

A collection of Social Media websites that can all talk to each other by virtue of a shared protocol

Typically refers to sites implementing ActivityPub

Implementations:

',7),o=[d];function n(l,s,c,f,p,_){return t(),a("div",null,o)}const g=e(i,[["render",n]]);export{u as __pageData,g as default}; +import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Fediverse","description":"","frontmatter":{"alias":"Federated Social Media","public":"true","slug":"fediverse","tags":["Decentralized"],"title":"Fediverse","prev":false,"next":false},"headers":[],"relativePath":"garden/fediverse/index.md","filePath":"garden/fediverse/index.md","lastUpdated":1717647948000}'),i={name:"garden/fediverse/index.md"},d=r('

Fediverse

Referenced by: ATProto, Decentralized, Incremental Social, Mbin, Weird

Tags: Decentralized

A collection of Social Media websites that can all talk to each other by virtue of a shared protocol

Typically refers to sites implementing ActivityPub

Implementations:

',7),o=[d];function n(l,s,c,f,p,_){return t(),a("div",null,o)}const g=e(i,[["render",n]]);export{u as __pageData,g as default}; diff --git a/assets/garden_fediverse_index.md.mvmrObxT.lean.js b/assets/garden_fediverse_index.md.UJiYbaK2.lean.js similarity index 89% rename from assets/garden_fediverse_index.md.mvmrObxT.lean.js rename to assets/garden_fediverse_index.md.UJiYbaK2.lean.js index 43f6fe68..2264cbf5 100644 --- a/assets/garden_fediverse_index.md.mvmrObxT.lean.js +++ b/assets/garden_fediverse_index.md.UJiYbaK2.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Fediverse","description":"","frontmatter":{"alias":"Federated Social Media","public":"true","slug":"fediverse","tags":["Decentralized"],"title":"Fediverse","prev":false,"next":false},"headers":[],"relativePath":"garden/fediverse/index.md","filePath":"garden/fediverse/index.md","lastUpdated":1718069968000}'),i={name:"garden/fediverse/index.md"},d=r("",7),o=[d];function n(l,s,c,f,p,_){return t(),a("div",null,o)}const g=e(i,[["render",n]]);export{u as __pageData,g as default}; +import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Fediverse","description":"","frontmatter":{"alias":"Federated Social Media","public":"true","slug":"fediverse","tags":["Decentralized"],"title":"Fediverse","prev":false,"next":false},"headers":[],"relativePath":"garden/fediverse/index.md","filePath":"garden/fediverse/index.md","lastUpdated":1717647948000}'),i={name:"garden/fediverse/index.md"},d=r("",7),o=[d];function n(l,s,c,f,p,_){return t(),a("div",null,o)}const g=e(i,[["render",n]]);export{u as __pageData,g as default}; diff --git a/assets/garden_forgejo_index.md.D0iEfYzP.js b/assets/garden_forgejo_index.md.BIFTMSC0.js similarity index 93% rename from assets/garden_forgejo_index.md.D0iEfYzP.js rename to assets/garden_forgejo_index.md.BIFTMSC0.js index 93b74e06..e427db44 100644 --- a/assets/garden_forgejo_index.md.D0iEfYzP.js +++ b/assets/garden_forgejo_index.md.BIFTMSC0.js @@ -1 +1 @@ -import{_ as e,c as o,o as r,a9 as a}from"./chunks/framework.D8PMdl4T.js";const h=JSON.parse('{"title":"Forgejo","description":"","frontmatter":{"public":"true","slug":"forgejo","title":"Forgejo","prev":false,"next":false},"headers":[],"relativePath":"garden/forgejo/index.md","filePath":"garden/forgejo/index.md","lastUpdated":1718069968000}'),t={name:"garden/forgejo/index.md"},n=a('

Forgejo

Referenced by: Incremental Social

Forgejo is an Open Source code repository hosting software

',3),s=[n];function c(d,i,_,l,f,g){return r(),o("div",null,s)}const u=e(t,[["render",c]]);export{h as __pageData,u as default}; +import{_ as e,c as o,o as r,a9 as a}from"./chunks/framework.D8PMdl4T.js";const h=JSON.parse('{"title":"Forgejo","description":"","frontmatter":{"public":"true","slug":"forgejo","title":"Forgejo","prev":false,"next":false},"headers":[],"relativePath":"garden/forgejo/index.md","filePath":"garden/forgejo/index.md","lastUpdated":1717647948000}'),t={name:"garden/forgejo/index.md"},n=a('

Forgejo

Referenced by: Incremental Social

Forgejo is an Open Source code repository hosting software

',3),s=[n];function c(d,i,_,l,f,g){return r(),o("div",null,s)}const u=e(t,[["render",c]]);export{h as __pageData,u as default}; diff --git a/assets/garden_forgejo_index.md.D0iEfYzP.lean.js b/assets/garden_forgejo_index.md.BIFTMSC0.lean.js similarity index 87% rename from assets/garden_forgejo_index.md.D0iEfYzP.lean.js rename to assets/garden_forgejo_index.md.BIFTMSC0.lean.js index 2dd4664a..a6ffab22 100644 --- a/assets/garden_forgejo_index.md.D0iEfYzP.lean.js +++ b/assets/garden_forgejo_index.md.BIFTMSC0.lean.js @@ -1 +1 @@ -import{_ as e,c as o,o as r,a9 as a}from"./chunks/framework.D8PMdl4T.js";const h=JSON.parse('{"title":"Forgejo","description":"","frontmatter":{"public":"true","slug":"forgejo","title":"Forgejo","prev":false,"next":false},"headers":[],"relativePath":"garden/forgejo/index.md","filePath":"garden/forgejo/index.md","lastUpdated":1718069968000}'),t={name:"garden/forgejo/index.md"},n=a("",3),s=[n];function c(d,i,_,l,f,g){return r(),o("div",null,s)}const u=e(t,[["render",c]]);export{h as __pageData,u as default}; +import{_ as e,c as o,o as r,a9 as a}from"./chunks/framework.D8PMdl4T.js";const h=JSON.parse('{"title":"Forgejo","description":"","frontmatter":{"public":"true","slug":"forgejo","title":"Forgejo","prev":false,"next":false},"headers":[],"relativePath":"garden/forgejo/index.md","filePath":"garden/forgejo/index.md","lastUpdated":1717647948000}'),t={name:"garden/forgejo/index.md"},n=a("",3),s=[n];function c(d,i,_,l,f,g){return r(),o("div",null,s)}const u=e(t,[["render",c]]);export{h as __pageData,u as default}; diff --git a/assets/garden_freeform-vs-chronological-dichotomy_index.md.1DrtPCar.js b/assets/garden_freeform-vs-chronological-dichotomy_index.md.C3LSUlA6.js similarity index 94% rename from assets/garden_freeform-vs-chronological-dichotomy_index.md.1DrtPCar.js rename to assets/garden_freeform-vs-chronological-dichotomy_index.md.C3LSUlA6.js index 6fc62ec1..06fc791f 100644 --- a/assets/garden_freeform-vs-chronological-dichotomy_index.md.1DrtPCar.js +++ b/assets/garden_freeform-vs-chronological-dichotomy_index.md.C3LSUlA6.js @@ -1 +1 @@ -import{_ as o,c as e,o as r,a9 as a}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Freeform vs Chronological Dichotomy","description":"","frontmatter":{"public":"true","slug":"freeform-vs-chronological-dichotomy","title":"Freeform vs Chronological Dichotomy","prev":false,"next":false},"headers":[],"relativePath":"garden/freeform-vs-chronological-dichotomy/index.md","filePath":"garden/freeform-vs-chronological-dichotomy/index.md","lastUpdated":1718069968000}'),c={name:"garden/freeform-vs-chronological-dichotomy/index.md"},t=a('

Freeform vs Chronological Dichotomy

Referenced by: Chronological, Freeform

Describes a dichotomy between displaying information in a Freeform vs Chronological manner

',3),n=[t];function i(l,s,h,f,d,m){return r(),e("div",null,n)}const p=o(c,[["render",i]]);export{g as __pageData,p as default}; +import{_ as o,c as e,o as r,a9 as a}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Freeform vs Chronological Dichotomy","description":"","frontmatter":{"public":"true","slug":"freeform-vs-chronological-dichotomy","title":"Freeform vs Chronological Dichotomy","prev":false,"next":false},"headers":[],"relativePath":"garden/freeform-vs-chronological-dichotomy/index.md","filePath":"garden/freeform-vs-chronological-dichotomy/index.md","lastUpdated":1717647948000}'),c={name:"garden/freeform-vs-chronological-dichotomy/index.md"},t=a('

Freeform vs Chronological Dichotomy

Referenced by: Chronological, Freeform

Describes a dichotomy between displaying information in a Freeform vs Chronological manner

',3),n=[t];function i(l,s,h,f,d,m){return r(),e("div",null,n)}const p=o(c,[["render",i]]);export{g as __pageData,p as default}; diff --git a/assets/garden_freeform-vs-chronological-dichotomy_index.md.1DrtPCar.lean.js b/assets/garden_freeform-vs-chronological-dichotomy_index.md.C3LSUlA6.lean.js similarity index 90% rename from assets/garden_freeform-vs-chronological-dichotomy_index.md.1DrtPCar.lean.js rename to assets/garden_freeform-vs-chronological-dichotomy_index.md.C3LSUlA6.lean.js index f0568ece..025ae8b4 100644 --- a/assets/garden_freeform-vs-chronological-dichotomy_index.md.1DrtPCar.lean.js +++ b/assets/garden_freeform-vs-chronological-dichotomy_index.md.C3LSUlA6.lean.js @@ -1 +1 @@ -import{_ as o,c as e,o as r,a9 as a}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Freeform vs Chronological Dichotomy","description":"","frontmatter":{"public":"true","slug":"freeform-vs-chronological-dichotomy","title":"Freeform vs Chronological Dichotomy","prev":false,"next":false},"headers":[],"relativePath":"garden/freeform-vs-chronological-dichotomy/index.md","filePath":"garden/freeform-vs-chronological-dichotomy/index.md","lastUpdated":1718069968000}'),c={name:"garden/freeform-vs-chronological-dichotomy/index.md"},t=a("",3),n=[t];function i(l,s,h,f,d,m){return r(),e("div",null,n)}const p=o(c,[["render",i]]);export{g as __pageData,p as default}; +import{_ as o,c as e,o as r,a9 as a}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Freeform vs Chronological Dichotomy","description":"","frontmatter":{"public":"true","slug":"freeform-vs-chronological-dichotomy","title":"Freeform vs Chronological Dichotomy","prev":false,"next":false},"headers":[],"relativePath":"garden/freeform-vs-chronological-dichotomy/index.md","filePath":"garden/freeform-vs-chronological-dichotomy/index.md","lastUpdated":1717647948000}'),c={name:"garden/freeform-vs-chronological-dichotomy/index.md"},t=a("",3),n=[t];function i(l,s,h,f,d,m){return r(),e("div",null,n)}const p=o(c,[["render",i]]);export{g as __pageData,p as default}; diff --git a/assets/garden_freeform_index.md.Dpr_rnXh.js b/assets/garden_freeform_index.md.BLA-ZZ3B.js similarity index 95% rename from assets/garden_freeform_index.md.Dpr_rnXh.js rename to assets/garden_freeform_index.md.BLA-ZZ3B.js index 2e27f312..1a6e0cff 100644 --- a/assets/garden_freeform_index.md.Dpr_rnXh.js +++ b/assets/garden_freeform_index.md.BLA-ZZ3B.js @@ -1 +1 @@ -import{_ as e,c as r,o as a,a9 as o}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Freeform","description":"","frontmatter":{"public":"true","slug":"freeform","title":"Freeform","prev":false,"next":false},"headers":[],"relativePath":"garden/freeform/index.md","filePath":"garden/freeform/index.md","lastUpdated":1718069968000}'),t={name:"garden/freeform/index.md"},n=o('

Freeform

Referenced by: Commune, Digital Gardens, Freeform vs Chronological Dichotomy, Garden-RSS, The Small Web

A collection of information that is not tied to when it was created or edited

Part of the Freeform vs Chronological Dichotomy

Anything wiki-style is considered freeform

  • A collection of living documents

Garden-RSS, a theoretical alternative to RSS that's better for freeform content

',7),i=[n];function f(d,l,c,s,m,h){return a(),r("div",null,i)}const g=e(t,[["render",f]]);export{p as __pageData,g as default}; +import{_ as e,c as r,o as a,a9 as o}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Freeform","description":"","frontmatter":{"public":"true","slug":"freeform","title":"Freeform","prev":false,"next":false},"headers":[],"relativePath":"garden/freeform/index.md","filePath":"garden/freeform/index.md","lastUpdated":1717647948000}'),t={name:"garden/freeform/index.md"},n=o('

Freeform

Referenced by: Commune, Digital Gardens, Freeform vs Chronological Dichotomy, Garden-RSS, The Small Web

A collection of information that is not tied to when it was created or edited

Part of the Freeform vs Chronological Dichotomy

Anything wiki-style is considered freeform

  • A collection of living documents

Garden-RSS, a theoretical alternative to RSS that's better for freeform content

',7),i=[n];function f(d,l,c,s,m,h){return a(),r("div",null,i)}const g=e(t,[["render",f]]);export{p as __pageData,g as default}; diff --git a/assets/garden_freeform_index.md.Dpr_rnXh.lean.js b/assets/garden_freeform_index.md.BLA-ZZ3B.lean.js similarity index 87% rename from assets/garden_freeform_index.md.Dpr_rnXh.lean.js rename to assets/garden_freeform_index.md.BLA-ZZ3B.lean.js index bc7f5962..2d4a3d3a 100644 --- a/assets/garden_freeform_index.md.Dpr_rnXh.lean.js +++ b/assets/garden_freeform_index.md.BLA-ZZ3B.lean.js @@ -1 +1 @@ -import{_ as e,c as r,o as a,a9 as o}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Freeform","description":"","frontmatter":{"public":"true","slug":"freeform","title":"Freeform","prev":false,"next":false},"headers":[],"relativePath":"garden/freeform/index.md","filePath":"garden/freeform/index.md","lastUpdated":1718069968000}'),t={name:"garden/freeform/index.md"},n=o("",7),i=[n];function f(d,l,c,s,m,h){return a(),r("div",null,i)}const g=e(t,[["render",f]]);export{p as __pageData,g as default}; +import{_ as e,c as r,o as a,a9 as o}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Freeform","description":"","frontmatter":{"public":"true","slug":"freeform","title":"Freeform","prev":false,"next":false},"headers":[],"relativePath":"garden/freeform/index.md","filePath":"garden/freeform/index.md","lastUpdated":1717647948000}'),t={name:"garden/freeform/index.md"},n=o("",7),i=[n];function f(d,l,c,s,m,h){return a(),r("div",null,i)}const g=e(t,[["render",f]]);export{p as __pageData,g as default}; diff --git a/assets/garden_game-dev-tree_index.md.1knpikM2.js b/assets/garden_game-dev-tree_index.md.DweE1Ysy.js similarity index 90% rename from assets/garden_game-dev-tree_index.md.1knpikM2.js rename to assets/garden_game-dev-tree_index.md.DweE1Ysy.js index 824fb534..3c1e15f0 100644 --- a/assets/garden_game-dev-tree_index.md.1knpikM2.js +++ b/assets/garden_game-dev-tree_index.md.DweE1Ysy.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Game Dev Tree","description":"","frontmatter":{"public":"true","slug":"game-dev-tree","tags":["My Projects"],"title":"Game Dev Tree","prev":false,"next":false},"headers":[],"relativePath":"garden/game-dev-tree/index.md","filePath":"garden/game-dev-tree/index.md","lastUpdated":1718069968000}'),o={name:"garden/game-dev-tree/index.md"},n=r('

Game Dev Tree

Tags: My Projects

Play it here!

My first (good) incremental game! (My actual first was Shape Tycoon - I don't recommend it!)

It's Open Source!

The TV Tropes page on this game mentions some of the cool things about this game

',6),s=[n];function p(i,d,c,m,l,h){return a(),t("div",null,s)}const f=e(o,[["render",p]]);export{g as __pageData,f as default}; +import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Game Dev Tree","description":"","frontmatter":{"public":"true","slug":"game-dev-tree","tags":["My Projects"],"title":"Game Dev Tree","prev":false,"next":false},"headers":[],"relativePath":"garden/game-dev-tree/index.md","filePath":"garden/game-dev-tree/index.md","lastUpdated":1717647948000}'),o={name:"garden/game-dev-tree/index.md"},n=r('

Game Dev Tree

Tags: My Projects

Play it here!

My first (good) incremental game! (My actual first was Shape Tycoon - I don't recommend it!)

It's Open Source!

The TV Tropes page on this game mentions some of the cool things about this game

',6),s=[n];function p(i,d,c,m,l,h){return a(),t("div",null,s)}const f=e(o,[["render",p]]);export{g as __pageData,f as default}; diff --git a/assets/garden_game-dev-tree_index.md.1knpikM2.lean.js b/assets/garden_game-dev-tree_index.md.DweE1Ysy.lean.js similarity index 77% rename from assets/garden_game-dev-tree_index.md.1knpikM2.lean.js rename to assets/garden_game-dev-tree_index.md.DweE1Ysy.lean.js index f8d6c7f3..42aaa7e7 100644 --- a/assets/garden_game-dev-tree_index.md.1knpikM2.lean.js +++ b/assets/garden_game-dev-tree_index.md.DweE1Ysy.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Game Dev Tree","description":"","frontmatter":{"public":"true","slug":"game-dev-tree","tags":["My Projects"],"title":"Game Dev Tree","prev":false,"next":false},"headers":[],"relativePath":"garden/game-dev-tree/index.md","filePath":"garden/game-dev-tree/index.md","lastUpdated":1718069968000}'),o={name:"garden/game-dev-tree/index.md"},n=r("",6),s=[n];function p(i,d,c,m,l,h){return a(),t("div",null,s)}const f=e(o,[["render",p]]);export{g as __pageData,f as default}; +import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Game Dev Tree","description":"","frontmatter":{"public":"true","slug":"game-dev-tree","tags":["My Projects"],"title":"Game Dev Tree","prev":false,"next":false},"headers":[],"relativePath":"garden/game-dev-tree/index.md","filePath":"garden/game-dev-tree/index.md","lastUpdated":1717647948000}'),o={name:"garden/game-dev-tree/index.md"},n=r("",6),s=[n];function p(i,d,c,m,l,h){return a(),t("div",null,s)}const f=e(o,[["render",p]]);export{g as __pageData,f as default}; diff --git a/assets/garden_garden-rss_index.md.BwhK0u3y.js b/assets/garden_garden-rss_index.md.CqqLm4uJ.js similarity index 96% rename from assets/garden_garden-rss_index.md.BwhK0u3y.js rename to assets/garden_garden-rss_index.md.CqqLm4uJ.js index ed7896fd..1b546dab 100644 --- a/assets/garden_garden-rss_index.md.BwhK0u3y.js +++ b/assets/garden_garden-rss_index.md.CqqLm4uJ.js @@ -1 +1 @@ -import{_ as e,c as r,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Garden-RSS","description":"","frontmatter":{"public":"true","slug":"garden-rss","title":"Garden-RSS","prev":false,"next":false},"headers":[],"relativePath":"garden/garden-rss/index.md","filePath":"garden/garden-rss/index.md","lastUpdated":1718069968000}'),s={name:"garden/garden-rss/index.md"},i=t('

Garden-RSS

Referenced by: Freeform, The Small Web, This Knowledge Hub

A theoretical alternative to RSS that's better for Freeform websites (and Digital Gardens specifically )

Why is it useful?

How should it work?

  • Could display changes similar to git diffs

Existing Work

',9),n=[i];function o(l,d,c,f,h,g){return a(),r("div",null,n)}const _=e(s,[["render",o]]);export{u as __pageData,_ as default}; +import{_ as e,c as r,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Garden-RSS","description":"","frontmatter":{"public":"true","slug":"garden-rss","title":"Garden-RSS","prev":false,"next":false},"headers":[],"relativePath":"garden/garden-rss/index.md","filePath":"garden/garden-rss/index.md","lastUpdated":1717647948000}'),s={name:"garden/garden-rss/index.md"},i=t('

Garden-RSS

Referenced by: Freeform, The Small Web, This Knowledge Hub

A theoretical alternative to RSS that's better for Freeform websites (and Digital Gardens specifically )

Why is it useful?

How should it work?

  • Could display changes similar to git diffs

Existing Work

',9),n=[i];function o(l,d,c,f,h,g){return a(),r("div",null,n)}const _=e(s,[["render",o]]);export{u as __pageData,_ as default}; diff --git a/assets/garden_garden-rss_index.md.BwhK0u3y.lean.js b/assets/garden_garden-rss_index.md.CqqLm4uJ.lean.js similarity index 87% rename from assets/garden_garden-rss_index.md.BwhK0u3y.lean.js rename to assets/garden_garden-rss_index.md.CqqLm4uJ.lean.js index f621aee0..7171fb4c 100644 --- a/assets/garden_garden-rss_index.md.BwhK0u3y.lean.js +++ b/assets/garden_garden-rss_index.md.CqqLm4uJ.lean.js @@ -1 +1 @@ -import{_ as e,c as r,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Garden-RSS","description":"","frontmatter":{"public":"true","slug":"garden-rss","title":"Garden-RSS","prev":false,"next":false},"headers":[],"relativePath":"garden/garden-rss/index.md","filePath":"garden/garden-rss/index.md","lastUpdated":1718069968000}'),s={name:"garden/garden-rss/index.md"},i=t("",9),n=[i];function o(l,d,c,f,h,g){return a(),r("div",null,n)}const _=e(s,[["render",o]]);export{u as __pageData,_ as default}; +import{_ as e,c as r,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Garden-RSS","description":"","frontmatter":{"public":"true","slug":"garden-rss","title":"Garden-RSS","prev":false,"next":false},"headers":[],"relativePath":"garden/garden-rss/index.md","filePath":"garden/garden-rss/index.md","lastUpdated":1717647948000}'),s={name:"garden/garden-rss/index.md"},i=t("",9),n=[i];function o(l,d,c,f,h,g){return a(),r("div",null,n)}const _=e(s,[["render",o]]);export{u as __pageData,_ as default}; diff --git a/assets/garden_guide-to-incrementals_appeal-to-developers_index.md.DZzqiW0T.js b/assets/garden_guide-to-incrementals_appeal-to-developers_index.md.C6gNawcM.js similarity index 98% rename from assets/garden_guide-to-incrementals_appeal-to-developers_index.md.DZzqiW0T.js rename to assets/garden_guide-to-incrementals_appeal-to-developers_index.md.C6gNawcM.js index ebdcdf3d..53b94c77 100644 --- a/assets/garden_guide-to-incrementals_appeal-to-developers_index.md.DZzqiW0T.js +++ b/assets/garden_guide-to-incrementals_appeal-to-developers_index.md.C6gNawcM.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Guide to Incrementals/Appeal to Developers","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/appeal-to-developers","title":"Guide to Incrementals/Appeal to Developers","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/appeal-to-developers/index.md","filePath":"garden/guide-to-incrementals/appeal-to-developers/index.md","lastUpdated":1718069968000}'),n={name:"garden/guide-to-incrementals/appeal-to-developers/index.md"},i=o('

Guide to Incrementals/Appeal to Developers

There are a lot of developers in the incremental games community - the genre seems to draw them in, and convert a lot of players into developers. Let's explore the reasons why this genre appeals to developers.

Incrementals are Easy to Make

Compared to other genres, incrementals have quite low expectations. You don't need to make fancy art, or music, or lay things out nicely. If you can make a button and learn the few lines of code necessary to make a number go up, you can make an incremental. This low threshold makes the genre perfect for those who are actively learning to code and haven't developed any gamedev-related skills yet.

Additionally, unlike other genres incrementals are uniquely easy to implement in a normal web page - no need to worry about rendering sprites, moving them around, implementing physics, etc. New developers can just use HTML to add a button, and the game is now available in your browser. You don't need to choose an engine, have admin privileges, or hell for the dedicated you don't even need a computer - there are tools for web development that run in the browser itself, so you can technically use your phone if that's all you have.

Javascript is a perfectly viable language for making web games, whereas other genres are typically going to require using other more difficult languages to learn. There are countless javascript tutorials that start from 0 knowledge of programming, making it incredibly accessible to beginners.

Players are Easy to Find

Once you've finished your game and uploaded it on github pages or itch or just copied the link if you're using glitch or replit (all of which are easy to do), anyone can now play the game in their browser. This low barrier to entry has shown tremendous success in getting completely unknown developers to have thousands of plays.

The incremental games community, which mostly centers around r/incremental_games, is always looking for new games and tends to flood any new ones posted with initial players.

Having your games be played can be incredibly motivating, and the community makes it quite clear that you can expect players to play your game. These communities - both for incremental games in general as well as game-specific communities - tend to be very developer friendly as well. A lot of the developers know each other, and welcome new developers with open arms, often with dedicated channels for programming help and discussions.

Monetization

I'd like to clarify that everything I've said above mainly applies to web-based incrementals. Incremental games are also incredibly popular on mobile, but with a much different culture and community. Many mobile gamers will still participate in the web-focused community for the culture. This web-focused community has a culture that has been criticized for being "anti-monetization". Ads, IAPs, and similar forms of monetization are often criticized, mainly due to the abundance of completely non-monetized games available from hobbyist developers. There are exceptions, like paid games often being considered fine, like Increlution or Stuck in Time, or donation ware games like kittens game, but even popular games that have IAP see some level of regular criticism, like NGU Idle, Idle Skilling, or Idle Pins. A large part of this can be explained by the community being hyper-aware of the addictive) nature of this genre and its susceptibility to exploiting players.

On mobile, however, monetization is the norm and expected. If an incremental game is available on mobile, it almost certainly will be monetized, and mobile players are aware and accepting of that. Mobile incremental games, due to their addictive nature, tend to make a lot of money. It's very lucrative, and therefore these games are quite abundant on mobile storefronts.

',13),r=[i];function l(s,d,m,c,p,h){return t(),a("div",null,r)}const y=e(n,[["render",l]]);export{g as __pageData,y as default}; +import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Guide to Incrementals/Appeal to Developers","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/appeal-to-developers","title":"Guide to Incrementals/Appeal to Developers","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/appeal-to-developers/index.md","filePath":"garden/guide-to-incrementals/appeal-to-developers/index.md","lastUpdated":1717647948000}'),n={name:"garden/guide-to-incrementals/appeal-to-developers/index.md"},i=o('

Guide to Incrementals/Appeal to Developers

There are a lot of developers in the incremental games community - the genre seems to draw them in, and convert a lot of players into developers. Let's explore the reasons why this genre appeals to developers.

Incrementals are Easy to Make

Compared to other genres, incrementals have quite low expectations. You don't need to make fancy art, or music, or lay things out nicely. If you can make a button and learn the few lines of code necessary to make a number go up, you can make an incremental. This low threshold makes the genre perfect for those who are actively learning to code and haven't developed any gamedev-related skills yet.

Additionally, unlike other genres incrementals are uniquely easy to implement in a normal web page - no need to worry about rendering sprites, moving them around, implementing physics, etc. New developers can just use HTML to add a button, and the game is now available in your browser. You don't need to choose an engine, have admin privileges, or hell for the dedicated you don't even need a computer - there are tools for web development that run in the browser itself, so you can technically use your phone if that's all you have.

Javascript is a perfectly viable language for making web games, whereas other genres are typically going to require using other more difficult languages to learn. There are countless javascript tutorials that start from 0 knowledge of programming, making it incredibly accessible to beginners.

Players are Easy to Find

Once you've finished your game and uploaded it on github pages or itch or just copied the link if you're using glitch or replit (all of which are easy to do), anyone can now play the game in their browser. This low barrier to entry has shown tremendous success in getting completely unknown developers to have thousands of plays.

The incremental games community, which mostly centers around r/incremental_games, is always looking for new games and tends to flood any new ones posted with initial players.

Having your games be played can be incredibly motivating, and the community makes it quite clear that you can expect players to play your game. These communities - both for incremental games in general as well as game-specific communities - tend to be very developer friendly as well. A lot of the developers know each other, and welcome new developers with open arms, often with dedicated channels for programming help and discussions.

Monetization

I'd like to clarify that everything I've said above mainly applies to web-based incrementals. Incremental games are also incredibly popular on mobile, but with a much different culture and community. Many mobile gamers will still participate in the web-focused community for the culture. This web-focused community has a culture that has been criticized for being "anti-monetization". Ads, IAPs, and similar forms of monetization are often criticized, mainly due to the abundance of completely non-monetized games available from hobbyist developers. There are exceptions, like paid games often being considered fine, like Increlution or Stuck in Time, or donation ware games like kittens game, but even popular games that have IAP see some level of regular criticism, like NGU Idle, Idle Skilling, or Idle Pins. A large part of this can be explained by the community being hyper-aware of the addictive) nature of this genre and its susceptibility to exploiting players.

On mobile, however, monetization is the norm and expected. If an incremental game is available on mobile, it almost certainly will be monetized, and mobile players are aware and accepting of that. Mobile incremental games, due to their addictive nature, tend to make a lot of money. It's very lucrative, and therefore these games are quite abundant on mobile storefronts.

',13),r=[i];function l(s,d,m,c,p,h){return t(),a("div",null,r)}const y=e(n,[["render",l]]);export{g as __pageData,y as default}; diff --git a/assets/garden_guide-to-incrementals_appeal-to-developers_index.md.DZzqiW0T.lean.js b/assets/garden_guide-to-incrementals_appeal-to-developers_index.md.C6gNawcM.lean.js similarity index 91% rename from assets/garden_guide-to-incrementals_appeal-to-developers_index.md.DZzqiW0T.lean.js rename to assets/garden_guide-to-incrementals_appeal-to-developers_index.md.C6gNawcM.lean.js index 79f8922e..7e6d1d29 100644 --- a/assets/garden_guide-to-incrementals_appeal-to-developers_index.md.DZzqiW0T.lean.js +++ b/assets/garden_guide-to-incrementals_appeal-to-developers_index.md.C6gNawcM.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Guide to Incrementals/Appeal to Developers","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/appeal-to-developers","title":"Guide to Incrementals/Appeal to Developers","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/appeal-to-developers/index.md","filePath":"garden/guide-to-incrementals/appeal-to-developers/index.md","lastUpdated":1718069968000}'),n={name:"garden/guide-to-incrementals/appeal-to-developers/index.md"},i=o("",13),r=[i];function l(s,d,m,c,p,h){return t(),a("div",null,r)}const y=e(n,[["render",l]]);export{g as __pageData,y as default}; +import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Guide to Incrementals/Appeal to Developers","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/appeal-to-developers","title":"Guide to Incrementals/Appeal to Developers","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/appeal-to-developers/index.md","filePath":"garden/guide-to-incrementals/appeal-to-developers/index.md","lastUpdated":1717647948000}'),n={name:"garden/guide-to-incrementals/appeal-to-developers/index.md"},i=o("",13),r=[i];function l(s,d,m,c,p,h){return t(),a("div",null,r)}const y=e(n,[["render",l]]);export{g as __pageData,y as default}; diff --git a/assets/garden_guide-to-incrementals_appeal-to-players_index.md.Zt-2JIdI.js b/assets/garden_guide-to-incrementals_appeal-to-players_index.md.AIc2QesW.js similarity index 99% rename from assets/garden_guide-to-incrementals_appeal-to-players_index.md.Zt-2JIdI.js rename to assets/garden_guide-to-incrementals_appeal-to-players_index.md.AIc2QesW.js index 4d4205e6..b2331664 100644 --- a/assets/garden_guide-to-incrementals_appeal-to-players_index.md.Zt-2JIdI.js +++ b/assets/garden_guide-to-incrementals_appeal-to-players_index.md.AIc2QesW.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Guide to Incrementals/Appeal to Players","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/appeal-to-players","title":"Guide to Incrementals/Appeal to Players","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/appeal-to-players/index.md","filePath":"garden/guide-to-incrementals/appeal-to-players/index.md","lastUpdated":1718069968000}'),n={name:"garden/guide-to-incrementals/appeal-to-players/index.md"},o=i('

Guide to Incrementals/Appeal to Players

This is something that has been discussed and analyzed by many people, and to some extent, I feel like everything that can be said on the topic already has. However, a lot of these analyses are from the perspective of those with not as much experience and involvement within the genre as I'd argue would be necessary for a fully contextualized answer. I recently watched a video about Vampire Survivors, which has since been taken down due to drawing negative attention, which made me think about some interesting arguments about what games are, and what makes them good. The video's argument that "Vampire Survivors is not a video game" mirrors a claim by the developer of Cookie Clicker that his games are "non-games". Using Vampire Survivors and the video made on it as a framework, I'll be answering why incremental games appeal to players. Since the video has been taken down, I'll do my best to contextualize and generalize the arguments of the video without requiring the reader to watch it. For what it's worth, while I disagreed with the video I actually liked a lot of the way it went about thinking about games, and I consider this a continuation of that discussion.

Numbers Going Up

This is a very common response to why people enjoy incremental games, although it's not one I find compels me personally, and I suspect it might be a stand-in for progression) or Guide to Incrementals/What is Content?. But reportedly, some people do just like seeing big numbers. I must reiterate I suspect the actual cause is seeing big numbers in context though - if you start at 1e1000 of a currency and get to 1e1001, that isn't going to feel as satisfying as going from 1e10 to 1e100, and in any case, I don't think a button that just adds a zero to your number will feel quite satisfying - I believe its the sense of having made progress, and comparing where you are to where you started and feeling like you've earned your way here that is enjoyable.

Progression

Vampire Survivors can be argued to have a comparatively low depth to its combat compared to many other games. I'd argue it has sufficient depth and more than someone might expect who has only played the game for a short while, but it still definitely gets beat out by many other combat-focused games. Instead, a lot of the progression in Vampire Survivors comes from a meta-progression system by which base stats are increased by spending a currency that persists between runs. While it is technically possible to win without this meta-progression system, and indeed in many roguelikes players like to challenge themselves by beating the game without any meta-progression, the criticism can be made that meta-progression de-emphasizes player skill by making it less important to have to beat the game. Certainly, in incremental games, it is often literally impossible to complete a game without taking advantage of the meta-progression systems. I'd argue this does not detract from the game, however, and is actually a part of what makes incremental games, and roguelikes, enjoyable to many players: meta-progression augments the increases in skill the player is naturally gaining as they play. In effect, it's not replacing the skill increase, but exaggerating it to make it feel more real to the player.

Note: There is also a lot of progression from exploring the mechanics and discovering synergies, unlocking new weapons or playable characters, etc. That just isn't as relevant to this discussion, but it does make up a lot of the appeal of the game.

Effortlessness

Incremental games are so easy, a lot of them even have you progress while you're not playing! Part of the appeal is being able to feel like you're making progress while doing something actually productive - multitasking, in a way. In this sense, the game is more of a fidget toy - not something to think hard about and play actively, but something to click a few buttons every so often while you're paying attention to a lecture or studying or working. Of course, not all incremental games lend themselves to being played this way - it's specifically "idle" games that work like this. These are games that take an incredibly long amount of time to see all the content, stretching it as thin as possible, but they aren't expecting you to be sitting at your device playing it the entire time. They expect you to leave and come back later to make a bit of progress and repeat the cycle.

If you look at the higher-level play of most games, you'll see them perform difficult feats with ease and speed. They'll achieve a "flow state" that takes all their knowledge and experience of the game and uses it to play the game as instinctively as possible. It's incredible to watch things like Slay the Spire speed runs or competitive DDR-likes. I'd argue the goal of a lot of games with a competitive scene is to get so good that the game becomes effortless. In that sense, a game that allows you to reach that point earlier isn't any less legitimate, but rather lowers the barrier to entry by allowing more people to get "really good" at the game. And to be clear, Vampire Survivors and (most) incremental games aren't trivially easy - they, and to an extent, every game will have some level of learning and improvement over time.

Addiction

A lot of these reasons for why incremental games appeal may have reminded you of why gambling appeals to people, particularly those prone to addiction. Indeed, incremental games are quite often criticized for their similarity to a skinner box. Some have gone as far as to say incremental games as a genre are commenting that all games are skinner boxes). The argument goes that some games are not fun, but rather condition players into continuing to play without actually getting anything from the experience. When tied to real-world money this is seen as predatory, and to a lesser extent, even free games may be feeding the addictive sides of people and making them more prone to seek out gambling or micro-transaction heavy games.

While incremental games can be fun and even healthy in certain contexts, they can exacerbate video game addiction more than other genres. If you feel like playing incremental games is taking priority over other things in your life, or manipulating your sleep schedule, it may be prudent to seek help. See r/StopGaming for resources.

Since incremental games are often built on extrinsic motivations in the form of progression systems, it's hard to argue whether players continue to play because they are enjoying the gameplay, or if they are just conditioned to keep doing it because the game keeps rewarding them. Unfortunately, it can often feel like it's the latter, as there isn't typically anything compelling about the "gameplay" of clicking a button and waiting. There may be a significant overlap between those who enjoy incremental games and those who are most prone to addiction, and there are often posts on r/incremental_games about someone either struggling with or overcoming video game addiction.

Strategy

Incremental games could be considered a subset of strategy games), and inherit the appeals of strategy games. This includes the appeal of feeling like you've found a good solution to a puzzle, or that you're learning more about the game and are improving at making decisions within it. This applies to Vampire Survivors specifically, where you're learning about evolutions and synergies and what kinds of enemies can spawn under what conditions, and how best to handle them.

Note that strategy games are not all the same difficulty, as well. Vampire Survivors is still easier to play than Starcraft 2, and Cookie Clicker is probably somewhere in between (once you progress sufficiently). Vampire Survivors being so successful may indicate that "easier" strategies may have their separate appeal to harder strategy games - players like to feel smart and that they figured the game out and have optimized or mastered it, and the game being easier doesn't detract from that sense of accomplishment as much as it allows more and more users to be able to reach the point where they gain that sense.

Avoiding Staleness

Incremental games tend to have "paradigm shifts", where the gameplay changes in a meaningful way at various times throughout the progression of the game. These upset and change the gameplay loop, which helps keep them from stagnating. This constant "freshness" to the gameplay can keep players engaged for longer, compared to a game with a repetitive and static gameplay loop.

Good Game Design

Incremental games tend to show their game design "plainly", so it's more readily apparent if a game has good game design while playing, even if you're not looking for it. While different players have different preferences and might enjoy different types of games more than others, there are underlying good and bad game design principles that players will notice the effects of. To be clear, this isn't talking about stuff like big numbers being enjoyable, where I can comfortably agree to disagree with other players. They don't intrinsically make my experience better, but I'm aware of those for whom it does and I won't argue against their feelings. However, the game designer in me does feel like there are some extremely clear-cut examples of good and bad game design philosophies.

Let's start by giving an example of a mechanic I think can be easily and strongly argued is good game design. There are of course many examples, but a personal favorite of mine is how DOOM encourages aggressive gameplay by linking health drops to melee attacks. It has an intended experience it's trying to give the player - immersing themselves as DOOM guy, who would not hide behind cover when low on health - and this mechanic does a great job at encouraging and effectively teaching players to behave properly. This is in sharp contrast to shooters like Call of Duty, which have you regen health passively, encouraging players to hide behind cover and wait after getting hit. Note that I'm not arguing CoD is poorly designed, as the games have different intended experiences. I'm specifically praising DOOM for having a mechanic that does a good job at ensuring the player has that intended experience.

To contrast with an example I think is bad game design, let's talk about shields in souls-likes. This is a bit of a famous example, and I highly recommend this video essay which spends quite a good bit of time on this topic. Essentially, the argument boils down to players of earlier games in the souls games using shields too much - playing slowly, conservatively, and ultimately having less fun. Players wanted to feel safe, so they ended up playing in a way that ruined the experience for them. The developers solved this by removing shields, apart from an intentionally bad one effectively mocking the playstyle, and it did its job at getting players to play more aggressively, and often have more fun.

To bring the conversation back to incrementals, I'm incredibly opinionated on what makes a good incremental game, which I'll discuss in the game design section. Suffice it to say, incremental games rely more on good game design than other genres, due to not having much to distract from bad game design. This helps (although imperfectly - gamers are a bit too tolerant of bad game design!) well-designed games rise to the top within the genre.

Artistic Merit

The Vampire Survivors video made me think back to the old arguments about whether games are art, and whether they ought to be. The video seems preoccupied with attaching value to games solely based on their mechanics and the depth thereof, to the point of arguing Vampire Survivors is a waste of time due to its lack of depth. However, even setting aside the fact that if players are having fun then it's not time wasted, I think games can have artistic merit that supersedes the necessity of having (any / engaging / "deep") gameplay. I think the consensus online is that games are definitively art, although I could see the argument that some genres, like incremental games, might be a bit in a grey area. Let's talk about Vampire Survivors first though - It has a story to tell, with lore and many characters, that drive the player and encourage them to continue exploring the game and discovering things within it. Like any walking simulator, it is no less legitimate of a game or the "art" label because of any lack perceived lack of depth. For what it's worth, most art can be consumed with more ease than VS - any painting, movie, sculpture, etc.

A lot of incrementals have a narrative context that can similarly qualify them as art. Cookie Clicker is, as has been pointed out numerous times before, commenting on excess and increasing production beyond any reasonable limits - devolving into increasing production for its own sake. Indeed, a lot of incremental games are written to comment upon various concepts like capitalism or tropes in games, as discussed when defining Incrementals). However, I'd like to argue most incremental games are still art, even without any narrative context. "Art" as a concept is pretty nebulous already, but I personally like those who define it as an act of expression more than any physical result. The creator and the context within which they created the art, and any meaning they put into it, are all relevant and a part of the art itself. Most incremental games have artistic merit from things like why the creator made it, why they chose to make it an incremental game, and why they made any particular design decision. Hell, even if you play through an entire incremental game without a single thought or feeling, that very fact it elicited nothing can itself be artistic merit!

I'm not an art major, and I may be taking a somewhat extreme take on what is art and what has artistic merit, but I'd argue the overall point stands that games, and incremental games specifically, can have artistic merit, which appeals to many gamers.

',28),s=[o];function r(l,h,m,g,d,c){return a(),t("div",null,s)}const y=e(n,[["render",r]]);export{u as __pageData,y as default}; +import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Guide to Incrementals/Appeal to Players","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/appeal-to-players","title":"Guide to Incrementals/Appeal to Players","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/appeal-to-players/index.md","filePath":"garden/guide-to-incrementals/appeal-to-players/index.md","lastUpdated":1717647948000}'),n={name:"garden/guide-to-incrementals/appeal-to-players/index.md"},o=i('

Guide to Incrementals/Appeal to Players

This is something that has been discussed and analyzed by many people, and to some extent, I feel like everything that can be said on the topic already has. However, a lot of these analyses are from the perspective of those with not as much experience and involvement within the genre as I'd argue would be necessary for a fully contextualized answer. I recently watched a video about Vampire Survivors, which has since been taken down due to drawing negative attention, which made me think about some interesting arguments about what games are, and what makes them good. The video's argument that "Vampire Survivors is not a video game" mirrors a claim by the developer of Cookie Clicker that his games are "non-games". Using Vampire Survivors and the video made on it as a framework, I'll be answering why incremental games appeal to players. Since the video has been taken down, I'll do my best to contextualize and generalize the arguments of the video without requiring the reader to watch it. For what it's worth, while I disagreed with the video I actually liked a lot of the way it went about thinking about games, and I consider this a continuation of that discussion.

Numbers Going Up

This is a very common response to why people enjoy incremental games, although it's not one I find compels me personally, and I suspect it might be a stand-in for progression) or Guide to Incrementals/What is Content?. But reportedly, some people do just like seeing big numbers. I must reiterate I suspect the actual cause is seeing big numbers in context though - if you start at 1e1000 of a currency and get to 1e1001, that isn't going to feel as satisfying as going from 1e10 to 1e100, and in any case, I don't think a button that just adds a zero to your number will feel quite satisfying - I believe its the sense of having made progress, and comparing where you are to where you started and feeling like you've earned your way here that is enjoyable.

Progression

Vampire Survivors can be argued to have a comparatively low depth to its combat compared to many other games. I'd argue it has sufficient depth and more than someone might expect who has only played the game for a short while, but it still definitely gets beat out by many other combat-focused games. Instead, a lot of the progression in Vampire Survivors comes from a meta-progression system by which base stats are increased by spending a currency that persists between runs. While it is technically possible to win without this meta-progression system, and indeed in many roguelikes players like to challenge themselves by beating the game without any meta-progression, the criticism can be made that meta-progression de-emphasizes player skill by making it less important to have to beat the game. Certainly, in incremental games, it is often literally impossible to complete a game without taking advantage of the meta-progression systems. I'd argue this does not detract from the game, however, and is actually a part of what makes incremental games, and roguelikes, enjoyable to many players: meta-progression augments the increases in skill the player is naturally gaining as they play. In effect, it's not replacing the skill increase, but exaggerating it to make it feel more real to the player.

Note: There is also a lot of progression from exploring the mechanics and discovering synergies, unlocking new weapons or playable characters, etc. That just isn't as relevant to this discussion, but it does make up a lot of the appeal of the game.

Effortlessness

Incremental games are so easy, a lot of them even have you progress while you're not playing! Part of the appeal is being able to feel like you're making progress while doing something actually productive - multitasking, in a way. In this sense, the game is more of a fidget toy - not something to think hard about and play actively, but something to click a few buttons every so often while you're paying attention to a lecture or studying or working. Of course, not all incremental games lend themselves to being played this way - it's specifically "idle" games that work like this. These are games that take an incredibly long amount of time to see all the content, stretching it as thin as possible, but they aren't expecting you to be sitting at your device playing it the entire time. They expect you to leave and come back later to make a bit of progress and repeat the cycle.

If you look at the higher-level play of most games, you'll see them perform difficult feats with ease and speed. They'll achieve a "flow state" that takes all their knowledge and experience of the game and uses it to play the game as instinctively as possible. It's incredible to watch things like Slay the Spire speed runs or competitive DDR-likes. I'd argue the goal of a lot of games with a competitive scene is to get so good that the game becomes effortless. In that sense, a game that allows you to reach that point earlier isn't any less legitimate, but rather lowers the barrier to entry by allowing more people to get "really good" at the game. And to be clear, Vampire Survivors and (most) incremental games aren't trivially easy - they, and to an extent, every game will have some level of learning and improvement over time.

Addiction

A lot of these reasons for why incremental games appeal may have reminded you of why gambling appeals to people, particularly those prone to addiction. Indeed, incremental games are quite often criticized for their similarity to a skinner box. Some have gone as far as to say incremental games as a genre are commenting that all games are skinner boxes). The argument goes that some games are not fun, but rather condition players into continuing to play without actually getting anything from the experience. When tied to real-world money this is seen as predatory, and to a lesser extent, even free games may be feeding the addictive sides of people and making them more prone to seek out gambling or micro-transaction heavy games.

While incremental games can be fun and even healthy in certain contexts, they can exacerbate video game addiction more than other genres. If you feel like playing incremental games is taking priority over other things in your life, or manipulating your sleep schedule, it may be prudent to seek help. See r/StopGaming for resources.

Since incremental games are often built on extrinsic motivations in the form of progression systems, it's hard to argue whether players continue to play because they are enjoying the gameplay, or if they are just conditioned to keep doing it because the game keeps rewarding them. Unfortunately, it can often feel like it's the latter, as there isn't typically anything compelling about the "gameplay" of clicking a button and waiting. There may be a significant overlap between those who enjoy incremental games and those who are most prone to addiction, and there are often posts on r/incremental_games about someone either struggling with or overcoming video game addiction.

Strategy

Incremental games could be considered a subset of strategy games), and inherit the appeals of strategy games. This includes the appeal of feeling like you've found a good solution to a puzzle, or that you're learning more about the game and are improving at making decisions within it. This applies to Vampire Survivors specifically, where you're learning about evolutions and synergies and what kinds of enemies can spawn under what conditions, and how best to handle them.

Note that strategy games are not all the same difficulty, as well. Vampire Survivors is still easier to play than Starcraft 2, and Cookie Clicker is probably somewhere in between (once you progress sufficiently). Vampire Survivors being so successful may indicate that "easier" strategies may have their separate appeal to harder strategy games - players like to feel smart and that they figured the game out and have optimized or mastered it, and the game being easier doesn't detract from that sense of accomplishment as much as it allows more and more users to be able to reach the point where they gain that sense.

Avoiding Staleness

Incremental games tend to have "paradigm shifts", where the gameplay changes in a meaningful way at various times throughout the progression of the game. These upset and change the gameplay loop, which helps keep them from stagnating. This constant "freshness" to the gameplay can keep players engaged for longer, compared to a game with a repetitive and static gameplay loop.

Good Game Design

Incremental games tend to show their game design "plainly", so it's more readily apparent if a game has good game design while playing, even if you're not looking for it. While different players have different preferences and might enjoy different types of games more than others, there are underlying good and bad game design principles that players will notice the effects of. To be clear, this isn't talking about stuff like big numbers being enjoyable, where I can comfortably agree to disagree with other players. They don't intrinsically make my experience better, but I'm aware of those for whom it does and I won't argue against their feelings. However, the game designer in me does feel like there are some extremely clear-cut examples of good and bad game design philosophies.

Let's start by giving an example of a mechanic I think can be easily and strongly argued is good game design. There are of course many examples, but a personal favorite of mine is how DOOM encourages aggressive gameplay by linking health drops to melee attacks. It has an intended experience it's trying to give the player - immersing themselves as DOOM guy, who would not hide behind cover when low on health - and this mechanic does a great job at encouraging and effectively teaching players to behave properly. This is in sharp contrast to shooters like Call of Duty, which have you regen health passively, encouraging players to hide behind cover and wait after getting hit. Note that I'm not arguing CoD is poorly designed, as the games have different intended experiences. I'm specifically praising DOOM for having a mechanic that does a good job at ensuring the player has that intended experience.

To contrast with an example I think is bad game design, let's talk about shields in souls-likes. This is a bit of a famous example, and I highly recommend this video essay which spends quite a good bit of time on this topic. Essentially, the argument boils down to players of earlier games in the souls games using shields too much - playing slowly, conservatively, and ultimately having less fun. Players wanted to feel safe, so they ended up playing in a way that ruined the experience for them. The developers solved this by removing shields, apart from an intentionally bad one effectively mocking the playstyle, and it did its job at getting players to play more aggressively, and often have more fun.

To bring the conversation back to incrementals, I'm incredibly opinionated on what makes a good incremental game, which I'll discuss in the game design section. Suffice it to say, incremental games rely more on good game design than other genres, due to not having much to distract from bad game design. This helps (although imperfectly - gamers are a bit too tolerant of bad game design!) well-designed games rise to the top within the genre.

Artistic Merit

The Vampire Survivors video made me think back to the old arguments about whether games are art, and whether they ought to be. The video seems preoccupied with attaching value to games solely based on their mechanics and the depth thereof, to the point of arguing Vampire Survivors is a waste of time due to its lack of depth. However, even setting aside the fact that if players are having fun then it's not time wasted, I think games can have artistic merit that supersedes the necessity of having (any / engaging / "deep") gameplay. I think the consensus online is that games are definitively art, although I could see the argument that some genres, like incremental games, might be a bit in a grey area. Let's talk about Vampire Survivors first though - It has a story to tell, with lore and many characters, that drive the player and encourage them to continue exploring the game and discovering things within it. Like any walking simulator, it is no less legitimate of a game or the "art" label because of any lack perceived lack of depth. For what it's worth, most art can be consumed with more ease than VS - any painting, movie, sculpture, etc.

A lot of incrementals have a narrative context that can similarly qualify them as art. Cookie Clicker is, as has been pointed out numerous times before, commenting on excess and increasing production beyond any reasonable limits - devolving into increasing production for its own sake. Indeed, a lot of incremental games are written to comment upon various concepts like capitalism or tropes in games, as discussed when defining Incrementals). However, I'd like to argue most incremental games are still art, even without any narrative context. "Art" as a concept is pretty nebulous already, but I personally like those who define it as an act of expression more than any physical result. The creator and the context within which they created the art, and any meaning they put into it, are all relevant and a part of the art itself. Most incremental games have artistic merit from things like why the creator made it, why they chose to make it an incremental game, and why they made any particular design decision. Hell, even if you play through an entire incremental game without a single thought or feeling, that very fact it elicited nothing can itself be artistic merit!

I'm not an art major, and I may be taking a somewhat extreme take on what is art and what has artistic merit, but I'd argue the overall point stands that games, and incremental games specifically, can have artistic merit, which appeals to many gamers.

',28),s=[o];function r(l,h,m,g,d,c){return a(),t("div",null,s)}const y=e(n,[["render",r]]);export{u as __pageData,y as default}; diff --git a/assets/garden_guide-to-incrementals_appeal-to-players_index.md.Zt-2JIdI.lean.js b/assets/garden_guide-to-incrementals_appeal-to-players_index.md.AIc2QesW.lean.js similarity index 90% rename from assets/garden_guide-to-incrementals_appeal-to-players_index.md.Zt-2JIdI.lean.js rename to assets/garden_guide-to-incrementals_appeal-to-players_index.md.AIc2QesW.lean.js index c3d125c6..82e4cfb9 100644 --- a/assets/garden_guide-to-incrementals_appeal-to-players_index.md.Zt-2JIdI.lean.js +++ b/assets/garden_guide-to-incrementals_appeal-to-players_index.md.AIc2QesW.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Guide to Incrementals/Appeal to Players","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/appeal-to-players","title":"Guide to Incrementals/Appeal to Players","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/appeal-to-players/index.md","filePath":"garden/guide-to-incrementals/appeal-to-players/index.md","lastUpdated":1718069968000}'),n={name:"garden/guide-to-incrementals/appeal-to-players/index.md"},o=i("",28),s=[o];function r(l,h,m,g,d,c){return a(),t("div",null,s)}const y=e(n,[["render",r]]);export{u as __pageData,y as default}; +import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Guide to Incrementals/Appeal to Players","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/appeal-to-players","title":"Guide to Incrementals/Appeal to Players","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/appeal-to-players/index.md","filePath":"garden/guide-to-incrementals/appeal-to-players/index.md","lastUpdated":1717647948000}'),n={name:"garden/guide-to-incrementals/appeal-to-players/index.md"},o=i("",28),s=[o];function r(l,h,m,g,d,c){return a(),t("div",null,s)}const y=e(n,[["render",r]]);export{u as __pageData,y as default}; diff --git a/assets/garden_guide-to-incrementals_defining-the-genre_index.md.Cqr_5G2y.js b/assets/garden_guide-to-incrementals_defining-the-genre_index.md.B-EmqxPI.js similarity index 99% rename from assets/garden_guide-to-incrementals_defining-the-genre_index.md.Cqr_5G2y.js rename to assets/garden_guide-to-incrementals_defining-the-genre_index.md.B-EmqxPI.js index 78e7e80e..0beacbdc 100644 --- a/assets/garden_guide-to-incrementals_defining-the-genre_index.md.Cqr_5G2y.js +++ b/assets/garden_guide-to-incrementals_defining-the-genre_index.md.B-EmqxPI.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Guide to Incrementals/Defining the Genre","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/defining-the-genre","title":"Guide to Incrementals/Defining the Genre","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/defining-the-genre/index.md","filePath":"garden/guide-to-incrementals/defining-the-genre/index.md","lastUpdated":1718069968000}'),n={name:"garden/guide-to-incrementals/defining-the-genre/index.md"},o=r('

Guide to Incrementals/Defining the Genre

Video games are placed into genres for a variety of reasons. They can give a mental shorthand to set the player's expectations up, they can help a game market itself by its similarities to other, already popular games, and honestly, people just love categorization for its own sake. For this guide, it's important to define the genre so it is clear what games it's even talking about.

This poses a problem. "Incremental" is a horribly vague way to define games. Most games have numbers going up in some form or another. We need a more specific definition - similar to how "strategy" can't just mean any game with any amount of strategy because that would be most games. What specifically differentiates incremental games from the rest?

"Incremental" implies it's a genre defined by a game mechanic, but all those game mechanics it could imply exist in many other games. Having a skill tree or upgrades doesn't make you incremental, and if a reset mechanic is all it takes then every roguelite would be an incremental as well. So clearly there's more to it than that - what makes an incremental an incremental?

I'd like to go over a couple of popular suggestions I've seen on defining the genre here. I have my personal preferences and will state them here, but I don't think there's a truly perfect answer here.

Disclaimer: I mostly play incremental games on my computer, and my definitions will be heavily biased towards the games I'm familiar with.

Incrementals vs Idlers vs Clickers

Oftentimes people refer to this genre as idle games and/or clicker games. You'll even find a trend of oxymoronic game titles that contain both terms. "Incremental games" is the umbrella term both those terms fall under. However, I'd like to argue that not only is it better to just use the term "incremental games", but calling them "idle games" or "clicker games" is wrong. Almost universally, these terms are used interchangeably to refer to the same kind of game, where you start the game click spamming and eventually automate the process. Frankly, that kind of game deserves neither title, and the genre of incremental games has trended away from ever requiring click spamming, as it's a bad mechanic, anyways.

While these games do span a spectrum of how active it requires you to be, and sorting games by that metric can be useful for those looking for a particular experience, the borders of when an incremental game counts as an "idler" is too blurry for the term to be useful. "Incremental games" may not be a great descriptive term for the genre (hence this many thousands of words long page on defining what the genre even is), but it's strictly better than calling them "idler" or "clicker" games. This guide will always use the term "incremental games" unless quoting someone else, as it is the term you typically see on all modern games in the genre.

Incrementals as Parodies

Let's start with one of the most interesting definitions of incremental games. Incremental games appear to be distilled versions of games or genres, "revealing" the naked game design at the core of these games or genres not unlike how parodies comment upon their source material.

To understand what that means, think of how a casino uses skinner boxes to emotionally manipulate its customers to keep playing, but "dressing" up the skinner box with tons of stimuli to hide that ultimately the goal is to condition you into coming back compulsively. The idea that incremental games are parodies means taking the stance that at some level all games are similarly manipulating you, giving dopamine rewards in a way that manipulates you to keep playing while not necessarily giving you any value or fulfillment. Incremental games, then, are any games that plainly display the skinner box, and the manipulative core of the game, at the forefront of the experience.

While incremental games can be fun and even healthy in certain contexts, they can exacerbate video game addiction more than other genres. If you feel like playing incremental games is taking priority over other things in your life, or manipulating your sleep schedule, it may be prudent to seek help. See r/StopGaming for resources.

This "undressing" tends to go hand in hand with a reduced focus on aesthetics, often just printing the game state directly to the screen as text. This makes incremental games much easier to develop, particularly for those with programming skills but not art skills, but that's a tangent for why Incremental Games Guide to Incrementals/Appeal to Developers.

Before I continue, I'd like to make my stance clear that I love games and incremental games, and do not think they should be considered inherently bad or manipulative with the above logic. Skinner boxes are just a way of manipulating behavior via rewards. The games are still fun - that's the reward! I'd believe the real criticism here is that it is "empty fun", or "empty dopamine", that doesn't offer any additional value or sense of fulfillment. I don't think that's inherently bad in moderation, although it can become a problem if the game is manipulating you for profit-seeking, or if you play the game to the detriment of the other parts of your life.

Another interpretation of incremental games as parodies comes from several mainstream incremental games that are also parodies of capitalism, such as cookie clicker and adventure capitalist. It's a very common framework for incremental games to portray the ever-increasing numbers as an insatiable hunger for resources, like the ones observed within capitalism. Therefore, these games are used as evidence that the genre as a whole is about parody and commentary.

Popular videos on incremental games that portray the genre as parodies are Why Idle games make good satire, and how it was ruined. and Bad Game Design - Clicker Games. You may also be interested in this response to the latter video from a fan of incremental games: BadGood Game Design - Clicker Games.

I think that this definition ultimately ascribes a motive to the genre as a whole that only happens to apply to some of the more mainstream titles. There certainly are incremental games commenting on different things, including the genre itself as in the case of The Prestige Tree Classic, The Ascension Tree, or Omega Layers, but certainly not all. And of course, not all games that comment on something or parody something are incremental games! Additionally, a very large majority of incremental games are mobile games using these manipulative strategies to get players to spend as much money as possible - hell, Adventure Capitalist is ostensibly a critique on capitalism but features microtransactions and gameplay that manipulates you into buying them! These profit-seeking incremental games certainly belong within the genre but are hardly parodies when they too use manipulation to serve their interests. Also, from my own anecdotal experience, those who use this definition seem to do so from a fairly surface-level familiarity with the genre, and often in the context of criticizing the genre or the fans thereof.

Incrementals as NGU

Another broad definition often used is that incremental games are games where the focus of the game is "numbers going up". This definition proposes that other genres simply use increasing numbers as a means to an end, but incremental games uniquely only care about the numbers themselves going up. Put another way, it implies there should be no narrative justification for the numbers going up other than "why shouldn't they be going up?"

While this definition is common because it feels easy to understand, it is difficult to formally define. Often phrases are used to describe games using this framework, such as having an "exaggerated sense of progression" or "big" numbers. These terms are vague and don't demonstrate an actual threshold between non-incrementals and incrementals. Most games have a sense of progression, so when is it "exaggerated"? How big are "big" numbers? Most notably, RPGs that are typically not considered incrementals will often pass this definition.

Additionally, a lot of incrementals tend to have some theme guiding the gameplay, or at least the names of mechanics. This makes the line blurred between when numbers are going up for their own sake versus for a contextual reason. I believe this point is best illustrated that, while most RPGs are not considered incremental games, there is a sub-genre of "incremental RPGs" that typically relates to RPGs that perform combat automatically. This definition of incremental games does not support RPGs and "incremental RPGs" being on distinct sides of the line if the only difference between them is manual vs automatic combat.

Incrementals as Strategies

This is a rarer interpretation, but there are similarities between incremental games and strategy games, implying incrementals might just be a sub-genre of strategy games. By this approach, incremental games would be defined by their relation to strategy games, and how they involve player strategy. Incremental games are often large optimization problems - above all else, the actual gameplay the player is performing is deciding what to do next. The consequences of wrong decisions are typically more lenient in incremental games - such as just not making optimal progress - but they certainly get complex.

So if we accept the premise that incrementals could fall under strategy, we still need to define what makes a strategy game an incremental versus some other strategy sub-genre. This is a bit tricky due to one particular sub-genre of strategy games: Factory Builders.

Factory builders, such as Factorio or Satisfactory, are games about gaining ever increasing resources, optimizing production, and expanding more and more. That... sounds pretty similar, doesn't it? In fact, there's been some debate on whether factory builders would fall under the "incremental" umbrella. I think it's safe to say the two are certainly related, and probably have quite a bit of overlap in playerbase.

Roguelites as Incrementals?

Earlier on, I mentioned reset mechanics shouldn't be used in the definition because that could make all roguelites incrementals... But what if it does? A lot of incrementals can be described as games with a strong sense of progression, often with layers of meta-progression. Roguelites fit that bill to a T. What would make roguelites not incremental? I honestly don't think there's a good explanation here, but many fans of incremental games will state they do believe the two genres to be unrelated, even if there's a significant overlap between their player bases due to having similar appealing traits.

At this point, it'd be appropriate to consider what part of the definition of roguelites precludes them from also being incrementals, but that reveals a new problem: What are roguelites? They're usually defined as rogue_likes with meta-progression, but that just pushes the problem back a step: Incrementals aren't the only genre to have difficulties defining themselves, it seems! Roguelikes are another genre where the community argues over the formal definition of their genre, although that means we can borrow from their process of coming to a consensus, and maybe come across a viable definition for incremental games.

The Berlin Interpretation

By far the most popular way of defining roguelikes is the "Berlin Interpretation", which acknowledged the diversity of games within the genre and argued the definition should not be based on any ideals about what the genre ought to be, but rather defined by "its canon". They argued there are a handful of games that can be used to define the canon for roguelikes, and from those games, a list of factors can be derived to determine a game's "roguelikeness". The more factors a game has, the more of a roguelike it is. This strategy is very lenient, allowing a game to not present any specific factor so long as it shows enough, and accounts for the blurriness of any genre definition by not explicitly stating how many factors a game must have to qualify as a definite roguelike.

I believe this strategy for defining genres can be applied to other genres as well. A handful of games can be argued to be the incremental games canon, and a list of factors derived from them can be used to judge any game based on its "incrementalness". I'll propose such a canon and list of factors here, but by no means should it be considered the end-all-be-all.

Note: The "Temple of the roguelike", an authority within the genre, has since replaced the Berlin Interpretation with a new set of factors here: https://blog.roguetemple.com/what-is-a-traditional-roguelike/

The Incremental Games Canon

Alright, time to get controversial. Up til now, I've been trying my best to stay objective and analytical, but now it's time to start making some opinionated decisions. Here is a list of games I think could justifiably make up an Incremental Games Canon:

I chose a variety of games here, biasing towards newer games, purposefully to avoid making a narrow or "traditional" definition. The genre is growing and shouldn't be constrained by the traits of the early popular titles. A lot of these could easily be replaced with other games that are mechanically congruent, so ultimately I'm sure if you asked 10 people for their canon list you'd just get 10 different answers, but I think this should sufficiently allow us to determine what factors make a game have higher "incrementalness".

The Paradigm Shift

The Paradigm Shift is probably the highest possible value factor for an incremental. It's so common that for a while people referred to incrementals that exhibit this trait as "unfolding" games, to the point of trying to replace the term incremental due to their popularity. Paradigm shifts refer to when the gameplay significantly changes. There are too many examples to list here, but notably, every single reset mechanic is typically going to be a paradigm shift. Examples of games with paradigm shifts that aren't tied to reset mechanics include Universal Paperclips and A Dark Room.

There are many reasons for the appeal of paradigm shifts. Oftentimes each mechanic builds on top of the existing mechanics, increasing the complexity of the game in steps so the player can follow along. They provide a sense of mystery, with the player anticipating what will happen next. They shake up the gameplay before it gets too stale - allowing the game to entertain for longer before the sense of Guide to Incrementals/What is Content? dissipates. Of the canon games selected above, I would argue every single one contains a paradigm shift (although I could see someone disagreeing with that statement wrt Increlution).

I should take a moment to say that while I'm hyping up this specific factor, we cannot just reduce the genre definition to "does it have paradigm shifts". Many games have paradigm shifts that are not incremental, so it's just an indicator of incrementalness. Additionally, it can become quite hard to determine how large of a shift is a "paradigm" shift. Take, for example, any game with a skill tree. In some games, each skill node might have a large impact on how you play with the game, and qualify as a paradigm shift for some players. In other games, each skill node might just be a small percentage modifier on some stat that doesn't really impact much more than a slight bias towards an already established mechanic that's newly buffed. Every single canon game may show that it's common amongst incremental games, but could just as easily indicate that they're common in games in general.

High-Value Factors

I won't take as long to discuss the high and low-value factors, as you've already seen most of them brought up earlier on this page. As a reminder, a game does NOT need all of these to be an incremental game, but these are factors that each indicate a strong possibility the game is an incremental, so having several of these means they probably are. These factors apply to most of the canon incremental games.

"Pure UI" Display. Incrementals typically have a textual presentation of the game state - there isn't a visual representation of the entities within the game. The interface is closer to what would be just the UI of a game in another genre or the control panel of a plane. If there is a visual representation, the player is often still interacting with non-diegetic game elements.

Reduced Consequences. Incrementals tend to have reduced repurcussions for misplaying. They very rarely have fail states, where often the largest consequence is simply not progressing - never losing progress.

Optimization Problems. The predominant gameplay of incrementals is typically solving optimization problems, from deciding which purchase to save up for to reasoning and deciding between different mutually exclusive options the game presents.

Resource Management. Incrementals tend to have a lot of resources within the game to keep track of.

Low-Value Factors

These are low-value factors, meaning they aren't as strongly correlated with incremental games. Incremental games may have none of these, and non-incrementals may have several of these - if a game only has low-value factors, they're probably not an incremental.

Fast Numeric Growth. Numbers in incremental games tend to grow faster than in other genres. There are more instances of superlinear growth. The larger the numbers get, the stronger of a signal this factor is.

Automation. As an incremental game progresses, the player often no longer has to deal with earlier mechanics, by having them either happen automatically or otherwise be replaced with an alternative that requires less player interaction.

Goal-Oriented. Incrementals are often heavily reliant on extrinsic motivation to guide the player. Typically this is through some sort of in-game goal to work towards, such as a certain amount of a resource being required to unlock or purchase something new.

Waiting is a Mechanic. In incremental games, the player may come across times where there is no action they can take, and the game will progress automatically instead. The player must wait for some amount of this automatic progress to occur before they can resume interaction with the game.

Are Roguelites Incrementals?

Having made our variation of the Berlin Interpretation for incremental games, we can compare it to the Berlin Interpretation to determine if there's enough overlap that any game that "passes" the Berlin Interpretation would also pass the incremental variant. That is to say, whether any roguelite would also be considered an incremental game.

The meta-progression of an incremental game could arguably be considered a paradigm shift, and certainly adds some resource management. Goal-oriented would probably also apply. I think anything other than those would be a stretch, and in my opinion that just isn't enough to qualify. To be totally honest, I was never expecting to conclude otherwise though 😉

Sub-Genres

There are some trends in incremental games that go beyond just being a commonly used mechanic, such that they deeply affect the rest of the game design. These trends can be used to determine sub-genres within the incremental games umbrella:

Loops games are a sub-genre defined by having a core mechanic related to a loop, where the player is deciding the actions taken per loop. Notable examples include Idle Loops, Stuck in Time, Cavernous II, and Increlution. You may also argue Groundhog Life and Progress Knight fall into this sub-genre.

ITRTG-like games are a sub-genre defined by having a core mechanic based on clearing increasingly difficult battles and often tend to have a lot of different mechanics to become progressively stronger. Notable examples include Idling to Rule the Gods, NGU Idle, and Wizard and Minion Idle.

Polynomial Growth games are a sub-genre defined by having a core mechanic related to a higher degree polynomial. Notable examples include the base layer of Antimatter Dimensions and Swarm Simulator.

Upgrades Games is a category popular on flash games websites that featured games focused on buying upgrades that would allow you to attain more currency in some sort of minigame that would earn you more money to buy more upgrades, which I'd argue now belong under the fold of incremental games. Notable examples include the Learn to Fly series and Upgrade Complete.

Cultivation RPGs are a genre of games, books, and anime popular in China that center around being in a fantasy world with characters getting stronger over time. While few of them get translated into English, a fan of incremental games may find the available games interesting.

',64),i=[o];function s(l,h,m,g,c,u){return a(),t("div",null,i)}const f=e(n,[["render",s]]);export{p as __pageData,f as default}; +import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Guide to Incrementals/Defining the Genre","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/defining-the-genre","title":"Guide to Incrementals/Defining the Genre","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/defining-the-genre/index.md","filePath":"garden/guide-to-incrementals/defining-the-genre/index.md","lastUpdated":1717647948000}'),n={name:"garden/guide-to-incrementals/defining-the-genre/index.md"},o=r('

Guide to Incrementals/Defining the Genre

Video games are placed into genres for a variety of reasons. They can give a mental shorthand to set the player's expectations up, they can help a game market itself by its similarities to other, already popular games, and honestly, people just love categorization for its own sake. For this guide, it's important to define the genre so it is clear what games it's even talking about.

This poses a problem. "Incremental" is a horribly vague way to define games. Most games have numbers going up in some form or another. We need a more specific definition - similar to how "strategy" can't just mean any game with any amount of strategy because that would be most games. What specifically differentiates incremental games from the rest?

"Incremental" implies it's a genre defined by a game mechanic, but all those game mechanics it could imply exist in many other games. Having a skill tree or upgrades doesn't make you incremental, and if a reset mechanic is all it takes then every roguelite would be an incremental as well. So clearly there's more to it than that - what makes an incremental an incremental?

I'd like to go over a couple of popular suggestions I've seen on defining the genre here. I have my personal preferences and will state them here, but I don't think there's a truly perfect answer here.

Disclaimer: I mostly play incremental games on my computer, and my definitions will be heavily biased towards the games I'm familiar with.

Incrementals vs Idlers vs Clickers

Oftentimes people refer to this genre as idle games and/or clicker games. You'll even find a trend of oxymoronic game titles that contain both terms. "Incremental games" is the umbrella term both those terms fall under. However, I'd like to argue that not only is it better to just use the term "incremental games", but calling them "idle games" or "clicker games" is wrong. Almost universally, these terms are used interchangeably to refer to the same kind of game, where you start the game click spamming and eventually automate the process. Frankly, that kind of game deserves neither title, and the genre of incremental games has trended away from ever requiring click spamming, as it's a bad mechanic, anyways.

While these games do span a spectrum of how active it requires you to be, and sorting games by that metric can be useful for those looking for a particular experience, the borders of when an incremental game counts as an "idler" is too blurry for the term to be useful. "Incremental games" may not be a great descriptive term for the genre (hence this many thousands of words long page on defining what the genre even is), but it's strictly better than calling them "idler" or "clicker" games. This guide will always use the term "incremental games" unless quoting someone else, as it is the term you typically see on all modern games in the genre.

Incrementals as Parodies

Let's start with one of the most interesting definitions of incremental games. Incremental games appear to be distilled versions of games or genres, "revealing" the naked game design at the core of these games or genres not unlike how parodies comment upon their source material.

To understand what that means, think of how a casino uses skinner boxes to emotionally manipulate its customers to keep playing, but "dressing" up the skinner box with tons of stimuli to hide that ultimately the goal is to condition you into coming back compulsively. The idea that incremental games are parodies means taking the stance that at some level all games are similarly manipulating you, giving dopamine rewards in a way that manipulates you to keep playing while not necessarily giving you any value or fulfillment. Incremental games, then, are any games that plainly display the skinner box, and the manipulative core of the game, at the forefront of the experience.

While incremental games can be fun and even healthy in certain contexts, they can exacerbate video game addiction more than other genres. If you feel like playing incremental games is taking priority over other things in your life, or manipulating your sleep schedule, it may be prudent to seek help. See r/StopGaming for resources.

This "undressing" tends to go hand in hand with a reduced focus on aesthetics, often just printing the game state directly to the screen as text. This makes incremental games much easier to develop, particularly for those with programming skills but not art skills, but that's a tangent for why Incremental Games Guide to Incrementals/Appeal to Developers.

Before I continue, I'd like to make my stance clear that I love games and incremental games, and do not think they should be considered inherently bad or manipulative with the above logic. Skinner boxes are just a way of manipulating behavior via rewards. The games are still fun - that's the reward! I'd believe the real criticism here is that it is "empty fun", or "empty dopamine", that doesn't offer any additional value or sense of fulfillment. I don't think that's inherently bad in moderation, although it can become a problem if the game is manipulating you for profit-seeking, or if you play the game to the detriment of the other parts of your life.

Another interpretation of incremental games as parodies comes from several mainstream incremental games that are also parodies of capitalism, such as cookie clicker and adventure capitalist. It's a very common framework for incremental games to portray the ever-increasing numbers as an insatiable hunger for resources, like the ones observed within capitalism. Therefore, these games are used as evidence that the genre as a whole is about parody and commentary.

Popular videos on incremental games that portray the genre as parodies are Why Idle games make good satire, and how it was ruined. and Bad Game Design - Clicker Games. You may also be interested in this response to the latter video from a fan of incremental games: BadGood Game Design - Clicker Games.

I think that this definition ultimately ascribes a motive to the genre as a whole that only happens to apply to some of the more mainstream titles. There certainly are incremental games commenting on different things, including the genre itself as in the case of The Prestige Tree Classic, The Ascension Tree, or Omega Layers, but certainly not all. And of course, not all games that comment on something or parody something are incremental games! Additionally, a very large majority of incremental games are mobile games using these manipulative strategies to get players to spend as much money as possible - hell, Adventure Capitalist is ostensibly a critique on capitalism but features microtransactions and gameplay that manipulates you into buying them! These profit-seeking incremental games certainly belong within the genre but are hardly parodies when they too use manipulation to serve their interests. Also, from my own anecdotal experience, those who use this definition seem to do so from a fairly surface-level familiarity with the genre, and often in the context of criticizing the genre or the fans thereof.

Incrementals as NGU

Another broad definition often used is that incremental games are games where the focus of the game is "numbers going up". This definition proposes that other genres simply use increasing numbers as a means to an end, but incremental games uniquely only care about the numbers themselves going up. Put another way, it implies there should be no narrative justification for the numbers going up other than "why shouldn't they be going up?"

While this definition is common because it feels easy to understand, it is difficult to formally define. Often phrases are used to describe games using this framework, such as having an "exaggerated sense of progression" or "big" numbers. These terms are vague and don't demonstrate an actual threshold between non-incrementals and incrementals. Most games have a sense of progression, so when is it "exaggerated"? How big are "big" numbers? Most notably, RPGs that are typically not considered incrementals will often pass this definition.

Additionally, a lot of incrementals tend to have some theme guiding the gameplay, or at least the names of mechanics. This makes the line blurred between when numbers are going up for their own sake versus for a contextual reason. I believe this point is best illustrated that, while most RPGs are not considered incremental games, there is a sub-genre of "incremental RPGs" that typically relates to RPGs that perform combat automatically. This definition of incremental games does not support RPGs and "incremental RPGs" being on distinct sides of the line if the only difference between them is manual vs automatic combat.

Incrementals as Strategies

This is a rarer interpretation, but there are similarities between incremental games and strategy games, implying incrementals might just be a sub-genre of strategy games. By this approach, incremental games would be defined by their relation to strategy games, and how they involve player strategy. Incremental games are often large optimization problems - above all else, the actual gameplay the player is performing is deciding what to do next. The consequences of wrong decisions are typically more lenient in incremental games - such as just not making optimal progress - but they certainly get complex.

So if we accept the premise that incrementals could fall under strategy, we still need to define what makes a strategy game an incremental versus some other strategy sub-genre. This is a bit tricky due to one particular sub-genre of strategy games: Factory Builders.

Factory builders, such as Factorio or Satisfactory, are games about gaining ever increasing resources, optimizing production, and expanding more and more. That... sounds pretty similar, doesn't it? In fact, there's been some debate on whether factory builders would fall under the "incremental" umbrella. I think it's safe to say the two are certainly related, and probably have quite a bit of overlap in playerbase.

Roguelites as Incrementals?

Earlier on, I mentioned reset mechanics shouldn't be used in the definition because that could make all roguelites incrementals... But what if it does? A lot of incrementals can be described as games with a strong sense of progression, often with layers of meta-progression. Roguelites fit that bill to a T. What would make roguelites not incremental? I honestly don't think there's a good explanation here, but many fans of incremental games will state they do believe the two genres to be unrelated, even if there's a significant overlap between their player bases due to having similar appealing traits.

At this point, it'd be appropriate to consider what part of the definition of roguelites precludes them from also being incrementals, but that reveals a new problem: What are roguelites? They're usually defined as rogue_likes with meta-progression, but that just pushes the problem back a step: Incrementals aren't the only genre to have difficulties defining themselves, it seems! Roguelikes are another genre where the community argues over the formal definition of their genre, although that means we can borrow from their process of coming to a consensus, and maybe come across a viable definition for incremental games.

The Berlin Interpretation

By far the most popular way of defining roguelikes is the "Berlin Interpretation", which acknowledged the diversity of games within the genre and argued the definition should not be based on any ideals about what the genre ought to be, but rather defined by "its canon". They argued there are a handful of games that can be used to define the canon for roguelikes, and from those games, a list of factors can be derived to determine a game's "roguelikeness". The more factors a game has, the more of a roguelike it is. This strategy is very lenient, allowing a game to not present any specific factor so long as it shows enough, and accounts for the blurriness of any genre definition by not explicitly stating how many factors a game must have to qualify as a definite roguelike.

I believe this strategy for defining genres can be applied to other genres as well. A handful of games can be argued to be the incremental games canon, and a list of factors derived from them can be used to judge any game based on its "incrementalness". I'll propose such a canon and list of factors here, but by no means should it be considered the end-all-be-all.

Note: The "Temple of the roguelike", an authority within the genre, has since replaced the Berlin Interpretation with a new set of factors here: https://blog.roguetemple.com/what-is-a-traditional-roguelike/

The Incremental Games Canon

Alright, time to get controversial. Up til now, I've been trying my best to stay objective and analytical, but now it's time to start making some opinionated decisions. Here is a list of games I think could justifiably make up an Incremental Games Canon:

I chose a variety of games here, biasing towards newer games, purposefully to avoid making a narrow or "traditional" definition. The genre is growing and shouldn't be constrained by the traits of the early popular titles. A lot of these could easily be replaced with other games that are mechanically congruent, so ultimately I'm sure if you asked 10 people for their canon list you'd just get 10 different answers, but I think this should sufficiently allow us to determine what factors make a game have higher "incrementalness".

The Paradigm Shift

The Paradigm Shift is probably the highest possible value factor for an incremental. It's so common that for a while people referred to incrementals that exhibit this trait as "unfolding" games, to the point of trying to replace the term incremental due to their popularity. Paradigm shifts refer to when the gameplay significantly changes. There are too many examples to list here, but notably, every single reset mechanic is typically going to be a paradigm shift. Examples of games with paradigm shifts that aren't tied to reset mechanics include Universal Paperclips and A Dark Room.

There are many reasons for the appeal of paradigm shifts. Oftentimes each mechanic builds on top of the existing mechanics, increasing the complexity of the game in steps so the player can follow along. They provide a sense of mystery, with the player anticipating what will happen next. They shake up the gameplay before it gets too stale - allowing the game to entertain for longer before the sense of Guide to Incrementals/What is Content? dissipates. Of the canon games selected above, I would argue every single one contains a paradigm shift (although I could see someone disagreeing with that statement wrt Increlution).

I should take a moment to say that while I'm hyping up this specific factor, we cannot just reduce the genre definition to "does it have paradigm shifts". Many games have paradigm shifts that are not incremental, so it's just an indicator of incrementalness. Additionally, it can become quite hard to determine how large of a shift is a "paradigm" shift. Take, for example, any game with a skill tree. In some games, each skill node might have a large impact on how you play with the game, and qualify as a paradigm shift for some players. In other games, each skill node might just be a small percentage modifier on some stat that doesn't really impact much more than a slight bias towards an already established mechanic that's newly buffed. Every single canon game may show that it's common amongst incremental games, but could just as easily indicate that they're common in games in general.

High-Value Factors

I won't take as long to discuss the high and low-value factors, as you've already seen most of them brought up earlier on this page. As a reminder, a game does NOT need all of these to be an incremental game, but these are factors that each indicate a strong possibility the game is an incremental, so having several of these means they probably are. These factors apply to most of the canon incremental games.

"Pure UI" Display. Incrementals typically have a textual presentation of the game state - there isn't a visual representation of the entities within the game. The interface is closer to what would be just the UI of a game in another genre or the control panel of a plane. If there is a visual representation, the player is often still interacting with non-diegetic game elements.

Reduced Consequences. Incrementals tend to have reduced repurcussions for misplaying. They very rarely have fail states, where often the largest consequence is simply not progressing - never losing progress.

Optimization Problems. The predominant gameplay of incrementals is typically solving optimization problems, from deciding which purchase to save up for to reasoning and deciding between different mutually exclusive options the game presents.

Resource Management. Incrementals tend to have a lot of resources within the game to keep track of.

Low-Value Factors

These are low-value factors, meaning they aren't as strongly correlated with incremental games. Incremental games may have none of these, and non-incrementals may have several of these - if a game only has low-value factors, they're probably not an incremental.

Fast Numeric Growth. Numbers in incremental games tend to grow faster than in other genres. There are more instances of superlinear growth. The larger the numbers get, the stronger of a signal this factor is.

Automation. As an incremental game progresses, the player often no longer has to deal with earlier mechanics, by having them either happen automatically or otherwise be replaced with an alternative that requires less player interaction.

Goal-Oriented. Incrementals are often heavily reliant on extrinsic motivation to guide the player. Typically this is through some sort of in-game goal to work towards, such as a certain amount of a resource being required to unlock or purchase something new.

Waiting is a Mechanic. In incremental games, the player may come across times where there is no action they can take, and the game will progress automatically instead. The player must wait for some amount of this automatic progress to occur before they can resume interaction with the game.

Are Roguelites Incrementals?

Having made our variation of the Berlin Interpretation for incremental games, we can compare it to the Berlin Interpretation to determine if there's enough overlap that any game that "passes" the Berlin Interpretation would also pass the incremental variant. That is to say, whether any roguelite would also be considered an incremental game.

The meta-progression of an incremental game could arguably be considered a paradigm shift, and certainly adds some resource management. Goal-oriented would probably also apply. I think anything other than those would be a stretch, and in my opinion that just isn't enough to qualify. To be totally honest, I was never expecting to conclude otherwise though 😉

Sub-Genres

There are some trends in incremental games that go beyond just being a commonly used mechanic, such that they deeply affect the rest of the game design. These trends can be used to determine sub-genres within the incremental games umbrella:

Loops games are a sub-genre defined by having a core mechanic related to a loop, where the player is deciding the actions taken per loop. Notable examples include Idle Loops, Stuck in Time, Cavernous II, and Increlution. You may also argue Groundhog Life and Progress Knight fall into this sub-genre.

ITRTG-like games are a sub-genre defined by having a core mechanic based on clearing increasingly difficult battles and often tend to have a lot of different mechanics to become progressively stronger. Notable examples include Idling to Rule the Gods, NGU Idle, and Wizard and Minion Idle.

Polynomial Growth games are a sub-genre defined by having a core mechanic related to a higher degree polynomial. Notable examples include the base layer of Antimatter Dimensions and Swarm Simulator.

Upgrades Games is a category popular on flash games websites that featured games focused on buying upgrades that would allow you to attain more currency in some sort of minigame that would earn you more money to buy more upgrades, which I'd argue now belong under the fold of incremental games. Notable examples include the Learn to Fly series and Upgrade Complete.

Cultivation RPGs are a genre of games, books, and anime popular in China that center around being in a fantasy world with characters getting stronger over time. While few of them get translated into English, a fan of incremental games may find the available games interesting.

',64),i=[o];function s(l,h,m,g,c,u){return a(),t("div",null,i)}const f=e(n,[["render",s]]);export{p as __pageData,f as default}; diff --git a/assets/garden_guide-to-incrementals_defining-the-genre_index.md.Cqr_5G2y.lean.js b/assets/garden_guide-to-incrementals_defining-the-genre_index.md.B-EmqxPI.lean.js similarity index 90% rename from assets/garden_guide-to-incrementals_defining-the-genre_index.md.Cqr_5G2y.lean.js rename to assets/garden_guide-to-incrementals_defining-the-genre_index.md.B-EmqxPI.lean.js index 121bfba2..94ec8da1 100644 --- a/assets/garden_guide-to-incrementals_defining-the-genre_index.md.Cqr_5G2y.lean.js +++ b/assets/garden_guide-to-incrementals_defining-the-genre_index.md.B-EmqxPI.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Guide to Incrementals/Defining the Genre","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/defining-the-genre","title":"Guide to Incrementals/Defining the Genre","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/defining-the-genre/index.md","filePath":"garden/guide-to-incrementals/defining-the-genre/index.md","lastUpdated":1718069968000}'),n={name:"garden/guide-to-incrementals/defining-the-genre/index.md"},o=r("",64),i=[o];function s(l,h,m,g,c,u){return a(),t("div",null,i)}const f=e(n,[["render",s]]);export{p as __pageData,f as default}; +import{_ as e,c as t,o as a,a9 as r}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Guide to Incrementals/Defining the Genre","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/defining-the-genre","title":"Guide to Incrementals/Defining the Genre","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/defining-the-genre/index.md","filePath":"garden/guide-to-incrementals/defining-the-genre/index.md","lastUpdated":1717647948000}'),n={name:"garden/guide-to-incrementals/defining-the-genre/index.md"},o=r("",64),i=[o];function s(l,h,m,g,c,u){return a(),t("div",null,i)}const f=e(n,[["render",s]]);export{p as __pageData,f as default}; diff --git a/assets/garden_guide-to-incrementals_index.md.CnQL84i-.js b/assets/garden_guide-to-incrementals_index.md.D-Qo_phb.js similarity index 98% rename from assets/garden_guide-to-incrementals_index.md.CnQL84i-.js rename to assets/garden_guide-to-incrementals_index.md.D-Qo_phb.js index 73c6c824..0c134543 100644 --- a/assets/garden_guide-to-incrementals_index.md.CnQL84i-.js +++ b/assets/garden_guide-to-incrementals_index.md.D-Qo_phb.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as n}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Guide to Incrementals","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals","title":"Guide to Incrementals","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/index.md","filePath":"garden/guide-to-incrementals/index.md","lastUpdated":1718069968000}'),i={name:"garden/guide-to-incrementals/index.md"},o=n('

Guide to Incrementals

This is a comprehensive guide to Incremental Games, a genre of video games. It will explore defining the genre, why it's appealing, and how to design and build your own incremental game. Along the way will be interactive examples, snippets from other creators, and relevant material to contextualize everything.

Note: This is an incomplete document. I want to keep adding opinions and opposing views from other incremental games developers, and add interactive examples to illustrate various points regarding game design and balancing. Consider this a living document - and see the changelog at the end.

Note: This was made before my switch to a digital garden, and is written as prose. Hope you don't mind!

Why am I making this?

That's a good question! What authority do I have to be making this guide? I haven't made the best incremental games, nor the most incremental games, certainly not the most popular ones either. But I do have some formal education in game development, know a lot of incremental game devs (as well as other game devs), and have a passionate interest in ludology, classifying genres, etc. I've also made a couple of incremental games) myself.

If you have any additional questions about my credentials or anything on this site, feel free to reach out!

Ludology

Making an Incremental

',11),r=[o];function l(s,d,m,c,g,h){return t(),a("div",null,r)}const f=e(i,[["render",l]]);export{p as __pageData,f as default}; +import{_ as e,c as a,o as t,a9 as n}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Guide to Incrementals","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals","title":"Guide to Incrementals","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/index.md","filePath":"garden/guide-to-incrementals/index.md","lastUpdated":1717647948000}'),i={name:"garden/guide-to-incrementals/index.md"},o=n('

Guide to Incrementals

This is a comprehensive guide to Incremental Games, a genre of video games. It will explore defining the genre, why it's appealing, and how to design and build your own incremental game. Along the way will be interactive examples, snippets from other creators, and relevant material to contextualize everything.

Note: This is an incomplete document. I want to keep adding opinions and opposing views from other incremental games developers, and add interactive examples to illustrate various points regarding game design and balancing. Consider this a living document - and see the changelog at the end.

Note: This was made before my switch to a digital garden, and is written as prose. Hope you don't mind!

Why am I making this?

That's a good question! What authority do I have to be making this guide? I haven't made the best incremental games, nor the most incremental games, certainly not the most popular ones either. But I do have some formal education in game development, know a lot of incremental game devs (as well as other game devs), and have a passionate interest in ludology, classifying genres, etc. I've also made a couple of incremental games) myself.

If you have any additional questions about my credentials or anything on this site, feel free to reach out!

Ludology

Making an Incremental

',11),r=[o];function l(s,d,m,c,g,h){return t(),a("div",null,r)}const f=e(i,[["render",l]]);export{p as __pageData,f as default}; diff --git a/assets/garden_guide-to-incrementals_index.md.CnQL84i-.lean.js b/assets/garden_guide-to-incrementals_index.md.D-Qo_phb.lean.js similarity index 89% rename from assets/garden_guide-to-incrementals_index.md.CnQL84i-.lean.js rename to assets/garden_guide-to-incrementals_index.md.D-Qo_phb.lean.js index 00d50419..0e03e1da 100644 --- a/assets/garden_guide-to-incrementals_index.md.CnQL84i-.lean.js +++ b/assets/garden_guide-to-incrementals_index.md.D-Qo_phb.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as n}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Guide to Incrementals","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals","title":"Guide to Incrementals","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/index.md","filePath":"garden/guide-to-incrementals/index.md","lastUpdated":1718069968000}'),i={name:"garden/guide-to-incrementals/index.md"},o=n("",11),r=[o];function l(s,d,m,c,g,h){return t(),a("div",null,r)}const f=e(i,[["render",l]]);export{p as __pageData,f as default}; +import{_ as e,c as a,o as t,a9 as n}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Guide to Incrementals","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals","title":"Guide to Incrementals","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/index.md","filePath":"garden/guide-to-incrementals/index.md","lastUpdated":1717647948000}'),i={name:"garden/guide-to-incrementals/index.md"},o=n("",11),r=[o];function l(s,d,m,c,g,h){return t(),a("div",null,r)}const f=e(i,[["render",l]]);export{p as __pageData,f as default}; diff --git a/assets/garden_guide-to-incrementals_navigating-criticism_index.md.4aLxw7wS.js b/assets/garden_guide-to-incrementals_navigating-criticism_index.md.Djt_EVT5.js similarity index 98% rename from assets/garden_guide-to-incrementals_navigating-criticism_index.md.4aLxw7wS.js rename to assets/garden_guide-to-incrementals_navigating-criticism_index.md.Djt_EVT5.js index ec996dff..912cfd6d 100644 --- a/assets/garden_guide-to-incrementals_navigating-criticism_index.md.4aLxw7wS.js +++ b/assets/garden_guide-to-incrementals_navigating-criticism_index.md.Djt_EVT5.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Guide to Incrementals/Navigating Criticism","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/navigating-criticism","title":"Guide to Incrementals/Navigating Criticism","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/navigating-criticism/index.md","filePath":"garden/guide-to-incrementals/navigating-criticism/index.md","lastUpdated":1718069968000}'),n={name:"garden/guide-to-incrementals/navigating-criticism/index.md"},o=i('

Guide to Incrementals/Navigating Criticism

Developing games is fun and exciting and teaches a lot of wonderful skills - I enthusiastically encourage anyone with an interest in game development to try it out - and incremental games are a wonderful way to get started. However, there are many challenges young and inexperienced developers have to face, and I think the hardest one - harder than coding, debugging, balancing, etc. - is handling criticism. When you put your heart and soul into a game it is natural to feel very vulnerable. While I think there's a lot communities can do to ensure they're welcoming, positive and constructive with their criticisms, inevitably you will eventually read some, and potentially a lot, of comments that can deeply affect you. No one is immune to this, from young incremental game developers to the largest content creators you can think of. That's why it's important to be able to process and navigate criticism, because ultimately collecting feedback is essential to the journey to becoming a better developer. On this page, we'll explore how to embrace criticism, grow from it, and continue to post your games publicly with confidence.

Reading Feedback

Game development is a skill that takes time and practice to get truly great at. Criticism and other constructive feedback are vital to continually improving. It's useful to look at the criticism as solely a tool for improving this game and future games - that is to say, it should never be used against you as a person. Insults towards the developer(s) themselves are never okay and should not be allowed within whatever community you're sharing your works in. If you do come across a comment you interpret as an attack upon your person, you should report it. For other negative comments, try not to internalize them; instead, focus on improving the game. By distancing your own identity from your work emotionally, you can better analyze the game and use the feedback to your advantage.

Not all feedback is made equal, and you don't need to feel compelled to read and obey every piece of feedback you receive. Learn to distinguish between constructive feedback and unhelpful comments. Constructive feedback typically offers specific suggestions for improvement, while unhelpful comments are often vague or hurtful. Prioritize the former and disregard the latter. That said, most feedback you get will not be from game developers, so take specific suggestions with a grain of salt. Determine the actual problem they're experiencing, and design what you believe the best solution to that problem would be, regardless if that's the specific solution the player asked for. And keep in mind, due to different player preferences you'll never satisfy everyone, and you don't need to. Ultimately if even just you find the game fun, then that's a success.

Seeking Feedback

When deciding where to share your game, consider the type of players you anticipate getting, and the kind of feedback you can anticipate receiving. Different communities will have different levels of support for learning developers, and certain communities may prefer certain types of games or mechanics. It's important to get a diverse set of feedback focused on players you think will enjoy the specific game you're making.

Collecting feedback from other game developers is incredibly helpful. They've trained themselves to recognize good and bad game design and how to articulate the differences, and from my experience are much more likely to leave positive and constructive comments since they've been in your shoes before! They understand the struggles and can offer guidance and emotional support.

Responding to Feedback

Negative feedback can naturally feel like an attack, and it's okay to get angry. However, lashing back is never the appropriate response. It's best to cool off IRL, and keep in mind all the positive comments you've received. There's a concept in Psychology called negative bias that explains how negative feedback tends to stick with us much more prominently than positive feedback, so it's useful to regularly remind yourself of all the positive feedback you've received. Celebrate your successes, no matter how small they may seem - getting a game to a state you can publicly share it with people is an accomplishment in and of itself!

Remember your passion and your initial reasons for getting into game development. The journey will have its ups and downs, but staying true to your vision and passion will keep you motivated.

',11),r=[o];function s(c,l,d,u,m,h){return a(),t("div",null,r)}const f=e(n,[["render",s]]);export{p as __pageData,f as default}; +import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Guide to Incrementals/Navigating Criticism","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/navigating-criticism","title":"Guide to Incrementals/Navigating Criticism","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/navigating-criticism/index.md","filePath":"garden/guide-to-incrementals/navigating-criticism/index.md","lastUpdated":1717647948000}'),n={name:"garden/guide-to-incrementals/navigating-criticism/index.md"},o=i('

Guide to Incrementals/Navigating Criticism

Developing games is fun and exciting and teaches a lot of wonderful skills - I enthusiastically encourage anyone with an interest in game development to try it out - and incremental games are a wonderful way to get started. However, there are many challenges young and inexperienced developers have to face, and I think the hardest one - harder than coding, debugging, balancing, etc. - is handling criticism. When you put your heart and soul into a game it is natural to feel very vulnerable. While I think there's a lot communities can do to ensure they're welcoming, positive and constructive with their criticisms, inevitably you will eventually read some, and potentially a lot, of comments that can deeply affect you. No one is immune to this, from young incremental game developers to the largest content creators you can think of. That's why it's important to be able to process and navigate criticism, because ultimately collecting feedback is essential to the journey to becoming a better developer. On this page, we'll explore how to embrace criticism, grow from it, and continue to post your games publicly with confidence.

Reading Feedback

Game development is a skill that takes time and practice to get truly great at. Criticism and other constructive feedback are vital to continually improving. It's useful to look at the criticism as solely a tool for improving this game and future games - that is to say, it should never be used against you as a person. Insults towards the developer(s) themselves are never okay and should not be allowed within whatever community you're sharing your works in. If you do come across a comment you interpret as an attack upon your person, you should report it. For other negative comments, try not to internalize them; instead, focus on improving the game. By distancing your own identity from your work emotionally, you can better analyze the game and use the feedback to your advantage.

Not all feedback is made equal, and you don't need to feel compelled to read and obey every piece of feedback you receive. Learn to distinguish between constructive feedback and unhelpful comments. Constructive feedback typically offers specific suggestions for improvement, while unhelpful comments are often vague or hurtful. Prioritize the former and disregard the latter. That said, most feedback you get will not be from game developers, so take specific suggestions with a grain of salt. Determine the actual problem they're experiencing, and design what you believe the best solution to that problem would be, regardless if that's the specific solution the player asked for. And keep in mind, due to different player preferences you'll never satisfy everyone, and you don't need to. Ultimately if even just you find the game fun, then that's a success.

Seeking Feedback

When deciding where to share your game, consider the type of players you anticipate getting, and the kind of feedback you can anticipate receiving. Different communities will have different levels of support for learning developers, and certain communities may prefer certain types of games or mechanics. It's important to get a diverse set of feedback focused on players you think will enjoy the specific game you're making.

Collecting feedback from other game developers is incredibly helpful. They've trained themselves to recognize good and bad game design and how to articulate the differences, and from my experience are much more likely to leave positive and constructive comments since they've been in your shoes before! They understand the struggles and can offer guidance and emotional support.

Responding to Feedback

Negative feedback can naturally feel like an attack, and it's okay to get angry. However, lashing back is never the appropriate response. It's best to cool off IRL, and keep in mind all the positive comments you've received. There's a concept in Psychology called negative bias that explains how negative feedback tends to stick with us much more prominently than positive feedback, so it's useful to regularly remind yourself of all the positive feedback you've received. Celebrate your successes, no matter how small they may seem - getting a game to a state you can publicly share it with people is an accomplishment in and of itself!

Remember your passion and your initial reasons for getting into game development. The journey will have its ups and downs, but staying true to your vision and passion will keep you motivated.

',11),r=[o];function s(c,l,d,u,m,h){return a(),t("div",null,r)}const f=e(n,[["render",s]]);export{p as __pageData,f as default}; diff --git a/assets/garden_guide-to-incrementals_navigating-criticism_index.md.4aLxw7wS.lean.js b/assets/garden_guide-to-incrementals_navigating-criticism_index.md.Djt_EVT5.lean.js similarity index 91% rename from assets/garden_guide-to-incrementals_navigating-criticism_index.md.4aLxw7wS.lean.js rename to assets/garden_guide-to-incrementals_navigating-criticism_index.md.Djt_EVT5.lean.js index f45a14a4..27a0353d 100644 --- a/assets/garden_guide-to-incrementals_navigating-criticism_index.md.4aLxw7wS.lean.js +++ b/assets/garden_guide-to-incrementals_navigating-criticism_index.md.Djt_EVT5.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Guide to Incrementals/Navigating Criticism","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/navigating-criticism","title":"Guide to Incrementals/Navigating Criticism","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/navigating-criticism/index.md","filePath":"garden/guide-to-incrementals/navigating-criticism/index.md","lastUpdated":1718069968000}'),n={name:"garden/guide-to-incrementals/navigating-criticism/index.md"},o=i("",11),r=[o];function s(c,l,d,u,m,h){return a(),t("div",null,r)}const f=e(n,[["render",s]]);export{p as __pageData,f as default}; +import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Guide to Incrementals/Navigating Criticism","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/navigating-criticism","title":"Guide to Incrementals/Navigating Criticism","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/navigating-criticism/index.md","filePath":"garden/guide-to-incrementals/navigating-criticism/index.md","lastUpdated":1717647948000}'),n={name:"garden/guide-to-incrementals/navigating-criticism/index.md"},o=i("",11),r=[o];function s(c,l,d,u,m,h){return a(),t("div",null,r)}const f=e(n,[["render",s]]);export{p as __pageData,f as default}; diff --git a/assets/garden_guide-to-incrementals_what-is-content_index.md.D_VOmtEP.js b/assets/garden_guide-to-incrementals_what-is-content_index.md.A83vET_y.js similarity index 99% rename from assets/garden_guide-to-incrementals_what-is-content_index.md.D_VOmtEP.js rename to assets/garden_guide-to-incrementals_what-is-content_index.md.A83vET_y.js index 869b5e03..1626a34f 100644 --- a/assets/garden_guide-to-incrementals_what-is-content_index.md.D_VOmtEP.js +++ b/assets/garden_guide-to-incrementals_what-is-content_index.md.A83vET_y.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Guide to Incrementals/What is Content?","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/what-is-content-","title":"Guide to Incrementals/What is Content?","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/what-is-content/index.md","filePath":"garden/guide-to-incrementals/what-is-content/index.md","lastUpdated":1718069968000}'),o={name:"garden/guide-to-incrementals/what-is-content/index.md"},i=n('

Guide to Incrementals/What is Content?

If you've been in the incremental games community for any amount of time, you'll quickly find the number one thing players want is content. They want as much of it as possible! The most popular incremental games have tons of content, so they just keep stretching on and on and on, introducing mechanic after mechanic, and players love it. In fact, players seem to value the amount of content over the quality of any specific content. However, there's a bit of a lack of understanding concerning what content is, and I'd like to explore what counts as content, and how we measure it. As a baseline definition, I think "content" can just be described as the parts of the game that engage the player, but to truly understand it we need to contextualize what that means and how it affects the gameplay experience.

To clarify the purpose of this page, my goal is not to get (too) nitpicky or to attack games with "low content". There's nothing wrong with short / low-content games - I'm quite a big fan of those games myself! This is mostly targeted toward those who ask for content and settle for "long" games, and those who want to provide content but want to make sure they're not just artificially inflating the game. Ultimately, I suppose the goal is to just reduce the amount of artificially inflated content for the sake of having a "longer" game.

Interaction

I think it should be a fairly non-controversial opinion that time spent solely waiting should not count towards content. That is not including the time reading various effects or making decisions in your head, but rather time spent waiting for a condition to be met so you can re-engage with the game.

That is not to say games should necessarily try to minimize this time. Plenty of games lead towards more infrequent interaction and still get popular. In fact, these games appeal to many gamers who want to have something to check up on in between bursts of working on some other activity. These games seem to have fallen slightly out of fashion amongst modern incremental games, but they're still fully valid. The point I'm trying to make here is just that this time is not content. As an extreme example, a game with no interactions and just a counter that goes up every second could safely be said to have 0 content beyond the time it takes to understand what's going on. If it has a list of "goals" to hit, then the time understanding those goals and a short time after achieving each one could be considered content, but not the idle times in between.

Let's take a look at the opposite end of the spectrum - interaction that is so frequent as to become mindless. This is any mechanic where you need to spam-click something to progress. This may be a more controversial take, but I do not believe this constitutes content either. It does not engage the player, because each consecutive click blends together and they do not individually change the gameplay experience. That is to say, a single click and 100 clicks are not meaningfully different in terms of engaging the player. I'd go as far as to say clicking 100 times would be actively worse, as it's artificially delaying the next piece of actual content, alongside the issues of accessibility and potentially causing RSI.

Repeatable Purchases

Imagine an entity in a game that you can purchase multiple times, each time it performs the same thing but for a higher cost. These are incredibly common, from the buildings in cookie clicker to the units in swarm sim to the IP and EP multipliers in antimatter dimensions. However, how much content is each specific purchase? Is it content beyond the first purchase? Does it have diminishing returns? What if you are oscillating between two different repeatable purchases? How much content is lost when you automate) away a repeatable purchase?

I don't want to take too harsh a stance against repeatable purchases. They're useful tools and can be used in a myriad of interesting ways. I feel they do become "stale" or less meaningful content over time, and this happens exponentially quickly the more frequently it can be purchased. A classic example that I believe goes too far is the IP/EP multipliers in Antimatter Dimensions. I would go as far as to say they are a chore and do not provide any meaningful content after you've bought them a couple of times. It's a method for inflating numbers (effectively making every OOM a 5x step instead of 10x), that punishes the player progression-wise whenever they forget to max it again, and eventually gets automated away as a reward to the player for making enough progress.

Just to voice the other side of this argument, Acamaeda defended the IP multiplier as giving the player a "good" upgrade every OOM. I can understand that to a point and need to clarify I'm mainly criticizing IP/EP multipliers after they've been introduced for a while. In fact, I would defend the multipliers for a short while after they're introduced using the same logic I would use to defend normal dimensions as repeatable purchases, at least pre-infinity. There's "content" to be had in looking at what dimensions will become affordable next, and then choosing which to buy amongst those. The IP/EP multipliers, early into infinity or eternity respectively, provide another option that gets put into that mental queue of things to buy with each OOM reached - although the optimal order is often quite trivial and not particularly engaging.

The IP/EP multipliers are not the only repeatable purchase in antimatter dimensions I take offense to. The time dimensions are also a series of repeatable purchases, that are all so similar and static that it doesn't take long before you never need to put any thought into buying them, how much you're buying at once, or the order you buy them in - you just press max all and move on. The entire tab could've been just the max all button and it would not have made a difference beyond the start of the eternity layer. The normal dimensions technically have this problem as well, but since you're constantly getting antimatter the order feels like it has a larger impact and it's more meaningful content, right up until they're automated away. Infinity dimensions are a compromise between the two, so I'm highlighting time dimensions here as the most egregious.

Following Instructions

We're getting more and more controversial as we go along! Let's talk about how linear content is not content now (in some circumstances). A trend in incremental games is adding difficulty by adding a web of effects that abstract the true change you can expect from any specific purchase or decision you make. If a game is both linear and sufficiently abstracts the effect of player decisions, then the player will no longer be engaging with the content - they'll simply be clicking on things as they become available. This isn't necessarily a bad thing, as plenty of players don't mind this style of gameplay, but I'd argue once you reach a point where players don't bother reading the effects, those interactions are no longer truly content. Note that unlike the previous qualifiers mentioned, this qualifier is based on the player, and therefore subjective. In effect, it's a spectrum where the more complicated the web of effects becomes, the more likely it is to disengage the player.

This over-complicatedness leading to disengaging the player can also happen from non-linear gameplay. If the web of effects becomes sufficiently complicated and finding the optimal progression route too time-consuming to discover, players will seek out guides from other players who've completed the game. The second they do this, the game effectively becomes linearly following the instructions of the guide and all the above criticisms apply. Similarly to as before, though, this is a spectrum and not everyone will seek out a guide at the same level of difficulty.

Automation

Automation is a staple of the genre, but it has certain implications for the design of the game. Why, when new content is introduced, must the older content be automated away - why is it a chore and it feels rewarding to not have to do it again? Why does the new mechanic have such appeal if we know it too will just be automated away later on, and we'll be happy when that happens? It honestly begs the question of why this framework of introducing content and automating the old content is even enjoyable - and nearly nonexistent in other genres. You're not going to reach a point in a platformer game where they just automate the jumping part - that's the core mechanic! Instead, platformers either add new mechanics that build on the core mechanic or at least re-contextualize the core mechanic. However, in incremental games new content very frequently means replacing older content, as opposed to augmenting it.

Admittedly, the above paragraph ignores the obvious answer that separates incremental games in this regard. These mechanics become chores as their frequency increases. The frequency increases to give a sense of progression, and automation is seen as a reward because it now manages what was becoming unmanageable. The new content then comes in and continues the loop to give a stronger sense of progression. That's all good and a fine justification for automating content instead of building upon the base mechanic. It's also much easier to design, as each layer essentially lets you start over instead of needing to think of ideas that conform to the original core mechanic.

So, what's the problem? Even if this trend is justified and easy to implement, there are some other effects it has on the game design. First off, and this is probably a neutral point, incremental games with this cycle of replacing old mechanics with new ones trend towards more and more abstract and further away from any narrative throughline as they add layers. There are only so many justifications for resetting progress, so if a game wants to have several of these layers they're inevitably going to become generic or increasingly loosely associated with the original content. It's most unfortunate, in my opinion when an interesting or innovative core mechanic gets fully automated once a generic "prestige" layer is unlocked.

A recent example is Really Grass Cutting Incremental, an incremental game about cutting grass (although I'm really criticizing the Roblox game it's based on). Except, it doesn't continue to be about cutting grass. After you buy enough upgrades to increase your grass cutting and level up sufficiently you "prestige", an abstract term that in this case means you reset all your progress to get some currency to buy upgrades that do the same things as the original upgrades, but these won't reset on future prestiges. You'll eventually be able to "crystallize", which means you reset all your progress to get some currency to buy upgrades that do the same things as the original upgrades (and a couple of new ones) and won't reset on future crystallizes. Fine. You'll progress a bit, complete some challenges, and finally get to... grasshop? Grasshopping is this mechanic where you reset all your progress to get some resource that isn't for buying upgrades - this time you just unlock different modifiers on everything based on their amount. You may have gotten the point by now, but there are also "steelie" resets which give you steel for some reason, before unlocking a factory with various machines - none of which are directly tied to cutting grass, and start gathering things like oil and reset for rocket parts and reset to go to space and so on and so on. Throughout all of this there is absolutely no narrative justification or throughline for the direction the game is going, or why cutting grass is still relevant when we're collecting things like rocket parts. I may be going a little hard on GCI, but it is far from alone.

Tips for Developers

If you're a developer, by this point you should have a pretty decent idea of how to create "true" content in your game. Here are some other specific tips I'd suggest:

An upgrade that simply unlocks another upgrade trivially isn't content. However, many games have an upgrade that just unlocks a feature, which then has a wait or other requirements before it can be used. Try to make sure when you unlock a feature, there is immediately something to do with the feature - for example, perhaps give them a small amount of the new currency it unlocks, if applicable.

If you don't have a large web of effects, and can definitively say the impact of a purchase is to multiply the gain of the cost currency by N, and the next purchase costs N times the amount of that same currency, then this purchase effectively made no difference and it may have made more sense to just go directly to the next upgrade. That said, having effects based on things like the number of purchases made will quickly invalidate this tip.

',24),s=[i];function r(h,l,c,u,m,d){return a(),t("div",null,s)}const f=e(o,[["render",r]]);export{p as __pageData,f as default}; +import{_ as e,c as t,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Guide to Incrementals/What is Content?","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/what-is-content-","title":"Guide to Incrementals/What is Content?","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/what-is-content/index.md","filePath":"garden/guide-to-incrementals/what-is-content/index.md","lastUpdated":1717647948000}'),o={name:"garden/guide-to-incrementals/what-is-content/index.md"},i=n('

Guide to Incrementals/What is Content?

If you've been in the incremental games community for any amount of time, you'll quickly find the number one thing players want is content. They want as much of it as possible! The most popular incremental games have tons of content, so they just keep stretching on and on and on, introducing mechanic after mechanic, and players love it. In fact, players seem to value the amount of content over the quality of any specific content. However, there's a bit of a lack of understanding concerning what content is, and I'd like to explore what counts as content, and how we measure it. As a baseline definition, I think "content" can just be described as the parts of the game that engage the player, but to truly understand it we need to contextualize what that means and how it affects the gameplay experience.

To clarify the purpose of this page, my goal is not to get (too) nitpicky or to attack games with "low content". There's nothing wrong with short / low-content games - I'm quite a big fan of those games myself! This is mostly targeted toward those who ask for content and settle for "long" games, and those who want to provide content but want to make sure they're not just artificially inflating the game. Ultimately, I suppose the goal is to just reduce the amount of artificially inflated content for the sake of having a "longer" game.

Interaction

I think it should be a fairly non-controversial opinion that time spent solely waiting should not count towards content. That is not including the time reading various effects or making decisions in your head, but rather time spent waiting for a condition to be met so you can re-engage with the game.

That is not to say games should necessarily try to minimize this time. Plenty of games lead towards more infrequent interaction and still get popular. In fact, these games appeal to many gamers who want to have something to check up on in between bursts of working on some other activity. These games seem to have fallen slightly out of fashion amongst modern incremental games, but they're still fully valid. The point I'm trying to make here is just that this time is not content. As an extreme example, a game with no interactions and just a counter that goes up every second could safely be said to have 0 content beyond the time it takes to understand what's going on. If it has a list of "goals" to hit, then the time understanding those goals and a short time after achieving each one could be considered content, but not the idle times in between.

Let's take a look at the opposite end of the spectrum - interaction that is so frequent as to become mindless. This is any mechanic where you need to spam-click something to progress. This may be a more controversial take, but I do not believe this constitutes content either. It does not engage the player, because each consecutive click blends together and they do not individually change the gameplay experience. That is to say, a single click and 100 clicks are not meaningfully different in terms of engaging the player. I'd go as far as to say clicking 100 times would be actively worse, as it's artificially delaying the next piece of actual content, alongside the issues of accessibility and potentially causing RSI.

Repeatable Purchases

Imagine an entity in a game that you can purchase multiple times, each time it performs the same thing but for a higher cost. These are incredibly common, from the buildings in cookie clicker to the units in swarm sim to the IP and EP multipliers in antimatter dimensions. However, how much content is each specific purchase? Is it content beyond the first purchase? Does it have diminishing returns? What if you are oscillating between two different repeatable purchases? How much content is lost when you automate) away a repeatable purchase?

I don't want to take too harsh a stance against repeatable purchases. They're useful tools and can be used in a myriad of interesting ways. I feel they do become "stale" or less meaningful content over time, and this happens exponentially quickly the more frequently it can be purchased. A classic example that I believe goes too far is the IP/EP multipliers in Antimatter Dimensions. I would go as far as to say they are a chore and do not provide any meaningful content after you've bought them a couple of times. It's a method for inflating numbers (effectively making every OOM a 5x step instead of 10x), that punishes the player progression-wise whenever they forget to max it again, and eventually gets automated away as a reward to the player for making enough progress.

Just to voice the other side of this argument, Acamaeda defended the IP multiplier as giving the player a "good" upgrade every OOM. I can understand that to a point and need to clarify I'm mainly criticizing IP/EP multipliers after they've been introduced for a while. In fact, I would defend the multipliers for a short while after they're introduced using the same logic I would use to defend normal dimensions as repeatable purchases, at least pre-infinity. There's "content" to be had in looking at what dimensions will become affordable next, and then choosing which to buy amongst those. The IP/EP multipliers, early into infinity or eternity respectively, provide another option that gets put into that mental queue of things to buy with each OOM reached - although the optimal order is often quite trivial and not particularly engaging.

The IP/EP multipliers are not the only repeatable purchase in antimatter dimensions I take offense to. The time dimensions are also a series of repeatable purchases, that are all so similar and static that it doesn't take long before you never need to put any thought into buying them, how much you're buying at once, or the order you buy them in - you just press max all and move on. The entire tab could've been just the max all button and it would not have made a difference beyond the start of the eternity layer. The normal dimensions technically have this problem as well, but since you're constantly getting antimatter the order feels like it has a larger impact and it's more meaningful content, right up until they're automated away. Infinity dimensions are a compromise between the two, so I'm highlighting time dimensions here as the most egregious.

Following Instructions

We're getting more and more controversial as we go along! Let's talk about how linear content is not content now (in some circumstances). A trend in incremental games is adding difficulty by adding a web of effects that abstract the true change you can expect from any specific purchase or decision you make. If a game is both linear and sufficiently abstracts the effect of player decisions, then the player will no longer be engaging with the content - they'll simply be clicking on things as they become available. This isn't necessarily a bad thing, as plenty of players don't mind this style of gameplay, but I'd argue once you reach a point where players don't bother reading the effects, those interactions are no longer truly content. Note that unlike the previous qualifiers mentioned, this qualifier is based on the player, and therefore subjective. In effect, it's a spectrum where the more complicated the web of effects becomes, the more likely it is to disengage the player.

This over-complicatedness leading to disengaging the player can also happen from non-linear gameplay. If the web of effects becomes sufficiently complicated and finding the optimal progression route too time-consuming to discover, players will seek out guides from other players who've completed the game. The second they do this, the game effectively becomes linearly following the instructions of the guide and all the above criticisms apply. Similarly to as before, though, this is a spectrum and not everyone will seek out a guide at the same level of difficulty.

Automation

Automation is a staple of the genre, but it has certain implications for the design of the game. Why, when new content is introduced, must the older content be automated away - why is it a chore and it feels rewarding to not have to do it again? Why does the new mechanic have such appeal if we know it too will just be automated away later on, and we'll be happy when that happens? It honestly begs the question of why this framework of introducing content and automating the old content is even enjoyable - and nearly nonexistent in other genres. You're not going to reach a point in a platformer game where they just automate the jumping part - that's the core mechanic! Instead, platformers either add new mechanics that build on the core mechanic or at least re-contextualize the core mechanic. However, in incremental games new content very frequently means replacing older content, as opposed to augmenting it.

Admittedly, the above paragraph ignores the obvious answer that separates incremental games in this regard. These mechanics become chores as their frequency increases. The frequency increases to give a sense of progression, and automation is seen as a reward because it now manages what was becoming unmanageable. The new content then comes in and continues the loop to give a stronger sense of progression. That's all good and a fine justification for automating content instead of building upon the base mechanic. It's also much easier to design, as each layer essentially lets you start over instead of needing to think of ideas that conform to the original core mechanic.

So, what's the problem? Even if this trend is justified and easy to implement, there are some other effects it has on the game design. First off, and this is probably a neutral point, incremental games with this cycle of replacing old mechanics with new ones trend towards more and more abstract and further away from any narrative throughline as they add layers. There are only so many justifications for resetting progress, so if a game wants to have several of these layers they're inevitably going to become generic or increasingly loosely associated with the original content. It's most unfortunate, in my opinion when an interesting or innovative core mechanic gets fully automated once a generic "prestige" layer is unlocked.

A recent example is Really Grass Cutting Incremental, an incremental game about cutting grass (although I'm really criticizing the Roblox game it's based on). Except, it doesn't continue to be about cutting grass. After you buy enough upgrades to increase your grass cutting and level up sufficiently you "prestige", an abstract term that in this case means you reset all your progress to get some currency to buy upgrades that do the same things as the original upgrades, but these won't reset on future prestiges. You'll eventually be able to "crystallize", which means you reset all your progress to get some currency to buy upgrades that do the same things as the original upgrades (and a couple of new ones) and won't reset on future crystallizes. Fine. You'll progress a bit, complete some challenges, and finally get to... grasshop? Grasshopping is this mechanic where you reset all your progress to get some resource that isn't for buying upgrades - this time you just unlock different modifiers on everything based on their amount. You may have gotten the point by now, but there are also "steelie" resets which give you steel for some reason, before unlocking a factory with various machines - none of which are directly tied to cutting grass, and start gathering things like oil and reset for rocket parts and reset to go to space and so on and so on. Throughout all of this there is absolutely no narrative justification or throughline for the direction the game is going, or why cutting grass is still relevant when we're collecting things like rocket parts. I may be going a little hard on GCI, but it is far from alone.

Tips for Developers

If you're a developer, by this point you should have a pretty decent idea of how to create "true" content in your game. Here are some other specific tips I'd suggest:

An upgrade that simply unlocks another upgrade trivially isn't content. However, many games have an upgrade that just unlocks a feature, which then has a wait or other requirements before it can be used. Try to make sure when you unlock a feature, there is immediately something to do with the feature - for example, perhaps give them a small amount of the new currency it unlocks, if applicable.

If you don't have a large web of effects, and can definitively say the impact of a purchase is to multiply the gain of the cost currency by N, and the next purchase costs N times the amount of that same currency, then this purchase effectively made no difference and it may have made more sense to just go directly to the next upgrade. That said, having effects based on things like the number of purchases made will quickly invalidate this tip.

',24),s=[i];function r(h,l,c,u,m,d){return a(),t("div",null,s)}const f=e(o,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/garden_guide-to-incrementals_what-is-content_index.md.D_VOmtEP.lean.js b/assets/garden_guide-to-incrementals_what-is-content_index.md.A83vET_y.lean.js similarity index 90% rename from assets/garden_guide-to-incrementals_what-is-content_index.md.D_VOmtEP.lean.js rename to assets/garden_guide-to-incrementals_what-is-content_index.md.A83vET_y.lean.js index 6f451f29..4a3d5d7c 100644 --- a/assets/garden_guide-to-incrementals_what-is-content_index.md.D_VOmtEP.lean.js +++ b/assets/garden_guide-to-incrementals_what-is-content_index.md.A83vET_y.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Guide to Incrementals/What is Content?","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/what-is-content-","title":"Guide to Incrementals/What is Content?","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/what-is-content/index.md","filePath":"garden/guide-to-incrementals/what-is-content/index.md","lastUpdated":1718069968000}'),o={name:"garden/guide-to-incrementals/what-is-content/index.md"},i=n("",24),s=[i];function r(h,l,c,u,m,d){return a(),t("div",null,s)}const f=e(o,[["render",r]]);export{p as __pageData,f as default}; +import{_ as e,c as t,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Guide to Incrementals/What is Content?","description":"","frontmatter":{"public":"true","slug":"guide-to-incrementals/what-is-content-","title":"Guide to Incrementals/What is Content?","prev":false,"next":false},"headers":[],"relativePath":"garden/guide-to-incrementals/what-is-content/index.md","filePath":"garden/guide-to-incrementals/what-is-content/index.md","lastUpdated":1717647948000}'),o={name:"garden/guide-to-incrementals/what-is-content/index.md"},i=n("",24),s=[i];function r(h,l,c,u,m,d){return a(),t("div",null,s)}const f=e(o,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/garden_incremental-social_index.md.CfME2gTU.js b/assets/garden_incremental-social_index.md.TlaPPmQO.js similarity index 95% rename from assets/garden_incremental-social_index.md.CfME2gTU.js rename to assets/garden_incremental-social_index.md.TlaPPmQO.js index accccba9..78ca3eeb 100644 --- a/assets/garden_incremental-social_index.md.CfME2gTU.js +++ b/assets/garden_incremental-social_index.md.TlaPPmQO.js @@ -1 +1 @@ -import{_ as e,c as a,o as n,a9 as t}from"./chunks/framework.D8PMdl4T.js";const h=JSON.parse('{"title":"Incremental Social","description":"","frontmatter":{"public":"tags:: My Projects","slug":"incremental-social","title":"Incremental Social","prev":false,"next":false},"headers":[],"relativePath":"garden/incremental-social/index.md","filePath":"garden/incremental-social/index.md","lastUpdated":1718069968000}'),r={name:"garden/incremental-social/index.md"},o=t('

Incremental Social

Referenced by: Federated Identity, My Personal Website, Webrings

Tags: My Projects

Incremental Social is a Fediverse website hosted by me!

Made explicitly for the incremental games community

Most notably hosts an instance of Mbin, Forgejo, and Synapse (and Cinny)

',6),i=[o];function c(s,l,d,m,p,f){return n(),a("div",null,i)}const g=e(r,[["render",c]]);export{h as __pageData,g as default}; +import{_ as e,c as a,o as n,a9 as t}from"./chunks/framework.D8PMdl4T.js";const h=JSON.parse('{"title":"Incremental Social","description":"","frontmatter":{"public":"tags:: My Projects","slug":"incremental-social","title":"Incremental Social","prev":false,"next":false},"headers":[],"relativePath":"garden/incremental-social/index.md","filePath":"garden/incremental-social/index.md","lastUpdated":1717647948000}'),r={name:"garden/incremental-social/index.md"},o=t('

Incremental Social

Referenced by: Federated Identity, My Personal Website, Webrings

Tags: My Projects

Incremental Social is a Fediverse website hosted by me!

Made explicitly for the incremental games community

Most notably hosts an instance of Mbin, Forgejo, and Synapse (and Cinny)

',6),i=[o];function c(s,l,d,m,p,f){return n(),a("div",null,i)}const g=e(r,[["render",c]]);export{h as __pageData,g as default}; diff --git a/assets/garden_incremental-social_index.md.CfME2gTU.lean.js b/assets/garden_incremental-social_index.md.TlaPPmQO.lean.js similarity index 89% rename from assets/garden_incremental-social_index.md.CfME2gTU.lean.js rename to assets/garden_incremental-social_index.md.TlaPPmQO.lean.js index 71ca6397..dcf60167 100644 --- a/assets/garden_incremental-social_index.md.CfME2gTU.lean.js +++ b/assets/garden_incremental-social_index.md.TlaPPmQO.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as n,a9 as t}from"./chunks/framework.D8PMdl4T.js";const h=JSON.parse('{"title":"Incremental Social","description":"","frontmatter":{"public":"tags:: My Projects","slug":"incremental-social","title":"Incremental Social","prev":false,"next":false},"headers":[],"relativePath":"garden/incremental-social/index.md","filePath":"garden/incremental-social/index.md","lastUpdated":1718069968000}'),r={name:"garden/incremental-social/index.md"},o=t("",6),i=[o];function c(s,l,d,m,p,f){return n(),a("div",null,i)}const g=e(r,[["render",c]]);export{h as __pageData,g as default}; +import{_ as e,c as a,o as n,a9 as t}from"./chunks/framework.D8PMdl4T.js";const h=JSON.parse('{"title":"Incremental Social","description":"","frontmatter":{"public":"tags:: My Projects","slug":"incremental-social","title":"Incremental Social","prev":false,"next":false},"headers":[],"relativePath":"garden/incremental-social/index.md","filePath":"garden/incremental-social/index.md","lastUpdated":1717647948000}'),r={name:"garden/incremental-social/index.md"},o=t("",6),i=[o];function c(s,l,d,m,p,f){return n(),a("div",null,i)}const g=e(r,[["render",c]]);export{h as __pageData,g as default}; diff --git a/assets/garden_ivy-road_index.md.31ClM7tv.js b/assets/garden_ivy-road_index.md.DK8swC5I.js similarity index 94% rename from assets/garden_ivy-road_index.md.31ClM7tv.js rename to assets/garden_ivy-road_index.md.DK8swC5I.js index b8cc3771..158dbeb7 100644 --- a/assets/garden_ivy-road_index.md.31ClM7tv.js +++ b/assets/garden_ivy-road_index.md.DK8swC5I.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as d}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Ivy Road","description":"","frontmatter":{"public":"true","slug":"ivy-road","tags":["Davey Wreden"],"title":"Ivy Road","prev":false,"next":false},"headers":[],"relativePath":"garden/ivy-road/index.md","filePath":"garden/ivy-road/index.md","lastUpdated":1718069968000}'),t={name:"garden/ivy-road/index.md"},o=d('

Ivy Road

Referenced by: Davey Wreden, Wanderstop

Tags: Davey Wreden

Ivy Road is a indie game studio created by Davey Wreden, Karla Kimonja, and C418

',4),n=[o];function i(s,c,_,l,p,v){return r(),a("div",null,n)}const h=e(t,[["render",i]]);export{f as __pageData,h as default}; +import{_ as e,c as a,o as r,a9 as d}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Ivy Road","description":"","frontmatter":{"public":"true","slug":"ivy-road","tags":["Davey Wreden"],"title":"Ivy Road","prev":false,"next":false},"headers":[],"relativePath":"garden/ivy-road/index.md","filePath":"garden/ivy-road/index.md","lastUpdated":1717971545000}'),t={name:"garden/ivy-road/index.md"},o=d('

Ivy Road

Referenced by: Davey Wreden, Wanderstop

Tags: Davey Wreden

Ivy Road is a indie game studio created by Davey Wreden, Karla Kimonja, and C418

',4),n=[o];function i(s,c,_,l,p,v){return r(),a("div",null,n)}const h=e(t,[["render",i]]);export{f as __pageData,h as default}; diff --git a/assets/garden_ivy-road_index.md.31ClM7tv.lean.js b/assets/garden_ivy-road_index.md.DK8swC5I.lean.js similarity index 88% rename from assets/garden_ivy-road_index.md.31ClM7tv.lean.js rename to assets/garden_ivy-road_index.md.DK8swC5I.lean.js index ff12cfb4..e0b24d95 100644 --- a/assets/garden_ivy-road_index.md.31ClM7tv.lean.js +++ b/assets/garden_ivy-road_index.md.DK8swC5I.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as d}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Ivy Road","description":"","frontmatter":{"public":"true","slug":"ivy-road","tags":["Davey Wreden"],"title":"Ivy Road","prev":false,"next":false},"headers":[],"relativePath":"garden/ivy-road/index.md","filePath":"garden/ivy-road/index.md","lastUpdated":1718069968000}'),t={name:"garden/ivy-road/index.md"},o=d("",4),n=[o];function i(s,c,_,l,p,v){return r(),a("div",null,n)}const h=e(t,[["render",i]]);export{f as __pageData,h as default}; +import{_ as e,c as a,o as r,a9 as d}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Ivy Road","description":"","frontmatter":{"public":"true","slug":"ivy-road","tags":["Davey Wreden"],"title":"Ivy Road","prev":false,"next":false},"headers":[],"relativePath":"garden/ivy-road/index.md","filePath":"garden/ivy-road/index.md","lastUpdated":1717971545000}'),t={name:"garden/ivy-road/index.md"},o=d("",4),n=[o];function i(s,c,_,l,p,v){return r(),a("div",null,n)}const h=e(t,[["render",i]]);export{f as __pageData,h as default}; diff --git a/assets/garden_kronos_index.md.DD5fELK_.js b/assets/garden_kronos_index.md.B-JAOjIb.js similarity index 95% rename from assets/garden_kronos_index.md.DD5fELK_.js rename to assets/garden_kronos_index.md.B-JAOjIb.js index 98f113cb..c5c386c6 100644 --- a/assets/garden_kronos_index.md.DD5fELK_.js +++ b/assets/garden_kronos_index.md.B-JAOjIb.js @@ -1 +1 @@ -import{_ as e,c as o,o as t,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Kronos","description":"","frontmatter":{"public":"true","slug":"kronos","tags":["My Projects","Profectus"],"title":"Kronos","prev":false,"next":false},"headers":[],"relativePath":"garden/kronos/index.md","filePath":"garden/kronos/index.md","lastUpdated":1718069968000}'),r={name:"garden/kronos/index.md"},n=a('

Kronos

Referenced by: V-ecs

Tags: My Projects, Profectus

My largest and most ambitious incremental game I've ever made

  • A magnum opus, of sorts ;P

Still in development, and will be for a long time. I have full intention of completing it, however

An older version, that is built in The Modding Tree, only has the gameplay, and only goes up to Chapter 2, can be played here

',7),s=[n];function l(i,c,d,p,_,h){return t(),o("div",null,s)}const m=e(r,[["render",l]]);export{f as __pageData,m as default}; +import{_ as e,c as o,o as t,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Kronos","description":"","frontmatter":{"public":"true","slug":"kronos","tags":["My Projects","Profectus"],"title":"Kronos","prev":false,"next":false},"headers":[],"relativePath":"garden/kronos/index.md","filePath":"garden/kronos/index.md","lastUpdated":1717647948000}'),r={name:"garden/kronos/index.md"},n=a('

Kronos

Referenced by: V-ecs

Tags: My Projects, Profectus

My largest and most ambitious incremental game I've ever made

  • A magnum opus, of sorts ;P

Still in development, and will be for a long time. I have full intention of completing it, however

An older version, that is built in The Modding Tree, only has the gameplay, and only goes up to Chapter 2, can be played here

',7),s=[n];function l(i,c,d,p,_,h){return t(),o("div",null,s)}const m=e(r,[["render",l]]);export{f as __pageData,m as default}; diff --git a/assets/garden_kronos_index.md.DD5fELK_.lean.js b/assets/garden_kronos_index.md.B-JAOjIb.lean.js similarity index 88% rename from assets/garden_kronos_index.md.DD5fELK_.lean.js rename to assets/garden_kronos_index.md.B-JAOjIb.lean.js index 93fc101c..bef92ed8 100644 --- a/assets/garden_kronos_index.md.DD5fELK_.lean.js +++ b/assets/garden_kronos_index.md.B-JAOjIb.lean.js @@ -1 +1 @@ -import{_ as e,c as o,o as t,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Kronos","description":"","frontmatter":{"public":"true","slug":"kronos","tags":["My Projects","Profectus"],"title":"Kronos","prev":false,"next":false},"headers":[],"relativePath":"garden/kronos/index.md","filePath":"garden/kronos/index.md","lastUpdated":1718069968000}'),r={name:"garden/kronos/index.md"},n=a("",7),s=[n];function l(i,c,d,p,_,h){return t(),o("div",null,s)}const m=e(r,[["render",l]]);export{f as __pageData,m as default}; +import{_ as e,c as o,o as t,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Kronos","description":"","frontmatter":{"public":"true","slug":"kronos","tags":["My Projects","Profectus"],"title":"Kronos","prev":false,"next":false},"headers":[],"relativePath":"garden/kronos/index.md","filePath":"garden/kronos/index.md","lastUpdated":1717647948000}'),r={name:"garden/kronos/index.md"},n=a("",7),s=[n];function l(i,c,d,p,_,h){return t(),o("div",null,s)}const m=e(r,[["render",l]]);export{f as __pageData,m as default}; diff --git a/assets/garden_logseq_index.md.uO2Fr5Gt.js b/assets/garden_logseq_index.md.Sw_XpNVJ.js similarity index 92% rename from assets/garden_logseq_index.md.uO2Fr5Gt.js rename to assets/garden_logseq_index.md.Sw_XpNVJ.js index 6e37d2f1..03956a76 100644 --- a/assets/garden_logseq_index.md.uO2Fr5Gt.js +++ b/assets/garden_logseq_index.md.Sw_XpNVJ.js @@ -1 +1 @@ -import{_ as e,c as a,o,a9 as t}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Logseq","description":"","frontmatter":{"public":"true","slug":"logseq","title":"Logseq","prev":false,"next":false},"headers":[],"relativePath":"garden/logseq/index.md","filePath":"garden/logseq/index.md","lastUpdated":1718069968000}'),s={name:"garden/logseq/index.md"},r=t('

Logseq

Referenced by: This Knowledge Hub

Logseq is an Open Source outlining software

',3),n=[r];function l(d,c,i,_,g,p){return o(),a("div",null,n)}const u=e(s,[["render",l]]);export{f as __pageData,u as default}; +import{_ as e,c as a,o,a9 as t}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Logseq","description":"","frontmatter":{"public":"true","slug":"logseq","title":"Logseq","prev":false,"next":false},"headers":[],"relativePath":"garden/logseq/index.md","filePath":"garden/logseq/index.md","lastUpdated":1717647948000}'),s={name:"garden/logseq/index.md"},r=t('

Logseq

Referenced by: This Knowledge Hub

Logseq is an Open Source outlining software

',3),n=[r];function l(d,c,i,_,g,p){return o(),a("div",null,n)}const u=e(s,[["render",l]]);export{f as __pageData,u as default}; diff --git a/assets/garden_logseq_index.md.uO2Fr5Gt.lean.js b/assets/garden_logseq_index.md.Sw_XpNVJ.lean.js similarity index 87% rename from assets/garden_logseq_index.md.uO2Fr5Gt.lean.js rename to assets/garden_logseq_index.md.Sw_XpNVJ.lean.js index b9827add..b5601fe3 100644 --- a/assets/garden_logseq_index.md.uO2Fr5Gt.lean.js +++ b/assets/garden_logseq_index.md.Sw_XpNVJ.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o,a9 as t}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Logseq","description":"","frontmatter":{"public":"true","slug":"logseq","title":"Logseq","prev":false,"next":false},"headers":[],"relativePath":"garden/logseq/index.md","filePath":"garden/logseq/index.md","lastUpdated":1718069968000}'),s={name:"garden/logseq/index.md"},r=t("",3),n=[r];function l(d,c,i,_,g,p){return o(),a("div",null,n)}const u=e(s,[["render",l]]);export{f as __pageData,u as default}; +import{_ as e,c as a,o,a9 as t}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Logseq","description":"","frontmatter":{"public":"true","slug":"logseq","title":"Logseq","prev":false,"next":false},"headers":[],"relativePath":"garden/logseq/index.md","filePath":"garden/logseq/index.md","lastUpdated":1717647948000}'),s={name:"garden/logseq/index.md"},r=t("",3),n=[r];function l(d,c,i,_,g,p){return o(),a("div",null,n)}const u=e(s,[["render",l]]);export{f as __pageData,u as default}; diff --git a/assets/garden_matrix_index.md.DSfu06km.js b/assets/garden_matrix_index.md.B4VZfP7W.js similarity index 93% rename from assets/garden_matrix_index.md.DSfu06km.js rename to assets/garden_matrix_index.md.B4VZfP7W.js index d26baa37..5dcf389e 100644 --- a/assets/garden_matrix_index.md.DSfu06km.js +++ b/assets/garden_matrix_index.md.B4VZfP7W.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Matrix","description":"","frontmatter":{"public":"true","slug":"matrix","title":"Matrix","prev":false,"next":false},"headers":[],"relativePath":"garden/matrix/index.md","filePath":"garden/matrix/index.md","lastUpdated":1718069968000}'),n={name:"garden/matrix/index.md"},i=r('

Matrix

Referenced by: Cinny, Commune, Synapse

Matrix is a protocol for Decentralized messaging

',3),o=[i];function s(d,c,_,l,m,p){return t(),a("div",null,o)}const h=e(n,[["render",s]]);export{f as __pageData,h as default}; +import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Matrix","description":"","frontmatter":{"public":"true","slug":"matrix","title":"Matrix","prev":false,"next":false},"headers":[],"relativePath":"garden/matrix/index.md","filePath":"garden/matrix/index.md","lastUpdated":1717647948000}'),n={name:"garden/matrix/index.md"},i=r('

Matrix

Referenced by: Cinny, Commune, Synapse

Matrix is a protocol for Decentralized messaging

',3),o=[i];function s(d,c,_,l,m,p){return t(),a("div",null,o)}const h=e(n,[["render",s]]);export{f as __pageData,h as default}; diff --git a/assets/garden_matrix_index.md.DSfu06km.lean.js b/assets/garden_matrix_index.md.B4VZfP7W.lean.js similarity index 87% rename from assets/garden_matrix_index.md.DSfu06km.lean.js rename to assets/garden_matrix_index.md.B4VZfP7W.lean.js index f1596a9f..86c37dab 100644 --- a/assets/garden_matrix_index.md.DSfu06km.lean.js +++ b/assets/garden_matrix_index.md.B4VZfP7W.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Matrix","description":"","frontmatter":{"public":"true","slug":"matrix","title":"Matrix","prev":false,"next":false},"headers":[],"relativePath":"garden/matrix/index.md","filePath":"garden/matrix/index.md","lastUpdated":1718069968000}'),n={name:"garden/matrix/index.md"},i=r("",3),o=[i];function s(d,c,_,l,m,p){return t(),a("div",null,o)}const h=e(n,[["render",s]]);export{f as __pageData,h as default}; +import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Matrix","description":"","frontmatter":{"public":"true","slug":"matrix","title":"Matrix","prev":false,"next":false},"headers":[],"relativePath":"garden/matrix/index.md","filePath":"garden/matrix/index.md","lastUpdated":1717647948000}'),n={name:"garden/matrix/index.md"},i=r("",3),o=[i];function s(d,c,_,l,m,p){return t(),a("div",null,o)}const h=e(n,[["render",s]]);export{f as __pageData,h as default}; diff --git a/assets/garden_mbin_index.md.BCeJHUKa.js b/assets/garden_mbin_index.md.DHRumvWR.js similarity index 87% rename from assets/garden_mbin_index.md.BCeJHUKa.js rename to assets/garden_mbin_index.md.DHRumvWR.js index b98263e6..f9f144c7 100644 --- a/assets/garden_mbin_index.md.BCeJHUKa.js +++ b/assets/garden_mbin_index.md.DHRumvWR.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as n}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Mbin","description":"","frontmatter":{"public":"true","slug":"mbin","title":"Mbin","prev":false,"next":false},"headers":[],"relativePath":"garden/mbin/index.md","filePath":"garden/mbin/index.md","lastUpdated":1718069968000}'),r={name:"garden/mbin/index.md"},i=n('

Mbin

Referenced by: Incremental Social

Mbin is an Open Source Fediverse software

Can show both twitter-style posts and reddit-style threads

',4),o=[i];function s(d,c,l,_,p,b){return t(),a("div",null,o)}const f=e(r,[["render",s]]);export{m as __pageData,f as default}; +import{_ as e,c as a,o as t,a9 as n}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Mbin","description":"","frontmatter":{"public":"true","slug":"mbin","title":"Mbin","prev":false,"next":false},"headers":[],"relativePath":"garden/mbin/index.md","filePath":"garden/mbin/index.md","lastUpdated":1717647948000}'),r={name:"garden/mbin/index.md"},i=n('

Mbin

Referenced by: Incremental Social

Mbin is an Open Source Fediverse software

Can show both twitter-style posts and reddit-style threads

',4),o=[i];function s(d,c,l,_,p,b){return t(),a("div",null,o)}const f=e(r,[["render",s]]);export{m as __pageData,f as default}; diff --git a/assets/garden_mbin_index.md.BCeJHUKa.lean.js b/assets/garden_mbin_index.md.DHRumvWR.lean.js similarity index 74% rename from assets/garden_mbin_index.md.BCeJHUKa.lean.js rename to assets/garden_mbin_index.md.DHRumvWR.lean.js index 698205ba..c7aaea97 100644 --- a/assets/garden_mbin_index.md.BCeJHUKa.lean.js +++ b/assets/garden_mbin_index.md.DHRumvWR.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as n}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Mbin","description":"","frontmatter":{"public":"true","slug":"mbin","title":"Mbin","prev":false,"next":false},"headers":[],"relativePath":"garden/mbin/index.md","filePath":"garden/mbin/index.md","lastUpdated":1718069968000}'),r={name:"garden/mbin/index.md"},i=n("",4),o=[i];function s(d,c,l,_,p,b){return t(),a("div",null,o)}const f=e(r,[["render",s]]);export{m as __pageData,f as default}; +import{_ as e,c as a,o as t,a9 as n}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Mbin","description":"","frontmatter":{"public":"true","slug":"mbin","title":"Mbin","prev":false,"next":false},"headers":[],"relativePath":"garden/mbin/index.md","filePath":"garden/mbin/index.md","lastUpdated":1717647948000}'),r={name:"garden/mbin/index.md"},i=n("",4),o=[i];function s(d,c,l,_,p,b){return t(),a("div",null,o)}const f=e(r,[["render",s]]);export{m as __pageData,f as default}; diff --git a/assets/garden_my-personal-website_index.md.DbCoVJwI.js b/assets/garden_my-personal-website_index.md.DryeDwGD.js similarity index 93% rename from assets/garden_my-personal-website_index.md.DbCoVJwI.js rename to assets/garden_my-personal-website_index.md.DryeDwGD.js index d2d3d618..5bd5c78c 100644 --- a/assets/garden_my-personal-website_index.md.DbCoVJwI.js +++ b/assets/garden_my-personal-website_index.md.DryeDwGD.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"My Personal Website","description":"","frontmatter":{"public":"true","slug":"my-personal-website","title":"My Personal Website","prev":false,"next":false},"headers":[],"relativePath":"garden/my-personal-website/index.md","filePath":"garden/my-personal-website/index.md","lastUpdated":1718069968000}'),s={name:"garden/my-personal-website/index.md"},o=r('

My Personal Website

Referenced by: The Small Web

A Personal Websites for me, available at https://thepaperpilot.org

',3),n=[o];function l(i,p,d,_,c,b){return t(),a("div",null,n)}const f=e(s,[["render",l]]);export{m as __pageData,f as default}; +import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"My Personal Website","description":"","frontmatter":{"public":"true","slug":"my-personal-website","title":"My Personal Website","prev":false,"next":false},"headers":[],"relativePath":"garden/my-personal-website/index.md","filePath":"garden/my-personal-website/index.md","lastUpdated":1717647948000}'),s={name:"garden/my-personal-website/index.md"},o=r('

My Personal Website

Referenced by: The Small Web

A Personal Websites for me, available at https://thepaperpilot.org

',3),n=[o];function l(i,p,d,_,c,b){return t(),a("div",null,n)}const f=e(s,[["render",l]]);export{m as __pageData,f as default}; diff --git a/assets/garden_my-personal-website_index.md.DbCoVJwI.lean.js b/assets/garden_my-personal-website_index.md.DryeDwGD.lean.js similarity index 89% rename from assets/garden_my-personal-website_index.md.DbCoVJwI.lean.js rename to assets/garden_my-personal-website_index.md.DryeDwGD.lean.js index 53a17916..e4985170 100644 --- a/assets/garden_my-personal-website_index.md.DbCoVJwI.lean.js +++ b/assets/garden_my-personal-website_index.md.DryeDwGD.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"My Personal Website","description":"","frontmatter":{"public":"true","slug":"my-personal-website","title":"My Personal Website","prev":false,"next":false},"headers":[],"relativePath":"garden/my-personal-website/index.md","filePath":"garden/my-personal-website/index.md","lastUpdated":1718069968000}'),s={name:"garden/my-personal-website/index.md"},o=r("",3),n=[o];function l(i,p,d,_,c,b){return t(),a("div",null,n)}const f=e(s,[["render",l]]);export{m as __pageData,f as default}; +import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"My Personal Website","description":"","frontmatter":{"public":"true","slug":"my-personal-website","title":"My Personal Website","prev":false,"next":false},"headers":[],"relativePath":"garden/my-personal-website/index.md","filePath":"garden/my-personal-website/index.md","lastUpdated":1717647948000}'),s={name:"garden/my-personal-website/index.md"},o=r("",3),n=[o];function l(i,p,d,_,c,b){return t(),a("div",null,n)}const f=e(s,[["render",l]]);export{m as __pageData,f as default}; diff --git a/assets/garden_my-projects_index.md.kS6uq5l_.js b/assets/garden_my-projects_index.md.efagz0SF.js similarity index 97% rename from assets/garden_my-projects_index.md.kS6uq5l_.js rename to assets/garden_my-projects_index.md.efagz0SF.js index ed3e9ba0..e0aaeea8 100644 --- a/assets/garden_my-projects_index.md.kS6uq5l_.js +++ b/assets/garden_my-projects_index.md.efagz0SF.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"My Projects","description":"","frontmatter":{"index":"true","public":"true","slug":"my-projects","title":"My Projects","prev":false,"next":false},"headers":[],"relativePath":"garden/my-projects/index.md","filePath":"garden/my-projects/index.md","lastUpdated":1718069968000}'),n={name:"garden/my-projects/index.md"},o=t('

My Projects

Tagged by: Advent Incremental, Babble Buds, Capture the Citadel, Dice Armor, Game Dev Tree, Incremental Social, Kronos, Opti-Speech, Planar Pioneers, Profectus, V-ecs

I like making games and tools!

Games

Tools (and other non-games)

',7),l=[o];function i(s,d,c,h,p,g){return r(),a("div",null,l)}const u=e(n,[["render",i]]);export{f as __pageData,u as default}; +import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"My Projects","description":"","frontmatter":{"index":"true","public":"true","slug":"my-projects","title":"My Projects","prev":false,"next":false},"headers":[],"relativePath":"garden/my-projects/index.md","filePath":"garden/my-projects/index.md","lastUpdated":1717647948000}'),n={name:"garden/my-projects/index.md"},o=t('

My Projects

Tagged by: Advent Incremental, Babble Buds, Capture the Citadel, Dice Armor, Game Dev Tree, Incremental Social, Kronos, Opti-Speech, Planar Pioneers, Profectus, V-ecs

I like making games and tools!

Games

Tools (and other non-games)

',7),l=[o];function i(s,d,c,h,p,g){return r(),a("div",null,l)}const u=e(n,[["render",i]]);export{f as __pageData,u as default}; diff --git a/assets/garden_my-projects_index.md.kS6uq5l_.lean.js b/assets/garden_my-projects_index.md.efagz0SF.lean.js similarity index 88% rename from assets/garden_my-projects_index.md.kS6uq5l_.lean.js rename to assets/garden_my-projects_index.md.efagz0SF.lean.js index 89094b03..7fa9f743 100644 --- a/assets/garden_my-projects_index.md.kS6uq5l_.lean.js +++ b/assets/garden_my-projects_index.md.efagz0SF.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"My Projects","description":"","frontmatter":{"index":"true","public":"true","slug":"my-projects","title":"My Projects","prev":false,"next":false},"headers":[],"relativePath":"garden/my-projects/index.md","filePath":"garden/my-projects/index.md","lastUpdated":1718069968000}'),n={name:"garden/my-projects/index.md"},o=t("",7),l=[o];function i(s,d,c,h,p,g){return r(),a("div",null,l)}const u=e(n,[["render",i]]);export{f as __pageData,u as default}; +import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"My Projects","description":"","frontmatter":{"index":"true","public":"true","slug":"my-projects","title":"My Projects","prev":false,"next":false},"headers":[],"relativePath":"garden/my-projects/index.md","filePath":"garden/my-projects/index.md","lastUpdated":1717647948000}'),n={name:"garden/my-projects/index.md"},o=t("",7),l=[o];function i(s,d,c,h,p,g){return r(),a("div",null,l)}const u=e(n,[["render",i]]);export{f as __pageData,u as default}; diff --git a/assets/garden_nostr_index.md.lCBdDjSu.js b/assets/garden_nostr_index.md.CnVfHGYc.js similarity index 93% rename from assets/garden_nostr_index.md.lCBdDjSu.js rename to assets/garden_nostr_index.md.CnVfHGYc.js index 7c9f60b3..4d8b0e0c 100644 --- a/assets/garden_nostr_index.md.lCBdDjSu.js +++ b/assets/garden_nostr_index.md.CnVfHGYc.js @@ -1 +1 @@ -import{_ as e,c as t,o as r,a9 as a}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Nostr","description":"","frontmatter":{"public":"true","slug":"nostr","tags":["Decentralized"],"title":"Nostr","prev":false,"next":false},"headers":[],"relativePath":"garden/nostr/index.md","filePath":"garden/nostr/index.md","lastUpdated":1718069968000}'),o={name:"garden/nostr/index.md"},s=a('

Nostr

Referenced by: Fediverse

Tags: Decentralized

Nostr is a protocol for Federated Social Media

',4),n=[s];function d(c,i,l,_,p,f){return r(),t("div",null,n)}const g=e(o,[["render",d]]);export{u as __pageData,g as default}; +import{_ as e,c as t,o as r,a9 as a}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Nostr","description":"","frontmatter":{"public":"true","slug":"nostr","tags":["Decentralized"],"title":"Nostr","prev":false,"next":false},"headers":[],"relativePath":"garden/nostr/index.md","filePath":"garden/nostr/index.md","lastUpdated":1717647948000}'),o={name:"garden/nostr/index.md"},s=a('

Nostr

Referenced by: Fediverse

Tags: Decentralized

Nostr is a protocol for Federated Social Media

',4),n=[s];function d(c,i,l,_,p,f){return r(),t("div",null,n)}const g=e(o,[["render",d]]);export{u as __pageData,g as default}; diff --git a/assets/garden_nostr_index.md.lCBdDjSu.lean.js b/assets/garden_nostr_index.md.CnVfHGYc.lean.js similarity index 87% rename from assets/garden_nostr_index.md.lCBdDjSu.lean.js rename to assets/garden_nostr_index.md.CnVfHGYc.lean.js index a96004a3..b8d8bcf0 100644 --- a/assets/garden_nostr_index.md.lCBdDjSu.lean.js +++ b/assets/garden_nostr_index.md.CnVfHGYc.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as r,a9 as a}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Nostr","description":"","frontmatter":{"public":"true","slug":"nostr","tags":["Decentralized"],"title":"Nostr","prev":false,"next":false},"headers":[],"relativePath":"garden/nostr/index.md","filePath":"garden/nostr/index.md","lastUpdated":1718069968000}'),o={name:"garden/nostr/index.md"},s=a("",4),n=[s];function d(c,i,l,_,p,f){return r(),t("div",null,n)}const g=e(o,[["render",d]]);export{u as __pageData,g as default}; +import{_ as e,c as t,o as r,a9 as a}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Nostr","description":"","frontmatter":{"public":"true","slug":"nostr","tags":["Decentralized"],"title":"Nostr","prev":false,"next":false},"headers":[],"relativePath":"garden/nostr/index.md","filePath":"garden/nostr/index.md","lastUpdated":1717647948000}'),o={name:"garden/nostr/index.md"},s=a("",4),n=[s];function d(c,i,l,_,p,f){return r(),t("div",null,n)}const g=e(o,[["render",d]]);export{u as __pageData,g as default}; diff --git a/assets/garden_open-source_index.md.BrIASRsU.js b/assets/garden_open-source_index.md.DFsY5O5E.js similarity index 95% rename from assets/garden_open-source_index.md.BrIASRsU.js rename to assets/garden_open-source_index.md.DFsY5O5E.js index 2bf9953a..1cf9b803 100644 --- a/assets/garden_open-source_index.md.BrIASRsU.js +++ b/assets/garden_open-source_index.md.DFsY5O5E.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as n}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Open Source","description":"","frontmatter":{"public":"true","slug":"open-source","title":"Open Source","prev":false,"next":false},"headers":[],"relativePath":"garden/open-source/index.md","filePath":"garden/open-source/index.md","lastUpdated":1718069968000}'),o={name:"garden/open-source/index.md"},t=n('

Open Source

Referenced by: Advent Incremental, Cinny, Commune, Dice Armor, Forgejo, Game Dev Tree, Logseq, Mbin, Planar Pioneers, Profectus, Synapse, Vitepress, Weird

Projects with the source code publicly accessible

Typically also grants users the right to modify the code and redistribute those changes, depending on the license

',4),s=[t];function c(d,i,p,l,h,u){return r(),a("div",null,s)}const _=e(o,[["render",c]]);export{g as __pageData,_ as default}; +import{_ as e,c as a,o as r,a9 as n}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Open Source","description":"","frontmatter":{"public":"true","slug":"open-source","title":"Open Source","prev":false,"next":false},"headers":[],"relativePath":"garden/open-source/index.md","filePath":"garden/open-source/index.md","lastUpdated":1717647948000}'),o={name:"garden/open-source/index.md"},t=n('

Open Source

Referenced by: Advent Incremental, Cinny, Commune, Dice Armor, Forgejo, Game Dev Tree, Logseq, Mbin, Planar Pioneers, Profectus, Synapse, Vitepress, Weird

Projects with the source code publicly accessible

Typically also grants users the right to modify the code and redistribute those changes, depending on the license

',4),s=[t];function c(d,i,p,l,h,u){return r(),a("div",null,s)}const _=e(o,[["render",c]]);export{g as __pageData,_ as default}; diff --git a/assets/garden_open-source_index.md.BrIASRsU.lean.js b/assets/garden_open-source_index.md.DFsY5O5E.lean.js similarity index 88% rename from assets/garden_open-source_index.md.BrIASRsU.lean.js rename to assets/garden_open-source_index.md.DFsY5O5E.lean.js index 82748b1c..5255b81b 100644 --- a/assets/garden_open-source_index.md.BrIASRsU.lean.js +++ b/assets/garden_open-source_index.md.DFsY5O5E.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as n}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Open Source","description":"","frontmatter":{"public":"true","slug":"open-source","title":"Open Source","prev":false,"next":false},"headers":[],"relativePath":"garden/open-source/index.md","filePath":"garden/open-source/index.md","lastUpdated":1718069968000}'),o={name:"garden/open-source/index.md"},t=n("",4),s=[t];function c(d,i,p,l,h,u){return r(),a("div",null,s)}const _=e(o,[["render",c]]);export{g as __pageData,_ as default}; +import{_ as e,c as a,o as r,a9 as n}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Open Source","description":"","frontmatter":{"public":"true","slug":"open-source","title":"Open Source","prev":false,"next":false},"headers":[],"relativePath":"garden/open-source/index.md","filePath":"garden/open-source/index.md","lastUpdated":1717647948000}'),o={name:"garden/open-source/index.md"},t=n("",4),s=[t];function c(d,i,p,l,h,u){return r(),a("div",null,s)}const _=e(o,[["render",c]]);export{g as __pageData,_ as default}; diff --git a/assets/garden_opti-speech_index.md.C0T7MKQx.js b/assets/garden_opti-speech_index.md.C1FMxL_Q.js similarity index 98% rename from assets/garden_opti-speech_index.md.C0T7MKQx.js rename to assets/garden_opti-speech_index.md.C1FMxL_Q.js index 5d44630e..d6e86d1c 100644 --- a/assets/garden_opti-speech_index.md.C0T7MKQx.js +++ b/assets/garden_opti-speech_index.md.C1FMxL_Q.js @@ -1 +1 @@ -import{_ as a,c as r,o as i,a9 as t,j as e,ak as o,al as s,am as n,an as p}from"./chunks/framework.D8PMdl4T.js";const P=JSON.parse('{"title":"Opti-Speech","description":"","frontmatter":{"public":"true","slug":"opti-speech","tags":["My Projects"],"title":"Opti-Speech","prev":false,"next":false},"headers":[],"relativePath":"garden/opti-speech/index.md","filePath":"garden/opti-speech/index.md","lastUpdated":1718069968000}'),l={name:"garden/opti-speech/index.md"},c=t('

Opti-Speech

Tags: My Projects

In college I continued development on the Opti-Speech project, originally built alongside the scientific paper Opti-speech: a real-time, 3d visual feedback system for speech training

The Original Project

The Optispeech project involves designing and testing a real-time tongue model that can be viewed in a transparent head while a subject talks — for the purposes of treating speech errors and teaching foreign language sounds. This work has been conducted in partnership with Vulintus and with support from the National Institutes of Health (NIH).

system-architecture-600.jpg

',6),h=e("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/9uHqIRs7ZjM",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:"",style:{display:"block",margin:"auto"}},null,-1),d=e("p",null,"This video shows a talker with WAVE sensors placed on the tongue hitting a virtual target sphere located at the alveolar ridge. When an alveolar consonant is hit (e.g., /s/, /n/, /d/) the sphere changes color from red to green.",-1),m=e("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/Oz42mKvlzqI",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:"",style:{display:"block",margin:"auto"}},null,-1),u=t('

This video shows an American talker learning a novel sound not found in English. When the post-alveolar consonant is hit, the target sphere changes color from red to green. Here, the NDI WAVE system serves as input.

My Work

As the sole programmer at UT Dallas Speech Production Lab at the time, my changes involved updating to a more modern version of Unity, improving the interface, in general cleaning up tech debt so it can more easily support new features, and added support for additional EMA systems, namely the Carstens AG501.

new-interface.png

In addition, the program now includes documentation and unit tests to improve program stability and maintainability going forward.

documentation.png

unittests.png

',7),_=[c,h,d,m,u];function g(f,b,y,w,v,k){return i(),r("div",null,_)}const S=a(l,[["render",g]]);export{P as __pageData,S as default}; +import{_ as a,c as r,o as i,a9 as t,j as e,ak as o,al as s,am as n,an as p}from"./chunks/framework.D8PMdl4T.js";const P=JSON.parse('{"title":"Opti-Speech","description":"","frontmatter":{"public":"true","slug":"opti-speech","tags":["My Projects"],"title":"Opti-Speech","prev":false,"next":false},"headers":[],"relativePath":"garden/opti-speech/index.md","filePath":"garden/opti-speech/index.md","lastUpdated":1717647948000}'),l={name:"garden/opti-speech/index.md"},c=t('

Opti-Speech

Tags: My Projects

In college I continued development on the Opti-Speech project, originally built alongside the scientific paper Opti-speech: a real-time, 3d visual feedback system for speech training

The Original Project

The Optispeech project involves designing and testing a real-time tongue model that can be viewed in a transparent head while a subject talks — for the purposes of treating speech errors and teaching foreign language sounds. This work has been conducted in partnership with Vulintus and with support from the National Institutes of Health (NIH).

system-architecture-600.jpg

',6),h=e("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/9uHqIRs7ZjM",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:"",style:{display:"block",margin:"auto"}},null,-1),d=e("p",null,"This video shows a talker with WAVE sensors placed on the tongue hitting a virtual target sphere located at the alveolar ridge. When an alveolar consonant is hit (e.g., /s/, /n/, /d/) the sphere changes color from red to green.",-1),m=e("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/Oz42mKvlzqI",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:"",style:{display:"block",margin:"auto"}},null,-1),u=t('

This video shows an American talker learning a novel sound not found in English. When the post-alveolar consonant is hit, the target sphere changes color from red to green. Here, the NDI WAVE system serves as input.

My Work

As the sole programmer at UT Dallas Speech Production Lab at the time, my changes involved updating to a more modern version of Unity, improving the interface, in general cleaning up tech debt so it can more easily support new features, and added support for additional EMA systems, namely the Carstens AG501.

new-interface.png

In addition, the program now includes documentation and unit tests to improve program stability and maintainability going forward.

documentation.png

unittests.png

',7),_=[c,h,d,m,u];function g(f,b,y,w,v,k){return i(),r("div",null,_)}const S=a(l,[["render",g]]);export{P as __pageData,S as default}; diff --git a/assets/garden_opti-speech_index.md.C0T7MKQx.lean.js b/assets/garden_opti-speech_index.md.C1FMxL_Q.lean.js similarity index 95% rename from assets/garden_opti-speech_index.md.C0T7MKQx.lean.js rename to assets/garden_opti-speech_index.md.C1FMxL_Q.lean.js index 1846b83d..793a3faa 100644 --- a/assets/garden_opti-speech_index.md.C0T7MKQx.lean.js +++ b/assets/garden_opti-speech_index.md.C1FMxL_Q.lean.js @@ -1 +1 @@ -import{_ as a,c as r,o as i,a9 as t,j as e,ak as o,al as s,am as n,an as p}from"./chunks/framework.D8PMdl4T.js";const P=JSON.parse('{"title":"Opti-Speech","description":"","frontmatter":{"public":"true","slug":"opti-speech","tags":["My Projects"],"title":"Opti-Speech","prev":false,"next":false},"headers":[],"relativePath":"garden/opti-speech/index.md","filePath":"garden/opti-speech/index.md","lastUpdated":1718069968000}'),l={name:"garden/opti-speech/index.md"},c=t("",6),h=e("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/9uHqIRs7ZjM",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:"",style:{display:"block",margin:"auto"}},null,-1),d=e("p",null,"This video shows a talker with WAVE sensors placed on the tongue hitting a virtual target sphere located at the alveolar ridge. When an alveolar consonant is hit (e.g., /s/, /n/, /d/) the sphere changes color from red to green.",-1),m=e("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/Oz42mKvlzqI",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:"",style:{display:"block",margin:"auto"}},null,-1),u=t("",7),_=[c,h,d,m,u];function g(f,b,y,w,v,k){return i(),r("div",null,_)}const S=a(l,[["render",g]]);export{P as __pageData,S as default}; +import{_ as a,c as r,o as i,a9 as t,j as e,ak as o,al as s,am as n,an as p}from"./chunks/framework.D8PMdl4T.js";const P=JSON.parse('{"title":"Opti-Speech","description":"","frontmatter":{"public":"true","slug":"opti-speech","tags":["My Projects"],"title":"Opti-Speech","prev":false,"next":false},"headers":[],"relativePath":"garden/opti-speech/index.md","filePath":"garden/opti-speech/index.md","lastUpdated":1717647948000}'),l={name:"garden/opti-speech/index.md"},c=t("",6),h=e("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/9uHqIRs7ZjM",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:"",style:{display:"block",margin:"auto"}},null,-1),d=e("p",null,"This video shows a talker with WAVE sensors placed on the tongue hitting a virtual target sphere located at the alveolar ridge. When an alveolar consonant is hit (e.g., /s/, /n/, /d/) the sphere changes color from red to green.",-1),m=e("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/Oz42mKvlzqI",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:"",style:{display:"block",margin:"auto"}},null,-1),u=t("",7),_=[c,h,d,m,u];function g(f,b,y,w,v,k){return i(),r("div",null,_)}const S=a(l,[["render",g]]);export{P as __pageData,S as default}; diff --git a/assets/garden_planar-pioneers_index.md.6LR6SQYR.js b/assets/garden_planar-pioneers_index.md.DjRmOjdq.js similarity index 95% rename from assets/garden_planar-pioneers_index.md.6LR6SQYR.js rename to assets/garden_planar-pioneers_index.md.DjRmOjdq.js index 77267a16..83954828 100644 --- a/assets/garden_planar-pioneers_index.md.6LR6SQYR.js +++ b/assets/garden_planar-pioneers_index.md.DjRmOjdq.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Planar Pioneers","description":"","frontmatter":{"public":"true","slug":"planar-pioneers","tags":["My Projects","Profectus"],"title":"Planar Pioneers","prev":false,"next":false},"headers":[],"relativePath":"garden/planar-pioneers/index.md","filePath":"garden/planar-pioneers/index.md","lastUpdated":1718069968000}'),o={name:"garden/planar-pioneers/index.md"},n=t('

Planar Pioneers

Tags: My Projects, Profectus

Play it here!

An Open Source game designed to show off Profectus' dynamic layer system!

The TV Tropes page on this game mentions some of the cool things about this game

',5),s=[n];function p(i,l,c,d,_,h){return r(),a("div",null,s)}const m=e(o,[["render",p]]);export{g as __pageData,m as default}; +import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Planar Pioneers","description":"","frontmatter":{"public":"true","slug":"planar-pioneers","tags":["My Projects","Profectus"],"title":"Planar Pioneers","prev":false,"next":false},"headers":[],"relativePath":"garden/planar-pioneers/index.md","filePath":"garden/planar-pioneers/index.md","lastUpdated":1717647948000}'),o={name:"garden/planar-pioneers/index.md"},n=t('

Planar Pioneers

Tags: My Projects, Profectus

Play it here!

An Open Source game designed to show off Profectus' dynamic layer system!

The TV Tropes page on this game mentions some of the cool things about this game

',5),s=[n];function p(i,l,c,d,_,h){return r(),a("div",null,s)}const m=e(o,[["render",p]]);export{g as __pageData,m as default}; diff --git a/assets/garden_planar-pioneers_index.md.6LR6SQYR.lean.js b/assets/garden_planar-pioneers_index.md.DjRmOjdq.lean.js similarity index 89% rename from assets/garden_planar-pioneers_index.md.6LR6SQYR.lean.js rename to assets/garden_planar-pioneers_index.md.DjRmOjdq.lean.js index fee4e8d6..c418bb72 100644 --- a/assets/garden_planar-pioneers_index.md.6LR6SQYR.lean.js +++ b/assets/garden_planar-pioneers_index.md.DjRmOjdq.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Planar Pioneers","description":"","frontmatter":{"public":"true","slug":"planar-pioneers","tags":["My Projects","Profectus"],"title":"Planar Pioneers","prev":false,"next":false},"headers":[],"relativePath":"garden/planar-pioneers/index.md","filePath":"garden/planar-pioneers/index.md","lastUpdated":1718069968000}'),o={name:"garden/planar-pioneers/index.md"},n=t("",5),s=[n];function p(i,l,c,d,_,h){return r(),a("div",null,s)}const m=e(o,[["render",p]]);export{g as __pageData,m as default}; +import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Planar Pioneers","description":"","frontmatter":{"public":"true","slug":"planar-pioneers","tags":["My Projects","Profectus"],"title":"Planar Pioneers","prev":false,"next":false},"headers":[],"relativePath":"garden/planar-pioneers/index.md","filePath":"garden/planar-pioneers/index.md","lastUpdated":1717647948000}'),o={name:"garden/planar-pioneers/index.md"},n=t("",5),s=[n];function p(i,l,c,d,_,h){return r(),a("div",null,s)}const m=e(o,[["render",p]]);export{g as __pageData,m as default}; diff --git a/assets/garden_profectus_index.md.Y8HQeYK8.js b/assets/garden_profectus_index.md.0UR_Gmo7.js similarity index 96% rename from assets/garden_profectus_index.md.Y8HQeYK8.js rename to assets/garden_profectus_index.md.0UR_Gmo7.js index 45b12ed9..74358e4a 100644 --- a/assets/garden_profectus_index.md.Y8HQeYK8.js +++ b/assets/garden_profectus_index.md.0UR_Gmo7.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Profectus","description":"","frontmatter":{"public":"true","slug":"profectus","tags":["My Projects"],"title":"Profectus","prev":false,"next":false},"headers":[],"relativePath":"garden/profectus/index.md","filePath":"garden/profectus/index.md","lastUpdated":1718069968000}'),o={name:"garden/profectus/index.md"},n=t('

Profectus

Referenced by: Advent Incremental, Planar Pioneers

Tagged by: Advent Incremental, Kronos, Planar Pioneers

Tags: My Projects

Profectus is an Open Source game engine I made, loosely based on The Modding Tree by Acamaeda

Technically it's more of a template for making web games

It centers around using Vue's reactivity and is designed with the intent to not restrain developers into making games that only look or behave "one way"

Games made with Profectus:

  • Everything in this garden tagged with this page!
  • The entries to the Profectus Creation Jam
  • Primordia by Jacorb
',9),s=[n];function i(c,l,d,p,f,u){return r(),a("div",null,s)}const m=e(o,[["render",i]]);export{g as __pageData,m as default}; +import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Profectus","description":"","frontmatter":{"public":"true","slug":"profectus","tags":["My Projects"],"title":"Profectus","prev":false,"next":false},"headers":[],"relativePath":"garden/profectus/index.md","filePath":"garden/profectus/index.md","lastUpdated":1717647948000}'),o={name:"garden/profectus/index.md"},n=t('

Profectus

Referenced by: Advent Incremental, Planar Pioneers

Tagged by: Advent Incremental, Kronos, Planar Pioneers

Tags: My Projects

Profectus is an Open Source game engine I made, loosely based on The Modding Tree by Acamaeda

Technically it's more of a template for making web games

It centers around using Vue's reactivity and is designed with the intent to not restrain developers into making games that only look or behave "one way"

Games made with Profectus:

  • Everything in this garden tagged with this page!
  • The entries to the Profectus Creation Jam
  • Primordia by Jacorb
',9),s=[n];function i(c,l,d,p,f,u){return r(),a("div",null,s)}const m=e(o,[["render",i]]);export{g as __pageData,m as default}; diff --git a/assets/garden_profectus_index.md.Y8HQeYK8.lean.js b/assets/garden_profectus_index.md.0UR_Gmo7.lean.js similarity index 88% rename from assets/garden_profectus_index.md.Y8HQeYK8.lean.js rename to assets/garden_profectus_index.md.0UR_Gmo7.lean.js index 89071366..f1da031a 100644 --- a/assets/garden_profectus_index.md.Y8HQeYK8.lean.js +++ b/assets/garden_profectus_index.md.0UR_Gmo7.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Profectus","description":"","frontmatter":{"public":"true","slug":"profectus","tags":["My Projects"],"title":"Profectus","prev":false,"next":false},"headers":[],"relativePath":"garden/profectus/index.md","filePath":"garden/profectus/index.md","lastUpdated":1718069968000}'),o={name:"garden/profectus/index.md"},n=t("",9),s=[n];function i(c,l,d,p,f,u){return r(),a("div",null,s)}const m=e(o,[["render",i]]);export{g as __pageData,m as default}; +import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Profectus","description":"","frontmatter":{"public":"true","slug":"profectus","tags":["My Projects"],"title":"Profectus","prev":false,"next":false},"headers":[],"relativePath":"garden/profectus/index.md","filePath":"garden/profectus/index.md","lastUpdated":1717647948000}'),o={name:"garden/profectus/index.md"},n=t("",9),s=[n];function i(c,l,d,p,f,u){return r(),a("div",null,s)}const m=e(o,[["render",i]]);export{g as __pageData,m as default}; diff --git a/assets/garden_social-media_index.md.CxiS8Ne_.js b/assets/garden_social-media_index.md.CZWs3kNq.js similarity index 96% rename from assets/garden_social-media_index.md.CxiS8Ne_.js rename to assets/garden_social-media_index.md.CZWs3kNq.js index 521591c6..e9cd88c1 100644 --- a/assets/garden_social-media_index.md.CxiS8Ne_.js +++ b/assets/garden_social-media_index.md.CZWs3kNq.js @@ -1 +1 @@ -import{_ as e,c as a,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Social Media","description":"","frontmatter":{"alias":"Social Web","public":"true","slug":"social-media","title":"Social Media","prev":false,"next":false},"headers":[],"relativePath":"garden/social-media/index.md","filePath":"garden/social-media/index.md","lastUpdated":1718069968000}'),l={name:"garden/social-media/index.md"},o=t('

Social Media

Referenced by: Commune, Fedi v2, Fediverse

Traditional social media

  • Not Decentralized
    • Can't choose your own rules, sorting methods, data queries, etc.
  • Overrun by scams and ads and influencers

Federated Social Media

  • Partially Decentralized
    • Self hosting is too hard for everyone to do
    • Still subject to instance's moderation, limitations, etc.
  • Users need to pick an instance, associating their identity with one specific group
    • People belong to many groups
    • The person is permanently associated with that one group
    • You have to pick before getting a "trial period" to ensure you actually like that group/instance

My take on an ideal social media Fedi v2

',7),n=[o];function r(d,s,c,u,p,h){return i(),a("div",null,n)}const _=e(l,[["render",r]]);export{m as __pageData,_ as default}; +import{_ as e,c as a,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Social Media","description":"","frontmatter":{"alias":"Social Web","public":"true","slug":"social-media","title":"Social Media","prev":false,"next":false},"headers":[],"relativePath":"garden/social-media/index.md","filePath":"garden/social-media/index.md","lastUpdated":1717647948000}'),l={name:"garden/social-media/index.md"},o=t('

Social Media

Referenced by: Commune, Fedi v2, Fediverse

Traditional social media

  • Not Decentralized
    • Can't choose your own rules, sorting methods, data queries, etc.
  • Overrun by scams and ads and influencers

Federated Social Media

  • Partially Decentralized
    • Self hosting is too hard for everyone to do
    • Still subject to instance's moderation, limitations, etc.
  • Users need to pick an instance, associating their identity with one specific group
    • People belong to many groups
    • The person is permanently associated with that one group
    • You have to pick before getting a "trial period" to ensure you actually like that group/instance

My take on an ideal social media Fedi v2

',7),n=[o];function r(d,s,c,u,p,h){return i(),a("div",null,n)}const _=e(l,[["render",r]]);export{m as __pageData,_ as default}; diff --git a/assets/garden_social-media_index.md.CxiS8Ne_.lean.js b/assets/garden_social-media_index.md.CZWs3kNq.lean.js similarity index 88% rename from assets/garden_social-media_index.md.CxiS8Ne_.lean.js rename to assets/garden_social-media_index.md.CZWs3kNq.lean.js index 7bbbf75f..ba94bf3a 100644 --- a/assets/garden_social-media_index.md.CxiS8Ne_.lean.js +++ b/assets/garden_social-media_index.md.CZWs3kNq.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Social Media","description":"","frontmatter":{"alias":"Social Web","public":"true","slug":"social-media","title":"Social Media","prev":false,"next":false},"headers":[],"relativePath":"garden/social-media/index.md","filePath":"garden/social-media/index.md","lastUpdated":1718069968000}'),l={name:"garden/social-media/index.md"},o=t("",7),n=[o];function r(d,s,c,u,p,h){return i(),a("div",null,n)}const _=e(l,[["render",r]]);export{m as __pageData,_ as default}; +import{_ as e,c as a,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Social Media","description":"","frontmatter":{"alias":"Social Web","public":"true","slug":"social-media","title":"Social Media","prev":false,"next":false},"headers":[],"relativePath":"garden/social-media/index.md","filePath":"garden/social-media/index.md","lastUpdated":1717647948000}'),l={name:"garden/social-media/index.md"},o=t("",7),n=[o];function r(d,s,c,u,p,h){return i(),a("div",null,n)}const _=e(l,[["render",r]]);export{m as __pageData,_ as default}; diff --git a/assets/garden_synapse_index.md.6c0_vLtD.js b/assets/garden_synapse_index.md.DlkipkaT.js similarity index 93% rename from assets/garden_synapse_index.md.6c0_vLtD.js rename to assets/garden_synapse_index.md.DlkipkaT.js index c9357982..2e8a0306 100644 --- a/assets/garden_synapse_index.md.6c0_vLtD.js +++ b/assets/garden_synapse_index.md.DlkipkaT.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as n}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Synapse","description":"","frontmatter":{"public":"true","slug":"synapse","title":"Synapse","prev":false,"next":false},"headers":[],"relativePath":"garden/synapse/index.md","filePath":"garden/synapse/index.md","lastUpdated":1718069968000}'),r={name:"garden/synapse/index.md"},s=n('

Synapse

Referenced by: Incremental Social

Synapse is an Open Source server software for the Matrix protocol

',3),o=[s];function p(c,i,d,l,_,f){return t(),a("div",null,o)}const u=e(r,[["render",p]]);export{m as __pageData,u as default}; +import{_ as e,c as a,o as t,a9 as n}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Synapse","description":"","frontmatter":{"public":"true","slug":"synapse","title":"Synapse","prev":false,"next":false},"headers":[],"relativePath":"garden/synapse/index.md","filePath":"garden/synapse/index.md","lastUpdated":1717647948000}'),r={name:"garden/synapse/index.md"},s=n('

Synapse

Referenced by: Incremental Social

Synapse is an Open Source server software for the Matrix protocol

',3),o=[s];function p(c,i,d,l,_,f){return t(),a("div",null,o)}const u=e(r,[["render",p]]);export{m as __pageData,u as default}; diff --git a/assets/garden_synapse_index.md.6c0_vLtD.lean.js b/assets/garden_synapse_index.md.DlkipkaT.lean.js similarity index 87% rename from assets/garden_synapse_index.md.6c0_vLtD.lean.js rename to assets/garden_synapse_index.md.DlkipkaT.lean.js index 39bc323c..3e96d200 100644 --- a/assets/garden_synapse_index.md.6c0_vLtD.lean.js +++ b/assets/garden_synapse_index.md.DlkipkaT.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as n}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Synapse","description":"","frontmatter":{"public":"true","slug":"synapse","title":"Synapse","prev":false,"next":false},"headers":[],"relativePath":"garden/synapse/index.md","filePath":"garden/synapse/index.md","lastUpdated":1718069968000}'),r={name:"garden/synapse/index.md"},s=n("",3),o=[s];function p(c,i,d,l,_,f){return t(),a("div",null,o)}const u=e(r,[["render",p]]);export{m as __pageData,u as default}; +import{_ as e,c as a,o as t,a9 as n}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Synapse","description":"","frontmatter":{"public":"true","slug":"synapse","title":"Synapse","prev":false,"next":false},"headers":[],"relativePath":"garden/synapse/index.md","filePath":"garden/synapse/index.md","lastUpdated":1717647948000}'),r={name:"garden/synapse/index.md"},s=n("",3),o=[s];function p(c,i,d,l,_,f){return t(),a("div",null,o)}const u=e(r,[["render",p]]);export{m as __pageData,u as default}; diff --git a/assets/garden_the-beginner-s-guide_index.md.BejdJHJA.js b/assets/garden_the-beginner-s-guide_index.md.vCAvuQfF.js similarity index 96% rename from assets/garden_the-beginner-s-guide_index.md.BejdJHJA.js rename to assets/garden_the-beginner-s-guide_index.md.vCAvuQfF.js index ac8d616c..046bbf1e 100644 --- a/assets/garden_the-beginner-s-guide_index.md.BejdJHJA.js +++ b/assets/garden_the-beginner-s-guide_index.md.vCAvuQfF.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as n}from"./chunks/framework.D8PMdl4T.js";const _=JSON.parse(`{"title":"The Beginner's Guide","description":"","frontmatter":{"public":"true","slug":"the-beginner-s-guide","tags":["Davey Wreden"],"title":"The Beginner's Guide","prev":false,"next":false},"headers":[],"relativePath":"garden/the-beginner-s-guide/index.md","filePath":"garden/the-beginner-s-guide/index.md","lastUpdated":1718069968000}`),t={name:"garden/the-beginner-s-guide/index.md"},i=n('

The Beginner's Guide

Tags: Davey Wreden

My favorite video game of all time, bar none. Created by Davey Wreden

The game broadly comments on the relationship between creators and consumers, and it can apply to all forms of art

  • Perhaps also an important commentary on parasocial relationships

Important analyses:

',7),o=[i];function s(l,d,h,u,c,g){return r(),a("div",null,o)}const f=e(t,[["render",s]]);export{_ as __pageData,f as default}; +import{_ as e,c as a,o as r,a9 as n}from"./chunks/framework.D8PMdl4T.js";const _=JSON.parse(`{"title":"The Beginner's Guide","description":"","frontmatter":{"public":"true","slug":"the-beginner-s-guide","tags":["Davey Wreden"],"title":"The Beginner's Guide","prev":false,"next":false},"headers":[],"relativePath":"garden/the-beginner-s-guide/index.md","filePath":"garden/the-beginner-s-guide/index.md","lastUpdated":1717971545000}`),t={name:"garden/the-beginner-s-guide/index.md"},i=n('

The Beginner's Guide

Tags: Davey Wreden

My favorite video game of all time, bar none. Created by Davey Wreden

The game broadly comments on the relationship between creators and consumers, and it can apply to all forms of art

  • Perhaps also an important commentary on parasocial relationships

Important analyses:

',7),o=[i];function s(l,d,h,u,c,g){return r(),a("div",null,o)}const f=e(t,[["render",s]]);export{_ as __pageData,f as default}; diff --git a/assets/garden_the-beginner-s-guide_index.md.BejdJHJA.lean.js b/assets/garden_the-beginner-s-guide_index.md.vCAvuQfF.lean.js similarity index 89% rename from assets/garden_the-beginner-s-guide_index.md.BejdJHJA.lean.js rename to assets/garden_the-beginner-s-guide_index.md.vCAvuQfF.lean.js index e4917f8b..d2236b47 100644 --- a/assets/garden_the-beginner-s-guide_index.md.BejdJHJA.lean.js +++ b/assets/garden_the-beginner-s-guide_index.md.vCAvuQfF.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as n}from"./chunks/framework.D8PMdl4T.js";const _=JSON.parse(`{"title":"The Beginner's Guide","description":"","frontmatter":{"public":"true","slug":"the-beginner-s-guide","tags":["Davey Wreden"],"title":"The Beginner's Guide","prev":false,"next":false},"headers":[],"relativePath":"garden/the-beginner-s-guide/index.md","filePath":"garden/the-beginner-s-guide/index.md","lastUpdated":1718069968000}`),t={name:"garden/the-beginner-s-guide/index.md"},i=n("",7),o=[i];function s(l,d,h,u,c,g){return r(),a("div",null,o)}const f=e(t,[["render",s]]);export{_ as __pageData,f as default}; +import{_ as e,c as a,o as r,a9 as n}from"./chunks/framework.D8PMdl4T.js";const _=JSON.parse(`{"title":"The Beginner's Guide","description":"","frontmatter":{"public":"true","slug":"the-beginner-s-guide","tags":["Davey Wreden"],"title":"The Beginner's Guide","prev":false,"next":false},"headers":[],"relativePath":"garden/the-beginner-s-guide/index.md","filePath":"garden/the-beginner-s-guide/index.md","lastUpdated":1717971545000}`),t={name:"garden/the-beginner-s-guide/index.md"},i=n("",7),o=[i];function s(l,d,h,u,c,g){return r(),a("div",null,o)}const f=e(t,[["render",s]]);export{_ as __pageData,f as default}; diff --git a/assets/garden_the-cozy-web_index.md.C1ibMFr-.js b/assets/garden_the-cozy-web_index.md.C9yKvylk.js similarity index 95% rename from assets/garden_the-cozy-web_index.md.C1ibMFr-.js rename to assets/garden_the-cozy-web_index.md.C9yKvylk.js index 41c825c2..fd29de15 100644 --- a/assets/garden_the-cozy-web_index.md.C1ibMFr-.js +++ b/assets/garden_the-cozy-web_index.md.C9yKvylk.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as o}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"The Cozy Web","description":"","frontmatter":{"public":"true","slug":"the-cozy-web","title":"The Cozy Web","prev":false,"next":false},"headers":[],"relativePath":"garden/the-cozy-web/index.md","filePath":"garden/the-cozy-web/index.md","lastUpdated":1718069968000}'),r={name:"garden/the-cozy-web/index.md"},n=o('

The Cozy Web

Referenced by: Digital Gardens, The Small Web

The Cozy Web is an extension of the dark forest theory of the Internet

It refers to the part of the web that is not web indexable

This part of the web is known for not typically having ads or marketers

Popularized by this article written by Maggie Appleton, who has also written a lot about Digital Gardens

',6),i=[n];function s(h,l,d,c,p,b){return a(),t("div",null,i)}const g=e(r,[["render",s]]);export{f as __pageData,g as default}; +import{_ as e,c as t,o as a,a9 as o}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"The Cozy Web","description":"","frontmatter":{"public":"true","slug":"the-cozy-web","title":"The Cozy Web","prev":false,"next":false},"headers":[],"relativePath":"garden/the-cozy-web/index.md","filePath":"garden/the-cozy-web/index.md","lastUpdated":1717647948000}'),r={name:"garden/the-cozy-web/index.md"},n=o('

The Cozy Web

Referenced by: Digital Gardens, The Small Web

The Cozy Web is an extension of the dark forest theory of the Internet

It refers to the part of the web that is not web indexable

This part of the web is known for not typically having ads or marketers

Popularized by this article written by Maggie Appleton, who has also written a lot about Digital Gardens

',6),i=[n];function s(h,l,d,c,p,b){return a(),t("div",null,i)}const g=e(r,[["render",s]]);export{f as __pageData,g as default}; diff --git a/assets/garden_the-cozy-web_index.md.C1ibMFr-.lean.js b/assets/garden_the-cozy-web_index.md.C9yKvylk.lean.js similarity index 88% rename from assets/garden_the-cozy-web_index.md.C1ibMFr-.lean.js rename to assets/garden_the-cozy-web_index.md.C9yKvylk.lean.js index 52024302..58ace325 100644 --- a/assets/garden_the-cozy-web_index.md.C1ibMFr-.lean.js +++ b/assets/garden_the-cozy-web_index.md.C9yKvylk.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as o}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"The Cozy Web","description":"","frontmatter":{"public":"true","slug":"the-cozy-web","title":"The Cozy Web","prev":false,"next":false},"headers":[],"relativePath":"garden/the-cozy-web/index.md","filePath":"garden/the-cozy-web/index.md","lastUpdated":1718069968000}'),r={name:"garden/the-cozy-web/index.md"},n=o("",6),i=[n];function s(h,l,d,c,p,b){return a(),t("div",null,i)}const g=e(r,[["render",s]]);export{f as __pageData,g as default}; +import{_ as e,c as t,o as a,a9 as o}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"The Cozy Web","description":"","frontmatter":{"public":"true","slug":"the-cozy-web","title":"The Cozy Web","prev":false,"next":false},"headers":[],"relativePath":"garden/the-cozy-web/index.md","filePath":"garden/the-cozy-web/index.md","lastUpdated":1717647948000}'),r={name:"garden/the-cozy-web/index.md"},n=o("",6),i=[n];function s(h,l,d,c,p,b){return a(),t("div",null,i)}const g=e(r,[["render",s]]);export{f as __pageData,g as default}; diff --git a/assets/garden_the-small-web_index.md.CCPoKGQN.js b/assets/garden_the-small-web_index.md.2RHAQRcF.js similarity index 99% rename from assets/garden_the-small-web_index.md.CCPoKGQN.js rename to assets/garden_the-small-web_index.md.2RHAQRcF.js index da214049..f1b06c1d 100644 --- a/assets/garden_the-small-web_index.md.CCPoKGQN.js +++ b/assets/garden_the-small-web_index.md.2RHAQRcF.js @@ -1 +1 @@ -import{_ as a,c as t,o as r,a9 as l,j as e}from"./chunks/framework.D8PMdl4T.js";const w=JSON.parse('{"title":"The Small Web","description":"","frontmatter":{"alias":"The IndieWeb, Personal Web, Personal Websites","public":"true","slug":"the-small-web","title":"The Small Web","prev":false,"next":false},"headers":[],"relativePath":"garden/the-small-web/index.md","filePath":"garden/the-small-web/index.md","lastUpdated":1718069968000}'),i={name:"garden/the-small-web/index.md"},s=l('

The Small Web

Referenced by: This Knowledge Hub

Small personal websites created by individuals

  • My Personal Website
  • A callback to how the web was before social media, which homogenized content
  • These pages are diverse and typically won't have ads or marketers

The small web as a whole is Freeform

  • Individual sites may be Chronological still
  • Individual sites link between each other in ways similar to wikis

Browsing the small web

  • Follow Webrings or other links from known small websites
  • Marginalia is a search engine for non-commercial content with a "random" button and filters for the small web explicitly (amongst other useful filters!)

Building personal websites

IndieWeb contains various resources

  • Their building blocks are standards people can use to help the small web connect with each other consistently
  • They discourage the use of site builders or templates that end up making sites look too homogenized

Free hosting for static websites:

Streams

Microsub is a proposed protocol to support this

  • That way, people could use microsub clients to subscribe to multiple streams and get them in one feed
  • Effectively a Federated Social Media that works through personal websites
  • Announce new posts using WebSub

This also allows your personal website to be the one source of truth for your posted content

Multiple streams can be hosted by one site/person so people can subscribe to the kind of content they're interested in

How viable would it be to include chat messages in a stream as well?

  • Perhaps with Chat Glue you could link to specific branches I chatted in

Digital Gardens

These sites may be useful to occasionally check up on rather than get notifications from on every post/change

  • Although Garden-RSS could allow those who want to receive notifications to do so

Why people want the small web

There are tools these days that make making websites incredibly easy

  • Back in the day geocities was pretty complicated but a lot of people managed to make pages there
  • Neocities has an extensive page on Learn How to Make Websites!

Hosting can be expensive, but static websites are cheap

  • There are plenty of free options out there for hosting static websites
  • People are creative and love creating things
',30),o=e("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/00qwzmMrtok",title:"",frameBorder:"0",allowFullScreen:""},null,-1),n=e("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/rTSEr0cRJY8",title:"",frameBorder:"0",allowFullScreen:""},null,-1),h=[s,o,n];function d(c,b,u,p,g,m){return r(),t("div",null,h)}const k=a(i,[["render",d]]);export{w as __pageData,k as default}; +import{_ as a,c as t,o as r,a9 as l,j as e}from"./chunks/framework.D8PMdl4T.js";const w=JSON.parse('{"title":"The Small Web","description":"","frontmatter":{"alias":"The IndieWeb, Personal Web, Personal Websites","public":"true","slug":"the-small-web","title":"The Small Web","prev":false,"next":false},"headers":[],"relativePath":"garden/the-small-web/index.md","filePath":"garden/the-small-web/index.md","lastUpdated":1717970765000}'),i={name:"garden/the-small-web/index.md"},s=l('

The Small Web

Referenced by: This Knowledge Hub

Small personal websites created by individuals

  • My Personal Website
  • A callback to how the web was before social media, which homogenized content
  • These pages are diverse and typically won't have ads or marketers

The small web as a whole is Freeform

  • Individual sites may be Chronological still
  • Individual sites link between each other in ways similar to wikis

Browsing the small web

  • Follow Webrings or other links from known small websites
  • Marginalia is a search engine for non-commercial content with a "random" button and filters for the small web explicitly (amongst other useful filters!)

Building personal websites

IndieWeb contains various resources

  • Their building blocks are standards people can use to help the small web connect with each other consistently
  • They discourage the use of site builders or templates that end up making sites look too homogenized

Free hosting for static websites:

Streams

Microsub is a proposed protocol to support this

  • That way, people could use microsub clients to subscribe to multiple streams and get them in one feed
  • Effectively a Federated Social Media that works through personal websites
  • Announce new posts using WebSub

This also allows your personal website to be the one source of truth for your posted content

Multiple streams can be hosted by one site/person so people can subscribe to the kind of content they're interested in

How viable would it be to include chat messages in a stream as well?

  • Perhaps with Chat Glue you could link to specific branches I chatted in

Digital Gardens

These sites may be useful to occasionally check up on rather than get notifications from on every post/change

  • Although Garden-RSS could allow those who want to receive notifications to do so

Why people want the small web

There are tools these days that make making websites incredibly easy

  • Back in the day geocities was pretty complicated but a lot of people managed to make pages there
  • Neocities has an extensive page on Learn How to Make Websites!

Hosting can be expensive, but static websites are cheap

  • There are plenty of free options out there for hosting static websites
  • People are creative and love creating things
',30),o=e("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/00qwzmMrtok",title:"",frameBorder:"0",allowFullScreen:""},null,-1),n=e("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/rTSEr0cRJY8",title:"",frameBorder:"0",allowFullScreen:""},null,-1),h=[s,o,n];function d(c,b,u,p,g,m){return r(),t("div",null,h)}const k=a(i,[["render",d]]);export{w as __pageData,k as default}; diff --git a/assets/garden_the-small-web_index.md.CCPoKGQN.lean.js b/assets/garden_the-small-web_index.md.2RHAQRcF.lean.js similarity index 92% rename from assets/garden_the-small-web_index.md.CCPoKGQN.lean.js rename to assets/garden_the-small-web_index.md.2RHAQRcF.lean.js index 7d1cd660..d7f7bbb9 100644 --- a/assets/garden_the-small-web_index.md.CCPoKGQN.lean.js +++ b/assets/garden_the-small-web_index.md.2RHAQRcF.lean.js @@ -1 +1 @@ -import{_ as a,c as t,o as r,a9 as l,j as e}from"./chunks/framework.D8PMdl4T.js";const w=JSON.parse('{"title":"The Small Web","description":"","frontmatter":{"alias":"The IndieWeb, Personal Web, Personal Websites","public":"true","slug":"the-small-web","title":"The Small Web","prev":false,"next":false},"headers":[],"relativePath":"garden/the-small-web/index.md","filePath":"garden/the-small-web/index.md","lastUpdated":1718069968000}'),i={name:"garden/the-small-web/index.md"},s=l("",30),o=e("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/00qwzmMrtok",title:"",frameBorder:"0",allowFullScreen:""},null,-1),n=e("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/rTSEr0cRJY8",title:"",frameBorder:"0",allowFullScreen:""},null,-1),h=[s,o,n];function d(c,b,u,p,g,m){return r(),t("div",null,h)}const k=a(i,[["render",d]]);export{w as __pageData,k as default}; +import{_ as a,c as t,o as r,a9 as l,j as e}from"./chunks/framework.D8PMdl4T.js";const w=JSON.parse('{"title":"The Small Web","description":"","frontmatter":{"alias":"The IndieWeb, Personal Web, Personal Websites","public":"true","slug":"the-small-web","title":"The Small Web","prev":false,"next":false},"headers":[],"relativePath":"garden/the-small-web/index.md","filePath":"garden/the-small-web/index.md","lastUpdated":1717970765000}'),i={name:"garden/the-small-web/index.md"},s=l("",30),o=e("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/00qwzmMrtok",title:"",frameBorder:"0",allowFullScreen:""},null,-1),n=e("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/rTSEr0cRJY8",title:"",frameBorder:"0",allowFullScreen:""},null,-1),h=[s,o,n];function d(c,b,u,p,g,m){return r(),t("div",null,h)}const k=a(i,[["render",d]]);export{w as __pageData,k as default}; diff --git a/assets/garden_this-knowledge-hub_index.md.C_VS46AX.js b/assets/garden_this-knowledge-hub_index.md.BtDJLJGY.js similarity index 96% rename from assets/garden_this-knowledge-hub_index.md.C_VS46AX.js rename to assets/garden_this-knowledge-hub_index.md.BtDJLJGY.js index f48bde12..a8bcc342 100644 --- a/assets/garden_this-knowledge-hub_index.md.C_VS46AX.js +++ b/assets/garden_this-knowledge-hub_index.md.BtDJLJGY.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"This Knowledge Hub","description":"","frontmatter":{"public":"true","slug":"this-knowledge-hub","title":"This Knowledge Hub","prev":false,"next":false},"headers":[],"relativePath":"garden/this-knowledge-hub/index.md","filePath":"garden/this-knowledge-hub/index.md","lastUpdated":1718069968000}'),s={name:"garden/this-knowledge-hub/index.md"},n=i('

This Knowledge Hub

Referenced by: Digital Gardens

This is my knowledge hub!

  • It's a Digital Garden collecting my thoughts in varying levels of completeness on basically anything I have interest in

This is not Wikipedia. My thoughts are biased and argumentative, but to the best of my ability based on fact and expertise

I'm writing on something essentially every day

  • Most of my pages are private, especially the journal pages
  • I'll only push updates to this site every so often (not an automatic process)
  • Until something like Garden-RSS exists, we'll have to make do with /changelog which gives a git diff summary for every pushed change, in the form of a The IndieWeb stream as well as an RSS feed

Written in Logseq and rendered with Vitepress

Suggested pages:

',10),l=[n];function r(o,d,h,g,p,u){return t(),a("div",null,l)}const b=e(s,[["render",r]]);export{f as __pageData,b as default}; +import{_ as e,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"This Knowledge Hub","description":"","frontmatter":{"public":"true","slug":"this-knowledge-hub","title":"This Knowledge Hub","prev":false,"next":false},"headers":[],"relativePath":"garden/this-knowledge-hub/index.md","filePath":"garden/this-knowledge-hub/index.md","lastUpdated":1717647948000}'),s={name:"garden/this-knowledge-hub/index.md"},n=i('

This Knowledge Hub

Referenced by: Digital Gardens

This is my knowledge hub!

  • It's a Digital Garden collecting my thoughts in varying levels of completeness on basically anything I have interest in

This is not Wikipedia. My thoughts are biased and argumentative, but to the best of my ability based on fact and expertise

I'm writing on something essentially every day

  • Most of my pages are private, especially the journal pages
  • I'll only push updates to this site every so often (not an automatic process)
  • Until something like Garden-RSS exists, we'll have to make do with /changelog which gives a git diff summary for every pushed change, in the form of a The IndieWeb stream as well as an RSS feed

Written in Logseq and rendered with Vitepress

Suggested pages:

',10),l=[n];function r(o,d,h,g,p,u){return t(),a("div",null,l)}const b=e(s,[["render",r]]);export{f as __pageData,b as default}; diff --git a/assets/garden_this-knowledge-hub_index.md.C_VS46AX.lean.js b/assets/garden_this-knowledge-hub_index.md.BtDJLJGY.lean.js similarity index 88% rename from assets/garden_this-knowledge-hub_index.md.C_VS46AX.lean.js rename to assets/garden_this-knowledge-hub_index.md.BtDJLJGY.lean.js index 533b7dca..f336a885 100644 --- a/assets/garden_this-knowledge-hub_index.md.C_VS46AX.lean.js +++ b/assets/garden_this-knowledge-hub_index.md.BtDJLJGY.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"This Knowledge Hub","description":"","frontmatter":{"public":"true","slug":"this-knowledge-hub","title":"This Knowledge Hub","prev":false,"next":false},"headers":[],"relativePath":"garden/this-knowledge-hub/index.md","filePath":"garden/this-knowledge-hub/index.md","lastUpdated":1718069968000}'),s={name:"garden/this-knowledge-hub/index.md"},n=i("",10),l=[n];function r(o,d,h,g,p,u){return t(),a("div",null,l)}const b=e(s,[["render",r]]);export{f as __pageData,b as default}; +import{_ as e,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"This Knowledge Hub","description":"","frontmatter":{"public":"true","slug":"this-knowledge-hub","title":"This Knowledge Hub","prev":false,"next":false},"headers":[],"relativePath":"garden/this-knowledge-hub/index.md","filePath":"garden/this-knowledge-hub/index.md","lastUpdated":1717647948000}'),s={name:"garden/this-knowledge-hub/index.md"},n=i("",10),l=[n];function r(o,d,h,g,p,u){return t(),a("div",null,l)}const b=e(s,[["render",r]]);export{f as __pageData,b as default}; diff --git a/assets/garden_v-ecs_index.md.BMdd2G-v.js b/assets/garden_v-ecs_index.md.CeXiyFwA.js similarity index 97% rename from assets/garden_v-ecs_index.md.BMdd2G-v.js rename to assets/garden_v-ecs_index.md.CeXiyFwA.js index 868be66f..4177e36d 100644 --- a/assets/garden_v-ecs_index.md.BMdd2G-v.js +++ b/assets/garden_v-ecs_index.md.CeXiyFwA.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as o,ao as s,ap as n,aq as r}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"V-ecs","description":"","frontmatter":{"public":"true","slug":"v-ecs","tags":["My Projects"],"title":"V-ecs","prev":false,"next":false},"headers":[],"relativePath":"garden/v-ecs/index.md","filePath":"garden/v-ecs/index.md","lastUpdated":1718069968000}'),l={name:"garden/v-ecs/index.md"},i=o('

V-ecs

Tags: My Projects

screenshot.png

V-ecs (pronounced "Vex") is a Vulkan-based engine I made for making highly moddable games and tools in Lua centered around the ECS design pattern and a work-stealing job system.

The engine works with "worlds", which are collections of systems and renderers. The engine comes with several worlds using systems and renderers I made, including a voxel world, an incremental game, and some test scenes. All of these include systems to render the fps as well as show a debug console by typing the grave key (`). The default world is a title screen that detects any worlds in the "worlds" folder and displays a button for each of them.

debug.png

The original plans were to eventually put it on the steam workshop so people could more easily share their creations amongst each other, but I never became happy enough with the performance of the engine - the parallelization of the lua code involved a lot of overhead that severely limited performance.

Instead, I made a couple of worlds by myself - an infinite procedurally generated voxel world, a simple incremental game, and a more complex incremental game I call "Sands of Time".

sandsoftime.png

The gameplay of Sands of Time was replicated in Kronos Chapter 2!

',10),d=[i];function c(p,h,m,g,u,f){return t(),a("div",null,d)}const v=e(l,[["render",c]]);export{y as __pageData,v as default}; +import{_ as e,c as a,o as t,a9 as o,ao as s,ap as n,aq as r}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"V-ecs","description":"","frontmatter":{"public":"true","slug":"v-ecs","tags":["My Projects"],"title":"V-ecs","prev":false,"next":false},"headers":[],"relativePath":"garden/v-ecs/index.md","filePath":"garden/v-ecs/index.md","lastUpdated":1717647948000}'),l={name:"garden/v-ecs/index.md"},i=o('

V-ecs

Tags: My Projects

screenshot.png

V-ecs (pronounced "Vex") is a Vulkan-based engine I made for making highly moddable games and tools in Lua centered around the ECS design pattern and a work-stealing job system.

The engine works with "worlds", which are collections of systems and renderers. The engine comes with several worlds using systems and renderers I made, including a voxel world, an incremental game, and some test scenes. All of these include systems to render the fps as well as show a debug console by typing the grave key (`). The default world is a title screen that detects any worlds in the "worlds" folder and displays a button for each of them.

debug.png

The original plans were to eventually put it on the steam workshop so people could more easily share their creations amongst each other, but I never became happy enough with the performance of the engine - the parallelization of the lua code involved a lot of overhead that severely limited performance.

Instead, I made a couple of worlds by myself - an infinite procedurally generated voxel world, a simple incremental game, and a more complex incremental game I call "Sands of Time".

sandsoftime.png

The gameplay of Sands of Time was replicated in Kronos Chapter 2!

',10),d=[i];function c(p,h,m,g,u,f){return t(),a("div",null,d)}const v=e(l,[["render",c]]);export{y as __pageData,v as default}; diff --git a/assets/garden_v-ecs_index.md.BMdd2G-v.lean.js b/assets/garden_v-ecs_index.md.CeXiyFwA.lean.js similarity index 88% rename from assets/garden_v-ecs_index.md.BMdd2G-v.lean.js rename to assets/garden_v-ecs_index.md.CeXiyFwA.lean.js index 785b9faa..9707064f 100644 --- a/assets/garden_v-ecs_index.md.BMdd2G-v.lean.js +++ b/assets/garden_v-ecs_index.md.CeXiyFwA.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as o,ao as s,ap as n,aq as r}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"V-ecs","description":"","frontmatter":{"public":"true","slug":"v-ecs","tags":["My Projects"],"title":"V-ecs","prev":false,"next":false},"headers":[],"relativePath":"garden/v-ecs/index.md","filePath":"garden/v-ecs/index.md","lastUpdated":1718069968000}'),l={name:"garden/v-ecs/index.md"},i=o("",10),d=[i];function c(p,h,m,g,u,f){return t(),a("div",null,d)}const v=e(l,[["render",c]]);export{y as __pageData,v as default}; +import{_ as e,c as a,o as t,a9 as o,ao as s,ap as n,aq as r}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"V-ecs","description":"","frontmatter":{"public":"true","slug":"v-ecs","tags":["My Projects"],"title":"V-ecs","prev":false,"next":false},"headers":[],"relativePath":"garden/v-ecs/index.md","filePath":"garden/v-ecs/index.md","lastUpdated":1717647948000}'),l={name:"garden/v-ecs/index.md"},i=o("",10),d=[i];function c(p,h,m,g,u,f){return t(),a("div",null,d)}const v=e(l,[["render",c]]);export{y as __pageData,v as default}; diff --git a/assets/garden_vitepress_index.md.DwDwogUe.js b/assets/garden_vitepress_index.md.6SyjaoK2.js similarity index 93% rename from assets/garden_vitepress_index.md.DwDwogUe.js rename to assets/garden_vitepress_index.md.6SyjaoK2.js index 1f0476f9..d7e639ea 100644 --- a/assets/garden_vitepress_index.md.DwDwogUe.js +++ b/assets/garden_vitepress_index.md.6SyjaoK2.js @@ -1 +1 @@ -import{_ as e,c as t,o as s,a9 as r}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Vitepress","description":"","frontmatter":{"public":"true","slug":"vitepress","title":"Vitepress","prev":false,"next":false},"headers":[],"relativePath":"garden/vitepress/index.md","filePath":"garden/vitepress/index.md","lastUpdated":1718069968000}'),a={name:"garden/vitepress/index.md"},i=r('

Vitepress

Referenced by: This Knowledge Hub

Vitepress is an Open Source static site generator

',3),n=[i];function o(p,d,c,_,l,h){return s(),t("div",null,n)}const g=e(a,[["render",o]]);export{u as __pageData,g as default}; +import{_ as e,c as t,o as s,a9 as r}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Vitepress","description":"","frontmatter":{"public":"true","slug":"vitepress","title":"Vitepress","prev":false,"next":false},"headers":[],"relativePath":"garden/vitepress/index.md","filePath":"garden/vitepress/index.md","lastUpdated":1717647948000}'),a={name:"garden/vitepress/index.md"},i=r('

Vitepress

Referenced by: This Knowledge Hub

Vitepress is an Open Source static site generator

',3),n=[i];function o(p,d,c,_,l,h){return s(),t("div",null,n)}const g=e(a,[["render",o]]);export{u as __pageData,g as default}; diff --git a/assets/garden_vitepress_index.md.DwDwogUe.lean.js b/assets/garden_vitepress_index.md.6SyjaoK2.lean.js similarity index 87% rename from assets/garden_vitepress_index.md.DwDwogUe.lean.js rename to assets/garden_vitepress_index.md.6SyjaoK2.lean.js index 3f2d4d78..2a2d7ec6 100644 --- a/assets/garden_vitepress_index.md.DwDwogUe.lean.js +++ b/assets/garden_vitepress_index.md.6SyjaoK2.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as s,a9 as r}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Vitepress","description":"","frontmatter":{"public":"true","slug":"vitepress","title":"Vitepress","prev":false,"next":false},"headers":[],"relativePath":"garden/vitepress/index.md","filePath":"garden/vitepress/index.md","lastUpdated":1718069968000}'),a={name:"garden/vitepress/index.md"},i=r("",3),n=[i];function o(p,d,c,_,l,h){return s(),t("div",null,n)}const g=e(a,[["render",o]]);export{u as __pageData,g as default}; +import{_ as e,c as t,o as s,a9 as r}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Vitepress","description":"","frontmatter":{"public":"true","slug":"vitepress","title":"Vitepress","prev":false,"next":false},"headers":[],"relativePath":"garden/vitepress/index.md","filePath":"garden/vitepress/index.md","lastUpdated":1717647948000}'),a={name:"garden/vitepress/index.md"},i=r("",3),n=[i];function o(p,d,c,_,l,h){return s(),t("div",null,n)}const g=e(a,[["render",o]]);export{u as __pageData,g as default}; diff --git a/assets/garden_wanderstop_index.md.osEdKtZT.js b/assets/garden_wanderstop_index.md.fcx7CNrA.js similarity index 93% rename from assets/garden_wanderstop_index.md.osEdKtZT.js rename to assets/garden_wanderstop_index.md.fcx7CNrA.js index 8be30330..cfb673d5 100644 --- a/assets/garden_wanderstop_index.md.osEdKtZT.js +++ b/assets/garden_wanderstop_index.md.fcx7CNrA.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Wanderstop","description":"","frontmatter":{"public":"true","slug":"wanderstop","tags":["Davey Wreden"],"title":"Wanderstop","prev":false,"next":false},"headers":[],"relativePath":"garden/wanderstop/index.md","filePath":"garden/wanderstop/index.md","lastUpdated":1718069968000}'),n={name:"garden/wanderstop/index.md"},o=r('

Wanderstop

Tags: Davey Wreden

Wanderstop is the first game by Ivy Road. It's a narrative focused cozy game

',3),d=[o];function s(p,_,c,i,l,f){return t(),a("div",null,d)}const g=e(n,[["render",s]]);export{m as __pageData,g as default}; +import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Wanderstop","description":"","frontmatter":{"public":"true","slug":"wanderstop","tags":["Davey Wreden"],"title":"Wanderstop","prev":false,"next":false},"headers":[],"relativePath":"garden/wanderstop/index.md","filePath":"garden/wanderstop/index.md","lastUpdated":1717971545000}'),n={name:"garden/wanderstop/index.md"},o=r('

Wanderstop

Tags: Davey Wreden

Wanderstop is the first game by Ivy Road. It's a narrative focused cozy game

',3),d=[o];function s(p,_,c,i,l,f){return t(),a("div",null,d)}const g=e(n,[["render",s]]);export{m as __pageData,g as default}; diff --git a/assets/garden_wanderstop_index.md.osEdKtZT.lean.js b/assets/garden_wanderstop_index.md.fcx7CNrA.lean.js similarity index 88% rename from assets/garden_wanderstop_index.md.osEdKtZT.lean.js rename to assets/garden_wanderstop_index.md.fcx7CNrA.lean.js index 8cab9c00..702242c7 100644 --- a/assets/garden_wanderstop_index.md.osEdKtZT.lean.js +++ b/assets/garden_wanderstop_index.md.fcx7CNrA.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Wanderstop","description":"","frontmatter":{"public":"true","slug":"wanderstop","tags":["Davey Wreden"],"title":"Wanderstop","prev":false,"next":false},"headers":[],"relativePath":"garden/wanderstop/index.md","filePath":"garden/wanderstop/index.md","lastUpdated":1718069968000}'),n={name:"garden/wanderstop/index.md"},o=r("",3),d=[o];function s(p,_,c,i,l,f){return t(),a("div",null,d)}const g=e(n,[["render",s]]);export{m as __pageData,g as default}; +import{_ as e,c as a,o as t,a9 as r}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Wanderstop","description":"","frontmatter":{"public":"true","slug":"wanderstop","tags":["Davey Wreden"],"title":"Wanderstop","prev":false,"next":false},"headers":[],"relativePath":"garden/wanderstop/index.md","filePath":"garden/wanderstop/index.md","lastUpdated":1717971545000}'),n={name:"garden/wanderstop/index.md"},o=r("",3),d=[o];function s(p,_,c,i,l,f){return t(),a("div",null,d)}const g=e(n,[["render",s]]);export{m as __pageData,g as default}; diff --git a/assets/garden_webrings_index.md.DDDfYflF.js b/assets/garden_webrings_index.md.57x1ZkEg.js similarity index 96% rename from assets/garden_webrings_index.md.DDDfYflF.js rename to assets/garden_webrings_index.md.57x1ZkEg.js index 3c327b3c..0bbc8cdc 100644 --- a/assets/garden_webrings_index.md.DDDfYflF.js +++ b/assets/garden_webrings_index.md.57x1ZkEg.js @@ -1 +1 @@ -import{_ as e,c as a,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Webrings","description":"","frontmatter":{"public":"true","slug":"webrings","title":"Webrings","prev":false,"next":false},"headers":[],"relativePath":"garden/webrings/index.md","filePath":"garden/webrings/index.md","lastUpdated":1718069968000}'),l={name:"garden/webrings/index.md"},r=t('

Webrings

Referenced by: The Small Web

A collection of Personal Websites that link to each other

  • These websites are all endorsing each other
  • They form a network of related sites readers might be interested in
  • Built on human trust rather than algorithms

Commune has a vision for modern webrings

  • Have communities set up matrix spaces for chatting
  • Multiple spaces can contain the same room
  • Related communities can share a room about a relevant topic
    • e.g. a bunch of game development libraries shared a "Game Design" room
  • This allows smaller communities to grow from cross-pollinating with other related communities
  • Could Incremental Social host a shared "Incremental Games" room?
    • How to bridge one channel to multiple discord servers, since that's where most incremental games communities are
    • Would this be appealing to already large communities?
    • Would this be overwhelming to smaller communities?
    • Who would moderate?
',6),o=[r];function n(s,m,c,d,h,u){return i(),a("div",null,o)}const b=e(l,[["render",n]]);export{p as __pageData,b as default}; +import{_ as e,c as a,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Webrings","description":"","frontmatter":{"public":"true","slug":"webrings","title":"Webrings","prev":false,"next":false},"headers":[],"relativePath":"garden/webrings/index.md","filePath":"garden/webrings/index.md","lastUpdated":1717647948000}'),l={name:"garden/webrings/index.md"},r=t('

Webrings

Referenced by: The Small Web

A collection of Personal Websites that link to each other

  • These websites are all endorsing each other
  • They form a network of related sites readers might be interested in
  • Built on human trust rather than algorithms

Commune has a vision for modern webrings

  • Have communities set up matrix spaces for chatting
  • Multiple spaces can contain the same room
  • Related communities can share a room about a relevant topic
    • e.g. a bunch of game development libraries shared a "Game Design" room
  • This allows smaller communities to grow from cross-pollinating with other related communities
  • Could Incremental Social host a shared "Incremental Games" room?
    • How to bridge one channel to multiple discord servers, since that's where most incremental games communities are
    • Would this be appealing to already large communities?
    • Would this be overwhelming to smaller communities?
    • Who would moderate?
',6),o=[r];function n(s,m,c,d,h,u){return i(),a("div",null,o)}const b=e(l,[["render",n]]);export{p as __pageData,b as default}; diff --git a/assets/garden_webrings_index.md.DDDfYflF.lean.js b/assets/garden_webrings_index.md.57x1ZkEg.lean.js similarity index 87% rename from assets/garden_webrings_index.md.DDDfYflF.lean.js rename to assets/garden_webrings_index.md.57x1ZkEg.lean.js index 26b6a0fa..f16310f7 100644 --- a/assets/garden_webrings_index.md.DDDfYflF.lean.js +++ b/assets/garden_webrings_index.md.57x1ZkEg.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Webrings","description":"","frontmatter":{"public":"true","slug":"webrings","title":"Webrings","prev":false,"next":false},"headers":[],"relativePath":"garden/webrings/index.md","filePath":"garden/webrings/index.md","lastUpdated":1718069968000}'),l={name:"garden/webrings/index.md"},r=t("",6),o=[r];function n(s,m,c,d,h,u){return i(),a("div",null,o)}const b=e(l,[["render",n]]);export{p as __pageData,b as default}; +import{_ as e,c as a,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const p=JSON.parse('{"title":"Webrings","description":"","frontmatter":{"public":"true","slug":"webrings","title":"Webrings","prev":false,"next":false},"headers":[],"relativePath":"garden/webrings/index.md","filePath":"garden/webrings/index.md","lastUpdated":1717647948000}'),l={name:"garden/webrings/index.md"},r=t("",6),o=[r];function n(s,m,c,d,h,u){return i(),a("div",null,o)}const b=e(l,[["render",n]]);export{p as __pageData,b as default}; diff --git a/assets/garden_weird_index.md.DlZUcsA4.js b/assets/garden_weird_index.md.Bd7l3f9l.js similarity index 95% rename from assets/garden_weird_index.md.DlZUcsA4.js rename to assets/garden_weird_index.md.Bd7l3f9l.js index f8095d82..d46635ed 100644 --- a/assets/garden_weird_index.md.DlZUcsA4.js +++ b/assets/garden_weird_index.md.Bd7l3f9l.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Weird","description":"","frontmatter":{"public":"true","slug":"weird","title":"Weird","prev":false,"next":false},"headers":[],"relativePath":"garden/weird/index.md","filePath":"garden/weird/index.md","lastUpdated":1718069968000}'),n={name:"garden/weird/index.md"},i=t('

Weird

Referenced by: Commune, Fedi v2, The Small Web

Weird is an Open Source project by the Commune team currently in development

',4),d=[i];function o(s,l,c,_,f,h){return r(),a("div",null,d)}const u=e(n,[["render",o]]);export{m as __pageData,u as default}; +import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Weird","description":"","frontmatter":{"public":"true","slug":"weird","title":"Weird","prev":false,"next":false},"headers":[],"relativePath":"garden/weird/index.md","filePath":"garden/weird/index.md","lastUpdated":1717647948000}'),n={name:"garden/weird/index.md"},i=t('

Weird

Referenced by: Commune, Fedi v2, The Small Web

Weird is an Open Source project by the Commune team currently in development

',4),d=[i];function o(s,l,c,_,f,h){return r(),a("div",null,d)}const u=e(n,[["render",o]]);export{m as __pageData,u as default}; diff --git a/assets/garden_weird_index.md.DlZUcsA4.lean.js b/assets/garden_weird_index.md.Bd7l3f9l.lean.js similarity index 87% rename from assets/garden_weird_index.md.DlZUcsA4.lean.js rename to assets/garden_weird_index.md.Bd7l3f9l.lean.js index 6be4f603..90a60671 100644 --- a/assets/garden_weird_index.md.DlZUcsA4.lean.js +++ b/assets/garden_weird_index.md.Bd7l3f9l.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Weird","description":"","frontmatter":{"public":"true","slug":"weird","title":"Weird","prev":false,"next":false},"headers":[],"relativePath":"garden/weird/index.md","filePath":"garden/weird/index.md","lastUpdated":1718069968000}'),n={name:"garden/weird/index.md"},i=t("",4),d=[i];function o(s,l,c,_,f,h){return r(),a("div",null,d)}const u=e(n,[["render",o]]);export{m as __pageData,u as default}; +import{_ as e,c as a,o as r,a9 as t}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Weird","description":"","frontmatter":{"public":"true","slug":"weird","title":"Weird","prev":false,"next":false},"headers":[],"relativePath":"garden/weird/index.md","filePath":"garden/weird/index.md","lastUpdated":1717647948000}'),n={name:"garden/weird/index.md"},i=t("",4),d=[i];function o(s,l,c,_,f,h){return r(),a("div",null,d)}const u=e(n,[["render",o]]);export{m as __pageData,u as default}; diff --git a/assets/index.md.CrdqXg4F.js b/assets/index.md.DdYa43X-.js similarity index 94% rename from assets/index.md.CrdqXg4F.js rename to assets/index.md.DdYa43X-.js index 19d3a63d..1c437764 100644 --- a/assets/index.md.CrdqXg4F.js +++ b/assets/index.md.DdYa43X-.js @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.D8PMdl4T.js";const d=JSON.parse(`{"title":"The Paper Pilot","description":"","frontmatter":{"title":"The Paper Pilot","layout":"home","sidebar":true,"hero":{"name":"The Paper Pilot","tagline":"I'm Anthony, or The Paper Pilot, and I make fun games and tools!","actions":[{"theme":"brand","text":"My Projects","link":"/projects/"},{"theme":"alt","text":"My Resume","link":"https://resume.incremental.social/thepaperpilot/thepaperpilot"}]},"features":[{"icon":"🧑‍💻","title":"Profectus","details":"A game engine that grows with you","link":"https://moddingtree.com"},{"icon":"👤","title":"Incremental Social","details":"A kind social media site for the incremental games community","link":"https://incremental.social"},{"icon":"🎮","title":"My Games","details":"Most of my games are playable on Itch","link":"https://thepaperpilot.itch.io"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1718069968000}`),i={name:"index.md"};function o(n,r,s,l,c,m){return a(),t("div")}const h=e(i,[["render",o]]);export{d as __pageData,h as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.D8PMdl4T.js";const d=JSON.parse(`{"title":"The Paper Pilot","description":"","frontmatter":{"title":"The Paper Pilot","layout":"home","sidebar":true,"hero":{"name":"The Paper Pilot","tagline":"I'm Anthony, or The Paper Pilot, and I make fun games and tools!","actions":[{"theme":"brand","text":"My Projects","link":"/projects/"},{"theme":"alt","text":"My Resume","link":"https://resume.incremental.social/thepaperpilot/thepaperpilot"}]},"features":[{"icon":"🧑‍💻","title":"Profectus","details":"A game engine that grows with you","link":"https://moddingtree.com"},{"icon":"👤","title":"Incremental Social","details":"A kind social media site for the incremental games community","link":"https://incremental.social"},{"icon":"🎮","title":"My Games","details":"Most of my games are playable on Itch","link":"https://thepaperpilot.itch.io"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1717646210000}`),i={name:"index.md"};function o(n,r,s,l,c,m){return a(),t("div")}const h=e(i,[["render",o]]);export{d as __pageData,h as default}; diff --git a/assets/index.md.CrdqXg4F.lean.js b/assets/index.md.DdYa43X-.lean.js similarity index 94% rename from assets/index.md.CrdqXg4F.lean.js rename to assets/index.md.DdYa43X-.lean.js index 19d3a63d..1c437764 100644 --- a/assets/index.md.CrdqXg4F.lean.js +++ b/assets/index.md.DdYa43X-.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.D8PMdl4T.js";const d=JSON.parse(`{"title":"The Paper Pilot","description":"","frontmatter":{"title":"The Paper Pilot","layout":"home","sidebar":true,"hero":{"name":"The Paper Pilot","tagline":"I'm Anthony, or The Paper Pilot, and I make fun games and tools!","actions":[{"theme":"brand","text":"My Projects","link":"/projects/"},{"theme":"alt","text":"My Resume","link":"https://resume.incremental.social/thepaperpilot/thepaperpilot"}]},"features":[{"icon":"🧑‍💻","title":"Profectus","details":"A game engine that grows with you","link":"https://moddingtree.com"},{"icon":"👤","title":"Incremental Social","details":"A kind social media site for the incremental games community","link":"https://incremental.social"},{"icon":"🎮","title":"My Games","details":"Most of my games are playable on Itch","link":"https://thepaperpilot.itch.io"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1718069968000}`),i={name:"index.md"};function o(n,r,s,l,c,m){return a(),t("div")}const h=e(i,[["render",o]]);export{d as __pageData,h as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.D8PMdl4T.js";const d=JSON.parse(`{"title":"The Paper Pilot","description":"","frontmatter":{"title":"The Paper Pilot","layout":"home","sidebar":true,"hero":{"name":"The Paper Pilot","tagline":"I'm Anthony, or The Paper Pilot, and I make fun games and tools!","actions":[{"theme":"brand","text":"My Projects","link":"/projects/"},{"theme":"alt","text":"My Resume","link":"https://resume.incremental.social/thepaperpilot/thepaperpilot"}]},"features":[{"icon":"🧑‍💻","title":"Profectus","details":"A game engine that grows with you","link":"https://moddingtree.com"},{"icon":"👤","title":"Incremental Social","details":"A kind social media site for the incremental games community","link":"https://incremental.social"},{"icon":"🎮","title":"My Games","details":"Most of my games are playable on Itch","link":"https://thepaperpilot.itch.io"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1717646210000}`),i={name:"index.md"};function o(n,r,s,l,c,m){return a(),t("div")}const h=e(i,[["render",o]]);export{d as __pageData,h as default}; diff --git a/assets/public_gamedevtree_2.0-format-changes.md.BJWVbIw2.js b/assets/public_gamedevtree_2.0-format-changes.md.Cu7Ykz4Q.js similarity index 96% rename from assets/public_gamedevtree_2.0-format-changes.md.BJWVbIw2.js rename to assets/public_gamedevtree_2.0-format-changes.md.Cu7Ykz4Q.js index 9eeaf897..7e3c07ec 100644 --- a/assets/public_gamedevtree_2.0-format-changes.md.BJWVbIw2.js +++ b/assets/public_gamedevtree_2.0-format-changes.md.Cu7Ykz4Q.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"2.0 format changes","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/2.0-format-changes.md","filePath":"public/gamedevtree/2.0-format-changes.md","lastUpdated":1701137241000}'),i={name:"public/gamedevtree/2.0-format-changes.md"},l=o('

2.0 format changes

  • Temp format is changed from temp.something[layer] to temp[layer].something, for consistency
  • Challenges are now saved as an object with the amount of completions in each spot. (This will break saves.)
  • effectDisplay in Challenges and Upgrades no longer takes an argument, and neither does effect for Buyables
  • Buyable cost can take an argument for amount of buyables, but it needs to function if no argument is supplied (it should do the cost for the next purchase).
  • Generation of Points now happens in the main game loop (not in a layer update function), enabled by canGenPoints in game.js.
  • Changed fullLayerReset to layerDataReset, which takes an array of names of values to keep

In addition, many names were changed, mostly expanding abbreviations:

All instances of:

  • chall -> challenge
  • unl -> unlocked
  • upg -> upgrade (besides CSS)
  • amt -> amount
  • desc -> description
  • resCeil -> roundUpCost
  • order -> unlockOrder
  • incr_order -> increaseUnlockOrder

Challenges:

  • desc -> challengeDescription
  • reward -> rewardDescription
  • effect -> rewardEffect
  • effectDisplay -> rewardDisplay
  • active -> challengeActive
',7),n=[l];function s(r,c,d,g,h,m){return t(),a("div",null,n)}const u=e(i,[["render",s]]);export{f as __pageData,u as default}; +import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"2.0 format changes","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/2.0-format-changes.md","filePath":"public/gamedevtree/2.0-format-changes.md","lastUpdated":1603070823000}'),i={name:"public/gamedevtree/2.0-format-changes.md"},l=o('

2.0 format changes

  • Temp format is changed from temp.something[layer] to temp[layer].something, for consistency
  • Challenges are now saved as an object with the amount of completions in each spot. (This will break saves.)
  • effectDisplay in Challenges and Upgrades no longer takes an argument, and neither does effect for Buyables
  • Buyable cost can take an argument for amount of buyables, but it needs to function if no argument is supplied (it should do the cost for the next purchase).
  • Generation of Points now happens in the main game loop (not in a layer update function), enabled by canGenPoints in game.js.
  • Changed fullLayerReset to layerDataReset, which takes an array of names of values to keep

In addition, many names were changed, mostly expanding abbreviations:

All instances of:

  • chall -> challenge
  • unl -> unlocked
  • upg -> upgrade (besides CSS)
  • amt -> amount
  • desc -> description
  • resCeil -> roundUpCost
  • order -> unlockOrder
  • incr_order -> increaseUnlockOrder

Challenges:

  • desc -> challengeDescription
  • reward -> rewardDescription
  • effect -> rewardEffect
  • effectDisplay -> rewardDisplay
  • active -> challengeActive
',7),n=[l];function s(r,c,d,g,h,m){return t(),a("div",null,n)}const u=e(i,[["render",s]]);export{f as __pageData,u as default}; diff --git a/assets/public_gamedevtree_2.0-format-changes.md.BJWVbIw2.lean.js b/assets/public_gamedevtree_2.0-format-changes.md.Cu7Ykz4Q.lean.js similarity index 87% rename from assets/public_gamedevtree_2.0-format-changes.md.BJWVbIw2.lean.js rename to assets/public_gamedevtree_2.0-format-changes.md.Cu7Ykz4Q.lean.js index 31423b81..52e2a1c5 100644 --- a/assets/public_gamedevtree_2.0-format-changes.md.BJWVbIw2.lean.js +++ b/assets/public_gamedevtree_2.0-format-changes.md.Cu7Ykz4Q.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"2.0 format changes","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/2.0-format-changes.md","filePath":"public/gamedevtree/2.0-format-changes.md","lastUpdated":1701137241000}'),i={name:"public/gamedevtree/2.0-format-changes.md"},l=o("",7),n=[l];function s(r,c,d,g,h,m){return t(),a("div",null,n)}const u=e(i,[["render",s]]);export{f as __pageData,u as default}; +import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"2.0 format changes","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/2.0-format-changes.md","filePath":"public/gamedevtree/2.0-format-changes.md","lastUpdated":1603070823000}'),i={name:"public/gamedevtree/2.0-format-changes.md"},l=o("",7),n=[l];function s(r,c,d,g,h,m){return t(),a("div",null,n)}const u=e(i,[["render",s]]);export{f as __pageData,u as default}; diff --git a/assets/public_gamedevtree_README.md.BcJ-DaYW.js b/assets/public_gamedevtree_README.md.D0kWmw3r.js similarity index 94% rename from assets/public_gamedevtree_README.md.BcJ-DaYW.js rename to assets/public_gamedevtree_README.md.D0kWmw3r.js index 743f9091..0b5b0c58 100644 --- a/assets/public_gamedevtree_README.md.BcJ-DaYW.js +++ b/assets/public_gamedevtree_README.md.D0kWmw3r.js @@ -1 +1 @@ -import{_ as o,c as a,o as r,j as e,a as t}from"./chunks/framework.D8PMdl4T.js";const k=JSON.parse('{"title":"The-Modding-Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/README.md","filePath":"public/gamedevtree/README.md","lastUpdated":1701137241000}'),i={name:"public/gamedevtree/README.md"},n=e("h1",{id:"the-modding-tree",tabindex:"-1"},[t("The-Modding-Tree "),e("a",{class:"header-anchor",href:"#the-modding-tree","aria-label":'Permalink to "The-Modding-Tree"'},"​")],-1),s=e("p",null,"A modified version of The Prestige Tree that is much easier to mod. It still requires programming knowledge, but it's mostly pretty easy things and copy/pasting.",-1),d=e("p",null,[e("a",{href:"./docs/getting-started"},"Look here for a tutorial on getting started with modding with TMT")],-1),l=e("p",null,[t("You can look in the "),e("a",{href:"./docs/!general-info"},"documentation"),t(" for more information on how it all works, or look at the code in layers.js to see what it all looks like.")],-1),c=[n,s,d,l];function h(m,p,g,_,f,u){return r(),a("div",null,c)}const E=o(i,[["render",h]]);export{k as __pageData,E as default}; +import{_ as o,c as a,o as r,j as e,a as t}from"./chunks/framework.D8PMdl4T.js";const k=JSON.parse('{"title":"The-Modding-Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/README.md","filePath":"public/gamedevtree/README.md","lastUpdated":1602208135000}'),i={name:"public/gamedevtree/README.md"},n=e("h1",{id:"the-modding-tree",tabindex:"-1"},[t("The-Modding-Tree "),e("a",{class:"header-anchor",href:"#the-modding-tree","aria-label":'Permalink to "The-Modding-Tree"'},"​")],-1),s=e("p",null,"A modified version of The Prestige Tree that is much easier to mod. It still requires programming knowledge, but it's mostly pretty easy things and copy/pasting.",-1),d=e("p",null,[e("a",{href:"./docs/getting-started"},"Look here for a tutorial on getting started with modding with TMT")],-1),l=e("p",null,[t("You can look in the "),e("a",{href:"./docs/!general-info"},"documentation"),t(" for more information on how it all works, or look at the code in layers.js to see what it all looks like.")],-1),c=[n,s,d,l];function h(m,p,g,_,f,u){return r(),a("div",null,c)}const E=o(i,[["render",h]]);export{k as __pageData,E as default}; diff --git a/assets/public_gamedevtree_README.md.BcJ-DaYW.lean.js b/assets/public_gamedevtree_README.md.D0kWmw3r.lean.js similarity index 94% rename from assets/public_gamedevtree_README.md.BcJ-DaYW.lean.js rename to assets/public_gamedevtree_README.md.D0kWmw3r.lean.js index 743f9091..0b5b0c58 100644 --- a/assets/public_gamedevtree_README.md.BcJ-DaYW.lean.js +++ b/assets/public_gamedevtree_README.md.D0kWmw3r.lean.js @@ -1 +1 @@ -import{_ as o,c as a,o as r,j as e,a as t}from"./chunks/framework.D8PMdl4T.js";const k=JSON.parse('{"title":"The-Modding-Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/README.md","filePath":"public/gamedevtree/README.md","lastUpdated":1701137241000}'),i={name:"public/gamedevtree/README.md"},n=e("h1",{id:"the-modding-tree",tabindex:"-1"},[t("The-Modding-Tree "),e("a",{class:"header-anchor",href:"#the-modding-tree","aria-label":'Permalink to "The-Modding-Tree"'},"​")],-1),s=e("p",null,"A modified version of The Prestige Tree that is much easier to mod. It still requires programming knowledge, but it's mostly pretty easy things and copy/pasting.",-1),d=e("p",null,[e("a",{href:"./docs/getting-started"},"Look here for a tutorial on getting started with modding with TMT")],-1),l=e("p",null,[t("You can look in the "),e("a",{href:"./docs/!general-info"},"documentation"),t(" for more information on how it all works, or look at the code in layers.js to see what it all looks like.")],-1),c=[n,s,d,l];function h(m,p,g,_,f,u){return r(),a("div",null,c)}const E=o(i,[["render",h]]);export{k as __pageData,E as default}; +import{_ as o,c as a,o as r,j as e,a as t}from"./chunks/framework.D8PMdl4T.js";const k=JSON.parse('{"title":"The-Modding-Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/README.md","filePath":"public/gamedevtree/README.md","lastUpdated":1602208135000}'),i={name:"public/gamedevtree/README.md"},n=e("h1",{id:"the-modding-tree",tabindex:"-1"},[t("The-Modding-Tree "),e("a",{class:"header-anchor",href:"#the-modding-tree","aria-label":'Permalink to "The-Modding-Tree"'},"​")],-1),s=e("p",null,"A modified version of The Prestige Tree that is much easier to mod. It still requires programming knowledge, but it's mostly pretty easy things and copy/pasting.",-1),d=e("p",null,[e("a",{href:"./docs/getting-started"},"Look here for a tutorial on getting started with modding with TMT")],-1),l=e("p",null,[t("You can look in the "),e("a",{href:"./docs/!general-info"},"documentation"),t(" for more information on how it all works, or look at the code in layers.js to see what it all looks like.")],-1),c=[n,s,d,l];function h(m,p,g,_,f,u){return r(),a("div",null,c)}const E=o(i,[["render",h]]);export{k as __pageData,E as default}; diff --git a/assets/public_gamedevtree_changelog.md.yaSdB86a.js b/assets/public_gamedevtree_changelog.md.BVckBzUe.js similarity index 98% rename from assets/public_gamedevtree_changelog.md.yaSdB86a.js rename to assets/public_gamedevtree_changelog.md.BVckBzUe.js index 37fd7e01..202e4e99 100644 --- a/assets/public_gamedevtree_changelog.md.yaSdB86a.js +++ b/assets/public_gamedevtree_changelog.md.BVckBzUe.js @@ -1 +1 @@ -import{_ as e,c as a,o as l,a9 as i}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"The Game Dev Tree changelog:","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/changelog.md","filePath":"public/gamedevtree/changelog.md","lastUpdated":1701137241000}'),r={name:"public/gamedevtree/changelog.md"},o=i('

The Game Dev Tree changelog:

v1.0.4 Version Bump [rebalanced,debuggedx3] - 2020-11-09

  • Fixed refactorings 2, 3, and 4 not actually affecting productivity

v1.0.3 Version Bump [rebalanced,debuggedx2] - 2020-11-08

  • Fixed API milestone 4 not working

v1.0.2 Version Bump [rebalanced,debugged] - 2020-11-08

  • Fixed tree lines being hidden after hitting "keepGoing" in the victory screen

v1.0.1 Version Bump [rebalanced] - 2020-11-08

  • Buffed several TAs

v1.0 Version Bump - 2020-11-08

  • Finished row 4
  • Added colored text to lore
  • Fixed some visual bugs with milestones
  • Probably other stuff lol its been a week

v0.2.3 Stylish - 2020-10-30

  • Re-styled basically everything
  • Added favicon
  • Added header bar
  • Added changelog

v0.2.2 Row 3 - 2020-10-22

  • Removed debug statement
  • Moved milestones in F layer beneath the buyables

v0.2.1 Row 3 - 2020-10-21

  • Fixed layers hiding
  • Fixed typos/minor issues
  • Fixed S layer being highlighted before you can unlock the layer

v0.2 Row 3 - 2020-10-21

  • Implemented row 3

v0.1.1 Cash Influx [rebalanced] - 2020-10-19

  • Fixed notification issue
  • Rebalanced to make early game faster and late game slower
  • Fixed other minor issues

v0.1 Cash Influx - 2020-10-19

  • Implemented row 2

v0.0 Initial Commit - 2020-10-18

  • Implemented row 1
',25),n=[o];function t(d,h,s,u,c,b){return l(),a("div",null,n)}const g=e(r,[["render",t]]);export{m as __pageData,g as default}; +import{_ as e,c as a,o as l,a9 as i}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"The Game Dev Tree changelog:","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/changelog.md","filePath":"public/gamedevtree/changelog.md","lastUpdated":1604935991000}'),r={name:"public/gamedevtree/changelog.md"},o=i('

The Game Dev Tree changelog:

v1.0.4 Version Bump [rebalanced,debuggedx3] - 2020-11-09

  • Fixed refactorings 2, 3, and 4 not actually affecting productivity

v1.0.3 Version Bump [rebalanced,debuggedx2] - 2020-11-08

  • Fixed API milestone 4 not working

v1.0.2 Version Bump [rebalanced,debugged] - 2020-11-08

  • Fixed tree lines being hidden after hitting "keepGoing" in the victory screen

v1.0.1 Version Bump [rebalanced] - 2020-11-08

  • Buffed several TAs

v1.0 Version Bump - 2020-11-08

  • Finished row 4
  • Added colored text to lore
  • Fixed some visual bugs with milestones
  • Probably other stuff lol its been a week

v0.2.3 Stylish - 2020-10-30

  • Re-styled basically everything
  • Added favicon
  • Added header bar
  • Added changelog

v0.2.2 Row 3 - 2020-10-22

  • Removed debug statement
  • Moved milestones in F layer beneath the buyables

v0.2.1 Row 3 - 2020-10-21

  • Fixed layers hiding
  • Fixed typos/minor issues
  • Fixed S layer being highlighted before you can unlock the layer

v0.2 Row 3 - 2020-10-21

  • Implemented row 3

v0.1.1 Cash Influx [rebalanced] - 2020-10-19

  • Fixed notification issue
  • Rebalanced to make early game faster and late game slower
  • Fixed other minor issues

v0.1 Cash Influx - 2020-10-19

  • Implemented row 2

v0.0 Initial Commit - 2020-10-18

  • Implemented row 1
',25),n=[o];function t(d,h,s,u,c,b){return l(),a("div",null,n)}const g=e(r,[["render",t]]);export{m as __pageData,g as default}; diff --git a/assets/public_gamedevtree_changelog.md.yaSdB86a.lean.js b/assets/public_gamedevtree_changelog.md.BVckBzUe.lean.js similarity index 86% rename from assets/public_gamedevtree_changelog.md.yaSdB86a.lean.js rename to assets/public_gamedevtree_changelog.md.BVckBzUe.lean.js index e0f16a9e..3e3d973e 100644 --- a/assets/public_gamedevtree_changelog.md.yaSdB86a.lean.js +++ b/assets/public_gamedevtree_changelog.md.BVckBzUe.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as l,a9 as i}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"The Game Dev Tree changelog:","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/changelog.md","filePath":"public/gamedevtree/changelog.md","lastUpdated":1701137241000}'),r={name:"public/gamedevtree/changelog.md"},o=i("",25),n=[o];function t(d,h,s,u,c,b){return l(),a("div",null,n)}const g=e(r,[["render",t]]);export{m as __pageData,g as default}; +import{_ as e,c as a,o as l,a9 as i}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"The Game Dev Tree changelog:","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/changelog.md","filePath":"public/gamedevtree/changelog.md","lastUpdated":1604935991000}'),r={name:"public/gamedevtree/changelog.md"},o=i("",25),n=[o];function t(d,h,s,u,c,b){return l(),a("div",null,n)}const g=e(r,[["render",t]]);export{m as __pageData,g as default}; diff --git a/assets/public_gamedevtree_docs_!general-info.md.60si-HlW.js b/assets/public_gamedevtree_docs_!general-info.md.WzWHA4Zz.js similarity index 98% rename from assets/public_gamedevtree_docs_!general-info.md.60si-HlW.js rename to assets/public_gamedevtree_docs_!general-info.md.WzWHA4Zz.js index a4294ca8..7a7a2978 100644 --- a/assets/public_gamedevtree_docs_!general-info.md.60si-HlW.js +++ b/assets/public_gamedevtree_docs_!general-info.md.WzWHA4Zz.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"The-Modding-Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/!general-info.md","filePath":"public/gamedevtree/docs/!general-info.md","lastUpdated":1701137241000}'),n={name:"public/gamedevtree/docs/!general-info.md"},r=o('

The-Modding-Tree

The main way to add content is through creating layers. You can either add a layer directly in the layers object in layersSupportjs, or declare it in another file and then do "addLayer(layername, layerdata)" (good for breaking things up into smaller files). The existing layers are just examples and can be freely deleted. You can also use them as references and a base for your own layers.

The first thing you need to do is to edit the modInfo at the top of game.js to set your modID (a string). A unique modId will prevent your mod's saves from conflicting with other mods.

Most of the time, you won't need to dive deep into the code to create things, but you still can if you really want to.

The Modding Tree uses break_eternity.js to store large values. This means that many numbers are Decimal objects, and must be treated differently. For example, you have to use new Decimal(x) to create a Decimal value instead of a plain number, and perform operations on them by calling functions. e.g, instead of x = x + y, use x = x.add(y).

Almost all values can be either a constant value, or a dynamic value. Dynamic values are defined by putting a function that returns what the value should be at any given time.

All display text can be basic HTML instead (But you can't use most Vue features there).

Table of Contents:

General:

  • Getting Started: Getting your own copy of the code set up with Github Desktop.
  • Main mod info: How to set up general things for your mod in mod.js.
  • Basic layer breakdown: Breaking down the components of a layer with minimal features.
  • Layer features: Explanations of all of the different properties that you can give a layer.
  • Custom Tab Layouts: An optional way to give your tabs a different layout. You can even create entirely new components to use.
  • Updating TMT: Using Github Desktop to update your mod's version of TMT.

Common components

  • Upgrades: How to create upgrades for a layer.
  • Milestones: How to create milestones for a layer.
  • Buyables: Create rebuyable upgrades for your layer (with the option to make them respec-able). Can be used to make Enhancers or Space Buildings.
  • Clickables: A more generalized variant of buyables, for any kind of thing that is sometimes clickable. Between these and Buyables, you can do just about anything.

Other components

  • Challenges: How to create challenges for a layer.
  • Bars: Display some information as a progress bar, gague, or similar. They are highly customizable, and can be horizontal and vertical as well.
  • Subtabs and Microtabs: Create subtabs for your tabs, as well as "microtab" components that you can put inside the tabs.
  • Achievements: How to create achievements for a layer (or for the whole game).
  • Infoboxes: Boxes containing text that can be shown or hidden.
',14),i=[r];function s(l,d,c,h,u,m){return t(),a("div",null,i)}const p=e(n,[["render",s]]);export{b as __pageData,p as default}; +import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"The-Modding-Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/!general-info.md","filePath":"public/gamedevtree/docs/!general-info.md","lastUpdated":1603679142000}'),n={name:"public/gamedevtree/docs/!general-info.md"},r=o('

The-Modding-Tree

The main way to add content is through creating layers. You can either add a layer directly in the layers object in layersSupportjs, or declare it in another file and then do "addLayer(layername, layerdata)" (good for breaking things up into smaller files). The existing layers are just examples and can be freely deleted. You can also use them as references and a base for your own layers.

The first thing you need to do is to edit the modInfo at the top of game.js to set your modID (a string). A unique modId will prevent your mod's saves from conflicting with other mods.

Most of the time, you won't need to dive deep into the code to create things, but you still can if you really want to.

The Modding Tree uses break_eternity.js to store large values. This means that many numbers are Decimal objects, and must be treated differently. For example, you have to use new Decimal(x) to create a Decimal value instead of a plain number, and perform operations on them by calling functions. e.g, instead of x = x + y, use x = x.add(y).

Almost all values can be either a constant value, or a dynamic value. Dynamic values are defined by putting a function that returns what the value should be at any given time.

All display text can be basic HTML instead (But you can't use most Vue features there).

Table of Contents:

General:

  • Getting Started: Getting your own copy of the code set up with Github Desktop.
  • Main mod info: How to set up general things for your mod in mod.js.
  • Basic layer breakdown: Breaking down the components of a layer with minimal features.
  • Layer features: Explanations of all of the different properties that you can give a layer.
  • Custom Tab Layouts: An optional way to give your tabs a different layout. You can even create entirely new components to use.
  • Updating TMT: Using Github Desktop to update your mod's version of TMT.

Common components

  • Upgrades: How to create upgrades for a layer.
  • Milestones: How to create milestones for a layer.
  • Buyables: Create rebuyable upgrades for your layer (with the option to make them respec-able). Can be used to make Enhancers or Space Buildings.
  • Clickables: A more generalized variant of buyables, for any kind of thing that is sometimes clickable. Between these and Buyables, you can do just about anything.

Other components

  • Challenges: How to create challenges for a layer.
  • Bars: Display some information as a progress bar, gague, or similar. They are highly customizable, and can be horizontal and vertical as well.
  • Subtabs and Microtabs: Create subtabs for your tabs, as well as "microtab" components that you can put inside the tabs.
  • Achievements: How to create achievements for a layer (or for the whole game).
  • Infoboxes: Boxes containing text that can be shown or hidden.
',14),i=[r];function s(l,d,c,h,u,m){return t(),a("div",null,i)}const p=e(n,[["render",s]]);export{b as __pageData,p as default}; diff --git a/assets/public_gamedevtree_docs_!general-info.md.60si-HlW.lean.js b/assets/public_gamedevtree_docs_!general-info.md.WzWHA4Zz.lean.js similarity index 87% rename from assets/public_gamedevtree_docs_!general-info.md.60si-HlW.lean.js rename to assets/public_gamedevtree_docs_!general-info.md.WzWHA4Zz.lean.js index de5f941f..f3bf8d8d 100644 --- a/assets/public_gamedevtree_docs_!general-info.md.60si-HlW.lean.js +++ b/assets/public_gamedevtree_docs_!general-info.md.WzWHA4Zz.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"The-Modding-Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/!general-info.md","filePath":"public/gamedevtree/docs/!general-info.md","lastUpdated":1701137241000}'),n={name:"public/gamedevtree/docs/!general-info.md"},r=o("",14),i=[r];function s(l,d,c,h,u,m){return t(),a("div",null,i)}const p=e(n,[["render",s]]);export{b as __pageData,p as default}; +import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"The-Modding-Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/!general-info.md","filePath":"public/gamedevtree/docs/!general-info.md","lastUpdated":1603679142000}'),n={name:"public/gamedevtree/docs/!general-info.md"},r=o("",14),i=[r];function s(l,d,c,h,u,m){return t(),a("div",null,i)}const p=e(n,[["render",s]]);export{b as __pageData,p as default}; diff --git a/assets/public_gamedevtree_docs_achievements.md.Byb7DjwU.js b/assets/public_gamedevtree_docs_achievements.md.BgY9AsGa.js similarity index 98% rename from assets/public_gamedevtree_docs_achievements.md.Byb7DjwU.js rename to assets/public_gamedevtree_docs_achievements.md.BgY9AsGa.js index 63a7f46d..16dca5c4 100644 --- a/assets/public_gamedevtree_docs_achievements.md.Byb7DjwU.js +++ b/assets/public_gamedevtree_docs_achievements.md.BgY9AsGa.js @@ -1,4 +1,4 @@ -import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Achievements","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/achievements.md","filePath":"public/gamedevtree/docs/achievements.md","lastUpdated":1701137241000}'),s={name:"public/gamedevtree/docs/achievements.md"},n=i(`

Achievements

Achievements are awarded to the player when they meet a certain goal, and give some benefit. Currently, they are pretty basic, but additional features will be added later to help.

You can make global achievements by putting them in a side layer (make its row "side" instead of a number)

Useful functions for dealing with achievements and implementing their effects:

  • hasAchievement(layer, id): determine if the player has the Achievement
  • achievementEffect(layer, id): Returns the current effects of the achievement, if any

Achievements should be formatted like this:

js
    achievements: {
+import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Achievements","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/achievements.md","filePath":"public/gamedevtree/docs/achievements.md","lastUpdated":1602862779000}'),s={name:"public/gamedevtree/docs/achievements.md"},n=i(`

Achievements

Achievements are awarded to the player when they meet a certain goal, and give some benefit. Currently, they are pretty basic, but additional features will be added later to help.

You can make global achievements by putting them in a side layer (make its row "side" instead of a number)

Useful functions for dealing with achievements and implementing their effects:

  • hasAchievement(layer, id): determine if the player has the Achievement
  • achievementEffect(layer, id): Returns the current effects of the achievement, if any

Achievements should be formatted like this:

js
    achievements: {
         rows: # of rows
         cols: # of columns
         11: {
diff --git a/assets/public_gamedevtree_docs_achievements.md.Byb7DjwU.lean.js b/assets/public_gamedevtree_docs_achievements.md.BgY9AsGa.lean.js
similarity index 86%
rename from assets/public_gamedevtree_docs_achievements.md.Byb7DjwU.lean.js
rename to assets/public_gamedevtree_docs_achievements.md.BgY9AsGa.lean.js
index 63aac0d3..02811d24 100644
--- a/assets/public_gamedevtree_docs_achievements.md.Byb7DjwU.lean.js
+++ b/assets/public_gamedevtree_docs_achievements.md.BgY9AsGa.lean.js
@@ -1 +1 @@
-import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Achievements","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/achievements.md","filePath":"public/gamedevtree/docs/achievements.md","lastUpdated":1701137241000}'),s={name:"public/gamedevtree/docs/achievements.md"},n=i("",9),l=[n];function h(o,r,p,c,d,u){return a(),t("div",null,l)}const k=e(s,[["render",h]]);export{g as __pageData,k as default};
+import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Achievements","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/achievements.md","filePath":"public/gamedevtree/docs/achievements.md","lastUpdated":1602862779000}'),s={name:"public/gamedevtree/docs/achievements.md"},n=i("",9),l=[n];function h(o,r,p,c,d,u){return a(),t("div",null,l)}const k=e(s,[["render",h]]);export{g as __pageData,k as default};
diff --git a/assets/public_gamedevtree_docs_bars.md.BOkZNfjK.js b/assets/public_gamedevtree_docs_bars.md.DbswOg3L.js
similarity index 98%
rename from assets/public_gamedevtree_docs_bars.md.BOkZNfjK.js
rename to assets/public_gamedevtree_docs_bars.md.DbswOg3L.js
index 57fdf48b..0f280017 100644
--- a/assets/public_gamedevtree_docs_bars.md.BOkZNfjK.js
+++ b/assets/public_gamedevtree_docs_bars.md.DbswOg3L.js
@@ -1,4 +1,4 @@
-import{_ as s,c as t,o as a,a9 as e}from"./chunks/framework.D8PMdl4T.js";const k=JSON.parse('{"title":"Bars","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/bars.md","filePath":"public/gamedevtree/docs/bars.md","lastUpdated":1701137241000}'),i={name:"public/gamedevtree/docs/bars.md"},n=e(`

Bars

Bars let you display information in a more direct way. It can be a progress bar, health bar, capacity gague, or anything else.

Bars are defined like other Big Features:

js
    bars: {
+import{_ as s,c as t,o as a,a9 as e}from"./chunks/framework.D8PMdl4T.js";const k=JSON.parse('{"title":"Bars","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/bars.md","filePath":"public/gamedevtree/docs/bars.md","lastUpdated":1603679142000}'),i={name:"public/gamedevtree/docs/bars.md"},n=e(`

Bars

Bars let you display information in a more direct way. It can be a progress bar, health bar, capacity gague, or anything else.

Bars are defined like other Big Features:

js
    bars: {
         bigBar: {
             display() {return "Blah"},
             etc
diff --git a/assets/public_gamedevtree_docs_bars.md.BOkZNfjK.lean.js b/assets/public_gamedevtree_docs_bars.md.DbswOg3L.lean.js
similarity index 85%
rename from assets/public_gamedevtree_docs_bars.md.BOkZNfjK.lean.js
rename to assets/public_gamedevtree_docs_bars.md.DbswOg3L.lean.js
index 9178fd7c..7b899096 100644
--- a/assets/public_gamedevtree_docs_bars.md.BOkZNfjK.lean.js
+++ b/assets/public_gamedevtree_docs_bars.md.DbswOg3L.lean.js
@@ -1 +1 @@
-import{_ as s,c as t,o as a,a9 as e}from"./chunks/framework.D8PMdl4T.js";const k=JSON.parse('{"title":"Bars","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/bars.md","filePath":"public/gamedevtree/docs/bars.md","lastUpdated":1701137241000}'),i={name:"public/gamedevtree/docs/bars.md"},n=e("",6),r=[n];function l(o,p,h,d,c,u){return a(),t("div",null,r)}const b=s(i,[["render",l]]);export{k as __pageData,b as default};
+import{_ as s,c as t,o as a,a9 as e}from"./chunks/framework.D8PMdl4T.js";const k=JSON.parse('{"title":"Bars","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/bars.md","filePath":"public/gamedevtree/docs/bars.md","lastUpdated":1603679142000}'),i={name:"public/gamedevtree/docs/bars.md"},n=e("",6),r=[n];function l(o,p,h,d,c,u){return a(),t("div",null,r)}const b=s(i,[["render",l]]);export{k as __pageData,b as default};
diff --git a/assets/public_gamedevtree_docs_basic-layer-breakdown.md.Lt_Kak5C.js b/assets/public_gamedevtree_docs_basic-layer-breakdown.md.DlASwD5Q.js
similarity index 98%
rename from assets/public_gamedevtree_docs_basic-layer-breakdown.md.Lt_Kak5C.js
rename to assets/public_gamedevtree_docs_basic-layer-breakdown.md.DlASwD5Q.js
index 235581dc..95b7d925 100644
--- a/assets/public_gamedevtree_docs_basic-layer-breakdown.md.Lt_Kak5C.js
+++ b/assets/public_gamedevtree_docs_basic-layer-breakdown.md.DlASwD5Q.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Basic layer breakdown","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/basic-layer-breakdown.md","filePath":"public/gamedevtree/docs/basic-layer-breakdown.md","lastUpdated":1701137241000}'),e={name:"public/gamedevtree/docs/basic-layer-breakdown.md"},t=n(`

Basic layer breakdown

This is a very minimal layer with minimal features. Most things will require additional features.

js
    p: {
+import{_ as s,c as i,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Basic layer breakdown","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/basic-layer-breakdown.md","filePath":"public/gamedevtree/docs/basic-layer-breakdown.md","lastUpdated":1602559682000}'),e={name:"public/gamedevtree/docs/basic-layer-breakdown.md"},t=n(`

Basic layer breakdown

This is a very minimal layer with minimal features. Most things will require additional features.

js
    p: {
         startData() { return {                  // startData is a function that returns default data for a layer. 
             unlocked: false,                    // You can add more variables here to add them to your layer.
             points: new Decimal(0),             // "points" is the internal name for the main resource of the layer.
diff --git a/assets/public_gamedevtree_docs_basic-layer-breakdown.md.Lt_Kak5C.lean.js b/assets/public_gamedevtree_docs_basic-layer-breakdown.md.DlASwD5Q.lean.js
similarity index 75%
rename from assets/public_gamedevtree_docs_basic-layer-breakdown.md.Lt_Kak5C.lean.js
rename to assets/public_gamedevtree_docs_basic-layer-breakdown.md.DlASwD5Q.lean.js
index 6e83c472..63162e15 100644
--- a/assets/public_gamedevtree_docs_basic-layer-breakdown.md.Lt_Kak5C.lean.js
+++ b/assets/public_gamedevtree_docs_basic-layer-breakdown.md.DlASwD5Q.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Basic layer breakdown","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/basic-layer-breakdown.md","filePath":"public/gamedevtree/docs/basic-layer-breakdown.md","lastUpdated":1701137241000}'),e={name:"public/gamedevtree/docs/basic-layer-breakdown.md"},t=n("",3),h=[t];function l(k,p,r,E,d,o){return a(),i("div",null,h)}const c=s(e,[["render",l]]);export{g as __pageData,c as default};
+import{_ as s,c as i,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Basic layer breakdown","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/basic-layer-breakdown.md","filePath":"public/gamedevtree/docs/basic-layer-breakdown.md","lastUpdated":1602559682000}'),e={name:"public/gamedevtree/docs/basic-layer-breakdown.md"},t=n("",3),h=[t];function l(k,p,r,E,d,o){return a(),i("div",null,h)}const c=s(e,[["render",l]]);export{g as __pageData,c as default};
diff --git a/assets/public_gamedevtree_docs_buyables.md.Bdb3l1uw.js b/assets/public_gamedevtree_docs_buyables.md.Bu_8Had0.js
similarity index 99%
rename from assets/public_gamedevtree_docs_buyables.md.Bdb3l1uw.js
rename to assets/public_gamedevtree_docs_buyables.md.Bu_8Had0.js
index 374bc37f..c2505f10 100644
--- a/assets/public_gamedevtree_docs_buyables.md.Bdb3l1uw.js
+++ b/assets/public_gamedevtree_docs_buyables.md.Bu_8Had0.js
@@ -1,4 +1,4 @@
-import{_ as s,c as e,o as t,a9 as a}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Buyables","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/buyables.md","filePath":"public/gamedevtree/docs/buyables.md","lastUpdated":1701137241000}'),i={name:"public/gamedevtree/docs/buyables.md"},n=a(`

Buyables

Buyables are usually things that can be bought multiple times with scaling costs. If you set a respec function, the player can reset the purchases to get their currency back.

The amount of a buyable owned is a Decimal. You can get or set the amount of a buyable with getBuyableAmt(layer, id) and setBuyableAmt(layer, id, amt). You can use buyableEffect(layer, id) to get the current effects of a buyable.

Buyables should be formatted like this:

js
    buyables: {
+import{_ as s,c as e,o as t,a9 as a}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Buyables","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/buyables.md","filePath":"public/gamedevtree/docs/buyables.md","lastUpdated":1602964230000}'),i={name:"public/gamedevtree/docs/buyables.md"},n=a(`

Buyables

Buyables are usually things that can be bought multiple times with scaling costs. If you set a respec function, the player can reset the purchases to get their currency back.

The amount of a buyable owned is a Decimal. You can get or set the amount of a buyable with getBuyableAmt(layer, id) and setBuyableAmt(layer, id, amt). You can use buyableEffect(layer, id) to get the current effects of a buyable.

Buyables should be formatted like this:

js
    buyables: {
         rows: # of rows
         cols: # of columns
         respec() {}, //**optional**, implement it to reset things and give back your currency.
diff --git a/assets/public_gamedevtree_docs_buyables.md.Bdb3l1uw.lean.js b/assets/public_gamedevtree_docs_buyables.md.Bu_8Had0.lean.js
similarity index 86%
rename from assets/public_gamedevtree_docs_buyables.md.Bdb3l1uw.lean.js
rename to assets/public_gamedevtree_docs_buyables.md.Bu_8Had0.lean.js
index 93500959..1aef7db7 100644
--- a/assets/public_gamedevtree_docs_buyables.md.Bdb3l1uw.lean.js
+++ b/assets/public_gamedevtree_docs_buyables.md.Bu_8Had0.lean.js
@@ -1 +1 @@
-import{_ as s,c as e,o as t,a9 as a}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Buyables","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/buyables.md","filePath":"public/gamedevtree/docs/buyables.md","lastUpdated":1701137241000}'),i={name:"public/gamedevtree/docs/buyables.md"},n=a("",11),l=[n];function o(p,h,r,u,c,k){return t(),e("div",null,l)}const b=s(i,[["render",o]]);export{y as __pageData,b as default};
+import{_ as s,c as e,o as t,a9 as a}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Buyables","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/buyables.md","filePath":"public/gamedevtree/docs/buyables.md","lastUpdated":1602964230000}'),i={name:"public/gamedevtree/docs/buyables.md"},n=a("",11),l=[n];function o(p,h,r,u,c,k){return t(),e("div",null,l)}const b=s(i,[["render",o]]);export{y as __pageData,b as default};
diff --git a/assets/public_gamedevtree_docs_challenges.md.BsXIWoTI.js b/assets/public_gamedevtree_docs_challenges.md.BFQDD4X0.js
similarity index 99%
rename from assets/public_gamedevtree_docs_challenges.md.BsXIWoTI.js
rename to assets/public_gamedevtree_docs_challenges.md.BFQDD4X0.js
index ddd6fff7..edf1b45d 100644
--- a/assets/public_gamedevtree_docs_challenges.md.BsXIWoTI.js
+++ b/assets/public_gamedevtree_docs_challenges.md.BFQDD4X0.js
@@ -1,4 +1,4 @@
-import{_ as e,c as a,o as t,a9 as s}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Challenges","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/challenges.md","filePath":"public/gamedevtree/docs/challenges.md","lastUpdated":1701137241000}'),i={name:"public/gamedevtree/docs/challenges.md"},n=s(`

Challenges

Useful functions for dealing with Challenges and implementing their effects:

  • inChallenge(layer, id): determine if the player is in a given challenge (or another challenge on the same layer that counts as this one)
  • hasChallenge(layer, id): determine if the player has completed the challenge
  • challengeCompletions(layer, id): determine how many times the player completed the challenge
  • challEffect(layer, id): Returns the current effects of the challenge, if any

Challenges are stored in the following format:

js
    challenges: {
+import{_ as e,c as a,o as t,a9 as s}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Challenges","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/challenges.md","filePath":"public/gamedevtree/docs/challenges.md","lastUpdated":1602862779000}'),i={name:"public/gamedevtree/docs/challenges.md"},n=s(`

Challenges

Useful functions for dealing with Challenges and implementing their effects:

  • inChallenge(layer, id): determine if the player is in a given challenge (or another challenge on the same layer that counts as this one)
  • hasChallenge(layer, id): determine if the player has completed the challenge
  • challengeCompletions(layer, id): determine how many times the player completed the challenge
  • challEffect(layer, id): Returns the current effects of the challenge, if any

Challenges are stored in the following format:

js
    challenges: {
         rows: # of rows
         cols: # of columns
         11: {
diff --git a/assets/public_gamedevtree_docs_challenges.md.BsXIWoTI.lean.js b/assets/public_gamedevtree_docs_challenges.md.BFQDD4X0.lean.js
similarity index 86%
rename from assets/public_gamedevtree_docs_challenges.md.BsXIWoTI.lean.js
rename to assets/public_gamedevtree_docs_challenges.md.BFQDD4X0.lean.js
index c453c7a1..312347d1 100644
--- a/assets/public_gamedevtree_docs_challenges.md.BsXIWoTI.lean.js
+++ b/assets/public_gamedevtree_docs_challenges.md.BFQDD4X0.lean.js
@@ -1 +1 @@
-import{_ as e,c as a,o as t,a9 as s}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Challenges","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/challenges.md","filePath":"public/gamedevtree/docs/challenges.md","lastUpdated":1701137241000}'),i={name:"public/gamedevtree/docs/challenges.md"},n=s("",9),l=[n];function o(h,r,c,p,g,u){return t(),a("div",null,l)}const y=e(i,[["render",o]]);export{f as __pageData,y as default};
+import{_ as e,c as a,o as t,a9 as s}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Challenges","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/challenges.md","filePath":"public/gamedevtree/docs/challenges.md","lastUpdated":1602862779000}'),i={name:"public/gamedevtree/docs/challenges.md"},n=s("",9),l=[n];function o(h,r,c,p,g,u){return t(),a("div",null,l)}const y=e(i,[["render",o]]);export{f as __pageData,y as default};
diff --git a/assets/public_gamedevtree_docs_clickables.md.CYP_r85U.js b/assets/public_gamedevtree_docs_clickables.md.9UR7Ajqa.js
similarity index 98%
rename from assets/public_gamedevtree_docs_clickables.md.CYP_r85U.js
rename to assets/public_gamedevtree_docs_clickables.md.9UR7Ajqa.js
index 420ba61a..beef3c8d 100644
--- a/assets/public_gamedevtree_docs_clickables.md.CYP_r85U.js
+++ b/assets/public_gamedevtree_docs_clickables.md.9UR7Ajqa.js
@@ -1,4 +1,4 @@
-import{_ as s,c as a,o as i,a9 as e}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Clickables","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/clickables.md","filePath":"public/gamedevtree/docs/clickables.md","lastUpdated":1701137241000}'),t={name:"public/gamedevtree/docs/clickables.md"},l=e(`

Clickables

Clickables are any kind of thing that you can click for an effect. They're a more generalized version of Buyables.

DO NOT USE THESE TO MAKE THINGS THAT YOU CLICK REPEATEDLY FOR A BONUS BECAUSE THOSE ARE AWFUL.

There are several differences between the two. One is that a buyable's saved data is its amount as a Decimal, while Clickables store a "state" which can be a number or string, but not Decimal, array, or object). Buyables have a number of extra features which you can see on their page. Clickables also have a smaller default size.

You can get and set a clickable's state with getClickableState(layer, id) and setClickableState(layer, id, state). You can use clickableEffect(layer, id) to get the current effects of a clickable.

Clickables should be formatted like this:

js
    clickables: {
+import{_ as s,c as a,o as i,a9 as e}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Clickables","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/clickables.md","filePath":"public/gamedevtree/docs/clickables.md","lastUpdated":1603679142000}'),t={name:"public/gamedevtree/docs/clickables.md"},l=e(`

Clickables

Clickables are any kind of thing that you can click for an effect. They're a more generalized version of Buyables.

DO NOT USE THESE TO MAKE THINGS THAT YOU CLICK REPEATEDLY FOR A BONUS BECAUSE THOSE ARE AWFUL.

There are several differences between the two. One is that a buyable's saved data is its amount as a Decimal, while Clickables store a "state" which can be a number or string, but not Decimal, array, or object). Buyables have a number of extra features which you can see on their page. Clickables also have a smaller default size.

You can get and set a clickable's state with getClickableState(layer, id) and setClickableState(layer, id, state). You can use clickableEffect(layer, id) to get the current effects of a clickable.

Clickables should be formatted like this:

js
    clickables: {
         rows: # of rows
         cols: # of columns
         masterButtonPress() // **optional** If this is present, an additional button will appear above the clickables.
diff --git a/assets/public_gamedevtree_docs_clickables.md.CYP_r85U.lean.js b/assets/public_gamedevtree_docs_clickables.md.9UR7Ajqa.lean.js
similarity index 86%
rename from assets/public_gamedevtree_docs_clickables.md.CYP_r85U.lean.js
rename to assets/public_gamedevtree_docs_clickables.md.9UR7Ajqa.lean.js
index 86bf97cc..504c11df 100644
--- a/assets/public_gamedevtree_docs_clickables.md.CYP_r85U.lean.js
+++ b/assets/public_gamedevtree_docs_clickables.md.9UR7Ajqa.lean.js
@@ -1 +1 @@
-import{_ as s,c as a,o as i,a9 as e}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Clickables","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/clickables.md","filePath":"public/gamedevtree/docs/clickables.md","lastUpdated":1701137241000}'),t={name:"public/gamedevtree/docs/clickables.md"},l=e("",9),n=[l];function h(p,o,r,c,k,d){return i(),a("div",null,n)}const E=s(t,[["render",h]]);export{g as __pageData,E as default};
+import{_ as s,c as a,o as i,a9 as e}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Clickables","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/clickables.md","filePath":"public/gamedevtree/docs/clickables.md","lastUpdated":1603679142000}'),t={name:"public/gamedevtree/docs/clickables.md"},l=e("",9),n=[l];function h(p,o,r,c,k,d){return i(),a("div",null,n)}const E=s(t,[["render",h]]);export{g as __pageData,E as default};
diff --git a/assets/public_gamedevtree_docs_custom-tab-layouts.md.DXFeTlpj.js b/assets/public_gamedevtree_docs_custom-tab-layouts.md.CuvyVAhF.js
similarity index 99%
rename from assets/public_gamedevtree_docs_custom-tab-layouts.md.DXFeTlpj.js
rename to assets/public_gamedevtree_docs_custom-tab-layouts.md.CuvyVAhF.js
index c0b74d75..dea27645 100644
--- a/assets/public_gamedevtree_docs_custom-tab-layouts.md.DXFeTlpj.js
+++ b/assets/public_gamedevtree_docs_custom-tab-layouts.md.CuvyVAhF.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const E=JSON.parse('{"title":"Custom tab layouts","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/custom-tab-layouts.md","filePath":"public/gamedevtree/docs/custom-tab-layouts.md","lastUpdated":1701137241000}'),e={name:"public/gamedevtree/docs/custom-tab-layouts.md"},l=t(`

Custom tab layouts

Note: If you are using subtabs, tabFormat is used differently, but you still use the same format within each subtabs. See here for more on subtabs

Custom tab layouts can be used to do basically anything in a tab window, especially combined with the "style" layer feature. The tabFormat feature is an array of things, like this:

js
    tabFormat: ["main-display",
+import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const E=JSON.parse('{"title":"Custom tab layouts","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/custom-tab-layouts.md","filePath":"public/gamedevtree/docs/custom-tab-layouts.md","lastUpdated":1603681232000}'),e={name:"public/gamedevtree/docs/custom-tab-layouts.md"},l=t(`

Custom tab layouts

Note: If you are using subtabs, tabFormat is used differently, but you still use the same format within each subtabs. See here for more on subtabs

Custom tab layouts can be used to do basically anything in a tab window, especially combined with the "style" layer feature. The tabFormat feature is an array of things, like this:

js
    tabFormat: ["main-display",
             ["prestige-button", function(){return "Melt your points into "}],
             "blank",
             ["display-text",
diff --git a/assets/public_gamedevtree_docs_custom-tab-layouts.md.DXFeTlpj.lean.js b/assets/public_gamedevtree_docs_custom-tab-layouts.md.CuvyVAhF.lean.js
similarity index 87%
rename from assets/public_gamedevtree_docs_custom-tab-layouts.md.DXFeTlpj.lean.js
rename to assets/public_gamedevtree_docs_custom-tab-layouts.md.CuvyVAhF.lean.js
index 739f3c77..c99741b6 100644
--- a/assets/public_gamedevtree_docs_custom-tab-layouts.md.DXFeTlpj.lean.js
+++ b/assets/public_gamedevtree_docs_custom-tab-layouts.md.CuvyVAhF.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const E=JSON.parse('{"title":"Custom tab layouts","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/custom-tab-layouts.md","filePath":"public/gamedevtree/docs/custom-tab-layouts.md","lastUpdated":1701137241000}'),e={name:"public/gamedevtree/docs/custom-tab-layouts.md"},l=t("",9),n=[l];function h(p,o,r,k,u,d){return a(),i("div",null,n)}const c=s(e,[["render",h]]);export{E as __pageData,c as default};
+import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const E=JSON.parse('{"title":"Custom tab layouts","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/custom-tab-layouts.md","filePath":"public/gamedevtree/docs/custom-tab-layouts.md","lastUpdated":1603681232000}'),e={name:"public/gamedevtree/docs/custom-tab-layouts.md"},l=t("",9),n=[l];function h(p,o,r,k,u,d){return a(),i("div",null,n)}const c=s(e,[["render",h]]);export{E as __pageData,c as default};
diff --git a/assets/public_gamedevtree_docs_getting-started.md.53r6S_jZ.js b/assets/public_gamedevtree_docs_getting-started.md.CO6xRZs4.js
similarity index 98%
rename from assets/public_gamedevtree_docs_getting-started.md.53r6S_jZ.js
rename to assets/public_gamedevtree_docs_getting-started.md.CO6xRZs4.js
index e6f525de..9f3e3a20 100644
--- a/assets/public_gamedevtree_docs_getting-started.md.53r6S_jZ.js
+++ b/assets/public_gamedevtree_docs_getting-started.md.CO6xRZs4.js
@@ -1 +1 @@
-import{_ as e,c as t,o,a9 as i}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Getting started","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/getting-started.md","filePath":"public/gamedevtree/docs/getting-started.md","lastUpdated":1701137241000}'),a={name:"public/gamedevtree/docs/getting-started.md"},n=i('

Getting started

Welcome to The Modding Tree!

Using the Modding Tree, at its simplest level, just requires getting a copy of it onto your computer. However, if you do it the right way, it will help in many ways.

Don't let the word "Github" scare you away. It's actually much easier to use than most people think, especially because most people use it the hard way. The key is Github Desktop, which lets you do everything you need to, without even touching the command line.

The benefits of using Github:

  • It makes it much, much easier to update The Modding Tree.
  • You can share your work without any extra effort using githack, or with a bit more effort, set up a github.io site.
  • It lets you undo changes to your code, and to have multiple versions of it.
  • It lets you collaborate with other people, if you want to.

Getting set up with Github and The Modding Tree:

  1. Install Github Desktop and Visual Studio Code.

  2. Make a Github account. You can handle this on your own.

  3. Log in on your browser, and go back to The Modding Tree page. At the top right, there should be a button that says "fork". Click on it, and then on your username. You now have your own fork, or copy, of The Modding Tree.

  4. Open Github Desktop and log in. Ignore everything else and choose "clone a repository". A "repository" is basically a "Github project", like The Modding Tree. "Cloning" is downloading a copy of the repository to your computer.

  5. Look for The Modding Tree in the list of repositiories (it should be the only one) and click "clone".

  6. Select that you're using it for your own purposes, and click continue. It will download the files and handle everything.

Using your repository

  1. Click on "show in finder" to the right, and then open index.html. This will let you view and test your project!

  2. To edit your project, click "open in VSCode" in Github Desktop.

  3. Open mod.js in VSCode, and look at the top part where it says "modInfo". On the lines below that, change the mod's name to whatever you want, and change the id as well. (It can be any string value, and it's used to determine where the savefile is. Make it something that's probably unique, and don't change it again later.)

  4. Save game.js, and then reload index.html. The title on the tab, as well as on the info page, will now be the new ones!

  5. Go back to Github Desktop. It's time to save your changes into the git system by making a "commit".

  6. At the bottom right corner, add a summary of your changes, and then click "commit to master".

  7. Finally, at the top middle, click "push origin" to push your changes out onto the online repository.

  8. You can view your project on line, or share it with others, by going to https://raw.githack.com/[YOUR-GITHUB-USERNAME]/The-Modding-Tree/master/index.html

And now, you have successfully used Github! You can look at the documentation to see how The Modding Tree's system works and to make your mod a reality.

',11),r=[n];function s(l,h,u,d,p,c){return o(),t("div",null,r)}const y=e(a,[["render",s]]);export{m as __pageData,y as default}; +import{_ as e,c as t,o,a9 as i}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Getting started","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/getting-started.md","filePath":"public/gamedevtree/docs/getting-started.md","lastUpdated":1603151572000}'),a={name:"public/gamedevtree/docs/getting-started.md"},n=i('

Getting started

Welcome to The Modding Tree!

Using the Modding Tree, at its simplest level, just requires getting a copy of it onto your computer. However, if you do it the right way, it will help in many ways.

Don't let the word "Github" scare you away. It's actually much easier to use than most people think, especially because most people use it the hard way. The key is Github Desktop, which lets you do everything you need to, without even touching the command line.

The benefits of using Github:

  • It makes it much, much easier to update The Modding Tree.
  • You can share your work without any extra effort using githack, or with a bit more effort, set up a github.io site.
  • It lets you undo changes to your code, and to have multiple versions of it.
  • It lets you collaborate with other people, if you want to.

Getting set up with Github and The Modding Tree:

  1. Install Github Desktop and Visual Studio Code.

  2. Make a Github account. You can handle this on your own.

  3. Log in on your browser, and go back to The Modding Tree page. At the top right, there should be a button that says "fork". Click on it, and then on your username. You now have your own fork, or copy, of The Modding Tree.

  4. Open Github Desktop and log in. Ignore everything else and choose "clone a repository". A "repository" is basically a "Github project", like The Modding Tree. "Cloning" is downloading a copy of the repository to your computer.

  5. Look for The Modding Tree in the list of repositiories (it should be the only one) and click "clone".

  6. Select that you're using it for your own purposes, and click continue. It will download the files and handle everything.

Using your repository

  1. Click on "show in finder" to the right, and then open index.html. This will let you view and test your project!

  2. To edit your project, click "open in VSCode" in Github Desktop.

  3. Open mod.js in VSCode, and look at the top part where it says "modInfo". On the lines below that, change the mod's name to whatever you want, and change the id as well. (It can be any string value, and it's used to determine where the savefile is. Make it something that's probably unique, and don't change it again later.)

  4. Save game.js, and then reload index.html. The title on the tab, as well as on the info page, will now be the new ones!

  5. Go back to Github Desktop. It's time to save your changes into the git system by making a "commit".

  6. At the bottom right corner, add a summary of your changes, and then click "commit to master".

  7. Finally, at the top middle, click "push origin" to push your changes out onto the online repository.

  8. You can view your project on line, or share it with others, by going to https://raw.githack.com/[YOUR-GITHUB-USERNAME]/The-Modding-Tree/master/index.html

And now, you have successfully used Github! You can look at the documentation to see how The Modding Tree's system works and to make your mod a reality.

',11),r=[n];function s(l,h,u,d,p,c){return o(),t("div",null,r)}const y=e(a,[["render",s]]);export{m as __pageData,y as default}; diff --git a/assets/public_gamedevtree_docs_getting-started.md.53r6S_jZ.lean.js b/assets/public_gamedevtree_docs_getting-started.md.CO6xRZs4.lean.js similarity index 87% rename from assets/public_gamedevtree_docs_getting-started.md.53r6S_jZ.lean.js rename to assets/public_gamedevtree_docs_getting-started.md.CO6xRZs4.lean.js index 5106d0ee..6aecdc3d 100644 --- a/assets/public_gamedevtree_docs_getting-started.md.53r6S_jZ.lean.js +++ b/assets/public_gamedevtree_docs_getting-started.md.CO6xRZs4.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o,a9 as i}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Getting started","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/getting-started.md","filePath":"public/gamedevtree/docs/getting-started.md","lastUpdated":1701137241000}'),a={name:"public/gamedevtree/docs/getting-started.md"},n=i("",11),r=[n];function s(l,h,u,d,p,c){return o(),t("div",null,r)}const y=e(a,[["render",s]]);export{m as __pageData,y as default}; +import{_ as e,c as t,o,a9 as i}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Getting started","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/getting-started.md","filePath":"public/gamedevtree/docs/getting-started.md","lastUpdated":1603151572000}'),a={name:"public/gamedevtree/docs/getting-started.md"},n=i("",11),r=[n];function s(l,h,u,d,p,c){return o(),t("div",null,r)}const y=e(a,[["render",s]]);export{m as __pageData,y as default}; diff --git a/assets/public_gamedevtree_docs_infoboxes.md.u7lbf1fe.js b/assets/public_gamedevtree_docs_infoboxes.md.CRUxoh5g.js similarity index 98% rename from assets/public_gamedevtree_docs_infoboxes.md.u7lbf1fe.js rename to assets/public_gamedevtree_docs_infoboxes.md.CRUxoh5g.js index 53534d3a..475f5aeb 100644 --- a/assets/public_gamedevtree_docs_infoboxes.md.u7lbf1fe.js +++ b/assets/public_gamedevtree_docs_infoboxes.md.CRUxoh5g.js @@ -1,4 +1,4 @@ -import{_ as s,c as e,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Infoboxes","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/infoboxes.md","filePath":"public/gamedevtree/docs/infoboxes.md","lastUpdated":1701137241000}'),t={name:"public/gamedevtree/docs/infoboxes.md"},n=a(`

Infoboxes

Infoboxes are good for displaying "lore", or story elements, as well as for explaining complicated things.

In the default tab layout, the first infobox will be displayed at the very top of the tab.

Infoboxes are defined like other Big Features:

js
    infoboxes: {
+import{_ as s,c as e,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Infoboxes","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/infoboxes.md","filePath":"public/gamedevtree/docs/infoboxes.md","lastUpdated":1603679142000}'),t={name:"public/gamedevtree/docs/infoboxes.md"},n=a(`

Infoboxes

Infoboxes are good for displaying "lore", or story elements, as well as for explaining complicated things.

In the default tab layout, the first infobox will be displayed at the very top of the tab.

Infoboxes are defined like other Big Features:

js
    infoboxes: {
         infobox: {
             display() {return "Blah"},
             etc
diff --git a/assets/public_gamedevtree_docs_infoboxes.md.u7lbf1fe.lean.js b/assets/public_gamedevtree_docs_infoboxes.md.CRUxoh5g.lean.js
similarity index 86%
rename from assets/public_gamedevtree_docs_infoboxes.md.u7lbf1fe.lean.js
rename to assets/public_gamedevtree_docs_infoboxes.md.CRUxoh5g.lean.js
index 6c1624c7..89680cb9 100644
--- a/assets/public_gamedevtree_docs_infoboxes.md.u7lbf1fe.lean.js
+++ b/assets/public_gamedevtree_docs_infoboxes.md.CRUxoh5g.lean.js
@@ -1 +1 @@
-import{_ as s,c as e,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Infoboxes","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/infoboxes.md","filePath":"public/gamedevtree/docs/infoboxes.md","lastUpdated":1701137241000}'),t={name:"public/gamedevtree/docs/infoboxes.md"},n=a("",7),o=[n];function l(p,r,h,d,c,b){return i(),e("div",null,o)}const f=s(t,[["render",l]]);export{u as __pageData,f as default};
+import{_ as s,c as e,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Infoboxes","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/infoboxes.md","filePath":"public/gamedevtree/docs/infoboxes.md","lastUpdated":1603679142000}'),t={name:"public/gamedevtree/docs/infoboxes.md"},n=a("",7),o=[n];function l(p,r,h,d,c,b){return i(),e("div",null,o)}const f=s(t,[["render",l]]);export{u as __pageData,f as default};
diff --git a/assets/public_gamedevtree_docs_layer-features.md.BBomRnin.js b/assets/public_gamedevtree_docs_layer-features.md.DSg6NDQu.js
similarity index 99%
rename from assets/public_gamedevtree_docs_layer-features.md.BBomRnin.js
rename to assets/public_gamedevtree_docs_layer-features.md.DSg6NDQu.js
index 7eb26ce8..90f79bb5 100644
--- a/assets/public_gamedevtree_docs_layer-features.md.BBomRnin.js
+++ b/assets/public_gamedevtree_docs_layer-features.md.DSg6NDQu.js
@@ -1,4 +1,4 @@
-import{_ as e,c as t,o as a,a9 as s}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Layer Features","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/layer-features.md","filePath":"public/gamedevtree/docs/layer-features.md","lastUpdated":1701137241000}'),i={name:"public/gamedevtree/docs/layer-features.md"},n=s(`

Layer Features

This is a more comprehensive list of established features to add to layers. You can add more freely, if you want to have other functions or values associated with your layer. These have special functionality, though.

You can make almost any value dynamic by using a function in its place, including all display strings and styling/color features.

Key:

  • No label: This is required and the game will crash if it isn't included.
  • sometimes required: This is may be required, depending on other things in the layer.
  • optional: You can leave this out if you don't intend to use that feature for the layer.

Layer Definition features

  • layer: Assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar to access the save value. It makes copying code to new layers easier. It is also assigned to all upgrades and buyables and such.

  • name: Optional, used in reset confirmations (and maybe other places). If absent, it just uses the layer's id.

  • startData(): A function to return the default save data for this layer. Add any variables you have to it. Any nonstandard Decimal variables need to be added to convertToDecimal as well. Standard values: Required: unlocked: a bool determining if this layer is unlocked or not points: a Decimal, the main currency for the layer Optional: total: A Decimal, tracks total amount of main prestige currency best: A Decimal, tracks highest amount of main prestige currency unlockOrder: used to keep track of relevant layers unlocked before this one.

  • color: A color associated with this layer, used in many places. (A string in hex format with a #)

  • row: The row of the layer, starting at 0. This affects where the node appears on the tree, and which resets affect the layer.

     Using "side" instead of a number will cause the layer to appear off to the side as a smaller node (useful for achievements
    +import{_ as e,c as t,o as a,a9 as s}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Layer Features","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/layer-features.md","filePath":"public/gamedevtree/docs/layer-features.md","lastUpdated":1603681232000}'),i={name:"public/gamedevtree/docs/layer-features.md"},n=s(`

    Layer Features

    This is a more comprehensive list of established features to add to layers. You can add more freely, if you want to have other functions or values associated with your layer. These have special functionality, though.

    You can make almost any value dynamic by using a function in its place, including all display strings and styling/color features.

    Key:

    • No label: This is required and the game will crash if it isn't included.
    • sometimes required: This is may be required, depending on other things in the layer.
    • optional: You can leave this out if you don't intend to use that feature for the layer.

    Layer Definition features

    • layer: Assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar to access the save value. It makes copying code to new layers easier. It is also assigned to all upgrades and buyables and such.

    • name: Optional, used in reset confirmations (and maybe other places). If absent, it just uses the layer's id.

    • startData(): A function to return the default save data for this layer. Add any variables you have to it. Any nonstandard Decimal variables need to be added to convertToDecimal as well. Standard values: Required: unlocked: a bool determining if this layer is unlocked or not points: a Decimal, the main currency for the layer Optional: total: A Decimal, tracks total amount of main prestige currency best: A Decimal, tracks highest amount of main prestige currency unlockOrder: used to keep track of relevant layers unlocked before this one.

    • color: A color associated with this layer, used in many places. (A string in hex format with a #)

    • row: The row of the layer, starting at 0. This affects where the node appears on the tree, and which resets affect the layer.

       Using "side" instead of a number will cause the layer to appear off to the side as a smaller node (useful for achievements
        and statistics). Side layers are not affected by resets unless you add a doReset to them.
       
    • resource: Name of the main currency you gain by resetting on this layer.

    • effect(): optional, A function that calculates and returns the current values of any bonuses inherent to the main currency. Can return a value or an object containing multiple values. You will also have to implement the effect where it is applied.

    • effectDescription: optional, A function that returns a description of this effect. If the text stays constant, it can just be a string.

    • layerShown(): A function returning a bool which determines if this layer's node should be visible on the tree. It can also return "ghost", which will hide the layer, but its node will still take up space in the tree.

    • hotkeys: optional, An array containing information on any hotkeys associated with this layer:

      js
      hotkeys: [
           {key: "p", // What the hotkey button is. Use uppercase if it's combined with shift, or "ctrl+x" if ctrl is.
      diff --git a/assets/public_gamedevtree_docs_layer-features.md.BBomRnin.lean.js b/assets/public_gamedevtree_docs_layer-features.md.DSg6NDQu.lean.js
      similarity index 87%
      rename from assets/public_gamedevtree_docs_layer-features.md.BBomRnin.lean.js
      rename to assets/public_gamedevtree_docs_layer-features.md.DSg6NDQu.lean.js
      index 2dcb05e0..a896bff3 100644
      --- a/assets/public_gamedevtree_docs_layer-features.md.BBomRnin.lean.js
      +++ b/assets/public_gamedevtree_docs_layer-features.md.DSg6NDQu.lean.js
      @@ -1 +1 @@
      -import{_ as e,c as t,o as a,a9 as s}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Layer Features","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/layer-features.md","filePath":"public/gamedevtree/docs/layer-features.md","lastUpdated":1701137241000}'),i={name:"public/gamedevtree/docs/layer-features.md"},n=s("",18),o=[n];function r(l,h,u,p,c,d){return a(),t("div",null,o)}const f=e(i,[["render",r]]);export{g as __pageData,f as default};
      +import{_ as e,c as t,o as a,a9 as s}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Layer Features","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/layer-features.md","filePath":"public/gamedevtree/docs/layer-features.md","lastUpdated":1603681232000}'),i={name:"public/gamedevtree/docs/layer-features.md"},n=s("",18),o=[n];function r(l,h,u,p,c,d){return a(),t("div",null,o)}const f=e(i,[["render",r]]);export{g as __pageData,f as default};
      diff --git a/assets/public_gamedevtree_docs_main-mod-info.md.CzntOXuT.js b/assets/public_gamedevtree_docs_main-mod-info.md.6LyBs-t5.js
      similarity index 99%
      rename from assets/public_gamedevtree_docs_main-mod-info.md.CzntOXuT.js
      rename to assets/public_gamedevtree_docs_main-mod-info.md.6LyBs-t5.js
      index 547a1f2c..1445434f 100644
      --- a/assets/public_gamedevtree_docs_main-mod-info.md.CzntOXuT.js
      +++ b/assets/public_gamedevtree_docs_main-mod-info.md.6LyBs-t5.js
      @@ -1,4 +1,4 @@
      -import{_ as i,c as e,o as t,a9 as s}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"mod.js","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/main-mod-info.md","filePath":"public/gamedevtree/docs/main-mod-info.md","lastUpdated":1701137241000}'),a={name:"public/gamedevtree/docs/main-mod-info.md"},n=s(`

      mod.js

      All of the code and data that you're likely to edit is here in mod.js! Everything in mod.js will not be altered by updates, besides the addition of new things.

      Here's a breakdown of what's in it:

      • modInfo is where most of the basic configuration for the mod is. It contains:

        • name: The name of your mod. (a string)
        • id: The id for your mod, a unique string that is used to determine savefile location. Setting it is important!
        • author: The name of the author, displayed in the info tab.
        • pointsName: This changes what is displayed instead of "points" for the main currency. (It does not affect it in the code.)
        • discordName, discordLink: If you have a Discord server or other discussion place, you can add a link to it. "discordName" is the text on the link, and "discordLink" is the url of an invite. If you're using a Discord invite, please make sure it's set to never expire.
        • changelogLink: You can use this to set a link to a page where your changelog for the game is displayed.
        • offlineLimit: The maximum amount of offline time that the player can accumulate, in hours. Any extra time is lost. (a number) This is useful because most of these mods are fast-paced enough that too much offline time ruins the balance, such as the time in between updates. That is why I suggest developers disable offline time on their own savefile.
        • initialStartPoints: A Decimal for the amount of points a new player should start with.
      • VERSION is used to describe the current version of your mod. It contains: num: The mod's version number, displayed at the top right of the tree tab. name: The version's name, displayed alongside the number in the info tab.

      • doNotCallTheseFunctionsEveryTick is very important. TMT calls every function anywhere in "layers" every tick to store the result, unless specifically told not to. Functions that have are used to do an action need to be identified. "Official" functions (those in the documentation) are all fine, but if you make any new ones, add their names to this array.

      js
      // (The ones here are examples, all official functions are already taken care of)
      +import{_ as i,c as e,o as t,a9 as s}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"mod.js","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/main-mod-info.md","filePath":"public/gamedevtree/docs/main-mod-info.md","lastUpdated":1603151572000}'),a={name:"public/gamedevtree/docs/main-mod-info.md"},n=s(`

      mod.js

      All of the code and data that you're likely to edit is here in mod.js! Everything in mod.js will not be altered by updates, besides the addition of new things.

      Here's a breakdown of what's in it:

      • modInfo is where most of the basic configuration for the mod is. It contains:

        • name: The name of your mod. (a string)
        • id: The id for your mod, a unique string that is used to determine savefile location. Setting it is important!
        • author: The name of the author, displayed in the info tab.
        • pointsName: This changes what is displayed instead of "points" for the main currency. (It does not affect it in the code.)
        • discordName, discordLink: If you have a Discord server or other discussion place, you can add a link to it. "discordName" is the text on the link, and "discordLink" is the url of an invite. If you're using a Discord invite, please make sure it's set to never expire.
        • changelogLink: You can use this to set a link to a page where your changelog for the game is displayed.
        • offlineLimit: The maximum amount of offline time that the player can accumulate, in hours. Any extra time is lost. (a number) This is useful because most of these mods are fast-paced enough that too much offline time ruins the balance, such as the time in between updates. That is why I suggest developers disable offline time on their own savefile.
        • initialStartPoints: A Decimal for the amount of points a new player should start with.
      • VERSION is used to describe the current version of your mod. It contains: num: The mod's version number, displayed at the top right of the tree tab. name: The version's name, displayed alongside the number in the info tab.

      • doNotCallTheseFunctionsEveryTick is very important. TMT calls every function anywhere in "layers" every tick to store the result, unless specifically told not to. Functions that have are used to do an action need to be identified. "Official" functions (those in the documentation) are all fine, but if you make any new ones, add their names to this array.

      js
      // (The ones here are examples, all official functions are already taken care of)
       var doNotCallTheseFunctionsEveryTick = ["doReset", "buy", "onPurchase", "blowUpEverything"]
      • getStartPoints(): A function to determine the amount of points the player starts with after a reset. (returns a Decimal value)

      • canGenPoints(): A function returning a boolean for if points should be generated. Use this if you want an upgrade to unlock generating points.

      • getPointGen(): A function that calculates your points per second. Anything that affects your point gain should go into the calculation here.

      • addedPlayerData(): A function that returns any non-layer-related data that you want to be added to the save data and "player" object.

      js
      function addedPlayerData() { return {
       	weather: "Yes",
       	happiness: new Decimal(72),
      diff --git a/assets/public_gamedevtree_docs_main-mod-info.md.CzntOXuT.lean.js b/assets/public_gamedevtree_docs_main-mod-info.md.6LyBs-t5.lean.js
      similarity index 86%
      rename from assets/public_gamedevtree_docs_main-mod-info.md.CzntOXuT.lean.js
      rename to assets/public_gamedevtree_docs_main-mod-info.md.6LyBs-t5.lean.js
      index f6f2fe31..b5bd8be4 100644
      --- a/assets/public_gamedevtree_docs_main-mod-info.md.CzntOXuT.lean.js
      +++ b/assets/public_gamedevtree_docs_main-mod-info.md.6LyBs-t5.lean.js
      @@ -1 +1 @@
      -import{_ as i,c as e,o as t,a9 as s}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"mod.js","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/main-mod-info.md","filePath":"public/gamedevtree/docs/main-mod-info.md","lastUpdated":1701137241000}'),a={name:"public/gamedevtree/docs/main-mod-info.md"},n=s("",10),o=[n];function l(h,r,d,p,u,c){return t(),e("div",null,o)}const y=i(a,[["render",l]]);export{m as __pageData,y as default};
      +import{_ as i,c as e,o as t,a9 as s}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"mod.js","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/main-mod-info.md","filePath":"public/gamedevtree/docs/main-mod-info.md","lastUpdated":1603151572000}'),a={name:"public/gamedevtree/docs/main-mod-info.md"},n=s("",10),o=[n];function l(h,r,d,p,u,c){return t(),e("div",null,o)}const y=i(a,[["render",l]]);export{m as __pageData,y as default};
      diff --git a/assets/public_gamedevtree_docs_milestones.md.Phzy1O6H.js b/assets/public_gamedevtree_docs_milestones.md.BmAGhs_0.js
      similarity index 98%
      rename from assets/public_gamedevtree_docs_milestones.md.Phzy1O6H.js
      rename to assets/public_gamedevtree_docs_milestones.md.BmAGhs_0.js
      index a1cd56d7..3c5455c5 100644
      --- a/assets/public_gamedevtree_docs_milestones.md.Phzy1O6H.js
      +++ b/assets/public_gamedevtree_docs_milestones.md.BmAGhs_0.js
      @@ -1,4 +1,4 @@
      -import{_ as e,c as s,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Milestones","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/milestones.md","filePath":"public/gamedevtree/docs/milestones.md","lastUpdated":1701137241000}'),a={name:"public/gamedevtree/docs/milestones.md"},n=i(`

      Milestones

      Milestones are awarded to the player when they meet a certain goal, and give some benefit. Milestones should be formatted like this:

      js
          milestones: {
      +import{_ as e,c as s,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Milestones","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/milestones.md","filePath":"public/gamedevtree/docs/milestones.md","lastUpdated":1602782965000}'),a={name:"public/gamedevtree/docs/milestones.md"},n=i(`

      Milestones

      Milestones are awarded to the player when they meet a certain goal, and give some benefit. Milestones should be formatted like this:

      js
          milestones: {
               0: {
                   requirementDesc: "123 waffles",
               }
      diff --git a/assets/public_gamedevtree_docs_milestones.md.Phzy1O6H.lean.js b/assets/public_gamedevtree_docs_milestones.md.BmAGhs_0.lean.js
      similarity index 86%
      rename from assets/public_gamedevtree_docs_milestones.md.Phzy1O6H.lean.js
      rename to assets/public_gamedevtree_docs_milestones.md.BmAGhs_0.lean.js
      index e32a406f..c9f220c1 100644
      --- a/assets/public_gamedevtree_docs_milestones.md.Phzy1O6H.lean.js
      +++ b/assets/public_gamedevtree_docs_milestones.md.BmAGhs_0.lean.js
      @@ -1 +1 @@
      -import{_ as e,c as s,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Milestones","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/milestones.md","filePath":"public/gamedevtree/docs/milestones.md","lastUpdated":1701137241000}'),a={name:"public/gamedevtree/docs/milestones.md"},n=i("",6),o=[n];function l(r,h,p,d,c,u){return t(),s("div",null,o)}const k=e(a,[["render",l]]);export{m as __pageData,k as default};
      +import{_ as e,c as s,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Milestones","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/milestones.md","filePath":"public/gamedevtree/docs/milestones.md","lastUpdated":1602782965000}'),a={name:"public/gamedevtree/docs/milestones.md"},n=i("",6),o=[n];function l(r,h,p,d,c,u){return t(),s("div",null,o)}const k=e(a,[["render",l]]);export{m as __pageData,k as default};
      diff --git a/assets/public_gamedevtree_docs_subtabs-and-microtabs.md.D3v8JvXX.js b/assets/public_gamedevtree_docs_subtabs-and-microtabs.md.C4QzwvQW.js
      similarity index 97%
      rename from assets/public_gamedevtree_docs_subtabs-and-microtabs.md.D3v8JvXX.js
      rename to assets/public_gamedevtree_docs_subtabs-and-microtabs.md.C4QzwvQW.js
      index fce51ea0..c6e494e7 100644
      --- a/assets/public_gamedevtree_docs_subtabs-and-microtabs.md.D3v8JvXX.js
      +++ b/assets/public_gamedevtree_docs_subtabs-and-microtabs.md.C4QzwvQW.js
      @@ -1,4 +1,4 @@
      -import{_ as s,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Subtabs and Microtabs","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/subtabs-and-microtabs.md","filePath":"public/gamedevtree/docs/subtabs-and-microtabs.md","lastUpdated":1701137241000}'),e={name:"public/gamedevtree/docs/subtabs-and-microtabs.md"},n=i(`

      Subtabs and Microtabs

      Subtabs are separate sections of a tab that you can view by selecting one at the top of the tab. Microtabs are smaller areas that function in much the same way.

      Subtabs are defined by using the tab format like this, where each element of tabFormat is given the name of that subtab:

      js
          tabFormat: {
      +import{_ as s,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Subtabs and Microtabs","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/subtabs-and-microtabs.md","filePath":"public/gamedevtree/docs/subtabs-and-microtabs.md","lastUpdated":1602558499000}'),e={name:"public/gamedevtree/docs/subtabs-and-microtabs.md"},n=i(`

      Subtabs and Microtabs

      Subtabs are separate sections of a tab that you can view by selecting one at the top of the tab. Microtabs are smaller areas that function in much the same way.

      Subtabs are defined by using the tab format like this, where each element of tabFormat is given the name of that subtab:

      js
          tabFormat: {
               "Main tab": {
                   *subtab features*
               },
      diff --git a/assets/public_gamedevtree_docs_subtabs-and-microtabs.md.D3v8JvXX.lean.js b/assets/public_gamedevtree_docs_subtabs-and-microtabs.md.C4QzwvQW.lean.js
      similarity index 75%
      rename from assets/public_gamedevtree_docs_subtabs-and-microtabs.md.D3v8JvXX.lean.js
      rename to assets/public_gamedevtree_docs_subtabs-and-microtabs.md.C4QzwvQW.lean.js
      index 9b84feae..1bc96b5d 100644
      --- a/assets/public_gamedevtree_docs_subtabs-and-microtabs.md.D3v8JvXX.lean.js
      +++ b/assets/public_gamedevtree_docs_subtabs-and-microtabs.md.C4QzwvQW.lean.js
      @@ -1 +1 @@
      -import{_ as s,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Subtabs and Microtabs","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/subtabs-and-microtabs.md","filePath":"public/gamedevtree/docs/subtabs-and-microtabs.md","lastUpdated":1701137241000}'),e={name:"public/gamedevtree/docs/subtabs-and-microtabs.md"},n=i("",9),l=[n];function h(p,r,o,k,c,d){return t(),a("div",null,l)}const E=s(e,[["render",h]]);export{u as __pageData,E as default};
      +import{_ as s,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Subtabs and Microtabs","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/subtabs-and-microtabs.md","filePath":"public/gamedevtree/docs/subtabs-and-microtabs.md","lastUpdated":1602558499000}'),e={name:"public/gamedevtree/docs/subtabs-and-microtabs.md"},n=i("",9),l=[n];function h(p,r,o,k,c,d){return t(),a("div",null,l)}const E=s(e,[["render",h]]);export{u as __pageData,E as default};
      diff --git a/assets/public_gamedevtree_docs_updating-tmt.md.Cym0rRYz.js b/assets/public_gamedevtree_docs_updating-tmt.md.DGbxasx9.js
      similarity index 97%
      rename from assets/public_gamedevtree_docs_updating-tmt.md.Cym0rRYz.js
      rename to assets/public_gamedevtree_docs_updating-tmt.md.DGbxasx9.js
      index d0a52a6a..3944b615 100644
      --- a/assets/public_gamedevtree_docs_updating-tmt.md.Cym0rRYz.js
      +++ b/assets/public_gamedevtree_docs_updating-tmt.md.DGbxasx9.js
      @@ -1 +1 @@
      -import{_ as e,c as t,o as a,a9 as o}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Updating The Modding Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/updating-tmt.md","filePath":"public/gamedevtree/docs/updating-tmt.md","lastUpdated":1701137241000}'),i={name:"public/gamedevtree/docs/updating-tmt.md"},n=o('

      Updating The Modding Tree

      This tutorial assumes that you have used the Getting Started Tutorial, and are using Github Desktop and VSCode for your mod.

      Here's what you have to do when there's a TMT update:

      1. Look at the changelog. It will warn you if the update will break anything or require any changes. Decide if you want to try to update.

      2. Open Github Desktop, and at the top middle, click "fetch origin". This will make Github Desktop get information about the update.

      3. Click where it says "current branch: master" at the top middle, and at the bottom of the thing that appears, click "choose a branch to merge into master.

      4. Select upstream/master. It will likely say there are conflicts, but you have tools to resolve them. Click "Merge upstream/master into master".

      5. A conflict happens when the things you're trying to merge have both made changes in the same place. Click "open in Visual Studio Code" next to the first file.

      6. Scroll down through the file, and look for the parts highlighted in red and green. One of these is your code, and the other is some code that will be modified by the update. Do your best to try to edit things to keep the updated changes, but keep your content.

      7. Continue to do this for all remaining challenges.

      8. Do any other changes required by the update, run the game, fix issues, etc.

      ',4),r=[n];function d(h,s,l,p,u,c){return a(),t("div",null,r)}const _=e(i,[["render",d]]);export{m as __pageData,_ as default}; +import{_ as e,c as t,o as a,a9 as o}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Updating The Modding Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/updating-tmt.md","filePath":"public/gamedevtree/docs/updating-tmt.md","lastUpdated":1602215108000}'),i={name:"public/gamedevtree/docs/updating-tmt.md"},n=o('

      Updating The Modding Tree

      This tutorial assumes that you have used the Getting Started Tutorial, and are using Github Desktop and VSCode for your mod.

      Here's what you have to do when there's a TMT update:

      1. Look at the changelog. It will warn you if the update will break anything or require any changes. Decide if you want to try to update.

      2. Open Github Desktop, and at the top middle, click "fetch origin". This will make Github Desktop get information about the update.

      3. Click where it says "current branch: master" at the top middle, and at the bottom of the thing that appears, click "choose a branch to merge into master.

      4. Select upstream/master. It will likely say there are conflicts, but you have tools to resolve them. Click "Merge upstream/master into master".

      5. A conflict happens when the things you're trying to merge have both made changes in the same place. Click "open in Visual Studio Code" next to the first file.

      6. Scroll down through the file, and look for the parts highlighted in red and green. One of these is your code, and the other is some code that will be modified by the update. Do your best to try to edit things to keep the updated changes, but keep your content.

      7. Continue to do this for all remaining challenges.

      8. Do any other changes required by the update, run the game, fix issues, etc.

      ',4),r=[n];function d(h,s,l,p,u,c){return a(),t("div",null,r)}const _=e(i,[["render",d]]);export{m as __pageData,_ as default}; diff --git a/assets/public_gamedevtree_docs_updating-tmt.md.Cym0rRYz.lean.js b/assets/public_gamedevtree_docs_updating-tmt.md.DGbxasx9.lean.js similarity index 87% rename from assets/public_gamedevtree_docs_updating-tmt.md.Cym0rRYz.lean.js rename to assets/public_gamedevtree_docs_updating-tmt.md.DGbxasx9.lean.js index 00e3e424..4a02511c 100644 --- a/assets/public_gamedevtree_docs_updating-tmt.md.Cym0rRYz.lean.js +++ b/assets/public_gamedevtree_docs_updating-tmt.md.DGbxasx9.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as o}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Updating The Modding Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/updating-tmt.md","filePath":"public/gamedevtree/docs/updating-tmt.md","lastUpdated":1701137241000}'),i={name:"public/gamedevtree/docs/updating-tmt.md"},n=o("",4),r=[n];function d(h,s,l,p,u,c){return a(),t("div",null,r)}const _=e(i,[["render",d]]);export{m as __pageData,_ as default}; +import{_ as e,c as t,o as a,a9 as o}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Updating The Modding Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/updating-tmt.md","filePath":"public/gamedevtree/docs/updating-tmt.md","lastUpdated":1602215108000}'),i={name:"public/gamedevtree/docs/updating-tmt.md"},n=o("",4),r=[n];function d(h,s,l,p,u,c){return a(),t("div",null,r)}const _=e(i,[["render",d]]);export{m as __pageData,_ as default}; diff --git a/assets/public_gamedevtree_docs_upgrades.md.hegmaS21.js b/assets/public_gamedevtree_docs_upgrades.md.DZ8OZlWu.js similarity index 98% rename from assets/public_gamedevtree_docs_upgrades.md.hegmaS21.js rename to assets/public_gamedevtree_docs_upgrades.md.DZ8OZlWu.js index 252390ae..1e13d613 100644 --- a/assets/public_gamedevtree_docs_upgrades.md.hegmaS21.js +++ b/assets/public_gamedevtree_docs_upgrades.md.DZ8OZlWu.js @@ -1,4 +1,4 @@ -import{_ as e,c as s,o as t,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Upgrades","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/upgrades.md","filePath":"public/gamedevtree/docs/upgrades.md","lastUpdated":1701137241000}'),i={name:"public/gamedevtree/docs/upgrades.md"},n=a(`

      Upgrades

      Useful functions for dealing with Upgrades and implementing their effects:

      • hasUpgrade(layer, id): determine if the player has the upgrade
      • upgradeEffect(layer, id): Returns the current effects of the upgrade, if any
      • buyUpgrade(layer, id): Buys an upgrade directly (if affordable)

      Hint: Basic point gain is calculated in mod.js's "getPointGen".

      Upgrades are stored in the following format:

      js
          upgrades: {
      +import{_ as e,c as s,o as t,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Upgrades","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/upgrades.md","filePath":"public/gamedevtree/docs/upgrades.md","lastUpdated":1603152353000}'),i={name:"public/gamedevtree/docs/upgrades.md"},n=a(`

      Upgrades

      Useful functions for dealing with Upgrades and implementing their effects:

      • hasUpgrade(layer, id): determine if the player has the upgrade
      • upgradeEffect(layer, id): Returns the current effects of the upgrade, if any
      • buyUpgrade(layer, id): Buys an upgrade directly (if affordable)

      Hint: Basic point gain is calculated in mod.js's "getPointGen".

      Upgrades are stored in the following format:

      js
          upgrades: {
               rows: # of rows
               cols: # of columns
               11: {
      diff --git a/assets/public_gamedevtree_docs_upgrades.md.hegmaS21.lean.js b/assets/public_gamedevtree_docs_upgrades.md.DZ8OZlWu.lean.js
      similarity index 86%
      rename from assets/public_gamedevtree_docs_upgrades.md.hegmaS21.lean.js
      rename to assets/public_gamedevtree_docs_upgrades.md.DZ8OZlWu.lean.js
      index e54f516a..ead58e8b 100644
      --- a/assets/public_gamedevtree_docs_upgrades.md.hegmaS21.lean.js
      +++ b/assets/public_gamedevtree_docs_upgrades.md.DZ8OZlWu.lean.js
      @@ -1 +1 @@
      -import{_ as e,c as s,o as t,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Upgrades","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/upgrades.md","filePath":"public/gamedevtree/docs/upgrades.md","lastUpdated":1701137241000}'),i={name:"public/gamedevtree/docs/upgrades.md"},n=a("",10),r=[n];function l(o,p,h,d,u,c){return t(),s("div",null,r)}const y=e(i,[["render",l]]);export{f as __pageData,y as default};
      +import{_ as e,c as s,o as t,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Upgrades","description":"","frontmatter":{},"headers":[],"relativePath":"public/gamedevtree/docs/upgrades.md","filePath":"public/gamedevtree/docs/upgrades.md","lastUpdated":1603152353000}'),i={name:"public/gamedevtree/docs/upgrades.md"},n=a("",10),r=[n];function l(o,p,h,d,u,c){return t(),s("div",null,r)}const y=e(i,[["render",l]]);export{f as __pageData,y as default};
      diff --git a/assets/public_kronos_Old Things_2.0-format-changes.md.B6DTr0jJ.js b/assets/public_kronos_Old Things_2.0-format-changes.md.NRns2BBm.js
      similarity index 97%
      rename from assets/public_kronos_Old Things_2.0-format-changes.md.B6DTr0jJ.js
      rename to assets/public_kronos_Old Things_2.0-format-changes.md.NRns2BBm.js
      index 64cd53cf..59d70f5f 100644
      --- a/assets/public_kronos_Old Things_2.0-format-changes.md.B6DTr0jJ.js	
      +++ b/assets/public_kronos_Old Things_2.0-format-changes.md.NRns2BBm.js	
      @@ -1 +1 @@
      -import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"2.0 format changes","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/Old Things/2.0-format-changes.md","filePath":"public/kronos/Old Things/2.0-format-changes.md","lastUpdated":1701136977000}'),n={name:"public/kronos/Old Things/2.0-format-changes.md"},i=o('

      2.0 format changes

      • Temp format is changed from temp.something[layer] to temp[layer].something, for consistency
      • Challenges are now saved as an object with the amount of completions in each spot. (This will break saves.)
      • effectDisplay in Challenges and Upgrades no longer takes an argument, and neither does effect for Buyables
      • Buyable cost can take an argument for amount of buyables, but it needs to function if no argument is supplied (it should do the cost for the next purchase).
      • Generation of Points now happens in the main game loop (not in a layer update function), enabled by canGenPoints in game.js.
      • Changed fullLayerReset to layerDataReset, which takes an array of names of values to keep

      In addition, many names were changed, mostly expanding abbreviations:

      All instances of:

      • chall -> challenge
      • unl -> unlocked
      • upg -> upgrade (besides CSS)
      • amt -> amount
      • desc -> description
      • resCeil -> roundUpCost
      • order -> unlockOrder
      • incr_order -> increaseUnlockOrder

      Challenges:

      • desc -> challengeDescription
      • reward -> rewardDescription
      • effect -> rewardEffect
      • effectDisplay -> rewardDisplay
      • active -> challengeActive
      ',7),l=[i];function s(r,c,d,h,g,p){return t(),a("div",null,l)}const u=e(n,[["render",s]]);export{m as __pageData,u as default}; +import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"2.0 format changes","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/Old Things/2.0-format-changes.md","filePath":"public/kronos/Old Things/2.0-format-changes.md","lastUpdated":1607827402000}'),n={name:"public/kronos/Old Things/2.0-format-changes.md"},i=o('

      2.0 format changes

      • Temp format is changed from temp.something[layer] to temp[layer].something, for consistency
      • Challenges are now saved as an object with the amount of completions in each spot. (This will break saves.)
      • effectDisplay in Challenges and Upgrades no longer takes an argument, and neither does effect for Buyables
      • Buyable cost can take an argument for amount of buyables, but it needs to function if no argument is supplied (it should do the cost for the next purchase).
      • Generation of Points now happens in the main game loop (not in a layer update function), enabled by canGenPoints in game.js.
      • Changed fullLayerReset to layerDataReset, which takes an array of names of values to keep

      In addition, many names were changed, mostly expanding abbreviations:

      All instances of:

      • chall -> challenge
      • unl -> unlocked
      • upg -> upgrade (besides CSS)
      • amt -> amount
      • desc -> description
      • resCeil -> roundUpCost
      • order -> unlockOrder
      • incr_order -> increaseUnlockOrder

      Challenges:

      • desc -> challengeDescription
      • reward -> rewardDescription
      • effect -> rewardEffect
      • effectDisplay -> rewardDisplay
      • active -> challengeActive
      ',7),l=[i];function s(r,c,d,h,g,p){return t(),a("div",null,l)}const u=e(n,[["render",s]]);export{m as __pageData,u as default}; diff --git a/assets/public_kronos_Old Things_2.0-format-changes.md.B6DTr0jJ.lean.js b/assets/public_kronos_Old Things_2.0-format-changes.md.NRns2BBm.lean.js similarity index 87% rename from assets/public_kronos_Old Things_2.0-format-changes.md.B6DTr0jJ.lean.js rename to assets/public_kronos_Old Things_2.0-format-changes.md.NRns2BBm.lean.js index 1e0e25f5..0fb8be1a 100644 --- a/assets/public_kronos_Old Things_2.0-format-changes.md.B6DTr0jJ.lean.js +++ b/assets/public_kronos_Old Things_2.0-format-changes.md.NRns2BBm.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"2.0 format changes","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/Old Things/2.0-format-changes.md","filePath":"public/kronos/Old Things/2.0-format-changes.md","lastUpdated":1701136977000}'),n={name:"public/kronos/Old Things/2.0-format-changes.md"},i=o("",7),l=[i];function s(r,c,d,h,g,p){return t(),a("div",null,l)}const u=e(n,[["render",s]]);export{m as __pageData,u as default}; +import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"2.0 format changes","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/Old Things/2.0-format-changes.md","filePath":"public/kronos/Old Things/2.0-format-changes.md","lastUpdated":1607827402000}'),n={name:"public/kronos/Old Things/2.0-format-changes.md"},i=o("",7),l=[i];function s(r,c,d,h,g,p){return t(),a("div",null,l)}const u=e(n,[["render",s]]);export{m as __pageData,u as default}; diff --git a/assets/public_kronos_changelog.md.paCgtsXh.js b/assets/public_kronos_changelog.md.CKFBbvc8.js similarity index 99% rename from assets/public_kronos_changelog.md.paCgtsXh.js rename to assets/public_kronos_changelog.md.CKFBbvc8.js index 43b5eb5b..2b5aecaf 100644 --- a/assets/public_kronos_changelog.md.paCgtsXh.js +++ b/assets/public_kronos_changelog.md.CKFBbvc8.js @@ -1 +1 @@ -import{_ as e,c as i,o as a,a9 as l}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"The Modding Tree changelog:","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/changelog.md","filePath":"public/kronos/changelog.md","lastUpdated":1701136977000}'),t={name:"public/kronos/changelog.md"},o=l('

      The Modding Tree changelog:

      v2.5.9.2 - 5/19/21

      • Fixed many issues with things not updating.

      v2.5.9.1 - 5/18/21

      • Made text inputs never give NaNs.

      v2.5.9 - 5/18/21

      • Fixed issue when using text inputs for Numbers.
      • Added particle color feature.
      • Particle speed and dir are updated as it moves.
      • Added setSpeed and setDir for particles.
      • Added more trig functions.

      v2.5.8 - 5/17/21

      • Added makeShinies, which creates a stationary particle in a random spot.
      • Bars will visually update more quickly.
      • Fixed a major particle-related issue.
      • Fixed autoUpgrade.
      • Fixed a minor visual issue with tree nodes.

      v2.5.7 - 5/15/21

      • Added a particle system! Not only can it be used for visual effects, but particles can interact with the mouse. They could be used to create golden cookies or collectables, for example.
      • Added marked feature to buyables, clickables, and challenges. By default, stars multi-completion challenges when maxed.
      • Added 'deactivated' feature to layers, which disables many features.
      • Improved number formatting slightly.

      v2.5.6 - 5/14/21

      • You can now use non-numeric ids for upgrades, buyables, etc.
      • Fixed an exploit that let you buy an extra buyable.
      • Moved basic getter/setter functions to easyAccess.js.

      v2.5.5.2 - 5/12/21

      • Fixed a major issue with buyables.
      • Fixed a variety of tabFormat-related issues.
      • Fixed commas appearing in decimal places (thanks to pg132!)

      v2.5.5.1 - 5/12/21

      • Fixed clickables.

      v2.5.5 - 5/12/21

      • Added grids! They are a grid of buttons which behave the same, but have their own data. Good for inventory grids, map tiles, and more!
      • Added "marked" feature to add a mark to a node. Can be an image instead of a star. (Originally by Jacorb)
      • Added "layer-proxy" component that lets you use components from another layer.
      • Added the ability to display non-whole numbers in main-display.

      v2.5.4 - 5/10/21

      • Added a setting to always use single-tab mode.
      • Added directMult, which multiplies prestige gain after exponents and softcaps. It actually multiplies gain for static layers.
      • Added onEnter and onExit for challenges.
      • Improved displaying numbers between 0.0001 and 0.1.
      • Added documentation on how gainMult/Exp work for static layers.
      • Fixed a visual issue on mobile, thanks to thepaperpilot.
      • Improved documentation in general.

      v2.5.3 - 5/8/21

      • Improved performance of tab formats and bars.
      • Respec confirmation settings are now kept on resets.
      • Improved compatibility with older browsers.
      • Fixed missing pixel on vertical bars.

      v2.5.2.1 - 5/7/21

      • Fixed microtabs making layers highlight incorrectly.

      v2.5.2 - 5/7/21

      • Added glowColor for subtabs.
      • Improved the display for extremely small numbers.
      • Fixed issues in the buyable docs.

      v2.5.1 - 5/7/21

      • Fixed dynamic things in tabFormat not updating.

      v2.5: Dreams Really Do Come True - 5/7/21

      • Optimizations, hopefully a significant amount.
      • Added OOM/s point gen display at high values (thanks to Ducdat!)
      • Only one tab will display if the window is not wide enough (also thanks to Ducdat!)
      • Holding down a buyable's button now buys it continuously.
      • New milestone setting will also show the most recently unlocked milestone. (Also renamed all settings to be clearer)
      • Added an onHold feature for clickables.
      • Layer nodes will be highlighted even if the player is on the same tab.
      • Added customizable node glowColor.
      • Added buyable purchaseLimit.
      • Amount is automatically supplied to buyable cost and effect functions.
      • Locked (not yet visible) milestones no longer take up space. Also fixed hidden milestones taking a tiny bit of space.
      • Re-centered respec buttons.
      • Force-displayed tooltips are not hidden by resets.
      • Added formatting support for very small numbers. Disabled in most places by default because rounding errors might cause issues. Access it with formatSmall, or enable it globally by adding "allowSmall: true" to modInfo.

      v2.4.1 - 4/29/21

      • A number of minor fixes, many thanks to thepaperpilot.
      • The respec confirmation checkbox is now part of the respec-button component. (This also fixes the checkbox appearing when there is no respec button)
      • Added a few undocumented changes to the 2.4 changelog (the two at the bottom)

      v2.4: Rationalized Edition - 4/29/21

      • Completely reworked tooltips. Shift-click a node to force its tooltip to stay displayed. (And hopefully finally fixed flickering!)

      • Added text-input and slider components.

      • Added the ability to toggle respec confirmations.

      • Added custom respec confirmation messages.

      • The red layer highlight will not appear before a layer is unlocked.

      • Added unlocking hotkeys.

      • You no longer need to supply 'rows' and 'cols' for any Big Features.

      • Node symbols can use HTML.

      • Added documentation for the respec button.

      • Added prestigeNotify to subtabs, and prestigeNotify in subtabs also highlights the layer node.

      • The version number no longer contains special characters or irrational numbers.

      • Added ctrlDown and shiftDown variables.

      • Tooltips now use HTML (this means you need to replace any newlines with
        )

      v2.π.1 - 4/7/21

      • Fixed formatting for some larger numbers.
      • Upgrades will expand if there is too much text to display.
      • Fixed styling challenges.
      • No longer attempts to display a base currency when there is none.

      v2.π: Incrementally Updated - 2/5/21

      • Performance improvements.
      • Fixed tooltips overlapping with the top display.
      • Clicking a popup dismisses it immediately.
      • Added support for bulk challenge completions.
      • "Best" is updated automatically.
      • Fixed keeping Decimal values on reset.
      • Code reorganization and style improvements by fudo.

      v2.3.5 - 12/21/20

      • Added resetTime, which tracks the time since a layer prestiged or was reset.
      • A layer node will be highlighted red if one of its subtabs is highlighted red.
      • Fixed issues with keeping challenges, buyables, and clickables on reset.
      • Improved the unlocking of custom layers.
      • Other minor fixes.

      v2.3.4 - 12/16/20

      • Added a node image feature.
      • Resource display now always shows the amount of the currency the layer's gain is based on.
      • Added spacing between tree nodes.
      • Another attempt to fix tooltip flickering.

      v2.3.3 - 12/13/20

      • Fixed the first node in a row always taking up space.
      • layerShown is now optional.
      • All prestige types can now use features for custom prestige types.

      v2.3.2 - 12/13/20

      • Fixed achievement/milestone popups.

      v2.3.1 - 12/12/20

      • Another attempt to fix flickering tooltips.
      • The "this" keyword should work everywhere except tabFormat arrays (although I may have missed some things).
      • Fixed tree branches not updating when scrolling on the right-side tab.
      • Fixed a spacing issue when a node's symbol is ""
      • Removed some old, unneeded files.

      v2.3: Cooler and Newer Edition - 12/10/20

      • Added achievement/milestone popups (thank you to Jacorb for this contribution!)
      • The changelog tab is back, and can be set in mod.js.
      • Layer nodes and respec buttons will not be clicked by pressing "enter".
      • Possible fix for flickering tooltips and strange transitions.
      • The victory screen text is configurable.
      • Added image and textStyle features to achievements.
      • Added an argument to use specific rows in an "upgrades" component.
      • Fixed the comma appearing in the main display when there was no effectDescription
      • Added the ability to easily make a tab that is a collection of layers in subtabs.
      • Improved spacing for embedding layers with subtabs into subtabs.

      v2.2.8 - 12/03/20

      • Double-clicking a layer node brings you to the main subtab for that layer.
      • Attempted to fix challenges visually updating a different way.
      • Added a softcap function for use in formulas.
      • Added displayRow feature, which lets layers be shown somewhere separate from where they are in the reset order (e.g. side layers)
      • Fixed autoupgrade issue.

      v2.2.7 - 11/30/20

      • Added autoUpgrade feature.
      • resource-display now shows resource gain per second if passiveGain is active.
      • Fixed formatting issues on some large numbers.
      • Better support for using classed objects in player and in layers/tmp.
      • Made hard resetting more effective.
      • Removed Herobrine from getStartClickables.

      v2.2.6 - 11/30/20

      • Added goalDescription for challenges and made the new "canComplete" system the standard.
      • Another attempt to fix challenges not visually updating.
      • Fixed side layers not appearing.
      • Fixed getStartClickables again.

      v2.2.5 - 11/29/20

      • Added features for overriding the displays and costs/goals of upgrades and challenges to make them fully custom.
      • best, total, and unlocked are always automatically added to layerData (but best and total will only display if you add them yourself).
      • Fixed getStartClickables.

      v2.2.4 - 11/28/20

      • Added softcap and softcapPower features (for Normal layers)
      • Offline time limit and default max tick length were fixed (previously the limits were 1000x too large)
      • Added fixOldSaves.
      • You can use HTML in main-display.
      • Fixed a number of minor oddities.

      v2.2.3 - 11/28/20

      • Layers will be highlighted if you can finish a challenge.
      • The "can complete challenge" color now overrides the "already completed" color.
      • Button nodes now work as side "layers".
      • Setting a tooltip to "" hides it entirely.

      v2.2.2 - 11/22/20

      • Fixed right half of the screen being unclickable in some circumstances.
      • Fixed tree branches being offset.
      • Fix to lastSafeTab.

      v2.2.1 - 11/7/20

      • Added a small highlight to layers you can meaningfully prestige on.
      • Added passiveGeneration and autoPrestige features to standardize prestige automation. (The old ways still work, but the new ones work better with other things)
      • Improved milestones visually a bit.
      • "best" and "total" are now only displayed if present in startData.
      • Fixed issues with things not updating visually. (Thank you to to Jacorb!)
      • Side layers and button nodes can now be highlighted.
      • Updated docs on the new tree-related features.

      v2.2: Uprooted - 11/7/20

      • You can now embed a layer inside of a subtab or microtab!
      • Added support for hiding or reformatting the tree tab
      • Added non-layer button nodes
      • Added shouldNotify to subtab/microtab buttons. (You can make them highlighted)
      • Added commas to large exponents.
      • Upgrades now only show "currently" if they have an effectDisplay (so not for constant effects).
      • Achievements are part of the default tab format.
      • NaN is now handled more intelligently.
      • Renamed files, and moved less relevant ones to another folder.
      • The "hide completed challenges" setting now only hides challenges at max completions.
      • Thank you to thepaperpilot for fixing errors in docs and improving the infobox appearance!
      • Many other minor fixes.

      v2.1.4 - 10/25/20

      • Added an infobox component. Thank you to thepaperpilot for this contribution!
      • Layer type is now optional, and defaults to "none".
      • Improved the look of bars and tab buttons.
      • Improved spacing between layer nodes (also thanks to thepaperpilot!)
      • Fixed the "blank" component breaking if only specifying the height.
      • Fixed some numbers not displaying with enough digits.
      • Made a few more things able to be functions.
      • A few other minor fixes.

      v2.1.3.1 - 10/21/20

      • Fixed the update function.

      v2.1.3 - 10/21/20

      • gainMult and gainExp are now optional.
      • Layer unlocking is now kept on reset.
      • Game should start up faster.
      • Layer updates now have a determined order and starts with earlier-rowed layers.
      • Automation now has a determined order and starts with later-rowed layers.
      • Fixed issues with resetting clickables and challenges.
      • Commas should no longer appear in the decimal places of a number.
      • Fixed potential issue in displaying the tree.

      v2.1.2 - 10/19/20

      • Added buyUpgrade function (buyUpg still works though)
      • Added author name to modInfo.
      • Fix to crash caused when the name of a subtab or microtab is changed.
      • Fixes to outdated information in docs.
      • Improvements to Discord links.
      • Thank you to thepaperpilot for contributing to this update!

      v2.1.1 - 10/17/20

      • Added resource-display component, which displays the base currency for the prestige layer, as well as the best and/or total of this layer's prestige currency.
      • Fixed the value for the base currency not updating in resource-display.

      v2.1: We should have thought of this sooner! - 10/17/20

      • Moved most of the code users will want to edit to mod.js, added documentation for it.
        • Specifically, modInfo, VERSION, canGenPoints, getPointGen, and maxTickLength
      • Added getStartPoints()
      • Added the ability to store non-layer-related data
      • Added the ability to display more things at the top of the tree tab below points.
      • Made the endgame condition customizable
      • Added "sell one" and "sell all" buttons for buyables.
      • Moved the old "game" to demo.js, and replaced it with a minimal game that won't cause issues when edited.
      • Fixed issues with version number
      • Fixed number formatting issue making things like "10e9" appear.

      v2.0.5 - 10/16/20

      • Made more features (including prestige parameters) able to be dynamic.
      • Layer nodes can be hidden but still take up space with "ghost" visibility
      • Added clickableEffect for real.
      • Fixed some visual issues with bars.
      • A few other minor tweaks and improvements.

      v2.0.4 - 10/16/20

      • Fixed HTML on buttons interfering with clicking on them.

      v2.0.3 - 10/16/20

      • Fixed hotkeys not displaying in info.
      • Fixed the game supressing all external hotkeys.
      • You can use more things as currencies for upgrade costs and challenge goals using currencyLocation.
      • Added maxTickLength, which can be used to prevent offline time or tab-switching from breaking time-limit based mechanics.
      • Made buyable respec buttons and clickable "master" buttons their own components, and gave them a hide/show feature.
      • Added a general "tooltip" feature for achievements.

      v2.0.2 - 10/15/20

      • Branches are now dynamic (they can be functions).
      • Fixed a crash related to offline time.
      • Fixed links being too wide.

      v2.0.1 - 10/15/20

      • Fixed side layers appearing multiple times.

      v2.0: The Pinnacle of Achievement Mountain - 10/15/20

      • Added progress bars, which are highly customizable and can be horizontal or vertical!
      • Added "side layers", displayed smaller and off to the side, and don't get reset by default. They can be used for global achievements and statistics. Speaking of which...
      • Added achievements!
      • Added clickables, a more generalized variant of buyables.
      • Almost every value in layer data can be either a function or a constant value!
      • Added support for multiple completions of challenges.
      • Added "none" prestige type, which removes the need for any other prestige-related features.
      • The points display and other gui elements stay at the top of the screen when the tree scrolls.
      • Added getter/setter functions for the amounts and effects of most Big Features
      • Moved modInfo to game.js, added a spot in modInfo for a Discord link, changelog link. Also added a separate mod version from the TMT version in VERSION.
      • Tree structure is based on layer data, no index.html editing is needed.
      • Tmp does not need to be manually updated.
      • You don't have to have the same amount of upgrades in every row (and challs and buyables)
      • "unlocked" is optional for all Big Components (defaults to true).
      • All displays will update correctly.
      • Changelog is no longer in index.html at all.
      • Generation of Points now happens in the main game loop
      • Changed the reset functions to make keeping things easier
      • Renamed many things to increase readability (see the list in the link below)
      • Improved documentation based on feedback

      v1.3.5:

      • Completely automated convertToDecimal, now you never have to worry about it again.
      • Branches can be defined without a color id. But they can also use hex values for color ids!
      • Created a tutorial for getting started with TMT and Github.
      • Page title is now automatically taken from mod name.

      v1.3.4 - 10/8/20

      • Added "midsection" feature to add things to a tab's layout while still keeping the standard layout.
      • Fix for being able to buy more buyables than you should.

      v1.3.3 - 10/7/20

      • Fix for the "order of operations" issue in temp.

      v1.3.1 - 10/7/20

      • Added custom CSS and tooltips for Layer Nodes.
      • Added custom CSS for upgrades, buyables, milestones, and challenges, both individually and layer-wide.
      • You can now use HTML in most display text!
      • You can now make milestones unlockable and not display immediately.
      • Fixed importing saves, and issue with upgrades not appearing, and probably more.
      • Optional "name" layer feature, used in confirmation messages.

      v1.3: Tabception... ception! - 10/7/20

      • Added subtabs! And also a Micro-tab component to let you make smaller subtab-esque areas anywhere.
      • Added a "custom" prestige formula type, and a number of features to support it.
      • Added points/sec display (can be disabled).
      • Added h-line, v-line and image-display components, plus components for individual upgrades, challenges, and milestones.
      • Added upgEffect, buyableEffect, and challEffect functions.
      • Added "hide completed challenges" setting.
      • Moved old changelogs to a separate place.
      • Fixed hasMilestone and incr_order.
      • Static layers now show the currency amount needed for the next one if you can buy max.

      v1.2.4 - 10/4/20

      • Layers are now highlighted if you can buy an upgrade, and a new feature, shouldNotify, lets you make it highlight other ways.
      • Fixed bugs with hasUpg, hasChall, hasMilestone, and inChallenge.
      • Changed the sample code to use the above functions for convenience.

      v1.2.3 - 10/3/20

      • Added a row component, which displays a list of objects in a row.
      • Added a column component, which displays a list of objects in a column (useful within a row).
      • Changed blanks to have a customizable width and height.

      v1.2: This Changes Everything! - 10/3/20

      • Many layer features can now be static values or functions. (This made some formats change, which will break old things)
      • You can now use the "this" keyword, to make code easier to transfer when making new layers.
      • Also added "this.layer", which is the current layer's name, and works on existing subfeatures (e.g. individual upgrades) as well! Subfeatures also have "this.id".
      • Fixed a big save issue. If you use a unique mod id, your save will never conflict with other mods.
      • Added a configurable offline time limit in modinfo at the top of index.html. (default 1 hour)
      • Added a few minor features, and updated the docs with new information.

      v1.1.1 - 9/30/20

      • You can define hotkeys directly from layer config.

      v1.1: Enhanced Edition - 9/30/20

      • Added "Buyables", which can function like Space Buildings or Enhancers.
      • Custom CSS can now be used on any component! Make the third argument an object with CSS parameters.
      • Lots of minor good things.

      v1.0 - 9/27/20

      • First release.
      ',115),n=[o];function r(s,d,h,u,c,m){return a(),i("div",null,n)}const f=e(t,[["render",r]]);export{b as __pageData,f as default}; +import{_ as e,c as i,o as a,a9 as l}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"The Modding Tree changelog:","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/changelog.md","filePath":"public/kronos/changelog.md","lastUpdated":1664930814000}'),t={name:"public/kronos/changelog.md"},o=l('

      The Modding Tree changelog:

      v2.5.9.2 - 5/19/21

      • Fixed many issues with things not updating.

      v2.5.9.1 - 5/18/21

      • Made text inputs never give NaNs.

      v2.5.9 - 5/18/21

      • Fixed issue when using text inputs for Numbers.
      • Added particle color feature.
      • Particle speed and dir are updated as it moves.
      • Added setSpeed and setDir for particles.
      • Added more trig functions.

      v2.5.8 - 5/17/21

      • Added makeShinies, which creates a stationary particle in a random spot.
      • Bars will visually update more quickly.
      • Fixed a major particle-related issue.
      • Fixed autoUpgrade.
      • Fixed a minor visual issue with tree nodes.

      v2.5.7 - 5/15/21

      • Added a particle system! Not only can it be used for visual effects, but particles can interact with the mouse. They could be used to create golden cookies or collectables, for example.
      • Added marked feature to buyables, clickables, and challenges. By default, stars multi-completion challenges when maxed.
      • Added 'deactivated' feature to layers, which disables many features.
      • Improved number formatting slightly.

      v2.5.6 - 5/14/21

      • You can now use non-numeric ids for upgrades, buyables, etc.
      • Fixed an exploit that let you buy an extra buyable.
      • Moved basic getter/setter functions to easyAccess.js.

      v2.5.5.2 - 5/12/21

      • Fixed a major issue with buyables.
      • Fixed a variety of tabFormat-related issues.
      • Fixed commas appearing in decimal places (thanks to pg132!)

      v2.5.5.1 - 5/12/21

      • Fixed clickables.

      v2.5.5 - 5/12/21

      • Added grids! They are a grid of buttons which behave the same, but have their own data. Good for inventory grids, map tiles, and more!
      • Added "marked" feature to add a mark to a node. Can be an image instead of a star. (Originally by Jacorb)
      • Added "layer-proxy" component that lets you use components from another layer.
      • Added the ability to display non-whole numbers in main-display.

      v2.5.4 - 5/10/21

      • Added a setting to always use single-tab mode.
      • Added directMult, which multiplies prestige gain after exponents and softcaps. It actually multiplies gain for static layers.
      • Added onEnter and onExit for challenges.
      • Improved displaying numbers between 0.0001 and 0.1.
      • Added documentation on how gainMult/Exp work for static layers.
      • Fixed a visual issue on mobile, thanks to thepaperpilot.
      • Improved documentation in general.

      v2.5.3 - 5/8/21

      • Improved performance of tab formats and bars.
      • Respec confirmation settings are now kept on resets.
      • Improved compatibility with older browsers.
      • Fixed missing pixel on vertical bars.

      v2.5.2.1 - 5/7/21

      • Fixed microtabs making layers highlight incorrectly.

      v2.5.2 - 5/7/21

      • Added glowColor for subtabs.
      • Improved the display for extremely small numbers.
      • Fixed issues in the buyable docs.

      v2.5.1 - 5/7/21

      • Fixed dynamic things in tabFormat not updating.

      v2.5: Dreams Really Do Come True - 5/7/21

      • Optimizations, hopefully a significant amount.
      • Added OOM/s point gen display at high values (thanks to Ducdat!)
      • Only one tab will display if the window is not wide enough (also thanks to Ducdat!)
      • Holding down a buyable's button now buys it continuously.
      • New milestone setting will also show the most recently unlocked milestone. (Also renamed all settings to be clearer)
      • Added an onHold feature for clickables.
      • Layer nodes will be highlighted even if the player is on the same tab.
      • Added customizable node glowColor.
      • Added buyable purchaseLimit.
      • Amount is automatically supplied to buyable cost and effect functions.
      • Locked (not yet visible) milestones no longer take up space. Also fixed hidden milestones taking a tiny bit of space.
      • Re-centered respec buttons.
      • Force-displayed tooltips are not hidden by resets.
      • Added formatting support for very small numbers. Disabled in most places by default because rounding errors might cause issues. Access it with formatSmall, or enable it globally by adding "allowSmall: true" to modInfo.

      v2.4.1 - 4/29/21

      • A number of minor fixes, many thanks to thepaperpilot.
      • The respec confirmation checkbox is now part of the respec-button component. (This also fixes the checkbox appearing when there is no respec button)
      • Added a few undocumented changes to the 2.4 changelog (the two at the bottom)

      v2.4: Rationalized Edition - 4/29/21

      • Completely reworked tooltips. Shift-click a node to force its tooltip to stay displayed. (And hopefully finally fixed flickering!)

      • Added text-input and slider components.

      • Added the ability to toggle respec confirmations.

      • Added custom respec confirmation messages.

      • The red layer highlight will not appear before a layer is unlocked.

      • Added unlocking hotkeys.

      • You no longer need to supply 'rows' and 'cols' for any Big Features.

      • Node symbols can use HTML.

      • Added documentation for the respec button.

      • Added prestigeNotify to subtabs, and prestigeNotify in subtabs also highlights the layer node.

      • The version number no longer contains special characters or irrational numbers.

      • Added ctrlDown and shiftDown variables.

      • Tooltips now use HTML (this means you need to replace any newlines with
        )

      v2.π.1 - 4/7/21

      • Fixed formatting for some larger numbers.
      • Upgrades will expand if there is too much text to display.
      • Fixed styling challenges.
      • No longer attempts to display a base currency when there is none.

      v2.π: Incrementally Updated - 2/5/21

      • Performance improvements.
      • Fixed tooltips overlapping with the top display.
      • Clicking a popup dismisses it immediately.
      • Added support for bulk challenge completions.
      • "Best" is updated automatically.
      • Fixed keeping Decimal values on reset.
      • Code reorganization and style improvements by fudo.

      v2.3.5 - 12/21/20

      • Added resetTime, which tracks the time since a layer prestiged or was reset.
      • A layer node will be highlighted red if one of its subtabs is highlighted red.
      • Fixed issues with keeping challenges, buyables, and clickables on reset.
      • Improved the unlocking of custom layers.
      • Other minor fixes.

      v2.3.4 - 12/16/20

      • Added a node image feature.
      • Resource display now always shows the amount of the currency the layer's gain is based on.
      • Added spacing between tree nodes.
      • Another attempt to fix tooltip flickering.

      v2.3.3 - 12/13/20

      • Fixed the first node in a row always taking up space.
      • layerShown is now optional.
      • All prestige types can now use features for custom prestige types.

      v2.3.2 - 12/13/20

      • Fixed achievement/milestone popups.

      v2.3.1 - 12/12/20

      • Another attempt to fix flickering tooltips.
      • The "this" keyword should work everywhere except tabFormat arrays (although I may have missed some things).
      • Fixed tree branches not updating when scrolling on the right-side tab.
      • Fixed a spacing issue when a node's symbol is ""
      • Removed some old, unneeded files.

      v2.3: Cooler and Newer Edition - 12/10/20

      • Added achievement/milestone popups (thank you to Jacorb for this contribution!)
      • The changelog tab is back, and can be set in mod.js.
      • Layer nodes and respec buttons will not be clicked by pressing "enter".
      • Possible fix for flickering tooltips and strange transitions.
      • The victory screen text is configurable.
      • Added image and textStyle features to achievements.
      • Added an argument to use specific rows in an "upgrades" component.
      • Fixed the comma appearing in the main display when there was no effectDescription
      • Added the ability to easily make a tab that is a collection of layers in subtabs.
      • Improved spacing for embedding layers with subtabs into subtabs.

      v2.2.8 - 12/03/20

      • Double-clicking a layer node brings you to the main subtab for that layer.
      • Attempted to fix challenges visually updating a different way.
      • Added a softcap function for use in formulas.
      • Added displayRow feature, which lets layers be shown somewhere separate from where they are in the reset order (e.g. side layers)
      • Fixed autoupgrade issue.

      v2.2.7 - 11/30/20

      • Added autoUpgrade feature.
      • resource-display now shows resource gain per second if passiveGain is active.
      • Fixed formatting issues on some large numbers.
      • Better support for using classed objects in player and in layers/tmp.
      • Made hard resetting more effective.
      • Removed Herobrine from getStartClickables.

      v2.2.6 - 11/30/20

      • Added goalDescription for challenges and made the new "canComplete" system the standard.
      • Another attempt to fix challenges not visually updating.
      • Fixed side layers not appearing.
      • Fixed getStartClickables again.

      v2.2.5 - 11/29/20

      • Added features for overriding the displays and costs/goals of upgrades and challenges to make them fully custom.
      • best, total, and unlocked are always automatically added to layerData (but best and total will only display if you add them yourself).
      • Fixed getStartClickables.

      v2.2.4 - 11/28/20

      • Added softcap and softcapPower features (for Normal layers)
      • Offline time limit and default max tick length were fixed (previously the limits were 1000x too large)
      • Added fixOldSaves.
      • You can use HTML in main-display.
      • Fixed a number of minor oddities.

      v2.2.3 - 11/28/20

      • Layers will be highlighted if you can finish a challenge.
      • The "can complete challenge" color now overrides the "already completed" color.
      • Button nodes now work as side "layers".
      • Setting a tooltip to "" hides it entirely.

      v2.2.2 - 11/22/20

      • Fixed right half of the screen being unclickable in some circumstances.
      • Fixed tree branches being offset.
      • Fix to lastSafeTab.

      v2.2.1 - 11/7/20

      • Added a small highlight to layers you can meaningfully prestige on.
      • Added passiveGeneration and autoPrestige features to standardize prestige automation. (The old ways still work, but the new ones work better with other things)
      • Improved milestones visually a bit.
      • "best" and "total" are now only displayed if present in startData.
      • Fixed issues with things not updating visually. (Thank you to to Jacorb!)
      • Side layers and button nodes can now be highlighted.
      • Updated docs on the new tree-related features.

      v2.2: Uprooted - 11/7/20

      • You can now embed a layer inside of a subtab or microtab!
      • Added support for hiding or reformatting the tree tab
      • Added non-layer button nodes
      • Added shouldNotify to subtab/microtab buttons. (You can make them highlighted)
      • Added commas to large exponents.
      • Upgrades now only show "currently" if they have an effectDisplay (so not for constant effects).
      • Achievements are part of the default tab format.
      • NaN is now handled more intelligently.
      • Renamed files, and moved less relevant ones to another folder.
      • The "hide completed challenges" setting now only hides challenges at max completions.
      • Thank you to thepaperpilot for fixing errors in docs and improving the infobox appearance!
      • Many other minor fixes.

      v2.1.4 - 10/25/20

      • Added an infobox component. Thank you to thepaperpilot for this contribution!
      • Layer type is now optional, and defaults to "none".
      • Improved the look of bars and tab buttons.
      • Improved spacing between layer nodes (also thanks to thepaperpilot!)
      • Fixed the "blank" component breaking if only specifying the height.
      • Fixed some numbers not displaying with enough digits.
      • Made a few more things able to be functions.
      • A few other minor fixes.

      v2.1.3.1 - 10/21/20

      • Fixed the update function.

      v2.1.3 - 10/21/20

      • gainMult and gainExp are now optional.
      • Layer unlocking is now kept on reset.
      • Game should start up faster.
      • Layer updates now have a determined order and starts with earlier-rowed layers.
      • Automation now has a determined order and starts with later-rowed layers.
      • Fixed issues with resetting clickables and challenges.
      • Commas should no longer appear in the decimal places of a number.
      • Fixed potential issue in displaying the tree.

      v2.1.2 - 10/19/20

      • Added buyUpgrade function (buyUpg still works though)
      • Added author name to modInfo.
      • Fix to crash caused when the name of a subtab or microtab is changed.
      • Fixes to outdated information in docs.
      • Improvements to Discord links.
      • Thank you to thepaperpilot for contributing to this update!

      v2.1.1 - 10/17/20

      • Added resource-display component, which displays the base currency for the prestige layer, as well as the best and/or total of this layer's prestige currency.
      • Fixed the value for the base currency not updating in resource-display.

      v2.1: We should have thought of this sooner! - 10/17/20

      • Moved most of the code users will want to edit to mod.js, added documentation for it.
        • Specifically, modInfo, VERSION, canGenPoints, getPointGen, and maxTickLength
      • Added getStartPoints()
      • Added the ability to store non-layer-related data
      • Added the ability to display more things at the top of the tree tab below points.
      • Made the endgame condition customizable
      • Added "sell one" and "sell all" buttons for buyables.
      • Moved the old "game" to demo.js, and replaced it with a minimal game that won't cause issues when edited.
      • Fixed issues with version number
      • Fixed number formatting issue making things like "10e9" appear.

      v2.0.5 - 10/16/20

      • Made more features (including prestige parameters) able to be dynamic.
      • Layer nodes can be hidden but still take up space with "ghost" visibility
      • Added clickableEffect for real.
      • Fixed some visual issues with bars.
      • A few other minor tweaks and improvements.

      v2.0.4 - 10/16/20

      • Fixed HTML on buttons interfering with clicking on them.

      v2.0.3 - 10/16/20

      • Fixed hotkeys not displaying in info.
      • Fixed the game supressing all external hotkeys.
      • You can use more things as currencies for upgrade costs and challenge goals using currencyLocation.
      • Added maxTickLength, which can be used to prevent offline time or tab-switching from breaking time-limit based mechanics.
      • Made buyable respec buttons and clickable "master" buttons their own components, and gave them a hide/show feature.
      • Added a general "tooltip" feature for achievements.

      v2.0.2 - 10/15/20

      • Branches are now dynamic (they can be functions).
      • Fixed a crash related to offline time.
      • Fixed links being too wide.

      v2.0.1 - 10/15/20

      • Fixed side layers appearing multiple times.

      v2.0: The Pinnacle of Achievement Mountain - 10/15/20

      • Added progress bars, which are highly customizable and can be horizontal or vertical!
      • Added "side layers", displayed smaller and off to the side, and don't get reset by default. They can be used for global achievements and statistics. Speaking of which...
      • Added achievements!
      • Added clickables, a more generalized variant of buyables.
      • Almost every value in layer data can be either a function or a constant value!
      • Added support for multiple completions of challenges.
      • Added "none" prestige type, which removes the need for any other prestige-related features.
      • The points display and other gui elements stay at the top of the screen when the tree scrolls.
      • Added getter/setter functions for the amounts and effects of most Big Features
      • Moved modInfo to game.js, added a spot in modInfo for a Discord link, changelog link. Also added a separate mod version from the TMT version in VERSION.
      • Tree structure is based on layer data, no index.html editing is needed.
      • Tmp does not need to be manually updated.
      • You don't have to have the same amount of upgrades in every row (and challs and buyables)
      • "unlocked" is optional for all Big Components (defaults to true).
      • All displays will update correctly.
      • Changelog is no longer in index.html at all.
      • Generation of Points now happens in the main game loop
      • Changed the reset functions to make keeping things easier
      • Renamed many things to increase readability (see the list in the link below)
      • Improved documentation based on feedback

      v1.3.5:

      • Completely automated convertToDecimal, now you never have to worry about it again.
      • Branches can be defined without a color id. But they can also use hex values for color ids!
      • Created a tutorial for getting started with TMT and Github.
      • Page title is now automatically taken from mod name.

      v1.3.4 - 10/8/20

      • Added "midsection" feature to add things to a tab's layout while still keeping the standard layout.
      • Fix for being able to buy more buyables than you should.

      v1.3.3 - 10/7/20

      • Fix for the "order of operations" issue in temp.

      v1.3.1 - 10/7/20

      • Added custom CSS and tooltips for Layer Nodes.
      • Added custom CSS for upgrades, buyables, milestones, and challenges, both individually and layer-wide.
      • You can now use HTML in most display text!
      • You can now make milestones unlockable and not display immediately.
      • Fixed importing saves, and issue with upgrades not appearing, and probably more.
      • Optional "name" layer feature, used in confirmation messages.

      v1.3: Tabception... ception! - 10/7/20

      • Added subtabs! And also a Micro-tab component to let you make smaller subtab-esque areas anywhere.
      • Added a "custom" prestige formula type, and a number of features to support it.
      • Added points/sec display (can be disabled).
      • Added h-line, v-line and image-display components, plus components for individual upgrades, challenges, and milestones.
      • Added upgEffect, buyableEffect, and challEffect functions.
      • Added "hide completed challenges" setting.
      • Moved old changelogs to a separate place.
      • Fixed hasMilestone and incr_order.
      • Static layers now show the currency amount needed for the next one if you can buy max.

      v1.2.4 - 10/4/20

      • Layers are now highlighted if you can buy an upgrade, and a new feature, shouldNotify, lets you make it highlight other ways.
      • Fixed bugs with hasUpg, hasChall, hasMilestone, and inChallenge.
      • Changed the sample code to use the above functions for convenience.

      v1.2.3 - 10/3/20

      • Added a row component, which displays a list of objects in a row.
      • Added a column component, which displays a list of objects in a column (useful within a row).
      • Changed blanks to have a customizable width and height.

      v1.2: This Changes Everything! - 10/3/20

      • Many layer features can now be static values or functions. (This made some formats change, which will break old things)
      • You can now use the "this" keyword, to make code easier to transfer when making new layers.
      • Also added "this.layer", which is the current layer's name, and works on existing subfeatures (e.g. individual upgrades) as well! Subfeatures also have "this.id".
      • Fixed a big save issue. If you use a unique mod id, your save will never conflict with other mods.
      • Added a configurable offline time limit in modinfo at the top of index.html. (default 1 hour)
      • Added a few minor features, and updated the docs with new information.

      v1.1.1 - 9/30/20

      • You can define hotkeys directly from layer config.

      v1.1: Enhanced Edition - 9/30/20

      • Added "Buyables", which can function like Space Buildings or Enhancers.
      • Custom CSS can now be used on any component! Make the third argument an object with CSS parameters.
      • Lots of minor good things.

      v1.0 - 9/27/20

      • First release.
      ',115),n=[o];function r(s,d,h,u,c,m){return a(),i("div",null,n)}const f=e(t,[["render",r]]);export{b as __pageData,f as default}; diff --git a/assets/public_kronos_changelog.md.paCgtsXh.lean.js b/assets/public_kronos_changelog.md.CKFBbvc8.lean.js similarity index 86% rename from assets/public_kronos_changelog.md.paCgtsXh.lean.js rename to assets/public_kronos_changelog.md.CKFBbvc8.lean.js index 5db339d6..656869fa 100644 --- a/assets/public_kronos_changelog.md.paCgtsXh.lean.js +++ b/assets/public_kronos_changelog.md.CKFBbvc8.lean.js @@ -1 +1 @@ -import{_ as e,c as i,o as a,a9 as l}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"The Modding Tree changelog:","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/changelog.md","filePath":"public/kronos/changelog.md","lastUpdated":1701136977000}'),t={name:"public/kronos/changelog.md"},o=l("",115),n=[o];function r(s,d,h,u,c,m){return a(),i("div",null,n)}const f=e(t,[["render",r]]);export{b as __pageData,f as default}; +import{_ as e,c as i,o as a,a9 as l}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"The Modding Tree changelog:","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/changelog.md","filePath":"public/kronos/changelog.md","lastUpdated":1664930814000}'),t={name:"public/kronos/changelog.md"},o=l("",115),n=[o];function r(s,d,h,u,c,m){return a(),i("div",null,n)}const f=e(t,[["render",r]]);export{b as __pageData,f as default}; diff --git a/assets/public_kronos_docs_!general-info.md.DvOjN6Rt.js b/assets/public_kronos_docs_!general-info.md.BpKUMbLF.js similarity index 99% rename from assets/public_kronos_docs_!general-info.md.DvOjN6Rt.js rename to assets/public_kronos_docs_!general-info.md.BpKUMbLF.js index b96ad718..36ec0e5b 100644 --- a/assets/public_kronos_docs_!general-info.md.DvOjN6Rt.js +++ b/assets/public_kronos_docs_!general-info.md.BpKUMbLF.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"The-Modding-Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/!general-info.md","filePath":"public/kronos/docs/!general-info.md","lastUpdated":1701136977000}'),n={name:"public/kronos/docs/!general-info.md"},r=o('

      The-Modding-Tree

      Making a game in The Modding Tree mostly involves defining parameters or functions on objects. If you aren't following the getting started guide, you should start by setting up your basic mod info in mod.js. It's important to set a mod id to ensure saving works properly.

      Beyond that, the main way to add content is through creating layers, often in layers.js. You can add new layers by calling addLayer(layername, layerdata). There is an example of a basic layer in layers.js showing the recommended method. It is just an example and can be freely deleted. You can also use it as a reference or a base for your own layers.

      Most of the time, you won't need to dive deep into the code to create things, but you still can if you really want to, for example to add new Vue components in components.js.

      The Modding Tree uses break_eternity.js to store large values. This means that many numbers are Decimal objects, and must be treated differently. For example, you have to use new Decimal(x) to create a Decimal value instead of a plain number, and perform operations on them by calling functions. e.g, instead of x = x + y, use x = x.add(y). Keep in mind this also applies to comparison operators, which should be replaced with calling the .gt, .gte, .lt, .lte, .eq, and .neq functions. See the break_eternity.js docs for more details on working with Decimal values.

      Almost all values can be either a constant value, or a dynamic value. Dynamic values are defined by putting a function that returns what the value should be at any given time.

      All display text can use basic HTML elements (But you can't use most Vue features there).

      While reading this documentation, the following key will be used when describing features:

      • No label: This is required and the game may crash if it isn't included.
      • sometimes required: This is may be required, depending on other things in the layer.
      • optional: You can leave this out if you don't intend to use that feature for the layer.
      • assigned automagically: This value will be set automatically and override any value you set.
      • deprecated: This feature is not recommended to be used, because newer features are able to achieve the same thing in a better, easier way.

      Table of Contents

      General

      • Getting Started: Getting your own copy of the code set up with Github Desktop.
      • Main mod info: How to set up general things for your mod in mod.js.
      • Basic layer breakdown: Breaking down the components of a layer with minimal features.
      • Layer features: Explanations of all of the different properties that you can give a layer.
      • Custom Tab Layouts: An optional way to give your tabs a different layout. You can even create entirely new components to use.
      • Custom game layouts: You can get rid of the tree tab, add buttons and other things to the tree, or even customize the tab's layout like a layer tab.
      • Updating TMT: Using Github Desktop to update your mod's version of TMT.

      Common components

      • Upgrades: How to create upgrades for a layer.
      • Milestones: How to create milestones for a layer.
      • Buyables: Create rebuyable upgrades for your layer (with the option to make them respec-able). Can be used to make Enhancers or Space Buildings, for example.
      • Clickables: A more generalized variant of buyables, for any kind of thing that is sometimes clickable. Between these and Buyables, you can do just about anything.
      • Achievements: How to create achievements for a layer (or for the whole game).

      Other components and features

      • Challenges: How to create challenges for a layer.
      • Bars: Display some information as a progress bar, gauge, or similar. They are highly customizable, and can be horizontal and vertical as well.
      • Subtabs and Microtabs: Create subtabs for your tabs, as well as "microtab" components that you can put inside the tabs. You can even use them to embed a layer inside another layer!
      • [Grids][grids.md]: Create a group buttons that behave the same, but have their own data. Good for map tiles, an inventory grid, and more!
      • Infoboxes: Boxes containing text that can be shown or hidden.
      • Trees: Make your own trees. You can make non-layer button nodes too!
      • Particle system: Can be used to create particles for visual effects, but also interactable things like golden cookies or collectables.
      ',16),i=[r];function s(l,d,c,h,u,m){return t(),a("div",null,i)}const y=e(n,[["render",s]]);export{b as __pageData,y as default}; +import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"The-Modding-Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/!general-info.md","filePath":"public/kronos/docs/!general-info.md","lastUpdated":1621368363000}'),n={name:"public/kronos/docs/!general-info.md"},r=o('

      The-Modding-Tree

      Making a game in The Modding Tree mostly involves defining parameters or functions on objects. If you aren't following the getting started guide, you should start by setting up your basic mod info in mod.js. It's important to set a mod id to ensure saving works properly.

      Beyond that, the main way to add content is through creating layers, often in layers.js. You can add new layers by calling addLayer(layername, layerdata). There is an example of a basic layer in layers.js showing the recommended method. It is just an example and can be freely deleted. You can also use it as a reference or a base for your own layers.

      Most of the time, you won't need to dive deep into the code to create things, but you still can if you really want to, for example to add new Vue components in components.js.

      The Modding Tree uses break_eternity.js to store large values. This means that many numbers are Decimal objects, and must be treated differently. For example, you have to use new Decimal(x) to create a Decimal value instead of a plain number, and perform operations on them by calling functions. e.g, instead of x = x + y, use x = x.add(y). Keep in mind this also applies to comparison operators, which should be replaced with calling the .gt, .gte, .lt, .lte, .eq, and .neq functions. See the break_eternity.js docs for more details on working with Decimal values.

      Almost all values can be either a constant value, or a dynamic value. Dynamic values are defined by putting a function that returns what the value should be at any given time.

      All display text can use basic HTML elements (But you can't use most Vue features there).

      While reading this documentation, the following key will be used when describing features:

      • No label: This is required and the game may crash if it isn't included.
      • sometimes required: This is may be required, depending on other things in the layer.
      • optional: You can leave this out if you don't intend to use that feature for the layer.
      • assigned automagically: This value will be set automatically and override any value you set.
      • deprecated: This feature is not recommended to be used, because newer features are able to achieve the same thing in a better, easier way.

      Table of Contents

      General

      • Getting Started: Getting your own copy of the code set up with Github Desktop.
      • Main mod info: How to set up general things for your mod in mod.js.
      • Basic layer breakdown: Breaking down the components of a layer with minimal features.
      • Layer features: Explanations of all of the different properties that you can give a layer.
      • Custom Tab Layouts: An optional way to give your tabs a different layout. You can even create entirely new components to use.
      • Custom game layouts: You can get rid of the tree tab, add buttons and other things to the tree, or even customize the tab's layout like a layer tab.
      • Updating TMT: Using Github Desktop to update your mod's version of TMT.

      Common components

      • Upgrades: How to create upgrades for a layer.
      • Milestones: How to create milestones for a layer.
      • Buyables: Create rebuyable upgrades for your layer (with the option to make them respec-able). Can be used to make Enhancers or Space Buildings, for example.
      • Clickables: A more generalized variant of buyables, for any kind of thing that is sometimes clickable. Between these and Buyables, you can do just about anything.
      • Achievements: How to create achievements for a layer (or for the whole game).

      Other components and features

      • Challenges: How to create challenges for a layer.
      • Bars: Display some information as a progress bar, gauge, or similar. They are highly customizable, and can be horizontal and vertical as well.
      • Subtabs and Microtabs: Create subtabs for your tabs, as well as "microtab" components that you can put inside the tabs. You can even use them to embed a layer inside another layer!
      • [Grids][grids.md]: Create a group buttons that behave the same, but have their own data. Good for map tiles, an inventory grid, and more!
      • Infoboxes: Boxes containing text that can be shown or hidden.
      • Trees: Make your own trees. You can make non-layer button nodes too!
      • Particle system: Can be used to create particles for visual effects, but also interactable things like golden cookies or collectables.
      ',16),i=[r];function s(l,d,c,h,u,m){return t(),a("div",null,i)}const y=e(n,[["render",s]]);export{b as __pageData,y as default}; diff --git a/assets/public_kronos_docs_!general-info.md.DvOjN6Rt.lean.js b/assets/public_kronos_docs_!general-info.md.BpKUMbLF.lean.js similarity index 86% rename from assets/public_kronos_docs_!general-info.md.DvOjN6Rt.lean.js rename to assets/public_kronos_docs_!general-info.md.BpKUMbLF.lean.js index cb98832e..c596bb36 100644 --- a/assets/public_kronos_docs_!general-info.md.DvOjN6Rt.lean.js +++ b/assets/public_kronos_docs_!general-info.md.BpKUMbLF.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"The-Modding-Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/!general-info.md","filePath":"public/kronos/docs/!general-info.md","lastUpdated":1701136977000}'),n={name:"public/kronos/docs/!general-info.md"},r=o("",16),i=[r];function s(l,d,c,h,u,m){return t(),a("div",null,i)}const y=e(n,[["render",s]]);export{b as __pageData,y as default}; +import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"The-Modding-Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/!general-info.md","filePath":"public/kronos/docs/!general-info.md","lastUpdated":1621368363000}'),n={name:"public/kronos/docs/!general-info.md"},r=o("",16),i=[r];function s(l,d,c,h,u,m){return t(),a("div",null,i)}const y=e(n,[["render",s]]);export{b as __pageData,y as default}; diff --git a/assets/public_kronos_docs_achievements.md.B2ZLvQuE.js b/assets/public_kronos_docs_achievements.md.CV5RQN-f.js similarity index 98% rename from assets/public_kronos_docs_achievements.md.B2ZLvQuE.js rename to assets/public_kronos_docs_achievements.md.CV5RQN-f.js index 9d2e854a..fdd6e31a 100644 --- a/assets/public_kronos_docs_achievements.md.B2ZLvQuE.js +++ b/assets/public_kronos_docs_achievements.md.CV5RQN-f.js @@ -1,4 +1,4 @@ -import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Achievements","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/achievements.md","filePath":"public/kronos/docs/achievements.md","lastUpdated":1701136977000}'),s={name:"public/kronos/docs/achievements.md"},n=i(`

      Achievements

      Achievements are awarded to the player when they meet a certain goal, and optionally give some benefit.

      You can make global achievements by putting them in a side layer by making its row equal to "side" instead of a number.

      Useful functions for dealing with achievements and implementing their effects:

      • hasAchievement(layer, id): determine if the player has the Achievement.
      • achievementEffect(layer, id): Returns the current effects of the achievement, if any.

      Achievements should be formatted like this:

      js
      achievements: {
      +import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Achievements","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/achievements.md","filePath":"public/kronos/docs/achievements.md","lastUpdated":1620884680000}'),s={name:"public/kronos/docs/achievements.md"},n=i(`

      Achievements

      Achievements are awarded to the player when they meet a certain goal, and optionally give some benefit.

      You can make global achievements by putting them in a side layer by making its row equal to "side" instead of a number.

      Useful functions for dealing with achievements and implementing their effects:

      • hasAchievement(layer, id): determine if the player has the Achievement.
      • achievementEffect(layer, id): Returns the current effects of the achievement, if any.

      Achievements should be formatted like this:

      js
      achievements: {
           11: {
               name: "Blah",
               more features
      diff --git a/assets/public_kronos_docs_achievements.md.B2ZLvQuE.lean.js b/assets/public_kronos_docs_achievements.md.CV5RQN-f.lean.js
      similarity index 86%
      rename from assets/public_kronos_docs_achievements.md.B2ZLvQuE.lean.js
      rename to assets/public_kronos_docs_achievements.md.CV5RQN-f.lean.js
      index fb778ebe..6a58dda6 100644
      --- a/assets/public_kronos_docs_achievements.md.B2ZLvQuE.lean.js
      +++ b/assets/public_kronos_docs_achievements.md.CV5RQN-f.lean.js
      @@ -1 +1 @@
      -import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Achievements","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/achievements.md","filePath":"public/kronos/docs/achievements.md","lastUpdated":1701136977000}'),s={name:"public/kronos/docs/achievements.md"},n=i("",11),o=[n];function l(h,r,p,c,d,u){return a(),t("div",null,o)}const v=e(s,[["render",l]]);export{g as __pageData,v as default};
      +import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Achievements","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/achievements.md","filePath":"public/kronos/docs/achievements.md","lastUpdated":1620884680000}'),s={name:"public/kronos/docs/achievements.md"},n=i("",11),o=[n];function l(h,r,p,c,d,u){return a(),t("div",null,o)}const v=e(s,[["render",l]]);export{g as __pageData,v as default};
      diff --git a/assets/public_kronos_docs_bars.md.JgNsk6mY.js b/assets/public_kronos_docs_bars.md.DYrBr3p3.js
      similarity index 97%
      rename from assets/public_kronos_docs_bars.md.JgNsk6mY.js
      rename to assets/public_kronos_docs_bars.md.DYrBr3p3.js
      index fa7f297a..5bbbadbb 100644
      --- a/assets/public_kronos_docs_bars.md.JgNsk6mY.js
      +++ b/assets/public_kronos_docs_bars.md.DYrBr3p3.js
      @@ -1,4 +1,4 @@
      -import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Bars","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/bars.md","filePath":"public/kronos/docs/bars.md","lastUpdated":1701136977000}'),e={name:"public/kronos/docs/bars.md"},n=t(`

      Bars

      Bars let you display information in a more direct way. It can be a progress bar, health bar, capacity gauge, or anything else.

      Bars are defined like other Big Features:

      js
      bars: {
      +import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Bars","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/bars.md","filePath":"public/kronos/docs/bars.md","lastUpdated":1604787966000}'),e={name:"public/kronos/docs/bars.md"},n=t(`

      Bars

      Bars let you display information in a more direct way. It can be a progress bar, health bar, capacity gauge, or anything else.

      Bars are defined like other Big Features:

      js
      bars: {
           bigBar: {
               direction: RIGHT,
               width: 200,
      diff --git a/assets/public_kronos_docs_bars.md.JgNsk6mY.lean.js b/assets/public_kronos_docs_bars.md.DYrBr3p3.lean.js
      similarity index 71%
      rename from assets/public_kronos_docs_bars.md.JgNsk6mY.lean.js
      rename to assets/public_kronos_docs_bars.md.DYrBr3p3.lean.js
      index 3e39bff9..e1bf6855 100644
      --- a/assets/public_kronos_docs_bars.md.JgNsk6mY.lean.js
      +++ b/assets/public_kronos_docs_bars.md.DYrBr3p3.lean.js
      @@ -1 +1 @@
      -import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Bars","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/bars.md","filePath":"public/kronos/docs/bars.md","lastUpdated":1701136977000}'),e={name:"public/kronos/docs/bars.md"},n=t("",6),l=[n];function r(p,o,h,d,k,c){return a(),i("div",null,l)}const E=s(e,[["render",r]]);export{u as __pageData,E as default};
      +import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Bars","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/bars.md","filePath":"public/kronos/docs/bars.md","lastUpdated":1604787966000}'),e={name:"public/kronos/docs/bars.md"},n=t("",6),l=[n];function r(p,o,h,d,k,c){return a(),i("div",null,l)}const E=s(e,[["render",r]]);export{u as __pageData,E as default};
      diff --git a/assets/public_kronos_docs_basic-layer-breakdown.md.MMKYyoj1.js b/assets/public_kronos_docs_basic-layer-breakdown.md.CKcXGVzo.js
      similarity index 99%
      rename from assets/public_kronos_docs_basic-layer-breakdown.md.MMKYyoj1.js
      rename to assets/public_kronos_docs_basic-layer-breakdown.md.CKcXGVzo.js
      index 1677fd11..23ffbd35 100644
      --- a/assets/public_kronos_docs_basic-layer-breakdown.md.MMKYyoj1.js
      +++ b/assets/public_kronos_docs_basic-layer-breakdown.md.CKcXGVzo.js
      @@ -1,4 +1,4 @@
      -import{_ as s,c as i,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Basic layer breakdown","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/basic-layer-breakdown.md","filePath":"public/kronos/docs/basic-layer-breakdown.md","lastUpdated":1701136977000}'),e={name:"public/kronos/docs/basic-layer-breakdown.md"},t=n(`

      Basic layer breakdown

      This is a very minimal layer with minimal features. Most things will require additional features.

      js
      addLayer("p", {
      +import{_ as s,c as i,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Basic layer breakdown","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/basic-layer-breakdown.md","filePath":"public/kronos/docs/basic-layer-breakdown.md","lastUpdated":1620696264000}'),e={name:"public/kronos/docs/basic-layer-breakdown.md"},t=n(`

      Basic layer breakdown

      This is a very minimal layer with minimal features. Most things will require additional features.

      js
      addLayer("p", {
           startData() { return {                  // startData is a function that returns default data for a layer. 
               unlocked: true,                     // You can add more variables here to add them to your layer.
               points: new Decimal(0),             // "points" is the internal name for the main resource of the layer.
      diff --git a/assets/public_kronos_docs_basic-layer-breakdown.md.MMKYyoj1.lean.js b/assets/public_kronos_docs_basic-layer-breakdown.md.CKcXGVzo.lean.js
      similarity index 87%
      rename from assets/public_kronos_docs_basic-layer-breakdown.md.MMKYyoj1.lean.js
      rename to assets/public_kronos_docs_basic-layer-breakdown.md.CKcXGVzo.lean.js
      index 3ae41905..4e4d0a86 100644
      --- a/assets/public_kronos_docs_basic-layer-breakdown.md.MMKYyoj1.lean.js
      +++ b/assets/public_kronos_docs_basic-layer-breakdown.md.CKcXGVzo.lean.js
      @@ -1 +1 @@
      -import{_ as s,c as i,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Basic layer breakdown","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/basic-layer-breakdown.md","filePath":"public/kronos/docs/basic-layer-breakdown.md","lastUpdated":1701136977000}'),e={name:"public/kronos/docs/basic-layer-breakdown.md"},t=n("",3),h=[t];function l(p,k,r,E,d,o){return a(),i("div",null,h)}const c=s(e,[["render",l]]);export{g as __pageData,c as default};
      +import{_ as s,c as i,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Basic layer breakdown","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/basic-layer-breakdown.md","filePath":"public/kronos/docs/basic-layer-breakdown.md","lastUpdated":1620696264000}'),e={name:"public/kronos/docs/basic-layer-breakdown.md"},t=n("",3),h=[t];function l(p,k,r,E,d,o){return a(),i("div",null,h)}const c=s(e,[["render",l]]);export{g as __pageData,c as default};
      diff --git a/assets/public_kronos_docs_buyables.md.DApk6nw5.js b/assets/public_kronos_docs_buyables.md.Clz5ovuw.js
      similarity index 99%
      rename from assets/public_kronos_docs_buyables.md.DApk6nw5.js
      rename to assets/public_kronos_docs_buyables.md.Clz5ovuw.js
      index d4ab443e..fa6cfa55 100644
      --- a/assets/public_kronos_docs_buyables.md.DApk6nw5.js
      +++ b/assets/public_kronos_docs_buyables.md.Clz5ovuw.js
      @@ -1,4 +1,4 @@
      -import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const c=JSON.parse('{"title":"Buyables","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/buyables.md","filePath":"public/kronos/docs/buyables.md","lastUpdated":1701136977000}'),e={name:"public/kronos/docs/buyables.md"},n=t(`

      Buyables

      Buyables are usually things that can be bought multiple times with scaling costs. They come with optional buttons that can be used for respeccing or selling buyables, among other things.

      The amount of a buyable owned is a Decimal.

      Useful functions for dealing with buyables and implementing their effects:

      • getBuyableAmount(layer, id): get the amount of the buyable the player has
      • setBuyableAmount(layer, id, amount): set the amount of the buyable the player has
      • buyableEffect(layer, id): Returns the current effects of the buyable, if any.

      Buyables should be formatted like this:

      js
      buyables: {
      +import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const c=JSON.parse('{"title":"Buyables","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/buyables.md","filePath":"public/kronos/docs/buyables.md","lastUpdated":1621020740000}'),e={name:"public/kronos/docs/buyables.md"},n=t(`

      Buyables

      Buyables are usually things that can be bought multiple times with scaling costs. They come with optional buttons that can be used for respeccing or selling buyables, among other things.

      The amount of a buyable owned is a Decimal.

      Useful functions for dealing with buyables and implementing their effects:

      • getBuyableAmount(layer, id): get the amount of the buyable the player has
      • setBuyableAmount(layer, id, amount): set the amount of the buyable the player has
      • buyableEffect(layer, id): Returns the current effects of the buyable, if any.

      Buyables should be formatted like this:

      js
      buyables: {
           11: {
               cost(x) { return new Decimal(1).mul(x) },
               display() { return "Blah" },
      diff --git a/assets/public_kronos_docs_buyables.md.DApk6nw5.lean.js b/assets/public_kronos_docs_buyables.md.Clz5ovuw.lean.js
      similarity index 86%
      rename from assets/public_kronos_docs_buyables.md.DApk6nw5.lean.js
      rename to assets/public_kronos_docs_buyables.md.Clz5ovuw.lean.js
      index 07fa6dd2..2e19e3c4 100644
      --- a/assets/public_kronos_docs_buyables.md.DApk6nw5.lean.js
      +++ b/assets/public_kronos_docs_buyables.md.Clz5ovuw.lean.js
      @@ -1 +1 @@
      -import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const c=JSON.parse('{"title":"Buyables","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/buyables.md","filePath":"public/kronos/docs/buyables.md","lastUpdated":1701136977000}'),e={name:"public/kronos/docs/buyables.md"},n=t("",14),l=[n];function h(p,o,r,k,u,d){return a(),i("div",null,l)}const g=s(e,[["render",h]]);export{c as __pageData,g as default};
      +import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const c=JSON.parse('{"title":"Buyables","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/buyables.md","filePath":"public/kronos/docs/buyables.md","lastUpdated":1621020740000}'),e={name:"public/kronos/docs/buyables.md"},n=t("",14),l=[n];function h(p,o,r,k,u,d){return a(),i("div",null,l)}const g=s(e,[["render",h]]);export{c as __pageData,g as default};
      diff --git a/assets/public_kronos_docs_challenges.md.Cn9Xc7xE.js b/assets/public_kronos_docs_challenges.md.xjts-SLB.js
      similarity index 99%
      rename from assets/public_kronos_docs_challenges.md.Cn9Xc7xE.js
      rename to assets/public_kronos_docs_challenges.md.xjts-SLB.js
      index 9f6325e9..d6e05041 100644
      --- a/assets/public_kronos_docs_challenges.md.Cn9Xc7xE.js
      +++ b/assets/public_kronos_docs_challenges.md.xjts-SLB.js
      @@ -1,4 +1,4 @@
      -import{_ as e,c as t,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Challenges","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/challenges.md","filePath":"public/kronos/docs/challenges.md","lastUpdated":1701136977000}'),s={name:"public/kronos/docs/challenges.md"},n=a(`

      Challenges

      Challenges can have fully customizable win conditions. Useful functions for dealing with Challenges and implementing their effects:

      • inChallenge(layer, id): determine if the player is in a given challenge (or another challenge on the same layer that counts as this one).
      • hasChallenge(layer, id): determine if the player has completed the challenge.
      • challengeCompletions(layer, id): determine how many times the player completed the challenge.
      • maxedChallenge(layer, id): determines if the player has reached the maximum completions.
      • challengeEffect(layer, id): Returns the current effects of the challenge, if any.

      Challenges are stored in the following format:

      js
      challenges: {
      +import{_ as e,c as t,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Challenges","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/challenges.md","filePath":"public/kronos/docs/challenges.md","lastUpdated":1621020740000}'),s={name:"public/kronos/docs/challenges.md"},n=a(`

      Challenges

      Challenges can have fully customizable win conditions. Useful functions for dealing with Challenges and implementing their effects:

      • inChallenge(layer, id): determine if the player is in a given challenge (or another challenge on the same layer that counts as this one).
      • hasChallenge(layer, id): determine if the player has completed the challenge.
      • challengeCompletions(layer, id): determine how many times the player completed the challenge.
      • maxedChallenge(layer, id): determines if the player has reached the maximum completions.
      • challengeEffect(layer, id): Returns the current effects of the challenge, if any.

      Challenges are stored in the following format:

      js
      challenges: {
           11: {
               name: "Ouch",
               challengeDescription: "description of ouchie",
      diff --git a/assets/public_kronos_docs_challenges.md.Cn9Xc7xE.lean.js b/assets/public_kronos_docs_challenges.md.xjts-SLB.lean.js
      similarity index 86%
      rename from assets/public_kronos_docs_challenges.md.Cn9Xc7xE.lean.js
      rename to assets/public_kronos_docs_challenges.md.xjts-SLB.lean.js
      index 183f291f..6f52185c 100644
      --- a/assets/public_kronos_docs_challenges.md.Cn9Xc7xE.lean.js
      +++ b/assets/public_kronos_docs_challenges.md.xjts-SLB.lean.js
      @@ -1 +1 @@
      -import{_ as e,c as t,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Challenges","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/challenges.md","filePath":"public/kronos/docs/challenges.md","lastUpdated":1701136977000}'),s={name:"public/kronos/docs/challenges.md"},n=a("",10),l=[n];function o(h,r,p,c,g,d){return i(),t("div",null,l)}const y=e(s,[["render",o]]);export{f as __pageData,y as default};
      +import{_ as e,c as t,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Challenges","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/challenges.md","filePath":"public/kronos/docs/challenges.md","lastUpdated":1621020740000}'),s={name:"public/kronos/docs/challenges.md"},n=a("",10),l=[n];function o(h,r,p,c,g,d){return i(),t("div",null,l)}const y=e(s,[["render",o]]);export{f as __pageData,y as default};
      diff --git a/assets/public_kronos_docs_clickables.md.BzXBLTUl.js b/assets/public_kronos_docs_clickables.md.CwRD8HLA.js
      similarity index 98%
      rename from assets/public_kronos_docs_clickables.md.BzXBLTUl.js
      rename to assets/public_kronos_docs_clickables.md.CwRD8HLA.js
      index 2528835e..154f65be 100644
      --- a/assets/public_kronos_docs_clickables.md.BzXBLTUl.js
      +++ b/assets/public_kronos_docs_clickables.md.CwRD8HLA.js
      @@ -1,4 +1,4 @@
      -import{_ as e,c as t,o as a,a9 as s}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"Clickables","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/clickables.md","filePath":"public/kronos/docs/clickables.md","lastUpdated":1701136977000}'),i={name:"public/kronos/docs/clickables.md"},l=s(`

      Clickables

      Clickables are any kind of thing that you can click for an effect. They're a more generalized version of Buyables.

      DO NOT USE THESE TO MAKE THINGS THAT YOU CLICK REPEATEDLY FOR A BONUS BECAUSE THOSE ARE AWFUL.

      There are several differences between the two. One is that a buyable's saved data is its amount as a Decimal, while Clickables store a "state" which can be a number or string, but not Decimal, array, or object). Buyables have a number of extra features which you can see on their page. Clickables also have a smaller default size.

      Useful functions for dealing with clickables and implementing their effects:

      • getClickableState(layer, id): get the state of the clickable the player has
      • setClickableState(layer, id, state): set the state of the clickable the player has
      • clickableEffect(layer, id): Returns the current effects of the clickable, if any.

      Clickables should be formatted like this:

      js
      clickables: {
      +import{_ as e,c as t,o as a,a9 as s}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"Clickables","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/clickables.md","filePath":"public/kronos/docs/clickables.md","lastUpdated":1621020740000}'),i={name:"public/kronos/docs/clickables.md"},l=s(`

      Clickables

      Clickables are any kind of thing that you can click for an effect. They're a more generalized version of Buyables.

      DO NOT USE THESE TO MAKE THINGS THAT YOU CLICK REPEATEDLY FOR A BONUS BECAUSE THOSE ARE AWFUL.

      There are several differences between the two. One is that a buyable's saved data is its amount as a Decimal, while Clickables store a "state" which can be a number or string, but not Decimal, array, or object). Buyables have a number of extra features which you can see on their page. Clickables also have a smaller default size.

      Useful functions for dealing with clickables and implementing their effects:

      • getClickableState(layer, id): get the state of the clickable the player has
      • setClickableState(layer, id, state): set the state of the clickable the player has
      • clickableEffect(layer, id): Returns the current effects of the clickable, if any.

      Clickables should be formatted like this:

      js
      clickables: {
           11: {
               display() {return "Blah"},
               etc
      diff --git a/assets/public_kronos_docs_clickables.md.BzXBLTUl.lean.js b/assets/public_kronos_docs_clickables.md.CwRD8HLA.lean.js
      similarity index 86%
      rename from assets/public_kronos_docs_clickables.md.BzXBLTUl.lean.js
      rename to assets/public_kronos_docs_clickables.md.CwRD8HLA.lean.js
      index 233008b9..9b6742be 100644
      --- a/assets/public_kronos_docs_clickables.md.BzXBLTUl.lean.js
      +++ b/assets/public_kronos_docs_clickables.md.CwRD8HLA.lean.js
      @@ -1 +1 @@
      -import{_ as e,c as t,o as a,a9 as s}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"Clickables","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/clickables.md","filePath":"public/kronos/docs/clickables.md","lastUpdated":1701136977000}'),i={name:"public/kronos/docs/clickables.md"},l=s("",12),n=[l];function o(c,r,p,h,u,d){return a(),t("div",null,n)}const g=e(i,[["render",o]]);export{b as __pageData,g as default};
      +import{_ as e,c as t,o as a,a9 as s}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"Clickables","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/clickables.md","filePath":"public/kronos/docs/clickables.md","lastUpdated":1621020740000}'),i={name:"public/kronos/docs/clickables.md"},l=s("",12),n=[l];function o(c,r,p,h,u,d){return a(),t("div",null,n)}const g=e(i,[["render",o]]);export{b as __pageData,g as default};
      diff --git a/assets/public_kronos_docs_custom-tab-layouts.md.BbyIoWME.js b/assets/public_kronos_docs_custom-tab-layouts.md.DQLQaGen.js
      similarity index 99%
      rename from assets/public_kronos_docs_custom-tab-layouts.md.BbyIoWME.js
      rename to assets/public_kronos_docs_custom-tab-layouts.md.DQLQaGen.js
      index d5fb4140..c7e7287a 100644
      --- a/assets/public_kronos_docs_custom-tab-layouts.md.BbyIoWME.js
      +++ b/assets/public_kronos_docs_custom-tab-layouts.md.DQLQaGen.js
      @@ -1,4 +1,4 @@
      -import{_ as s,c as a,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const c=JSON.parse('{"title":"Custom tab layouts","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/custom-tab-layouts.md","filePath":"public/kronos/docs/custom-tab-layouts.md","lastUpdated":1701136977000}'),e={name:"public/kronos/docs/custom-tab-layouts.md"},n=t(`

      Custom tab layouts

      Note: If you are using subtabs, tabFormat is used differently, but the same format is used for defining their layouts. See here for more on subtabs.

      Custom tab layouts can be used to do basically anything in a tab window, especially combined with the "style" layer feature. The tabFormat feature is an array of things, like this:

      js
      tabFormat: [
      +import{_ as s,c as a,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const c=JSON.parse('{"title":"Custom tab layouts","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/custom-tab-layouts.md","filePath":"public/kronos/docs/custom-tab-layouts.md","lastUpdated":1620876099000}'),e={name:"public/kronos/docs/custom-tab-layouts.md"},n=t(`

      Custom tab layouts

      Note: If you are using subtabs, tabFormat is used differently, but the same format is used for defining their layouts. See here for more on subtabs.

      Custom tab layouts can be used to do basically anything in a tab window, especially combined with the "style" layer feature. The tabFormat feature is an array of things, like this:

      js
      tabFormat: [
           "main-display",
           ["prestige-button", function() { return "Melt your points into " }],
           "blank",
      diff --git a/assets/public_kronos_docs_custom-tab-layouts.md.BbyIoWME.lean.js b/assets/public_kronos_docs_custom-tab-layouts.md.DQLQaGen.lean.js
      similarity index 87%
      rename from assets/public_kronos_docs_custom-tab-layouts.md.BbyIoWME.lean.js
      rename to assets/public_kronos_docs_custom-tab-layouts.md.DQLQaGen.lean.js
      index 4a183ec6..a350c58e 100644
      --- a/assets/public_kronos_docs_custom-tab-layouts.md.BbyIoWME.lean.js
      +++ b/assets/public_kronos_docs_custom-tab-layouts.md.DQLQaGen.lean.js
      @@ -1 +1 @@
      -import{_ as s,c as a,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const c=JSON.parse('{"title":"Custom tab layouts","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/custom-tab-layouts.md","filePath":"public/kronos/docs/custom-tab-layouts.md","lastUpdated":1701136977000}'),e={name:"public/kronos/docs/custom-tab-layouts.md"},n=t("",9),l=[n];function o(h,p,r,u,k,d){return i(),a("div",null,l)}const g=s(e,[["render",o]]);export{c as __pageData,g as default};
      +import{_ as s,c as a,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const c=JSON.parse('{"title":"Custom tab layouts","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/custom-tab-layouts.md","filePath":"public/kronos/docs/custom-tab-layouts.md","lastUpdated":1620876099000}'),e={name:"public/kronos/docs/custom-tab-layouts.md"},n=t("",9),l=[n];function o(h,p,r,u,k,d){return i(),a("div",null,l)}const g=s(e,[["render",o]]);export{c as __pageData,g as default};
      diff --git a/assets/public_kronos_docs_getting-started.md.CQfW9cEX.js b/assets/public_kronos_docs_getting-started.md.CvyktqWn.js
      similarity index 98%
      rename from assets/public_kronos_docs_getting-started.md.CQfW9cEX.js
      rename to assets/public_kronos_docs_getting-started.md.CvyktqWn.js
      index 68a57d32..a3d21802 100644
      --- a/assets/public_kronos_docs_getting-started.md.CQfW9cEX.js
      +++ b/assets/public_kronos_docs_getting-started.md.CvyktqWn.js
      @@ -1 +1 @@
      -import{_ as e,c as t,o,a9 as i}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Getting started","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/getting-started.md","filePath":"public/kronos/docs/getting-started.md","lastUpdated":1701136977000}'),a={name:"public/kronos/docs/getting-started.md"},n=i('

      Getting started

      Welcome to The Modding Tree!

      Using the Modding Tree, at its simplest level, just requires getting a copy of it onto your computer. However, if you do it the right way, it will help in many ways.

      Don't let the word "Github" scare you away. It's actually much easier to use than most people think, especially because most people use it the hard way. The key is Github Desktop, which lets you do everything you need to, without even touching the command line.

      The benefits of using Github:

      • It makes it much, much easier to update The Modding Tree.
      • You can share your work without any extra effort using githack, or with a bit more effort, set up a github.io site.
      • It lets you undo changes to your code, and to have multiple versions of it.
      • It lets you collaborate with other people, if you want to.

      Getting set up with Github Desktop, Visual Studio Code, and The Modding Tree:

      1. Install Github Desktop and Visual Studio Code.

      2. Make a Github account. You can handle this on your own.

      3. Log in on your browser, and go back to The Modding Tree page. At the top right, there should be a button that says "fork". Click on it, and then on your username. You now have your own fork, or copy, of The Modding Tree.

      4. Open Github Desktop and log in. Ignore everything else and choose "clone a repository". A "repository" is basically a "Github project", like The Modding Tree. "Cloning" is downloading a copy of the repository to your computer.

      5. Look for The Modding Tree in the list of repositiories (it should be the only one) and click "clone".

      6. Select that you're using it for your own purposes, and click continue. It will download the files and handle everything.

      Using your repository

      1. Click on "show in explorer/finder" to the right, and then open the index.html file in the folder. The page should open up on your browser. This will let you view and test your project locally!

      2. To edit your project, click "open in VSCode" in Github Desktop.

      3. Open mod.js in VSCode, and look at the top part where it has a "modInfo" object. Fill in your mod's name to whatever you want, and change the id as well. (It can be any string value, and it's used to determine where the savefile is. Make it something that's probably unique, and don't change it again later or else it'll effectively wipe existing saves)

      4. Save mod.js, and then reload index.html in your browser. The title on the tab, as well as on the info page, will now be updated! You can reload the page every time you change the code to test it quickly and easily.

      5. Go back to Github Desktop. It's time to save your changes into the git system by making a "commit". This basically saves your work and creates a snapshot of what your code looks like at this moment, allowing you to look back at it later.

      6. At the bottom right corner, add a summary of your changes, and then click "commit to master".

      7. Finally, at the top middle, click "push origin" to push your changes out onto the online repository.

      8. You can view your project on line, or share it with others, by going to https://raw.githack.com/[YOUR-GITHUB-USERNAME]/The-Modding-Tree/master/index.html

      And now, you have successfully used Github! You can look at the documentation to see how The Modding Tree's system works and to make your mod a reality.

      ',11),r=[n];function s(l,h,u,d,p,c){return o(),t("div",null,r)}const m=e(a,[["render",s]]);export{y as __pageData,m as default}; +import{_ as e,c as t,o,a9 as i}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Getting started","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/getting-started.md","filePath":"public/kronos/docs/getting-started.md","lastUpdated":1604778547000}'),a={name:"public/kronos/docs/getting-started.md"},n=i('

      Getting started

      Welcome to The Modding Tree!

      Using the Modding Tree, at its simplest level, just requires getting a copy of it onto your computer. However, if you do it the right way, it will help in many ways.

      Don't let the word "Github" scare you away. It's actually much easier to use than most people think, especially because most people use it the hard way. The key is Github Desktop, which lets you do everything you need to, without even touching the command line.

      The benefits of using Github:

      • It makes it much, much easier to update The Modding Tree.
      • You can share your work without any extra effort using githack, or with a bit more effort, set up a github.io site.
      • It lets you undo changes to your code, and to have multiple versions of it.
      • It lets you collaborate with other people, if you want to.

      Getting set up with Github Desktop, Visual Studio Code, and The Modding Tree:

      1. Install Github Desktop and Visual Studio Code.

      2. Make a Github account. You can handle this on your own.

      3. Log in on your browser, and go back to The Modding Tree page. At the top right, there should be a button that says "fork". Click on it, and then on your username. You now have your own fork, or copy, of The Modding Tree.

      4. Open Github Desktop and log in. Ignore everything else and choose "clone a repository". A "repository" is basically a "Github project", like The Modding Tree. "Cloning" is downloading a copy of the repository to your computer.

      5. Look for The Modding Tree in the list of repositiories (it should be the only one) and click "clone".

      6. Select that you're using it for your own purposes, and click continue. It will download the files and handle everything.

      Using your repository

      1. Click on "show in explorer/finder" to the right, and then open the index.html file in the folder. The page should open up on your browser. This will let you view and test your project locally!

      2. To edit your project, click "open in VSCode" in Github Desktop.

      3. Open mod.js in VSCode, and look at the top part where it has a "modInfo" object. Fill in your mod's name to whatever you want, and change the id as well. (It can be any string value, and it's used to determine where the savefile is. Make it something that's probably unique, and don't change it again later or else it'll effectively wipe existing saves)

      4. Save mod.js, and then reload index.html in your browser. The title on the tab, as well as on the info page, will now be updated! You can reload the page every time you change the code to test it quickly and easily.

      5. Go back to Github Desktop. It's time to save your changes into the git system by making a "commit". This basically saves your work and creates a snapshot of what your code looks like at this moment, allowing you to look back at it later.

      6. At the bottom right corner, add a summary of your changes, and then click "commit to master".

      7. Finally, at the top middle, click "push origin" to push your changes out onto the online repository.

      8. You can view your project on line, or share it with others, by going to https://raw.githack.com/[YOUR-GITHUB-USERNAME]/The-Modding-Tree/master/index.html

      And now, you have successfully used Github! You can look at the documentation to see how The Modding Tree's system works and to make your mod a reality.

      ',11),r=[n];function s(l,h,u,d,p,c){return o(),t("div",null,r)}const m=e(a,[["render",s]]);export{y as __pageData,m as default}; diff --git a/assets/public_kronos_docs_getting-started.md.CQfW9cEX.lean.js b/assets/public_kronos_docs_getting-started.md.CvyktqWn.lean.js similarity index 86% rename from assets/public_kronos_docs_getting-started.md.CQfW9cEX.lean.js rename to assets/public_kronos_docs_getting-started.md.CvyktqWn.lean.js index 6de0faf1..bb568f31 100644 --- a/assets/public_kronos_docs_getting-started.md.CQfW9cEX.lean.js +++ b/assets/public_kronos_docs_getting-started.md.CvyktqWn.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o,a9 as i}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Getting started","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/getting-started.md","filePath":"public/kronos/docs/getting-started.md","lastUpdated":1701136977000}'),a={name:"public/kronos/docs/getting-started.md"},n=i("",11),r=[n];function s(l,h,u,d,p,c){return o(),t("div",null,r)}const m=e(a,[["render",s]]);export{y as __pageData,m as default}; +import{_ as e,c as t,o,a9 as i}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Getting started","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/getting-started.md","filePath":"public/kronos/docs/getting-started.md","lastUpdated":1604778547000}'),a={name:"public/kronos/docs/getting-started.md"},n=i("",11),r=[n];function s(l,h,u,d,p,c){return o(),t("div",null,r)}const m=e(a,[["render",s]]);export{y as __pageData,m as default}; diff --git a/assets/public_kronos_docs_grids.md.3_YSBuDO.js b/assets/public_kronos_docs_grids.md.D6eGDxZf.js similarity index 99% rename from assets/public_kronos_docs_grids.md.3_YSBuDO.js rename to assets/public_kronos_docs_grids.md.D6eGDxZf.js index 4633fcae..2ff58a3e 100644 --- a/assets/public_kronos_docs_grids.md.3_YSBuDO.js +++ b/assets/public_kronos_docs_grids.md.D6eGDxZf.js @@ -1,4 +1,4 @@ -import{_ as s,c as a,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Grids","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/grids.md","filePath":"public/kronos/docs/grids.md","lastUpdated":1701136977000}'),e={name:"public/kronos/docs/grids.md"},n=t(`

      Grids

      Grids are an easier way of making a group of similar clickables. They all have the same behavior, but are different based on their data.

      NOTE: Gridables are similar to clickables in some respects, but are fundamentally different from normal TMT components in quite a few ways. Be sure to keep these in mind:

      • Gridable ids use base 100 instead of base 10, so you can have more than 10 tiles in a row. This means that a grid might look like this: 101 102 201 202
      • Individual gridables are not defined individually. All properties go directly into the "grid" object. Functions are called with arguments for the id of the gridables and its associated data, so you can give them the appropriate appearance and properties based on that.
      • If you need two unrelated grids in a layer, you'll need to use a layer proxy component.

      Useful functions for dealing with grids:

      • getGridData(layer, id): get the data for the chosen gridable
      • setGridData(layer, id, state): set the data for the chosen gridable
      • gridEffect(layer, id): get the effect for the chosen gridable

      The grid should be formatted like this:

      js
      grid: {
      +import{_ as s,c as a,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Grids","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/grids.md","filePath":"public/kronos/docs/grids.md","lastUpdated":1620790495000}'),e={name:"public/kronos/docs/grids.md"},n=t(`

      Grids

      Grids are an easier way of making a group of similar clickables. They all have the same behavior, but are different based on their data.

      NOTE: Gridables are similar to clickables in some respects, but are fundamentally different from normal TMT components in quite a few ways. Be sure to keep these in mind:

      • Gridable ids use base 100 instead of base 10, so you can have more than 10 tiles in a row. This means that a grid might look like this: 101 102 201 202
      • Individual gridables are not defined individually. All properties go directly into the "grid" object. Functions are called with arguments for the id of the gridables and its associated data, so you can give them the appropriate appearance and properties based on that.
      • If you need two unrelated grids in a layer, you'll need to use a layer proxy component.

      Useful functions for dealing with grids:

      • getGridData(layer, id): get the data for the chosen gridable
      • setGridData(layer, id, state): set the data for the chosen gridable
      • gridEffect(layer, id): get the effect for the chosen gridable

      The grid should be formatted like this:

      js
      grid: {
           rows: 4, // If these are dynamic make sure to have a max value as well!
           cols: 5,
           getStartData(id) {
      diff --git a/assets/public_kronos_docs_grids.md.3_YSBuDO.lean.js b/assets/public_kronos_docs_grids.md.D6eGDxZf.lean.js
      similarity index 85%
      rename from assets/public_kronos_docs_grids.md.3_YSBuDO.lean.js
      rename to assets/public_kronos_docs_grids.md.D6eGDxZf.lean.js
      index df7b3168..7db173f9 100644
      --- a/assets/public_kronos_docs_grids.md.3_YSBuDO.lean.js
      +++ b/assets/public_kronos_docs_grids.md.D6eGDxZf.lean.js
      @@ -1 +1 @@
      -import{_ as s,c as a,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Grids","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/grids.md","filePath":"public/kronos/docs/grids.md","lastUpdated":1701136977000}'),e={name:"public/kronos/docs/grids.md"},n=t("",10),l=[n];function r(h,p,o,d,k,g){return i(),a("div",null,l)}const y=s(e,[["render",r]]);export{u as __pageData,y as default};
      +import{_ as s,c as a,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Grids","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/grids.md","filePath":"public/kronos/docs/grids.md","lastUpdated":1620790495000}'),e={name:"public/kronos/docs/grids.md"},n=t("",10),l=[n];function r(h,p,o,d,k,g){return i(),a("div",null,l)}const y=s(e,[["render",r]]);export{u as __pageData,y as default};
      diff --git a/assets/public_kronos_docs_infoboxes.md.DpZxLNRR.js b/assets/public_kronos_docs_infoboxes.md.d7yspWU6.js
      similarity index 98%
      rename from assets/public_kronos_docs_infoboxes.md.DpZxLNRR.js
      rename to assets/public_kronos_docs_infoboxes.md.d7yspWU6.js
      index 77979011..000dc530 100644
      --- a/assets/public_kronos_docs_infoboxes.md.DpZxLNRR.js
      +++ b/assets/public_kronos_docs_infoboxes.md.d7yspWU6.js
      @@ -1,4 +1,4 @@
      -import{_ as s,c as i,o as e,a9 as a}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Infoboxes","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/infoboxes.md","filePath":"public/kronos/docs/infoboxes.md","lastUpdated":1701136977000}'),t={name:"public/kronos/docs/infoboxes.md"},n=a(`

      Infoboxes

      Infoboxes are good for displaying "lore", or story elements, as well as for explaining complicated things.

      In the default tab layout, the first infobox will be displayed at the very top of the tab.

      Infoboxes are defined like other Big Features:

      js
      infoboxes: {
      +import{_ as s,c as i,o as e,a9 as a}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Infoboxes","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/infoboxes.md","filePath":"public/kronos/docs/infoboxes.md","lastUpdated":1603745122000}'),t={name:"public/kronos/docs/infoboxes.md"},n=a(`

      Infoboxes

      Infoboxes are good for displaying "lore", or story elements, as well as for explaining complicated things.

      In the default tab layout, the first infobox will be displayed at the very top of the tab.

      Infoboxes are defined like other Big Features:

      js
      infoboxes: {
           lore: {
               title: "foo",
               body() { return "bar" },
      diff --git a/assets/public_kronos_docs_infoboxes.md.DpZxLNRR.lean.js b/assets/public_kronos_docs_infoboxes.md.d7yspWU6.lean.js
      similarity index 86%
      rename from assets/public_kronos_docs_infoboxes.md.DpZxLNRR.lean.js
      rename to assets/public_kronos_docs_infoboxes.md.d7yspWU6.lean.js
      index 0e3b5e88..374b853a 100644
      --- a/assets/public_kronos_docs_infoboxes.md.DpZxLNRR.lean.js
      +++ b/assets/public_kronos_docs_infoboxes.md.d7yspWU6.lean.js
      @@ -1 +1 @@
      -import{_ as s,c as i,o as e,a9 as a}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Infoboxes","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/infoboxes.md","filePath":"public/kronos/docs/infoboxes.md","lastUpdated":1701136977000}'),t={name:"public/kronos/docs/infoboxes.md"},n=a("",7),o=[n];function l(p,h,r,d,c,k){return e(),i("div",null,o)}const y=s(t,[["render",l]]);export{u as __pageData,y as default};
      +import{_ as s,c as i,o as e,a9 as a}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Infoboxes","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/infoboxes.md","filePath":"public/kronos/docs/infoboxes.md","lastUpdated":1603745122000}'),t={name:"public/kronos/docs/infoboxes.md"},n=a("",7),o=[n];function l(p,h,r,d,c,k){return e(),i("div",null,o)}const y=s(t,[["render",l]]);export{u as __pageData,y as default};
      diff --git a/assets/public_kronos_docs_layer-features.md.Bz9OYgri.js b/assets/public_kronos_docs_layer-features.md.CUYPvQ75.js
      similarity index 99%
      rename from assets/public_kronos_docs_layer-features.md.Bz9OYgri.js
      rename to assets/public_kronos_docs_layer-features.md.CUYPvQ75.js
      index db712838..29e54914 100644
      --- a/assets/public_kronos_docs_layer-features.md.Bz9OYgri.js
      +++ b/assets/public_kronos_docs_layer-features.md.CUYPvQ75.js
      @@ -1,4 +1,4 @@
      -import{_ as e,c as t,o as a,a9 as s}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Layer Features","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/layer-features.md","filePath":"public/kronos/docs/layer-features.md","lastUpdated":1701136977000}'),i={name:"public/kronos/docs/layer-features.md"},o=s(`

      Layer Features

      This is a more comprehensive list of established features to add to layers. You can add more freely, if you want to have other functions or values associated with your layer. These have special functionality, though.

      You can make almost any value dynamic by using a function in its place, including all display strings and styling/color features.

      Layer Definition features

      • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar to access the saved value. It makes copying code to new layers easier. It is also assigned to all upgrades and buyables and such.

      • name: optional. used in reset confirmations (and the default infobox title). If absent, it just uses the layer's id.

      • startData(): A function to return the default save data for this layer. Add any variables you have to it. Make sure to use Decimal values rather than normal numbers.

        Standard values: - Required: - unlocked: a bool determining if this layer is unlocked or not - points: a Decimal, the main currency for the layer - Optional: - total: A Decimal, tracks total amount of main prestige currency. Always tracked, but only shown if you add it here. - best: A Decimal, tracks highest amount of main prestige currency. Always tracked, but only shown if you add it here. - unlockOrder: used to keep track of relevant layers unlocked before this one. - resetTime: A number, time since this layer was last prestiged (or reset by another layer)

      • color: A color associated with this layer, used in many places. (A string in hex format with a #)

      • row: The row of the layer, starting at 0. This affects where the node appears on the standard tree, and which resets affect the layer.

        Using "side" instead of a number will cause the layer to appear off to the side as a smaller node (useful for achievements and statistics). Side layers are not affected by resets unless you add a doReset to them.

      • displayRow: OVERRIDE Changes where the layer node appears without changing where it is in the reset order.

      • resource: Name of the main currency you gain by resetting on this layer.

      • effect(): optional. A function that calculates and returns the current values of any bonuses inherent to the main currency. Can return a value or an object containing multiple values. You will also have to implement the effect where it is applied.

      • effectDescription: optional. A function that returns a description of this effect. If the text stays constant, it can just be a string.

      • layerShown(): optional, A function returning a bool which determines if this layer's node should be visible on the tree. It can also return "ghost", which will hide the layer, but its node will still take up space in the tree. Defaults to true.

      • hotkeys: optional. An array containing information on any hotkeys associated with this layer:

        js
        hotkeys: [
        +import{_ as e,c as t,o as a,a9 as s}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Layer Features","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/layer-features.md","filePath":"public/kronos/docs/layer-features.md","lastUpdated":1621096318000}'),i={name:"public/kronos/docs/layer-features.md"},o=s(`

        Layer Features

        This is a more comprehensive list of established features to add to layers. You can add more freely, if you want to have other functions or values associated with your layer. These have special functionality, though.

        You can make almost any value dynamic by using a function in its place, including all display strings and styling/color features.

        Layer Definition features

        • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar to access the saved value. It makes copying code to new layers easier. It is also assigned to all upgrades and buyables and such.

        • name: optional. used in reset confirmations (and the default infobox title). If absent, it just uses the layer's id.

        • startData(): A function to return the default save data for this layer. Add any variables you have to it. Make sure to use Decimal values rather than normal numbers.

          Standard values: - Required: - unlocked: a bool determining if this layer is unlocked or not - points: a Decimal, the main currency for the layer - Optional: - total: A Decimal, tracks total amount of main prestige currency. Always tracked, but only shown if you add it here. - best: A Decimal, tracks highest amount of main prestige currency. Always tracked, but only shown if you add it here. - unlockOrder: used to keep track of relevant layers unlocked before this one. - resetTime: A number, time since this layer was last prestiged (or reset by another layer)

        • color: A color associated with this layer, used in many places. (A string in hex format with a #)

        • row: The row of the layer, starting at 0. This affects where the node appears on the standard tree, and which resets affect the layer.

          Using "side" instead of a number will cause the layer to appear off to the side as a smaller node (useful for achievements and statistics). Side layers are not affected by resets unless you add a doReset to them.

        • displayRow: OVERRIDE Changes where the layer node appears without changing where it is in the reset order.

        • resource: Name of the main currency you gain by resetting on this layer.

        • effect(): optional. A function that calculates and returns the current values of any bonuses inherent to the main currency. Can return a value or an object containing multiple values. You will also have to implement the effect where it is applied.

        • effectDescription: optional. A function that returns a description of this effect. If the text stays constant, it can just be a string.

        • layerShown(): optional, A function returning a bool which determines if this layer's node should be visible on the tree. It can also return "ghost", which will hide the layer, but its node will still take up space in the tree. Defaults to true.

        • hotkeys: optional. An array containing information on any hotkeys associated with this layer:

          js
          hotkeys: [
               {
                   key: "p", // What the hotkey button is. Use uppercase if it's combined with shift, or "ctrl+x" for holding down ctrl.
                   description: "p: reset your points for prestige points", // The description of the hotkey that is displayed in the game's How To Play tab
          diff --git a/assets/public_kronos_docs_layer-features.md.Bz9OYgri.lean.js b/assets/public_kronos_docs_layer-features.md.CUYPvQ75.lean.js
          similarity index 86%
          rename from assets/public_kronos_docs_layer-features.md.Bz9OYgri.lean.js
          rename to assets/public_kronos_docs_layer-features.md.CUYPvQ75.lean.js
          index e3e8b359..073b12d4 100644
          --- a/assets/public_kronos_docs_layer-features.md.Bz9OYgri.lean.js
          +++ b/assets/public_kronos_docs_layer-features.md.CUYPvQ75.lean.js
          @@ -1 +1 @@
          -import{_ as e,c as t,o as a,a9 as s}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Layer Features","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/layer-features.md","filePath":"public/kronos/docs/layer-features.md","lastUpdated":1701136977000}'),i={name:"public/kronos/docs/layer-features.md"},o=s("",20),r=[o];function n(l,h,p,u,d,c){return a(),t("div",null,r)}const f=e(i,[["render",n]]);export{y as __pageData,f as default};
          +import{_ as e,c as t,o as a,a9 as s}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Layer Features","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/layer-features.md","filePath":"public/kronos/docs/layer-features.md","lastUpdated":1621096318000}'),i={name:"public/kronos/docs/layer-features.md"},o=s("",20),r=[o];function n(l,h,p,u,d,c){return a(),t("div",null,r)}const f=e(i,[["render",n]]);export{y as __pageData,f as default};
          diff --git a/assets/public_kronos_docs_main-mod-info.md.ByNe_g0w.js b/assets/public_kronos_docs_main-mod-info.md.59FtHiDt.js
          similarity index 99%
          rename from assets/public_kronos_docs_main-mod-info.md.ByNe_g0w.js
          rename to assets/public_kronos_docs_main-mod-info.md.59FtHiDt.js
          index 7f15295c..01e80861 100644
          --- a/assets/public_kronos_docs_main-mod-info.md.ByNe_g0w.js
          +++ b/assets/public_kronos_docs_main-mod-info.md.59FtHiDt.js
          @@ -1,4 +1,4 @@
          -import{_ as i,c as e,o as t,a9 as s}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"mod.js","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/main-mod-info.md","filePath":"public/kronos/docs/main-mod-info.md","lastUpdated":1701136977000}'),a={name:"public/kronos/docs/main-mod-info.md"},n=s(`

          mod.js

          Most of the non-layer code and data that you're likely to edit is here in mod.js. Everything in mod.js will not be altered by updates, besides the addition of new things.

          Here's a breakdown of what's in it:

          • modInfo is where most of the basic configuration for the mod is. It contains:

            • name: The name of your mod. (a string)

            • id: The id for your mod, a unique string that is used to determine savefile location. Be sure to set it when you start making a mod, and don't change it later because it will erase all saves.

            • author: The name of the author, displayed in the info tab.

            • pointsName: This changes what is displayed instead of "points" for the main currency. (It does not affect it in the code.)

            • discordName, discordLink: If you have a Discord server or other discussion place, you can add a link to it.

              "discordName" is the text on the link, and "discordLink" is the url of an invite. If you're using a Discord invite, please make sure it's set to never expire.

            • offlineLimit: The maximum amount of offline time that the player can accumulate, in hours. Any extra time is lost. (a number)

              This is useful because most of these mods are fast-paced enough that too much offline time ruins the balance, such as the time in between updates. That is why I suggest developers disable offline time on their own savefile.

            • initialStartPoints: A Decimal for the amount of points a new player should start with.

          • VERSION is used to describe the current version of your mod. It contains:

            • num: The mod's version number, displayed at the top right of the tree tab.
            • name: The version's name, displayed alongside the number in the info tab.
          • changelog is the HTML displayed in the changelog tab. If this gets particularly long, it might be good to put in a separate file (be sure to add the file to index.html)

          • doNotCallTheseFunctionsEveryTick is very important, if you are adding non-standard functions. TMT calls every function anywhere in "layers" every tick to store the result, unless specifically told not to. Functions that have are used to do an action need to be identified. "Official" functions (those in the documentation) are all fine, but if you make any new ones, add their names to this array.

          js
          // (The ones here are examples, all official functions are already taken care of)
          +import{_ as i,c as e,o as t,a9 as s}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"mod.js","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/main-mod-info.md","filePath":"public/kronos/docs/main-mod-info.md","lastUpdated":1620888678000}'),a={name:"public/kronos/docs/main-mod-info.md"},n=s(`

          mod.js

          Most of the non-layer code and data that you're likely to edit is here in mod.js. Everything in mod.js will not be altered by updates, besides the addition of new things.

          Here's a breakdown of what's in it:

          • modInfo is where most of the basic configuration for the mod is. It contains:

            • name: The name of your mod. (a string)

            • id: The id for your mod, a unique string that is used to determine savefile location. Be sure to set it when you start making a mod, and don't change it later because it will erase all saves.

            • author: The name of the author, displayed in the info tab.

            • pointsName: This changes what is displayed instead of "points" for the main currency. (It does not affect it in the code.)

            • discordName, discordLink: If you have a Discord server or other discussion place, you can add a link to it.

              "discordName" is the text on the link, and "discordLink" is the url of an invite. If you're using a Discord invite, please make sure it's set to never expire.

            • offlineLimit: The maximum amount of offline time that the player can accumulate, in hours. Any extra time is lost. (a number)

              This is useful because most of these mods are fast-paced enough that too much offline time ruins the balance, such as the time in between updates. That is why I suggest developers disable offline time on their own savefile.

            • initialStartPoints: A Decimal for the amount of points a new player should start with.

          • VERSION is used to describe the current version of your mod. It contains:

            • num: The mod's version number, displayed at the top right of the tree tab.
            • name: The version's name, displayed alongside the number in the info tab.
          • changelog is the HTML displayed in the changelog tab. If this gets particularly long, it might be good to put in a separate file (be sure to add the file to index.html)

          • doNotCallTheseFunctionsEveryTick is very important, if you are adding non-standard functions. TMT calls every function anywhere in "layers" every tick to store the result, unless specifically told not to. Functions that have are used to do an action need to be identified. "Official" functions (those in the documentation) are all fine, but if you make any new ones, add their names to this array.

          js
          // (The ones here are examples, all official functions are already taken care of)
           var doNotCallTheseFunctionsEveryTick = ["doReset", "buy", "onPurchase", "blowUpEverything"]
          • getStartPoints(): A function to determine the amount of points the player starts with after a reset. (returns a Decimal value)

          • canGenPoints(): A function returning a boolean for if points should be generated. Use this if you want an upgrade to unlock generating points.

          • getPointGen(): A function that calculates your points per second. Anything that affects your point gain should go into the calculation here.

          • addedPlayerData(): A function that returns any non-layer-related data that you want to be added to the save data and "player" object.

          js
          function addedPlayerData() { return {
           	weather: "Yes",
           	happiness: new Decimal(72),
          diff --git a/assets/public_kronos_docs_main-mod-info.md.ByNe_g0w.lean.js b/assets/public_kronos_docs_main-mod-info.md.59FtHiDt.lean.js
          similarity index 86%
          rename from assets/public_kronos_docs_main-mod-info.md.ByNe_g0w.lean.js
          rename to assets/public_kronos_docs_main-mod-info.md.59FtHiDt.lean.js
          index 9360f8c0..baac81b9 100644
          --- a/assets/public_kronos_docs_main-mod-info.md.ByNe_g0w.lean.js
          +++ b/assets/public_kronos_docs_main-mod-info.md.59FtHiDt.lean.js
          @@ -1 +1 @@
          -import{_ as i,c as e,o as t,a9 as s}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"mod.js","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/main-mod-info.md","filePath":"public/kronos/docs/main-mod-info.md","lastUpdated":1701136977000}'),a={name:"public/kronos/docs/main-mod-info.md"},n=s("",10),o=[n];function l(h,r,p,d,u,c){return t(),e("div",null,o)}const y=i(a,[["render",l]]);export{f as __pageData,y as default};
          +import{_ as i,c as e,o as t,a9 as s}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"mod.js","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/main-mod-info.md","filePath":"public/kronos/docs/main-mod-info.md","lastUpdated":1620888678000}'),a={name:"public/kronos/docs/main-mod-info.md"},n=s("",10),o=[n];function l(h,r,p,d,u,c){return t(),e("div",null,o)}const y=i(a,[["render",l]]);export{f as __pageData,y as default};
          diff --git a/assets/public_kronos_docs_milestones.md.D2as2Rdw.js b/assets/public_kronos_docs_milestones.md._qurRXy3.js
          similarity index 98%
          rename from assets/public_kronos_docs_milestones.md.D2as2Rdw.js
          rename to assets/public_kronos_docs_milestones.md._qurRXy3.js
          index e4249ecf..c6922204 100644
          --- a/assets/public_kronos_docs_milestones.md.D2as2Rdw.js
          +++ b/assets/public_kronos_docs_milestones.md._qurRXy3.js
          @@ -1,4 +1,4 @@
          -import{_ as e,c as s,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Milestones","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/milestones.md","filePath":"public/kronos/docs/milestones.md","lastUpdated":1701136977000}'),a={name:"public/kronos/docs/milestones.md"},n=t(`

          Milestones

          Milestones are awarded to the player when they meet a certain goal, and give some benefit. Milestones should be formatted like this:

          js
          milestones: {
          +import{_ as e,c as s,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Milestones","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/milestones.md","filePath":"public/kronos/docs/milestones.md","lastUpdated":1607827402000}'),a={name:"public/kronos/docs/milestones.md"},n=t(`

          Milestones

          Milestones are awarded to the player when they meet a certain goal, and give some benefit. Milestones should be formatted like this:

          js
          milestones: {
               0: {
                   requirementDescription: "123 waffles",
                   effectDescription: "blah",
          diff --git a/assets/public_kronos_docs_milestones.md.D2as2Rdw.lean.js b/assets/public_kronos_docs_milestones.md._qurRXy3.lean.js
          similarity index 86%
          rename from assets/public_kronos_docs_milestones.md.D2as2Rdw.lean.js
          rename to assets/public_kronos_docs_milestones.md._qurRXy3.lean.js
          index 1f94075e..71416556 100644
          --- a/assets/public_kronos_docs_milestones.md.D2as2Rdw.lean.js
          +++ b/assets/public_kronos_docs_milestones.md._qurRXy3.lean.js
          @@ -1 +1 @@
          -import{_ as e,c as s,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Milestones","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/milestones.md","filePath":"public/kronos/docs/milestones.md","lastUpdated":1701136977000}'),a={name:"public/kronos/docs/milestones.md"},n=t("",7),o=[n];function l(h,r,p,d,c,g){return i(),s("div",null,o)}const m=e(a,[["render",l]]);export{u as __pageData,m as default};
          +import{_ as e,c as s,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Milestones","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/milestones.md","filePath":"public/kronos/docs/milestones.md","lastUpdated":1607827402000}'),a={name:"public/kronos/docs/milestones.md"},n=t("",7),o=[n];function l(h,r,p,d,c,g){return i(),s("div",null,o)}const m=e(a,[["render",l]]);export{u as __pageData,m as default};
          diff --git a/assets/public_kronos_docs_particles.md.DkE7U5GT.js b/assets/public_kronos_docs_particles.md.BmR47K5y.js
          similarity index 99%
          rename from assets/public_kronos_docs_particles.md.DkE7U5GT.js
          rename to assets/public_kronos_docs_particles.md.BmR47K5y.js
          index aceb6b5b..b8e93b21 100644
          --- a/assets/public_kronos_docs_particles.md.DkE7U5GT.js
          +++ b/assets/public_kronos_docs_particles.md.BmR47K5y.js
          @@ -1,4 +1,4 @@
          -import{_ as e,c as i,o as s,a9 as a}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Particles","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/particles.md","filePath":"public/kronos/docs/particles.md","lastUpdated":1701136977000}'),t={name:"public/kronos/docs/particles.md"},l=a(`

          Particles

          Particles are free-floating elements that can move and have many different behaviors. They can also interact with the mouse.

          To make particles, use makeParticles(particle, amount). particle is a particle-defining object, with features as explained below. There is also makeShinies, which uses different defaults and creates stationary particles at a random location. There are also a few other useful things listed at the end.

          js
          
          +import{_ as e,c as i,o as s,a9 as a}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Particles","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/particles.md","filePath":"public/kronos/docs/particles.md","lastUpdated":1621368363000}'),t={name:"public/kronos/docs/particles.md"},l=a(`

          Particles

          Particles are free-floating elements that can move and have many different behaviors. They can also interact with the mouse.

          To make particles, use makeParticles(particle, amount). particle is a particle-defining object, with features as explained below. There is also makeShinies, which uses different defaults and creates stationary particles at a random location. There are also a few other useful things listed at the end.

          js
          
           const myParticle {
               image:"options_wheel.png",
               spread: 20,
          diff --git a/assets/public_kronos_docs_particles.md.DkE7U5GT.lean.js b/assets/public_kronos_docs_particles.md.BmR47K5y.lean.js
          similarity index 86%
          rename from assets/public_kronos_docs_particles.md.DkE7U5GT.lean.js
          rename to assets/public_kronos_docs_particles.md.BmR47K5y.lean.js
          index 9f45bd0c..92c4259b 100644
          --- a/assets/public_kronos_docs_particles.md.DkE7U5GT.lean.js
          +++ b/assets/public_kronos_docs_particles.md.BmR47K5y.lean.js
          @@ -1 +1 @@
          -import{_ as e,c as i,o as s,a9 as a}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Particles","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/particles.md","filePath":"public/kronos/docs/particles.md","lastUpdated":1701136977000}'),t={name:"public/kronos/docs/particles.md"},l=a("",11),n=[l];function h(p,r,o,d,c,k){return s(),i("div",null,n)}const f=e(t,[["render",h]]);export{g as __pageData,f as default};
          +import{_ as e,c as i,o as s,a9 as a}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Particles","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/particles.md","filePath":"public/kronos/docs/particles.md","lastUpdated":1621368363000}'),t={name:"public/kronos/docs/particles.md"},l=a("",11),n=[l];function h(p,r,o,d,c,k){return s(),i("div",null,n)}const f=e(t,[["render",h]]);export{g as __pageData,f as default};
          diff --git a/assets/public_kronos_docs_subtabs-and-microtabs.md.Bqm7YUXh.js b/assets/public_kronos_docs_subtabs-and-microtabs.md.NAJvWyOX.js
          similarity index 99%
          rename from assets/public_kronos_docs_subtabs-and-microtabs.md.Bqm7YUXh.js
          rename to assets/public_kronos_docs_subtabs-and-microtabs.md.NAJvWyOX.js
          index d8dd3ddb..24608534 100644
          --- a/assets/public_kronos_docs_subtabs-and-microtabs.md.Bqm7YUXh.js
          +++ b/assets/public_kronos_docs_subtabs-and-microtabs.md.NAJvWyOX.js
          @@ -1,4 +1,4 @@
          -import{_ as s,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Subtabs and Microtabs","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/subtabs-and-microtabs.md","filePath":"public/kronos/docs/subtabs-and-microtabs.md","lastUpdated":1701136977000}'),n={name:"public/kronos/docs/subtabs-and-microtabs.md"},e=i(`

          Subtabs and Microtabs

          Subtabs are separate sections of a tab that you can view by selecting one at the top of the tab. Microtabs are smaller areas that function in much the same way. You can also embed layers inside of subtabs/microtabs.

          Subtabs are defined by using the tab format like this, where each element of tabFormat is given the name of that subtab:

          js
          tabFormat: {
          +import{_ as s,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Subtabs and Microtabs","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/subtabs-and-microtabs.md","filePath":"public/kronos/docs/subtabs-and-microtabs.md","lastUpdated":1620429872000}'),n={name:"public/kronos/docs/subtabs-and-microtabs.md"},e=i(`

          Subtabs and Microtabs

          Subtabs are separate sections of a tab that you can view by selecting one at the top of the tab. Microtabs are smaller areas that function in much the same way. You can also embed layers inside of subtabs/microtabs.

          Subtabs are defined by using the tab format like this, where each element of tabFormat is given the name of that subtab:

          js
          tabFormat: {
               "Main tab": {
                   content: [tab format things],
                   *subtab features*
          diff --git a/assets/public_kronos_docs_subtabs-and-microtabs.md.Bqm7YUXh.lean.js b/assets/public_kronos_docs_subtabs-and-microtabs.md.NAJvWyOX.lean.js
          similarity index 87%
          rename from assets/public_kronos_docs_subtabs-and-microtabs.md.Bqm7YUXh.lean.js
          rename to assets/public_kronos_docs_subtabs-and-microtabs.md.NAJvWyOX.lean.js
          index 462432d5..7aa2aff9 100644
          --- a/assets/public_kronos_docs_subtabs-and-microtabs.md.Bqm7YUXh.lean.js
          +++ b/assets/public_kronos_docs_subtabs-and-microtabs.md.NAJvWyOX.lean.js
          @@ -1 +1 @@
          -import{_ as s,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Subtabs and Microtabs","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/subtabs-and-microtabs.md","filePath":"public/kronos/docs/subtabs-and-microtabs.md","lastUpdated":1701136977000}'),n={name:"public/kronos/docs/subtabs-and-microtabs.md"},e=i("",9),l=[e];function h(o,p,r,k,d,b){return t(),a("div",null,l)}const E=s(n,[["render",h]]);export{u as __pageData,E as default};
          +import{_ as s,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Subtabs and Microtabs","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/subtabs-and-microtabs.md","filePath":"public/kronos/docs/subtabs-and-microtabs.md","lastUpdated":1620429872000}'),n={name:"public/kronos/docs/subtabs-and-microtabs.md"},e=i("",9),l=[e];function h(o,p,r,k,d,b){return t(),a("div",null,l)}const E=s(n,[["render",h]]);export{u as __pageData,E as default};
          diff --git a/assets/public_kronos_docs_trees-and-tree-customization.md.DZzDglty.js b/assets/public_kronos_docs_trees-and-tree-customization.md.DNSPCGw2.js
          similarity index 98%
          rename from assets/public_kronos_docs_trees-and-tree-customization.md.DZzDglty.js
          rename to assets/public_kronos_docs_trees-and-tree-customization.md.DNSPCGw2.js
          index e0e5c9e6..72dde74c 100644
          --- a/assets/public_kronos_docs_trees-and-tree-customization.md.DZzDglty.js
          +++ b/assets/public_kronos_docs_trees-and-tree-customization.md.DNSPCGw2.js
          @@ -1,3 +1,3 @@
          -import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Trees and tree customization","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/trees-and-tree-customization.md","filePath":"public/kronos/docs/trees-and-tree-customization.md","lastUpdated":1701136977000}'),s={name:"public/kronos/docs/trees-and-tree-customization.md"},o=i(`

          Trees and tree customization

          If you want to have something beyond the standard tree on the left tab, you can do that in tree.js. You can change the layout of the tree, including making non-layer nodes, change it into something other than a tree, or hide the left tab altogether. This also introduces the "tree" component, which can be used in your layers as well.

          layoutInfo

          The most important part is layoutInfo, containing:

          • startTab: The id of the default tab to show on the left at the start.
          • showTree: True if the tree tab should be shown at the start of the game. (The other tab will fill the whole page)
          • treeLayout: If present, overrides the tree layout and places nodes as you describe instead (explained in the next section).

          Additionally, if you want the main layout to not be a tree, you can edit the "tree-tab" layer at the bottom of tree.js to modify it just like a normal layer's tab. You can even switch between left tabs, using showNavTab(layer) to make that layer appear on the left.

          Trees

          The tree component is defined as an array of arrays of names of layers or nodes to show in the tree. They work just like layers/ nodes in the main tree (but branches between nodes will only work on the first node if you have duplicates.)

          Here is an example tree:

          js
          [["p"],
          +import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Trees and tree customization","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/trees-and-tree-customization.md","filePath":"public/kronos/docs/trees-and-tree-customization.md","lastUpdated":1604787966000}'),s={name:"public/kronos/docs/trees-and-tree-customization.md"},o=i(`

          Trees and tree customization

          If you want to have something beyond the standard tree on the left tab, you can do that in tree.js. You can change the layout of the tree, including making non-layer nodes, change it into something other than a tree, or hide the left tab altogether. This also introduces the "tree" component, which can be used in your layers as well.

          layoutInfo

          The most important part is layoutInfo, containing:

          • startTab: The id of the default tab to show on the left at the start.
          • showTree: True if the tree tab should be shown at the start of the game. (The other tab will fill the whole page)
          • treeLayout: If present, overrides the tree layout and places nodes as you describe instead (explained in the next section).

          Additionally, if you want the main layout to not be a tree, you can edit the "tree-tab" layer at the bottom of tree.js to modify it just like a normal layer's tab. You can even switch between left tabs, using showNavTab(layer) to make that layer appear on the left.

          Trees

          The tree component is defined as an array of arrays of names of layers or nodes to show in the tree. They work just like layers/ nodes in the main tree (but branches between nodes will only work on the first node if you have duplicates.)

          Here is an example tree:

          js
          [["p"],
            ["left", "blank", "right", "blank"]
            ["a", "b", "blank", "c", "weirdButton"]]

          Nodes

          Nodes are non-layer buttons that can go in trees. They are defined similarly to layers, but with addNode instead of addLayer.

          Features:

          • color: optional, The node's color. (A string in hex format with a #)

          • symbol: optional The text on the button (The id capitalized by default)

          • canClick(): Returns true if the player can click the node. ()

          • onClick(): The function called when the node is clicked.

          • layerShown(): optional, A function returning a bool which determines if this node should be visible. It can also return "ghost", which will hide the layer, but its node will still take up space in its tree.

          • branches: optional. An array of layer/node ids. On a tree, a line will appear from this node to all of the nodes in the list. Alternatively, an entry in the array can be a 2-element array consisting of the id and a color value. The color value can either be a string with a hex color code, or a number from 1-3 (theme-affected colors).

          • nodeStyle: optional. A CSS object, where the keys are CSS attributes, which styles this node on the tree.

          • tooltip() / tooltipLocked(): optional. Functions that return text, which is the tooltip for the node when the layer is unlocked or locked, respectively. By default the tooltips behave the same as in the original Prestige Tree.

          • row: optional, the row that this node appears in (for the default tree).

          • position: optional, Determines the horizontal position of the layer in its row in a default tree. By default, it uses the id, and layers/nodes are sorted in alphabetical order.

          `,14),n=[o];function l(r,h,d,p,u,c){return a(),t("div",null,n)}const g=e(s,[["render",l]]);export{y as __pageData,g as default}; diff --git a/assets/public_kronos_docs_trees-and-tree-customization.md.DZzDglty.lean.js b/assets/public_kronos_docs_trees-and-tree-customization.md.DNSPCGw2.lean.js similarity index 88% rename from assets/public_kronos_docs_trees-and-tree-customization.md.DZzDglty.lean.js rename to assets/public_kronos_docs_trees-and-tree-customization.md.DNSPCGw2.lean.js index e72f6a32..26927ae6 100644 --- a/assets/public_kronos_docs_trees-and-tree-customization.md.DZzDglty.lean.js +++ b/assets/public_kronos_docs_trees-and-tree-customization.md.DNSPCGw2.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Trees and tree customization","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/trees-and-tree-customization.md","filePath":"public/kronos/docs/trees-and-tree-customization.md","lastUpdated":1701136977000}'),s={name:"public/kronos/docs/trees-and-tree-customization.md"},o=i("",14),n=[o];function l(r,h,d,p,u,c){return a(),t("div",null,n)}const g=e(s,[["render",l]]);export{y as __pageData,g as default}; +import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Trees and tree customization","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/trees-and-tree-customization.md","filePath":"public/kronos/docs/trees-and-tree-customization.md","lastUpdated":1604787966000}'),s={name:"public/kronos/docs/trees-and-tree-customization.md"},o=i("",14),n=[o];function l(r,h,d,p,u,c){return a(),t("div",null,n)}const g=e(s,[["render",l]]);export{y as __pageData,g as default}; diff --git a/assets/public_kronos_docs_updating-tmt.md.B2tZSHuA.js b/assets/public_kronos_docs_updating-tmt.md.F3HiFsfM.js similarity index 97% rename from assets/public_kronos_docs_updating-tmt.md.B2tZSHuA.js rename to assets/public_kronos_docs_updating-tmt.md.F3HiFsfM.js index f1ac8d8e..f91ee69d 100644 --- a/assets/public_kronos_docs_updating-tmt.md.B2tZSHuA.js +++ b/assets/public_kronos_docs_updating-tmt.md.F3HiFsfM.js @@ -1 +1 @@ -import{_ as t,c as e,o,a9 as a}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Updating The Modding Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/updating-tmt.md","filePath":"public/kronos/docs/updating-tmt.md","lastUpdated":1701136977000}'),i={name:"public/kronos/docs/updating-tmt.md"},n=a('

          Updating The Modding Tree

          This tutorial assumes that you have used the Getting Started Tutorial, and are using Github Desktop and VSCode for your mod.

          Here's what you have to do when there's a TMT update:

          1. Look at the changelog. It will warn you if the update will break anything or require any changes. Decide if you want to try to update.

          2. Open Github Desktop, and at the top middle, click "fetch origin". This will make Github Desktop get information about the update.

          3. Click where it says "current branch: master" at the top middle, and at the bottom of the thing that appears, click "choose a branch to merge into master".

          4. Select upstream/master. It will likely say there are conflicts, but you have tools to resolve them. Click "Merge upstream/master into master".

          5. A conflict happens when the things you're trying to merge have both made changes in the same place. Click "open in Visual Studio Code" next to the first file.

          6. Scroll down through the file, and look for the parts highlighted in red and green. One of these is your code, and the other is some code that will be modified by the update. Do your best to try to edit things to keep the updated changes, but keep your content.

          7. Continue to do this for all remaining changes.

          8. Do any other changes required by the update, run the game, fix issues, etc.

          ',4),r=[n];function d(h,s,l,p,u,c){return o(),e("div",null,r)}const _=t(i,[["render",d]]);export{m as __pageData,_ as default}; +import{_ as t,c as e,o,a9 as a}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Updating The Modding Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/updating-tmt.md","filePath":"public/kronos/docs/updating-tmt.md","lastUpdated":1603745122000}'),i={name:"public/kronos/docs/updating-tmt.md"},n=a('

          Updating The Modding Tree

          This tutorial assumes that you have used the Getting Started Tutorial, and are using Github Desktop and VSCode for your mod.

          Here's what you have to do when there's a TMT update:

          1. Look at the changelog. It will warn you if the update will break anything or require any changes. Decide if you want to try to update.

          2. Open Github Desktop, and at the top middle, click "fetch origin". This will make Github Desktop get information about the update.

          3. Click where it says "current branch: master" at the top middle, and at the bottom of the thing that appears, click "choose a branch to merge into master".

          4. Select upstream/master. It will likely say there are conflicts, but you have tools to resolve them. Click "Merge upstream/master into master".

          5. A conflict happens when the things you're trying to merge have both made changes in the same place. Click "open in Visual Studio Code" next to the first file.

          6. Scroll down through the file, and look for the parts highlighted in red and green. One of these is your code, and the other is some code that will be modified by the update. Do your best to try to edit things to keep the updated changes, but keep your content.

          7. Continue to do this for all remaining changes.

          8. Do any other changes required by the update, run the game, fix issues, etc.

          ',4),r=[n];function d(h,s,l,p,u,c){return o(),e("div",null,r)}const _=t(i,[["render",d]]);export{m as __pageData,_ as default}; diff --git a/assets/public_kronos_docs_updating-tmt.md.B2tZSHuA.lean.js b/assets/public_kronos_docs_updating-tmt.md.F3HiFsfM.lean.js similarity index 86% rename from assets/public_kronos_docs_updating-tmt.md.B2tZSHuA.lean.js rename to assets/public_kronos_docs_updating-tmt.md.F3HiFsfM.lean.js index fc5a8b29..5d375ce7 100644 --- a/assets/public_kronos_docs_updating-tmt.md.B2tZSHuA.lean.js +++ b/assets/public_kronos_docs_updating-tmt.md.F3HiFsfM.lean.js @@ -1 +1 @@ -import{_ as t,c as e,o,a9 as a}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Updating The Modding Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/updating-tmt.md","filePath":"public/kronos/docs/updating-tmt.md","lastUpdated":1701136977000}'),i={name:"public/kronos/docs/updating-tmt.md"},n=a("",4),r=[n];function d(h,s,l,p,u,c){return o(),e("div",null,r)}const _=t(i,[["render",d]]);export{m as __pageData,_ as default}; +import{_ as t,c as e,o,a9 as a}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Updating The Modding Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/updating-tmt.md","filePath":"public/kronos/docs/updating-tmt.md","lastUpdated":1603745122000}'),i={name:"public/kronos/docs/updating-tmt.md"},n=a("",4),r=[n];function d(h,s,l,p,u,c){return o(),e("div",null,r)}const _=t(i,[["render",d]]);export{m as __pageData,_ as default}; diff --git a/assets/public_kronos_docs_upgrades.md.5OAqntPP.js b/assets/public_kronos_docs_upgrades.md.CwGnjpZF.js similarity index 98% rename from assets/public_kronos_docs_upgrades.md.5OAqntPP.js rename to assets/public_kronos_docs_upgrades.md.CwGnjpZF.js index 143039ff..d945a935 100644 --- a/assets/public_kronos_docs_upgrades.md.5OAqntPP.js +++ b/assets/public_kronos_docs_upgrades.md.CwGnjpZF.js @@ -1,4 +1,4 @@ -import{_ as e,c as t,o as s,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Upgrades","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/upgrades.md","filePath":"public/kronos/docs/upgrades.md","lastUpdated":1701136977000}'),i={name:"public/kronos/docs/upgrades.md"},n=a(`

          Upgrades

          Useful functions for dealing with Upgrades and implementing their effects:

          • hasUpgrade(layer, id): determine if the player has the upgrade
          • upgradeEffect(layer, id): Returns the current effects of the upgrade, if any
          • buyUpgrade(layer, id): Buys an upgrade directly (if affordable)

          Hint: Basic point gain is calculated in mod.js's "getPointGen" function.

          Upgrades are stored in the following format:

          js
          upgrades: {
          +import{_ as e,c as t,o as s,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Upgrades","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/upgrades.md","filePath":"public/kronos/docs/upgrades.md","lastUpdated":1620884680000}'),i={name:"public/kronos/docs/upgrades.md"},n=a(`

          Upgrades

          Useful functions for dealing with Upgrades and implementing their effects:

          • hasUpgrade(layer, id): determine if the player has the upgrade
          • upgradeEffect(layer, id): Returns the current effects of the upgrade, if any
          • buyUpgrade(layer, id): Buys an upgrade directly (if affordable)

          Hint: Basic point gain is calculated in mod.js's "getPointGen" function.

          Upgrades are stored in the following format:

          js
          upgrades: {
               11: {
                   description: "Blah",
                   cost: new Decimal(100),
          diff --git a/assets/public_kronos_docs_upgrades.md.5OAqntPP.lean.js b/assets/public_kronos_docs_upgrades.md.CwGnjpZF.lean.js
          similarity index 86%
          rename from assets/public_kronos_docs_upgrades.md.5OAqntPP.lean.js
          rename to assets/public_kronos_docs_upgrades.md.CwGnjpZF.lean.js
          index 934a6e3f..ad9bb791 100644
          --- a/assets/public_kronos_docs_upgrades.md.5OAqntPP.lean.js
          +++ b/assets/public_kronos_docs_upgrades.md.CwGnjpZF.lean.js
          @@ -1 +1 @@
          -import{_ as e,c as t,o as s,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Upgrades","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/upgrades.md","filePath":"public/kronos/docs/upgrades.md","lastUpdated":1701136977000}'),i={name:"public/kronos/docs/upgrades.md"},n=a("",13),r=[n];function l(o,p,h,u,d,c){return s(),t("div",null,r)}const y=e(i,[["render",l]]);export{f as __pageData,y as default};
          +import{_ as e,c as t,o as s,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Upgrades","description":"","frontmatter":{},"headers":[],"relativePath":"public/kronos/docs/upgrades.md","filePath":"public/kronos/docs/upgrades.md","lastUpdated":1620884680000}'),i={name:"public/kronos/docs/upgrades.md"},n=a("",13),r=[n];function l(o,p,h,u,d,c){return s(),t("div",null,r)}const y=e(i,[["render",l]]);export{f as __pageData,y as default};
          diff --git a/assets/public_lit_Old Things_2.0-format-changes.md.y8RAczqh.js b/assets/public_lit_Old Things_2.0-format-changes.md.C-yzF1yi.js
          similarity index 97%
          rename from assets/public_lit_Old Things_2.0-format-changes.md.y8RAczqh.js
          rename to assets/public_lit_Old Things_2.0-format-changes.md.C-yzF1yi.js
          index 61d65ed1..2302c89d 100644
          --- a/assets/public_lit_Old Things_2.0-format-changes.md.y8RAczqh.js	
          +++ b/assets/public_lit_Old Things_2.0-format-changes.md.C-yzF1yi.js	
          @@ -1 +1 @@
          -import{_ as e,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"2.0 format changes","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/Old Things/2.0-format-changes.md","filePath":"public/lit/Old Things/2.0-format-changes.md","lastUpdated":1701137263000}'),l={name:"public/lit/Old Things/2.0-format-changes.md"},n=i('

          2.0 format changes

          • Temp format is changed from temp.something[layer] to temp[layer].something, for consistency
          • Challenges are now saved as an object with the amount of completions in each spot. (This will break saves.)
          • effectDisplay in Challenges and Upgrades no longer takes an argument, and neither does effect for Buyables
          • Buyable cost can take an argument for amount of buyables, but it needs to function if no argument is supplied (it should do the cost for the next purchase).
          • Generation of Points now happens in the main game loop (not in a layer update function), enabled by canGenPoints in game.js.
          • Changed fullLayerReset to layerDataReset, which takes an array of names of values to keep

          In addition, many names were changed, mostly expanding abbreviations:

          All instances of:

          • chall -> challenge
          • unl -> unlocked
          • upg -> upgrade (besides CSS)
          • amt -> amount
          • desc -> description
          • resCeil -> roundUpCost
          • order -> unlockOrder
          • incr_order -> increaseUnlockOrder

          Challenges:

          • desc -> challengeDescription
          • reward -> rewardDescription
          • effect -> rewardEffect
          • effectDisplay -> rewardDisplay
          • active -> challengeActive
          ',7),o=[n];function s(c,r,d,h,g,p){return t(),a("div",null,o)}const u=e(l,[["render",s]]);export{m as __pageData,u as default}; +import{_ as e,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"2.0 format changes","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/Old Things/2.0-format-changes.md","filePath":"public/lit/Old Things/2.0-format-changes.md","lastUpdated":1607827402000}'),l={name:"public/lit/Old Things/2.0-format-changes.md"},n=i('

          2.0 format changes

          • Temp format is changed from temp.something[layer] to temp[layer].something, for consistency
          • Challenges are now saved as an object with the amount of completions in each spot. (This will break saves.)
          • effectDisplay in Challenges and Upgrades no longer takes an argument, and neither does effect for Buyables
          • Buyable cost can take an argument for amount of buyables, but it needs to function if no argument is supplied (it should do the cost for the next purchase).
          • Generation of Points now happens in the main game loop (not in a layer update function), enabled by canGenPoints in game.js.
          • Changed fullLayerReset to layerDataReset, which takes an array of names of values to keep

          In addition, many names were changed, mostly expanding abbreviations:

          All instances of:

          • chall -> challenge
          • unl -> unlocked
          • upg -> upgrade (besides CSS)
          • amt -> amount
          • desc -> description
          • resCeil -> roundUpCost
          • order -> unlockOrder
          • incr_order -> increaseUnlockOrder

          Challenges:

          • desc -> challengeDescription
          • reward -> rewardDescription
          • effect -> rewardEffect
          • effectDisplay -> rewardDisplay
          • active -> challengeActive
          ',7),o=[n];function s(c,r,d,h,g,p){return t(),a("div",null,o)}const u=e(l,[["render",s]]);export{m as __pageData,u as default}; diff --git a/assets/public_lit_Old Things_2.0-format-changes.md.y8RAczqh.lean.js b/assets/public_lit_Old Things_2.0-format-changes.md.C-yzF1yi.lean.js similarity index 87% rename from assets/public_lit_Old Things_2.0-format-changes.md.y8RAczqh.lean.js rename to assets/public_lit_Old Things_2.0-format-changes.md.C-yzF1yi.lean.js index dfb6a251..a8a047a4 100644 --- a/assets/public_lit_Old Things_2.0-format-changes.md.y8RAczqh.lean.js +++ b/assets/public_lit_Old Things_2.0-format-changes.md.C-yzF1yi.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"2.0 format changes","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/Old Things/2.0-format-changes.md","filePath":"public/lit/Old Things/2.0-format-changes.md","lastUpdated":1701137263000}'),l={name:"public/lit/Old Things/2.0-format-changes.md"},n=i("",7),o=[n];function s(c,r,d,h,g,p){return t(),a("div",null,o)}const u=e(l,[["render",s]]);export{m as __pageData,u as default}; +import{_ as e,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"2.0 format changes","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/Old Things/2.0-format-changes.md","filePath":"public/lit/Old Things/2.0-format-changes.md","lastUpdated":1607827402000}'),l={name:"public/lit/Old Things/2.0-format-changes.md"},n=i("",7),o=[n];function s(c,r,d,h,g,p){return t(),a("div",null,o)}const u=e(l,[["render",s]]);export{m as __pageData,u as default}; diff --git a/assets/public_lit_changelog.md.Dj7fgFUm.js b/assets/public_lit_changelog.md.O4pzFPx8.js similarity index 99% rename from assets/public_lit_changelog.md.Dj7fgFUm.js rename to assets/public_lit_changelog.md.O4pzFPx8.js index 263766b4..510ae583 100644 --- a/assets/public_lit_changelog.md.Dj7fgFUm.js +++ b/assets/public_lit_changelog.md.O4pzFPx8.js @@ -1 +1 @@ -import{_ as e,c as i,o as a,a9 as l}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"The Modding Tree changelog:","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/changelog.md","filePath":"public/lit/changelog.md","lastUpdated":1701137263000}'),t={name:"public/lit/changelog.md"},o=l('

          The Modding Tree changelog:

          v2.π: Incrementally Updated - 2/5/21

          • Performance improvements.
          • Fixed tooltips overlapping with the top display.
          • Clicking a popup dismisses it immediately.
          • Added support for bulk challenge completions.
          • "Best" is updated automatically.
          • Fixed keeping Decimal values on reset.
          • Code reorganization and style improvements by fudo.

          v2.3.5 - 12/21/20

          • Added resetTime, which tracks the time since a layer prestiged or was reset.
          • A layer node will be highlighted red if one of its subtabs is highlighted red.
          • Fixed issues with keeping challenges, buyables, and clickables on reset.
          • Improved the unlocking of custom layers.
          • Other minor fixes.

          v2.3.4 - 12/16/20

          • Added a node image feature.
          • Resource display now always shows the amount of the currency the layer's gain is based on.
          • Added spacing between tree nodes.
          • Another attempt to fix tooltip flickering.

          v2.3.3 - 12/13/20

          • Fixed the first node in a row always taking up space.
          • layerShown is now optional.
          • All prestige types can now use features for custom prestige types.

          v2.3.2 - 12/13/20

          • Fixed achievement/milestone popups.

          v2.3.1 - 12/12/20

          • Another attempt to fix flickering tooltips.
          • The "this" keyword should work everywhere except tabFormat arrays (although I may have missed some things).
          • Fixed tree branches not updating when scrolling on the right-side tab.
          • Fixed a spacing issue when a node's symbol is ""
          • Removed some old, unneeded files.

          v2.3: Cooler and Newer Edition - 12/10/20

          • Added achievement/milestone popups (thank you to Jacorb for this contribution!)
          • The changelog tab is back, and can be set in mod.js.
          • Layer nodes and respec buttons will not be clicked by pressing "enter".
          • Possible fix for flickering tooltips and strange transitions.
          • The victory screen text is configurable.
          • Added image and textStyle features to achievements.
          • Added an argument to use specific rows in an "upgrades" component.
          • Fixed the comma appearing in the main display when there was no effectDescription
          • Added the ability to easily make a tab that is a collection of layers in subtabs.
          • Improved spacing for embedding layers with subtabs into subtabs.

          v2.2.8 - 12/03/20

          • Double-clicking a layer node brings you to the main subtab for that layer.
          • Attempted to fix challenges visually updating a different way.
          • Added a softcap function for use in formulas.
          • Added displayRow feature, which lets layers be shown somewhere separate from where they are in the reset order (e.g. side layers)
          • Fixed autoupgrade issue.

          v2.2.7 - 11/30/20

          • Added autoUpgrade feature.
          • resource-display now shows resource gain per second if passiveGain is active.
          • Fixed formatting issues on some large numbers.
          • Better support for using classed objects in player and in layers/tmp.
          • Made hard resetting more effective.
          • Removed Herobrine from getStartClickables.

          v2.2.6 - 11/30/20

          • Added goalDescription for challenges and made the new "canComplete" system the standard.
          • Another attempt to fix challenges not visually updating.
          • Fixed side layers not appearing.
          • Fixed getStartClickables again.

          v2.2.5 - 11/29/20

          • Added features for overriding the displays and costs/goals of upgrades and challenges to make them fully custom.
          • best, total, and unlocked are always automatically added to layerData (but best and total will only display if you add them yourself).
          • Fixed getStartClickables.

          v2.2.4 - 11/28/20

          • Added softcap and softcapPower features (for Normal layers)
          • Offline time limit and default max tick length were fixed (previously the limits were 1000x too large)
          • Added fixOldSaves.
          • You can use HTML in main-display.
          • Fixed a number of minor oddities.

          v2.2.3 - 11/28/20

          • Layers will be highlighted if you can finish a challenge.
          • The "can complete challenge" color now overrides the "already completed" color.
          • Button nodes now work as side "layers".
          • Setting a tooltip to "" hides it entirely.

          v2.2.2 - 11/22/20

          • Fixed right half of the screen being unclickable in some circumstances.
          • Fixed tree branches being offset.
          • Fix to lastSafeTab.

          v2.2.1 - 11/7/20

          • Added a small highlight to layers you can meaningfully prestige on.
          • Added passiveGeneration and autoPrestige features to standardize prestige automation. (The old ways still work, but the new ones work better with other things)
          • Improved milestones visually a bit.
          • "best" and "total" are now only displayed if present in startData.
          • Fixed issues with things not updating visually. (Thank you to to Jacorb!)
          • Side layers and button nodes can now be highlighted.
          • Updated docs on the new tree-related features.

          v2.2: Uprooted - 11/7/20

          • You can now embed a layer inside of a subtab or microtab!
          • Added support for hiding or reformatting the tree tab
          • Added non-layer button nodes
          • Added shouldNotify to subtab/microtab buttons. (You can make them highlighted)
          • Added commas to large exponents.
          • Upgrades now only show "currently" if they have an effectDisplay (so not for constant effects).
          • Achievements are part of the default tab format.
          • NaN is now handled more intelligently.
          • Renamed files, and moved less relevant ones to another folder.
          • The "hide completed challenges" setting now only hides challenges at max completions.
          • Thank you to thepaperpilot for fixing errors in docs and improving the infobox appearance!
          • Many other minor fixes.

          v2.1.4 - 10/25/20

          • Added an infobox component. Thank you to thepaperpilot for this contribution!
          • Layer type is now optional, and defaults to "none".
          • Improved the look of bars and tab buttons.
          • Improved spacing between layer nodes (also thanks to thepaperpilot!)
          • Fixed the "blank" component breaking if only specifying the height.
          • Fixed some numbers not displaying with enough digits.
          • Made a few more things able to be functions.
          • A few other minor fixes.

          v2.1.3.1 - 10/21/20

          • Fixed the update function.

          v2.1.3 - 10/21/20

          • gainMult and gainExp are now optional.
          • Layer unlocking is now kept on reset.
          • Game should start up faster.
          • Layer updates now have a determined order and starts with earlier-rowed layers.
          • Automation now has a determined order and starts with later-rowed layers.
          • Fixed issues with resetting clickables and challenges.
          • Commas should no longer appear in the decimal places of a number.
          • Fixed potential issue in displaying the tree.

          v2.1.2 - 10/19/20

          • Added buyUpgrade function (buyUpg still works though)
          • Added author name to modInfo.
          • Fix to crash caused when the name of a subtab or microtab is changed.
          • Fixes to outdated information in docs.
          • Improvements to Discord links.
          • Thank you to thepaperpilot for contributing to this update!

          v2.1.1 - 10/17/20

          • Added resource-display component, which displays the base currency for the prestige layer, as well as the best and/or total of this layer's prestige currency.
          • Fixed the value for the base currency not updating in resource-display.

          v2.1: We should have thought of this sooner! - 10/17/20

          • Moved most of the code users will want to edit to mod.js, added documentation for it.
            • Specifically, modInfo, VERSION, canGenPoints, getPointGen, and maxTickLength
          • Added getStartPoints()
          • Added the ability to store non-layer-related data
          • Added the ability to display more things at the top of the tree tab below points.
          • Made the endgame condition customizable
          • Added "sell one" and "sell all" buttons for buyables.
          • Moved the old "game" to demo.js, and replaced it with a minimal game that won't cause issues when edited.
          • Fixed issues with version number
          • Fixed number formatting issue making things like "10e9" appear.

          v2.0.5 - 10/16/20

          • Made more features (including prestige parameters) able to be dynamic.
          • Layer nodes can be hidden but still take up space with "ghost" visibility
          • Added clickableEffect for real.
          • Fixed some visual issues with bars.
          • A few other minor tweaks and improvements.

          v2.0.4 - 10/16/20

          • Fixed HTML on buttons interfering with clicking on them.

          v2.0.3 - 10/16/20

          • Fixed hotkeys not displaying in info.
          • Fixed the game supressing all external hotkeys.
          • You can use more things as currencies for upgrade costs and challenge goals using currencyLocation.
          • Added maxTickLength, which can be used to prevent offline time or tab-switching from breaking time-limit based mechanics.
          • Made buyable respec buttons and clickable "master" buttons their own components, and gave them a hide/show feature.
          • Added a general "tooltip" feature for achievements.

          v2.0.2 - 10/15/20

          • Branches are now dynamic (they can be functions).
          • Fixed a crash related to offline time.
          • Fixed links being too wide.

          v2.0.1 - 10/15/20

          • Fixed side layers appearing multiple times.

          v2.0: The Pinnacle of Achievement Mountain - 10/15/20

          • Added progress bars, which are highly customizable and can be horizontal or vertical!
          • Added "side layers", displayed smaller and off to the side, and don't get reset by default. They can be used for global achievements and statistics. Speaking of which...
          • Added achievements!
          • Added clickables, a more generalized variant of buyables.
          • Almost every value in layer data can be either a function or a constant value!
          • Added support for multiple completions of challenges.
          • Added "none" prestige type, which removes the need for any other prestige-related features.
          • The points display and other gui elements stay at the top of the screen when the tree scrolls.
          • Added getter/setter functions for the amounts and effects of most Big Features
          • Moved modInfo to game.js, added a spot in modInfo for a Discord link, changelog link. Also added a separate mod version from the TMT version in VERSION.
          • Tree structure is based on layer data, no index.html editing is needed.
          • Tmp does not need to be manually updated.
          • You don't have to have the same amount of upgrades in every row (and challs and buyables)
          • "unlocked" is optional for all Big Components (defaults to true).
          • All displays will update correctly.
          • Changelog is no longer in index.html at all.
          • Generation of Points now happens in the main game loop
          • Changed the reset functions to make keeping things easier
          • Renamed many things to increase readability (see the list in the link below)
          • Improved documentation based on feedback

          v1.3.5:

          • Completely automated convertToDecimal, now you never have to worry about it again.
          • Branches can be defined without a color id. But they can also use hex values for color ids!
          • Created a tutorial for getting started with TMT and Github.
          • Page title is now automatically taken from mod name.

          v1.3.4 - 10/8/20

          • Added "midsection" feature to add things to a tab's layout while still keeping the standard layout.
          • Fix for being able to buy more buyables than you should.

          v1.3.3 - 10/7/20

          • Fix for the "order of operations" issue in temp.

          v1.3.1 - 10/7/20

          • Added custom CSS and tooltips for Layer Nodes.
          • Added custom CSS for upgrades, buyables, milestones, and challenges, both individually and layer-wide.
          • You can now use HTML in most display text!
          • You can now make milestones unlockable and not display immediately.
          • Fixed importing saves, and issue with upgrades not appearing, and probably more.
          • Optional "name" layer feature, used in confirmation messages.

          v1.3: Tabception... ception! - 10/7/20

          • Added subtabs! And also a Micro-tab component to let you make smaller subtab-esque areas anywhere.
          • Added a "custom" prestige formula type, and a number of features to support it.
          • Added points/sec display (can be disabled).
          • Added h-line, v-line and image-display components, plus components for individual upgrades, challenges, and milestones.
          • Added upgEffect, buyableEffect, and challEffect functions.
          • Added "hide completed challenges" setting.
          • Moved old changelogs to a separate place.
          • Fixed hasMilestone and incr_order.
          • Static layers now show the currency amount needed for the next one if you can buy max.

          v1.2.4 - 10/4/20

          • Layers are now highlighted if you can buy an upgrade, and a new feature, shouldNotify, lets you make it highlight other ways.
          • Fixed bugs with hasUpg, hasChall, hasMilestone, and inChallenge.
          • Changed the sample code to use the above functions for convenience.

          v1.2.3 - 10/3/20

          • Added a row component, which displays a list of objects in a row.
          • Added a column component, which displays a list of objects in a column (useful within a row).
          • Changed blanks to have a customizable width and height.

          v1.2: This Changes Everything! - 10/3/20

          • Many layer features can now be static values or functions. (This made some formats change, which will break old things)
          • You can now use the "this" keyword, to make code easier to transfer when making new layers.
          • Also added "this.layer", which is the current layer's name, and works on existing subfeatures (e.g. individual upgrades) as well! Subfeatures also have "this.id".
          • Fixed a big save issue. If you use a unique mod id, your save will never conflict with other mods.
          • Added a configurable offline time limit in modinfo at the top of index.html. (default 1 hour)
          • Added a few minor features, and updated the docs with new information.

          v1.1.1:

          • You can define hotkeys directly from layer config.

          v1.1: Enhanced Edition

          • Added "Buyables", which can function like Space Buildings or Enhancers.
          • Custom CSS can now be used on any component! Make the third argument an object with CSS parameters.
          • Lots of minor good things.

          v1.0:

          • First release.
          ',79),n=[o];function s(r,d,h,u,c,m){return a(),i("div",null,n)}const p=e(t,[["render",s]]);export{b as __pageData,p as default}; +import{_ as e,c as i,o as a,a9 as l}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"The Modding Tree changelog:","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/changelog.md","filePath":"public/lit/changelog.md","lastUpdated":1664930832000}'),t={name:"public/lit/changelog.md"},o=l('

          The Modding Tree changelog:

          v2.π: Incrementally Updated - 2/5/21

          • Performance improvements.
          • Fixed tooltips overlapping with the top display.
          • Clicking a popup dismisses it immediately.
          • Added support for bulk challenge completions.
          • "Best" is updated automatically.
          • Fixed keeping Decimal values on reset.
          • Code reorganization and style improvements by fudo.

          v2.3.5 - 12/21/20

          • Added resetTime, which tracks the time since a layer prestiged or was reset.
          • A layer node will be highlighted red if one of its subtabs is highlighted red.
          • Fixed issues with keeping challenges, buyables, and clickables on reset.
          • Improved the unlocking of custom layers.
          • Other minor fixes.

          v2.3.4 - 12/16/20

          • Added a node image feature.
          • Resource display now always shows the amount of the currency the layer's gain is based on.
          • Added spacing between tree nodes.
          • Another attempt to fix tooltip flickering.

          v2.3.3 - 12/13/20

          • Fixed the first node in a row always taking up space.
          • layerShown is now optional.
          • All prestige types can now use features for custom prestige types.

          v2.3.2 - 12/13/20

          • Fixed achievement/milestone popups.

          v2.3.1 - 12/12/20

          • Another attempt to fix flickering tooltips.
          • The "this" keyword should work everywhere except tabFormat arrays (although I may have missed some things).
          • Fixed tree branches not updating when scrolling on the right-side tab.
          • Fixed a spacing issue when a node's symbol is ""
          • Removed some old, unneeded files.

          v2.3: Cooler and Newer Edition - 12/10/20

          • Added achievement/milestone popups (thank you to Jacorb for this contribution!)
          • The changelog tab is back, and can be set in mod.js.
          • Layer nodes and respec buttons will not be clicked by pressing "enter".
          • Possible fix for flickering tooltips and strange transitions.
          • The victory screen text is configurable.
          • Added image and textStyle features to achievements.
          • Added an argument to use specific rows in an "upgrades" component.
          • Fixed the comma appearing in the main display when there was no effectDescription
          • Added the ability to easily make a tab that is a collection of layers in subtabs.
          • Improved spacing for embedding layers with subtabs into subtabs.

          v2.2.8 - 12/03/20

          • Double-clicking a layer node brings you to the main subtab for that layer.
          • Attempted to fix challenges visually updating a different way.
          • Added a softcap function for use in formulas.
          • Added displayRow feature, which lets layers be shown somewhere separate from where they are in the reset order (e.g. side layers)
          • Fixed autoupgrade issue.

          v2.2.7 - 11/30/20

          • Added autoUpgrade feature.
          • resource-display now shows resource gain per second if passiveGain is active.
          • Fixed formatting issues on some large numbers.
          • Better support for using classed objects in player and in layers/tmp.
          • Made hard resetting more effective.
          • Removed Herobrine from getStartClickables.

          v2.2.6 - 11/30/20

          • Added goalDescription for challenges and made the new "canComplete" system the standard.
          • Another attempt to fix challenges not visually updating.
          • Fixed side layers not appearing.
          • Fixed getStartClickables again.

          v2.2.5 - 11/29/20

          • Added features for overriding the displays and costs/goals of upgrades and challenges to make them fully custom.
          • best, total, and unlocked are always automatically added to layerData (but best and total will only display if you add them yourself).
          • Fixed getStartClickables.

          v2.2.4 - 11/28/20

          • Added softcap and softcapPower features (for Normal layers)
          • Offline time limit and default max tick length were fixed (previously the limits were 1000x too large)
          • Added fixOldSaves.
          • You can use HTML in main-display.
          • Fixed a number of minor oddities.

          v2.2.3 - 11/28/20

          • Layers will be highlighted if you can finish a challenge.
          • The "can complete challenge" color now overrides the "already completed" color.
          • Button nodes now work as side "layers".
          • Setting a tooltip to "" hides it entirely.

          v2.2.2 - 11/22/20

          • Fixed right half of the screen being unclickable in some circumstances.
          • Fixed tree branches being offset.
          • Fix to lastSafeTab.

          v2.2.1 - 11/7/20

          • Added a small highlight to layers you can meaningfully prestige on.
          • Added passiveGeneration and autoPrestige features to standardize prestige automation. (The old ways still work, but the new ones work better with other things)
          • Improved milestones visually a bit.
          • "best" and "total" are now only displayed if present in startData.
          • Fixed issues with things not updating visually. (Thank you to to Jacorb!)
          • Side layers and button nodes can now be highlighted.
          • Updated docs on the new tree-related features.

          v2.2: Uprooted - 11/7/20

          • You can now embed a layer inside of a subtab or microtab!
          • Added support for hiding or reformatting the tree tab
          • Added non-layer button nodes
          • Added shouldNotify to subtab/microtab buttons. (You can make them highlighted)
          • Added commas to large exponents.
          • Upgrades now only show "currently" if they have an effectDisplay (so not for constant effects).
          • Achievements are part of the default tab format.
          • NaN is now handled more intelligently.
          • Renamed files, and moved less relevant ones to another folder.
          • The "hide completed challenges" setting now only hides challenges at max completions.
          • Thank you to thepaperpilot for fixing errors in docs and improving the infobox appearance!
          • Many other minor fixes.

          v2.1.4 - 10/25/20

          • Added an infobox component. Thank you to thepaperpilot for this contribution!
          • Layer type is now optional, and defaults to "none".
          • Improved the look of bars and tab buttons.
          • Improved spacing between layer nodes (also thanks to thepaperpilot!)
          • Fixed the "blank" component breaking if only specifying the height.
          • Fixed some numbers not displaying with enough digits.
          • Made a few more things able to be functions.
          • A few other minor fixes.

          v2.1.3.1 - 10/21/20

          • Fixed the update function.

          v2.1.3 - 10/21/20

          • gainMult and gainExp are now optional.
          • Layer unlocking is now kept on reset.
          • Game should start up faster.
          • Layer updates now have a determined order and starts with earlier-rowed layers.
          • Automation now has a determined order and starts with later-rowed layers.
          • Fixed issues with resetting clickables and challenges.
          • Commas should no longer appear in the decimal places of a number.
          • Fixed potential issue in displaying the tree.

          v2.1.2 - 10/19/20

          • Added buyUpgrade function (buyUpg still works though)
          • Added author name to modInfo.
          • Fix to crash caused when the name of a subtab or microtab is changed.
          • Fixes to outdated information in docs.
          • Improvements to Discord links.
          • Thank you to thepaperpilot for contributing to this update!

          v2.1.1 - 10/17/20

          • Added resource-display component, which displays the base currency for the prestige layer, as well as the best and/or total of this layer's prestige currency.
          • Fixed the value for the base currency not updating in resource-display.

          v2.1: We should have thought of this sooner! - 10/17/20

          • Moved most of the code users will want to edit to mod.js, added documentation for it.
            • Specifically, modInfo, VERSION, canGenPoints, getPointGen, and maxTickLength
          • Added getStartPoints()
          • Added the ability to store non-layer-related data
          • Added the ability to display more things at the top of the tree tab below points.
          • Made the endgame condition customizable
          • Added "sell one" and "sell all" buttons for buyables.
          • Moved the old "game" to demo.js, and replaced it with a minimal game that won't cause issues when edited.
          • Fixed issues with version number
          • Fixed number formatting issue making things like "10e9" appear.

          v2.0.5 - 10/16/20

          • Made more features (including prestige parameters) able to be dynamic.
          • Layer nodes can be hidden but still take up space with "ghost" visibility
          • Added clickableEffect for real.
          • Fixed some visual issues with bars.
          • A few other minor tweaks and improvements.

          v2.0.4 - 10/16/20

          • Fixed HTML on buttons interfering with clicking on them.

          v2.0.3 - 10/16/20

          • Fixed hotkeys not displaying in info.
          • Fixed the game supressing all external hotkeys.
          • You can use more things as currencies for upgrade costs and challenge goals using currencyLocation.
          • Added maxTickLength, which can be used to prevent offline time or tab-switching from breaking time-limit based mechanics.
          • Made buyable respec buttons and clickable "master" buttons their own components, and gave them a hide/show feature.
          • Added a general "tooltip" feature for achievements.

          v2.0.2 - 10/15/20

          • Branches are now dynamic (they can be functions).
          • Fixed a crash related to offline time.
          • Fixed links being too wide.

          v2.0.1 - 10/15/20

          • Fixed side layers appearing multiple times.

          v2.0: The Pinnacle of Achievement Mountain - 10/15/20

          • Added progress bars, which are highly customizable and can be horizontal or vertical!
          • Added "side layers", displayed smaller and off to the side, and don't get reset by default. They can be used for global achievements and statistics. Speaking of which...
          • Added achievements!
          • Added clickables, a more generalized variant of buyables.
          • Almost every value in layer data can be either a function or a constant value!
          • Added support for multiple completions of challenges.
          • Added "none" prestige type, which removes the need for any other prestige-related features.
          • The points display and other gui elements stay at the top of the screen when the tree scrolls.
          • Added getter/setter functions for the amounts and effects of most Big Features
          • Moved modInfo to game.js, added a spot in modInfo for a Discord link, changelog link. Also added a separate mod version from the TMT version in VERSION.
          • Tree structure is based on layer data, no index.html editing is needed.
          • Tmp does not need to be manually updated.
          • You don't have to have the same amount of upgrades in every row (and challs and buyables)
          • "unlocked" is optional for all Big Components (defaults to true).
          • All displays will update correctly.
          • Changelog is no longer in index.html at all.
          • Generation of Points now happens in the main game loop
          • Changed the reset functions to make keeping things easier
          • Renamed many things to increase readability (see the list in the link below)
          • Improved documentation based on feedback

          v1.3.5:

          • Completely automated convertToDecimal, now you never have to worry about it again.
          • Branches can be defined without a color id. But they can also use hex values for color ids!
          • Created a tutorial for getting started with TMT and Github.
          • Page title is now automatically taken from mod name.

          v1.3.4 - 10/8/20

          • Added "midsection" feature to add things to a tab's layout while still keeping the standard layout.
          • Fix for being able to buy more buyables than you should.

          v1.3.3 - 10/7/20

          • Fix for the "order of operations" issue in temp.

          v1.3.1 - 10/7/20

          • Added custom CSS and tooltips for Layer Nodes.
          • Added custom CSS for upgrades, buyables, milestones, and challenges, both individually and layer-wide.
          • You can now use HTML in most display text!
          • You can now make milestones unlockable and not display immediately.
          • Fixed importing saves, and issue with upgrades not appearing, and probably more.
          • Optional "name" layer feature, used in confirmation messages.

          v1.3: Tabception... ception! - 10/7/20

          • Added subtabs! And also a Micro-tab component to let you make smaller subtab-esque areas anywhere.
          • Added a "custom" prestige formula type, and a number of features to support it.
          • Added points/sec display (can be disabled).
          • Added h-line, v-line and image-display components, plus components for individual upgrades, challenges, and milestones.
          • Added upgEffect, buyableEffect, and challEffect functions.
          • Added "hide completed challenges" setting.
          • Moved old changelogs to a separate place.
          • Fixed hasMilestone and incr_order.
          • Static layers now show the currency amount needed for the next one if you can buy max.

          v1.2.4 - 10/4/20

          • Layers are now highlighted if you can buy an upgrade, and a new feature, shouldNotify, lets you make it highlight other ways.
          • Fixed bugs with hasUpg, hasChall, hasMilestone, and inChallenge.
          • Changed the sample code to use the above functions for convenience.

          v1.2.3 - 10/3/20

          • Added a row component, which displays a list of objects in a row.
          • Added a column component, which displays a list of objects in a column (useful within a row).
          • Changed blanks to have a customizable width and height.

          v1.2: This Changes Everything! - 10/3/20

          • Many layer features can now be static values or functions. (This made some formats change, which will break old things)
          • You can now use the "this" keyword, to make code easier to transfer when making new layers.
          • Also added "this.layer", which is the current layer's name, and works on existing subfeatures (e.g. individual upgrades) as well! Subfeatures also have "this.id".
          • Fixed a big save issue. If you use a unique mod id, your save will never conflict with other mods.
          • Added a configurable offline time limit in modinfo at the top of index.html. (default 1 hour)
          • Added a few minor features, and updated the docs with new information.

          v1.1.1:

          • You can define hotkeys directly from layer config.

          v1.1: Enhanced Edition

          • Added "Buyables", which can function like Space Buildings or Enhancers.
          • Custom CSS can now be used on any component! Make the third argument an object with CSS parameters.
          • Lots of minor good things.

          v1.0:

          • First release.
          ',79),n=[o];function s(r,d,h,u,c,m){return a(),i("div",null,n)}const p=e(t,[["render",s]]);export{b as __pageData,p as default}; diff --git a/assets/public_lit_changelog.md.Dj7fgFUm.lean.js b/assets/public_lit_changelog.md.O4pzFPx8.lean.js similarity index 85% rename from assets/public_lit_changelog.md.Dj7fgFUm.lean.js rename to assets/public_lit_changelog.md.O4pzFPx8.lean.js index f112b2e7..23efea97 100644 --- a/assets/public_lit_changelog.md.Dj7fgFUm.lean.js +++ b/assets/public_lit_changelog.md.O4pzFPx8.lean.js @@ -1 +1 @@ -import{_ as e,c as i,o as a,a9 as l}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"The Modding Tree changelog:","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/changelog.md","filePath":"public/lit/changelog.md","lastUpdated":1701137263000}'),t={name:"public/lit/changelog.md"},o=l("",79),n=[o];function s(r,d,h,u,c,m){return a(),i("div",null,n)}const p=e(t,[["render",s]]);export{b as __pageData,p as default}; +import{_ as e,c as i,o as a,a9 as l}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"The Modding Tree changelog:","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/changelog.md","filePath":"public/lit/changelog.md","lastUpdated":1664930832000}'),t={name:"public/lit/changelog.md"},o=l("",79),n=[o];function s(r,d,h,u,c,m){return a(),i("div",null,n)}const p=e(t,[["render",s]]);export{b as __pageData,p as default}; diff --git a/assets/public_lit_docs_!general-info.md.CDTQvlu3.js b/assets/public_lit_docs_!general-info.md.Bx73xrHN.js similarity index 99% rename from assets/public_lit_docs_!general-info.md.CDTQvlu3.js rename to assets/public_lit_docs_!general-info.md.Bx73xrHN.js index 058218d5..c8205635 100644 --- a/assets/public_lit_docs_!general-info.md.CDTQvlu3.js +++ b/assets/public_lit_docs_!general-info.md.Bx73xrHN.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"The-Modding-Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/!general-info.md","filePath":"public/lit/docs/!general-info.md","lastUpdated":1701137263000}'),n={name:"public/lit/docs/!general-info.md"},r=o('

          The-Modding-Tree

          The main way to add content is through creating layers. You can either add a layer directly in the layers object in layerSupport.js, or declare it in another file and register it by calling addLayer(layername, layerdata). There is an example layer registration in layers.js showing the recommended method. It is just an example and can be freely deleted. You can also use it as a reference or a base for your own layers.

          The first thing you need to do is fill out the modInfo object at the top of mod.js to set your mod's name, ID (a string), and other information. A unique modId will prevent your mod's saves from conflicting with other mods. Note that changing this after people have started playing will reset their saves.

          Most of the time, you won't need to dive deep into the code to create things, but you still can if you really want to, for example to add new Vue components in v.js.

          The Modding Tree uses break_eternity.js to store large values. This means that many numbers are Decimal objects, and must be treated differently. For example, you have to use new Decimal(x) to create a Decimal value instead of a plain number, and perform operations on them by calling functions. e.g, instead of x = x + y, use x = x.add(y). Keep in mind this also applies to comparison operators, which should be replaced with calling the .gt, .gte, .lt, .lte, .eq, and .neq functions. See the break_eternity.js docs for more details on working with Decimal values.

          Almost all values can be either a constant value, or a dynamic value. Dynamic values are defined by putting a function that returns what the value should be at any given time.

          All display text can use basic HTML elements (But you can't use most Vue features there).

          While reading this documentation, the following key will be used when describing features:

          • No label: This is required and the game may crash if it isn't included.
          • sometimes required: This is may be required, depending on other things in the layer.
          • optional: You can leave this out if you don't intend to use that feature for the layer.
          • assigned automagically: This value will be set automatically and override any value you set.
          • deprecated: This feature is not recommended to be used anymore, and may be removed in future versions of TMT.

          Table of Contents

          General

          • Getting Started: Getting your own copy of the code set up with Github Desktop.
          • Main mod info: How to set up general things for your mod in mod.js.
          • Basic layer breakdown: Breaking down the components of a layer with minimal features.
          • Layer features: Explanations of all of the different properties that you can give a layer.
          • Custom Tab Layouts: An optional way to give your tabs a different layout. You can even create entirely new components to use.
          • Custom game layouts: You can get rid of the tree tab, add buttons and other things to the tree, or even customize the tab's layout like a layer tab.
          • Updating TMT: Using Github Desktop to update your mod's version of TMT.

          Common components

          • Upgrades: How to create upgrades for a layer.
          • Milestones: How to create milestones for a layer.
          • Buyables: Create rebuyable upgrades for your layer (with the option to make them respec-able). Can be used to make Enhancers or Space Buildings.
          • Clickables: A more generalized variant of buyables, for any kind of thing that is sometimes clickable. Between these and Buyables, you can do just about anything.

          Other components and features

          • Challenges: How to create challenges for a layer.
          • Bars: Display some information as a progress bar, gauge, or similar. They are highly customizable, and can be horizontal and vertical as well.
          • Subtabs and Microtabs: Create subtabs for your tabs, as well as "microtab" components that you can put inside the tabs. You can even use them to embed a layer inside another layer!
          • Achievements: How to create achievements for a layer (or for the whole game).
          • Infoboxes: Boxes containing text that can be shown or hidden.
          • Trees: Make your own trees. You can make non-layer button nodes too!
          ',16),i=[r];function s(l,d,h,c,u,m){return t(),a("div",null,i)}const b=e(n,[["render",s]]);export{y as __pageData,b as default}; +import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"The-Modding-Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/!general-info.md","filePath":"public/lit/docs/!general-info.md","lastUpdated":1604787966000}'),n={name:"public/lit/docs/!general-info.md"},r=o('

          The-Modding-Tree

          The main way to add content is through creating layers. You can either add a layer directly in the layers object in layerSupport.js, or declare it in another file and register it by calling addLayer(layername, layerdata). There is an example layer registration in layers.js showing the recommended method. It is just an example and can be freely deleted. You can also use it as a reference or a base for your own layers.

          The first thing you need to do is fill out the modInfo object at the top of mod.js to set your mod's name, ID (a string), and other information. A unique modId will prevent your mod's saves from conflicting with other mods. Note that changing this after people have started playing will reset their saves.

          Most of the time, you won't need to dive deep into the code to create things, but you still can if you really want to, for example to add new Vue components in v.js.

          The Modding Tree uses break_eternity.js to store large values. This means that many numbers are Decimal objects, and must be treated differently. For example, you have to use new Decimal(x) to create a Decimal value instead of a plain number, and perform operations on them by calling functions. e.g, instead of x = x + y, use x = x.add(y). Keep in mind this also applies to comparison operators, which should be replaced with calling the .gt, .gte, .lt, .lte, .eq, and .neq functions. See the break_eternity.js docs for more details on working with Decimal values.

          Almost all values can be either a constant value, or a dynamic value. Dynamic values are defined by putting a function that returns what the value should be at any given time.

          All display text can use basic HTML elements (But you can't use most Vue features there).

          While reading this documentation, the following key will be used when describing features:

          • No label: This is required and the game may crash if it isn't included.
          • sometimes required: This is may be required, depending on other things in the layer.
          • optional: You can leave this out if you don't intend to use that feature for the layer.
          • assigned automagically: This value will be set automatically and override any value you set.
          • deprecated: This feature is not recommended to be used anymore, and may be removed in future versions of TMT.

          Table of Contents

          General

          • Getting Started: Getting your own copy of the code set up with Github Desktop.
          • Main mod info: How to set up general things for your mod in mod.js.
          • Basic layer breakdown: Breaking down the components of a layer with minimal features.
          • Layer features: Explanations of all of the different properties that you can give a layer.
          • Custom Tab Layouts: An optional way to give your tabs a different layout. You can even create entirely new components to use.
          • Custom game layouts: You can get rid of the tree tab, add buttons and other things to the tree, or even customize the tab's layout like a layer tab.
          • Updating TMT: Using Github Desktop to update your mod's version of TMT.

          Common components

          • Upgrades: How to create upgrades for a layer.
          • Milestones: How to create milestones for a layer.
          • Buyables: Create rebuyable upgrades for your layer (with the option to make them respec-able). Can be used to make Enhancers or Space Buildings.
          • Clickables: A more generalized variant of buyables, for any kind of thing that is sometimes clickable. Between these and Buyables, you can do just about anything.

          Other components and features

          • Challenges: How to create challenges for a layer.
          • Bars: Display some information as a progress bar, gauge, or similar. They are highly customizable, and can be horizontal and vertical as well.
          • Subtabs and Microtabs: Create subtabs for your tabs, as well as "microtab" components that you can put inside the tabs. You can even use them to embed a layer inside another layer!
          • Achievements: How to create achievements for a layer (or for the whole game).
          • Infoboxes: Boxes containing text that can be shown or hidden.
          • Trees: Make your own trees. You can make non-layer button nodes too!
          ',16),i=[r];function s(l,d,h,c,u,m){return t(),a("div",null,i)}const b=e(n,[["render",s]]);export{y as __pageData,b as default}; diff --git a/assets/public_lit_docs_!general-info.md.CDTQvlu3.lean.js b/assets/public_lit_docs_!general-info.md.Bx73xrHN.lean.js similarity index 86% rename from assets/public_lit_docs_!general-info.md.CDTQvlu3.lean.js rename to assets/public_lit_docs_!general-info.md.Bx73xrHN.lean.js index b1e1d48f..e7eff1a9 100644 --- a/assets/public_lit_docs_!general-info.md.CDTQvlu3.lean.js +++ b/assets/public_lit_docs_!general-info.md.Bx73xrHN.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"The-Modding-Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/!general-info.md","filePath":"public/lit/docs/!general-info.md","lastUpdated":1701137263000}'),n={name:"public/lit/docs/!general-info.md"},r=o("",16),i=[r];function s(l,d,h,c,u,m){return t(),a("div",null,i)}const b=e(n,[["render",s]]);export{y as __pageData,b as default}; +import{_ as e,c as a,o as t,a9 as o}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"The-Modding-Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/!general-info.md","filePath":"public/lit/docs/!general-info.md","lastUpdated":1604787966000}'),n={name:"public/lit/docs/!general-info.md"},r=o("",16),i=[r];function s(l,d,h,c,u,m){return t(),a("div",null,i)}const b=e(n,[["render",s]]);export{y as __pageData,b as default}; diff --git a/assets/public_lit_docs_achievements.md.z7uTtaPO.js b/assets/public_lit_docs_achievements.md.Cz8mR7W2.js similarity index 98% rename from assets/public_lit_docs_achievements.md.z7uTtaPO.js rename to assets/public_lit_docs_achievements.md.Cz8mR7W2.js index a7c0f872..cc800603 100644 --- a/assets/public_lit_docs_achievements.md.z7uTtaPO.js +++ b/assets/public_lit_docs_achievements.md.Cz8mR7W2.js @@ -1,4 +1,4 @@ -import{_ as e,c as t,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Achievements","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/achievements.md","filePath":"public/lit/docs/achievements.md","lastUpdated":1701137263000}'),s={name:"public/lit/docs/achievements.md"},n=a(`

          Achievements

          Achievements are awarded to the player when they meet a certain goal, and optionally give some benefit. Currently they are pretty basic, but additional features will be added later to help.

          You can make global achievements by putting them in a side layer by making its row equal to "side" instead of a number.

          Useful functions for dealing with achievements and implementing their effects:

          • hasAchievement(layer, id): determine if the player has the Achievement.
          • achievementEffect(layer, id): Returns the current effects of the achievement, if any.

          Achievements should be formatted like this:

          js
          achievements: {
          +import{_ as e,c as t,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Achievements","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/achievements.md","filePath":"public/lit/docs/achievements.md","lastUpdated":1607581902000}'),s={name:"public/lit/docs/achievements.md"},n=a(`

          Achievements

          Achievements are awarded to the player when they meet a certain goal, and optionally give some benefit. Currently they are pretty basic, but additional features will be added later to help.

          You can make global achievements by putting them in a side layer by making its row equal to "side" instead of a number.

          Useful functions for dealing with achievements and implementing their effects:

          • hasAchievement(layer, id): determine if the player has the Achievement.
          • achievementEffect(layer, id): Returns the current effects of the achievement, if any.

          Achievements should be formatted like this:

          js
          achievements: {
               rows: # of rows,
               cols: # of columns,
               11: {
          diff --git a/assets/public_lit_docs_achievements.md.z7uTtaPO.lean.js b/assets/public_lit_docs_achievements.md.Cz8mR7W2.lean.js
          similarity index 86%
          rename from assets/public_lit_docs_achievements.md.z7uTtaPO.lean.js
          rename to assets/public_lit_docs_achievements.md.Cz8mR7W2.lean.js
          index 288e5407..10dad47f 100644
          --- a/assets/public_lit_docs_achievements.md.z7uTtaPO.lean.js
          +++ b/assets/public_lit_docs_achievements.md.Cz8mR7W2.lean.js
          @@ -1 +1 @@
          -import{_ as e,c as t,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Achievements","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/achievements.md","filePath":"public/lit/docs/achievements.md","lastUpdated":1701137263000}'),s={name:"public/lit/docs/achievements.md"},n=a("",11),l=[n];function o(h,p,r,c,d,u){return i(),t("div",null,l)}const k=e(s,[["render",o]]);export{g as __pageData,k as default};
          +import{_ as e,c as t,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Achievements","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/achievements.md","filePath":"public/lit/docs/achievements.md","lastUpdated":1607581902000}'),s={name:"public/lit/docs/achievements.md"},n=a("",11),l=[n];function o(h,p,r,c,d,u){return i(),t("div",null,l)}const k=e(s,[["render",o]]);export{g as __pageData,k as default};
          diff --git a/assets/public_lit_docs_bars.md.hc6LT70W.js b/assets/public_lit_docs_bars.md.B1zVageA.js
          similarity index 97%
          rename from assets/public_lit_docs_bars.md.hc6LT70W.js
          rename to assets/public_lit_docs_bars.md.B1zVageA.js
          index ea45bf0a..e083cd3b 100644
          --- a/assets/public_lit_docs_bars.md.hc6LT70W.js
          +++ b/assets/public_lit_docs_bars.md.B1zVageA.js
          @@ -1,4 +1,4 @@
          -import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Bars","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/bars.md","filePath":"public/lit/docs/bars.md","lastUpdated":1701137263000}'),e={name:"public/lit/docs/bars.md"},n=t(`

          Bars

          Bars let you display information in a more direct way. It can be a progress bar, health bar, capacity gauge, or anything else.

          Bars are defined like other Big Features:

          js
          bars: {
          +import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Bars","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/bars.md","filePath":"public/lit/docs/bars.md","lastUpdated":1604787966000}'),e={name:"public/lit/docs/bars.md"},n=t(`

          Bars

          Bars let you display information in a more direct way. It can be a progress bar, health bar, capacity gauge, or anything else.

          Bars are defined like other Big Features:

          js
          bars: {
               bigBar: {
                   direction: RIGHT,
                   width: 200,
          diff --git a/assets/public_lit_docs_bars.md.hc6LT70W.lean.js b/assets/public_lit_docs_bars.md.B1zVageA.lean.js
          similarity index 70%
          rename from assets/public_lit_docs_bars.md.hc6LT70W.lean.js
          rename to assets/public_lit_docs_bars.md.B1zVageA.lean.js
          index 3f90b9d7..987f8d55 100644
          --- a/assets/public_lit_docs_bars.md.hc6LT70W.lean.js
          +++ b/assets/public_lit_docs_bars.md.B1zVageA.lean.js
          @@ -1 +1 @@
          -import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Bars","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/bars.md","filePath":"public/lit/docs/bars.md","lastUpdated":1701137263000}'),e={name:"public/lit/docs/bars.md"},n=t("",6),l=[n];function r(p,h,o,d,k,c){return a(),i("div",null,l)}const E=s(e,[["render",r]]);export{u as __pageData,E as default};
          +import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Bars","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/bars.md","filePath":"public/lit/docs/bars.md","lastUpdated":1604787966000}'),e={name:"public/lit/docs/bars.md"},n=t("",6),l=[n];function r(p,h,o,d,k,c){return a(),i("div",null,l)}const E=s(e,[["render",r]]);export{u as __pageData,E as default};
          diff --git a/assets/public_lit_docs_basic-layer-breakdown.md.CqbgegVm.js b/assets/public_lit_docs_basic-layer-breakdown.md.CZbO_awH.js
          similarity index 99%
          rename from assets/public_lit_docs_basic-layer-breakdown.md.CqbgegVm.js
          rename to assets/public_lit_docs_basic-layer-breakdown.md.CZbO_awH.js
          index 1e2cae85..e6fea87b 100644
          --- a/assets/public_lit_docs_basic-layer-breakdown.md.CqbgegVm.js
          +++ b/assets/public_lit_docs_basic-layer-breakdown.md.CZbO_awH.js
          @@ -1,4 +1,4 @@
          -import{_ as s,c as i,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Basic layer breakdown","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/basic-layer-breakdown.md","filePath":"public/lit/docs/basic-layer-breakdown.md","lastUpdated":1701137263000}'),t={name:"public/lit/docs/basic-layer-breakdown.md"},e=n(`

          Basic layer breakdown

          This is a very minimal layer with minimal features. Most things will require additional features.

          js
          addLayer("p", {
          +import{_ as s,c as i,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Basic layer breakdown","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/basic-layer-breakdown.md","filePath":"public/lit/docs/basic-layer-breakdown.md","lastUpdated":1603745122000}'),t={name:"public/lit/docs/basic-layer-breakdown.md"},e=n(`

          Basic layer breakdown

          This is a very minimal layer with minimal features. Most things will require additional features.

          js
          addLayer("p", {
               startData() { return {                  // startData is a function that returns default data for a layer. 
                   unlocked: true,                     // You can add more variables here to add them to your layer.
                   points: new Decimal(0),             // "points" is the internal name for the main resource of the layer.
          diff --git a/assets/public_lit_docs_basic-layer-breakdown.md.CqbgegVm.lean.js b/assets/public_lit_docs_basic-layer-breakdown.md.CZbO_awH.lean.js
          similarity index 87%
          rename from assets/public_lit_docs_basic-layer-breakdown.md.CqbgegVm.lean.js
          rename to assets/public_lit_docs_basic-layer-breakdown.md.CZbO_awH.lean.js
          index 126ab3ab..b74a8f3a 100644
          --- a/assets/public_lit_docs_basic-layer-breakdown.md.CqbgegVm.lean.js
          +++ b/assets/public_lit_docs_basic-layer-breakdown.md.CZbO_awH.lean.js
          @@ -1 +1 @@
          -import{_ as s,c as i,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Basic layer breakdown","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/basic-layer-breakdown.md","filePath":"public/lit/docs/basic-layer-breakdown.md","lastUpdated":1701137263000}'),t={name:"public/lit/docs/basic-layer-breakdown.md"},e=n("",3),h=[e];function l(p,k,r,E,d,o){return a(),i("div",null,h)}const c=s(t,[["render",l]]);export{g as __pageData,c as default};
          +import{_ as s,c as i,o as a,a9 as n}from"./chunks/framework.D8PMdl4T.js";const g=JSON.parse('{"title":"Basic layer breakdown","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/basic-layer-breakdown.md","filePath":"public/lit/docs/basic-layer-breakdown.md","lastUpdated":1603745122000}'),t={name:"public/lit/docs/basic-layer-breakdown.md"},e=n("",3),h=[e];function l(p,k,r,E,d,o){return a(),i("div",null,h)}const c=s(t,[["render",l]]);export{g as __pageData,c as default};
          diff --git a/assets/public_lit_docs_buyables.md.DilfnDIO.js b/assets/public_lit_docs_buyables.md.BSNB4_NL.js
          similarity index 99%
          rename from assets/public_lit_docs_buyables.md.DilfnDIO.js
          rename to assets/public_lit_docs_buyables.md.BSNB4_NL.js
          index facb6b90..27864d3b 100644
          --- a/assets/public_lit_docs_buyables.md.DilfnDIO.js
          +++ b/assets/public_lit_docs_buyables.md.BSNB4_NL.js
          @@ -1,4 +1,4 @@
          -import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Buyables","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/buyables.md","filePath":"public/lit/docs/buyables.md","lastUpdated":1701137263000}'),e={name:"public/lit/docs/buyables.md"},l=t(`

          Buyables

          Buyables are usually things that can be bought multiple times with scaling costs. If you set a respec function, the player can reset the purchases to get their currency back.

          The amount of a buyable owned is a Decimal.

          Useful functions for dealing with buyables and implementing their effects:

          • getBuyableAmount(layer, id): get the amount of the buyable the player has
          • setBuyableAmount(layer, id, amount): set the amount of the buyable the player has
          • buyableEffect(layer, id): Returns the current effects of the buyable, if any.

          Buyables should be formatted like this:

          js
          buyables: {
          +import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Buyables","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/buyables.md","filePath":"public/lit/docs/buyables.md","lastUpdated":1608171600000}'),e={name:"public/lit/docs/buyables.md"},l=t(`

          Buyables

          Buyables are usually things that can be bought multiple times with scaling costs. If you set a respec function, the player can reset the purchases to get their currency back.

          The amount of a buyable owned is a Decimal.

          Useful functions for dealing with buyables and implementing their effects:

          • getBuyableAmount(layer, id): get the amount of the buyable the player has
          • setBuyableAmount(layer, id, amount): set the amount of the buyable the player has
          • buyableEffect(layer, id): Returns the current effects of the buyable, if any.

          Buyables should be formatted like this:

          js
          buyables: {
               rows: # of rows,
               cols: # of columns,
               11: {
          diff --git a/assets/public_lit_docs_buyables.md.DilfnDIO.lean.js b/assets/public_lit_docs_buyables.md.BSNB4_NL.lean.js
          similarity index 85%
          rename from assets/public_lit_docs_buyables.md.DilfnDIO.lean.js
          rename to assets/public_lit_docs_buyables.md.BSNB4_NL.lean.js
          index 22330be6..32577a6f 100644
          --- a/assets/public_lit_docs_buyables.md.DilfnDIO.lean.js
          +++ b/assets/public_lit_docs_buyables.md.BSNB4_NL.lean.js
          @@ -1 +1 @@
          -import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Buyables","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/buyables.md","filePath":"public/lit/docs/buyables.md","lastUpdated":1701137263000}'),e={name:"public/lit/docs/buyables.md"},l=t("",12),n=[l];function h(p,k,r,o,d,E){return a(),i("div",null,n)}const c=s(e,[["render",h]]);export{y as __pageData,c as default};
          +import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Buyables","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/buyables.md","filePath":"public/lit/docs/buyables.md","lastUpdated":1608171600000}'),e={name:"public/lit/docs/buyables.md"},l=t("",12),n=[l];function h(p,k,r,o,d,E){return a(),i("div",null,n)}const c=s(e,[["render",h]]);export{y as __pageData,c as default};
          diff --git a/assets/public_lit_docs_challenges.md.FvqZDXVG.js b/assets/public_lit_docs_challenges.md.Ckyne6Wg.js
          similarity index 99%
          rename from assets/public_lit_docs_challenges.md.FvqZDXVG.js
          rename to assets/public_lit_docs_challenges.md.Ckyne6Wg.js
          index ebcaddb4..5782ee4f 100644
          --- a/assets/public_lit_docs_challenges.md.FvqZDXVG.js
          +++ b/assets/public_lit_docs_challenges.md.Ckyne6Wg.js
          @@ -1,4 +1,4 @@
          -import{_ as e,c as s,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Challenges","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/challenges.md","filePath":"public/lit/docs/challenges.md","lastUpdated":1701137263000}'),t={name:"public/lit/docs/challenges.md"},n=a(`

          Challenges

          Challenges can have fully customizable win conditions. Useful functions for dealing with Challenges and implementing their effects:

          • inChallenge(layer, id): determine if the player is in a given challenge (or another challenge on the same layer that counts as this one).
          • hasChallenge(layer, id): determine if the player has completed the challenge.
          • challengeCompletions(layer, id): determine how many times the player completed the challenge.
          • challengeEffect(layer, id): Returns the current effects of the challenge, if any.

          Challenges are stored in the following format:

          js
          challenges: {
          +import{_ as e,c as s,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Challenges","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/challenges.md","filePath":"public/lit/docs/challenges.md","lastUpdated":1611269529000}'),t={name:"public/lit/docs/challenges.md"},n=a(`

          Challenges

          Challenges can have fully customizable win conditions. Useful functions for dealing with Challenges and implementing their effects:

          • inChallenge(layer, id): determine if the player is in a given challenge (or another challenge on the same layer that counts as this one).
          • hasChallenge(layer, id): determine if the player has completed the challenge.
          • challengeCompletions(layer, id): determine how many times the player completed the challenge.
          • challengeEffect(layer, id): Returns the current effects of the challenge, if any.

          Challenges are stored in the following format:

          js
          challenges: {
               rows: # of rows,
               cols: # of columns,
               11: {
          diff --git a/assets/public_lit_docs_challenges.md.FvqZDXVG.lean.js b/assets/public_lit_docs_challenges.md.Ckyne6Wg.lean.js
          similarity index 86%
          rename from assets/public_lit_docs_challenges.md.FvqZDXVG.lean.js
          rename to assets/public_lit_docs_challenges.md.Ckyne6Wg.lean.js
          index 9ffdacba..8c9e1ca7 100644
          --- a/assets/public_lit_docs_challenges.md.FvqZDXVG.lean.js
          +++ b/assets/public_lit_docs_challenges.md.Ckyne6Wg.lean.js
          @@ -1 +1 @@
          -import{_ as e,c as s,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Challenges","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/challenges.md","filePath":"public/lit/docs/challenges.md","lastUpdated":1701137263000}'),t={name:"public/lit/docs/challenges.md"},n=a("",10),l=[n];function o(h,r,p,c,g,d){return i(),s("div",null,l)}const k=e(t,[["render",o]]);export{f as __pageData,k as default};
          +import{_ as e,c as s,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const f=JSON.parse('{"title":"Challenges","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/challenges.md","filePath":"public/lit/docs/challenges.md","lastUpdated":1611269529000}'),t={name:"public/lit/docs/challenges.md"},n=a("",10),l=[n];function o(h,r,p,c,g,d){return i(),s("div",null,l)}const k=e(t,[["render",o]]);export{f as __pageData,k as default};
          diff --git a/assets/public_lit_docs_clickables.md.D9eesbmM.js b/assets/public_lit_docs_clickables.md.XlVpmgOb.js
          similarity index 98%
          rename from assets/public_lit_docs_clickables.md.D9eesbmM.js
          rename to assets/public_lit_docs_clickables.md.XlVpmgOb.js
          index 97c1e1f4..37bf01c3 100644
          --- a/assets/public_lit_docs_clickables.md.D9eesbmM.js
          +++ b/assets/public_lit_docs_clickables.md.XlVpmgOb.js
          @@ -1,4 +1,4 @@
          -import{_ as e,c as s,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"Clickables","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/clickables.md","filePath":"public/lit/docs/clickables.md","lastUpdated":1701137263000}'),t={name:"public/lit/docs/clickables.md"},l=i(`

          Clickables

          Clickables are any kind of thing that you can click for an effect. They're a more generalized version of Buyables.

          DO NOT USE THESE TO MAKE THINGS THAT YOU CLICK REPEATEDLY FOR A BONUS BECAUSE THOSE ARE AWFUL.

          There are several differences between the two. One is that a buyable's saved data is its amount as a Decimal, while Clickables store a "state" which can be a number or string, but not Decimal, array, or object). Buyables have a number of extra features which you can see on their page. Clickables also have a smaller default size.

          Useful functions for dealing with achievements and implementing their effects:

          • getClickableState(layer, id): get the state of the clickable the player has
          • setClickableState(layer, id, state): set the state of the buyable the player has
          • clickableEffect(layer, id): Returns the current effects of the clickable, if any.

          Clickables should be formatted like this:

          js
          clickables: {
          +import{_ as e,c as s,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"Clickables","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/clickables.md","filePath":"public/lit/docs/clickables.md","lastUpdated":1603745122000}'),t={name:"public/lit/docs/clickables.md"},l=i(`

          Clickables

          Clickables are any kind of thing that you can click for an effect. They're a more generalized version of Buyables.

          DO NOT USE THESE TO MAKE THINGS THAT YOU CLICK REPEATEDLY FOR A BONUS BECAUSE THOSE ARE AWFUL.

          There are several differences between the two. One is that a buyable's saved data is its amount as a Decimal, while Clickables store a "state" which can be a number or string, but not Decimal, array, or object). Buyables have a number of extra features which you can see on their page. Clickables also have a smaller default size.

          Useful functions for dealing with achievements and implementing their effects:

          • getClickableState(layer, id): get the state of the clickable the player has
          • setClickableState(layer, id, state): set the state of the buyable the player has
          • clickableEffect(layer, id): Returns the current effects of the clickable, if any.

          Clickables should be formatted like this:

          js
          clickables: {
               rows: # of rows,
               cols: # of columns,
               11: {
          diff --git a/assets/public_lit_docs_clickables.md.D9eesbmM.lean.js b/assets/public_lit_docs_clickables.md.XlVpmgOb.lean.js
          similarity index 86%
          rename from assets/public_lit_docs_clickables.md.D9eesbmM.lean.js
          rename to assets/public_lit_docs_clickables.md.XlVpmgOb.lean.js
          index 18677d81..cf686d63 100644
          --- a/assets/public_lit_docs_clickables.md.D9eesbmM.lean.js
          +++ b/assets/public_lit_docs_clickables.md.XlVpmgOb.lean.js
          @@ -1 +1 @@
          -import{_ as e,c as s,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"Clickables","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/clickables.md","filePath":"public/lit/docs/clickables.md","lastUpdated":1701137263000}'),t={name:"public/lit/docs/clickables.md"},l=i("",12),n=[l];function o(c,r,h,p,k,d){return a(),s("div",null,n)}const g=e(t,[["render",o]]);export{b as __pageData,g as default};
          +import{_ as e,c as s,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const b=JSON.parse('{"title":"Clickables","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/clickables.md","filePath":"public/lit/docs/clickables.md","lastUpdated":1603745122000}'),t={name:"public/lit/docs/clickables.md"},l=i("",12),n=[l];function o(c,r,h,p,k,d){return a(),s("div",null,n)}const g=e(t,[["render",o]]);export{b as __pageData,g as default};
          diff --git a/assets/public_lit_docs_custom-tab-layouts.md.BYNeuJZ1.js b/assets/public_lit_docs_custom-tab-layouts.md.RNFGijzw.js
          similarity index 99%
          rename from assets/public_lit_docs_custom-tab-layouts.md.BYNeuJZ1.js
          rename to assets/public_lit_docs_custom-tab-layouts.md.RNFGijzw.js
          index a2d24f2f..73900fca 100644
          --- a/assets/public_lit_docs_custom-tab-layouts.md.BYNeuJZ1.js
          +++ b/assets/public_lit_docs_custom-tab-layouts.md.RNFGijzw.js
          @@ -1,4 +1,4 @@
          -import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Custom tab layouts","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/custom-tab-layouts.md","filePath":"public/lit/docs/custom-tab-layouts.md","lastUpdated":1701137263000}'),e={name:"public/lit/docs/custom-tab-layouts.md"},n=t(`

          Custom tab layouts

          Note: If you are using subtabs, tabFormat is used differently, but you still use the same format within each subtabs. See here for more on subtabs.

          Custom tab layouts can be used to do basically anything in a tab window, especially combined with the "style" layer feature. The tabFormat feature is an array of things, like this:

          js
          tabFormat: [
          +import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Custom tab layouts","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/custom-tab-layouts.md","filePath":"public/lit/docs/custom-tab-layouts.md","lastUpdated":1607197949000}'),e={name:"public/lit/docs/custom-tab-layouts.md"},n=t(`

          Custom tab layouts

          Note: If you are using subtabs, tabFormat is used differently, but you still use the same format within each subtabs. See here for more on subtabs.

          Custom tab layouts can be used to do basically anything in a tab window, especially combined with the "style" layer feature. The tabFormat feature is an array of things, like this:

          js
          tabFormat: [
               "main-display",
               ["prestige-button", function() { return "Melt your points into " }],
               "blank",
          diff --git a/assets/public_lit_docs_custom-tab-layouts.md.BYNeuJZ1.lean.js b/assets/public_lit_docs_custom-tab-layouts.md.RNFGijzw.lean.js
          similarity index 86%
          rename from assets/public_lit_docs_custom-tab-layouts.md.BYNeuJZ1.lean.js
          rename to assets/public_lit_docs_custom-tab-layouts.md.RNFGijzw.lean.js
          index c1f90879..0260e4b5 100644
          --- a/assets/public_lit_docs_custom-tab-layouts.md.BYNeuJZ1.lean.js
          +++ b/assets/public_lit_docs_custom-tab-layouts.md.RNFGijzw.lean.js
          @@ -1 +1 @@
          -import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Custom tab layouts","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/custom-tab-layouts.md","filePath":"public/lit/docs/custom-tab-layouts.md","lastUpdated":1701137263000}'),e={name:"public/lit/docs/custom-tab-layouts.md"},n=t("",9),l=[n];function h(o,p,r,u,k,d){return a(),i("div",null,l)}const E=s(e,[["render",h]]);export{y as __pageData,E as default};
          +import{_ as s,c as i,o as a,a9 as t}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Custom tab layouts","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/custom-tab-layouts.md","filePath":"public/lit/docs/custom-tab-layouts.md","lastUpdated":1607197949000}'),e={name:"public/lit/docs/custom-tab-layouts.md"},n=t("",9),l=[n];function h(o,p,r,u,k,d){return a(),i("div",null,l)}const E=s(e,[["render",h]]);export{y as __pageData,E as default};
          diff --git a/assets/public_lit_docs_getting-started.md.MYuuOf2Q.js b/assets/public_lit_docs_getting-started.md.GyuAnbTP.js
          similarity index 98%
          rename from assets/public_lit_docs_getting-started.md.MYuuOf2Q.js
          rename to assets/public_lit_docs_getting-started.md.GyuAnbTP.js
          index 2e28fc84..ad1c637c 100644
          --- a/assets/public_lit_docs_getting-started.md.MYuuOf2Q.js
          +++ b/assets/public_lit_docs_getting-started.md.GyuAnbTP.js
          @@ -1 +1 @@
          -import{_ as e,c as t,o,a9 as i}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Getting started","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/getting-started.md","filePath":"public/lit/docs/getting-started.md","lastUpdated":1701137263000}'),a={name:"public/lit/docs/getting-started.md"},n=i('

          Getting started

          Welcome to The Modding Tree!

          Using the Modding Tree, at its simplest level, just requires getting a copy of it onto your computer. However, if you do it the right way, it will help in many ways.

          Don't let the word "Github" scare you away. It's actually much easier to use than most people think, especially because most people use it the hard way. The key is Github Desktop, which lets you do everything you need to, without even touching the command line.

          The benefits of using Github:

          • It makes it much, much easier to update The Modding Tree.
          • You can share your work without any extra effort using githack, or with a bit more effort, set up a github.io site.
          • It lets you undo changes to your code, and to have multiple versions of it.
          • It lets you collaborate with other people, if you want to.

          Getting set up with Github Desktop, Visual Studio Code, and The Modding Tree:

          1. Install Github Desktop and Visual Studio Code.

          2. Make a Github account. You can handle this on your own.

          3. Log in on your browser, and go back to The Modding Tree page. At the top right, there should be a button that says "fork". Click on it, and then on your username. You now have your own fork, or copy, of The Modding Tree.

          4. Open Github Desktop and log in. Ignore everything else and choose "clone a repository". A "repository" is basically a "Github project", like The Modding Tree. "Cloning" is downloading a copy of the repository to your computer.

          5. Look for The Modding Tree in the list of repositiories (it should be the only one) and click "clone".

          6. Select that you're using it for your own purposes, and click continue. It will download the files and handle everything.

          Using your repository

          1. Click on "show in explorer/finder" to the right, and then open the index.html file in the folder. The page should open up on your browser. This will let you view and test your project locally!

          2. To edit your project, click "open in VSCode" in Github Desktop.

          3. Open mod.js in VSCode, and look at the top part where it has a "modInfo" object. Fill in your mod's name to whatever you want, and change the id as well. (It can be any string value, and it's used to determine where the savefile is. Make it something that's probably unique, and don't change it again later or else it'll effectively wipe existing saves)

          4. Save mod.js, and then reload index.html in your browser. The title on the tab, as well as on the info page, will now be updated! You can reload the page every time you change the code to test it quickly and easily.

          5. Go back to Github Desktop. It's time to save your changes into the git system by making a "commit". This basically saves your work and creates a snapshot of what your code looks like at this moment, allowing you to look back at it later.

          6. At the bottom right corner, add a summary of your changes, and then click "commit to master".

          7. Finally, at the top middle, click "push origin" to push your changes out onto the online repository.

          8. You can view your project on line, or share it with others, by going to https://raw.githack.com/[YOUR-GITHUB-USERNAME]/The-Modding-Tree/master/index.html

          And now, you have successfully used Github! You can look at the documentation to see how The Modding Tree's system works and to make your mod a reality.

          ',11),r=[n];function s(l,h,u,d,p,c){return o(),t("div",null,r)}const m=e(a,[["render",s]]);export{y as __pageData,m as default}; +import{_ as e,c as t,o,a9 as i}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Getting started","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/getting-started.md","filePath":"public/lit/docs/getting-started.md","lastUpdated":1604778547000}'),a={name:"public/lit/docs/getting-started.md"},n=i('

          Getting started

          Welcome to The Modding Tree!

          Using the Modding Tree, at its simplest level, just requires getting a copy of it onto your computer. However, if you do it the right way, it will help in many ways.

          Don't let the word "Github" scare you away. It's actually much easier to use than most people think, especially because most people use it the hard way. The key is Github Desktop, which lets you do everything you need to, without even touching the command line.

          The benefits of using Github:

          • It makes it much, much easier to update The Modding Tree.
          • You can share your work without any extra effort using githack, or with a bit more effort, set up a github.io site.
          • It lets you undo changes to your code, and to have multiple versions of it.
          • It lets you collaborate with other people, if you want to.

          Getting set up with Github Desktop, Visual Studio Code, and The Modding Tree:

          1. Install Github Desktop and Visual Studio Code.

          2. Make a Github account. You can handle this on your own.

          3. Log in on your browser, and go back to The Modding Tree page. At the top right, there should be a button that says "fork". Click on it, and then on your username. You now have your own fork, or copy, of The Modding Tree.

          4. Open Github Desktop and log in. Ignore everything else and choose "clone a repository". A "repository" is basically a "Github project", like The Modding Tree. "Cloning" is downloading a copy of the repository to your computer.

          5. Look for The Modding Tree in the list of repositiories (it should be the only one) and click "clone".

          6. Select that you're using it for your own purposes, and click continue. It will download the files and handle everything.

          Using your repository

          1. Click on "show in explorer/finder" to the right, and then open the index.html file in the folder. The page should open up on your browser. This will let you view and test your project locally!

          2. To edit your project, click "open in VSCode" in Github Desktop.

          3. Open mod.js in VSCode, and look at the top part where it has a "modInfo" object. Fill in your mod's name to whatever you want, and change the id as well. (It can be any string value, and it's used to determine where the savefile is. Make it something that's probably unique, and don't change it again later or else it'll effectively wipe existing saves)

          4. Save mod.js, and then reload index.html in your browser. The title on the tab, as well as on the info page, will now be updated! You can reload the page every time you change the code to test it quickly and easily.

          5. Go back to Github Desktop. It's time to save your changes into the git system by making a "commit". This basically saves your work and creates a snapshot of what your code looks like at this moment, allowing you to look back at it later.

          6. At the bottom right corner, add a summary of your changes, and then click "commit to master".

          7. Finally, at the top middle, click "push origin" to push your changes out onto the online repository.

          8. You can view your project on line, or share it with others, by going to https://raw.githack.com/[YOUR-GITHUB-USERNAME]/The-Modding-Tree/master/index.html

          And now, you have successfully used Github! You can look at the documentation to see how The Modding Tree's system works and to make your mod a reality.

          ',11),r=[n];function s(l,h,u,d,p,c){return o(),t("div",null,r)}const m=e(a,[["render",s]]);export{y as __pageData,m as default}; diff --git a/assets/public_lit_docs_getting-started.md.MYuuOf2Q.lean.js b/assets/public_lit_docs_getting-started.md.GyuAnbTP.lean.js similarity index 86% rename from assets/public_lit_docs_getting-started.md.MYuuOf2Q.lean.js rename to assets/public_lit_docs_getting-started.md.GyuAnbTP.lean.js index 03c95996..396ab8de 100644 --- a/assets/public_lit_docs_getting-started.md.MYuuOf2Q.lean.js +++ b/assets/public_lit_docs_getting-started.md.GyuAnbTP.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o,a9 as i}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Getting started","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/getting-started.md","filePath":"public/lit/docs/getting-started.md","lastUpdated":1701137263000}'),a={name:"public/lit/docs/getting-started.md"},n=i("",11),r=[n];function s(l,h,u,d,p,c){return o(),t("div",null,r)}const m=e(a,[["render",s]]);export{y as __pageData,m as default}; +import{_ as e,c as t,o,a9 as i}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Getting started","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/getting-started.md","filePath":"public/lit/docs/getting-started.md","lastUpdated":1604778547000}'),a={name:"public/lit/docs/getting-started.md"},n=i("",11),r=[n];function s(l,h,u,d,p,c){return o(),t("div",null,r)}const m=e(a,[["render",s]]);export{y as __pageData,m as default}; diff --git a/assets/public_lit_docs_infoboxes.md.Be2LqzDD.js b/assets/public_lit_docs_infoboxes.md.rD48WYz9.js similarity index 98% rename from assets/public_lit_docs_infoboxes.md.Be2LqzDD.js rename to assets/public_lit_docs_infoboxes.md.rD48WYz9.js index faa18f14..c218536b 100644 --- a/assets/public_lit_docs_infoboxes.md.Be2LqzDD.js +++ b/assets/public_lit_docs_infoboxes.md.rD48WYz9.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as e,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Infoboxes","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/infoboxes.md","filePath":"public/lit/docs/infoboxes.md","lastUpdated":1701137263000}'),a={name:"public/lit/docs/infoboxes.md"},n=t(`

          Infoboxes

          Infoboxes are good for displaying "lore", or story elements, as well as for explaining complicated things.

          In the default tab layout, the first infobox will be displayed at the very top of the tab.

          Infoboxes are defined like other Big Features:

          js
          infoboxes: {
          +import{_ as s,c as i,o as e,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Infoboxes","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/infoboxes.md","filePath":"public/lit/docs/infoboxes.md","lastUpdated":1603745122000}'),a={name:"public/lit/docs/infoboxes.md"},n=t(`

          Infoboxes

          Infoboxes are good for displaying "lore", or story elements, as well as for explaining complicated things.

          In the default tab layout, the first infobox will be displayed at the very top of the tab.

          Infoboxes are defined like other Big Features:

          js
          infoboxes: {
               lore: {
                   title: "foo",
                   body() { return "bar" },
          diff --git a/assets/public_lit_docs_infoboxes.md.Be2LqzDD.lean.js b/assets/public_lit_docs_infoboxes.md.rD48WYz9.lean.js
          similarity index 85%
          rename from assets/public_lit_docs_infoboxes.md.Be2LqzDD.lean.js
          rename to assets/public_lit_docs_infoboxes.md.rD48WYz9.lean.js
          index f706746c..1d01a5f9 100644
          --- a/assets/public_lit_docs_infoboxes.md.Be2LqzDD.lean.js
          +++ b/assets/public_lit_docs_infoboxes.md.rD48WYz9.lean.js
          @@ -1 +1 @@
          -import{_ as s,c as i,o as e,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Infoboxes","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/infoboxes.md","filePath":"public/lit/docs/infoboxes.md","lastUpdated":1701137263000}'),a={name:"public/lit/docs/infoboxes.md"},n=t("",7),o=[n];function l(p,h,r,d,c,k){return e(),i("div",null,o)}const y=s(a,[["render",l]]);export{u as __pageData,y as default};
          +import{_ as s,c as i,o as e,a9 as t}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Infoboxes","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/infoboxes.md","filePath":"public/lit/docs/infoboxes.md","lastUpdated":1603745122000}'),a={name:"public/lit/docs/infoboxes.md"},n=t("",7),o=[n];function l(p,h,r,d,c,k){return e(),i("div",null,o)}const y=s(a,[["render",l]]);export{u as __pageData,y as default};
          diff --git a/assets/public_lit_docs_layer-features.md.BSLdBpI-.js b/assets/public_lit_docs_layer-features.md.B06xG5cR.js
          similarity index 99%
          rename from assets/public_lit_docs_layer-features.md.BSLdBpI-.js
          rename to assets/public_lit_docs_layer-features.md.B06xG5cR.js
          index e1294201..8b48e71d 100644
          --- a/assets/public_lit_docs_layer-features.md.BSLdBpI-.js
          +++ b/assets/public_lit_docs_layer-features.md.B06xG5cR.js
          @@ -1,4 +1,4 @@
          -import{_ as e,c as t,o as a,a9 as s}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Layer Features","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/layer-features.md","filePath":"public/lit/docs/layer-features.md","lastUpdated":1701137263000}'),i={name:"public/lit/docs/layer-features.md"},o=s(`

          Layer Features

          This is a more comprehensive list of established features to add to layers. You can add more freely, if you want to have other functions or values associated with your layer. These have special functionality, though.

          You can make almost any value dynamic by using a function in its place, including all display strings and styling/color features.

          Layer Definition features

          • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar to access the saved value. It makes copying code to new layers easier. It is also assigned to all upgrades and buyables and such.

          • name: optional. used in reset confirmations (and the default infobox title). If absent, it just uses the layer's id.

          • startData(): A function to return the default save data for this layer. Add any variables you have to it. Make sure to use Decimal values rather than normal numbers.

            Standard values: - Required: - unlocked: a bool determining if this layer is unlocked or not - points: a Decimal, the main currency for the layer - Optional: - total: A Decimal, tracks total amount of main prestige currency. Always tracked, but only shown if you add it here. - best: A Decimal, tracks highest amount of main prestige currency. Always tracked, but only shown if you add it here. - unlockOrder: used to keep track of relevant layers unlocked before this one. - resetTime: A number, time since this layer was last prestiged (or reset by another layer)

          • color: A color associated with this layer, used in many places. (A string in hex format with a #)

          • row: The row of the layer, starting at 0. This affects where the node appears on the standard tree, and which resets affect the layer.

            Using "side" instead of a number will cause the layer to appear off to the side as a smaller node (useful for achievements and statistics). Side layers are not affected by resets unless you add a doReset to them.

          • displayRow: OVERRIDE Changes where the layer node appears without changing where it is in the reset order.

          • resource: Name of the main currency you gain by resetting on this layer.

          • effect(): optional. A function that calculates and returns the current values of any bonuses inherent to the main currency. Can return a value or an object containing multiple values. You will also have to implement the effect where it is applied.

          • effectDescription: optional. A function that returns a description of this effect. If the text stays constant, it can just be a string.

          • layerShown(): optional, A function returning a bool which determines if this layer's node should be visible on the tree. It can also return "ghost", which will hide the layer, but its node will still take up space in the tree. Defaults to true.

          • hotkeys: optional. An array containing information on any hotkeys associated with this layer:

            js
            hotkeys: [
            +import{_ as e,c as t,o as a,a9 as s}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Layer Features","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/layer-features.md","filePath":"public/lit/docs/layer-features.md","lastUpdated":1608606573000}'),i={name:"public/lit/docs/layer-features.md"},o=s(`

            Layer Features

            This is a more comprehensive list of established features to add to layers. You can add more freely, if you want to have other functions or values associated with your layer. These have special functionality, though.

            You can make almost any value dynamic by using a function in its place, including all display strings and styling/color features.

            Layer Definition features

            • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar to access the saved value. It makes copying code to new layers easier. It is also assigned to all upgrades and buyables and such.

            • name: optional. used in reset confirmations (and the default infobox title). If absent, it just uses the layer's id.

            • startData(): A function to return the default save data for this layer. Add any variables you have to it. Make sure to use Decimal values rather than normal numbers.

              Standard values: - Required: - unlocked: a bool determining if this layer is unlocked or not - points: a Decimal, the main currency for the layer - Optional: - total: A Decimal, tracks total amount of main prestige currency. Always tracked, but only shown if you add it here. - best: A Decimal, tracks highest amount of main prestige currency. Always tracked, but only shown if you add it here. - unlockOrder: used to keep track of relevant layers unlocked before this one. - resetTime: A number, time since this layer was last prestiged (or reset by another layer)

            • color: A color associated with this layer, used in many places. (A string in hex format with a #)

            • row: The row of the layer, starting at 0. This affects where the node appears on the standard tree, and which resets affect the layer.

              Using "side" instead of a number will cause the layer to appear off to the side as a smaller node (useful for achievements and statistics). Side layers are not affected by resets unless you add a doReset to them.

            • displayRow: OVERRIDE Changes where the layer node appears without changing where it is in the reset order.

            • resource: Name of the main currency you gain by resetting on this layer.

            • effect(): optional. A function that calculates and returns the current values of any bonuses inherent to the main currency. Can return a value or an object containing multiple values. You will also have to implement the effect where it is applied.

            • effectDescription: optional. A function that returns a description of this effect. If the text stays constant, it can just be a string.

            • layerShown(): optional, A function returning a bool which determines if this layer's node should be visible on the tree. It can also return "ghost", which will hide the layer, but its node will still take up space in the tree. Defaults to true.

            • hotkeys: optional. An array containing information on any hotkeys associated with this layer:

              js
              hotkeys: [
                   {
                       key: "p", // What the hotkey button is. Use uppercase if it's combined with shift, or "ctrl+x" for holding down ctrl.
                       description: "p: reset your points for prestige points", // The description of the hotkey that is displayed in the game's How To Play tab
              diff --git a/assets/public_lit_docs_layer-features.md.BSLdBpI-.lean.js b/assets/public_lit_docs_layer-features.md.B06xG5cR.lean.js
              similarity index 86%
              rename from assets/public_lit_docs_layer-features.md.BSLdBpI-.lean.js
              rename to assets/public_lit_docs_layer-features.md.B06xG5cR.lean.js
              index e1fb98bf..fe3fac1d 100644
              --- a/assets/public_lit_docs_layer-features.md.BSLdBpI-.lean.js
              +++ b/assets/public_lit_docs_layer-features.md.B06xG5cR.lean.js
              @@ -1 +1 @@
              -import{_ as e,c as t,o as a,a9 as s}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Layer Features","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/layer-features.md","filePath":"public/lit/docs/layer-features.md","lastUpdated":1701137263000}'),i={name:"public/lit/docs/layer-features.md"},o=s("",19),r=[o];function n(l,h,u,p,d,c){return a(),t("div",null,r)}const f=e(i,[["render",n]]);export{y as __pageData,f as default};
              +import{_ as e,c as t,o as a,a9 as s}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Layer Features","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/layer-features.md","filePath":"public/lit/docs/layer-features.md","lastUpdated":1608606573000}'),i={name:"public/lit/docs/layer-features.md"},o=s("",19),r=[o];function n(l,h,u,p,d,c){return a(),t("div",null,r)}const f=e(i,[["render",n]]);export{y as __pageData,f as default};
              diff --git a/assets/public_lit_docs_main-mod-info.md.CUo3Y8ir.js b/assets/public_lit_docs_main-mod-info.md.DgSHm7mV.js
              similarity index 99%
              rename from assets/public_lit_docs_main-mod-info.md.CUo3Y8ir.js
              rename to assets/public_lit_docs_main-mod-info.md.DgSHm7mV.js
              index ee99275f..377c9a32 100644
              --- a/assets/public_lit_docs_main-mod-info.md.CUo3Y8ir.js
              +++ b/assets/public_lit_docs_main-mod-info.md.DgSHm7mV.js
              @@ -1,4 +1,4 @@
              -import{_ as i,c as t,o as e,a9 as s}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"mod.js","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/main-mod-info.md","filePath":"public/lit/docs/main-mod-info.md","lastUpdated":1701137263000}'),a={name:"public/lit/docs/main-mod-info.md"},n=s(`

              mod.js

              All of the non-layer code and data that you're likely to edit is here in mod.js! Everything in mod.js will not be altered by updates, besides the addition of new things.

              Here's a breakdown of what's in it:

              • modInfo is where most of the basic configuration for the mod is. It contains:

                • name: The name of your mod. (a string)

                • id: The id for your mod, a unique string that is used to determine savefile location. Setting it is important!

                • author: The name of the author, displayed in the info tab.

                • pointsName: This changes what is displayed instead of "points" for the main currency. (It does not affect it in the code.)

                • discordName, discordLink: If you have a Discord server or other discussion place, you can add a link to it.

                  "discordName" is the text on the link, and "discordLink" is the url of an invite. If you're using a Discord invite, please make sure it's set to never expire.

                • offlineLimit: The maximum amount of offline time that the player can accumulate, in hours. Any extra time is lost. (a number)

                  This is useful because most of these mods are fast-paced enough that too much offline time ruins the balance, such as the time in between updates. That is why I suggest developers disable offline time on their own savefile.

                • initialStartPoints: A Decimal for the amount of points a new player should start with.

              • VERSION is used to describe the current version of your mod. It contains:

                • num: The mod's version number, displayed at the top right of the tree tab.
                • name: The version's name, displayed alongside the number in the info tab.
              • changelog is the HTML displayed in the changelog tab.

              • doNotCallTheseFunctionsEveryTick is very important. TMT calls every function anywhere in "layers" every tick to store the result, unless specifically told not to. Functions that have are used to do an action need to be identified. "Official" functions (those in the documentation) are all fine, but if you make any new ones, add their names to this array.

              js
              // (The ones here are examples, all official functions are already taken care of)
              +import{_ as i,c as t,o as e,a9 as s}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"mod.js","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/main-mod-info.md","filePath":"public/lit/docs/main-mod-info.md","lastUpdated":1607197949000}'),a={name:"public/lit/docs/main-mod-info.md"},n=s(`

              mod.js

              All of the non-layer code and data that you're likely to edit is here in mod.js! Everything in mod.js will not be altered by updates, besides the addition of new things.

              Here's a breakdown of what's in it:

              • modInfo is where most of the basic configuration for the mod is. It contains:

                • name: The name of your mod. (a string)

                • id: The id for your mod, a unique string that is used to determine savefile location. Setting it is important!

                • author: The name of the author, displayed in the info tab.

                • pointsName: This changes what is displayed instead of "points" for the main currency. (It does not affect it in the code.)

                • discordName, discordLink: If you have a Discord server or other discussion place, you can add a link to it.

                  "discordName" is the text on the link, and "discordLink" is the url of an invite. If you're using a Discord invite, please make sure it's set to never expire.

                • offlineLimit: The maximum amount of offline time that the player can accumulate, in hours. Any extra time is lost. (a number)

                  This is useful because most of these mods are fast-paced enough that too much offline time ruins the balance, such as the time in between updates. That is why I suggest developers disable offline time on their own savefile.

                • initialStartPoints: A Decimal for the amount of points a new player should start with.

              • VERSION is used to describe the current version of your mod. It contains:

                • num: The mod's version number, displayed at the top right of the tree tab.
                • name: The version's name, displayed alongside the number in the info tab.
              • changelog is the HTML displayed in the changelog tab.

              • doNotCallTheseFunctionsEveryTick is very important. TMT calls every function anywhere in "layers" every tick to store the result, unless specifically told not to. Functions that have are used to do an action need to be identified. "Official" functions (those in the documentation) are all fine, but if you make any new ones, add their names to this array.

              js
              // (The ones here are examples, all official functions are already taken care of)
               var doNotCallTheseFunctionsEveryTick = ["doReset", "buy", "onPurchase", "blowUpEverything"]
              • getStartPoints(): A function to determine the amount of points the player starts with after a reset. (returns a Decimal value)

              • canGenPoints(): A function returning a boolean for if points should be generated. Use this if you want an upgrade to unlock generating points.

              • getPointGen(): A function that calculates your points per second. Anything that affects your point gain should go into the calculation here.

              • addedPlayerData(): A function that returns any non-layer-related data that you want to be added to the save data and "player" object.

              js
              function addedPlayerData() { return {
               	weather: "Yes",
               	happiness: new Decimal(72),
              diff --git a/assets/public_lit_docs_main-mod-info.md.CUo3Y8ir.lean.js b/assets/public_lit_docs_main-mod-info.md.DgSHm7mV.lean.js
              similarity index 86%
              rename from assets/public_lit_docs_main-mod-info.md.CUo3Y8ir.lean.js
              rename to assets/public_lit_docs_main-mod-info.md.DgSHm7mV.lean.js
              index 057234a6..7534d42e 100644
              --- a/assets/public_lit_docs_main-mod-info.md.CUo3Y8ir.lean.js
              +++ b/assets/public_lit_docs_main-mod-info.md.DgSHm7mV.lean.js
              @@ -1 +1 @@
              -import{_ as i,c as t,o as e,a9 as s}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"mod.js","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/main-mod-info.md","filePath":"public/lit/docs/main-mod-info.md","lastUpdated":1701137263000}'),a={name:"public/lit/docs/main-mod-info.md"},n=s("",10),o=[n];function l(h,p,r,d,u,c){return e(),t("div",null,o)}const y=i(a,[["render",l]]);export{m as __pageData,y as default};
              +import{_ as i,c as t,o as e,a9 as s}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"mod.js","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/main-mod-info.md","filePath":"public/lit/docs/main-mod-info.md","lastUpdated":1607197949000}'),a={name:"public/lit/docs/main-mod-info.md"},n=s("",10),o=[n];function l(h,p,r,d,u,c){return e(),t("div",null,o)}const y=i(a,[["render",l]]);export{m as __pageData,y as default};
              diff --git a/assets/public_lit_docs_milestones.md.DKpEd4GK.js b/assets/public_lit_docs_milestones.md.Cty1k_dD.js
              similarity index 98%
              rename from assets/public_lit_docs_milestones.md.DKpEd4GK.js
              rename to assets/public_lit_docs_milestones.md.Cty1k_dD.js
              index ab0e1164..b73c1af6 100644
              --- a/assets/public_lit_docs_milestones.md.DKpEd4GK.js
              +++ b/assets/public_lit_docs_milestones.md.Cty1k_dD.js
              @@ -1,4 +1,4 @@
              -import{_ as e,c as s,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const k=JSON.parse('{"title":"Milestones","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/milestones.md","filePath":"public/lit/docs/milestones.md","lastUpdated":1701137263000}'),a={name:"public/lit/docs/milestones.md"},n=t(`

              Milestones

              Milestones are awarded to the player when they meet a certain goal, and give some benefit. Milestones should be formatted like this:

              js
              milestones: {
              +import{_ as e,c as s,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const k=JSON.parse('{"title":"Milestones","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/milestones.md","filePath":"public/lit/docs/milestones.md","lastUpdated":1607827402000}'),a={name:"public/lit/docs/milestones.md"},n=t(`

              Milestones

              Milestones are awarded to the player when they meet a certain goal, and give some benefit. Milestones should be formatted like this:

              js
              milestones: {
                   0: {
                       requirementDescription: "123 waffles",
                       effectDescription: "blah",
              diff --git a/assets/public_lit_docs_milestones.md.DKpEd4GK.lean.js b/assets/public_lit_docs_milestones.md.Cty1k_dD.lean.js
              similarity index 85%
              rename from assets/public_lit_docs_milestones.md.DKpEd4GK.lean.js
              rename to assets/public_lit_docs_milestones.md.Cty1k_dD.lean.js
              index f6d18935..e1f1bc4d 100644
              --- a/assets/public_lit_docs_milestones.md.DKpEd4GK.lean.js
              +++ b/assets/public_lit_docs_milestones.md.Cty1k_dD.lean.js
              @@ -1 +1 @@
              -import{_ as e,c as s,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const k=JSON.parse('{"title":"Milestones","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/milestones.md","filePath":"public/lit/docs/milestones.md","lastUpdated":1701137263000}'),a={name:"public/lit/docs/milestones.md"},n=t("",7),l=[n];function o(h,p,r,d,c,g){return i(),s("div",null,l)}const m=e(a,[["render",o]]);export{k as __pageData,m as default};
              +import{_ as e,c as s,o as i,a9 as t}from"./chunks/framework.D8PMdl4T.js";const k=JSON.parse('{"title":"Milestones","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/milestones.md","filePath":"public/lit/docs/milestones.md","lastUpdated":1607827402000}'),a={name:"public/lit/docs/milestones.md"},n=t("",7),l=[n];function o(h,p,r,d,c,g){return i(),s("div",null,l)}const m=e(a,[["render",o]]);export{k as __pageData,m as default};
              diff --git a/assets/public_lit_docs_subtabs-and-microtabs.md.CICoMMMb.js b/assets/public_lit_docs_subtabs-and-microtabs.md.BRlF9GbR.js
              similarity index 99%
              rename from assets/public_lit_docs_subtabs-and-microtabs.md.CICoMMMb.js
              rename to assets/public_lit_docs_subtabs-and-microtabs.md.BRlF9GbR.js
              index 8949d6dd..cecf7264 100644
              --- a/assets/public_lit_docs_subtabs-and-microtabs.md.CICoMMMb.js
              +++ b/assets/public_lit_docs_subtabs-and-microtabs.md.BRlF9GbR.js
              @@ -1,4 +1,4 @@
              -import{_ as s,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Subtabs and Microtabs","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/subtabs-and-microtabs.md","filePath":"public/lit/docs/subtabs-and-microtabs.md","lastUpdated":1701137263000}'),n={name:"public/lit/docs/subtabs-and-microtabs.md"},e=i(`

              Subtabs and Microtabs

              Subtabs are separate sections of a tab that you can view by selecting one at the top of the tab. Microtabs are smaller areas that function in much the same way. You can also embed layers inside of subtabs/microtabs.

              Subtabs are defined by using the tab format like this, where each element of tabFormat is given the name of that subtab:

              js
              tabFormat: {
              +import{_ as s,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Subtabs and Microtabs","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/subtabs-and-microtabs.md","filePath":"public/lit/docs/subtabs-and-microtabs.md","lastUpdated":1603997862000}'),n={name:"public/lit/docs/subtabs-and-microtabs.md"},e=i(`

              Subtabs and Microtabs

              Subtabs are separate sections of a tab that you can view by selecting one at the top of the tab. Microtabs are smaller areas that function in much the same way. You can also embed layers inside of subtabs/microtabs.

              Subtabs are defined by using the tab format like this, where each element of tabFormat is given the name of that subtab:

              js
              tabFormat: {
                   "Main tab": {
                       content: [tab format things],
                       *subtab features*
              diff --git a/assets/public_lit_docs_subtabs-and-microtabs.md.CICoMMMb.lean.js b/assets/public_lit_docs_subtabs-and-microtabs.md.BRlF9GbR.lean.js
              similarity index 87%
              rename from assets/public_lit_docs_subtabs-and-microtabs.md.CICoMMMb.lean.js
              rename to assets/public_lit_docs_subtabs-and-microtabs.md.BRlF9GbR.lean.js
              index ca0e3115..9f14d9f2 100644
              --- a/assets/public_lit_docs_subtabs-and-microtabs.md.CICoMMMb.lean.js
              +++ b/assets/public_lit_docs_subtabs-and-microtabs.md.BRlF9GbR.lean.js
              @@ -1 +1 @@
              -import{_ as s,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Subtabs and Microtabs","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/subtabs-and-microtabs.md","filePath":"public/lit/docs/subtabs-and-microtabs.md","lastUpdated":1701137263000}'),n={name:"public/lit/docs/subtabs-and-microtabs.md"},e=i("",9),l=[e];function h(p,o,r,k,d,c){return t(),a("div",null,l)}const E=s(n,[["render",h]]);export{u as __pageData,E as default};
              +import{_ as s,c as a,o as t,a9 as i}from"./chunks/framework.D8PMdl4T.js";const u=JSON.parse('{"title":"Subtabs and Microtabs","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/subtabs-and-microtabs.md","filePath":"public/lit/docs/subtabs-and-microtabs.md","lastUpdated":1603997862000}'),n={name:"public/lit/docs/subtabs-and-microtabs.md"},e=i("",9),l=[e];function h(p,o,r,k,d,c){return t(),a("div",null,l)}const E=s(n,[["render",h]]);export{u as __pageData,E as default};
              diff --git a/assets/public_lit_docs_trees-and-tree-customization.md.CWsN4p6Q.js b/assets/public_lit_docs_trees-and-tree-customization.md.B4CePdZ2.js
              similarity index 98%
              rename from assets/public_lit_docs_trees-and-tree-customization.md.CWsN4p6Q.js
              rename to assets/public_lit_docs_trees-and-tree-customization.md.B4CePdZ2.js
              index 6da3a1da..4ba05604 100644
              --- a/assets/public_lit_docs_trees-and-tree-customization.md.CWsN4p6Q.js
              +++ b/assets/public_lit_docs_trees-and-tree-customization.md.B4CePdZ2.js
              @@ -1,3 +1,3 @@
              -import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Trees and tree customization","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/trees-and-tree-customization.md","filePath":"public/lit/docs/trees-and-tree-customization.md","lastUpdated":1701137263000}'),s={name:"public/lit/docs/trees-and-tree-customization.md"},o=i(`

              Trees and tree customization

              If you want to have something beyond the standard tree on the left tab, you can do that in tree.js. You can change the layout of the tree, including making non-layer nodes, change it into something other than a tree, or hide the left tab altogether. This also introduces the "tree" component, which can be used in your layers as well.

              layoutInfo

              The most important part is layoutInfo, containing:

              • startTab: The id of the default tab to show on the left at the start.
              • showTree: True if the tree tab should be shown at the start of the game. (The other tab will fill the whole page)
              • treeLayout: If present, overrides the tree layout and places nodes as you describe instead (explained in the next section).

              Additionally, if you want the main layout to not be a tree, you can edit the "tree-tab" layer at the bottom of tree.js to modify it just like a normal layer's tab. You can even switch between left tabs, using showNavTab(layer) to make that layer appear on the left.

              Trees

              The tree component is defined as an array of arrays of names of layers or nodes to show in the tree. They work just like layers/ nodes in the main tree (but branches between nodes will only work on the first node if you have duplicates.)

              Here is an example tree:

              js
              [["p"],
              +import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Trees and tree customization","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/trees-and-tree-customization.md","filePath":"public/lit/docs/trees-and-tree-customization.md","lastUpdated":1604787966000}'),s={name:"public/lit/docs/trees-and-tree-customization.md"},o=i(`

              Trees and tree customization

              If you want to have something beyond the standard tree on the left tab, you can do that in tree.js. You can change the layout of the tree, including making non-layer nodes, change it into something other than a tree, or hide the left tab altogether. This also introduces the "tree" component, which can be used in your layers as well.

              layoutInfo

              The most important part is layoutInfo, containing:

              • startTab: The id of the default tab to show on the left at the start.
              • showTree: True if the tree tab should be shown at the start of the game. (The other tab will fill the whole page)
              • treeLayout: If present, overrides the tree layout and places nodes as you describe instead (explained in the next section).

              Additionally, if you want the main layout to not be a tree, you can edit the "tree-tab" layer at the bottom of tree.js to modify it just like a normal layer's tab. You can even switch between left tabs, using showNavTab(layer) to make that layer appear on the left.

              Trees

              The tree component is defined as an array of arrays of names of layers or nodes to show in the tree. They work just like layers/ nodes in the main tree (but branches between nodes will only work on the first node if you have duplicates.)

              Here is an example tree:

              js
              [["p"],
                ["left", "blank", "right", "blank"]
                ["a", "b", "blank", "c", "weirdButton"]]

              Nodes

              Nodes are non-layer buttons that can go in trees. They are defined similarly to layers, but with addNode instead of addLayer.

              Features:

              • color: optional, The node's color. (A string in hex format with a #)

              • symbol: optional The text on the button (The id capitalized by default)

              • canClick(): Returns true if the player can click the node. ()

              • onClick(): The function called when the node is clicked.

              • layerShown(): optional, A function returning a bool which determines if this node should be visible. It can also return "ghost", which will hide the layer, but its node will still take up space in its tree.

              • branches: optional. An array of layer/node ids. On a tree, a line will appear from this node to all of the nodes in the list. Alternatively, an entry in the array can be a 2-element array consisting of the id and a color value. The color value can either be a string with a hex color code, or a number from 1-3 (theme-affected colors).

              • nodeStyle: optional. A CSS object, where the keys are CSS attributes, which styles this node on the tree.

              • tooltip() / tooltipLocked(): optional. Functions that return text, which is the tooltip for the node when the layer is unlocked or locked, respectively. By default the tooltips behave the same as in the original Prestige Tree.

              • row: optional, the row that this node appears in (for the default tree).

              • position: optional, Determines the horizontal position of the layer in its row in a default tree. By default, it uses the id, and layers/nodes are sorted in alphabetical order.

              `,14),n=[o];function l(r,h,d,p,u,c){return a(),t("div",null,n)}const g=e(s,[["render",l]]);export{y as __pageData,g as default}; diff --git a/assets/public_lit_docs_trees-and-tree-customization.md.CWsN4p6Q.lean.js b/assets/public_lit_docs_trees-and-tree-customization.md.B4CePdZ2.lean.js similarity index 87% rename from assets/public_lit_docs_trees-and-tree-customization.md.CWsN4p6Q.lean.js rename to assets/public_lit_docs_trees-and-tree-customization.md.B4CePdZ2.lean.js index d2736305..f63789dc 100644 --- a/assets/public_lit_docs_trees-and-tree-customization.md.CWsN4p6Q.lean.js +++ b/assets/public_lit_docs_trees-and-tree-customization.md.B4CePdZ2.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Trees and tree customization","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/trees-and-tree-customization.md","filePath":"public/lit/docs/trees-and-tree-customization.md","lastUpdated":1701137263000}'),s={name:"public/lit/docs/trees-and-tree-customization.md"},o=i("",14),n=[o];function l(r,h,d,p,u,c){return a(),t("div",null,n)}const g=e(s,[["render",l]]);export{y as __pageData,g as default}; +import{_ as e,c as t,o as a,a9 as i}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Trees and tree customization","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/trees-and-tree-customization.md","filePath":"public/lit/docs/trees-and-tree-customization.md","lastUpdated":1604787966000}'),s={name:"public/lit/docs/trees-and-tree-customization.md"},o=i("",14),n=[o];function l(r,h,d,p,u,c){return a(),t("div",null,n)}const g=e(s,[["render",l]]);export{y as __pageData,g as default}; diff --git a/assets/public_lit_docs_updating-tmt.md.K90Uh1tC.js b/assets/public_lit_docs_updating-tmt.md.Bx5ufyRr.js similarity index 97% rename from assets/public_lit_docs_updating-tmt.md.K90Uh1tC.js rename to assets/public_lit_docs_updating-tmt.md.Bx5ufyRr.js index 8ddc3b4e..01f18690 100644 --- a/assets/public_lit_docs_updating-tmt.md.K90Uh1tC.js +++ b/assets/public_lit_docs_updating-tmt.md.Bx5ufyRr.js @@ -1 +1 @@ -import{_ as t,c as e,o,a9 as a}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Updating The Modding Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/updating-tmt.md","filePath":"public/lit/docs/updating-tmt.md","lastUpdated":1701137263000}'),i={name:"public/lit/docs/updating-tmt.md"},n=a('

              Updating The Modding Tree

              This tutorial assumes that you have used the Getting Started Tutorial, and are using Github Desktop and VSCode for your mod.

              Here's what you have to do when there's a TMT update:

              1. Look at the changelog. It will warn you if the update will break anything or require any changes. Decide if you want to try to update.

              2. Open Github Desktop, and at the top middle, click "fetch origin". This will make Github Desktop get information about the update.

              3. Click where it says "current branch: master" at the top middle, and at the bottom of the thing that appears, click "choose a branch to merge into master".

              4. Select upstream/master. It will likely say there are conflicts, but you have tools to resolve them. Click "Merge upstream/master into master".

              5. A conflict happens when the things you're trying to merge have both made changes in the same place. Click "open in Visual Studio Code" next to the first file.

              6. Scroll down through the file, and look for the parts highlighted in red and green. One of these is your code, and the other is some code that will be modified by the update. Do your best to try to edit things to keep the updated changes, but keep your content.

              7. Continue to do this for all remaining changes.

              8. Do any other changes required by the update, run the game, fix issues, etc.

              ',4),r=[n];function d(h,s,l,p,u,c){return o(),e("div",null,r)}const _=t(i,[["render",d]]);export{m as __pageData,_ as default}; +import{_ as t,c as e,o,a9 as a}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Updating The Modding Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/updating-tmt.md","filePath":"public/lit/docs/updating-tmt.md","lastUpdated":1603745122000}'),i={name:"public/lit/docs/updating-tmt.md"},n=a('

              Updating The Modding Tree

              This tutorial assumes that you have used the Getting Started Tutorial, and are using Github Desktop and VSCode for your mod.

              Here's what you have to do when there's a TMT update:

              1. Look at the changelog. It will warn you if the update will break anything or require any changes. Decide if you want to try to update.

              2. Open Github Desktop, and at the top middle, click "fetch origin". This will make Github Desktop get information about the update.

              3. Click where it says "current branch: master" at the top middle, and at the bottom of the thing that appears, click "choose a branch to merge into master".

              4. Select upstream/master. It will likely say there are conflicts, but you have tools to resolve them. Click "Merge upstream/master into master".

              5. A conflict happens when the things you're trying to merge have both made changes in the same place. Click "open in Visual Studio Code" next to the first file.

              6. Scroll down through the file, and look for the parts highlighted in red and green. One of these is your code, and the other is some code that will be modified by the update. Do your best to try to edit things to keep the updated changes, but keep your content.

              7. Continue to do this for all remaining changes.

              8. Do any other changes required by the update, run the game, fix issues, etc.

              ',4),r=[n];function d(h,s,l,p,u,c){return o(),e("div",null,r)}const _=t(i,[["render",d]]);export{m as __pageData,_ as default}; diff --git a/assets/public_lit_docs_updating-tmt.md.K90Uh1tC.lean.js b/assets/public_lit_docs_updating-tmt.md.Bx5ufyRr.lean.js similarity index 86% rename from assets/public_lit_docs_updating-tmt.md.K90Uh1tC.lean.js rename to assets/public_lit_docs_updating-tmt.md.Bx5ufyRr.lean.js index eb0a02e0..397b89ec 100644 --- a/assets/public_lit_docs_updating-tmt.md.K90Uh1tC.lean.js +++ b/assets/public_lit_docs_updating-tmt.md.Bx5ufyRr.lean.js @@ -1 +1 @@ -import{_ as t,c as e,o,a9 as a}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Updating The Modding Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/updating-tmt.md","filePath":"public/lit/docs/updating-tmt.md","lastUpdated":1701137263000}'),i={name:"public/lit/docs/updating-tmt.md"},n=a("",4),r=[n];function d(h,s,l,p,u,c){return o(),e("div",null,r)}const _=t(i,[["render",d]]);export{m as __pageData,_ as default}; +import{_ as t,c as e,o,a9 as a}from"./chunks/framework.D8PMdl4T.js";const m=JSON.parse('{"title":"Updating The Modding Tree","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/updating-tmt.md","filePath":"public/lit/docs/updating-tmt.md","lastUpdated":1603745122000}'),i={name:"public/lit/docs/updating-tmt.md"},n=a("",4),r=[n];function d(h,s,l,p,u,c){return o(),e("div",null,r)}const _=t(i,[["render",d]]);export{m as __pageData,_ as default}; diff --git a/assets/public_lit_docs_upgrades.md.DnP9Av1u.js b/assets/public_lit_docs_upgrades.md.Bh4bFGTK.js similarity index 99% rename from assets/public_lit_docs_upgrades.md.DnP9Av1u.js rename to assets/public_lit_docs_upgrades.md.Bh4bFGTK.js index 3dcaa994..a4251f96 100644 --- a/assets/public_lit_docs_upgrades.md.DnP9Av1u.js +++ b/assets/public_lit_docs_upgrades.md.Bh4bFGTK.js @@ -1,4 +1,4 @@ -import{_ as e,c as s,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Upgrades","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/upgrades.md","filePath":"public/lit/docs/upgrades.md","lastUpdated":1701137263000}'),t={name:"public/lit/docs/upgrades.md"},n=a(`

              Upgrades

              Useful functions for dealing with Upgrades and implementing their effects:

              • hasUpgrade(layer, id): determine if the player has the upgrade
              • upgradeEffect(layer, id): Returns the current effects of the upgrade, if any
              • buyUpgrade(layer, id): Buys an upgrade directly (if affordable)

              Hint: Basic point gain is calculated in mod.js's "getPointGen" function.

              Upgrades are stored in the following format:

              js
              upgrades: {
              +import{_ as e,c as s,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Upgrades","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/upgrades.md","filePath":"public/lit/docs/upgrades.md","lastUpdated":1606766606000}'),t={name:"public/lit/docs/upgrades.md"},n=a(`

              Upgrades

              Useful functions for dealing with Upgrades and implementing their effects:

              • hasUpgrade(layer, id): determine if the player has the upgrade
              • upgradeEffect(layer, id): Returns the current effects of the upgrade, if any
              • buyUpgrade(layer, id): Buys an upgrade directly (if affordable)

              Hint: Basic point gain is calculated in mod.js's "getPointGen" function.

              Upgrades are stored in the following format:

              js
              upgrades: {
                   rows: # of rows,
                   cols: # of columns,
                   11: {
              diff --git a/assets/public_lit_docs_upgrades.md.DnP9Av1u.lean.js b/assets/public_lit_docs_upgrades.md.Bh4bFGTK.lean.js
              similarity index 85%
              rename from assets/public_lit_docs_upgrades.md.DnP9Av1u.lean.js
              rename to assets/public_lit_docs_upgrades.md.Bh4bFGTK.lean.js
              index 2ce755de..9d096c2a 100644
              --- a/assets/public_lit_docs_upgrades.md.DnP9Av1u.lean.js
              +++ b/assets/public_lit_docs_upgrades.md.Bh4bFGTK.lean.js
              @@ -1 +1 @@
              -import{_ as e,c as s,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Upgrades","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/upgrades.md","filePath":"public/lit/docs/upgrades.md","lastUpdated":1701137263000}'),t={name:"public/lit/docs/upgrades.md"},n=a("",13),l=[n];function r(o,p,h,d,u,c){return i(),s("div",null,l)}const k=e(t,[["render",r]]);export{y as __pageData,k as default};
              +import{_ as e,c as s,o as i,a9 as a}from"./chunks/framework.D8PMdl4T.js";const y=JSON.parse('{"title":"Upgrades","description":"","frontmatter":{},"headers":[],"relativePath":"public/lit/docs/upgrades.md","filePath":"public/lit/docs/upgrades.md","lastUpdated":1606766606000}'),t={name:"public/lit/docs/upgrades.md"},n=a("",13),l=[n];function r(o,p,h,d,u,c){return i(),s("div",null,l)}const k=e(t,[["render",r]]);export{y as __pageData,k as default};
              diff --git a/changelog/index.html b/changelog/index.html
              index f4fa337f..8d03e04f 100644
              --- a/changelog/index.html
              +++ b/changelog/index.html
              @@ -8,11 +8,11 @@
                   
                   
                   
              -    
              +    
                   
                   
              -    
              -    
              +    
              +    
                   
                   
                   
              @@ -306,8 +306,8 @@
                   
                 
               
              -

            Changelog

            This feed starts when I formatted the site to be a Digital Garden. If you'd like to look further into this site's history, check here!

            more testing

            Pushed on

            PageChanges
            activitypub15 +++++
            advent-incremental23 +++++++
            atproto20 ++++++
            babble-buds24 +++++++
            capture-the-citadel17 +++++
            chat-glue14 ++++
            chronological23 +++++++
            cinny12 ++++
            commune35 ++++++++++
            davey-wreden22 +++++++
            decentralized30 +++++++++
            dice-armor57 ++++++++++++++++
            digital-gardens22 +++++++
            federated-identity25 +++++++
            fedi-v2114 ++++++++++++++++++++++++++++++++
            fediverse23 +++++++
            forgejo12 ++++
            freeform-vs-chronological-dichotomy12 ++++
            freeform19 ++++++
            game-dev-tree19 ++++++
            garden-rss24 +++++++
            guide-to-incrementals/appeal-to-developers32 +++++++++
            guide-to-incrementals/appeal-to-players62 +++++++++++++++++
            guide-to-incrementals/defining-the-genre143 ++++++++++++++++++++++++++++++++++++++++
            guide-to-incrementals29 ++++++++
            guide-to-incrementals/navigating-criticism28 ++++++++
            guide-to-incrementals/what-is-content54 +++++++++++++++
            incremental-social18 +++++
            ivy-road15 +++++
            kronos20 ++++++
            logseq12 ++++
            matrix12 ++++
            mbin14 ++++
            my-personal-website12 ++++
            my-projects29 ++++++++
            nostr15 +++++
            open-source14 ++++
            opti-speech39 +++++++++++
            planar-pioneers17 +++++
            profectus26 ++++++++
            social-media27 ++++++++
            synapse12 ++++
            the-beginner-s-guide22 +++++++
            the-cozy-web18 +++++
            the-small-web77 ++++++++++++++++++++++
            this-knowledge-hub25 +++++++
            v-ecs27 ++++++++
            vitepress12 ++++
            wanderstop13 ++++
            webrings27 ++++++++
            weird14 ++++

            51 files changed, 1427 insertions(+)

          - +

          Changelog

          This feed starts when I formatted the site to be a Digital Garden. If you'd like to look further into this site's history, check here!

          Update the-small-web There's some new pages that are not quite ready yet, so I left those out

          Pushed on

          PageChanges
          the-small-web14 +++++++++++---

          1 file changed, 11 insertions(+), 3 deletions(-)

          Update garden

          Pushed on

          PageChanges
          digital-gardens2 +-
          fedi-v23 ++-
          the-small-web81 ++++++++++++++++++++++++++++++++++++++------------------------------

          3 files changed, 48 insertions(+), 38 deletions(-)

          Update garden pages

          Pushed on

          PageChanges
          activitypub2 ++
          advent-incremental2 ++
          atproto2 ++
          babble-buds2 ++
          capture-the-citadel2 ++
          chat-glue2 ++
          chronological2 ++
          cinny2 ++
          commune2 ++
          decentralized2 ++
          dice-armor2 ++
          digital-gardens2 ++
          federated-identity2 ++
          fedi-v230 ++++++++++++++++++++++++------
          fediverse2 ++
          forgejo2 ++
          freeform-vs-chronological-dichotomy2 ++
          freeform2 ++
          game-dev-tree2 ++
          garden-rss4 +++-
          guide-to-incrementals/appeal-to-developers2 ++
          guide-to-incrementals/appeal-to-players6 ++++--
          guide-to-incrementals/defining-the-genre6 ++++--
          guide-to-incrementals2 ++
          guide-to-incrementals/navigating-criticism2 ++
          guide-to-incrementals/what-is-content4 +++-
          incremental-social2 ++
          kronos2 ++
          logseq2 ++
          matrix2 ++
          mbin2 ++
          my-personal-website2 ++
          my-projects2 ++
          nostr2 ++
          open-source2 ++
          opti-speech2 ++
          planar-pioneers2 ++
          profectus4 +++-
          social-media2 ++
          synapse2 ++
          the-cozy-web2 ++
          the-small-web2 ++
          this-knowledge-hub3 +++
          v-ecs2 ++
          vitepress2 ++
          webrings2 ++
          weird2 ++

          47 files changed, 124 insertions(+), 13 deletions(-)

          Make garden tracked via git

          Pushed on

          PageChanges
          activitypub13 ++++
          advent-incremental21 ++++++
          atproto18 +++++
          babble-buds22 +++++++
          capture-the-citadel15 +++++
          chat-glue12 ++++
          chronological21 ++++++
          cinny10 +++
          commune33 ++++++++++
          decentralized28 ++++++++
          dice-armor55 ++++++++++++++++
          digital-gardens20 ++++++
          federated-identity23 +++++++
          fedi-v295 +++++++++++++++++++++++++++
          fediverse21 ++++++
          forgejo10 +++
          freeform-vs-chronological-dichotomy10 +++
          freeform17 +++++
          game-dev-tree17 +++++
          garden-rss22 +++++++
          guide-to-incrementals/appeal-to-developers30 +++++++++
          guide-to-incrementals/appeal-to-players60 +++++++++++++++++
          guide-to-incrementals/defining-the-genre141 ++++++++++++++++++++++++++++++++++++++++
          guide-to-incrementals27 ++++++++
          guide-to-incrementals/navigating-criticism26 ++++++++
          guide-to-incrementals/what-is-content52 +++++++++++++++
          incremental-social16 +++++
          kronos18 +++++
          logseq10 +++
          matrix10 +++
          mbin12 ++++
          my-personal-website10 +++
          my-projects27 ++++++++
          nostr13 ++++
          open-source12 ++++
          opti-speech37 +++++++++++
          planar-pioneers15 +++++
          profectus24 +++++++
          social-media25 +++++++
          synapse10 +++
          the-cozy-web16 +++++
          the-small-web58 +++++++++++++++++
          this-knowledge-hub22 +++++++
          v-ecs25 +++++++
          vitepress10 +++
          webrings25 +++++++
          weird12 ++++

          47 files changed, 1226 insertions(+)

          + \ No newline at end of file diff --git a/garden/activitypub/index.html b/garden/activitypub/index.html index 6d7da6dd..1ca2ca00 100644 --- a/garden/activitypub/index.html +++ b/garden/activitypub/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

          ActivityPub

          Referenced by: Fediverse

          Tags: Decentralized

          ActivityPub is a protocol for Federated Social Media

          Last updated:

          - +

      ActivityPub

      Referenced by: Fediverse

      Tags: Decentralized

      ActivityPub is a protocol for Federated Social Media

      Last updated:

      + \ No newline at end of file diff --git a/garden/advent-incremental/index.html b/garden/advent-incremental/index.html index ed5452e0..16ff1bcc 100644 --- a/garden/advent-incremental/index.html +++ b/garden/advent-incremental/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

      Advent Incremental

      Tags: My Projects, Profectus

      Play it here!

      An Open Source game made in Profectus over the course of 1 month by myself and other devs I know in the Incremental Games community!

      I had the idea of an advent-style game that unlocked new pieces of content every real-life day a couple days before December started.

      This was one of the most hectic months of my life!

      I'm super happy with how it turned out. It ended up being way more ambitious than I anticipated but the end result is super large and awesome!

      The TV Tropes page on this game mentions some of the cool things about this game

      Last updated:

      - +

Advent Incremental

Tags: My Projects, Profectus

Play it here!

An Open Source game made in Profectus over the course of 1 month by myself and other devs I know in the Incremental Games community!

I had the idea of an advent-style game that unlocked new pieces of content every real-life day a couple days before December started.

This was one of the most hectic months of my life!

I'm super happy with how it turned out. It ended up being way more ambitious than I anticipated but the end result is super large and awesome!

The TV Tropes page on this game mentions some of the cool things about this game

Last updated:

+ \ No newline at end of file diff --git a/garden/atproto/index.html b/garden/atproto/index.html index 51feaeb1..0ef929e0 100644 --- a/garden/atproto/index.html +++ b/garden/atproto/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

ATProto

Referenced by: Fediverse

Tags: Decentralized

The AT Protocol is a protocol for Federated Social Media

Currently only used by Bluesky

In comparison to other Fediverse protocols, ATProto is designed for a small number of large instances

Last updated:

- +

ATProto

Referenced by: Fediverse

Tags: Decentralized

The AT Protocol is a protocol for Federated Social Media

Currently only used by Bluesky

In comparison to other Fediverse protocols, ATProto is designed for a small number of large instances

Last updated:

+ \ No newline at end of file diff --git a/garden/babble-buds/index.html b/garden/babble-buds/index.html index a67d350d..9161131a 100644 --- a/garden/babble-buds/index.html +++ b/garden/babble-buds/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Babble Buds

Tags: My Projects

Babble Buds is a tool for creating puppets and interacting with puppets controlled by others on a shared stage

Note: I need to move the website off replit because of their monetization strategy changing. In the meantime, you can check it out from its github repository

Inspired by Puppet Pals by Robert Moran

Intended for use in RPG Campaigns

The renderer was separated into its own project, babble.js, so it could be used for stuff like cutscenes

I ported the engine to C# and used it for the cutscenes in Dice Armor

  • I don't believe I ever separated it out into its own project, but you can find the code here

Last updated:

- +

Babble Buds

Tags: My Projects

Babble Buds is a tool for creating puppets and interacting with puppets controlled by others on a shared stage

Note: I need to move the website off replit because of their monetization strategy changing. In the meantime, you can check it out from its github repository

Inspired by Puppet Pals by Robert Moran

Intended for use in RPG Campaigns

The renderer was separated into its own project, babble.js, so it could be used for stuff like cutscenes

I ported the engine to C# and used it for the cutscenes in Dice Armor

  • I don't believe I ever separated it out into its own project, but you can find the code here

Last updated:

+ \ No newline at end of file diff --git a/garden/capture-the-citadel/index.html b/garden/capture-the-citadel/index.html index ceecc848..97b6767f 100644 --- a/garden/capture-the-citadel/index.html +++ b/garden/capture-the-citadel/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Capture the Citadel

Tags: My Projects

A 3D VR re-envisioning of a Slay the Spire-style game by Anthony Lawn and Grant Barbee for their VR class in college's final project.

For more details, visit Grant's page on the game.

screenshot.png

Last updated:

- +

Capture the Citadel

Tags: My Projects

A 3D VR re-envisioning of a Slay the Spire-style game by Anthony Lawn and Grant Barbee for their VR class in college's final project.

For more details, visit Grant's page on the game.

screenshot.png

Last updated:

+ \ No newline at end of file diff --git a/garden/chat-glue/index.html b/garden/chat-glue/index.html index 59096870..878694f3 100644 --- a/garden/chat-glue/index.html +++ b/garden/chat-glue/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Chat Glue

Referenced by: Commune, My Personal Website, The Small Web

A theoretical chat system designed to solve the problems of transcribing branching conversations into linear timelines.

Defined by the Chatting with Glue comic.

Last updated:

- +

Chat Glue

Referenced by: Commune, My Personal Website, The Small Web

A theoretical chat system designed to solve the problems of transcribing branching conversations into linear timelines.

Defined by the Chatting with Glue comic.

Last updated:

+ \ No newline at end of file diff --git a/garden/chronological/index.html b/garden/chronological/index.html index ab9c2a43..d0460a62 100644 --- a/garden/chronological/index.html +++ b/garden/chronological/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Chronological

Referenced by: Digital Gardens, Freeform vs Chronological Dichotomy, The Small Web

A collection of information that is tied to its creation or edit date

Part of the Freeform vs Chronological Dichotomy

Anything with a "timeline" or "feed" is considered chronological

  • Even if there's algorithmic sortings that take things other than creation or edit date into account!

Chronological displays are less suitable as stores of knowledge (Digital Gardens)

Social media overuses timelines and feeds

RSS feeds work really well with this form of content

Last updated:

- +

Chronological

Referenced by: Digital Gardens, Freeform vs Chronological Dichotomy, The Small Web

A collection of information that is tied to its creation or edit date

Part of the Freeform vs Chronological Dichotomy

Anything with a "timeline" or "feed" is considered chronological

  • Even if there's algorithmic sortings that take things other than creation or edit date into account!

Chronological displays are less suitable as stores of knowledge (Digital Gardens)

Social media overuses timelines and feeds

RSS feeds work really well with this form of content

Last updated:

+ \ No newline at end of file diff --git a/garden/cinny/index.html b/garden/cinny/index.html index 114975b0..446ed95f 100644 --- a/garden/cinny/index.html +++ b/garden/cinny/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Cinny

Referenced by: Incremental Social

Cinny is an Open Source web client for the Matrix messaging protocol

Last updated:

- +

Cinny

Referenced by: Incremental Social

Cinny is an Open Source web client for the Matrix messaging protocol

Last updated:

+ \ No newline at end of file diff --git a/garden/commune/index.html b/garden/commune/index.html index 36da9f24..ac0d4308 100644 --- a/garden/commune/index.html +++ b/garden/commune/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Commune

Referenced by: Federated Identity, Fedi v2, My Personal Website, Webrings, Weird

An Open Source Matrix web client built to be better for communities than anything else out there

  • Currently in development
  • Exposes certain channels such that they are web indexable
  • Will include features like Chat Glue and communal Digital Gardens

Created by Erlend Sogge Heggen, a ex-employee from Discourse

  • Maintains the Commune Blog with great write ups on the issues of the modern web, social media, etc. and how they can be improved (by Commune or related projects)
  • Also maintains a Personal Blog about similar topics

The Commune community is very interested in various topics and how they can relate together:

Related projects:

  • @laxla@tech.lgbt is creating Gimli, a federated discord alternative
    • Built on ActivityPub
    • "Guild-based" in ways matrix is not?
    • Will integrate with F3 as well
    • Wants to handle blogging as well
    • Certainly seems similar to Commune's message gardening concept

Last updated:

- +

Commune

Referenced by: Federated Identity, Fedi v2, My Personal Website, Webrings, Weird

An Open Source Matrix web client built to be better for communities than anything else out there

  • Currently in development
  • Exposes certain channels such that they are web indexable
  • Will include features like Chat Glue and communal Digital Gardens

Created by Erlend Sogge Heggen, a ex-employee from Discourse

  • Maintains the Commune Blog with great write ups on the issues of the modern web, social media, etc. and how they can be improved (by Commune or related projects)
  • Also maintains a Personal Blog about similar topics

The Commune community is very interested in various topics and how they can relate together:

Related projects:

  • @laxla@tech.lgbt is creating Gimli, a federated discord alternative
    • Built on ActivityPub
    • "Guild-based" in ways matrix is not?
    • Will integrate with F3 as well
    • Wants to handle blogging as well
    • Certainly seems similar to Commune's message gardening concept

Last updated:

+ \ No newline at end of file diff --git a/garden/davey-wreden/index.html b/garden/davey-wreden/index.html index dbab928b..e56442cf 100644 --- a/garden/davey-wreden/index.html +++ b/garden/davey-wreden/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -
- +
+ \ No newline at end of file diff --git a/garden/decentralized/index.html b/garden/decentralized/index.html index 125ef1ac..594ce6c1 100644 --- a/garden/decentralized/index.html +++ b/garden/decentralized/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Decentralized

Referenced by: Commune, Fedi v2, Matrix, Social Media

Tagged by: ATProto, ActivityPub, Federated Identity, Fediverse, Nostr

Something with no central source of authority

Common examples:

In practice, the "pick a server" problem causes email and the fediverse to trend towards a handful of large servers that still suffer from some of the issues of centralization

Advantages over centralization:

  • Data ownership
  • Increased privacy
  • No rules to follow
  • Can fully customize your experience
  • No single entity can make the experience worse for everyone
  • Anyone and everyone can try their hand at improving the ecosystem

Last updated:

- +

Decentralized

Referenced by: Commune, Fedi v2, Matrix, Social Media

Tagged by: ATProto, ActivityPub, Federated Identity, Fediverse, Nostr

Something with no central source of authority

Common examples:

In practice, the "pick a server" problem causes email and the fediverse to trend towards a handful of large servers that still suffer from some of the issues of centralization

Advantages over centralization:

  • Data ownership
  • Increased privacy
  • No rules to follow
  • Can fully customize your experience
  • No single entity can make the experience worse for everyone
  • Anyone and everyone can try their hand at improving the ecosystem

Last updated:

+ \ No newline at end of file diff --git a/garden/dice-armor/index.html b/garden/dice-armor/index.html index c7c1f6fa..5de187b0 100644 --- a/garden/dice-armor/index.html +++ b/garden/dice-armor/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Dice Armor

Referenced by: Babble Buds

Tags: My Projects

Download it here

Dice Armor is a game that started development as a semester-long project by a team of nine: a producer, a creative director, a narrative writer, an artist, two programmers, and 3 game designers. The information here is about my contributions as the lead programmer over the semester because I can show off stuff like the editor scripts I wrote. I was doing everything from interface coding, editor scripts, integrating Babble Buds, and of course, everything related to the gameplay itself. To date I'm still the lead programmer for the game; for more up-to-date information on the current state of the game please visit the official site.

The build available here was created for showing off at the end of the semester, and as such has some buttons present to make the game easier to skip parts of the game to see all the content: You start with all the dice in the game already in the shop, there's a button to give yourself free money to buy these dice with, and in the duel, there are buttons to force a win or a loss, which can be used to skip the tutorial (not recommended for first-time players).

Tutorial

Dice Armor is a dice dueling game. Players can use abilities, flip dice, and attack each other to win in a dice game that puts chance into the hands of the players. This is what the dueling scene looks like, with a tutorial cutscene happening on top to guide the player through the basics. Also, all the dice are constructed dynamically, using quaternion math to figure out the placement of each component relative to the face it is going on. The die in the middle has one of the player' and opponents' portraits on each of its sides.

Editors

For many of the objects I've created, I've made scriptable objects so that game designers can add and modify them easily. Additionally, I would create custom inspectors for the objects to help make them as easy to understand and edit as possible. The opponent's artificial intelligence is made up of many strategies, in a prioritized list. When it is the opponents' turn they go through each strategy and check if they can be run, and if so then the opponent performs the strategy and starts back over at the top of the list of strategies. The + sign under the list of strategies opens an organized dropdown of all the various strategies.

Simulator

In addition to custom inspector code, I've created new tools for the editor for our game designers to use. This is a duel simulator that will take two opponents and simulate an arbitrary number of duels between them, and output the results and summarize them for you, much much quicker than manually going through the duels, even with an absurdly high timeScale. This will become incredibly useful in making balance changes and testing new dice against existing sets. This is a screenshot of it in edit mode, but in play mode it removes the "Dueling Managers" field and will use whatever the current duel balance settings are, allowing for the GDs to test freely in play mode without worrying about undoing all their changes afterward.

da1.png

I created the Babble Buds puppet editor and ported the rendering library I wrote for it to C# so it could be used in Unity. Dice Armor has a full campaign using cutscenes made using the Babble Buds cutscene editor, taking advantage of its support for custom commands and fields to control things like talking, giving the player dice and money, starting duels, and controlling player progression through the story.

Action Wheel

When a cutscene ends, its final command is to either start a duel or set the next cutscene in the story. In the latter case, there is an additional field for what to call the next cutscene, and what location it takes place. The cutscene is then added to the player's save file, and when they visit the city locations are greyed out until they have at least one action to do there. Each location has a dynamically populated action wheel with a custom range of acceptable angles.

Shop

The dice shop is dynamically populated by a list of dice available to the player, which can be changed during cutscenes, and is checked against the dice owned by the player to generate sold-out indicators. On the left, the player can choose to filter the options down to a single dice effect, which also updates the "Buy All" button to buy only all the dice in the current filter.

Inventory

The inventory works most the same as the shop, but for equipping dice. It also allows you to drag individual dice or entire sets to the equipped dice glyph. While dragging it will highlight all the slots the new dice will be equipped into.

Dice Rolling

The dice rolling uses the physics engine and detects once the dice have stopped moving, then determines which side is face up based on which of the normals is closest to straight up. It flags the die as cocked if that smallest angle is above a threshold. The dice sink into the table when not rolling to not interfere with any dice that are rolling.

Missile Storm

During certain events like winning the game or having the face of a die broken, the players' portraits will flash an emotion for a second. After winning, a random living die from the winning player is chosen to play their "finisher move", a flashy and dramatic effect to end the game. Shown is the arcane mechana's finisher, "Missile Storm".

After development stopped, the project became Open Source - check it out here

Last updated:

- +

Dice Armor

Referenced by: Babble Buds

Tags: My Projects

Download it here

Dice Armor is a game that started development as a semester-long project by a team of nine: a producer, a creative director, a narrative writer, an artist, two programmers, and 3 game designers. The information here is about my contributions as the lead programmer over the semester because I can show off stuff like the editor scripts I wrote. I was doing everything from interface coding, editor scripts, integrating Babble Buds, and of course, everything related to the gameplay itself. To date I'm still the lead programmer for the game; for more up-to-date information on the current state of the game please visit the official site.

The build available here was created for showing off at the end of the semester, and as such has some buttons present to make the game easier to skip parts of the game to see all the content: You start with all the dice in the game already in the shop, there's a button to give yourself free money to buy these dice with, and in the duel, there are buttons to force a win or a loss, which can be used to skip the tutorial (not recommended for first-time players).

Tutorial

Dice Armor is a dice dueling game. Players can use abilities, flip dice, and attack each other to win in a dice game that puts chance into the hands of the players. This is what the dueling scene looks like, with a tutorial cutscene happening on top to guide the player through the basics. Also, all the dice are constructed dynamically, using quaternion math to figure out the placement of each component relative to the face it is going on. The die in the middle has one of the player' and opponents' portraits on each of its sides.

Editors

For many of the objects I've created, I've made scriptable objects so that game designers can add and modify them easily. Additionally, I would create custom inspectors for the objects to help make them as easy to understand and edit as possible. The opponent's artificial intelligence is made up of many strategies, in a prioritized list. When it is the opponents' turn they go through each strategy and check if they can be run, and if so then the opponent performs the strategy and starts back over at the top of the list of strategies. The + sign under the list of strategies opens an organized dropdown of all the various strategies.

Simulator

In addition to custom inspector code, I've created new tools for the editor for our game designers to use. This is a duel simulator that will take two opponents and simulate an arbitrary number of duels between them, and output the results and summarize them for you, much much quicker than manually going through the duels, even with an absurdly high timeScale. This will become incredibly useful in making balance changes and testing new dice against existing sets. This is a screenshot of it in edit mode, but in play mode it removes the "Dueling Managers" field and will use whatever the current duel balance settings are, allowing for the GDs to test freely in play mode without worrying about undoing all their changes afterward.

da1.png

I created the Babble Buds puppet editor and ported the rendering library I wrote for it to C# so it could be used in Unity. Dice Armor has a full campaign using cutscenes made using the Babble Buds cutscene editor, taking advantage of its support for custom commands and fields to control things like talking, giving the player dice and money, starting duels, and controlling player progression through the story.

Action Wheel

When a cutscene ends, its final command is to either start a duel or set the next cutscene in the story. In the latter case, there is an additional field for what to call the next cutscene, and what location it takes place. The cutscene is then added to the player's save file, and when they visit the city locations are greyed out until they have at least one action to do there. Each location has a dynamically populated action wheel with a custom range of acceptable angles.

Shop

The dice shop is dynamically populated by a list of dice available to the player, which can be changed during cutscenes, and is checked against the dice owned by the player to generate sold-out indicators. On the left, the player can choose to filter the options down to a single dice effect, which also updates the "Buy All" button to buy only all the dice in the current filter.

Inventory

The inventory works most the same as the shop, but for equipping dice. It also allows you to drag individual dice or entire sets to the equipped dice glyph. While dragging it will highlight all the slots the new dice will be equipped into.

Dice Rolling

The dice rolling uses the physics engine and detects once the dice have stopped moving, then determines which side is face up based on which of the normals is closest to straight up. It flags the die as cocked if that smallest angle is above a threshold. The dice sink into the table when not rolling to not interfere with any dice that are rolling.

Missile Storm

During certain events like winning the game or having the face of a die broken, the players' portraits will flash an emotion for a second. After winning, a random living die from the winning player is chosen to play their "finisher move", a flashy and dramatic effect to end the game. Shown is the arcane mechana's finisher, "Missile Storm".

After development stopped, the project became Open Source - check it out here

Last updated:

+ \ No newline at end of file diff --git a/garden/digital-gardens/index.html b/garden/digital-gardens/index.html index 92038365..619ed16d 100644 --- a/garden/digital-gardens/index.html +++ b/garden/digital-gardens/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Digital Gardens

Referenced by: Chronological, Commune, Garden-RSS, The Cozy Web, The Small Web

Digital Gardens are Freeform collections of information made by an individual or community

This Knowledge Hub

Collections of digital gardens and resources for creating them:

Last updated:

- +

Digital Gardens

Referenced by: Chronological, Commune, Garden-RSS, The Cozy Web, The Small Web

Digital Gardens are Freeform collections of information made by an individual or community

This Knowledge Hub

Collections of digital gardens and resources for creating them:

Last updated:

+ \ No newline at end of file diff --git a/garden/federated-identity/index.html b/garden/federated-identity/index.html index e90489db..444879d1 100644 --- a/garden/federated-identity/index.html +++ b/garden/federated-identity/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Federated Identity

Referenced by: Commune, Fedi v2, Weird

Tags: Decentralized

Allow for validating one's identity without relying on a specific centralized server

Implementations:

Self hosted identity providers are NOT enough to be considered federated identity

  • OIDC and OAuth require the service owner to have pre-configured with explicitly allowed identity providers

Incremental Social uses Zitadel which does NOT support IndieAuth and probably won't

Last updated:

- +

Federated Identity

Referenced by: Commune, Fedi v2, Weird

Tags: Decentralized

Allow for validating one's identity without relying on a specific centralized server

Implementations:

Self hosted identity providers are NOT enough to be considered federated identity

  • OIDC and OAuth require the service owner to have pre-configured with explicitly allowed identity providers

Incremental Social uses Zitadel which does NOT support IndieAuth and probably won't

Last updated:

+ \ No newline at end of file diff --git a/garden/fedi-v2/index.html b/garden/fedi-v2/index.html index 779a8b85..c4b4e12d 100644 --- a/garden/fedi-v2/index.html +++ b/garden/fedi-v2/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Fedi v2

Referenced by: Social Media

My take on a theoretical successor to federated Social Media

Inspiration

Weird may eventually move in the direction of implementing something like this

Identity

  • Federated Identity
  • Private and public keys anyone can create and store how they want
    • Fully free to create and store with no server dependencies
  • Profile information
    • Sent as a signed message through all the relays
    • How would you trust a username?
      • Petnames could be used to display human readable names via contacts or decentralized "naming hubs"
      • In most conversations online, you can trust their display name and add them as a contact as that display name
        • You only need to verify they are the same person you interacted with previously
        • You only need to trust people you want to send money to or otherwise "important identities"
        • For important identities, you can trust your contacts forming a chain of trust, or a authoritative naming hub
          • E.g. a white house ran naming hub that verifies the identities of the president and people of Congress
          • People typically wouldn't reach out to a naming hub, as it's not typically necessary
        • Contacts supercede naming hubs, so if a naming hub is breached, anyone I've previously added as a contact is still the source of truth
          • This only fails if the private key itself was breached
        • I'm just thepaperpilot, my display name. For most online communication, this is sufficient
          • My website can have a nameserver saying this publickey is the same as the site owner
          • If I write a paper at a scientific journal, they can say the author of x paper is my publickey
  • How to handle losing your private key
    • If you do have a naming hub you can verify with, they can say the identity has a new publickey
    • Contacts can "vouch" for a identity having a new publickey
    • Clients can decide to trust the new publickey based on contacts and naming hubs saying to
    • Also applies to stolen or compromised keys
  • I believe Iroh works this way

Servers

  • Act as relays, merely storing messages and sending them to any clients or servers that have subscribed
  • May decide to publicly display messages its received
    • These servers are how discovery would work
    • Different servers may offer unique displays, filters, etc.
  • Users can send their content to any server - no authentication or account required, as the identity suffices
    • Even replies can work this way - no need to know from where a given message originated
  • Private servers could require some password when sending messages or subscribing to things
    • Useful for a school or other entity that wants an internal social network
  • Different ways to subscribe to a server's messages
    • All messages the relay hears about (new relays essentially subscribe like this to some existing relay)
    • All messages from a specific poster ID
    • Any replies to a message created with a specific poster ID
    • Shallow subscriptions, to lighten the load when subscribing to communities

Content

  • Protocol should dictate how to convey text, image, audio, video, and binary content
  • Protocol should include reacting to content with arbitrary text, including a URL
    • Upvotes and downvotes are implemented with this system
  • Each message contains fields for the poster's ID (public key) and a signature that verifies the content was made by that poster
    • That signature serves as an ID for the message itself
      • Anything can be replied to using the ID as the "parent" property in a new post
  • Edits are handled as replies with some flag to indicate it's updating the parent messages' content
    • Naturally, this reply would only be respected if it matches the same creator ID
    • Servers should replace the original message entirely with this one and indicate its an edited message
      • Some servers will inevitably keep a full history though
  • Groups/communities are just specially flagged messages
    • Posting to a community is just replying to that message
    • Subscribing to a community is just subscribing to that message
    • The original message creator effectively owns the group

Moderation

  • In general, edits and delete requests are made by replying with a specially flagged message
  • Edit and deletion messages are ignored unless they have the correct public key and signature
    • Parent messages form a hierarchy of permission - if someone replies to your message, you can send a delete request for that message
    • Relay owners cannot fully delete messages, but can choose to stop relaying replies etc. of messages as the server owner wishes
  • Posts can be publicly reported with a specially flagged reply
    • How to make anonymous reports?
  • Users can send deletion or edit messages even without a matching public key, and clients (or relays) can choose to respect those messages if that public key is whitelisted as a moderator
    • Messages (and by extension, groups) can have replies granting or removing permission to other public IDs at that hierarchy level
    • People can setup accounts with their desired heuristic for sending delete messages, such as looking at public reports or analyzing the content with AI
      • This way clients can effectively customize their preferred moderation
  • Clients can also choose to add additional rules for hiding content, such as any reports by followed users
  • Perhaps delete messages pull double duty as public reports in and of themselves?

Problems to solve

  • No anonymity
    • All upvotes, downvotes, etc. are linked to your public key
    • Perhaps a client could generate new keypairs for every action for anonymity, but then it'd be hard to determine if such an account and action was a genuine user or a bot
  • Servers could probably determine the identity of clients sending their messages to them
    • A client that only ever sends messages with a specific public key is unlikely to be a server
    • A client that doesn't subscribe to all messages is unlikely to be a server
  • Illegal material will likely be placed on the hard drive at least temporarily
    • Messages will be downloaded and, even if you follow a moderator bot that looks for illegal material, there's likely to be a delay between receiving the initial message and receiving the bots delete message
  • You have to download all spam messages
    • For redundancy, you'd likely subscribe to multiple relay servers
    • You cannot trust several relay servers to have identical rules on not relaying messages that don't pass whatever moderation heuristic
    • Therefore, the filtering out of spam has to be done by the client, after downloading it all

Last updated:

- +

Fedi v2

Referenced by: Social Media

My take on a theoretical successor to federated Social Media

Inspiration

Weird may eventually move in the direction of implementing something like this

Identity

  • Federated Identity
  • Private and public keys anyone can create and store how they want
    • Fully free to create and store with no server dependencies
  • Profile information
    • Sent as a signed message through all the relays
    • How would you trust a username?
      • Petnames could be used to display human readable names via contacts or decentralized "naming hubs"
      • In most conversations online, you can trust their display name and add them as a contact as that display name
        • You only need to verify they are the same person you interacted with previously
        • You only need to trust people you want to send money to or otherwise "important identities"
        • For important identities, you can trust your contacts forming a chain of trust, or a authoritative naming hub
          • E.g. a white house ran naming hub that verifies the identities of the president and people of Congress
          • People typically wouldn't reach out to a naming hub, as it's not typically necessary
        • Contacts supercede naming hubs, so if a naming hub is breached, anyone I've previously added as a contact is still the source of truth
          • This only fails if the private key itself was breached
        • I'm just thepaperpilot, my display name. For most online communication, this is sufficient
          • My website can have a nameserver saying this publickey is the same as the site owner
          • If I write a paper at a scientific journal, they can say the author of x paper is my publickey
  • How to handle losing your private key
    • If you do have a naming hub you can verify with, they can say the identity has a new publickey
    • Contacts can "vouch" for a identity having a new publickey
    • Clients can decide to trust the new publickey based on contacts and naming hubs saying to
    • Also applies to stolen or compromised keys
  • I believe Iroh works this way

Servers

  • Act as relays, merely storing messages and sending them to any clients or servers that have subscribed
  • May decide to publicly display messages its received
    • These servers are how discovery would work
    • Different servers may offer unique displays, filters, etc.
  • Users can send their content to any server - no authentication or account required, as the identity suffices
    • Even replies can work this way - no need to know from where a given message originated
  • Private servers could require some password when sending messages or subscribing to things
    • Useful for a school or other entity that wants an internal social network
  • Different ways to subscribe to a server's messages
    • All messages the relay hears about (new relays essentially subscribe like this to some existing relay)
    • All messages from a specific poster ID
    • Any replies to a message created with a specific poster ID
    • Shallow subscriptions, to lighten the load when subscribing to communities

Content

  • Protocol should dictate how to convey text, image, audio, video, and binary content
  • Protocol should include reacting to content with arbitrary text, including a URL
    • Upvotes and downvotes are implemented with this system
  • Each message contains fields for the poster's ID (public key) and a signature that verifies the content was made by that poster
    • That signature serves as an ID for the message itself
      • Anything can be replied to using the ID as the "parent" property in a new post
  • Edits are handled as replies with some flag to indicate it's updating the parent messages' content
    • Naturally, this reply would only be respected if it matches the same creator ID
    • Servers should replace the original message entirely with this one and indicate its an edited message
      • Some servers will inevitably keep a full history though
  • Groups/communities are just specially flagged messages
    • Posting to a community is just replying to that message
    • Subscribing to a community is just subscribing to that message
    • The original message creator effectively owns the group

Moderation

  • In general, edits and delete requests are made by replying with a specially flagged message
  • Edit and deletion messages are ignored unless they have the correct public key and signature
    • Parent messages form a hierarchy of permission - if someone replies to your message, you can send a delete request for that message
    • Relay owners cannot fully delete messages, but can choose to stop relaying replies etc. of messages as the server owner wishes
  • Posts can be publicly reported with a specially flagged reply
    • How to make anonymous reports?
  • Users can send deletion or edit messages even without a matching public key, and clients (or relays) can choose to respect those messages if that public key is whitelisted as a moderator
    • Messages (and by extension, groups) can have replies granting or removing permission to other public IDs at that hierarchy level
    • People can setup accounts with their desired heuristic for sending delete messages, such as looking at public reports or analyzing the content with AI
      • This way clients can effectively customize their preferred moderation
  • Clients can also choose to add additional rules for hiding content, such as any reports by followed users
  • Perhaps delete messages pull double duty as public reports in and of themselves?

Problems to solve

  • No anonymity
    • All upvotes, downvotes, etc. are linked to your public key
    • Perhaps a client could generate new keypairs for every action for anonymity, but then it'd be hard to determine if such an account and action was a genuine user or a bot
  • Servers could probably determine the identity of clients sending their messages to them
    • A client that only ever sends messages with a specific public key is unlikely to be a server
    • A client that doesn't subscribe to all messages is unlikely to be a server
  • Illegal material will likely be placed on the hard drive at least temporarily
    • Messages will be downloaded and, even if you follow a moderator bot that looks for illegal material, there's likely to be a delay between receiving the initial message and receiving the bots delete message
  • You have to download all spam messages
    • For redundancy, you'd likely subscribe to multiple relay servers
    • You cannot trust several relay servers to have identical rules on not relaying messages that don't pass whatever moderation heuristic
    • Therefore, the filtering out of spam has to be done by the client, after downloading it all

Last updated:

+ \ No newline at end of file diff --git a/garden/fediverse/index.html b/garden/fediverse/index.html index 0982f2d0..fd452564 100644 --- a/garden/fediverse/index.html +++ b/garden/fediverse/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Fediverse

Referenced by: ATProto, Decentralized, Incremental Social, Mbin, Weird

Tags: Decentralized

A collection of Social Media websites that can all talk to each other by virtue of a shared protocol

Typically refers to sites implementing ActivityPub

Implementations:

Last updated:

- +

Fediverse

Referenced by: ATProto, Decentralized, Incremental Social, Mbin, Weird

Tags: Decentralized

A collection of Social Media websites that can all talk to each other by virtue of a shared protocol

Typically refers to sites implementing ActivityPub

Implementations:

Last updated:

+ \ No newline at end of file diff --git a/garden/forgejo/index.html b/garden/forgejo/index.html index d67bddad..32857884 100644 --- a/garden/forgejo/index.html +++ b/garden/forgejo/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Forgejo

Referenced by: Incremental Social

Forgejo is an Open Source code repository hosting software

Last updated:

- +

Forgejo

Referenced by: Incremental Social

Forgejo is an Open Source code repository hosting software

Last updated:

+ \ No newline at end of file diff --git a/garden/freeform-vs-chronological-dichotomy/index.html b/garden/freeform-vs-chronological-dichotomy/index.html index 4cdaf44c..ea4ebd53 100644 --- a/garden/freeform-vs-chronological-dichotomy/index.html +++ b/garden/freeform-vs-chronological-dichotomy/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Freeform vs Chronological Dichotomy

Referenced by: Chronological, Freeform

Describes a dichotomy between displaying information in a Freeform vs Chronological manner

Last updated:

- +

Freeform vs Chronological Dichotomy

Referenced by: Chronological, Freeform

Describes a dichotomy between displaying information in a Freeform vs Chronological manner

Last updated:

+ \ No newline at end of file diff --git a/garden/freeform/index.html b/garden/freeform/index.html index eb71e9ba..3e6f2c3b 100644 --- a/garden/freeform/index.html +++ b/garden/freeform/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Freeform

Referenced by: Commune, Digital Gardens, Freeform vs Chronological Dichotomy, Garden-RSS, The Small Web

A collection of information that is not tied to when it was created or edited

Part of the Freeform vs Chronological Dichotomy

Anything wiki-style is considered freeform

  • A collection of living documents

Garden-RSS, a theoretical alternative to RSS that's better for freeform content

Last updated:

- +

Freeform

Referenced by: Commune, Digital Gardens, Freeform vs Chronological Dichotomy, Garden-RSS, The Small Web

A collection of information that is not tied to when it was created or edited

Part of the Freeform vs Chronological Dichotomy

Anything wiki-style is considered freeform

  • A collection of living documents

Garden-RSS, a theoretical alternative to RSS that's better for freeform content

Last updated:

+ \ No newline at end of file diff --git a/garden/game-dev-tree/index.html b/garden/game-dev-tree/index.html index f0e6f2b7..740698bf 100644 --- a/garden/game-dev-tree/index.html +++ b/garden/game-dev-tree/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Game Dev Tree

Tags: My Projects

Play it here!

My first (good) incremental game! (My actual first was Shape Tycoon - I don't recommend it!)

It's Open Source!

The TV Tropes page on this game mentions some of the cool things about this game

Last updated:

- +

Game Dev Tree

Tags: My Projects

Play it here!

My first (good) incremental game! (My actual first was Shape Tycoon - I don't recommend it!)

It's Open Source!

The TV Tropes page on this game mentions some of the cool things about this game

Last updated:

+ \ No newline at end of file diff --git a/garden/garden-rss/index.html b/garden/garden-rss/index.html index 7e86d432..a6217c4c 100644 --- a/garden/garden-rss/index.html +++ b/garden/garden-rss/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Garden-RSS

Referenced by: Freeform, The Small Web, This Knowledge Hub

A theoretical alternative to RSS that's better for Freeform websites (and Digital Gardens specifically )

Why is it useful?

How should it work?

  • Could display changes similar to git diffs

Existing Work

Last updated:

- +

Garden-RSS

Referenced by: Freeform, The Small Web, This Knowledge Hub

A theoretical alternative to RSS that's better for Freeform websites (and Digital Gardens specifically )

Why is it useful?

How should it work?

  • Could display changes similar to git diffs

Existing Work

Last updated:

+ \ No newline at end of file diff --git a/garden/guide-to-incrementals/appeal-to-developers/index.html b/garden/guide-to-incrementals/appeal-to-developers/index.html index 64b6b920..0c14f58d 100644 --- a/garden/guide-to-incrementals/appeal-to-developers/index.html +++ b/garden/guide-to-incrementals/appeal-to-developers/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Guide to Incrementals/Appeal to Developers

There are a lot of developers in the incremental games community - the genre seems to draw them in, and convert a lot of players into developers. Let's explore the reasons why this genre appeals to developers.

Incrementals are Easy to Make

Compared to other genres, incrementals have quite low expectations. You don't need to make fancy art, or music, or lay things out nicely. If you can make a button and learn the few lines of code necessary to make a number go up, you can make an incremental. This low threshold makes the genre perfect for those who are actively learning to code and haven't developed any gamedev-related skills yet.

Additionally, unlike other genres incrementals are uniquely easy to implement in a normal web page - no need to worry about rendering sprites, moving them around, implementing physics, etc. New developers can just use HTML to add a button, and the game is now available in your browser. You don't need to choose an engine, have admin privileges, or hell for the dedicated you don't even need a computer - there are tools for web development that run in the browser itself, so you can technically use your phone if that's all you have.

Javascript is a perfectly viable language for making web games, whereas other genres are typically going to require using other more difficult languages to learn. There are countless javascript tutorials that start from 0 knowledge of programming, making it incredibly accessible to beginners.

Players are Easy to Find

Once you've finished your game and uploaded it on github pages or itch or just copied the link if you're using glitch or replit (all of which are easy to do), anyone can now play the game in their browser. This low barrier to entry has shown tremendous success in getting completely unknown developers to have thousands of plays.

The incremental games community, which mostly centers around r/incremental_games, is always looking for new games and tends to flood any new ones posted with initial players.

Having your games be played can be incredibly motivating, and the community makes it quite clear that you can expect players to play your game. These communities - both for incremental games in general as well as game-specific communities - tend to be very developer friendly as well. A lot of the developers know each other, and welcome new developers with open arms, often with dedicated channels for programming help and discussions.

Monetization

I'd like to clarify that everything I've said above mainly applies to web-based incrementals. Incremental games are also incredibly popular on mobile, but with a much different culture and community. Many mobile gamers will still participate in the web-focused community for the culture. This web-focused community has a culture that has been criticized for being "anti-monetization". Ads, IAPs, and similar forms of monetization are often criticized, mainly due to the abundance of completely non-monetized games available from hobbyist developers. There are exceptions, like paid games often being considered fine, like Increlution or Stuck in Time, or donation ware games like kittens game, but even popular games that have IAP see some level of regular criticism, like NGU Idle, Idle Skilling, or Idle Pins. A large part of this can be explained by the community being hyper-aware of the addictive) nature of this genre and its susceptibility to exploiting players.

On mobile, however, monetization is the norm and expected. If an incremental game is available on mobile, it almost certainly will be monetized, and mobile players are aware and accepting of that. Mobile incremental games, due to their addictive nature, tend to make a lot of money. It's very lucrative, and therefore these games are quite abundant on mobile storefronts.

Last updated:

- +

Guide to Incrementals/Appeal to Developers

There are a lot of developers in the incremental games community - the genre seems to draw them in, and convert a lot of players into developers. Let's explore the reasons why this genre appeals to developers.

Incrementals are Easy to Make

Compared to other genres, incrementals have quite low expectations. You don't need to make fancy art, or music, or lay things out nicely. If you can make a button and learn the few lines of code necessary to make a number go up, you can make an incremental. This low threshold makes the genre perfect for those who are actively learning to code and haven't developed any gamedev-related skills yet.

Additionally, unlike other genres incrementals are uniquely easy to implement in a normal web page - no need to worry about rendering sprites, moving them around, implementing physics, etc. New developers can just use HTML to add a button, and the game is now available in your browser. You don't need to choose an engine, have admin privileges, or hell for the dedicated you don't even need a computer - there are tools for web development that run in the browser itself, so you can technically use your phone if that's all you have.

Javascript is a perfectly viable language for making web games, whereas other genres are typically going to require using other more difficult languages to learn. There are countless javascript tutorials that start from 0 knowledge of programming, making it incredibly accessible to beginners.

Players are Easy to Find

Once you've finished your game and uploaded it on github pages or itch or just copied the link if you're using glitch or replit (all of which are easy to do), anyone can now play the game in their browser. This low barrier to entry has shown tremendous success in getting completely unknown developers to have thousands of plays.

The incremental games community, which mostly centers around r/incremental_games, is always looking for new games and tends to flood any new ones posted with initial players.

Having your games be played can be incredibly motivating, and the community makes it quite clear that you can expect players to play your game. These communities - both for incremental games in general as well as game-specific communities - tend to be very developer friendly as well. A lot of the developers know each other, and welcome new developers with open arms, often with dedicated channels for programming help and discussions.

Monetization

I'd like to clarify that everything I've said above mainly applies to web-based incrementals. Incremental games are also incredibly popular on mobile, but with a much different culture and community. Many mobile gamers will still participate in the web-focused community for the culture. This web-focused community has a culture that has been criticized for being "anti-monetization". Ads, IAPs, and similar forms of monetization are often criticized, mainly due to the abundance of completely non-monetized games available from hobbyist developers. There are exceptions, like paid games often being considered fine, like Increlution or Stuck in Time, or donation ware games like kittens game, but even popular games that have IAP see some level of regular criticism, like NGU Idle, Idle Skilling, or Idle Pins. A large part of this can be explained by the community being hyper-aware of the addictive) nature of this genre and its susceptibility to exploiting players.

On mobile, however, monetization is the norm and expected. If an incremental game is available on mobile, it almost certainly will be monetized, and mobile players are aware and accepting of that. Mobile incremental games, due to their addictive nature, tend to make a lot of money. It's very lucrative, and therefore these games are quite abundant on mobile storefronts.

Last updated:

+ \ No newline at end of file diff --git a/garden/guide-to-incrementals/appeal-to-players/index.html b/garden/guide-to-incrementals/appeal-to-players/index.html index 2eb7297a..dc47e3da 100644 --- a/garden/guide-to-incrementals/appeal-to-players/index.html +++ b/garden/guide-to-incrementals/appeal-to-players/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Guide to Incrementals/Appeal to Players

This is something that has been discussed and analyzed by many people, and to some extent, I feel like everything that can be said on the topic already has. However, a lot of these analyses are from the perspective of those with not as much experience and involvement within the genre as I'd argue would be necessary for a fully contextualized answer. I recently watched a video about Vampire Survivors, which has since been taken down due to drawing negative attention, which made me think about some interesting arguments about what games are, and what makes them good. The video's argument that "Vampire Survivors is not a video game" mirrors a claim by the developer of Cookie Clicker that his games are "non-games". Using Vampire Survivors and the video made on it as a framework, I'll be answering why incremental games appeal to players. Since the video has been taken down, I'll do my best to contextualize and generalize the arguments of the video without requiring the reader to watch it. For what it's worth, while I disagreed with the video I actually liked a lot of the way it went about thinking about games, and I consider this a continuation of that discussion.

Numbers Going Up

This is a very common response to why people enjoy incremental games, although it's not one I find compels me personally, and I suspect it might be a stand-in for progression) or Guide to Incrementals/What is Content?. But reportedly, some people do just like seeing big numbers. I must reiterate I suspect the actual cause is seeing big numbers in context though - if you start at 1e1000 of a currency and get to 1e1001, that isn't going to feel as satisfying as going from 1e10 to 1e100, and in any case, I don't think a button that just adds a zero to your number will feel quite satisfying - I believe its the sense of having made progress, and comparing where you are to where you started and feeling like you've earned your way here that is enjoyable.

Progression

Vampire Survivors can be argued to have a comparatively low depth to its combat compared to many other games. I'd argue it has sufficient depth and more than someone might expect who has only played the game for a short while, but it still definitely gets beat out by many other combat-focused games. Instead, a lot of the progression in Vampire Survivors comes from a meta-progression system by which base stats are increased by spending a currency that persists between runs. While it is technically possible to win without this meta-progression system, and indeed in many roguelikes players like to challenge themselves by beating the game without any meta-progression, the criticism can be made that meta-progression de-emphasizes player skill by making it less important to have to beat the game. Certainly, in incremental games, it is often literally impossible to complete a game without taking advantage of the meta-progression systems. I'd argue this does not detract from the game, however, and is actually a part of what makes incremental games, and roguelikes, enjoyable to many players: meta-progression augments the increases in skill the player is naturally gaining as they play. In effect, it's not replacing the skill increase, but exaggerating it to make it feel more real to the player.

Note: There is also a lot of progression from exploring the mechanics and discovering synergies, unlocking new weapons or playable characters, etc. That just isn't as relevant to this discussion, but it does make up a lot of the appeal of the game.

Effortlessness

Incremental games are so easy, a lot of them even have you progress while you're not playing! Part of the appeal is being able to feel like you're making progress while doing something actually productive - multitasking, in a way. In this sense, the game is more of a fidget toy - not something to think hard about and play actively, but something to click a few buttons every so often while you're paying attention to a lecture or studying or working. Of course, not all incremental games lend themselves to being played this way - it's specifically "idle" games that work like this. These are games that take an incredibly long amount of time to see all the content, stretching it as thin as possible, but they aren't expecting you to be sitting at your device playing it the entire time. They expect you to leave and come back later to make a bit of progress and repeat the cycle.

If you look at the higher-level play of most games, you'll see them perform difficult feats with ease and speed. They'll achieve a "flow state" that takes all their knowledge and experience of the game and uses it to play the game as instinctively as possible. It's incredible to watch things like Slay the Spire speed runs or competitive DDR-likes. I'd argue the goal of a lot of games with a competitive scene is to get so good that the game becomes effortless. In that sense, a game that allows you to reach that point earlier isn't any less legitimate, but rather lowers the barrier to entry by allowing more people to get "really good" at the game. And to be clear, Vampire Survivors and (most) incremental games aren't trivially easy - they, and to an extent, every game will have some level of learning and improvement over time.

Addiction

A lot of these reasons for why incremental games appeal may have reminded you of why gambling appeals to people, particularly those prone to addiction. Indeed, incremental games are quite often criticized for their similarity to a skinner box. Some have gone as far as to say incremental games as a genre are commenting that all games are skinner boxes). The argument goes that some games are not fun, but rather condition players into continuing to play without actually getting anything from the experience. When tied to real-world money this is seen as predatory, and to a lesser extent, even free games may be feeding the addictive sides of people and making them more prone to seek out gambling or micro-transaction heavy games.

While incremental games can be fun and even healthy in certain contexts, they can exacerbate video game addiction more than other genres. If you feel like playing incremental games is taking priority over other things in your life, or manipulating your sleep schedule, it may be prudent to seek help. See r/StopGaming for resources.

Since incremental games are often built on extrinsic motivations in the form of progression systems, it's hard to argue whether players continue to play because they are enjoying the gameplay, or if they are just conditioned to keep doing it because the game keeps rewarding them. Unfortunately, it can often feel like it's the latter, as there isn't typically anything compelling about the "gameplay" of clicking a button and waiting. There may be a significant overlap between those who enjoy incremental games and those who are most prone to addiction, and there are often posts on r/incremental_games about someone either struggling with or overcoming video game addiction.

Strategy

Incremental games could be considered a subset of strategy games), and inherit the appeals of strategy games. This includes the appeal of feeling like you've found a good solution to a puzzle, or that you're learning more about the game and are improving at making decisions within it. This applies to Vampire Survivors specifically, where you're learning about evolutions and synergies and what kinds of enemies can spawn under what conditions, and how best to handle them.

Note that strategy games are not all the same difficulty, as well. Vampire Survivors is still easier to play than Starcraft 2, and Cookie Clicker is probably somewhere in between (once you progress sufficiently). Vampire Survivors being so successful may indicate that "easier" strategies may have their separate appeal to harder strategy games - players like to feel smart and that they figured the game out and have optimized or mastered it, and the game being easier doesn't detract from that sense of accomplishment as much as it allows more and more users to be able to reach the point where they gain that sense.

Avoiding Staleness

Incremental games tend to have "paradigm shifts", where the gameplay changes in a meaningful way at various times throughout the progression of the game. These upset and change the gameplay loop, which helps keep them from stagnating. This constant "freshness" to the gameplay can keep players engaged for longer, compared to a game with a repetitive and static gameplay loop.

Good Game Design

Incremental games tend to show their game design "plainly", so it's more readily apparent if a game has good game design while playing, even if you're not looking for it. While different players have different preferences and might enjoy different types of games more than others, there are underlying good and bad game design principles that players will notice the effects of. To be clear, this isn't talking about stuff like big numbers being enjoyable, where I can comfortably agree to disagree with other players. They don't intrinsically make my experience better, but I'm aware of those for whom it does and I won't argue against their feelings. However, the game designer in me does feel like there are some extremely clear-cut examples of good and bad game design philosophies.

Let's start by giving an example of a mechanic I think can be easily and strongly argued is good game design. There are of course many examples, but a personal favorite of mine is how DOOM encourages aggressive gameplay by linking health drops to melee attacks. It has an intended experience it's trying to give the player - immersing themselves as DOOM guy, who would not hide behind cover when low on health - and this mechanic does a great job at encouraging and effectively teaching players to behave properly. This is in sharp contrast to shooters like Call of Duty, which have you regen health passively, encouraging players to hide behind cover and wait after getting hit. Note that I'm not arguing CoD is poorly designed, as the games have different intended experiences. I'm specifically praising DOOM for having a mechanic that does a good job at ensuring the player has that intended experience.

To contrast with an example I think is bad game design, let's talk about shields in souls-likes. This is a bit of a famous example, and I highly recommend this video essay which spends quite a good bit of time on this topic. Essentially, the argument boils down to players of earlier games in the souls games using shields too much - playing slowly, conservatively, and ultimately having less fun. Players wanted to feel safe, so they ended up playing in a way that ruined the experience for them. The developers solved this by removing shields, apart from an intentionally bad one effectively mocking the playstyle, and it did its job at getting players to play more aggressively, and often have more fun.

To bring the conversation back to incrementals, I'm incredibly opinionated on what makes a good incremental game, which I'll discuss in the game design section. Suffice it to say, incremental games rely more on good game design than other genres, due to not having much to distract from bad game design. This helps (although imperfectly - gamers are a bit too tolerant of bad game design!) well-designed games rise to the top within the genre.

Artistic Merit

The Vampire Survivors video made me think back to the old arguments about whether games are art, and whether they ought to be. The video seems preoccupied with attaching value to games solely based on their mechanics and the depth thereof, to the point of arguing Vampire Survivors is a waste of time due to its lack of depth. However, even setting aside the fact that if players are having fun then it's not time wasted, I think games can have artistic merit that supersedes the necessity of having (any / engaging / "deep") gameplay. I think the consensus online is that games are definitively art, although I could see the argument that some genres, like incremental games, might be a bit in a grey area. Let's talk about Vampire Survivors first though - It has a story to tell, with lore and many characters, that drive the player and encourage them to continue exploring the game and discovering things within it. Like any walking simulator, it is no less legitimate of a game or the "art" label because of any lack perceived lack of depth. For what it's worth, most art can be consumed with more ease than VS - any painting, movie, sculpture, etc.

A lot of incrementals have a narrative context that can similarly qualify them as art. Cookie Clicker is, as has been pointed out numerous times before, commenting on excess and increasing production beyond any reasonable limits - devolving into increasing production for its own sake. Indeed, a lot of incremental games are written to comment upon various concepts like capitalism or tropes in games, as discussed when defining Incrementals). However, I'd like to argue most incremental games are still art, even without any narrative context. "Art" as a concept is pretty nebulous already, but I personally like those who define it as an act of expression more than any physical result. The creator and the context within which they created the art, and any meaning they put into it, are all relevant and a part of the art itself. Most incremental games have artistic merit from things like why the creator made it, why they chose to make it an incremental game, and why they made any particular design decision. Hell, even if you play through an entire incremental game without a single thought or feeling, that very fact it elicited nothing can itself be artistic merit!

I'm not an art major, and I may be taking a somewhat extreme take on what is art and what has artistic merit, but I'd argue the overall point stands that games, and incremental games specifically, can have artistic merit, which appeals to many gamers.

Last updated:

- +

Guide to Incrementals/Appeal to Players

This is something that has been discussed and analyzed by many people, and to some extent, I feel like everything that can be said on the topic already has. However, a lot of these analyses are from the perspective of those with not as much experience and involvement within the genre as I'd argue would be necessary for a fully contextualized answer. I recently watched a video about Vampire Survivors, which has since been taken down due to drawing negative attention, which made me think about some interesting arguments about what games are, and what makes them good. The video's argument that "Vampire Survivors is not a video game" mirrors a claim by the developer of Cookie Clicker that his games are "non-games". Using Vampire Survivors and the video made on it as a framework, I'll be answering why incremental games appeal to players. Since the video has been taken down, I'll do my best to contextualize and generalize the arguments of the video without requiring the reader to watch it. For what it's worth, while I disagreed with the video I actually liked a lot of the way it went about thinking about games, and I consider this a continuation of that discussion.

Numbers Going Up

This is a very common response to why people enjoy incremental games, although it's not one I find compels me personally, and I suspect it might be a stand-in for progression) or Guide to Incrementals/What is Content?. But reportedly, some people do just like seeing big numbers. I must reiterate I suspect the actual cause is seeing big numbers in context though - if you start at 1e1000 of a currency and get to 1e1001, that isn't going to feel as satisfying as going from 1e10 to 1e100, and in any case, I don't think a button that just adds a zero to your number will feel quite satisfying - I believe its the sense of having made progress, and comparing where you are to where you started and feeling like you've earned your way here that is enjoyable.

Progression

Vampire Survivors can be argued to have a comparatively low depth to its combat compared to many other games. I'd argue it has sufficient depth and more than someone might expect who has only played the game for a short while, but it still definitely gets beat out by many other combat-focused games. Instead, a lot of the progression in Vampire Survivors comes from a meta-progression system by which base stats are increased by spending a currency that persists between runs. While it is technically possible to win without this meta-progression system, and indeed in many roguelikes players like to challenge themselves by beating the game without any meta-progression, the criticism can be made that meta-progression de-emphasizes player skill by making it less important to have to beat the game. Certainly, in incremental games, it is often literally impossible to complete a game without taking advantage of the meta-progression systems. I'd argue this does not detract from the game, however, and is actually a part of what makes incremental games, and roguelikes, enjoyable to many players: meta-progression augments the increases in skill the player is naturally gaining as they play. In effect, it's not replacing the skill increase, but exaggerating it to make it feel more real to the player.

Note: There is also a lot of progression from exploring the mechanics and discovering synergies, unlocking new weapons or playable characters, etc. That just isn't as relevant to this discussion, but it does make up a lot of the appeal of the game.

Effortlessness

Incremental games are so easy, a lot of them even have you progress while you're not playing! Part of the appeal is being able to feel like you're making progress while doing something actually productive - multitasking, in a way. In this sense, the game is more of a fidget toy - not something to think hard about and play actively, but something to click a few buttons every so often while you're paying attention to a lecture or studying or working. Of course, not all incremental games lend themselves to being played this way - it's specifically "idle" games that work like this. These are games that take an incredibly long amount of time to see all the content, stretching it as thin as possible, but they aren't expecting you to be sitting at your device playing it the entire time. They expect you to leave and come back later to make a bit of progress and repeat the cycle.

If you look at the higher-level play of most games, you'll see them perform difficult feats with ease and speed. They'll achieve a "flow state" that takes all their knowledge and experience of the game and uses it to play the game as instinctively as possible. It's incredible to watch things like Slay the Spire speed runs or competitive DDR-likes. I'd argue the goal of a lot of games with a competitive scene is to get so good that the game becomes effortless. In that sense, a game that allows you to reach that point earlier isn't any less legitimate, but rather lowers the barrier to entry by allowing more people to get "really good" at the game. And to be clear, Vampire Survivors and (most) incremental games aren't trivially easy - they, and to an extent, every game will have some level of learning and improvement over time.

Addiction

A lot of these reasons for why incremental games appeal may have reminded you of why gambling appeals to people, particularly those prone to addiction. Indeed, incremental games are quite often criticized for their similarity to a skinner box. Some have gone as far as to say incremental games as a genre are commenting that all games are skinner boxes). The argument goes that some games are not fun, but rather condition players into continuing to play without actually getting anything from the experience. When tied to real-world money this is seen as predatory, and to a lesser extent, even free games may be feeding the addictive sides of people and making them more prone to seek out gambling or micro-transaction heavy games.

While incremental games can be fun and even healthy in certain contexts, they can exacerbate video game addiction more than other genres. If you feel like playing incremental games is taking priority over other things in your life, or manipulating your sleep schedule, it may be prudent to seek help. See r/StopGaming for resources.

Since incremental games are often built on extrinsic motivations in the form of progression systems, it's hard to argue whether players continue to play because they are enjoying the gameplay, or if they are just conditioned to keep doing it because the game keeps rewarding them. Unfortunately, it can often feel like it's the latter, as there isn't typically anything compelling about the "gameplay" of clicking a button and waiting. There may be a significant overlap between those who enjoy incremental games and those who are most prone to addiction, and there are often posts on r/incremental_games about someone either struggling with or overcoming video game addiction.

Strategy

Incremental games could be considered a subset of strategy games), and inherit the appeals of strategy games. This includes the appeal of feeling like you've found a good solution to a puzzle, or that you're learning more about the game and are improving at making decisions within it. This applies to Vampire Survivors specifically, where you're learning about evolutions and synergies and what kinds of enemies can spawn under what conditions, and how best to handle them.

Note that strategy games are not all the same difficulty, as well. Vampire Survivors is still easier to play than Starcraft 2, and Cookie Clicker is probably somewhere in between (once you progress sufficiently). Vampire Survivors being so successful may indicate that "easier" strategies may have their separate appeal to harder strategy games - players like to feel smart and that they figured the game out and have optimized or mastered it, and the game being easier doesn't detract from that sense of accomplishment as much as it allows more and more users to be able to reach the point where they gain that sense.

Avoiding Staleness

Incremental games tend to have "paradigm shifts", where the gameplay changes in a meaningful way at various times throughout the progression of the game. These upset and change the gameplay loop, which helps keep them from stagnating. This constant "freshness" to the gameplay can keep players engaged for longer, compared to a game with a repetitive and static gameplay loop.

Good Game Design

Incremental games tend to show their game design "plainly", so it's more readily apparent if a game has good game design while playing, even if you're not looking for it. While different players have different preferences and might enjoy different types of games more than others, there are underlying good and bad game design principles that players will notice the effects of. To be clear, this isn't talking about stuff like big numbers being enjoyable, where I can comfortably agree to disagree with other players. They don't intrinsically make my experience better, but I'm aware of those for whom it does and I won't argue against their feelings. However, the game designer in me does feel like there are some extremely clear-cut examples of good and bad game design philosophies.

Let's start by giving an example of a mechanic I think can be easily and strongly argued is good game design. There are of course many examples, but a personal favorite of mine is how DOOM encourages aggressive gameplay by linking health drops to melee attacks. It has an intended experience it's trying to give the player - immersing themselves as DOOM guy, who would not hide behind cover when low on health - and this mechanic does a great job at encouraging and effectively teaching players to behave properly. This is in sharp contrast to shooters like Call of Duty, which have you regen health passively, encouraging players to hide behind cover and wait after getting hit. Note that I'm not arguing CoD is poorly designed, as the games have different intended experiences. I'm specifically praising DOOM for having a mechanic that does a good job at ensuring the player has that intended experience.

To contrast with an example I think is bad game design, let's talk about shields in souls-likes. This is a bit of a famous example, and I highly recommend this video essay which spends quite a good bit of time on this topic. Essentially, the argument boils down to players of earlier games in the souls games using shields too much - playing slowly, conservatively, and ultimately having less fun. Players wanted to feel safe, so they ended up playing in a way that ruined the experience for them. The developers solved this by removing shields, apart from an intentionally bad one effectively mocking the playstyle, and it did its job at getting players to play more aggressively, and often have more fun.

To bring the conversation back to incrementals, I'm incredibly opinionated on what makes a good incremental game, which I'll discuss in the game design section. Suffice it to say, incremental games rely more on good game design than other genres, due to not having much to distract from bad game design. This helps (although imperfectly - gamers are a bit too tolerant of bad game design!) well-designed games rise to the top within the genre.

Artistic Merit

The Vampire Survivors video made me think back to the old arguments about whether games are art, and whether they ought to be. The video seems preoccupied with attaching value to games solely based on their mechanics and the depth thereof, to the point of arguing Vampire Survivors is a waste of time due to its lack of depth. However, even setting aside the fact that if players are having fun then it's not time wasted, I think games can have artistic merit that supersedes the necessity of having (any / engaging / "deep") gameplay. I think the consensus online is that games are definitively art, although I could see the argument that some genres, like incremental games, might be a bit in a grey area. Let's talk about Vampire Survivors first though - It has a story to tell, with lore and many characters, that drive the player and encourage them to continue exploring the game and discovering things within it. Like any walking simulator, it is no less legitimate of a game or the "art" label because of any lack perceived lack of depth. For what it's worth, most art can be consumed with more ease than VS - any painting, movie, sculpture, etc.

A lot of incrementals have a narrative context that can similarly qualify them as art. Cookie Clicker is, as has been pointed out numerous times before, commenting on excess and increasing production beyond any reasonable limits - devolving into increasing production for its own sake. Indeed, a lot of incremental games are written to comment upon various concepts like capitalism or tropes in games, as discussed when defining Incrementals). However, I'd like to argue most incremental games are still art, even without any narrative context. "Art" as a concept is pretty nebulous already, but I personally like those who define it as an act of expression more than any physical result. The creator and the context within which they created the art, and any meaning they put into it, are all relevant and a part of the art itself. Most incremental games have artistic merit from things like why the creator made it, why they chose to make it an incremental game, and why they made any particular design decision. Hell, even if you play through an entire incremental game without a single thought or feeling, that very fact it elicited nothing can itself be artistic merit!

I'm not an art major, and I may be taking a somewhat extreme take on what is art and what has artistic merit, but I'd argue the overall point stands that games, and incremental games specifically, can have artistic merit, which appeals to many gamers.

Last updated:

+ \ No newline at end of file diff --git a/garden/guide-to-incrementals/defining-the-genre/index.html b/garden/guide-to-incrementals/defining-the-genre/index.html index a8ab966e..5933a974 100644 --- a/garden/guide-to-incrementals/defining-the-genre/index.html +++ b/garden/guide-to-incrementals/defining-the-genre/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Guide to Incrementals/Defining the Genre

Video games are placed into genres for a variety of reasons. They can give a mental shorthand to set the player's expectations up, they can help a game market itself by its similarities to other, already popular games, and honestly, people just love categorization for its own sake. For this guide, it's important to define the genre so it is clear what games it's even talking about.

This poses a problem. "Incremental" is a horribly vague way to define games. Most games have numbers going up in some form or another. We need a more specific definition - similar to how "strategy" can't just mean any game with any amount of strategy because that would be most games. What specifically differentiates incremental games from the rest?

"Incremental" implies it's a genre defined by a game mechanic, but all those game mechanics it could imply exist in many other games. Having a skill tree or upgrades doesn't make you incremental, and if a reset mechanic is all it takes then every roguelite would be an incremental as well. So clearly there's more to it than that - what makes an incremental an incremental?

I'd like to go over a couple of popular suggestions I've seen on defining the genre here. I have my personal preferences and will state them here, but I don't think there's a truly perfect answer here.

Disclaimer: I mostly play incremental games on my computer, and my definitions will be heavily biased towards the games I'm familiar with.

Incrementals vs Idlers vs Clickers

Oftentimes people refer to this genre as idle games and/or clicker games. You'll even find a trend of oxymoronic game titles that contain both terms. "Incremental games" is the umbrella term both those terms fall under. However, I'd like to argue that not only is it better to just use the term "incremental games", but calling them "idle games" or "clicker games" is wrong. Almost universally, these terms are used interchangeably to refer to the same kind of game, where you start the game click spamming and eventually automate the process. Frankly, that kind of game deserves neither title, and the genre of incremental games has trended away from ever requiring click spamming, as it's a bad mechanic, anyways.

While these games do span a spectrum of how active it requires you to be, and sorting games by that metric can be useful for those looking for a particular experience, the borders of when an incremental game counts as an "idler" is too blurry for the term to be useful. "Incremental games" may not be a great descriptive term for the genre (hence this many thousands of words long page on defining what the genre even is), but it's strictly better than calling them "idler" or "clicker" games. This guide will always use the term "incremental games" unless quoting someone else, as it is the term you typically see on all modern games in the genre.

Incrementals as Parodies

Let's start with one of the most interesting definitions of incremental games. Incremental games appear to be distilled versions of games or genres, "revealing" the naked game design at the core of these games or genres not unlike how parodies comment upon their source material.

To understand what that means, think of how a casino uses skinner boxes to emotionally manipulate its customers to keep playing, but "dressing" up the skinner box with tons of stimuli to hide that ultimately the goal is to condition you into coming back compulsively. The idea that incremental games are parodies means taking the stance that at some level all games are similarly manipulating you, giving dopamine rewards in a way that manipulates you to keep playing while not necessarily giving you any value or fulfillment. Incremental games, then, are any games that plainly display the skinner box, and the manipulative core of the game, at the forefront of the experience.

While incremental games can be fun and even healthy in certain contexts, they can exacerbate video game addiction more than other genres. If you feel like playing incremental games is taking priority over other things in your life, or manipulating your sleep schedule, it may be prudent to seek help. See r/StopGaming for resources.

This "undressing" tends to go hand in hand with a reduced focus on aesthetics, often just printing the game state directly to the screen as text. This makes incremental games much easier to develop, particularly for those with programming skills but not art skills, but that's a tangent for why Incremental Games Guide to Incrementals/Appeal to Developers.

Before I continue, I'd like to make my stance clear that I love games and incremental games, and do not think they should be considered inherently bad or manipulative with the above logic. Skinner boxes are just a way of manipulating behavior via rewards. The games are still fun - that's the reward! I'd believe the real criticism here is that it is "empty fun", or "empty dopamine", that doesn't offer any additional value or sense of fulfillment. I don't think that's inherently bad in moderation, although it can become a problem if the game is manipulating you for profit-seeking, or if you play the game to the detriment of the other parts of your life.

Another interpretation of incremental games as parodies comes from several mainstream incremental games that are also parodies of capitalism, such as cookie clicker and adventure capitalist. It's a very common framework for incremental games to portray the ever-increasing numbers as an insatiable hunger for resources, like the ones observed within capitalism. Therefore, these games are used as evidence that the genre as a whole is about parody and commentary.

Popular videos on incremental games that portray the genre as parodies are Why Idle games make good satire, and how it was ruined. and Bad Game Design - Clicker Games. You may also be interested in this response to the latter video from a fan of incremental games: BadGood Game Design - Clicker Games.

I think that this definition ultimately ascribes a motive to the genre as a whole that only happens to apply to some of the more mainstream titles. There certainly are incremental games commenting on different things, including the genre itself as in the case of The Prestige Tree Classic, The Ascension Tree, or Omega Layers, but certainly not all. And of course, not all games that comment on something or parody something are incremental games! Additionally, a very large majority of incremental games are mobile games using these manipulative strategies to get players to spend as much money as possible - hell, Adventure Capitalist is ostensibly a critique on capitalism but features microtransactions and gameplay that manipulates you into buying them! These profit-seeking incremental games certainly belong within the genre but are hardly parodies when they too use manipulation to serve their interests. Also, from my own anecdotal experience, those who use this definition seem to do so from a fairly surface-level familiarity with the genre, and often in the context of criticizing the genre or the fans thereof.

Incrementals as NGU

Another broad definition often used is that incremental games are games where the focus of the game is "numbers going up". This definition proposes that other genres simply use increasing numbers as a means to an end, but incremental games uniquely only care about the numbers themselves going up. Put another way, it implies there should be no narrative justification for the numbers going up other than "why shouldn't they be going up?"

While this definition is common because it feels easy to understand, it is difficult to formally define. Often phrases are used to describe games using this framework, such as having an "exaggerated sense of progression" or "big" numbers. These terms are vague and don't demonstrate an actual threshold between non-incrementals and incrementals. Most games have a sense of progression, so when is it "exaggerated"? How big are "big" numbers? Most notably, RPGs that are typically not considered incrementals will often pass this definition.

Additionally, a lot of incrementals tend to have some theme guiding the gameplay, or at least the names of mechanics. This makes the line blurred between when numbers are going up for their own sake versus for a contextual reason. I believe this point is best illustrated that, while most RPGs are not considered incremental games, there is a sub-genre of "incremental RPGs" that typically relates to RPGs that perform combat automatically. This definition of incremental games does not support RPGs and "incremental RPGs" being on distinct sides of the line if the only difference between them is manual vs automatic combat.

Incrementals as Strategies

This is a rarer interpretation, but there are similarities between incremental games and strategy games, implying incrementals might just be a sub-genre of strategy games. By this approach, incremental games would be defined by their relation to strategy games, and how they involve player strategy. Incremental games are often large optimization problems - above all else, the actual gameplay the player is performing is deciding what to do next. The consequences of wrong decisions are typically more lenient in incremental games - such as just not making optimal progress - but they certainly get complex.

So if we accept the premise that incrementals could fall under strategy, we still need to define what makes a strategy game an incremental versus some other strategy sub-genre. This is a bit tricky due to one particular sub-genre of strategy games: Factory Builders.

Factory builders, such as Factorio or Satisfactory, are games about gaining ever increasing resources, optimizing production, and expanding more and more. That... sounds pretty similar, doesn't it? In fact, there's been some debate on whether factory builders would fall under the "incremental" umbrella. I think it's safe to say the two are certainly related, and probably have quite a bit of overlap in playerbase.

Roguelites as Incrementals?

Earlier on, I mentioned reset mechanics shouldn't be used in the definition because that could make all roguelites incrementals... But what if it does? A lot of incrementals can be described as games with a strong sense of progression, often with layers of meta-progression. Roguelites fit that bill to a T. What would make roguelites not incremental? I honestly don't think there's a good explanation here, but many fans of incremental games will state they do believe the two genres to be unrelated, even if there's a significant overlap between their player bases due to having similar appealing traits.

At this point, it'd be appropriate to consider what part of the definition of roguelites precludes them from also being incrementals, but that reveals a new problem: What are roguelites? They're usually defined as rogue_likes with meta-progression, but that just pushes the problem back a step: Incrementals aren't the only genre to have difficulties defining themselves, it seems! Roguelikes are another genre where the community argues over the formal definition of their genre, although that means we can borrow from their process of coming to a consensus, and maybe come across a viable definition for incremental games.

The Berlin Interpretation

By far the most popular way of defining roguelikes is the "Berlin Interpretation", which acknowledged the diversity of games within the genre and argued the definition should not be based on any ideals about what the genre ought to be, but rather defined by "its canon". They argued there are a handful of games that can be used to define the canon for roguelikes, and from those games, a list of factors can be derived to determine a game's "roguelikeness". The more factors a game has, the more of a roguelike it is. This strategy is very lenient, allowing a game to not present any specific factor so long as it shows enough, and accounts for the blurriness of any genre definition by not explicitly stating how many factors a game must have to qualify as a definite roguelike.

I believe this strategy for defining genres can be applied to other genres as well. A handful of games can be argued to be the incremental games canon, and a list of factors derived from them can be used to judge any game based on its "incrementalness". I'll propose such a canon and list of factors here, but by no means should it be considered the end-all-be-all.

Note: The "Temple of the roguelike", an authority within the genre, has since replaced the Berlin Interpretation with a new set of factors here: https://blog.roguetemple.com/what-is-a-traditional-roguelike/

The Incremental Games Canon

Alright, time to get controversial. Up til now, I've been trying my best to stay objective and analytical, but now it's time to start making some opinionated decisions. Here is a list of games I think could justifiably make up an Incremental Games Canon:

I chose a variety of games here, biasing towards newer games, purposefully to avoid making a narrow or "traditional" definition. The genre is growing and shouldn't be constrained by the traits of the early popular titles. A lot of these could easily be replaced with other games that are mechanically congruent, so ultimately I'm sure if you asked 10 people for their canon list you'd just get 10 different answers, but I think this should sufficiently allow us to determine what factors make a game have higher "incrementalness".

The Paradigm Shift

The Paradigm Shift is probably the highest possible value factor for an incremental. It's so common that for a while people referred to incrementals that exhibit this trait as "unfolding" games, to the point of trying to replace the term incremental due to their popularity. Paradigm shifts refer to when the gameplay significantly changes. There are too many examples to list here, but notably, every single reset mechanic is typically going to be a paradigm shift. Examples of games with paradigm shifts that aren't tied to reset mechanics include Universal Paperclips and A Dark Room.

There are many reasons for the appeal of paradigm shifts. Oftentimes each mechanic builds on top of the existing mechanics, increasing the complexity of the game in steps so the player can follow along. They provide a sense of mystery, with the player anticipating what will happen next. They shake up the gameplay before it gets too stale - allowing the game to entertain for longer before the sense of Guide to Incrementals/What is Content? dissipates. Of the canon games selected above, I would argue every single one contains a paradigm shift (although I could see someone disagreeing with that statement wrt Increlution).

I should take a moment to say that while I'm hyping up this specific factor, we cannot just reduce the genre definition to "does it have paradigm shifts". Many games have paradigm shifts that are not incremental, so it's just an indicator of incrementalness. Additionally, it can become quite hard to determine how large of a shift is a "paradigm" shift. Take, for example, any game with a skill tree. In some games, each skill node might have a large impact on how you play with the game, and qualify as a paradigm shift for some players. In other games, each skill node might just be a small percentage modifier on some stat that doesn't really impact much more than a slight bias towards an already established mechanic that's newly buffed. Every single canon game may show that it's common amongst incremental games, but could just as easily indicate that they're common in games in general.

High-Value Factors

I won't take as long to discuss the high and low-value factors, as you've already seen most of them brought up earlier on this page. As a reminder, a game does NOT need all of these to be an incremental game, but these are factors that each indicate a strong possibility the game is an incremental, so having several of these means they probably are. These factors apply to most of the canon incremental games.

"Pure UI" Display. Incrementals typically have a textual presentation of the game state - there isn't a visual representation of the entities within the game. The interface is closer to what would be just the UI of a game in another genre or the control panel of a plane. If there is a visual representation, the player is often still interacting with non-diegetic game elements.

Reduced Consequences. Incrementals tend to have reduced repurcussions for misplaying. They very rarely have fail states, where often the largest consequence is simply not progressing - never losing progress.

Optimization Problems. The predominant gameplay of incrementals is typically solving optimization problems, from deciding which purchase to save up for to reasoning and deciding between different mutually exclusive options the game presents.

Resource Management. Incrementals tend to have a lot of resources within the game to keep track of.

Low-Value Factors

These are low-value factors, meaning they aren't as strongly correlated with incremental games. Incremental games may have none of these, and non-incrementals may have several of these - if a game only has low-value factors, they're probably not an incremental.

Fast Numeric Growth. Numbers in incremental games tend to grow faster than in other genres. There are more instances of superlinear growth. The larger the numbers get, the stronger of a signal this factor is.

Automation. As an incremental game progresses, the player often no longer has to deal with earlier mechanics, by having them either happen automatically or otherwise be replaced with an alternative that requires less player interaction.

Goal-Oriented. Incrementals are often heavily reliant on extrinsic motivation to guide the player. Typically this is through some sort of in-game goal to work towards, such as a certain amount of a resource being required to unlock or purchase something new.

Waiting is a Mechanic. In incremental games, the player may come across times where there is no action they can take, and the game will progress automatically instead. The player must wait for some amount of this automatic progress to occur before they can resume interaction with the game.

Are Roguelites Incrementals?

Having made our variation of the Berlin Interpretation for incremental games, we can compare it to the Berlin Interpretation to determine if there's enough overlap that any game that "passes" the Berlin Interpretation would also pass the incremental variant. That is to say, whether any roguelite would also be considered an incremental game.

The meta-progression of an incremental game could arguably be considered a paradigm shift, and certainly adds some resource management. Goal-oriented would probably also apply. I think anything other than those would be a stretch, and in my opinion that just isn't enough to qualify. To be totally honest, I was never expecting to conclude otherwise though 😉

Sub-Genres

There are some trends in incremental games that go beyond just being a commonly used mechanic, such that they deeply affect the rest of the game design. These trends can be used to determine sub-genres within the incremental games umbrella:

Loops games are a sub-genre defined by having a core mechanic related to a loop, where the player is deciding the actions taken per loop. Notable examples include Idle Loops, Stuck in Time, Cavernous II, and Increlution. You may also argue Groundhog Life and Progress Knight fall into this sub-genre.

ITRTG-like games are a sub-genre defined by having a core mechanic based on clearing increasingly difficult battles and often tend to have a lot of different mechanics to become progressively stronger. Notable examples include Idling to Rule the Gods, NGU Idle, and Wizard and Minion Idle.

Polynomial Growth games are a sub-genre defined by having a core mechanic related to a higher degree polynomial. Notable examples include the base layer of Antimatter Dimensions and Swarm Simulator.

Upgrades Games is a category popular on flash games websites that featured games focused on buying upgrades that would allow you to attain more currency in some sort of minigame that would earn you more money to buy more upgrades, which I'd argue now belong under the fold of incremental games. Notable examples include the Learn to Fly series and Upgrade Complete.

Cultivation RPGs are a genre of games, books, and anime popular in China that center around being in a fantasy world with characters getting stronger over time. While few of them get translated into English, a fan of incremental games may find the available games interesting.

Last updated:

- +

Guide to Incrementals/Defining the Genre

Video games are placed into genres for a variety of reasons. They can give a mental shorthand to set the player's expectations up, they can help a game market itself by its similarities to other, already popular games, and honestly, people just love categorization for its own sake. For this guide, it's important to define the genre so it is clear what games it's even talking about.

This poses a problem. "Incremental" is a horribly vague way to define games. Most games have numbers going up in some form or another. We need a more specific definition - similar to how "strategy" can't just mean any game with any amount of strategy because that would be most games. What specifically differentiates incremental games from the rest?

"Incremental" implies it's a genre defined by a game mechanic, but all those game mechanics it could imply exist in many other games. Having a skill tree or upgrades doesn't make you incremental, and if a reset mechanic is all it takes then every roguelite would be an incremental as well. So clearly there's more to it than that - what makes an incremental an incremental?

I'd like to go over a couple of popular suggestions I've seen on defining the genre here. I have my personal preferences and will state them here, but I don't think there's a truly perfect answer here.

Disclaimer: I mostly play incremental games on my computer, and my definitions will be heavily biased towards the games I'm familiar with.

Incrementals vs Idlers vs Clickers

Oftentimes people refer to this genre as idle games and/or clicker games. You'll even find a trend of oxymoronic game titles that contain both terms. "Incremental games" is the umbrella term both those terms fall under. However, I'd like to argue that not only is it better to just use the term "incremental games", but calling them "idle games" or "clicker games" is wrong. Almost universally, these terms are used interchangeably to refer to the same kind of game, where you start the game click spamming and eventually automate the process. Frankly, that kind of game deserves neither title, and the genre of incremental games has trended away from ever requiring click spamming, as it's a bad mechanic, anyways.

While these games do span a spectrum of how active it requires you to be, and sorting games by that metric can be useful for those looking for a particular experience, the borders of when an incremental game counts as an "idler" is too blurry for the term to be useful. "Incremental games" may not be a great descriptive term for the genre (hence this many thousands of words long page on defining what the genre even is), but it's strictly better than calling them "idler" or "clicker" games. This guide will always use the term "incremental games" unless quoting someone else, as it is the term you typically see on all modern games in the genre.

Incrementals as Parodies

Let's start with one of the most interesting definitions of incremental games. Incremental games appear to be distilled versions of games or genres, "revealing" the naked game design at the core of these games or genres not unlike how parodies comment upon their source material.

To understand what that means, think of how a casino uses skinner boxes to emotionally manipulate its customers to keep playing, but "dressing" up the skinner box with tons of stimuli to hide that ultimately the goal is to condition you into coming back compulsively. The idea that incremental games are parodies means taking the stance that at some level all games are similarly manipulating you, giving dopamine rewards in a way that manipulates you to keep playing while not necessarily giving you any value or fulfillment. Incremental games, then, are any games that plainly display the skinner box, and the manipulative core of the game, at the forefront of the experience.

While incremental games can be fun and even healthy in certain contexts, they can exacerbate video game addiction more than other genres. If you feel like playing incremental games is taking priority over other things in your life, or manipulating your sleep schedule, it may be prudent to seek help. See r/StopGaming for resources.

This "undressing" tends to go hand in hand with a reduced focus on aesthetics, often just printing the game state directly to the screen as text. This makes incremental games much easier to develop, particularly for those with programming skills but not art skills, but that's a tangent for why Incremental Games Guide to Incrementals/Appeal to Developers.

Before I continue, I'd like to make my stance clear that I love games and incremental games, and do not think they should be considered inherently bad or manipulative with the above logic. Skinner boxes are just a way of manipulating behavior via rewards. The games are still fun - that's the reward! I'd believe the real criticism here is that it is "empty fun", or "empty dopamine", that doesn't offer any additional value or sense of fulfillment. I don't think that's inherently bad in moderation, although it can become a problem if the game is manipulating you for profit-seeking, or if you play the game to the detriment of the other parts of your life.

Another interpretation of incremental games as parodies comes from several mainstream incremental games that are also parodies of capitalism, such as cookie clicker and adventure capitalist. It's a very common framework for incremental games to portray the ever-increasing numbers as an insatiable hunger for resources, like the ones observed within capitalism. Therefore, these games are used as evidence that the genre as a whole is about parody and commentary.

Popular videos on incremental games that portray the genre as parodies are Why Idle games make good satire, and how it was ruined. and Bad Game Design - Clicker Games. You may also be interested in this response to the latter video from a fan of incremental games: BadGood Game Design - Clicker Games.

I think that this definition ultimately ascribes a motive to the genre as a whole that only happens to apply to some of the more mainstream titles. There certainly are incremental games commenting on different things, including the genre itself as in the case of The Prestige Tree Classic, The Ascension Tree, or Omega Layers, but certainly not all. And of course, not all games that comment on something or parody something are incremental games! Additionally, a very large majority of incremental games are mobile games using these manipulative strategies to get players to spend as much money as possible - hell, Adventure Capitalist is ostensibly a critique on capitalism but features microtransactions and gameplay that manipulates you into buying them! These profit-seeking incremental games certainly belong within the genre but are hardly parodies when they too use manipulation to serve their interests. Also, from my own anecdotal experience, those who use this definition seem to do so from a fairly surface-level familiarity with the genre, and often in the context of criticizing the genre or the fans thereof.

Incrementals as NGU

Another broad definition often used is that incremental games are games where the focus of the game is "numbers going up". This definition proposes that other genres simply use increasing numbers as a means to an end, but incremental games uniquely only care about the numbers themselves going up. Put another way, it implies there should be no narrative justification for the numbers going up other than "why shouldn't they be going up?"

While this definition is common because it feels easy to understand, it is difficult to formally define. Often phrases are used to describe games using this framework, such as having an "exaggerated sense of progression" or "big" numbers. These terms are vague and don't demonstrate an actual threshold between non-incrementals and incrementals. Most games have a sense of progression, so when is it "exaggerated"? How big are "big" numbers? Most notably, RPGs that are typically not considered incrementals will often pass this definition.

Additionally, a lot of incrementals tend to have some theme guiding the gameplay, or at least the names of mechanics. This makes the line blurred between when numbers are going up for their own sake versus for a contextual reason. I believe this point is best illustrated that, while most RPGs are not considered incremental games, there is a sub-genre of "incremental RPGs" that typically relates to RPGs that perform combat automatically. This definition of incremental games does not support RPGs and "incremental RPGs" being on distinct sides of the line if the only difference between them is manual vs automatic combat.

Incrementals as Strategies

This is a rarer interpretation, but there are similarities between incremental games and strategy games, implying incrementals might just be a sub-genre of strategy games. By this approach, incremental games would be defined by their relation to strategy games, and how they involve player strategy. Incremental games are often large optimization problems - above all else, the actual gameplay the player is performing is deciding what to do next. The consequences of wrong decisions are typically more lenient in incremental games - such as just not making optimal progress - but they certainly get complex.

So if we accept the premise that incrementals could fall under strategy, we still need to define what makes a strategy game an incremental versus some other strategy sub-genre. This is a bit tricky due to one particular sub-genre of strategy games: Factory Builders.

Factory builders, such as Factorio or Satisfactory, are games about gaining ever increasing resources, optimizing production, and expanding more and more. That... sounds pretty similar, doesn't it? In fact, there's been some debate on whether factory builders would fall under the "incremental" umbrella. I think it's safe to say the two are certainly related, and probably have quite a bit of overlap in playerbase.

Roguelites as Incrementals?

Earlier on, I mentioned reset mechanics shouldn't be used in the definition because that could make all roguelites incrementals... But what if it does? A lot of incrementals can be described as games with a strong sense of progression, often with layers of meta-progression. Roguelites fit that bill to a T. What would make roguelites not incremental? I honestly don't think there's a good explanation here, but many fans of incremental games will state they do believe the two genres to be unrelated, even if there's a significant overlap between their player bases due to having similar appealing traits.

At this point, it'd be appropriate to consider what part of the definition of roguelites precludes them from also being incrementals, but that reveals a new problem: What are roguelites? They're usually defined as rogue_likes with meta-progression, but that just pushes the problem back a step: Incrementals aren't the only genre to have difficulties defining themselves, it seems! Roguelikes are another genre where the community argues over the formal definition of their genre, although that means we can borrow from their process of coming to a consensus, and maybe come across a viable definition for incremental games.

The Berlin Interpretation

By far the most popular way of defining roguelikes is the "Berlin Interpretation", which acknowledged the diversity of games within the genre and argued the definition should not be based on any ideals about what the genre ought to be, but rather defined by "its canon". They argued there are a handful of games that can be used to define the canon for roguelikes, and from those games, a list of factors can be derived to determine a game's "roguelikeness". The more factors a game has, the more of a roguelike it is. This strategy is very lenient, allowing a game to not present any specific factor so long as it shows enough, and accounts for the blurriness of any genre definition by not explicitly stating how many factors a game must have to qualify as a definite roguelike.

I believe this strategy for defining genres can be applied to other genres as well. A handful of games can be argued to be the incremental games canon, and a list of factors derived from them can be used to judge any game based on its "incrementalness". I'll propose such a canon and list of factors here, but by no means should it be considered the end-all-be-all.

Note: The "Temple of the roguelike", an authority within the genre, has since replaced the Berlin Interpretation with a new set of factors here: https://blog.roguetemple.com/what-is-a-traditional-roguelike/

The Incremental Games Canon

Alright, time to get controversial. Up til now, I've been trying my best to stay objective and analytical, but now it's time to start making some opinionated decisions. Here is a list of games I think could justifiably make up an Incremental Games Canon:

I chose a variety of games here, biasing towards newer games, purposefully to avoid making a narrow or "traditional" definition. The genre is growing and shouldn't be constrained by the traits of the early popular titles. A lot of these could easily be replaced with other games that are mechanically congruent, so ultimately I'm sure if you asked 10 people for their canon list you'd just get 10 different answers, but I think this should sufficiently allow us to determine what factors make a game have higher "incrementalness".

The Paradigm Shift

The Paradigm Shift is probably the highest possible value factor for an incremental. It's so common that for a while people referred to incrementals that exhibit this trait as "unfolding" games, to the point of trying to replace the term incremental due to their popularity. Paradigm shifts refer to when the gameplay significantly changes. There are too many examples to list here, but notably, every single reset mechanic is typically going to be a paradigm shift. Examples of games with paradigm shifts that aren't tied to reset mechanics include Universal Paperclips and A Dark Room.

There are many reasons for the appeal of paradigm shifts. Oftentimes each mechanic builds on top of the existing mechanics, increasing the complexity of the game in steps so the player can follow along. They provide a sense of mystery, with the player anticipating what will happen next. They shake up the gameplay before it gets too stale - allowing the game to entertain for longer before the sense of Guide to Incrementals/What is Content? dissipates. Of the canon games selected above, I would argue every single one contains a paradigm shift (although I could see someone disagreeing with that statement wrt Increlution).

I should take a moment to say that while I'm hyping up this specific factor, we cannot just reduce the genre definition to "does it have paradigm shifts". Many games have paradigm shifts that are not incremental, so it's just an indicator of incrementalness. Additionally, it can become quite hard to determine how large of a shift is a "paradigm" shift. Take, for example, any game with a skill tree. In some games, each skill node might have a large impact on how you play with the game, and qualify as a paradigm shift for some players. In other games, each skill node might just be a small percentage modifier on some stat that doesn't really impact much more than a slight bias towards an already established mechanic that's newly buffed. Every single canon game may show that it's common amongst incremental games, but could just as easily indicate that they're common in games in general.

High-Value Factors

I won't take as long to discuss the high and low-value factors, as you've already seen most of them brought up earlier on this page. As a reminder, a game does NOT need all of these to be an incremental game, but these are factors that each indicate a strong possibility the game is an incremental, so having several of these means they probably are. These factors apply to most of the canon incremental games.

"Pure UI" Display. Incrementals typically have a textual presentation of the game state - there isn't a visual representation of the entities within the game. The interface is closer to what would be just the UI of a game in another genre or the control panel of a plane. If there is a visual representation, the player is often still interacting with non-diegetic game elements.

Reduced Consequences. Incrementals tend to have reduced repurcussions for misplaying. They very rarely have fail states, where often the largest consequence is simply not progressing - never losing progress.

Optimization Problems. The predominant gameplay of incrementals is typically solving optimization problems, from deciding which purchase to save up for to reasoning and deciding between different mutually exclusive options the game presents.

Resource Management. Incrementals tend to have a lot of resources within the game to keep track of.

Low-Value Factors

These are low-value factors, meaning they aren't as strongly correlated with incremental games. Incremental games may have none of these, and non-incrementals may have several of these - if a game only has low-value factors, they're probably not an incremental.

Fast Numeric Growth. Numbers in incremental games tend to grow faster than in other genres. There are more instances of superlinear growth. The larger the numbers get, the stronger of a signal this factor is.

Automation. As an incremental game progresses, the player often no longer has to deal with earlier mechanics, by having them either happen automatically or otherwise be replaced with an alternative that requires less player interaction.

Goal-Oriented. Incrementals are often heavily reliant on extrinsic motivation to guide the player. Typically this is through some sort of in-game goal to work towards, such as a certain amount of a resource being required to unlock or purchase something new.

Waiting is a Mechanic. In incremental games, the player may come across times where there is no action they can take, and the game will progress automatically instead. The player must wait for some amount of this automatic progress to occur before they can resume interaction with the game.

Are Roguelites Incrementals?

Having made our variation of the Berlin Interpretation for incremental games, we can compare it to the Berlin Interpretation to determine if there's enough overlap that any game that "passes" the Berlin Interpretation would also pass the incremental variant. That is to say, whether any roguelite would also be considered an incremental game.

The meta-progression of an incremental game could arguably be considered a paradigm shift, and certainly adds some resource management. Goal-oriented would probably also apply. I think anything other than those would be a stretch, and in my opinion that just isn't enough to qualify. To be totally honest, I was never expecting to conclude otherwise though 😉

Sub-Genres

There are some trends in incremental games that go beyond just being a commonly used mechanic, such that they deeply affect the rest of the game design. These trends can be used to determine sub-genres within the incremental games umbrella:

Loops games are a sub-genre defined by having a core mechanic related to a loop, where the player is deciding the actions taken per loop. Notable examples include Idle Loops, Stuck in Time, Cavernous II, and Increlution. You may also argue Groundhog Life and Progress Knight fall into this sub-genre.

ITRTG-like games are a sub-genre defined by having a core mechanic based on clearing increasingly difficult battles and often tend to have a lot of different mechanics to become progressively stronger. Notable examples include Idling to Rule the Gods, NGU Idle, and Wizard and Minion Idle.

Polynomial Growth games are a sub-genre defined by having a core mechanic related to a higher degree polynomial. Notable examples include the base layer of Antimatter Dimensions and Swarm Simulator.

Upgrades Games is a category popular on flash games websites that featured games focused on buying upgrades that would allow you to attain more currency in some sort of minigame that would earn you more money to buy more upgrades, which I'd argue now belong under the fold of incremental games. Notable examples include the Learn to Fly series and Upgrade Complete.

Cultivation RPGs are a genre of games, books, and anime popular in China that center around being in a fantasy world with characters getting stronger over time. While few of them get translated into English, a fan of incremental games may find the available games interesting.

Last updated:

+ \ No newline at end of file diff --git a/garden/guide-to-incrementals/index.html b/garden/guide-to-incrementals/index.html index edc19722..54979e10 100644 --- a/garden/guide-to-incrementals/index.html +++ b/garden/guide-to-incrementals/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Guide to Incrementals

This is a comprehensive guide to Incremental Games, a genre of video games. It will explore defining the genre, why it's appealing, and how to design and build your own incremental game. Along the way will be interactive examples, snippets from other creators, and relevant material to contextualize everything.

Note: This is an incomplete document. I want to keep adding opinions and opposing views from other incremental games developers, and add interactive examples to illustrate various points regarding game design and balancing. Consider this a living document - and see the changelog at the end.

Note: This was made before my switch to a digital garden, and is written as prose. Hope you don't mind!

Why am I making this?

That's a good question! What authority do I have to be making this guide? I haven't made the best incremental games, nor the most incremental games, certainly not the most popular ones either. But I do have some formal education in game development, know a lot of incremental game devs (as well as other game devs), and have a passionate interest in ludology, classifying genres, etc. I've also made a couple of incremental games) myself.

If you have any additional questions about my credentials or anything on this site, feel free to reach out!

Ludology

Making an Incremental

Last updated:

- +

Guide to Incrementals

This is a comprehensive guide to Incremental Games, a genre of video games. It will explore defining the genre, why it's appealing, and how to design and build your own incremental game. Along the way will be interactive examples, snippets from other creators, and relevant material to contextualize everything.

Note: This is an incomplete document. I want to keep adding opinions and opposing views from other incremental games developers, and add interactive examples to illustrate various points regarding game design and balancing. Consider this a living document - and see the changelog at the end.

Note: This was made before my switch to a digital garden, and is written as prose. Hope you don't mind!

Why am I making this?

That's a good question! What authority do I have to be making this guide? I haven't made the best incremental games, nor the most incremental games, certainly not the most popular ones either. But I do have some formal education in game development, know a lot of incremental game devs (as well as other game devs), and have a passionate interest in ludology, classifying genres, etc. I've also made a couple of incremental games) myself.

If you have any additional questions about my credentials or anything on this site, feel free to reach out!

Ludology

Making an Incremental

Last updated:

+ \ No newline at end of file diff --git a/garden/guide-to-incrementals/navigating-criticism/index.html b/garden/guide-to-incrementals/navigating-criticism/index.html index c52fd3d6..b418ffb3 100644 --- a/garden/guide-to-incrementals/navigating-criticism/index.html +++ b/garden/guide-to-incrementals/navigating-criticism/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Guide to Incrementals/Navigating Criticism

Developing games is fun and exciting and teaches a lot of wonderful skills - I enthusiastically encourage anyone with an interest in game development to try it out - and incremental games are a wonderful way to get started. However, there are many challenges young and inexperienced developers have to face, and I think the hardest one - harder than coding, debugging, balancing, etc. - is handling criticism. When you put your heart and soul into a game it is natural to feel very vulnerable. While I think there's a lot communities can do to ensure they're welcoming, positive and constructive with their criticisms, inevitably you will eventually read some, and potentially a lot, of comments that can deeply affect you. No one is immune to this, from young incremental game developers to the largest content creators you can think of. That's why it's important to be able to process and navigate criticism, because ultimately collecting feedback is essential to the journey to becoming a better developer. On this page, we'll explore how to embrace criticism, grow from it, and continue to post your games publicly with confidence.

Reading Feedback

Game development is a skill that takes time and practice to get truly great at. Criticism and other constructive feedback are vital to continually improving. It's useful to look at the criticism as solely a tool for improving this game and future games - that is to say, it should never be used against you as a person. Insults towards the developer(s) themselves are never okay and should not be allowed within whatever community you're sharing your works in. If you do come across a comment you interpret as an attack upon your person, you should report it. For other negative comments, try not to internalize them; instead, focus on improving the game. By distancing your own identity from your work emotionally, you can better analyze the game and use the feedback to your advantage.

Not all feedback is made equal, and you don't need to feel compelled to read and obey every piece of feedback you receive. Learn to distinguish between constructive feedback and unhelpful comments. Constructive feedback typically offers specific suggestions for improvement, while unhelpful comments are often vague or hurtful. Prioritize the former and disregard the latter. That said, most feedback you get will not be from game developers, so take specific suggestions with a grain of salt. Determine the actual problem they're experiencing, and design what you believe the best solution to that problem would be, regardless if that's the specific solution the player asked for. And keep in mind, due to different player preferences you'll never satisfy everyone, and you don't need to. Ultimately if even just you find the game fun, then that's a success.

Seeking Feedback

When deciding where to share your game, consider the type of players you anticipate getting, and the kind of feedback you can anticipate receiving. Different communities will have different levels of support for learning developers, and certain communities may prefer certain types of games or mechanics. It's important to get a diverse set of feedback focused on players you think will enjoy the specific game you're making.

Collecting feedback from other game developers is incredibly helpful. They've trained themselves to recognize good and bad game design and how to articulate the differences, and from my experience are much more likely to leave positive and constructive comments since they've been in your shoes before! They understand the struggles and can offer guidance and emotional support.

Responding to Feedback

Negative feedback can naturally feel like an attack, and it's okay to get angry. However, lashing back is never the appropriate response. It's best to cool off IRL, and keep in mind all the positive comments you've received. There's a concept in Psychology called negative bias that explains how negative feedback tends to stick with us much more prominently than positive feedback, so it's useful to regularly remind yourself of all the positive feedback you've received. Celebrate your successes, no matter how small they may seem - getting a game to a state you can publicly share it with people is an accomplishment in and of itself!

Remember your passion and your initial reasons for getting into game development. The journey will have its ups and downs, but staying true to your vision and passion will keep you motivated.

Last updated:

- +

Guide to Incrementals/Navigating Criticism

Developing games is fun and exciting and teaches a lot of wonderful skills - I enthusiastically encourage anyone with an interest in game development to try it out - and incremental games are a wonderful way to get started. However, there are many challenges young and inexperienced developers have to face, and I think the hardest one - harder than coding, debugging, balancing, etc. - is handling criticism. When you put your heart and soul into a game it is natural to feel very vulnerable. While I think there's a lot communities can do to ensure they're welcoming, positive and constructive with their criticisms, inevitably you will eventually read some, and potentially a lot, of comments that can deeply affect you. No one is immune to this, from young incremental game developers to the largest content creators you can think of. That's why it's important to be able to process and navigate criticism, because ultimately collecting feedback is essential to the journey to becoming a better developer. On this page, we'll explore how to embrace criticism, grow from it, and continue to post your games publicly with confidence.

Reading Feedback

Game development is a skill that takes time and practice to get truly great at. Criticism and other constructive feedback are vital to continually improving. It's useful to look at the criticism as solely a tool for improving this game and future games - that is to say, it should never be used against you as a person. Insults towards the developer(s) themselves are never okay and should not be allowed within whatever community you're sharing your works in. If you do come across a comment you interpret as an attack upon your person, you should report it. For other negative comments, try not to internalize them; instead, focus on improving the game. By distancing your own identity from your work emotionally, you can better analyze the game and use the feedback to your advantage.

Not all feedback is made equal, and you don't need to feel compelled to read and obey every piece of feedback you receive. Learn to distinguish between constructive feedback and unhelpful comments. Constructive feedback typically offers specific suggestions for improvement, while unhelpful comments are often vague or hurtful. Prioritize the former and disregard the latter. That said, most feedback you get will not be from game developers, so take specific suggestions with a grain of salt. Determine the actual problem they're experiencing, and design what you believe the best solution to that problem would be, regardless if that's the specific solution the player asked for. And keep in mind, due to different player preferences you'll never satisfy everyone, and you don't need to. Ultimately if even just you find the game fun, then that's a success.

Seeking Feedback

When deciding where to share your game, consider the type of players you anticipate getting, and the kind of feedback you can anticipate receiving. Different communities will have different levels of support for learning developers, and certain communities may prefer certain types of games or mechanics. It's important to get a diverse set of feedback focused on players you think will enjoy the specific game you're making.

Collecting feedback from other game developers is incredibly helpful. They've trained themselves to recognize good and bad game design and how to articulate the differences, and from my experience are much more likely to leave positive and constructive comments since they've been in your shoes before! They understand the struggles and can offer guidance and emotional support.

Responding to Feedback

Negative feedback can naturally feel like an attack, and it's okay to get angry. However, lashing back is never the appropriate response. It's best to cool off IRL, and keep in mind all the positive comments you've received. There's a concept in Psychology called negative bias that explains how negative feedback tends to stick with us much more prominently than positive feedback, so it's useful to regularly remind yourself of all the positive feedback you've received. Celebrate your successes, no matter how small they may seem - getting a game to a state you can publicly share it with people is an accomplishment in and of itself!

Remember your passion and your initial reasons for getting into game development. The journey will have its ups and downs, but staying true to your vision and passion will keep you motivated.

Last updated:

+ \ No newline at end of file diff --git a/garden/guide-to-incrementals/what-is-content/index.html b/garden/guide-to-incrementals/what-is-content/index.html index 3870a2bb..95335505 100644 --- a/garden/guide-to-incrementals/what-is-content/index.html +++ b/garden/guide-to-incrementals/what-is-content/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Guide to Incrementals/What is Content?

If you've been in the incremental games community for any amount of time, you'll quickly find the number one thing players want is content. They want as much of it as possible! The most popular incremental games have tons of content, so they just keep stretching on and on and on, introducing mechanic after mechanic, and players love it. In fact, players seem to value the amount of content over the quality of any specific content. However, there's a bit of a lack of understanding concerning what content is, and I'd like to explore what counts as content, and how we measure it. As a baseline definition, I think "content" can just be described as the parts of the game that engage the player, but to truly understand it we need to contextualize what that means and how it affects the gameplay experience.

To clarify the purpose of this page, my goal is not to get (too) nitpicky or to attack games with "low content". There's nothing wrong with short / low-content games - I'm quite a big fan of those games myself! This is mostly targeted toward those who ask for content and settle for "long" games, and those who want to provide content but want to make sure they're not just artificially inflating the game. Ultimately, I suppose the goal is to just reduce the amount of artificially inflated content for the sake of having a "longer" game.

Interaction

I think it should be a fairly non-controversial opinion that time spent solely waiting should not count towards content. That is not including the time reading various effects or making decisions in your head, but rather time spent waiting for a condition to be met so you can re-engage with the game.

That is not to say games should necessarily try to minimize this time. Plenty of games lead towards more infrequent interaction and still get popular. In fact, these games appeal to many gamers who want to have something to check up on in between bursts of working on some other activity. These games seem to have fallen slightly out of fashion amongst modern incremental games, but they're still fully valid. The point I'm trying to make here is just that this time is not content. As an extreme example, a game with no interactions and just a counter that goes up every second could safely be said to have 0 content beyond the time it takes to understand what's going on. If it has a list of "goals" to hit, then the time understanding those goals and a short time after achieving each one could be considered content, but not the idle times in between.

Let's take a look at the opposite end of the spectrum - interaction that is so frequent as to become mindless. This is any mechanic where you need to spam-click something to progress. This may be a more controversial take, but I do not believe this constitutes content either. It does not engage the player, because each consecutive click blends together and they do not individually change the gameplay experience. That is to say, a single click and 100 clicks are not meaningfully different in terms of engaging the player. I'd go as far as to say clicking 100 times would be actively worse, as it's artificially delaying the next piece of actual content, alongside the issues of accessibility and potentially causing RSI.

Repeatable Purchases

Imagine an entity in a game that you can purchase multiple times, each time it performs the same thing but for a higher cost. These are incredibly common, from the buildings in cookie clicker to the units in swarm sim to the IP and EP multipliers in antimatter dimensions. However, how much content is each specific purchase? Is it content beyond the first purchase? Does it have diminishing returns? What if you are oscillating between two different repeatable purchases? How much content is lost when you automate) away a repeatable purchase?

I don't want to take too harsh a stance against repeatable purchases. They're useful tools and can be used in a myriad of interesting ways. I feel they do become "stale" or less meaningful content over time, and this happens exponentially quickly the more frequently it can be purchased. A classic example that I believe goes too far is the IP/EP multipliers in Antimatter Dimensions. I would go as far as to say they are a chore and do not provide any meaningful content after you've bought them a couple of times. It's a method for inflating numbers (effectively making every OOM a 5x step instead of 10x), that punishes the player progression-wise whenever they forget to max it again, and eventually gets automated away as a reward to the player for making enough progress.

Just to voice the other side of this argument, Acamaeda defended the IP multiplier as giving the player a "good" upgrade every OOM. I can understand that to a point and need to clarify I'm mainly criticizing IP/EP multipliers after they've been introduced for a while. In fact, I would defend the multipliers for a short while after they're introduced using the same logic I would use to defend normal dimensions as repeatable purchases, at least pre-infinity. There's "content" to be had in looking at what dimensions will become affordable next, and then choosing which to buy amongst those. The IP/EP multipliers, early into infinity or eternity respectively, provide another option that gets put into that mental queue of things to buy with each OOM reached - although the optimal order is often quite trivial and not particularly engaging.

The IP/EP multipliers are not the only repeatable purchase in antimatter dimensions I take offense to. The time dimensions are also a series of repeatable purchases, that are all so similar and static that it doesn't take long before you never need to put any thought into buying them, how much you're buying at once, or the order you buy them in - you just press max all and move on. The entire tab could've been just the max all button and it would not have made a difference beyond the start of the eternity layer. The normal dimensions technically have this problem as well, but since you're constantly getting antimatter the order feels like it has a larger impact and it's more meaningful content, right up until they're automated away. Infinity dimensions are a compromise between the two, so I'm highlighting time dimensions here as the most egregious.

Following Instructions

We're getting more and more controversial as we go along! Let's talk about how linear content is not content now (in some circumstances). A trend in incremental games is adding difficulty by adding a web of effects that abstract the true change you can expect from any specific purchase or decision you make. If a game is both linear and sufficiently abstracts the effect of player decisions, then the player will no longer be engaging with the content - they'll simply be clicking on things as they become available. This isn't necessarily a bad thing, as plenty of players don't mind this style of gameplay, but I'd argue once you reach a point where players don't bother reading the effects, those interactions are no longer truly content. Note that unlike the previous qualifiers mentioned, this qualifier is based on the player, and therefore subjective. In effect, it's a spectrum where the more complicated the web of effects becomes, the more likely it is to disengage the player.

This over-complicatedness leading to disengaging the player can also happen from non-linear gameplay. If the web of effects becomes sufficiently complicated and finding the optimal progression route too time-consuming to discover, players will seek out guides from other players who've completed the game. The second they do this, the game effectively becomes linearly following the instructions of the guide and all the above criticisms apply. Similarly to as before, though, this is a spectrum and not everyone will seek out a guide at the same level of difficulty.

Automation

Automation is a staple of the genre, but it has certain implications for the design of the game. Why, when new content is introduced, must the older content be automated away - why is it a chore and it feels rewarding to not have to do it again? Why does the new mechanic have such appeal if we know it too will just be automated away later on, and we'll be happy when that happens? It honestly begs the question of why this framework of introducing content and automating the old content is even enjoyable - and nearly nonexistent in other genres. You're not going to reach a point in a platformer game where they just automate the jumping part - that's the core mechanic! Instead, platformers either add new mechanics that build on the core mechanic or at least re-contextualize the core mechanic. However, in incremental games new content very frequently means replacing older content, as opposed to augmenting it.

Admittedly, the above paragraph ignores the obvious answer that separates incremental games in this regard. These mechanics become chores as their frequency increases. The frequency increases to give a sense of progression, and automation is seen as a reward because it now manages what was becoming unmanageable. The new content then comes in and continues the loop to give a stronger sense of progression. That's all good and a fine justification for automating content instead of building upon the base mechanic. It's also much easier to design, as each layer essentially lets you start over instead of needing to think of ideas that conform to the original core mechanic.

So, what's the problem? Even if this trend is justified and easy to implement, there are some other effects it has on the game design. First off, and this is probably a neutral point, incremental games with this cycle of replacing old mechanics with new ones trend towards more and more abstract and further away from any narrative throughline as they add layers. There are only so many justifications for resetting progress, so if a game wants to have several of these layers they're inevitably going to become generic or increasingly loosely associated with the original content. It's most unfortunate, in my opinion when an interesting or innovative core mechanic gets fully automated once a generic "prestige" layer is unlocked.

A recent example is Really Grass Cutting Incremental, an incremental game about cutting grass (although I'm really criticizing the Roblox game it's based on). Except, it doesn't continue to be about cutting grass. After you buy enough upgrades to increase your grass cutting and level up sufficiently you "prestige", an abstract term that in this case means you reset all your progress to get some currency to buy upgrades that do the same things as the original upgrades, but these won't reset on future prestiges. You'll eventually be able to "crystallize", which means you reset all your progress to get some currency to buy upgrades that do the same things as the original upgrades (and a couple of new ones) and won't reset on future crystallizes. Fine. You'll progress a bit, complete some challenges, and finally get to... grasshop? Grasshopping is this mechanic where you reset all your progress to get some resource that isn't for buying upgrades - this time you just unlock different modifiers on everything based on their amount. You may have gotten the point by now, but there are also "steelie" resets which give you steel for some reason, before unlocking a factory with various machines - none of which are directly tied to cutting grass, and start gathering things like oil and reset for rocket parts and reset to go to space and so on and so on. Throughout all of this there is absolutely no narrative justification or throughline for the direction the game is going, or why cutting grass is still relevant when we're collecting things like rocket parts. I may be going a little hard on GCI, but it is far from alone.

Tips for Developers

If you're a developer, by this point you should have a pretty decent idea of how to create "true" content in your game. Here are some other specific tips I'd suggest:

An upgrade that simply unlocks another upgrade trivially isn't content. However, many games have an upgrade that just unlocks a feature, which then has a wait or other requirements before it can be used. Try to make sure when you unlock a feature, there is immediately something to do with the feature - for example, perhaps give them a small amount of the new currency it unlocks, if applicable.

If you don't have a large web of effects, and can definitively say the impact of a purchase is to multiply the gain of the cost currency by N, and the next purchase costs N times the amount of that same currency, then this purchase effectively made no difference and it may have made more sense to just go directly to the next upgrade. That said, having effects based on things like the number of purchases made will quickly invalidate this tip.

Last updated:

- +

Guide to Incrementals/What is Content?

If you've been in the incremental games community for any amount of time, you'll quickly find the number one thing players want is content. They want as much of it as possible! The most popular incremental games have tons of content, so they just keep stretching on and on and on, introducing mechanic after mechanic, and players love it. In fact, players seem to value the amount of content over the quality of any specific content. However, there's a bit of a lack of understanding concerning what content is, and I'd like to explore what counts as content, and how we measure it. As a baseline definition, I think "content" can just be described as the parts of the game that engage the player, but to truly understand it we need to contextualize what that means and how it affects the gameplay experience.

To clarify the purpose of this page, my goal is not to get (too) nitpicky or to attack games with "low content". There's nothing wrong with short / low-content games - I'm quite a big fan of those games myself! This is mostly targeted toward those who ask for content and settle for "long" games, and those who want to provide content but want to make sure they're not just artificially inflating the game. Ultimately, I suppose the goal is to just reduce the amount of artificially inflated content for the sake of having a "longer" game.

Interaction

I think it should be a fairly non-controversial opinion that time spent solely waiting should not count towards content. That is not including the time reading various effects or making decisions in your head, but rather time spent waiting for a condition to be met so you can re-engage with the game.

That is not to say games should necessarily try to minimize this time. Plenty of games lead towards more infrequent interaction and still get popular. In fact, these games appeal to many gamers who want to have something to check up on in between bursts of working on some other activity. These games seem to have fallen slightly out of fashion amongst modern incremental games, but they're still fully valid. The point I'm trying to make here is just that this time is not content. As an extreme example, a game with no interactions and just a counter that goes up every second could safely be said to have 0 content beyond the time it takes to understand what's going on. If it has a list of "goals" to hit, then the time understanding those goals and a short time after achieving each one could be considered content, but not the idle times in between.

Let's take a look at the opposite end of the spectrum - interaction that is so frequent as to become mindless. This is any mechanic where you need to spam-click something to progress. This may be a more controversial take, but I do not believe this constitutes content either. It does not engage the player, because each consecutive click blends together and they do not individually change the gameplay experience. That is to say, a single click and 100 clicks are not meaningfully different in terms of engaging the player. I'd go as far as to say clicking 100 times would be actively worse, as it's artificially delaying the next piece of actual content, alongside the issues of accessibility and potentially causing RSI.

Repeatable Purchases

Imagine an entity in a game that you can purchase multiple times, each time it performs the same thing but for a higher cost. These are incredibly common, from the buildings in cookie clicker to the units in swarm sim to the IP and EP multipliers in antimatter dimensions. However, how much content is each specific purchase? Is it content beyond the first purchase? Does it have diminishing returns? What if you are oscillating between two different repeatable purchases? How much content is lost when you automate) away a repeatable purchase?

I don't want to take too harsh a stance against repeatable purchases. They're useful tools and can be used in a myriad of interesting ways. I feel they do become "stale" or less meaningful content over time, and this happens exponentially quickly the more frequently it can be purchased. A classic example that I believe goes too far is the IP/EP multipliers in Antimatter Dimensions. I would go as far as to say they are a chore and do not provide any meaningful content after you've bought them a couple of times. It's a method for inflating numbers (effectively making every OOM a 5x step instead of 10x), that punishes the player progression-wise whenever they forget to max it again, and eventually gets automated away as a reward to the player for making enough progress.

Just to voice the other side of this argument, Acamaeda defended the IP multiplier as giving the player a "good" upgrade every OOM. I can understand that to a point and need to clarify I'm mainly criticizing IP/EP multipliers after they've been introduced for a while. In fact, I would defend the multipliers for a short while after they're introduced using the same logic I would use to defend normal dimensions as repeatable purchases, at least pre-infinity. There's "content" to be had in looking at what dimensions will become affordable next, and then choosing which to buy amongst those. The IP/EP multipliers, early into infinity or eternity respectively, provide another option that gets put into that mental queue of things to buy with each OOM reached - although the optimal order is often quite trivial and not particularly engaging.

The IP/EP multipliers are not the only repeatable purchase in antimatter dimensions I take offense to. The time dimensions are also a series of repeatable purchases, that are all so similar and static that it doesn't take long before you never need to put any thought into buying them, how much you're buying at once, or the order you buy them in - you just press max all and move on. The entire tab could've been just the max all button and it would not have made a difference beyond the start of the eternity layer. The normal dimensions technically have this problem as well, but since you're constantly getting antimatter the order feels like it has a larger impact and it's more meaningful content, right up until they're automated away. Infinity dimensions are a compromise between the two, so I'm highlighting time dimensions here as the most egregious.

Following Instructions

We're getting more and more controversial as we go along! Let's talk about how linear content is not content now (in some circumstances). A trend in incremental games is adding difficulty by adding a web of effects that abstract the true change you can expect from any specific purchase or decision you make. If a game is both linear and sufficiently abstracts the effect of player decisions, then the player will no longer be engaging with the content - they'll simply be clicking on things as they become available. This isn't necessarily a bad thing, as plenty of players don't mind this style of gameplay, but I'd argue once you reach a point where players don't bother reading the effects, those interactions are no longer truly content. Note that unlike the previous qualifiers mentioned, this qualifier is based on the player, and therefore subjective. In effect, it's a spectrum where the more complicated the web of effects becomes, the more likely it is to disengage the player.

This over-complicatedness leading to disengaging the player can also happen from non-linear gameplay. If the web of effects becomes sufficiently complicated and finding the optimal progression route too time-consuming to discover, players will seek out guides from other players who've completed the game. The second they do this, the game effectively becomes linearly following the instructions of the guide and all the above criticisms apply. Similarly to as before, though, this is a spectrum and not everyone will seek out a guide at the same level of difficulty.

Automation

Automation is a staple of the genre, but it has certain implications for the design of the game. Why, when new content is introduced, must the older content be automated away - why is it a chore and it feels rewarding to not have to do it again? Why does the new mechanic have such appeal if we know it too will just be automated away later on, and we'll be happy when that happens? It honestly begs the question of why this framework of introducing content and automating the old content is even enjoyable - and nearly nonexistent in other genres. You're not going to reach a point in a platformer game where they just automate the jumping part - that's the core mechanic! Instead, platformers either add new mechanics that build on the core mechanic or at least re-contextualize the core mechanic. However, in incremental games new content very frequently means replacing older content, as opposed to augmenting it.

Admittedly, the above paragraph ignores the obvious answer that separates incremental games in this regard. These mechanics become chores as their frequency increases. The frequency increases to give a sense of progression, and automation is seen as a reward because it now manages what was becoming unmanageable. The new content then comes in and continues the loop to give a stronger sense of progression. That's all good and a fine justification for automating content instead of building upon the base mechanic. It's also much easier to design, as each layer essentially lets you start over instead of needing to think of ideas that conform to the original core mechanic.

So, what's the problem? Even if this trend is justified and easy to implement, there are some other effects it has on the game design. First off, and this is probably a neutral point, incremental games with this cycle of replacing old mechanics with new ones trend towards more and more abstract and further away from any narrative throughline as they add layers. There are only so many justifications for resetting progress, so if a game wants to have several of these layers they're inevitably going to become generic or increasingly loosely associated with the original content. It's most unfortunate, in my opinion when an interesting or innovative core mechanic gets fully automated once a generic "prestige" layer is unlocked.

A recent example is Really Grass Cutting Incremental, an incremental game about cutting grass (although I'm really criticizing the Roblox game it's based on). Except, it doesn't continue to be about cutting grass. After you buy enough upgrades to increase your grass cutting and level up sufficiently you "prestige", an abstract term that in this case means you reset all your progress to get some currency to buy upgrades that do the same things as the original upgrades, but these won't reset on future prestiges. You'll eventually be able to "crystallize", which means you reset all your progress to get some currency to buy upgrades that do the same things as the original upgrades (and a couple of new ones) and won't reset on future crystallizes. Fine. You'll progress a bit, complete some challenges, and finally get to... grasshop? Grasshopping is this mechanic where you reset all your progress to get some resource that isn't for buying upgrades - this time you just unlock different modifiers on everything based on their amount. You may have gotten the point by now, but there are also "steelie" resets which give you steel for some reason, before unlocking a factory with various machines - none of which are directly tied to cutting grass, and start gathering things like oil and reset for rocket parts and reset to go to space and so on and so on. Throughout all of this there is absolutely no narrative justification or throughline for the direction the game is going, or why cutting grass is still relevant when we're collecting things like rocket parts. I may be going a little hard on GCI, but it is far from alone.

Tips for Developers

If you're a developer, by this point you should have a pretty decent idea of how to create "true" content in your game. Here are some other specific tips I'd suggest:

An upgrade that simply unlocks another upgrade trivially isn't content. However, many games have an upgrade that just unlocks a feature, which then has a wait or other requirements before it can be used. Try to make sure when you unlock a feature, there is immediately something to do with the feature - for example, perhaps give them a small amount of the new currency it unlocks, if applicable.

If you don't have a large web of effects, and can definitively say the impact of a purchase is to multiply the gain of the cost currency by N, and the next purchase costs N times the amount of that same currency, then this purchase effectively made no difference and it may have made more sense to just go directly to the next upgrade. That said, having effects based on things like the number of purchases made will quickly invalidate this tip.

Last updated:

+ \ No newline at end of file diff --git a/garden/incremental-social/index.html b/garden/incremental-social/index.html index 5cb5d42f..3a6b98cc 100644 --- a/garden/incremental-social/index.html +++ b/garden/incremental-social/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Last updated:

- +

Last updated:

+ \ No newline at end of file diff --git a/garden/ivy-road/index.html b/garden/ivy-road/index.html index 721c662d..cdd6950b 100644 --- a/garden/ivy-road/index.html +++ b/garden/ivy-road/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Ivy Road

Referenced by: Davey Wreden, Wanderstop

Tags: Davey Wreden

Ivy Road is a indie game studio created by Davey Wreden, Karla Kimonja, and C418

Last updated:

- +

Ivy Road

Referenced by: Davey Wreden, Wanderstop

Tags: Davey Wreden

Ivy Road is a indie game studio created by Davey Wreden, Karla Kimonja, and C418

Last updated:

+ \ No newline at end of file diff --git a/garden/kronos/index.html b/garden/kronos/index.html index 6f0c8a85..54e0c29d 100644 --- a/garden/kronos/index.html +++ b/garden/kronos/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Kronos

Referenced by: V-ecs

Tags: My Projects, Profectus

My largest and most ambitious incremental game I've ever made

  • A magnum opus, of sorts ;P

Still in development, and will be for a long time. I have full intention of completing it, however

An older version, that is built in The Modding Tree, only has the gameplay, and only goes up to Chapter 2, can be played here

Last updated:

- +

Kronos

Referenced by: V-ecs

Tags: My Projects, Profectus

My largest and most ambitious incremental game I've ever made

  • A magnum opus, of sorts ;P

Still in development, and will be for a long time. I have full intention of completing it, however

An older version, that is built in The Modding Tree, only has the gameplay, and only goes up to Chapter 2, can be played here

Last updated:

+ \ No newline at end of file diff --git a/garden/logseq/index.html b/garden/logseq/index.html index 46db9582..8aa8bf85 100644 --- a/garden/logseq/index.html +++ b/garden/logseq/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Logseq

Referenced by: This Knowledge Hub

Logseq is an Open Source outlining software

Last updated:

- +

Logseq

Referenced by: This Knowledge Hub

Logseq is an Open Source outlining software

Last updated:

+ \ No newline at end of file diff --git a/garden/matrix/index.html b/garden/matrix/index.html index acb3d12d..14ce195a 100644 --- a/garden/matrix/index.html +++ b/garden/matrix/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Matrix

Referenced by: Cinny, Commune, Synapse

Matrix is a protocol for Decentralized messaging

Last updated:

- +

Matrix

Referenced by: Cinny, Commune, Synapse

Matrix is a protocol for Decentralized messaging

Last updated:

+ \ No newline at end of file diff --git a/garden/mbin/index.html b/garden/mbin/index.html index 510364b0..b0656b9b 100644 --- a/garden/mbin/index.html +++ b/garden/mbin/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Mbin

Referenced by: Incremental Social

Mbin is an Open Source Fediverse software

Can show both twitter-style posts and reddit-style threads

Last updated:

- +

Mbin

Referenced by: Incremental Social

Mbin is an Open Source Fediverse software

Can show both twitter-style posts and reddit-style threads

Last updated:

+ \ No newline at end of file diff --git a/garden/my-personal-website/index.html b/garden/my-personal-website/index.html index 1e369ac4..33e2dc3b 100644 --- a/garden/my-personal-website/index.html +++ b/garden/my-personal-website/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

My Personal Website

Referenced by: The Small Web

A Personal Websites for me, available at https://thepaperpilot.org

Last updated:

- +

My Personal Website

Referenced by: The Small Web

A Personal Websites for me, available at https://thepaperpilot.org

Last updated:

+ \ No newline at end of file diff --git a/garden/my-projects/index.html b/garden/my-projects/index.html index bcfa9f20..70df0f8d 100644 --- a/garden/my-projects/index.html +++ b/garden/my-projects/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

My Projects

Tagged by: Advent Incremental, Babble Buds, Capture the Citadel, Dice Armor, Game Dev Tree, Incremental Social, Kronos, Opti-Speech, Planar Pioneers, Profectus, V-ecs

I like making games and tools!

Games

Tools (and other non-games)

Last updated:

- +

My Projects

Tagged by: Advent Incremental, Babble Buds, Capture the Citadel, Dice Armor, Game Dev Tree, Incremental Social, Kronos, Opti-Speech, Planar Pioneers, Profectus, V-ecs

I like making games and tools!

Games

Tools (and other non-games)

Last updated:

+ \ No newline at end of file diff --git a/garden/nostr/index.html b/garden/nostr/index.html index 696140c9..dea31e08 100644 --- a/garden/nostr/index.html +++ b/garden/nostr/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Nostr

Referenced by: Fediverse

Tags: Decentralized

Nostr is a protocol for Federated Social Media

Last updated:

- +

Nostr

Referenced by: Fediverse

Tags: Decentralized

Nostr is a protocol for Federated Social Media

Last updated:

+ \ No newline at end of file diff --git a/garden/open-source/index.html b/garden/open-source/index.html index c366cadf..03c4f686 100644 --- a/garden/open-source/index.html +++ b/garden/open-source/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Open Source

Referenced by: Advent Incremental, Cinny, Commune, Dice Armor, Forgejo, Game Dev Tree, Logseq, Mbin, Planar Pioneers, Profectus, Synapse, Vitepress, Weird

Projects with the source code publicly accessible

Typically also grants users the right to modify the code and redistribute those changes, depending on the license

Last updated:

- +

Open Source

Referenced by: Advent Incremental, Cinny, Commune, Dice Armor, Forgejo, Game Dev Tree, Logseq, Mbin, Planar Pioneers, Profectus, Synapse, Vitepress, Weird

Projects with the source code publicly accessible

Typically also grants users the right to modify the code and redistribute those changes, depending on the license

Last updated:

+ \ No newline at end of file diff --git a/garden/opti-speech/index.html b/garden/opti-speech/index.html index e4d0513a..c261d6f5 100644 --- a/garden/opti-speech/index.html +++ b/garden/opti-speech/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Opti-Speech

Tags: My Projects

In college I continued development on the Opti-Speech project, originally built alongside the scientific paper Opti-speech: a real-time, 3d visual feedback system for speech training

The Original Project

The Optispeech project involves designing and testing a real-time tongue model that can be viewed in a transparent head while a subject talks — for the purposes of treating speech errors and teaching foreign language sounds. This work has been conducted in partnership with Vulintus and with support from the National Institutes of Health (NIH).

system-architecture-600.jpg

This video shows a talker with WAVE sensors placed on the tongue hitting a virtual target sphere located at the alveolar ridge. When an alveolar consonant is hit (e.g., /s/, /n/, /d/) the sphere changes color from red to green.

This video shows an American talker learning a novel sound not found in English. When the post-alveolar consonant is hit, the target sphere changes color from red to green. Here, the NDI WAVE system serves as input.

My Work

As the sole programmer at UT Dallas Speech Production Lab at the time, my changes involved updating to a more modern version of Unity, improving the interface, in general cleaning up tech debt so it can more easily support new features, and added support for additional EMA systems, namely the Carstens AG501.

new-interface.png

In addition, the program now includes documentation and unit tests to improve program stability and maintainability going forward.

documentation.png

unittests.png

Last updated:

- +

Opti-Speech

Tags: My Projects

In college I continued development on the Opti-Speech project, originally built alongside the scientific paper Opti-speech: a real-time, 3d visual feedback system for speech training

The Original Project

The Optispeech project involves designing and testing a real-time tongue model that can be viewed in a transparent head while a subject talks — for the purposes of treating speech errors and teaching foreign language sounds. This work has been conducted in partnership with Vulintus and with support from the National Institutes of Health (NIH).

system-architecture-600.jpg

This video shows a talker with WAVE sensors placed on the tongue hitting a virtual target sphere located at the alveolar ridge. When an alveolar consonant is hit (e.g., /s/, /n/, /d/) the sphere changes color from red to green.

This video shows an American talker learning a novel sound not found in English. When the post-alveolar consonant is hit, the target sphere changes color from red to green. Here, the NDI WAVE system serves as input.

My Work

As the sole programmer at UT Dallas Speech Production Lab at the time, my changes involved updating to a more modern version of Unity, improving the interface, in general cleaning up tech debt so it can more easily support new features, and added support for additional EMA systems, namely the Carstens AG501.

new-interface.png

In addition, the program now includes documentation and unit tests to improve program stability and maintainability going forward.

documentation.png

unittests.png

Last updated:

+ \ No newline at end of file diff --git a/garden/planar-pioneers/index.html b/garden/planar-pioneers/index.html index 8a7c8b56..d4040835 100644 --- a/garden/planar-pioneers/index.html +++ b/garden/planar-pioneers/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Planar Pioneers

Tags: My Projects, Profectus

Play it here!

An Open Source game designed to show off Profectus' dynamic layer system!

The TV Tropes page on this game mentions some of the cool things about this game

Last updated:

- +

Planar Pioneers

Tags: My Projects, Profectus

Play it here!

An Open Source game designed to show off Profectus' dynamic layer system!

The TV Tropes page on this game mentions some of the cool things about this game

Last updated:

+ \ No newline at end of file diff --git a/garden/profectus/index.html b/garden/profectus/index.html index 938563ed..334638fb 100644 --- a/garden/profectus/index.html +++ b/garden/profectus/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Profectus

Referenced by: Advent Incremental, Planar Pioneers

Tagged by: Advent Incremental, Kronos, Planar Pioneers

Tags: My Projects

Profectus is an Open Source game engine I made, loosely based on The Modding Tree by Acamaeda

Technically it's more of a template for making web games

It centers around using Vue's reactivity and is designed with the intent to not restrain developers into making games that only look or behave "one way"

Games made with Profectus:

  • Everything in this garden tagged with this page!
  • The entries to the Profectus Creation Jam
  • Primordia by Jacorb

Last updated:

- +

Profectus

Referenced by: Advent Incremental, Planar Pioneers

Tagged by: Advent Incremental, Kronos, Planar Pioneers

Tags: My Projects

Profectus is an Open Source game engine I made, loosely based on The Modding Tree by Acamaeda

Technically it's more of a template for making web games

It centers around using Vue's reactivity and is designed with the intent to not restrain developers into making games that only look or behave "one way"

Games made with Profectus:

  • Everything in this garden tagged with this page!
  • The entries to the Profectus Creation Jam
  • Primordia by Jacorb

Last updated:

+ \ No newline at end of file diff --git a/garden/social-media/index.html b/garden/social-media/index.html index 34ee3da7..00682096 100644 --- a/garden/social-media/index.html +++ b/garden/social-media/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Social Media

Referenced by: Commune, Fedi v2, Fediverse

Traditional social media

  • Not Decentralized
    • Can't choose your own rules, sorting methods, data queries, etc.
  • Overrun by scams and ads and influencers

Federated Social Media

  • Partially Decentralized
    • Self hosting is too hard for everyone to do
    • Still subject to instance's moderation, limitations, etc.
  • Users need to pick an instance, associating their identity with one specific group
    • People belong to many groups
    • The person is permanently associated with that one group
    • You have to pick before getting a "trial period" to ensure you actually like that group/instance

My take on an ideal social media Fedi v2

Last updated:

- +

Social Media

Referenced by: Commune, Fedi v2, Fediverse

Traditional social media

  • Not Decentralized
    • Can't choose your own rules, sorting methods, data queries, etc.
  • Overrun by scams and ads and influencers

Federated Social Media

  • Partially Decentralized
    • Self hosting is too hard for everyone to do
    • Still subject to instance's moderation, limitations, etc.
  • Users need to pick an instance, associating their identity with one specific group
    • People belong to many groups
    • The person is permanently associated with that one group
    • You have to pick before getting a "trial period" to ensure you actually like that group/instance

My take on an ideal social media Fedi v2

Last updated:

+ \ No newline at end of file diff --git a/garden/synapse/index.html b/garden/synapse/index.html index 0cafcb62..2e745184 100644 --- a/garden/synapse/index.html +++ b/garden/synapse/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Synapse

Referenced by: Incremental Social

Synapse is an Open Source server software for the Matrix protocol

Last updated:

- +

Synapse

Referenced by: Incremental Social

Synapse is an Open Source server software for the Matrix protocol

Last updated:

+ \ No newline at end of file diff --git a/garden/the-beginner-s-guide/index.html b/garden/the-beginner-s-guide/index.html index 48408b3b..b97ec0ea 100644 --- a/garden/the-beginner-s-guide/index.html +++ b/garden/the-beginner-s-guide/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

The Beginner's Guide

Tags: Davey Wreden

My favorite video game of all time, bar none. Created by Davey Wreden

The game broadly comments on the relationship between creators and consumers, and it can apply to all forms of art

  • Perhaps also an important commentary on parasocial relationships

Important analyses:

Last updated:

- +

The Beginner's Guide

Tags: Davey Wreden

My favorite video game of all time, bar none. Created by Davey Wreden

The game broadly comments on the relationship between creators and consumers, and it can apply to all forms of art

  • Perhaps also an important commentary on parasocial relationships

Important analyses:

Last updated:

+ \ No newline at end of file diff --git a/garden/the-cozy-web/index.html b/garden/the-cozy-web/index.html index 554fea22..a9d9e924 100644 --- a/garden/the-cozy-web/index.html +++ b/garden/the-cozy-web/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

The Cozy Web

Referenced by: Digital Gardens, The Small Web

The Cozy Web is an extension of the dark forest theory of the Internet

It refers to the part of the web that is not web indexable

This part of the web is known for not typically having ads or marketers

Popularized by this article written by Maggie Appleton, who has also written a lot about Digital Gardens

Last updated:

- +

The Cozy Web

Referenced by: Digital Gardens, The Small Web

The Cozy Web is an extension of the dark forest theory of the Internet

It refers to the part of the web that is not web indexable

This part of the web is known for not typically having ads or marketers

Popularized by this article written by Maggie Appleton, who has also written a lot about Digital Gardens

Last updated:

+ \ No newline at end of file diff --git a/garden/the-small-web/index.html b/garden/the-small-web/index.html index d7abe0d3..88a63b76 100644 --- a/garden/the-small-web/index.html +++ b/garden/the-small-web/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

The Small Web

Referenced by: This Knowledge Hub

Small personal websites created by individuals

  • My Personal Website
  • A callback to how the web was before social media, which homogenized content
  • These pages are diverse and typically won't have ads or marketers

The small web as a whole is Freeform

  • Individual sites may be Chronological still
  • Individual sites link between each other in ways similar to wikis

Browsing the small web

  • Follow Webrings or other links from known small websites
  • Marginalia is a search engine for non-commercial content with a "random" button and filters for the small web explicitly (amongst other useful filters!)

Building personal websites

IndieWeb contains various resources

  • Their building blocks are standards people can use to help the small web connect with each other consistently
  • They discourage the use of site builders or templates that end up making sites look too homogenized

Free hosting for static websites:

Streams

Microsub is a proposed protocol to support this

  • That way, people could use microsub clients to subscribe to multiple streams and get them in one feed
  • Effectively a Federated Social Media that works through personal websites
  • Announce new posts using WebSub

This also allows your personal website to be the one source of truth for your posted content

Multiple streams can be hosted by one site/person so people can subscribe to the kind of content they're interested in

How viable would it be to include chat messages in a stream as well?

  • Perhaps with Chat Glue you could link to specific branches I chatted in

Digital Gardens

These sites may be useful to occasionally check up on rather than get notifications from on every post/change

  • Although Garden-RSS could allow those who want to receive notifications to do so

Why people want the small web

There are tools these days that make making websites incredibly easy

  • Back in the day geocities was pretty complicated but a lot of people managed to make pages there
  • Neocities has an extensive page on Learn How to Make Websites!

Hosting can be expensive, but static websites are cheap

  • There are plenty of free options out there for hosting static websites
  • People are creative and love creating things

Last updated:

- +

The Small Web

Referenced by: This Knowledge Hub

Small personal websites created by individuals

  • My Personal Website
  • A callback to how the web was before social media, which homogenized content
  • These pages are diverse and typically won't have ads or marketers

The small web as a whole is Freeform

  • Individual sites may be Chronological still
  • Individual sites link between each other in ways similar to wikis

Browsing the small web

  • Follow Webrings or other links from known small websites
  • Marginalia is a search engine for non-commercial content with a "random" button and filters for the small web explicitly (amongst other useful filters!)

Building personal websites

IndieWeb contains various resources

  • Their building blocks are standards people can use to help the small web connect with each other consistently
  • They discourage the use of site builders or templates that end up making sites look too homogenized

Free hosting for static websites:

Streams

Microsub is a proposed protocol to support this

  • That way, people could use microsub clients to subscribe to multiple streams and get them in one feed
  • Effectively a Federated Social Media that works through personal websites
  • Announce new posts using WebSub

This also allows your personal website to be the one source of truth for your posted content

Multiple streams can be hosted by one site/person so people can subscribe to the kind of content they're interested in

How viable would it be to include chat messages in a stream as well?

  • Perhaps with Chat Glue you could link to specific branches I chatted in

Digital Gardens

These sites may be useful to occasionally check up on rather than get notifications from on every post/change

  • Although Garden-RSS could allow those who want to receive notifications to do so

Why people want the small web

There are tools these days that make making websites incredibly easy

  • Back in the day geocities was pretty complicated but a lot of people managed to make pages there
  • Neocities has an extensive page on Learn How to Make Websites!

Hosting can be expensive, but static websites are cheap

  • There are plenty of free options out there for hosting static websites
  • People are creative and love creating things

Last updated:

+ \ No newline at end of file diff --git a/garden/this-knowledge-hub/index.html b/garden/this-knowledge-hub/index.html index 9d1dba20..9e00cb3c 100644 --- a/garden/this-knowledge-hub/index.html +++ b/garden/this-knowledge-hub/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

This Knowledge Hub

Referenced by: Digital Gardens

This is my knowledge hub!

  • It's a Digital Garden collecting my thoughts in varying levels of completeness on basically anything I have interest in

This is not Wikipedia. My thoughts are biased and argumentative, but to the best of my ability based on fact and expertise

I'm writing on something essentially every day

  • Most of my pages are private, especially the journal pages
  • I'll only push updates to this site every so often (not an automatic process)
  • Until something like Garden-RSS exists, we'll have to make do with /changelog which gives a git diff summary for every pushed change, in the form of a The IndieWeb stream as well as an RSS feed

Written in Logseq and rendered with Vitepress

Suggested pages:

Last updated:

- +

This Knowledge Hub

Referenced by: Digital Gardens

This is my knowledge hub!

  • It's a Digital Garden collecting my thoughts in varying levels of completeness on basically anything I have interest in

This is not Wikipedia. My thoughts are biased and argumentative, but to the best of my ability based on fact and expertise

I'm writing on something essentially every day

  • Most of my pages are private, especially the journal pages
  • I'll only push updates to this site every so often (not an automatic process)
  • Until something like Garden-RSS exists, we'll have to make do with /changelog which gives a git diff summary for every pushed change, in the form of a The IndieWeb stream as well as an RSS feed

Written in Logseq and rendered with Vitepress

Suggested pages:

Last updated:

+ \ No newline at end of file diff --git a/garden/v-ecs/index.html b/garden/v-ecs/index.html index d8d7d96d..dbcc6e15 100644 --- a/garden/v-ecs/index.html +++ b/garden/v-ecs/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

V-ecs

Tags: My Projects

screenshot.png

V-ecs (pronounced "Vex") is a Vulkan-based engine I made for making highly moddable games and tools in Lua centered around the ECS design pattern and a work-stealing job system.

The engine works with "worlds", which are collections of systems and renderers. The engine comes with several worlds using systems and renderers I made, including a voxel world, an incremental game, and some test scenes. All of these include systems to render the fps as well as show a debug console by typing the grave key (`). The default world is a title screen that detects any worlds in the "worlds" folder and displays a button for each of them.

debug.png

The original plans were to eventually put it on the steam workshop so people could more easily share their creations amongst each other, but I never became happy enough with the performance of the engine - the parallelization of the lua code involved a lot of overhead that severely limited performance.

Instead, I made a couple of worlds by myself - an infinite procedurally generated voxel world, a simple incremental game, and a more complex incremental game I call "Sands of Time".

sandsoftime.png

The gameplay of Sands of Time was replicated in Kronos Chapter 2!

Last updated:

- +

V-ecs

Tags: My Projects

screenshot.png

V-ecs (pronounced "Vex") is a Vulkan-based engine I made for making highly moddable games and tools in Lua centered around the ECS design pattern and a work-stealing job system.

The engine works with "worlds", which are collections of systems and renderers. The engine comes with several worlds using systems and renderers I made, including a voxel world, an incremental game, and some test scenes. All of these include systems to render the fps as well as show a debug console by typing the grave key (`). The default world is a title screen that detects any worlds in the "worlds" folder and displays a button for each of them.

debug.png

The original plans were to eventually put it on the steam workshop so people could more easily share their creations amongst each other, but I never became happy enough with the performance of the engine - the parallelization of the lua code involved a lot of overhead that severely limited performance.

Instead, I made a couple of worlds by myself - an infinite procedurally generated voxel world, a simple incremental game, and a more complex incremental game I call "Sands of Time".

sandsoftime.png

The gameplay of Sands of Time was replicated in Kronos Chapter 2!

Last updated:

+ \ No newline at end of file diff --git a/garden/vitepress/index.html b/garden/vitepress/index.html index d1df7227..ebdb014a 100644 --- a/garden/vitepress/index.html +++ b/garden/vitepress/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Vitepress

Referenced by: This Knowledge Hub

Vitepress is an Open Source static site generator

Last updated:

- +

Vitepress

Referenced by: This Knowledge Hub

Vitepress is an Open Source static site generator

Last updated:

+ \ No newline at end of file diff --git a/garden/wanderstop/index.html b/garden/wanderstop/index.html index f7cda7e0..8c1a5b87 100644 --- a/garden/wanderstop/index.html +++ b/garden/wanderstop/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Wanderstop

Tags: Davey Wreden

Wanderstop is the first game by Ivy Road. It's a narrative focused cozy game

Last updated:

- +

Wanderstop

Tags: Davey Wreden

Wanderstop is the first game by Ivy Road. It's a narrative focused cozy game

Last updated:

+ \ No newline at end of file diff --git a/garden/webrings/index.html b/garden/webrings/index.html index c31e74e8..8e6c6184 100644 --- a/garden/webrings/index.html +++ b/garden/webrings/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Webrings

Referenced by: The Small Web

A collection of Personal Websites that link to each other

  • These websites are all endorsing each other
  • They form a network of related sites readers might be interested in
  • Built on human trust rather than algorithms

Commune has a vision for modern webrings

  • Have communities set up matrix spaces for chatting
  • Multiple spaces can contain the same room
  • Related communities can share a room about a relevant topic
    • e.g. a bunch of game development libraries shared a "Game Design" room
  • This allows smaller communities to grow from cross-pollinating with other related communities
  • Could Incremental Social host a shared "Incremental Games" room?
    • How to bridge one channel to multiple discord servers, since that's where most incremental games communities are
    • Would this be appealing to already large communities?
    • Would this be overwhelming to smaller communities?
    • Who would moderate?

Last updated:

- +

Webrings

Referenced by: The Small Web

A collection of Personal Websites that link to each other

  • These websites are all endorsing each other
  • They form a network of related sites readers might be interested in
  • Built on human trust rather than algorithms

Commune has a vision for modern webrings

  • Have communities set up matrix spaces for chatting
  • Multiple spaces can contain the same room
  • Related communities can share a room about a relevant topic
    • e.g. a bunch of game development libraries shared a "Game Design" room
  • This allows smaller communities to grow from cross-pollinating with other related communities
  • Could Incremental Social host a shared "Incremental Games" room?
    • How to bridge one channel to multiple discord servers, since that's where most incremental games communities are
    • Would this be appealing to already large communities?
    • Would this be overwhelming to smaller communities?
    • Who would moderate?

Last updated:

+ \ No newline at end of file diff --git a/garden/weird/index.html b/garden/weird/index.html index 38bb97a2..f450d5fa 100644 --- a/garden/weird/index.html +++ b/garden/weird/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Weird

Referenced by: Commune, Fedi v2, The Small Web

Weird is an Open Source project by the Commune team currently in development

Last updated:

- +

Weird

Referenced by: Commune, Fedi v2, The Small Web

Weird is an Open Source project by the Commune team currently in development

Last updated:

+ \ No newline at end of file diff --git a/guide-to-incrementals/design/criticism/index.html b/guide-to-incrementals/design/criticism/index.html index 4d8c8bde..e16be448 100644 --- a/guide-to-incrementals/design/criticism/index.html +++ b/guide-to-incrementals/design/criticism/index.html @@ -8,10 +8,10 @@ - + - + @@ -307,7 +307,7 @@

Guide to Incrementals/Navigating Criticism

Developing games is fun and exciting and teaches a lot of wonderful skills - I enthusiastically encourage anyone with an interest in game development to try it out - and incremental games are a wonderful way to get started. However, there are many challenges young and inexperienced developers have to face, and I think the hardest one - harder than coding, debugging, balancing, etc. - is handling criticism. When you put your heart and soul into a game it is natural to feel very vulnerable. While I think there's a lot communities can do to ensure they're welcoming, positive and constructive with their criticisms, inevitably you will eventually read some, and potentially a lot, of comments that can deeply affect you. No one is immune to this, from young incremental game developers to the largest content creators you can think of. That's why it's important to be able to process and navigate criticism, because ultimately collecting feedback is essential to the journey to becoming a better developer. On this page, we'll explore how to embrace criticism, grow from it, and continue to post your games publicly with confidence.

Reading Feedback

Game development is a skill that takes time and practice to get truly great at. Criticism and other constructive feedback are vital to continually improving. It's useful to look at the criticism as solely a tool for improving this game and future games - that is to say, it should never be used against you as a person. Insults towards the developer(s) themselves are never okay and should not be allowed within whatever community you're sharing your works in. If you do come across a comment you interpret as an attack upon your person, you should report it. For other negative comments, try not to internalize them; instead, focus on improving the game. By distancing your own identity from your work emotionally, you can better analyze the game and use the feedback to your advantage.

Not all feedback is made equal, and you don't need to feel compelled to read and obey every piece of feedback you receive. Learn to distinguish between constructive feedback and unhelpful comments. Constructive feedback typically offers specific suggestions for improvement, while unhelpful comments are often vague or hurtful. Prioritize the former and disregard the latter. That said, most feedback you get will not be from game developers, so take specific suggestions with a grain of salt. Determine the actual problem they're experiencing, and design what you believe the best solution to that problem would be, regardless if that's the specific solution the player asked for. And keep in mind, due to different player preferences you'll never satisfy everyone, and you don't need to. Ultimately if even just you find the game fun, then that's a success.

Seeking Feedback

When deciding where to share your game, consider the type of players you anticipate getting, and the kind of feedback you can anticipate receiving. Different communities will have different levels of support for learning developers, and certain communities may prefer certain types of games or mechanics. It's important to get a diverse set of feedback focused on players you think will enjoy the specific game you're making.

Collecting feedback from other game developers is incredibly helpful. They've trained themselves to recognize good and bad game design and how to articulate the differences, and from my experience are much more likely to leave positive and constructive comments since they've been in your shoes before! They understand the struggles and can offer guidance and emotional support.

Responding to Feedback

Negative feedback can naturally feel like an attack, and it's okay to get angry. However, lashing back is never the appropriate response. It's best to cool off IRL, and keep in mind all the positive comments you've received. There's a concept in Psychology called negative bias that explains how negative feedback tends to stick with us much more prominently than positive feedback, so it's useful to regularly remind yourself of all the positive feedback you've received. Celebrate your successes, no matter how small they may seem - getting a game to a state you can publicly share it with people is an accomplishment in and of itself!

Remember your passion and your initial reasons for getting into game development. The journey will have its ups and downs, but staying true to your vision and passion will keep you motivated.

- + \ No newline at end of file diff --git a/guide-to-incrementals/index.html b/guide-to-incrementals/index.html index 6580256e..b29429a9 100644 --- a/guide-to-incrementals/index.html +++ b/guide-to-incrementals/index.html @@ -8,10 +8,10 @@ - + - + @@ -307,7 +307,7 @@

Guide to Incrementals

This is a comprehensive guide to Incremental Games, a genre of video games. It will explore defining the genre, why it's appealing, and how to design and build your own incremental game. Along the way will be interactive examples, snippets from other creators, and relevant material to contextualize everything.

Note: This is an incomplete document. I want to keep adding opinions and opposing views from other incremental games developers, and add interactive examples to illustrate various points regarding game design and balancing. Consider this a living document - and see the changelog at the end.

Note: This was made before my switch to a digital garden, and is written as prose. Hope you don't mind!

Why am I making this?

That's a good question! What authority do I have to be making this guide? I haven't made the best incremental games, nor the most incremental games, certainly not the most popular ones either. But I do have some formal education in game development, know a lot of incremental game devs (as well as other game devs), and have a passionate interest in ludology, classifying genres, etc. I've also made a couple of incremental games) myself.

If you have any additional questions about my credentials or anything on this site, feel free to reach out!

Ludology

Making an Incremental

- + \ No newline at end of file diff --git a/guide-to-incrementals/ludology/appeal-developers/index.html b/guide-to-incrementals/ludology/appeal-developers/index.html index 4c2f655f..7193fe50 100644 --- a/guide-to-incrementals/ludology/appeal-developers/index.html +++ b/guide-to-incrementals/ludology/appeal-developers/index.html @@ -8,10 +8,10 @@ - + - + @@ -307,7 +307,7 @@

Guide to Incrementals/Appeal to Developers

There are a lot of developers in the incremental games community - the genre seems to draw them in, and convert a lot of players into developers. Let's explore the reasons why this genre appeals to developers.

Incrementals are Easy to Make

Compared to other genres, incrementals have quite low expectations. You don't need to make fancy art, or music, or lay things out nicely. If you can make a button and learn the few lines of code necessary to make a number go up, you can make an incremental. This low threshold makes the genre perfect for those who are actively learning to code and haven't developed any gamedev-related skills yet.

Additionally, unlike other genres incrementals are uniquely easy to implement in a normal web page - no need to worry about rendering sprites, moving them around, implementing physics, etc. New developers can just use HTML to add a button, and the game is now available in your browser. You don't need to choose an engine, have admin privileges, or hell for the dedicated you don't even need a computer - there are tools for web development that run in the browser itself, so you can technically use your phone if that's all you have.

Javascript is a perfectly viable language for making web games, whereas other genres are typically going to require using other more difficult languages to learn. There are countless javascript tutorials that start from 0 knowledge of programming, making it incredibly accessible to beginners.

Players are Easy to Find

Once you've finished your game and uploaded it on github pages or itch or just copied the link if you're using glitch or replit (all of which are easy to do), anyone can now play the game in their browser. This low barrier to entry has shown tremendous success in getting completely unknown developers to have thousands of plays.

The incremental games community, which mostly centers around r/incremental_games, is always looking for new games and tends to flood any new ones posted with initial players.

Having your games be played can be incredibly motivating, and the community makes it quite clear that you can expect players to play your game. These communities - both for incremental games in general as well as game-specific communities - tend to be very developer friendly as well. A lot of the developers know each other, and welcome new developers with open arms, often with dedicated channels for programming help and discussions.

Monetization

I'd like to clarify that everything I've said above mainly applies to web-based incrementals. Incremental games are also incredibly popular on mobile, but with a much different culture and community. Many mobile gamers will still participate in the web-focused community for the culture. This web-focused community has a culture that has been criticized for being "anti-monetization". Ads, IAPs, and similar forms of monetization are often criticized, mainly due to the abundance of completely non-monetized games available from hobbyist developers. There are exceptions, like paid games often being considered fine, like Increlution or Stuck in Time, or donation ware games like kittens game, but even popular games that have IAP see some level of regular criticism, like NGU Idle, Idle Skilling, or Idle Pins. A large part of this can be explained by the community being hyper-aware of the addictive) nature of this genre and its susceptibility to exploiting players.

On mobile, however, monetization is the norm and expected. If an incremental game is available on mobile, it almost certainly will be monetized, and mobile players are aware and accepting of that. Mobile incremental games, due to their addictive nature, tend to make a lot of money. It's very lucrative, and therefore these games are quite abundant on mobile storefronts.

- + \ No newline at end of file diff --git a/guide-to-incrementals/ludology/appeal-gamers/index.html b/guide-to-incrementals/ludology/appeal-gamers/index.html index 2a54f2c3..63dc12b9 100644 --- a/guide-to-incrementals/ludology/appeal-gamers/index.html +++ b/guide-to-incrementals/ludology/appeal-gamers/index.html @@ -8,10 +8,10 @@ - + - + @@ -307,7 +307,7 @@

Guide to Incrementals/Appeal to Players

This is something that has been discussed and analyzed by many people, and to some extent, I feel like everything that can be said on the topic already has. However, a lot of these analyses are from the perspective of those with not as much experience and involvement within the genre as I'd argue would be necessary for a fully contextualized answer. I recently watched a video about Vampire Survivors, which has since been taken down due to drawing negative attention, which made me think about some interesting arguments about what games are, and what makes them good. The video's argument that "Vampire Survivors is not a video game" mirrors a claim by the developer of Cookie Clicker that his games are "non-games". Using Vampire Survivors and the video made on it as a framework, I'll be answering why incremental games appeal to players. Since the video has been taken down, I'll do my best to contextualize and generalize the arguments of the video without requiring the reader to watch it. For what it's worth, while I disagreed with the video I actually liked a lot of the way it went about thinking about games, and I consider this a continuation of that discussion.

Numbers Going Up

This is a very common response to why people enjoy incremental games, although it's not one I find compels me personally, and I suspect it might be a stand-in for progression) or Guide to Incrementals/What is Content?. But reportedly, some people do just like seeing big numbers. I must reiterate I suspect the actual cause is seeing big numbers in context though - if you start at 1e1000 of a currency and get to 1e1001, that isn't going to feel as satisfying as going from 1e10 to 1e100, and in any case, I don't think a button that just adds a zero to your number will feel quite satisfying - I believe its the sense of having made progress, and comparing where you are to where you started and feeling like you've earned your way here that is enjoyable.

Progression

Vampire Survivors can be argued to have a comparatively low depth to its combat compared to many other games. I'd argue it has sufficient depth and more than someone might expect who has only played the game for a short while, but it still definitely gets beat out by many other combat-focused games. Instead, a lot of the progression in Vampire Survivors comes from a meta-progression system by which base stats are increased by spending a currency that persists between runs. While it is technically possible to win without this meta-progression system, and indeed in many roguelikes players like to challenge themselves by beating the game without any meta-progression, the criticism can be made that meta-progression de-emphasizes player skill by making it less important to have to beat the game. Certainly, in incremental games, it is often literally impossible to complete a game without taking advantage of the meta-progression systems. I'd argue this does not detract from the game, however, and is actually a part of what makes incremental games, and roguelikes, enjoyable to many players: meta-progression augments the increases in skill the player is naturally gaining as they play. In effect, it's not replacing the skill increase, but exaggerating it to make it feel more real to the player.

Note: There is also a lot of progression from exploring the mechanics and discovering synergies, unlocking new weapons or playable characters, etc. That just isn't as relevant to this discussion, but it does make up a lot of the appeal of the game.

Effortlessness

Incremental games are so easy, a lot of them even have you progress while you're not playing! Part of the appeal is being able to feel like you're making progress while doing something actually productive - multitasking, in a way. In this sense, the game is more of a fidget toy - not something to think hard about and play actively, but something to click a few buttons every so often while you're paying attention to a lecture or studying or working. Of course, not all incremental games lend themselves to being played this way - it's specifically "idle" games that work like this. These are games that take an incredibly long amount of time to see all the content, stretching it as thin as possible, but they aren't expecting you to be sitting at your device playing it the entire time. They expect you to leave and come back later to make a bit of progress and repeat the cycle.

If you look at the higher-level play of most games, you'll see them perform difficult feats with ease and speed. They'll achieve a "flow state" that takes all their knowledge and experience of the game and uses it to play the game as instinctively as possible. It's incredible to watch things like Slay the Spire speed runs or competitive DDR-likes. I'd argue the goal of a lot of games with a competitive scene is to get so good that the game becomes effortless. In that sense, a game that allows you to reach that point earlier isn't any less legitimate, but rather lowers the barrier to entry by allowing more people to get "really good" at the game. And to be clear, Vampire Survivors and (most) incremental games aren't trivially easy - they, and to an extent, every game will have some level of learning and improvement over time.

Addiction

A lot of these reasons for why incremental games appeal may have reminded you of why gambling appeals to people, particularly those prone to addiction. Indeed, incremental games are quite often criticized for their similarity to a skinner box. Some have gone as far as to say incremental games as a genre are commenting that all games are skinner boxes). The argument goes that some games are not fun, but rather condition players into continuing to play without actually getting anything from the experience. When tied to real-world money this is seen as predatory, and to a lesser extent, even free games may be feeding the addictive sides of people and making them more prone to seek out gambling or micro-transaction heavy games.

While incremental games can be fun and even healthy in certain contexts, they can exacerbate video game addiction more than other genres. If you feel like playing incremental games is taking priority over other things in your life, or manipulating your sleep schedule, it may be prudent to seek help. See r/StopGaming for resources.

Since incremental games are often built on extrinsic motivations in the form of progression systems, it's hard to argue whether players continue to play because they are enjoying the gameplay, or if they are just conditioned to keep doing it because the game keeps rewarding them. Unfortunately, it can often feel like it's the latter, as there isn't typically anything compelling about the "gameplay" of clicking a button and waiting. There may be a significant overlap between those who enjoy incremental games and those who are most prone to addiction, and there are often posts on r/incremental_games about someone either struggling with or overcoming video game addiction.

Strategy

Incremental games could be considered a subset of strategy games), and inherit the appeals of strategy games. This includes the appeal of feeling like you've found a good solution to a puzzle, or that you're learning more about the game and are improving at making decisions within it. This applies to Vampire Survivors specifically, where you're learning about evolutions and synergies and what kinds of enemies can spawn under what conditions, and how best to handle them.

Note that strategy games are not all the same difficulty, as well. Vampire Survivors is still easier to play than Starcraft 2, and Cookie Clicker is probably somewhere in between (once you progress sufficiently). Vampire Survivors being so successful may indicate that "easier" strategies may have their separate appeal to harder strategy games - players like to feel smart and that they figured the game out and have optimized or mastered it, and the game being easier doesn't detract from that sense of accomplishment as much as it allows more and more users to be able to reach the point where they gain that sense.

Avoiding Staleness

Incremental games tend to have "paradigm shifts", where the gameplay changes in a meaningful way at various times throughout the progression of the game. These upset and change the gameplay loop, which helps keep them from stagnating. This constant "freshness" to the gameplay can keep players engaged for longer, compared to a game with a repetitive and static gameplay loop.

Good Game Design

Incremental games tend to show their game design "plainly", so it's more readily apparent if a game has good game design while playing, even if you're not looking for it. While different players have different preferences and might enjoy different types of games more than others, there are underlying good and bad game design principles that players will notice the effects of. To be clear, this isn't talking about stuff like big numbers being enjoyable, where I can comfortably agree to disagree with other players. They don't intrinsically make my experience better, but I'm aware of those for whom it does and I won't argue against their feelings. However, the game designer in me does feel like there are some extremely clear-cut examples of good and bad game design philosophies.

Let's start by giving an example of a mechanic I think can be easily and strongly argued is good game design. There are of course many examples, but a personal favorite of mine is how DOOM encourages aggressive gameplay by linking health drops to melee attacks. It has an intended experience it's trying to give the player - immersing themselves as DOOM guy, who would not hide behind cover when low on health - and this mechanic does a great job at encouraging and effectively teaching players to behave properly. This is in sharp contrast to shooters like Call of Duty, which have you regen health passively, encouraging players to hide behind cover and wait after getting hit. Note that I'm not arguing CoD is poorly designed, as the games have different intended experiences. I'm specifically praising DOOM for having a mechanic that does a good job at ensuring the player has that intended experience.

To contrast with an example I think is bad game design, let's talk about shields in souls-likes. This is a bit of a famous example, and I highly recommend this video essay which spends quite a good bit of time on this topic. Essentially, the argument boils down to players of earlier games in the souls games using shields too much - playing slowly, conservatively, and ultimately having less fun. Players wanted to feel safe, so they ended up playing in a way that ruined the experience for them. The developers solved this by removing shields, apart from an intentionally bad one effectively mocking the playstyle, and it did its job at getting players to play more aggressively, and often have more fun.

To bring the conversation back to incrementals, I'm incredibly opinionated on what makes a good incremental game, which I'll discuss in the game design section. Suffice it to say, incremental games rely more on good game design than other genres, due to not having much to distract from bad game design. This helps (although imperfectly - gamers are a bit too tolerant of bad game design!) well-designed games rise to the top within the genre.

Artistic Merit

The Vampire Survivors video made me think back to the old arguments about whether games are art, and whether they ought to be. The video seems preoccupied with attaching value to games solely based on their mechanics and the depth thereof, to the point of arguing Vampire Survivors is a waste of time due to its lack of depth. However, even setting aside the fact that if players are having fun then it's not time wasted, I think games can have artistic merit that supersedes the necessity of having (any / engaging / "deep") gameplay. I think the consensus online is that games are definitively art, although I could see the argument that some genres, like incremental games, might be a bit in a grey area. Let's talk about Vampire Survivors first though - It has a story to tell, with lore and many characters, that drive the player and encourage them to continue exploring the game and discovering things within it. Like any walking simulator, it is no less legitimate of a game or the "art" label because of any lack perceived lack of depth. For what it's worth, most art can be consumed with more ease than VS - any painting, movie, sculpture, etc.

A lot of incrementals have a narrative context that can similarly qualify them as art. Cookie Clicker is, as has been pointed out numerous times before, commenting on excess and increasing production beyond any reasonable limits - devolving into increasing production for its own sake. Indeed, a lot of incremental games are written to comment upon various concepts like capitalism or tropes in games, as discussed when defining Incrementals). However, I'd like to argue most incremental games are still art, even without any narrative context. "Art" as a concept is pretty nebulous already, but I personally like those who define it as an act of expression more than any physical result. The creator and the context within which they created the art, and any meaning they put into it, are all relevant and a part of the art itself. Most incremental games have artistic merit from things like why the creator made it, why they chose to make it an incremental game, and why they made any particular design decision. Hell, even if you play through an entire incremental game without a single thought or feeling, that very fact it elicited nothing can itself be artistic merit!

I'm not an art major, and I may be taking a somewhat extreme take on what is art and what has artistic merit, but I'd argue the overall point stands that games, and incremental games specifically, can have artistic merit, which appeals to many gamers.

- + \ No newline at end of file diff --git a/guide-to-incrementals/ludology/content/index.html b/guide-to-incrementals/ludology/content/index.html index a97231e0..c6ef70dc 100644 --- a/guide-to-incrementals/ludology/content/index.html +++ b/guide-to-incrementals/ludology/content/index.html @@ -8,10 +8,10 @@ - + - + @@ -307,7 +307,7 @@

Guide to Incrementals/What is Content?

If you've been in the incremental games community for any amount of time, you'll quickly find the number one thing players want is content. They want as much of it as possible! The most popular incremental games have tons of content, so they just keep stretching on and on and on, introducing mechanic after mechanic, and players love it. In fact, players seem to value the amount of content over the quality of any specific content. However, there's a bit of a lack of understanding concerning what content is, and I'd like to explore what counts as content, and how we measure it. As a baseline definition, I think "content" can just be described as the parts of the game that engage the player, but to truly understand it we need to contextualize what that means and how it affects the gameplay experience.

To clarify the purpose of this page, my goal is not to get (too) nitpicky or to attack games with "low content". There's nothing wrong with short / low-content games - I'm quite a big fan of those games myself! This is mostly targeted toward those who ask for content and settle for "long" games, and those who want to provide content but want to make sure they're not just artificially inflating the game. Ultimately, I suppose the goal is to just reduce the amount of artificially inflated content for the sake of having a "longer" game.

Interaction

I think it should be a fairly non-controversial opinion that time spent solely waiting should not count towards content. That is not including the time reading various effects or making decisions in your head, but rather time spent waiting for a condition to be met so you can re-engage with the game.

That is not to say games should necessarily try to minimize this time. Plenty of games lead towards more infrequent interaction and still get popular. In fact, these games appeal to many gamers who want to have something to check up on in between bursts of working on some other activity. These games seem to have fallen slightly out of fashion amongst modern incremental games, but they're still fully valid. The point I'm trying to make here is just that this time is not content. As an extreme example, a game with no interactions and just a counter that goes up every second could safely be said to have 0 content beyond the time it takes to understand what's going on. If it has a list of "goals" to hit, then the time understanding those goals and a short time after achieving each one could be considered content, but not the idle times in between.

Let's take a look at the opposite end of the spectrum - interaction that is so frequent as to become mindless. This is any mechanic where you need to spam-click something to progress. This may be a more controversial take, but I do not believe this constitutes content either. It does not engage the player, because each consecutive click blends together and they do not individually change the gameplay experience. That is to say, a single click and 100 clicks are not meaningfully different in terms of engaging the player. I'd go as far as to say clicking 100 times would be actively worse, as it's artificially delaying the next piece of actual content, alongside the issues of accessibility and potentially causing RSI.

Repeatable Purchases

Imagine an entity in a game that you can purchase multiple times, each time it performs the same thing but for a higher cost. These are incredibly common, from the buildings in cookie clicker to the units in swarm sim to the IP and EP multipliers in antimatter dimensions. However, how much content is each specific purchase? Is it content beyond the first purchase? Does it have diminishing returns? What if you are oscillating between two different repeatable purchases? How much content is lost when you automate) away a repeatable purchase?

I don't want to take too harsh a stance against repeatable purchases. They're useful tools and can be used in a myriad of interesting ways. I feel they do become "stale" or less meaningful content over time, and this happens exponentially quickly the more frequently it can be purchased. A classic example that I believe goes too far is the IP/EP multipliers in Antimatter Dimensions. I would go as far as to say they are a chore and do not provide any meaningful content after you've bought them a couple of times. It's a method for inflating numbers (effectively making every OOM a 5x step instead of 10x), that punishes the player progression-wise whenever they forget to max it again, and eventually gets automated away as a reward to the player for making enough progress.

Just to voice the other side of this argument, Acamaeda defended the IP multiplier as giving the player a "good" upgrade every OOM. I can understand that to a point and need to clarify I'm mainly criticizing IP/EP multipliers after they've been introduced for a while. In fact, I would defend the multipliers for a short while after they're introduced using the same logic I would use to defend normal dimensions as repeatable purchases, at least pre-infinity. There's "content" to be had in looking at what dimensions will become affordable next, and then choosing which to buy amongst those. The IP/EP multipliers, early into infinity or eternity respectively, provide another option that gets put into that mental queue of things to buy with each OOM reached - although the optimal order is often quite trivial and not particularly engaging.

The IP/EP multipliers are not the only repeatable purchase in antimatter dimensions I take offense to. The time dimensions are also a series of repeatable purchases, that are all so similar and static that it doesn't take long before you never need to put any thought into buying them, how much you're buying at once, or the order you buy them in - you just press max all and move on. The entire tab could've been just the max all button and it would not have made a difference beyond the start of the eternity layer. The normal dimensions technically have this problem as well, but since you're constantly getting antimatter the order feels like it has a larger impact and it's more meaningful content, right up until they're automated away. Infinity dimensions are a compromise between the two, so I'm highlighting time dimensions here as the most egregious.

Following Instructions

We're getting more and more controversial as we go along! Let's talk about how linear content is not content now (in some circumstances). A trend in incremental games is adding difficulty by adding a web of effects that abstract the true change you can expect from any specific purchase or decision you make. If a game is both linear and sufficiently abstracts the effect of player decisions, then the player will no longer be engaging with the content - they'll simply be clicking on things as they become available. This isn't necessarily a bad thing, as plenty of players don't mind this style of gameplay, but I'd argue once you reach a point where players don't bother reading the effects, those interactions are no longer truly content. Note that unlike the previous qualifiers mentioned, this qualifier is based on the player, and therefore subjective. In effect, it's a spectrum where the more complicated the web of effects becomes, the more likely it is to disengage the player.

This over-complicatedness leading to disengaging the player can also happen from non-linear gameplay. If the web of effects becomes sufficiently complicated and finding the optimal progression route too time-consuming to discover, players will seek out guides from other players who've completed the game. The second they do this, the game effectively becomes linearly following the instructions of the guide and all the above criticisms apply. Similarly to as before, though, this is a spectrum and not everyone will seek out a guide at the same level of difficulty.

Automation

Automation is a staple of the genre, but it has certain implications for the design of the game. Why, when new content is introduced, must the older content be automated away - why is it a chore and it feels rewarding to not have to do it again? Why does the new mechanic have such appeal if we know it too will just be automated away later on, and we'll be happy when that happens? It honestly begs the question of why this framework of introducing content and automating the old content is even enjoyable - and nearly nonexistent in other genres. You're not going to reach a point in a platformer game where they just automate the jumping part - that's the core mechanic! Instead, platformers either add new mechanics that build on the core mechanic or at least re-contextualize the core mechanic. However, in incremental games new content very frequently means replacing older content, as opposed to augmenting it.

Admittedly, the above paragraph ignores the obvious answer that separates incremental games in this regard. These mechanics become chores as their frequency increases. The frequency increases to give a sense of progression, and automation is seen as a reward because it now manages what was becoming unmanageable. The new content then comes in and continues the loop to give a stronger sense of progression. That's all good and a fine justification for automating content instead of building upon the base mechanic. It's also much easier to design, as each layer essentially lets you start over instead of needing to think of ideas that conform to the original core mechanic.

So, what's the problem? Even if this trend is justified and easy to implement, there are some other effects it has on the game design. First off, and this is probably a neutral point, incremental games with this cycle of replacing old mechanics with new ones trend towards more and more abstract and further away from any narrative throughline as they add layers. There are only so many justifications for resetting progress, so if a game wants to have several of these layers they're inevitably going to become generic or increasingly loosely associated with the original content. It's most unfortunate, in my opinion when an interesting or innovative core mechanic gets fully automated once a generic "prestige" layer is unlocked.

A recent example is Really Grass Cutting Incremental, an incremental game about cutting grass (although I'm really criticizing the Roblox game it's based on). Except, it doesn't continue to be about cutting grass. After you buy enough upgrades to increase your grass cutting and level up sufficiently you "prestige", an abstract term that in this case means you reset all your progress to get some currency to buy upgrades that do the same things as the original upgrades, but these won't reset on future prestiges. You'll eventually be able to "crystallize", which means you reset all your progress to get some currency to buy upgrades that do the same things as the original upgrades (and a couple of new ones) and won't reset on future crystallizes. Fine. You'll progress a bit, complete some challenges, and finally get to... grasshop? Grasshopping is this mechanic where you reset all your progress to get some resource that isn't for buying upgrades - this time you just unlock different modifiers on everything based on their amount. You may have gotten the point by now, but there are also "steelie" resets which give you steel for some reason, before unlocking a factory with various machines - none of which are directly tied to cutting grass, and start gathering things like oil and reset for rocket parts and reset to go to space and so on and so on. Throughout all of this there is absolutely no narrative justification or throughline for the direction the game is going, or why cutting grass is still relevant when we're collecting things like rocket parts. I may be going a little hard on GCI, but it is far from alone.

Tips for Developers

If you're a developer, by this point you should have a pretty decent idea of how to create "true" content in your game. Here are some other specific tips I'd suggest:

An upgrade that simply unlocks another upgrade trivially isn't content. However, many games have an upgrade that just unlocks a feature, which then has a wait or other requirements before it can be used. Try to make sure when you unlock a feature, there is immediately something to do with the feature - for example, perhaps give them a small amount of the new currency it unlocks, if applicable.

If you don't have a large web of effects, and can definitively say the impact of a purchase is to multiply the gain of the cost currency by N, and the next purchase costs N times the amount of that same currency, then this purchase effectively made no difference and it may have made more sense to just go directly to the next upgrade. That said, having effects based on things like the number of purchases made will quickly invalidate this tip.

- + \ No newline at end of file diff --git a/guide-to-incrementals/ludology/definition/index.html b/guide-to-incrementals/ludology/definition/index.html index fe7e7820..36fa3f84 100644 --- a/guide-to-incrementals/ludology/definition/index.html +++ b/guide-to-incrementals/ludology/definition/index.html @@ -8,10 +8,10 @@ - + - + @@ -307,7 +307,7 @@

Guide to Incrementals/Defining the Genre

Video games are placed into genres for a variety of reasons. They can give a mental shorthand to set the player's expectations up, they can help a game market itself by its similarities to other, already popular games, and honestly, people just love categorization for its own sake. For this guide, it's important to define the genre so it is clear what games it's even talking about.

This poses a problem. "Incremental" is a horribly vague way to define games. Most games have numbers going up in some form or another. We need a more specific definition - similar to how "strategy" can't just mean any game with any amount of strategy because that would be most games. What specifically differentiates incremental games from the rest?

"Incremental" implies it's a genre defined by a game mechanic, but all those game mechanics it could imply exist in many other games. Having a skill tree or upgrades doesn't make you incremental, and if a reset mechanic is all it takes then every roguelite would be an incremental as well. So clearly there's more to it than that - what makes an incremental an incremental?

I'd like to go over a couple of popular suggestions I've seen on defining the genre here. I have my personal preferences and will state them here, but I don't think there's a truly perfect answer here.

Disclaimer: I mostly play incremental games on my computer, and my definitions will be heavily biased towards the games I'm familiar with.

Incrementals vs Idlers vs Clickers

Oftentimes people refer to this genre as idle games and/or clicker games. You'll even find a trend of oxymoronic game titles that contain both terms. "Incremental games" is the umbrella term both those terms fall under. However, I'd like to argue that not only is it better to just use the term "incremental games", but calling them "idle games" or "clicker games" is wrong. Almost universally, these terms are used interchangeably to refer to the same kind of game, where you start the game click spamming and eventually automate the process. Frankly, that kind of game deserves neither title, and the genre of incremental games has trended away from ever requiring click spamming, as it's a bad mechanic, anyways.

While these games do span a spectrum of how active it requires you to be, and sorting games by that metric can be useful for those looking for a particular experience, the borders of when an incremental game counts as an "idler" is too blurry for the term to be useful. "Incremental games" may not be a great descriptive term for the genre (hence this many thousands of words long page on defining what the genre even is), but it's strictly better than calling them "idler" or "clicker" games. This guide will always use the term "incremental games" unless quoting someone else, as it is the term you typically see on all modern games in the genre.

Incrementals as Parodies

Let's start with one of the most interesting definitions of incremental games. Incremental games appear to be distilled versions of games or genres, "revealing" the naked game design at the core of these games or genres not unlike how parodies comment upon their source material.

To understand what that means, think of how a casino uses skinner boxes to emotionally manipulate its customers to keep playing, but "dressing" up the skinner box with tons of stimuli to hide that ultimately the goal is to condition you into coming back compulsively. The idea that incremental games are parodies means taking the stance that at some level all games are similarly manipulating you, giving dopamine rewards in a way that manipulates you to keep playing while not necessarily giving you any value or fulfillment. Incremental games, then, are any games that plainly display the skinner box, and the manipulative core of the game, at the forefront of the experience.

While incremental games can be fun and even healthy in certain contexts, they can exacerbate video game addiction more than other genres. If you feel like playing incremental games is taking priority over other things in your life, or manipulating your sleep schedule, it may be prudent to seek help. See r/StopGaming for resources.

This "undressing" tends to go hand in hand with a reduced focus on aesthetics, often just printing the game state directly to the screen as text. This makes incremental games much easier to develop, particularly for those with programming skills but not art skills, but that's a tangent for why Incremental Games Guide to Incrementals/Appeal to Developers.

Before I continue, I'd like to make my stance clear that I love games and incremental games, and do not think they should be considered inherently bad or manipulative with the above logic. Skinner boxes are just a way of manipulating behavior via rewards. The games are still fun - that's the reward! I'd believe the real criticism here is that it is "empty fun", or "empty dopamine", that doesn't offer any additional value or sense of fulfillment. I don't think that's inherently bad in moderation, although it can become a problem if the game is manipulating you for profit-seeking, or if you play the game to the detriment of the other parts of your life.

Another interpretation of incremental games as parodies comes from several mainstream incremental games that are also parodies of capitalism, such as cookie clicker and adventure capitalist. It's a very common framework for incremental games to portray the ever-increasing numbers as an insatiable hunger for resources, like the ones observed within capitalism. Therefore, these games are used as evidence that the genre as a whole is about parody and commentary.

Popular videos on incremental games that portray the genre as parodies are Why Idle games make good satire, and how it was ruined. and Bad Game Design - Clicker Games. You may also be interested in this response to the latter video from a fan of incremental games: BadGood Game Design - Clicker Games.

I think that this definition ultimately ascribes a motive to the genre as a whole that only happens to apply to some of the more mainstream titles. There certainly are incremental games commenting on different things, including the genre itself as in the case of The Prestige Tree Classic, The Ascension Tree, or Omega Layers, but certainly not all. And of course, not all games that comment on something or parody something are incremental games! Additionally, a very large majority of incremental games are mobile games using these manipulative strategies to get players to spend as much money as possible - hell, Adventure Capitalist is ostensibly a critique on capitalism but features microtransactions and gameplay that manipulates you into buying them! These profit-seeking incremental games certainly belong within the genre but are hardly parodies when they too use manipulation to serve their interests. Also, from my own anecdotal experience, those who use this definition seem to do so from a fairly surface-level familiarity with the genre, and often in the context of criticizing the genre or the fans thereof.

Incrementals as NGU

Another broad definition often used is that incremental games are games where the focus of the game is "numbers going up". This definition proposes that other genres simply use increasing numbers as a means to an end, but incremental games uniquely only care about the numbers themselves going up. Put another way, it implies there should be no narrative justification for the numbers going up other than "why shouldn't they be going up?"

While this definition is common because it feels easy to understand, it is difficult to formally define. Often phrases are used to describe games using this framework, such as having an "exaggerated sense of progression" or "big" numbers. These terms are vague and don't demonstrate an actual threshold between non-incrementals and incrementals. Most games have a sense of progression, so when is it "exaggerated"? How big are "big" numbers? Most notably, RPGs that are typically not considered incrementals will often pass this definition.

Additionally, a lot of incrementals tend to have some theme guiding the gameplay, or at least the names of mechanics. This makes the line blurred between when numbers are going up for their own sake versus for a contextual reason. I believe this point is best illustrated that, while most RPGs are not considered incremental games, there is a sub-genre of "incremental RPGs" that typically relates to RPGs that perform combat automatically. This definition of incremental games does not support RPGs and "incremental RPGs" being on distinct sides of the line if the only difference between them is manual vs automatic combat.

Incrementals as Strategies

This is a rarer interpretation, but there are similarities between incremental games and strategy games, implying incrementals might just be a sub-genre of strategy games. By this approach, incremental games would be defined by their relation to strategy games, and how they involve player strategy. Incremental games are often large optimization problems - above all else, the actual gameplay the player is performing is deciding what to do next. The consequences of wrong decisions are typically more lenient in incremental games - such as just not making optimal progress - but they certainly get complex.

So if we accept the premise that incrementals could fall under strategy, we still need to define what makes a strategy game an incremental versus some other strategy sub-genre. This is a bit tricky due to one particular sub-genre of strategy games: Factory Builders.

Factory builders, such as Factorio or Satisfactory, are games about gaining ever increasing resources, optimizing production, and expanding more and more. That... sounds pretty similar, doesn't it? In fact, there's been some debate on whether factory builders would fall under the "incremental" umbrella. I think it's safe to say the two are certainly related, and probably have quite a bit of overlap in playerbase.

Roguelites as Incrementals?

Earlier on, I mentioned reset mechanics shouldn't be used in the definition because that could make all roguelites incrementals... But what if it does? A lot of incrementals can be described as games with a strong sense of progression, often with layers of meta-progression. Roguelites fit that bill to a T. What would make roguelites not incremental? I honestly don't think there's a good explanation here, but many fans of incremental games will state they do believe the two genres to be unrelated, even if there's a significant overlap between their player bases due to having similar appealing traits.

At this point, it'd be appropriate to consider what part of the definition of roguelites precludes them from also being incrementals, but that reveals a new problem: What are roguelites? They're usually defined as rogue_likes with meta-progression, but that just pushes the problem back a step: Incrementals aren't the only genre to have difficulties defining themselves, it seems! Roguelikes are another genre where the community argues over the formal definition of their genre, although that means we can borrow from their process of coming to a consensus, and maybe come across a viable definition for incremental games.

The Berlin Interpretation

By far the most popular way of defining roguelikes is the "Berlin Interpretation", which acknowledged the diversity of games within the genre and argued the definition should not be based on any ideals about what the genre ought to be, but rather defined by "its canon". They argued there are a handful of games that can be used to define the canon for roguelikes, and from those games, a list of factors can be derived to determine a game's "roguelikeness". The more factors a game has, the more of a roguelike it is. This strategy is very lenient, allowing a game to not present any specific factor so long as it shows enough, and accounts for the blurriness of any genre definition by not explicitly stating how many factors a game must have to qualify as a definite roguelike.

I believe this strategy for defining genres can be applied to other genres as well. A handful of games can be argued to be the incremental games canon, and a list of factors derived from them can be used to judge any game based on its "incrementalness". I'll propose such a canon and list of factors here, but by no means should it be considered the end-all-be-all.

Note: The "Temple of the roguelike", an authority within the genre, has since replaced the Berlin Interpretation with a new set of factors here: https://blog.roguetemple.com/what-is-a-traditional-roguelike/

The Incremental Games Canon

Alright, time to get controversial. Up til now, I've been trying my best to stay objective and analytical, but now it's time to start making some opinionated decisions. Here is a list of games I think could justifiably make up an Incremental Games Canon:

I chose a variety of games here, biasing towards newer games, purposefully to avoid making a narrow or "traditional" definition. The genre is growing and shouldn't be constrained by the traits of the early popular titles. A lot of these could easily be replaced with other games that are mechanically congruent, so ultimately I'm sure if you asked 10 people for their canon list you'd just get 10 different answers, but I think this should sufficiently allow us to determine what factors make a game have higher "incrementalness".

The Paradigm Shift

The Paradigm Shift is probably the highest possible value factor for an incremental. It's so common that for a while people referred to incrementals that exhibit this trait as "unfolding" games, to the point of trying to replace the term incremental due to their popularity. Paradigm shifts refer to when the gameplay significantly changes. There are too many examples to list here, but notably, every single reset mechanic is typically going to be a paradigm shift. Examples of games with paradigm shifts that aren't tied to reset mechanics include Universal Paperclips and A Dark Room.

There are many reasons for the appeal of paradigm shifts. Oftentimes each mechanic builds on top of the existing mechanics, increasing the complexity of the game in steps so the player can follow along. They provide a sense of mystery, with the player anticipating what will happen next. They shake up the gameplay before it gets too stale - allowing the game to entertain for longer before the sense of Guide to Incrementals/What is Content? dissipates. Of the canon games selected above, I would argue every single one contains a paradigm shift (although I could see someone disagreeing with that statement wrt Increlution).

I should take a moment to say that while I'm hyping up this specific factor, we cannot just reduce the genre definition to "does it have paradigm shifts". Many games have paradigm shifts that are not incremental, so it's just an indicator of incrementalness. Additionally, it can become quite hard to determine how large of a shift is a "paradigm" shift. Take, for example, any game with a skill tree. In some games, each skill node might have a large impact on how you play with the game, and qualify as a paradigm shift for some players. In other games, each skill node might just be a small percentage modifier on some stat that doesn't really impact much more than a slight bias towards an already established mechanic that's newly buffed. Every single canon game may show that it's common amongst incremental games, but could just as easily indicate that they're common in games in general.

High-Value Factors

I won't take as long to discuss the high and low-value factors, as you've already seen most of them brought up earlier on this page. As a reminder, a game does NOT need all of these to be an incremental game, but these are factors that each indicate a strong possibility the game is an incremental, so having several of these means they probably are. These factors apply to most of the canon incremental games.

"Pure UI" Display. Incrementals typically have a textual presentation of the game state - there isn't a visual representation of the entities within the game. The interface is closer to what would be just the UI of a game in another genre or the control panel of a plane. If there is a visual representation, the player is often still interacting with non-diegetic game elements.

Reduced Consequences. Incrementals tend to have reduced repurcussions for misplaying. They very rarely have fail states, where often the largest consequence is simply not progressing - never losing progress.

Optimization Problems. The predominant gameplay of incrementals is typically solving optimization problems, from deciding which purchase to save up for to reasoning and deciding between different mutually exclusive options the game presents.

Resource Management. Incrementals tend to have a lot of resources within the game to keep track of.

Low-Value Factors

These are low-value factors, meaning they aren't as strongly correlated with incremental games. Incremental games may have none of these, and non-incrementals may have several of these - if a game only has low-value factors, they're probably not an incremental.

Fast Numeric Growth. Numbers in incremental games tend to grow faster than in other genres. There are more instances of superlinear growth. The larger the numbers get, the stronger of a signal this factor is.

Automation. As an incremental game progresses, the player often no longer has to deal with earlier mechanics, by having them either happen automatically or otherwise be replaced with an alternative that requires less player interaction.

Goal-Oriented. Incrementals are often heavily reliant on extrinsic motivation to guide the player. Typically this is through some sort of in-game goal to work towards, such as a certain amount of a resource being required to unlock or purchase something new.

Waiting is a Mechanic. In incremental games, the player may come across times where there is no action they can take, and the game will progress automatically instead. The player must wait for some amount of this automatic progress to occur before they can resume interaction with the game.

Are Roguelites Incrementals?

Having made our variation of the Berlin Interpretation for incremental games, we can compare it to the Berlin Interpretation to determine if there's enough overlap that any game that "passes" the Berlin Interpretation would also pass the incremental variant. That is to say, whether any roguelite would also be considered an incremental game.

The meta-progression of an incremental game could arguably be considered a paradigm shift, and certainly adds some resource management. Goal-oriented would probably also apply. I think anything other than those would be a stretch, and in my opinion that just isn't enough to qualify. To be totally honest, I was never expecting to conclude otherwise though 😉

Sub-Genres

There are some trends in incremental games that go beyond just being a commonly used mechanic, such that they deeply affect the rest of the game design. These trends can be used to determine sub-genres within the incremental games umbrella:

Loops games are a sub-genre defined by having a core mechanic related to a loop, where the player is deciding the actions taken per loop. Notable examples include Idle Loops, Stuck in Time, Cavernous II, and Increlution. You may also argue Groundhog Life and Progress Knight fall into this sub-genre.

ITRTG-like games are a sub-genre defined by having a core mechanic based on clearing increasingly difficult battles and often tend to have a lot of different mechanics to become progressively stronger. Notable examples include Idling to Rule the Gods, NGU Idle, and Wizard and Minion Idle.

Polynomial Growth games are a sub-genre defined by having a core mechanic related to a higher degree polynomial. Notable examples include the base layer of Antimatter Dimensions and Swarm Simulator.

Upgrades Games is a category popular on flash games websites that featured games focused on buying upgrades that would allow you to attain more currency in some sort of minigame that would earn you more money to buy more upgrades, which I'd argue now belong under the fold of incremental games. Notable examples include the Learn to Fly series and Upgrade Complete.

Cultivation RPGs are a genre of games, books, and anime popular in China that center around being in a fantasy world with characters getting stronger over time. While few of them get translated into English, a fan of incremental games may find the available games interesting.

- + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json index 69f8668e..3889cc73 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"garden_davey-wreden_index.md":"D5jOgDow","garden_dice-armor_index.md":"DRqBzafS","garden_decentralized_index.md":"BsoUG57G","garden_digital-gardens_index.md":"B2uLVFGz","garden_forgejo_index.md":"D0iEfYzP","garden_freeform-vs-chronological-dichotomy_index.md":"1DrtPCar","garden_chronological_index.md":"DcD47fhh","garden_capture-the-citadel_index.md":"0xMEcFyt","garden_advent-incremental_index.md":"04u11BOM","garden_chat-glue_index.md":"BJK65pvS","garden_atproto_index.md":"-sODrTEJ","garden_garden-rss_index.md":"BwhK0u3y","garden_game-dev-tree_index.md":"1knpikM2","garden_commune_index.md":"Dz4Z13kZ","garden_cinny_index.md":"rVS5Vh1G","garden_guide-to-incrementals_appeal-to-developers_index.md":"DZzqiW0T","garden_fedi-v2_index.md":"bYm2NX_V","public_gamedevtree_docs_challenges.md":"BsXIWoTI","public_gamedevtree_docs_custom-tab-layouts.md":"DXFeTlpj","public_gamedevtree_docs_clickables.md":"CYP_r85U","public_lit_docs_bars.md":"hc6LT70W","garden_babble-buds_index.md":"BkMcku2S","garden_federated-identity_index.md":"DQgk_kzS","changelog_index.md":"Bq0zUXhk","garden_freeform_index.md":"Dpr_rnXh","garden_fediverse_index.md":"mvmrObxT","garden_guide-to-incrementals_appeal-to-players_index.md":"Zt-2JIdI","public_kronos_docs_particles.md":"DkE7U5GT","garden_weird_index.md":"DlZUcsA4","guide-to-incrementals_design_criticism_index.md":"f96IunmV","guide-to-incrementals_index.md":"DKlWf0lO","guide-to-incrementals_ludology_definition_index.md":"DKOCC4rn","garden_the-cozy-web_index.md":"C1ibMFr-","garden_wanderstop_index.md":"osEdKtZT","garden_webrings_index.md":"DDDfYflF","garden_synapse_index.md":"6c0_vLtD","garden_the-beginner-s-guide_index.md":"BejdJHJA","garden_this-knowledge-hub_index.md":"C_VS46AX","garden_v-ecs_index.md":"BMdd2G-v","garden_the-small-web_index.md":"CCPoKGQN","garden_mbin_index.md":"BCeJHUKa","garden_guide-to-incrementals_index.md":"CnQL84i-","garden_guide-to-incrementals_navigating-criticism_index.md":"4aLxw7wS","garden_guide-to-incrementals_what-is-content_index.md":"D_VOmtEP","garden_incremental-social_index.md":"CfME2gTU","guide-to-incrementals_ludology_content_index.md":"DrX3RUub","garden_social-media_index.md":"CxiS8Ne_","garden_logseq_index.md":"uO2Fr5Gt","garden_matrix_index.md":"DSfu06km","garden_guide-to-incrementals_defining-the-genre_index.md":"Cqr_5G2y","garden_ivy-road_index.md":"31ClM7tv","garden_profectus_index.md":"Y8HQeYK8","garden_opti-speech_index.md":"C0T7MKQx","public_kronos_old things_2.0-format-changes.md":"B6DTr0jJ","garden_kronos_index.md":"DD5fELK_","garden_my-personal-website_index.md":"DbCoVJwI","public_kronos_docs_main-mod-info.md":"ByNe_g0w","public_kronos_readme.md":"DOcyAoHv","public_gamedevtree_docs_milestones.md":"Phzy1O6H","garden_my-projects_index.md":"kS6uq5l_","public_gamedevtree_docs_updating-tmt.md":"Cym0rRYz","public_gamedevtree_docs_subtabs-and-microtabs.md":"D3v8JvXX","garden_open-source_index.md":"BrIASRsU","public_kronos_changelog.md":"paCgtsXh","garden_nostr_index.md":"lCBdDjSu","garden_planar-pioneers_index.md":"6LR6SQYR","public_kronos_docs_buyables.md":"DApk6nw5","public_gamedevtree_2.0-format-changes.md":"BJWVbIw2","public_gamedevtree_changelog.md":"yaSdB86a","public_gamedevtree_docs_!general-info.md":"60si-HlW","garden_activitypub_index.md":"BBeMc1Gf","public_gamedevtree_docs_bars.md":"BOkZNfjK","public_kronos_docs_achievements.md":"B2ZLvQuE","public_gamedevtree_docs_basic-layer-breakdown.md":"Lt_Kak5C","public_gamedevtree_docs_buyables.md":"Bdb3l1uw","public_lit_docs_basic-layer-breakdown.md":"CqbgegVm","public_kronos_docs_basic-layer-breakdown.md":"MMKYyoj1","public_gamedevtree_docs_infoboxes.md":"u7lbf1fe","public_gamedevtree_docs_achievements.md":"Byb7DjwU","public_lit_docs_buyables.md":"DilfnDIO","public_gamedevtree_docs_layer-features.md":"BBomRnin","public_lit_docs_clickables.md":"D9eesbmM","public_gamedevtree_docs_getting-started.md":"53r6S_jZ","public_lit_docs_challenges.md":"FvqZDXVG","public_gamedevtree_docs_upgrades.md":"hegmaS21","public_kronos_docs_trees-and-tree-customization.md":"DZzDglty","public_kronos_docs_milestones.md":"D2as2Rdw","public_kronos_docs_grids.md":"3_YSBuDO","public_kronos_docs_updating-tmt.md":"B2tZSHuA","public_kronos_docs_infoboxes.md":"DpZxLNRR","public_kronos_docs_upgrades.md":"5OAqntPP","public_gamedevtree_docs_main-mod-info.md":"CzntOXuT","index.md":"CrdqXg4F","public_kronos_docs_layer-features.md":"Bz9OYgri","public_lit_docs_subtabs-and-microtabs.md":"CICoMMMb","public_lit_readme.md":"pVsJJuH2","public_kronos_docs_custom-tab-layouts.md":"BbyIoWME","guide-to-incrementals_ludology_appeal-gamers_index.md":"CjswzOO0","public_kronos_docs_challenges.md":"Cn9Xc7xE","public_kronos_docs_!general-info.md":"DvOjN6Rt","public_lit_docs_achievements.md":"z7uTtaPO","public_kronos_docs_bars.md":"JgNsk6mY","public_kronos_docs_subtabs-and-microtabs.md":"Bqm7YUXh","public_kronos_docs_getting-started.md":"CQfW9cEX","public_kronos_docs_clickables.md":"BzXBLTUl","public_lit_docs_layer-features.md":"BSLdBpI-","public_lit_docs_custom-tab-layouts.md":"BYNeuJZ1","public_lit_docs_infoboxes.md":"Be2LqzDD","public_lit_docs_upgrades.md":"DnP9Av1u","guide-to-incrementals_ludology_appeal-developers_index.md":"B3Lh8HIP","public_lit_docs_getting-started.md":"MYuuOf2Q","public_lit_old things_2.0-format-changes.md":"y8RAczqh","public_lit_docs_!general-info.md":"CDTQvlu3","public_lit_docs_updating-tmt.md":"K90Uh1tC","public_lit_docs_main-mod-info.md":"CUo3Y8ir","public_lit_docs_milestones.md":"DKpEd4GK","public_gamedevtree_readme.md":"BcJ-DaYW","public_lit_docs_trees-and-tree-customization.md":"CWsN4p6Q","public_lit_changelog.md":"Dj7fgFUm","garden_vitepress_index.md":"DwDwogUe"} +{"changelog_index.md":"BUwKGXwi","garden_babble-buds_index.md":"IVJV-9eu","garden_advent-incremental_index.md":"Bi867NSD","garden_activitypub_index.md":"BKxKk1GM","garden_atproto_index.md":"BwFHx7Hd","garden_freeform_index.md":"BLA-ZZ3B","garden_freeform-vs-chronological-dichotomy_index.md":"C3LSUlA6","garden_ivy-road_index.md":"DK8swC5I","garden_kronos_index.md":"B-JAOjIb","garden_guide-to-incrementals_appeal-to-players_index.md":"AIc2QesW","garden_logseq_index.md":"Sw_XpNVJ","garden_matrix_index.md":"B4VZfP7W","garden_mbin_index.md":"DHRumvWR","garden_my-personal-website_index.md":"DryeDwGD","garden_my-projects_index.md":"efagz0SF","garden_open-source_index.md":"DFsY5O5E","garden_planar-pioneers_index.md":"DjRmOjdq","garden_opti-speech_index.md":"C1FMxL_Q","garden_profectus_index.md":"0UR_Gmo7","garden_social-media_index.md":"CZWs3kNq","garden_synapse_index.md":"DlkipkaT","garden_the-beginner-s-guide_index.md":"vCAvuQfF","garden_nostr_index.md":"CnVfHGYc","garden_the-cozy-web_index.md":"C9yKvylk","garden_dice-armor_index.md":"CztXuY1B","garden_davey-wreden_index.md":"BMlE9hYd","garden_decentralized_index.md":"DuxiPg9M","garden_this-knowledge-hub_index.md":"BtDJLJGY","garden_digital-gardens_index.md":"ChW8RG51","garden_incremental-social_index.md":"TlaPPmQO","garden_the-small-web_index.md":"2RHAQRcF","garden_guide-to-incrementals_appeal-to-developers_index.md":"C6gNawcM","garden_garden-rss_index.md":"CqqLm4uJ","garden_guide-to-incrementals_index.md":"D-Qo_phb","garden_guide-to-incrementals_defining-the-genre_index.md":"B-EmqxPI","garden_guide-to-incrementals_what-is-content_index.md":"A83vET_y","garden_fediverse_index.md":"UJiYbaK2","garden_wanderstop_index.md":"fcx7CNrA","garden_forgejo_index.md":"BIFTMSC0","garden_game-dev-tree_index.md":"DweE1Ysy","garden_federated-identity_index.md":"Bf4QWuIq","garden_guide-to-incrementals_navigating-criticism_index.md":"Djt_EVT5","garden_chronological_index.md":"g8ZA0BlN","garden_vitepress_index.md":"6SyjaoK2","garden_commune_index.md":"Cz6o7qRH","garden_chat-glue_index.md":"Cgbw8xnx","garden_cinny_index.md":"DjdgGx9N","garden_capture-the-citadel_index.md":"CcwwplwM","garden_webrings_index.md":"57x1ZkEg","public_gamedevtree_docs_!general-info.md":"WzWHA4Zz","public_lit_docs_custom-tab-layouts.md":"RNFGijzw","public_kronos_docs_subtabs-and-microtabs.md":"NAJvWyOX","public_kronos_docs_infoboxes.md":"d7yspWU6","guide-to-incrementals_index.md":"DKlWf0lO","public_kronos_readme.md":"DOcyAoHv","public_kronos_docs_achievements.md":"CV5RQN-f","garden_fedi-v2_index.md":"B5ZguLke","public_kronos_docs_grids.md":"D6eGDxZf","public_gamedevtree_changelog.md":"BVckBzUe","guide-to-incrementals_ludology_appeal-developers_index.md":"B3Lh8HIP","public_kronos_docs_trees-and-tree-customization.md":"DNSPCGw2","public_gamedevtree_docs_custom-tab-layouts.md":"CuvyVAhF","public_lit_readme.md":"pVsJJuH2","garden_weird_index.md":"Bd7l3f9l","public_lit_docs_milestones.md":"Cty1k_dD","public_kronos_docs_clickables.md":"CwRD8HLA","public_kronos_docs_main-mod-info.md":"59FtHiDt","public_lit_docs_buyables.md":"BSNB4_NL","public_kronos_docs_upgrades.md":"CwGnjpZF","public_kronos_old things_2.0-format-changes.md":"NRns2BBm","public_gamedevtree_docs_challenges.md":"BFQDD4X0","public_kronos_docs_getting-started.md":"CvyktqWn","public_gamedevtree_docs_basic-layer-breakdown.md":"DlASwD5Q","public_gamedevtree_docs_bars.md":"DbswOg3L","public_gamedevtree_docs_infoboxes.md":"CRUxoh5g","guide-to-incrementals_ludology_content_index.md":"DrX3RUub","public_gamedevtree_readme.md":"D0kWmw3r","public_kronos_docs_basic-layer-breakdown.md":"CKcXGVzo","public_lit_docs_getting-started.md":"GyuAnbTP","public_lit_docs_infoboxes.md":"rD48WYz9","public_kronos_docs_particles.md":"BmR47K5y","index.md":"DdYa43X-","public_kronos_docs_updating-tmt.md":"F3HiFsfM","public_lit_docs_layer-features.md":"B06xG5cR","public_kronos_docs_layer-features.md":"CUYPvQ75","public_lit_changelog.md":"O4pzFPx8","public_lit_old things_2.0-format-changes.md":"C-yzF1yi","public_lit_docs_achievements.md":"Cz8mR7W2","public_kronos_docs_challenges.md":"xjts-SLB","public_kronos_docs_milestones.md":"_qurRXy3","public_kronos_changelog.md":"CKFBbvc8","public_lit_docs_trees-and-tree-customization.md":"B4CePdZ2","guide-to-incrementals_ludology_definition_index.md":"DKOCC4rn","public_kronos_docs_buyables.md":"Clz5ovuw","public_lit_docs_bars.md":"B1zVageA","public_gamedevtree_docs_main-mod-info.md":"6LyBs-t5","public_gamedevtree_docs_buyables.md":"Bu_8Had0","garden_v-ecs_index.md":"CeXiyFwA","public_gamedevtree_docs_upgrades.md":"DZ8OZlWu","public_gamedevtree_docs_clickables.md":"9UR7Ajqa","public_kronos_docs_bars.md":"DYrBr3p3","public_lit_docs_clickables.md":"XlVpmgOb","public_lit_docs_challenges.md":"Ckyne6Wg","public_kronos_docs_!general-info.md":"BpKUMbLF","public_lit_docs_subtabs-and-microtabs.md":"BRlF9GbR","public_gamedevtree_docs_milestones.md":"BmAGhs_0","public_lit_docs_!general-info.md":"Bx73xrHN","public_gamedevtree_docs_updating-tmt.md":"DGbxasx9","public_gamedevtree_docs_getting-started.md":"CO6xRZs4","guide-to-incrementals_design_criticism_index.md":"f96IunmV","public_lit_docs_upgrades.md":"Bh4bFGTK","guide-to-incrementals_ludology_appeal-gamers_index.md":"CjswzOO0","public_lit_docs_basic-layer-breakdown.md":"CZbO_awH","public_kronos_docs_custom-tab-layouts.md":"DQLQaGen","public_gamedevtree_docs_achievements.md":"BgY9AsGa","public_gamedevtree_docs_subtabs-and-microtabs.md":"C4QzwvQW","public_lit_docs_updating-tmt.md":"Bx5ufyRr","public_gamedevtree_docs_layer-features.md":"DSg6NDQu","public_lit_docs_main-mod-info.md":"DgSHm7mV","public_gamedevtree_2.0-format-changes.md":"Cu7Ykz4Q"} diff --git a/index.html b/index.html index 717c6d81..5f2b2c56 100644 --- a/index.html +++ b/index.html @@ -8,11 +8,11 @@ - + - - + + @@ -307,7 +307,7 @@
- + \ No newline at end of file diff --git a/public/gamedevtree/2.0-format-changes.html b/public/gamedevtree/2.0-format-changes.html index 44b051c7..a37d9aea 100644 --- a/public/gamedevtree/2.0-format-changes.html +++ b/public/gamedevtree/2.0-format-changes.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

2.0 format changes

  • Temp format is changed from temp.something[layer] to temp[layer].something, for consistency
  • Challenges are now saved as an object with the amount of completions in each spot. (This will break saves.)
  • effectDisplay in Challenges and Upgrades no longer takes an argument, and neither does effect for Buyables
  • Buyable cost can take an argument for amount of buyables, but it needs to function if no argument is supplied (it should do the cost for the next purchase).
  • Generation of Points now happens in the main game loop (not in a layer update function), enabled by canGenPoints in game.js.
  • Changed fullLayerReset to layerDataReset, which takes an array of names of values to keep

In addition, many names were changed, mostly expanding abbreviations:

All instances of:

  • chall -> challenge
  • unl -> unlocked
  • upg -> upgrade (besides CSS)
  • amt -> amount
  • desc -> description
  • resCeil -> roundUpCost
  • order -> unlockOrder
  • incr_order -> increaseUnlockOrder

Challenges:

  • desc -> challengeDescription
  • reward -> rewardDescription
  • effect -> rewardEffect
  • effectDisplay -> rewardDisplay
  • active -> challengeActive
- +

2.0 format changes

  • Temp format is changed from temp.something[layer] to temp[layer].something, for consistency
  • Challenges are now saved as an object with the amount of completions in each spot. (This will break saves.)
  • effectDisplay in Challenges and Upgrades no longer takes an argument, and neither does effect for Buyables
  • Buyable cost can take an argument for amount of buyables, but it needs to function if no argument is supplied (it should do the cost for the next purchase).
  • Generation of Points now happens in the main game loop (not in a layer update function), enabled by canGenPoints in game.js.
  • Changed fullLayerReset to layerDataReset, which takes an array of names of values to keep

In addition, many names were changed, mostly expanding abbreviations:

All instances of:

  • chall -> challenge
  • unl -> unlocked
  • upg -> upgrade (besides CSS)
  • amt -> amount
  • desc -> description
  • resCeil -> roundUpCost
  • order -> unlockOrder
  • incr_order -> increaseUnlockOrder

Challenges:

  • desc -> challengeDescription
  • reward -> rewardDescription
  • effect -> rewardEffect
  • effectDisplay -> rewardDisplay
  • active -> challengeActive
+ \ No newline at end of file diff --git a/public/gamedevtree/README.html b/public/gamedevtree/README.html index d1baf357..e141c812 100644 --- a/public/gamedevtree/README.html +++ b/public/gamedevtree/README.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

The-Modding-Tree

A modified version of The Prestige Tree that is much easier to mod. It still requires programming knowledge, but it's mostly pretty easy things and copy/pasting.

Look here for a tutorial on getting started with modding with TMT

You can look in the documentation for more information on how it all works, or look at the code in layers.js to see what it all looks like.

- +

The-Modding-Tree

A modified version of The Prestige Tree that is much easier to mod. It still requires programming knowledge, but it's mostly pretty easy things and copy/pasting.

Look here for a tutorial on getting started with modding with TMT

You can look in the documentation for more information on how it all works, or look at the code in layers.js to see what it all looks like.

+ \ No newline at end of file diff --git a/public/gamedevtree/changelog.html b/public/gamedevtree/changelog.html index e5c511e4..e15b7293 100644 --- a/public/gamedevtree/changelog.html +++ b/public/gamedevtree/changelog.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

The Game Dev Tree changelog:

v1.0.4 Version Bump [rebalanced,debuggedx3] - 2020-11-09

  • Fixed refactorings 2, 3, and 4 not actually affecting productivity

v1.0.3 Version Bump [rebalanced,debuggedx2] - 2020-11-08

  • Fixed API milestone 4 not working

v1.0.2 Version Bump [rebalanced,debugged] - 2020-11-08

  • Fixed tree lines being hidden after hitting "keepGoing" in the victory screen

v1.0.1 Version Bump [rebalanced] - 2020-11-08

  • Buffed several TAs

v1.0 Version Bump - 2020-11-08

  • Finished row 4
  • Added colored text to lore
  • Fixed some visual bugs with milestones
  • Probably other stuff lol its been a week

v0.2.3 Stylish - 2020-10-30

  • Re-styled basically everything
  • Added favicon
  • Added header bar
  • Added changelog

v0.2.2 Row 3 - 2020-10-22

  • Removed debug statement
  • Moved milestones in F layer beneath the buyables

v0.2.1 Row 3 - 2020-10-21

  • Fixed layers hiding
  • Fixed typos/minor issues
  • Fixed S layer being highlighted before you can unlock the layer

v0.2 Row 3 - 2020-10-21

  • Implemented row 3

v0.1.1 Cash Influx [rebalanced] - 2020-10-19

  • Fixed notification issue
  • Rebalanced to make early game faster and late game slower
  • Fixed other minor issues

v0.1 Cash Influx - 2020-10-19

  • Implemented row 2

v0.0 Initial Commit - 2020-10-18

  • Implemented row 1
- +

The Game Dev Tree changelog:

v1.0.4 Version Bump [rebalanced,debuggedx3] - 2020-11-09

  • Fixed refactorings 2, 3, and 4 not actually affecting productivity

v1.0.3 Version Bump [rebalanced,debuggedx2] - 2020-11-08

  • Fixed API milestone 4 not working

v1.0.2 Version Bump [rebalanced,debugged] - 2020-11-08

  • Fixed tree lines being hidden after hitting "keepGoing" in the victory screen

v1.0.1 Version Bump [rebalanced] - 2020-11-08

  • Buffed several TAs

v1.0 Version Bump - 2020-11-08

  • Finished row 4
  • Added colored text to lore
  • Fixed some visual bugs with milestones
  • Probably other stuff lol its been a week

v0.2.3 Stylish - 2020-10-30

  • Re-styled basically everything
  • Added favicon
  • Added header bar
  • Added changelog

v0.2.2 Row 3 - 2020-10-22

  • Removed debug statement
  • Moved milestones in F layer beneath the buyables

v0.2.1 Row 3 - 2020-10-21

  • Fixed layers hiding
  • Fixed typos/minor issues
  • Fixed S layer being highlighted before you can unlock the layer

v0.2 Row 3 - 2020-10-21

  • Implemented row 3

v0.1.1 Cash Influx [rebalanced] - 2020-10-19

  • Fixed notification issue
  • Rebalanced to make early game faster and late game slower
  • Fixed other minor issues

v0.1 Cash Influx - 2020-10-19

  • Implemented row 2

v0.0 Initial Commit - 2020-10-18

  • Implemented row 1
+ \ No newline at end of file diff --git a/public/gamedevtree/docs/!general-info.html b/public/gamedevtree/docs/!general-info.html index 2c6a32a3..e8327e3c 100644 --- a/public/gamedevtree/docs/!general-info.html +++ b/public/gamedevtree/docs/!general-info.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

The-Modding-Tree

The main way to add content is through creating layers. You can either add a layer directly in the layers object in layersSupportjs, or declare it in another file and then do "addLayer(layername, layerdata)" (good for breaking things up into smaller files). The existing layers are just examples and can be freely deleted. You can also use them as references and a base for your own layers.

The first thing you need to do is to edit the modInfo at the top of game.js to set your modID (a string). A unique modId will prevent your mod's saves from conflicting with other mods.

Most of the time, you won't need to dive deep into the code to create things, but you still can if you really want to.

The Modding Tree uses break_eternity.js to store large values. This means that many numbers are Decimal objects, and must be treated differently. For example, you have to use new Decimal(x) to create a Decimal value instead of a plain number, and perform operations on them by calling functions. e.g, instead of x = x + y, use x = x.add(y).

Almost all values can be either a constant value, or a dynamic value. Dynamic values are defined by putting a function that returns what the value should be at any given time.

All display text can be basic HTML instead (But you can't use most Vue features there).

Table of Contents:

General:

  • Getting Started: Getting your own copy of the code set up with Github Desktop.
  • Main mod info: How to set up general things for your mod in mod.js.
  • Basic layer breakdown: Breaking down the components of a layer with minimal features.
  • Layer features: Explanations of all of the different properties that you can give a layer.
  • Custom Tab Layouts: An optional way to give your tabs a different layout. You can even create entirely new components to use.
  • Updating TMT: Using Github Desktop to update your mod's version of TMT.

Common components

  • Upgrades: How to create upgrades for a layer.
  • Milestones: How to create milestones for a layer.
  • Buyables: Create rebuyable upgrades for your layer (with the option to make them respec-able). Can be used to make Enhancers or Space Buildings.
  • Clickables: A more generalized variant of buyables, for any kind of thing that is sometimes clickable. Between these and Buyables, you can do just about anything.

Other components

  • Challenges: How to create challenges for a layer.
  • Bars: Display some information as a progress bar, gague, or similar. They are highly customizable, and can be horizontal and vertical as well.
  • Subtabs and Microtabs: Create subtabs for your tabs, as well as "microtab" components that you can put inside the tabs.
  • Achievements: How to create achievements for a layer (or for the whole game).
  • Infoboxes: Boxes containing text that can be shown or hidden.
- +

The-Modding-Tree

The main way to add content is through creating layers. You can either add a layer directly in the layers object in layersSupportjs, or declare it in another file and then do "addLayer(layername, layerdata)" (good for breaking things up into smaller files). The existing layers are just examples and can be freely deleted. You can also use them as references and a base for your own layers.

The first thing you need to do is to edit the modInfo at the top of game.js to set your modID (a string). A unique modId will prevent your mod's saves from conflicting with other mods.

Most of the time, you won't need to dive deep into the code to create things, but you still can if you really want to.

The Modding Tree uses break_eternity.js to store large values. This means that many numbers are Decimal objects, and must be treated differently. For example, you have to use new Decimal(x) to create a Decimal value instead of a plain number, and perform operations on them by calling functions. e.g, instead of x = x + y, use x = x.add(y).

Almost all values can be either a constant value, or a dynamic value. Dynamic values are defined by putting a function that returns what the value should be at any given time.

All display text can be basic HTML instead (But you can't use most Vue features there).

Table of Contents:

General:

  • Getting Started: Getting your own copy of the code set up with Github Desktop.
  • Main mod info: How to set up general things for your mod in mod.js.
  • Basic layer breakdown: Breaking down the components of a layer with minimal features.
  • Layer features: Explanations of all of the different properties that you can give a layer.
  • Custom Tab Layouts: An optional way to give your tabs a different layout. You can even create entirely new components to use.
  • Updating TMT: Using Github Desktop to update your mod's version of TMT.

Common components

  • Upgrades: How to create upgrades for a layer.
  • Milestones: How to create milestones for a layer.
  • Buyables: Create rebuyable upgrades for your layer (with the option to make them respec-able). Can be used to make Enhancers or Space Buildings.
  • Clickables: A more generalized variant of buyables, for any kind of thing that is sometimes clickable. Between these and Buyables, you can do just about anything.

Other components

  • Challenges: How to create challenges for a layer.
  • Bars: Display some information as a progress bar, gague, or similar. They are highly customizable, and can be horizontal and vertical as well.
  • Subtabs and Microtabs: Create subtabs for your tabs, as well as "microtab" components that you can put inside the tabs.
  • Achievements: How to create achievements for a layer (or for the whole game).
  • Infoboxes: Boxes containing text that can be shown or hidden.
+ \ No newline at end of file diff --git a/public/gamedevtree/docs/achievements.html b/public/gamedevtree/docs/achievements.html index 47fc8831..1b3ceca1 100644 --- a/public/gamedevtree/docs/achievements.html +++ b/public/gamedevtree/docs/achievements.html @@ -8,11 +8,11 @@ - + - - + + @@ -314,8 +314,8 @@ more features } etc - }

Each achievement should have an id where the first digit is the row and the second digit is the column. Individual achievement can have these features:

  • name: optional, displayed at the top of the achievement. The only visible text. It can also be a function that returns updating text. Can use basic HTML.

  • done(): A function returning a boolean to determine if the achievement should be awarded.

  • tooltip: Default tooltip for the achievement, appears when it is hovered over. Should convey the goal and any reward for completing the achievement. It can also be a function that returns updating text. Can use basic HTML.

  • effect(): optional, A function that calculates and returns the current values of any bonuses from the achievement. Can return a value or an object containing multiple values.

  • unlocked(): optional, A function returning a bool to determine if the achievement is visible or not. Default is unlocked.

  • onComplete() - optional, this function will be called when the achievement is completed.

  • style: Optional, Applies CSS to this achievement, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings)

  • layer: Assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

  • id: Assigned automagically. It's the "key" which the achievement was stored under, for convenient access. The achievement in the example's id is 11.

  • goalTooltip: optional, depracated Appears when the achievement is hovered over and locked, overrides the basic tooltip. This is to display the goal (or a hint). It can also be a function that returns updating text. Can use basic HTML.

  • doneTooltip: optional, depracated Appears when the achievement is hovered over and completed, overrides the basic tooltip. This can display what the player achieved (the goal), and the rewards, if any. It can also be a function that returns updating text. Can use basic HTML.

- + }

Each achievement should have an id where the first digit is the row and the second digit is the column. Individual achievement can have these features:

  • name: optional, displayed at the top of the achievement. The only visible text. It can also be a function that returns updating text. Can use basic HTML.

  • done(): A function returning a boolean to determine if the achievement should be awarded.

  • tooltip: Default tooltip for the achievement, appears when it is hovered over. Should convey the goal and any reward for completing the achievement. It can also be a function that returns updating text. Can use basic HTML.

  • effect(): optional, A function that calculates and returns the current values of any bonuses from the achievement. Can return a value or an object containing multiple values.

  • unlocked(): optional, A function returning a bool to determine if the achievement is visible or not. Default is unlocked.

  • onComplete() - optional, this function will be called when the achievement is completed.

  • style: Optional, Applies CSS to this achievement, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings)

  • layer: Assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

  • id: Assigned automagically. It's the "key" which the achievement was stored under, for convenient access. The achievement in the example's id is 11.

  • goalTooltip: optional, depracated Appears when the achievement is hovered over and locked, overrides the basic tooltip. This is to display the goal (or a hint). It can also be a function that returns updating text. Can use basic HTML.

  • doneTooltip: optional, depracated Appears when the achievement is hovered over and completed, overrides the basic tooltip. This can display what the player achieved (the goal), and the rewards, if any. It can also be a function that returns updating text. Can use basic HTML.

+ \ No newline at end of file diff --git a/public/gamedevtree/docs/bars.html b/public/gamedevtree/docs/bars.html index a1f86f96..9651f484 100644 --- a/public/gamedevtree/docs/bars.html +++ b/public/gamedevtree/docs/bars.html @@ -8,11 +8,11 @@ - + - - + + @@ -312,8 +312,8 @@ etc } etc - }

Features:

  • direction: UP, DOWN, LEFT, or RIGHT (not Strings). Determines the direction that the bar is filled as it progresses. RIGHT means from left to right.

  • width, height: The size in pixels of the bar, but as Numbers (no "px" at the end)

  • progress(): A function that returns the portion of the bar that is filled, from "empty" at 0 to "full" at 1. (Nothing bad happens if the value goes out of these bounds, and it can be a number or Decimal).

  • display(): optional, A function that returns text to be displayed on top of the bar, can use HTML.

  • unlocked(): optional, A function returning a bool to determine if the bar is visible or not. Default is unlocked.

  • baseStyle, fillStyle, borderStyle, textStyle: Optional, Apply CSS to the unfilled portion, filled portion, border, and display text on the bar, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

  • layer: Assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

  • id: Assigned automagically. It's the "key" which the bar was stored under, for convenient access. The bar in the example's id is "bigBar".

- + }

Features:

  • direction: UP, DOWN, LEFT, or RIGHT (not Strings). Determines the direction that the bar is filled as it progresses. RIGHT means from left to right.

  • width, height: The size in pixels of the bar, but as Numbers (no "px" at the end)

  • progress(): A function that returns the portion of the bar that is filled, from "empty" at 0 to "full" at 1. (Nothing bad happens if the value goes out of these bounds, and it can be a number or Decimal).

  • display(): optional, A function that returns text to be displayed on top of the bar, can use HTML.

  • unlocked(): optional, A function returning a bool to determine if the bar is visible or not. Default is unlocked.

  • baseStyle, fillStyle, borderStyle, textStyle: Optional, Apply CSS to the unfilled portion, filled portion, border, and display text on the bar, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

  • layer: Assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

  • id: Assigned automagically. It's the "key" which the bar was stored under, for convenient access. The bar in the example's id is "bigBar".

+ \ No newline at end of file diff --git a/public/gamedevtree/docs/basic-layer-breakdown.html b/public/gamedevtree/docs/basic-layer-breakdown.html index 2b75291b..9b9c03a9 100644 --- a/public/gamedevtree/docs/basic-layer-breakdown.html +++ b/public/gamedevtree/docs/basic-layer-breakdown.html @@ -8,11 +8,11 @@ - + - - + + @@ -333,8 +333,8 @@ }, layerShown() {return true}, // Returns a bool for if this layer's node should be visible in the tree. - }, - + }, + \ No newline at end of file diff --git a/public/gamedevtree/docs/buyables.html b/public/gamedevtree/docs/buyables.html index ac05d617..07f3bff7 100644 --- a/public/gamedevtree/docs/buyables.html +++ b/public/gamedevtree/docs/buyables.html @@ -8,11 +8,11 @@ - + - - + + @@ -319,8 +319,8 @@ etc } etc - }

Features:

  • title: optional, displayed at the top in a larger font It can also be a function that returns updating text.

  • cost(): cost for buying the next buyable. Can have an optional argument "x" to calculate the cost of the x+1th object, but needs to use "current amount" as a default value for x. (x is a Decimal). Can return an object if there are multiple currencies.

  • effect(): optional, A function that calculates and returns the current values of bonuses of this buyable. Can return a value or an object containing multiple values.

  • display(): A function returning everything that should be displayed on the buyable after the title, likely including the description, amount bought, cost, and current effect. Can use basic HTML.

  • unlocked(): optional, A function returning a bool to determine if the buyable is visible or not. Default is unlocked.

  • canAfford(): A function returning a bool to determine if you can buy one of the buyables.

  • buy(): A function that implements buying one of the buyable, including spending the currency.

  • buyMax(): optional, A function that implements buying as many of the buyable as possible.

  • style: Optional, Applies CSS to this buyable, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings)

  • layer: Assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

  • id: Assigned automagically. It's the "key" which the buyable was stored under, for convenient access. The buyable in the example's id is 11.

Sell One/Sell All:

Including a sellOne or sellAll function will cause an additional button to appear beneath the buyable. They are functionally identical, but "sell one" appears above "sell all". You can also use them for other things.

sellOne/sellAll(): optional, Called when the button is pressed. The standard use would be to decrease/reset the amount of the buyable, And possibly return some currency to the player.

canSellOne/canSellAll(): optional, booleans determining whether or not to show the buttons. If "canSellOne/All" is absent but "sellOne/All" is present, the appropriate button will always show.

- + }

Features:

  • title: optional, displayed at the top in a larger font It can also be a function that returns updating text.

  • cost(): cost for buying the next buyable. Can have an optional argument "x" to calculate the cost of the x+1th object, but needs to use "current amount" as a default value for x. (x is a Decimal). Can return an object if there are multiple currencies.

  • effect(): optional, A function that calculates and returns the current values of bonuses of this buyable. Can return a value or an object containing multiple values.

  • display(): A function returning everything that should be displayed on the buyable after the title, likely including the description, amount bought, cost, and current effect. Can use basic HTML.

  • unlocked(): optional, A function returning a bool to determine if the buyable is visible or not. Default is unlocked.

  • canAfford(): A function returning a bool to determine if you can buy one of the buyables.

  • buy(): A function that implements buying one of the buyable, including spending the currency.

  • buyMax(): optional, A function that implements buying as many of the buyable as possible.

  • style: Optional, Applies CSS to this buyable, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings)

  • layer: Assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

  • id: Assigned automagically. It's the "key" which the buyable was stored under, for convenient access. The buyable in the example's id is 11.

Sell One/Sell All:

Including a sellOne or sellAll function will cause an additional button to appear beneath the buyable. They are functionally identical, but "sell one" appears above "sell all". You can also use them for other things.

sellOne/sellAll(): optional, Called when the button is pressed. The standard use would be to decrease/reset the amount of the buyable, And possibly return some currency to the player.

canSellOne/canSellAll(): optional, booleans determining whether or not to show the buttons. If "canSellOne/All" is absent but "sellOne/All" is present, the appropriate button will always show.

+ \ No newline at end of file diff --git a/public/gamedevtree/docs/challenges.html b/public/gamedevtree/docs/challenges.html index d58fcc61..b42b97cb 100644 --- a/public/gamedevtree/docs/challenges.html +++ b/public/gamedevtree/docs/challenges.html @@ -8,11 +8,11 @@ - + - - + + @@ -314,8 +314,8 @@ etc } etc - }

Each challenge should have an id where the first digit is the row and the second digit is the column. Individual Challenges can have these features:

  • name: Name of the challenge, can be a string or a function. Can use basic HTML.

  • challengeDescription: A description of what makes the challenge a challenge. You will need to implement these elsewhere It can also be a function that returns updating text. Can use basic HTML.

  • rewardDescription: A description of the reward's effect. You will also have to implement the effect where it is applied. It can also be a function that returns updating text. Can use basic HTML.

  • rewardEffect(): optional, A function that calculates and returns the current values of any bonuses from the reward. Can return a value or an object containing multiple values. Can use basic HTML.

  • rewardDisplay(): optional, A function that returns a display of the current effects of the reward with formatting. Default behavior is to just display the a number appropriately formatted.

  • goal: A Decimal for the amount of currency required to beat the challenge. By default, the goal is in basic Points. The goal can also be a function if its value changes.

  • unlocked(): optional, A function returning a bool to determine if the challenge is visible or not. Default is unlocked.

  • onComplete() - optional, this function will be called when the challenge is completed when previously incomplete.

  • countsAs: optional, If a challenge combines the effects of other challenges in this layer, you can use this. An array of challenge ids. The player is effectively in all of those challenges when in the current one.

By default, challenges use basic Points for the goal. You can change that using these features.

  • currencyDisplayName: optional, the name to display for the currency for the goal

  • currencyInternalName: optional, the internal name for that currency

  • currencyLayer: optional, the internal name of the layer that currency is stored in. If it's not in a layer, omit. If it's not stored directly in a layer, instead use the next feature.

  • currencyLocation: optional, if your currency is stored in something inside a layer (e.g. a buyable's amount), you can access it this way. This is a function returning the object in "player" that contains the value (like player[this.layer].buyables)

  • completionLimit: optional, the amount of times you can complete this challenge. Default is 1 completion.

  • style: Optional, Applies CSS to this challenge, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings)

  • layer: Assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

  • id: Assigned automagically. It's the "key" which the challenge was stored under, for convenient access. The challenge in the example's id is 11.

- + }

Each challenge should have an id where the first digit is the row and the second digit is the column. Individual Challenges can have these features:

  • name: Name of the challenge, can be a string or a function. Can use basic HTML.

  • challengeDescription: A description of what makes the challenge a challenge. You will need to implement these elsewhere It can also be a function that returns updating text. Can use basic HTML.

  • rewardDescription: A description of the reward's effect. You will also have to implement the effect where it is applied. It can also be a function that returns updating text. Can use basic HTML.

  • rewardEffect(): optional, A function that calculates and returns the current values of any bonuses from the reward. Can return a value or an object containing multiple values. Can use basic HTML.

  • rewardDisplay(): optional, A function that returns a display of the current effects of the reward with formatting. Default behavior is to just display the a number appropriately formatted.

  • goal: A Decimal for the amount of currency required to beat the challenge. By default, the goal is in basic Points. The goal can also be a function if its value changes.

  • unlocked(): optional, A function returning a bool to determine if the challenge is visible or not. Default is unlocked.

  • onComplete() - optional, this function will be called when the challenge is completed when previously incomplete.

  • countsAs: optional, If a challenge combines the effects of other challenges in this layer, you can use this. An array of challenge ids. The player is effectively in all of those challenges when in the current one.

By default, challenges use basic Points for the goal. You can change that using these features.

  • currencyDisplayName: optional, the name to display for the currency for the goal

  • currencyInternalName: optional, the internal name for that currency

  • currencyLayer: optional, the internal name of the layer that currency is stored in. If it's not in a layer, omit. If it's not stored directly in a layer, instead use the next feature.

  • currencyLocation: optional, if your currency is stored in something inside a layer (e.g. a buyable's amount), you can access it this way. This is a function returning the object in "player" that contains the value (like player[this.layer].buyables)

  • completionLimit: optional, the amount of times you can complete this challenge. Default is 1 completion.

  • style: Optional, Applies CSS to this challenge, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings)

  • layer: Assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

  • id: Assigned automagically. It's the "key" which the challenge was stored under, for convenient access. The challenge in the example's id is 11.

+ \ No newline at end of file diff --git a/public/gamedevtree/docs/clickables.html b/public/gamedevtree/docs/clickables.html index d75b5ed3..9fd3fa16 100644 --- a/public/gamedevtree/docs/clickables.html +++ b/public/gamedevtree/docs/clickables.html @@ -8,11 +8,11 @@ - + - - + + @@ -318,8 +318,8 @@ etc } etc - }

Features:

  • title: optional, displayed at the top in a larger font It can also be a function that returns updating text.

  • effect(): optional, A function that calculates and returns the current values of bonuses of this clickable. Can return a value or an object containing multiple values.

  • display(): A function returning everything that should be displayed on the clickable after the title, likely changing based on its state. Can use basic HTML.

  • unlocked(): optional, A function returning a bool to determine if the clickable is visible or not. Default is unlocked.

  • canClick(): A function returning a bool to determine if you can click the clickable.

  • onClick(): A function that implements clicking one of the clickable.

  • style: Optional, Applies CSS to this clickable, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings)

  • layer: Assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

  • id: Assigned automagically. It's the "key" which the clickable was stored under, for convenient access. The clickable in the example's id is 11.

- + }

Features:

  • title: optional, displayed at the top in a larger font It can also be a function that returns updating text.

  • effect(): optional, A function that calculates and returns the current values of bonuses of this clickable. Can return a value or an object containing multiple values.

  • display(): A function returning everything that should be displayed on the clickable after the title, likely changing based on its state. Can use basic HTML.

  • unlocked(): optional, A function returning a bool to determine if the clickable is visible or not. Default is unlocked.

  • canClick(): A function returning a bool to determine if you can click the clickable.

  • onClick(): A function that implements clicking one of the clickable.

  • style: Optional, Applies CSS to this clickable, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings)

  • layer: Assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

  • id: Assigned automagically. It's the "key" which the clickable was stored under, for convenient access. The clickable in the example's id is 11.

+ \ No newline at end of file diff --git a/public/gamedevtree/docs/custom-tab-layouts.html b/public/gamedevtree/docs/custom-tab-layouts.html index 19b3310e..f18e7ba8 100644 --- a/public/gamedevtree/docs/custom-tab-layouts.html +++ b/public/gamedevtree/docs/custom-tab-layouts.html @@ -8,11 +8,11 @@ - + - - + + @@ -314,8 +314,8 @@ {"color": "red", "font-size": "32px", "font-family": "Comic Sans MS"}], "blank", ["toggle", ["c", "beep"]], - "milestones", "blank", "blank", "upgrades"]

It is a list of components, which can be either just a name, or an array with arguments. If it's an array, the first item is the name of the component, the second is the data passed into it, and the third (optional) applies a CSS style to it with a "CSS object", where the keys are CSS attributes.

These are the existing components, but you can create more in v.js:

  • display-text: Displays some text (can use basic HTML). The argument is the text to display. It can also be a function that returns updating text.

  • raw-html: Displays some basic HTML, can also be a function.

  • blank: Adds empty space. The default dimensions are 8px x 17px. The argument changes the dimensions. If it's a single value (e.g. "20px"), that determines the height. If you have a pair of arguments, the first is width and the second is height.

  • row: Display a list of components horizontally. The argument is an array of components in the tab layout format.

  • column: Display a list of components vertically. The argument is an array of components in the tab layout format. This is useful to display columns within a row.

  • main-display: The text that displays the main currency for the layer and its effects.

  • resource-display: The text that displays the currency that this layer is based on, as well as the best and/or total values for this layer's prestige currency (if they are put in startData for this layer)

  • prestige-button: The argument is a string that the prestige button should say before the amount of currency you will gain. It can also be a function that returns updating text.

  • upgrades, milestones, challs, achievements: Display the upgrades, milestones, and challenges for a layer, as appropriate.

  • buyables, clickables: Display all of the buyables/clickables for this layer, as appropriate. The argument optional, and is the size of the boxes in pixels.

  • microtabs: Display a set of subtabs for an area. The argument is the name of the set of microtabs in the "microtabs" feature.

  • bar: Display a bar. The argument is the id of the bar to display.

  • infobox: Display an infobox. The argument is the id of the infobox to display.

  • toggle: A toggle button that toggles a bool value. The data is a pair that identifies what bool to toggle, [layer, id]

The rest of the components are sub-components. They can be used just like other components, but are typically part of another component.

  • upgrade, milestone, chall, buyable, clickable, achievement: An individual upgrade, challenge, etc. The argument is the id. This can be used if you want to have upgrades split up across multiple subtabs, for example.

  • respec-button, master-button: The respec and master buttons for buyables and clickables, respectively.

  • sell-one, sell-all: The "sell one" and "sell all" for buyables, respectively. The argument is the id of the buyable.

- + "milestones", "blank", "blank", "upgrades"]

It is a list of components, which can be either just a name, or an array with arguments. If it's an array, the first item is the name of the component, the second is the data passed into it, and the third (optional) applies a CSS style to it with a "CSS object", where the keys are CSS attributes.

These are the existing components, but you can create more in v.js:

  • display-text: Displays some text (can use basic HTML). The argument is the text to display. It can also be a function that returns updating text.

  • raw-html: Displays some basic HTML, can also be a function.

  • blank: Adds empty space. The default dimensions are 8px x 17px. The argument changes the dimensions. If it's a single value (e.g. "20px"), that determines the height. If you have a pair of arguments, the first is width and the second is height.

  • row: Display a list of components horizontally. The argument is an array of components in the tab layout format.

  • column: Display a list of components vertically. The argument is an array of components in the tab layout format. This is useful to display columns within a row.

  • main-display: The text that displays the main currency for the layer and its effects.

  • resource-display: The text that displays the currency that this layer is based on, as well as the best and/or total values for this layer's prestige currency (if they are put in startData for this layer)

  • prestige-button: The argument is a string that the prestige button should say before the amount of currency you will gain. It can also be a function that returns updating text.

  • upgrades, milestones, challs, achievements: Display the upgrades, milestones, and challenges for a layer, as appropriate.

  • buyables, clickables: Display all of the buyables/clickables for this layer, as appropriate. The argument optional, and is the size of the boxes in pixels.

  • microtabs: Display a set of subtabs for an area. The argument is the name of the set of microtabs in the "microtabs" feature.

  • bar: Display a bar. The argument is the id of the bar to display.

  • infobox: Display an infobox. The argument is the id of the infobox to display.

  • toggle: A toggle button that toggles a bool value. The data is a pair that identifies what bool to toggle, [layer, id]

The rest of the components are sub-components. They can be used just like other components, but are typically part of another component.

  • upgrade, milestone, chall, buyable, clickable, achievement: An individual upgrade, challenge, etc. The argument is the id. This can be used if you want to have upgrades split up across multiple subtabs, for example.

  • respec-button, master-button: The respec and master buttons for buyables and clickables, respectively.

  • sell-one, sell-all: The "sell one" and "sell all" for buyables, respectively. The argument is the id of the buyable.

+ \ No newline at end of file diff --git a/public/gamedevtree/docs/getting-started.html b/public/gamedevtree/docs/getting-started.html index dbb4ec3c..cbae0c78 100644 --- a/public/gamedevtree/docs/getting-started.html +++ b/public/gamedevtree/docs/getting-started.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

Getting started

Welcome to The Modding Tree!

Using the Modding Tree, at its simplest level, just requires getting a copy of it onto your computer. However, if you do it the right way, it will help in many ways.

Don't let the word "Github" scare you away. It's actually much easier to use than most people think, especially because most people use it the hard way. The key is Github Desktop, which lets you do everything you need to, without even touching the command line.

The benefits of using Github:

  • It makes it much, much easier to update The Modding Tree.
  • You can share your work without any extra effort using githack, or with a bit more effort, set up a github.io site.
  • It lets you undo changes to your code, and to have multiple versions of it.
  • It lets you collaborate with other people, if you want to.

Getting set up with Github and The Modding Tree:

  1. Install Github Desktop and Visual Studio Code.

  2. Make a Github account. You can handle this on your own.

  3. Log in on your browser, and go back to The Modding Tree page. At the top right, there should be a button that says "fork". Click on it, and then on your username. You now have your own fork, or copy, of The Modding Tree.

  4. Open Github Desktop and log in. Ignore everything else and choose "clone a repository". A "repository" is basically a "Github project", like The Modding Tree. "Cloning" is downloading a copy of the repository to your computer.

  5. Look for The Modding Tree in the list of repositiories (it should be the only one) and click "clone".

  6. Select that you're using it for your own purposes, and click continue. It will download the files and handle everything.

Using your repository

  1. Click on "show in finder" to the right, and then open index.html. This will let you view and test your project!

  2. To edit your project, click "open in VSCode" in Github Desktop.

  3. Open mod.js in VSCode, and look at the top part where it says "modInfo". On the lines below that, change the mod's name to whatever you want, and change the id as well. (It can be any string value, and it's used to determine where the savefile is. Make it something that's probably unique, and don't change it again later.)

  4. Save game.js, and then reload index.html. The title on the tab, as well as on the info page, will now be the new ones!

  5. Go back to Github Desktop. It's time to save your changes into the git system by making a "commit".

  6. At the bottom right corner, add a summary of your changes, and then click "commit to master".

  7. Finally, at the top middle, click "push origin" to push your changes out onto the online repository.

  8. You can view your project on line, or share it with others, by going to https://raw.githack.com/[YOUR-GITHUB-USERNAME]/The-Modding-Tree/master/index.html

And now, you have successfully used Github! You can look at the documentation to see how The Modding Tree's system works and to make your mod a reality.

- +

Getting started

Welcome to The Modding Tree!

Using the Modding Tree, at its simplest level, just requires getting a copy of it onto your computer. However, if you do it the right way, it will help in many ways.

Don't let the word "Github" scare you away. It's actually much easier to use than most people think, especially because most people use it the hard way. The key is Github Desktop, which lets you do everything you need to, without even touching the command line.

The benefits of using Github:

  • It makes it much, much easier to update The Modding Tree.
  • You can share your work without any extra effort using githack, or with a bit more effort, set up a github.io site.
  • It lets you undo changes to your code, and to have multiple versions of it.
  • It lets you collaborate with other people, if you want to.

Getting set up with Github and The Modding Tree:

  1. Install Github Desktop and Visual Studio Code.

  2. Make a Github account. You can handle this on your own.

  3. Log in on your browser, and go back to The Modding Tree page. At the top right, there should be a button that says "fork". Click on it, and then on your username. You now have your own fork, or copy, of The Modding Tree.

  4. Open Github Desktop and log in. Ignore everything else and choose "clone a repository". A "repository" is basically a "Github project", like The Modding Tree. "Cloning" is downloading a copy of the repository to your computer.

  5. Look for The Modding Tree in the list of repositiories (it should be the only one) and click "clone".

  6. Select that you're using it for your own purposes, and click continue. It will download the files and handle everything.

Using your repository

  1. Click on "show in finder" to the right, and then open index.html. This will let you view and test your project!

  2. To edit your project, click "open in VSCode" in Github Desktop.

  3. Open mod.js in VSCode, and look at the top part where it says "modInfo". On the lines below that, change the mod's name to whatever you want, and change the id as well. (It can be any string value, and it's used to determine where the savefile is. Make it something that's probably unique, and don't change it again later.)

  4. Save game.js, and then reload index.html. The title on the tab, as well as on the info page, will now be the new ones!

  5. Go back to Github Desktop. It's time to save your changes into the git system by making a "commit".

  6. At the bottom right corner, add a summary of your changes, and then click "commit to master".

  7. Finally, at the top middle, click "push origin" to push your changes out onto the online repository.

  8. You can view your project on line, or share it with others, by going to https://raw.githack.com/[YOUR-GITHUB-USERNAME]/The-Modding-Tree/master/index.html

And now, you have successfully used Github! You can look at the documentation to see how The Modding Tree's system works and to make your mod a reality.

+ \ No newline at end of file diff --git a/public/gamedevtree/docs/infoboxes.html b/public/gamedevtree/docs/infoboxes.html index 44c3617f..0206a934 100644 --- a/public/gamedevtree/docs/infoboxes.html +++ b/public/gamedevtree/docs/infoboxes.html @@ -8,11 +8,11 @@ - + - - + + @@ -312,8 +312,8 @@ etc } etc - }

Features:

  • title: The text displayed above the main box. Can be a function to be dynamic, and can use basic HTML.

  • body: The text displayed inside the box. Can be a function to be dynamic, and can use basic HTML.

  • style, titleStyle, bodyStyle: Optional, Apply CSS to the infobox, or to the title button or body of the infobox, in the form of an object where the keys are CSS attributes, and the values are the Values for those attributes (both as strings).

  • unlocked(): optional, A function returning a bool to determine if the infobox is visible or not. Default is unlocked.

  • layer: Assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

  • id: Assigned automagically. It's the "key" which the bar was stored under, for convenient access. The bar in the example's id is "bigBar".

- + }

Features:

  • title: The text displayed above the main box. Can be a function to be dynamic, and can use basic HTML.

  • body: The text displayed inside the box. Can be a function to be dynamic, and can use basic HTML.

  • style, titleStyle, bodyStyle: Optional, Apply CSS to the infobox, or to the title button or body of the infobox, in the form of an object where the keys are CSS attributes, and the values are the Values for those attributes (both as strings).

  • unlocked(): optional, A function returning a bool to determine if the infobox is visible or not. Default is unlocked.

  • layer: Assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

  • id: Assigned automagically. It's the "key" which the bar was stored under, for convenient access. The bar in the example's id is "bigBar".

+ \ No newline at end of file diff --git a/public/gamedevtree/docs/layer-features.html b/public/gamedevtree/docs/layer-features.html index adadf1d5..d9f93418 100644 --- a/public/gamedevtree/docs/layer-features.html +++ b/public/gamedevtree/docs/layer-features.html @@ -8,11 +8,11 @@ - + - - + + @@ -321,8 +321,8 @@
  • update(diff): optional, this function is called every game tick. Use it for any passive resource production or time-based things. diff is the time since the last tick. Suggestion: use addPoints(layer, gain) when generating points to automatically update the best and total amounts.

  • automate(): optional, this function is called every game tick, after production. Use it to activate any autobuyers or auto-resets or similar on this layer, if appropriate.

  • resetsNothing: optional, returns true if this layer shouldn't trigger any resets when you prestige.

  • increaseUnlockOrder: optional, an array of layer ids. When this layer is unlocked for the first time, the unlockOrder value for any not-yet-unlocked layers in this list increases. This can be used to make them harder to unlock.

  • shouldNotify: optional, a function to return true if this layer should be highlighted in the tree. The layer will automatically be highlighted if you can buy an upgrade whether you have this or not.

  • componentStyles: optional, An object that contains a set of functions returning CSS objects. Each of these will be applied to any components on the layer with the type of its id. Example:

  • js
            componentStyles: {
                 "challenge"() {return {'height': '200px'}},
                 "prestige-button"() {return {'color': '#AA66AA'}},
    -        },

    Custom Prestige type

    • getResetGain(): For custom prestige type, Returns how many points you should get if you reset now. You can call getResetGain(this.layer, useType = "static") or similar to calculate what your gain would be under another prestige type (provided you have all of the required features in the layer.)

    • getNextAt(canMax=false): For custom prestige type, Returns how many of the base currency you need to get to the next point. canMax is an optional variable used with Static-ish layers to differentiate between if it's looking for the first point you can reset at, or the requirement for any gain at all. (Supporting both is good). You can also call getNextAt(this.layer, canMax=false, useType = "static") or similar to calculate what your next at would be under another prestige type (provided you have all of the required features in the layer.)

    • canReset(): For custom prestige type, return true only if you have the resources required to do a prestige here.

    - + },

    Custom Prestige type

    • getResetGain(): For custom prestige type, Returns how many points you should get if you reset now. You can call getResetGain(this.layer, useType = "static") or similar to calculate what your gain would be under another prestige type (provided you have all of the required features in the layer.)

    • getNextAt(canMax=false): For custom prestige type, Returns how many of the base currency you need to get to the next point. canMax is an optional variable used with Static-ish layers to differentiate between if it's looking for the first point you can reset at, or the requirement for any gain at all. (Supporting both is good). You can also call getNextAt(this.layer, canMax=false, useType = "static") or similar to calculate what your next at would be under another prestige type (provided you have all of the required features in the layer.)

    • canReset(): For custom prestige type, return true only if you have the resources required to do a prestige here.

    + \ No newline at end of file diff --git a/public/gamedevtree/docs/main-mod-info.html b/public/gamedevtree/docs/main-mod-info.html index 25110eca..7eca4343 100644 --- a/public/gamedevtree/docs/main-mod-info.html +++ b/public/gamedevtree/docs/main-mod-info.html @@ -8,11 +8,11 @@ - + - - + + @@ -310,8 +310,8 @@ var doNotCallTheseFunctionsEveryTick = ["doReset", "buy", "onPurchase", "blowUpEverything"]
    • getStartPoints(): A function to determine the amount of points the player starts with after a reset. (returns a Decimal value)

    • canGenPoints(): A function returning a boolean for if points should be generated. Use this if you want an upgrade to unlock generating points.

    • getPointGen(): A function that calculates your points per second. Anything that affects your point gain should go into the calculation here.

    • addedPlayerData(): A function that returns any non-layer-related data that you want to be added to the save data and "player" object.

    js
    function addedPlayerData() { return {
     	weather: "Yes",
     	happiness: new Decimal(72),
    -}}
    • displayThings: An array of functions used to display extra things at the top of the tree tab. Each function returns a string, which is a line to display (with basic HTML support). If a function returns nothing, nothing is displayed (and it doesn't take up a line).

    • isEndgame(): A function to determine if the player has reached the end of the game, at which point the "you win!" screen appears.

    Less important things beyond this point!

    • maxTickLength(): Returns the maximum tick length, in milliseconds. Only really useful if you have something that reduces over time, which long ticks mess up (usually a challenge).
    - +}}
    • displayThings: An array of functions used to display extra things at the top of the tree tab. Each function returns a string, which is a line to display (with basic HTML support). If a function returns nothing, nothing is displayed (and it doesn't take up a line).

    • isEndgame(): A function to determine if the player has reached the end of the game, at which point the "you win!" screen appears.

    Less important things beyond this point!

    • maxTickLength(): Returns the maximum tick length, in milliseconds. Only really useful if you have something that reduces over time, which long ticks mess up (usually a challenge).
    + \ No newline at end of file diff --git a/public/gamedevtree/docs/milestones.html b/public/gamedevtree/docs/milestones.html index fb86234e..776110ce 100644 --- a/public/gamedevtree/docs/milestones.html +++ b/public/gamedevtree/docs/milestones.html @@ -8,11 +8,11 @@ - + - - + + @@ -312,8 +312,8 @@ } etc }

    You can use hasMilestone(layer, id) to determine if the player has a given milestone

    Milestone features:

    • requirementDesc: A string describing the requirement for unlocking this milestone. Suggestion: Use a "total". It can also be a function that returns updating text. Can use basic HTML.

    • effectDesc: A string describing the reward for having the milestone. You will have to implement the reward elsewhere. It can also be a function that returns updating text. Can use basic HTML.

    • done(): A function returning a boolean to determine if the milestone should be awarded.

    • toggles: optional, Creates toggle buttons that appear on the milestone when it is unlocked. The toggles can toggle a given boolean value in a layer. It is defined as an array of paired items, one pair per toggle. The first is the internal name of the layer the value being toggled is stored in, and the second is the internal name of the variable to toggle. (e.g. [["b", "auto"], ["g", "auto"])

           **Tip:** Toggles are not de-set if the milestone becomes locked! In this case, you should also check if the player has the milestone.
      -
    • style: Optional, Applies CSS to this milestone, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings)

    • unlocked(): Optional A function returning a boolean to determine if the milestone should be shown. If absent, it is always shown.

    • layer: Assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

    • id: Assigned automagically. It's the "key" which the milestone was stored under, for convenient access. The milestone in the example's id is 0.

    - +
  • style: Optional, Applies CSS to this milestone, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings)

  • unlocked(): Optional A function returning a boolean to determine if the milestone should be shown. If absent, it is always shown.

  • layer: Assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

  • id: Assigned automagically. It's the "key" which the milestone was stored under, for convenient access. The milestone in the example's id is 0.

  • + \ No newline at end of file diff --git a/public/gamedevtree/docs/subtabs-and-microtabs.html b/public/gamedevtree/docs/subtabs-and-microtabs.html index 0c176a83..bc12a8f7 100644 --- a/public/gamedevtree/docs/subtabs-and-microtabs.html +++ b/public/gamedevtree/docs/subtabs-and-microtabs.html @@ -8,11 +8,11 @@ - + - - + + @@ -328,8 +328,8 @@ otherStuff: { // There could be another set of microtabs here } - },

    Normal subtabs and microtab subtabs both use the same features:

    Features:

    • content: The tab layout code for the subtab, in the tab layout format

    • style: Optional, Applies CSS to the whole subtab when switched to, in the form of an "CSS Object", where the keys are CSS attributes, and the values are the values for those attributes (both as strings)

    • buttonStyle: Optional, A CSS object, which affects the appearance of the button for that subtab.

    • unlocked(): Optional, a function to determine if the button for this subtab should be visible. By default, a subtab is always unlocked. (You can't use the "this" keyword in this function.)

    - + },

    Normal subtabs and microtab subtabs both use the same features:

    Features:

    • content: The tab layout code for the subtab, in the tab layout format

    • style: Optional, Applies CSS to the whole subtab when switched to, in the form of an "CSS Object", where the keys are CSS attributes, and the values are the values for those attributes (both as strings)

    • buttonStyle: Optional, A CSS object, which affects the appearance of the button for that subtab.

    • unlocked(): Optional, a function to determine if the button for this subtab should be visible. By default, a subtab is always unlocked. (You can't use the "this" keyword in this function.)

    + \ No newline at end of file diff --git a/public/gamedevtree/docs/updating-tmt.html b/public/gamedevtree/docs/updating-tmt.html index 5a27c914..711c463e 100644 --- a/public/gamedevtree/docs/updating-tmt.html +++ b/public/gamedevtree/docs/updating-tmt.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

    Updating The Modding Tree

    This tutorial assumes that you have used the Getting Started Tutorial, and are using Github Desktop and VSCode for your mod.

    Here's what you have to do when there's a TMT update:

    1. Look at the changelog. It will warn you if the update will break anything or require any changes. Decide if you want to try to update.

    2. Open Github Desktop, and at the top middle, click "fetch origin". This will make Github Desktop get information about the update.

    3. Click where it says "current branch: master" at the top middle, and at the bottom of the thing that appears, click "choose a branch to merge into master.

    4. Select upstream/master. It will likely say there are conflicts, but you have tools to resolve them. Click "Merge upstream/master into master".

    5. A conflict happens when the things you're trying to merge have both made changes in the same place. Click "open in Visual Studio Code" next to the first file.

    6. Scroll down through the file, and look for the parts highlighted in red and green. One of these is your code, and the other is some code that will be modified by the update. Do your best to try to edit things to keep the updated changes, but keep your content.

    7. Continue to do this for all remaining challenges.

    8. Do any other changes required by the update, run the game, fix issues, etc.

    - +

    Updating The Modding Tree

    This tutorial assumes that you have used the Getting Started Tutorial, and are using Github Desktop and VSCode for your mod.

    Here's what you have to do when there's a TMT update:

    1. Look at the changelog. It will warn you if the update will break anything or require any changes. Decide if you want to try to update.

    2. Open Github Desktop, and at the top middle, click "fetch origin". This will make Github Desktop get information about the update.

    3. Click where it says "current branch: master" at the top middle, and at the bottom of the thing that appears, click "choose a branch to merge into master.

    4. Select upstream/master. It will likely say there are conflicts, but you have tools to resolve them. Click "Merge upstream/master into master".

    5. A conflict happens when the things you're trying to merge have both made changes in the same place. Click "open in Visual Studio Code" next to the first file.

    6. Scroll down through the file, and look for the parts highlighted in red and green. One of these is your code, and the other is some code that will be modified by the update. Do your best to try to edit things to keep the updated changes, but keep your content.

    7. Continue to do this for all remaining challenges.

    8. Do any other changes required by the update, run the game, fix issues, etc.

    + \ No newline at end of file diff --git a/public/gamedevtree/docs/upgrades.html b/public/gamedevtree/docs/upgrades.html index b1fa847c..5e364767 100644 --- a/public/gamedevtree/docs/upgrades.html +++ b/public/gamedevtree/docs/upgrades.html @@ -8,11 +8,11 @@ - + - - + + @@ -314,8 +314,8 @@ more features } etc - }

    Each upgrade should have an id where the first digit is the row and the second digit is the column. Individual upgrades can have these features:

    • title: optional, displayed at the top in a larger font It can also be a function that returns updating text. Can use basic HTML.

    • description: A description of the upgrade's effect. You will also have to implement the effect where it is applied. It can also be a function that returns updating text. Can use basic HTML.

    • effect(): optional, A function that calculates and returns the current values of any bonuses from the upgrade. Can return a value or an object containing multiple values.

    • effectDisplay(): optional, A function that returns a display of the current effects of the upgrade with formatting. Default behavior is to just display the a number appropriately formatted. Can use basic HTML.

    • cost: A Decimal for the cost of the upgrade. By default, upgrades cost the main prestige currency for the layer.

    • unlocked(): optional, A function returning a bool to determine if the upgrade is visible or not. Default is unlocked.

    • onPurchase() - optional, this function will be called when the upgrade is purchased. Good for upgrades like "makes this layer act like it was unlocked first".

    By default, upgrades use the main prestige currency for the layer. You can include these to change them (but it needs to be a Decimal):

    • currencyDisplayName: optional, the name to display for the currency for the upgrade

    • currencyInternalName: optional, the internal name for that currency

    • currencyLayer: optional, the internal name of the layer that currency is stored in. If it's not in a layer (like Points), omit. If it's not stored directly in a layer, instead use the next feature.

    • currencyLocation: optional, if your currency is stored in something inside a layer (e.g. a buyable's amount), you can access it this way. This is a function returning the object in "player" that contains the value (like player[this.layer].buyables)

    • style: Optional, Applies CSS to this upgrade, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings)

    • layer: Assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

    • id: Assigned automagically. It's the "key" which the upgrade was stored under, for convenient access. The upgrade in the example's id is 11.

    - + }

    Each upgrade should have an id where the first digit is the row and the second digit is the column. Individual upgrades can have these features:

    • title: optional, displayed at the top in a larger font It can also be a function that returns updating text. Can use basic HTML.

    • description: A description of the upgrade's effect. You will also have to implement the effect where it is applied. It can also be a function that returns updating text. Can use basic HTML.

    • effect(): optional, A function that calculates and returns the current values of any bonuses from the upgrade. Can return a value or an object containing multiple values.

    • effectDisplay(): optional, A function that returns a display of the current effects of the upgrade with formatting. Default behavior is to just display the a number appropriately formatted. Can use basic HTML.

    • cost: A Decimal for the cost of the upgrade. By default, upgrades cost the main prestige currency for the layer.

    • unlocked(): optional, A function returning a bool to determine if the upgrade is visible or not. Default is unlocked.

    • onPurchase() - optional, this function will be called when the upgrade is purchased. Good for upgrades like "makes this layer act like it was unlocked first".

    By default, upgrades use the main prestige currency for the layer. You can include these to change them (but it needs to be a Decimal):

    • currencyDisplayName: optional, the name to display for the currency for the upgrade

    • currencyInternalName: optional, the internal name for that currency

    • currencyLayer: optional, the internal name of the layer that currency is stored in. If it's not in a layer (like Points), omit. If it's not stored directly in a layer, instead use the next feature.

    • currencyLocation: optional, if your currency is stored in something inside a layer (e.g. a buyable's amount), you can access it this way. This is a function returning the object in "player" that contains the value (like player[this.layer].buyables)

    • style: Optional, Applies CSS to this upgrade, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings)

    • layer: Assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

    • id: Assigned automagically. It's the "key" which the upgrade was stored under, for convenient access. The upgrade in the example's id is 11.

    + \ No newline at end of file diff --git a/public/kronos/Old Things/2.0-format-changes.html b/public/kronos/Old Things/2.0-format-changes.html index 92a65d9e..21691be3 100644 --- a/public/kronos/Old Things/2.0-format-changes.html +++ b/public/kronos/Old Things/2.0-format-changes.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

    2.0 format changes

    • Temp format is changed from temp.something[layer] to temp[layer].something, for consistency
    • Challenges are now saved as an object with the amount of completions in each spot. (This will break saves.)
    • effectDisplay in Challenges and Upgrades no longer takes an argument, and neither does effect for Buyables
    • Buyable cost can take an argument for amount of buyables, but it needs to function if no argument is supplied (it should do the cost for the next purchase).
    • Generation of Points now happens in the main game loop (not in a layer update function), enabled by canGenPoints in game.js.
    • Changed fullLayerReset to layerDataReset, which takes an array of names of values to keep

    In addition, many names were changed, mostly expanding abbreviations:

    All instances of:

    • chall -> challenge
    • unl -> unlocked
    • upg -> upgrade (besides CSS)
    • amt -> amount
    • desc -> description
    • resCeil -> roundUpCost
    • order -> unlockOrder
    • incr_order -> increaseUnlockOrder

    Challenges:

    • desc -> challengeDescription
    • reward -> rewardDescription
    • effect -> rewardEffect
    • effectDisplay -> rewardDisplay
    • active -> challengeActive
    - +

    2.0 format changes

    • Temp format is changed from temp.something[layer] to temp[layer].something, for consistency
    • Challenges are now saved as an object with the amount of completions in each spot. (This will break saves.)
    • effectDisplay in Challenges and Upgrades no longer takes an argument, and neither does effect for Buyables
    • Buyable cost can take an argument for amount of buyables, but it needs to function if no argument is supplied (it should do the cost for the next purchase).
    • Generation of Points now happens in the main game loop (not in a layer update function), enabled by canGenPoints in game.js.
    • Changed fullLayerReset to layerDataReset, which takes an array of names of values to keep

    In addition, many names were changed, mostly expanding abbreviations:

    All instances of:

    • chall -> challenge
    • unl -> unlocked
    • upg -> upgrade (besides CSS)
    • amt -> amount
    • desc -> description
    • resCeil -> roundUpCost
    • order -> unlockOrder
    • incr_order -> increaseUnlockOrder

    Challenges:

    • desc -> challengeDescription
    • reward -> rewardDescription
    • effect -> rewardEffect
    • effectDisplay -> rewardDisplay
    • active -> challengeActive
    + \ No newline at end of file diff --git a/public/kronos/README.html b/public/kronos/README.html index 8d0500d0..071c84e6 100644 --- a/public/kronos/README.html +++ b/public/kronos/README.html @@ -8,10 +8,10 @@ - + - + @@ -307,7 +307,7 @@

    Kronos

    Play here.

    Updating the website:

    • git submodule update --remote
    • git add -A
    • git commit -m "Updated kronos"
    • git push
    - + \ No newline at end of file diff --git a/public/kronos/changelog.html b/public/kronos/changelog.html index 927b7470..4dfa3a3b 100644 --- a/public/kronos/changelog.html +++ b/public/kronos/changelog.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

    The Modding Tree changelog:

    v2.5.9.2 - 5/19/21

    • Fixed many issues with things not updating.

    v2.5.9.1 - 5/18/21

    • Made text inputs never give NaNs.

    v2.5.9 - 5/18/21

    • Fixed issue when using text inputs for Numbers.
    • Added particle color feature.
    • Particle speed and dir are updated as it moves.
    • Added setSpeed and setDir for particles.
    • Added more trig functions.

    v2.5.8 - 5/17/21

    • Added makeShinies, which creates a stationary particle in a random spot.
    • Bars will visually update more quickly.
    • Fixed a major particle-related issue.
    • Fixed autoUpgrade.
    • Fixed a minor visual issue with tree nodes.

    v2.5.7 - 5/15/21

    • Added a particle system! Not only can it be used for visual effects, but particles can interact with the mouse. They could be used to create golden cookies or collectables, for example.
    • Added marked feature to buyables, clickables, and challenges. By default, stars multi-completion challenges when maxed.
    • Added 'deactivated' feature to layers, which disables many features.
    • Improved number formatting slightly.

    v2.5.6 - 5/14/21

    • You can now use non-numeric ids for upgrades, buyables, etc.
    • Fixed an exploit that let you buy an extra buyable.
    • Moved basic getter/setter functions to easyAccess.js.

    v2.5.5.2 - 5/12/21

    • Fixed a major issue with buyables.
    • Fixed a variety of tabFormat-related issues.
    • Fixed commas appearing in decimal places (thanks to pg132!)

    v2.5.5.1 - 5/12/21

    • Fixed clickables.

    v2.5.5 - 5/12/21

    • Added grids! They are a grid of buttons which behave the same, but have their own data. Good for inventory grids, map tiles, and more!
    • Added "marked" feature to add a mark to a node. Can be an image instead of a star. (Originally by Jacorb)
    • Added "layer-proxy" component that lets you use components from another layer.
    • Added the ability to display non-whole numbers in main-display.

    v2.5.4 - 5/10/21

    • Added a setting to always use single-tab mode.
    • Added directMult, which multiplies prestige gain after exponents and softcaps. It actually multiplies gain for static layers.
    • Added onEnter and onExit for challenges.
    • Improved displaying numbers between 0.0001 and 0.1.
    • Added documentation on how gainMult/Exp work for static layers.
    • Fixed a visual issue on mobile, thanks to thepaperpilot.
    • Improved documentation in general.

    v2.5.3 - 5/8/21

    • Improved performance of tab formats and bars.
    • Respec confirmation settings are now kept on resets.
    • Improved compatibility with older browsers.
    • Fixed missing pixel on vertical bars.

    v2.5.2.1 - 5/7/21

    • Fixed microtabs making layers highlight incorrectly.

    v2.5.2 - 5/7/21

    • Added glowColor for subtabs.
    • Improved the display for extremely small numbers.
    • Fixed issues in the buyable docs.

    v2.5.1 - 5/7/21

    • Fixed dynamic things in tabFormat not updating.

    v2.5: Dreams Really Do Come True - 5/7/21

    • Optimizations, hopefully a significant amount.
    • Added OOM/s point gen display at high values (thanks to Ducdat!)
    • Only one tab will display if the window is not wide enough (also thanks to Ducdat!)
    • Holding down a buyable's button now buys it continuously.
    • New milestone setting will also show the most recently unlocked milestone. (Also renamed all settings to be clearer)
    • Added an onHold feature for clickables.
    • Layer nodes will be highlighted even if the player is on the same tab.
    • Added customizable node glowColor.
    • Added buyable purchaseLimit.
    • Amount is automatically supplied to buyable cost and effect functions.
    • Locked (not yet visible) milestones no longer take up space. Also fixed hidden milestones taking a tiny bit of space.
    • Re-centered respec buttons.
    • Force-displayed tooltips are not hidden by resets.
    • Added formatting support for very small numbers. Disabled in most places by default because rounding errors might cause issues. Access it with formatSmall, or enable it globally by adding "allowSmall: true" to modInfo.

    v2.4.1 - 4/29/21

    • A number of minor fixes, many thanks to thepaperpilot.
    • The respec confirmation checkbox is now part of the respec-button component. (This also fixes the checkbox appearing when there is no respec button)
    • Added a few undocumented changes to the 2.4 changelog (the two at the bottom)

    v2.4: Rationalized Edition - 4/29/21

    • Completely reworked tooltips. Shift-click a node to force its tooltip to stay displayed. (And hopefully finally fixed flickering!)

    • Added text-input and slider components.

    • Added the ability to toggle respec confirmations.

    • Added custom respec confirmation messages.

    • The red layer highlight will not appear before a layer is unlocked.

    • Added unlocking hotkeys.

    • You no longer need to supply 'rows' and 'cols' for any Big Features.

    • Node symbols can use HTML.

    • Added documentation for the respec button.

    • Added prestigeNotify to subtabs, and prestigeNotify in subtabs also highlights the layer node.

    • The version number no longer contains special characters or irrational numbers.

    • Added ctrlDown and shiftDown variables.

    • Tooltips now use HTML (this means you need to replace any newlines with
      )

    v2.π.1 - 4/7/21

    • Fixed formatting for some larger numbers.
    • Upgrades will expand if there is too much text to display.
    • Fixed styling challenges.
    • No longer attempts to display a base currency when there is none.

    v2.π: Incrementally Updated - 2/5/21

    • Performance improvements.
    • Fixed tooltips overlapping with the top display.
    • Clicking a popup dismisses it immediately.
    • Added support for bulk challenge completions.
    • "Best" is updated automatically.
    • Fixed keeping Decimal values on reset.
    • Code reorganization and style improvements by fudo.

    v2.3.5 - 12/21/20

    • Added resetTime, which tracks the time since a layer prestiged or was reset.
    • A layer node will be highlighted red if one of its subtabs is highlighted red.
    • Fixed issues with keeping challenges, buyables, and clickables on reset.
    • Improved the unlocking of custom layers.
    • Other minor fixes.

    v2.3.4 - 12/16/20

    • Added a node image feature.
    • Resource display now always shows the amount of the currency the layer's gain is based on.
    • Added spacing between tree nodes.
    • Another attempt to fix tooltip flickering.

    v2.3.3 - 12/13/20

    • Fixed the first node in a row always taking up space.
    • layerShown is now optional.
    • All prestige types can now use features for custom prestige types.

    v2.3.2 - 12/13/20

    • Fixed achievement/milestone popups.

    v2.3.1 - 12/12/20

    • Another attempt to fix flickering tooltips.
    • The "this" keyword should work everywhere except tabFormat arrays (although I may have missed some things).
    • Fixed tree branches not updating when scrolling on the right-side tab.
    • Fixed a spacing issue when a node's symbol is ""
    • Removed some old, unneeded files.

    v2.3: Cooler and Newer Edition - 12/10/20

    • Added achievement/milestone popups (thank you to Jacorb for this contribution!)
    • The changelog tab is back, and can be set in mod.js.
    • Layer nodes and respec buttons will not be clicked by pressing "enter".
    • Possible fix for flickering tooltips and strange transitions.
    • The victory screen text is configurable.
    • Added image and textStyle features to achievements.
    • Added an argument to use specific rows in an "upgrades" component.
    • Fixed the comma appearing in the main display when there was no effectDescription
    • Added the ability to easily make a tab that is a collection of layers in subtabs.
    • Improved spacing for embedding layers with subtabs into subtabs.

    v2.2.8 - 12/03/20

    • Double-clicking a layer node brings you to the main subtab for that layer.
    • Attempted to fix challenges visually updating a different way.
    • Added a softcap function for use in formulas.
    • Added displayRow feature, which lets layers be shown somewhere separate from where they are in the reset order (e.g. side layers)
    • Fixed autoupgrade issue.

    v2.2.7 - 11/30/20

    • Added autoUpgrade feature.
    • resource-display now shows resource gain per second if passiveGain is active.
    • Fixed formatting issues on some large numbers.
    • Better support for using classed objects in player and in layers/tmp.
    • Made hard resetting more effective.
    • Removed Herobrine from getStartClickables.

    v2.2.6 - 11/30/20

    • Added goalDescription for challenges and made the new "canComplete" system the standard.
    • Another attempt to fix challenges not visually updating.
    • Fixed side layers not appearing.
    • Fixed getStartClickables again.

    v2.2.5 - 11/29/20

    • Added features for overriding the displays and costs/goals of upgrades and challenges to make them fully custom.
    • best, total, and unlocked are always automatically added to layerData (but best and total will only display if you add them yourself).
    • Fixed getStartClickables.

    v2.2.4 - 11/28/20

    • Added softcap and softcapPower features (for Normal layers)
    • Offline time limit and default max tick length were fixed (previously the limits were 1000x too large)
    • Added fixOldSaves.
    • You can use HTML in main-display.
    • Fixed a number of minor oddities.

    v2.2.3 - 11/28/20

    • Layers will be highlighted if you can finish a challenge.
    • The "can complete challenge" color now overrides the "already completed" color.
    • Button nodes now work as side "layers".
    • Setting a tooltip to "" hides it entirely.

    v2.2.2 - 11/22/20

    • Fixed right half of the screen being unclickable in some circumstances.
    • Fixed tree branches being offset.
    • Fix to lastSafeTab.

    v2.2.1 - 11/7/20

    • Added a small highlight to layers you can meaningfully prestige on.
    • Added passiveGeneration and autoPrestige features to standardize prestige automation. (The old ways still work, but the new ones work better with other things)
    • Improved milestones visually a bit.
    • "best" and "total" are now only displayed if present in startData.
    • Fixed issues with things not updating visually. (Thank you to to Jacorb!)
    • Side layers and button nodes can now be highlighted.
    • Updated docs on the new tree-related features.

    v2.2: Uprooted - 11/7/20

    • You can now embed a layer inside of a subtab or microtab!
    • Added support for hiding or reformatting the tree tab
    • Added non-layer button nodes
    • Added shouldNotify to subtab/microtab buttons. (You can make them highlighted)
    • Added commas to large exponents.
    • Upgrades now only show "currently" if they have an effectDisplay (so not for constant effects).
    • Achievements are part of the default tab format.
    • NaN is now handled more intelligently.
    • Renamed files, and moved less relevant ones to another folder.
    • The "hide completed challenges" setting now only hides challenges at max completions.
    • Thank you to thepaperpilot for fixing errors in docs and improving the infobox appearance!
    • Many other minor fixes.

    v2.1.4 - 10/25/20

    • Added an infobox component. Thank you to thepaperpilot for this contribution!
    • Layer type is now optional, and defaults to "none".
    • Improved the look of bars and tab buttons.
    • Improved spacing between layer nodes (also thanks to thepaperpilot!)
    • Fixed the "blank" component breaking if only specifying the height.
    • Fixed some numbers not displaying with enough digits.
    • Made a few more things able to be functions.
    • A few other minor fixes.

    v2.1.3.1 - 10/21/20

    • Fixed the update function.

    v2.1.3 - 10/21/20

    • gainMult and gainExp are now optional.
    • Layer unlocking is now kept on reset.
    • Game should start up faster.
    • Layer updates now have a determined order and starts with earlier-rowed layers.
    • Automation now has a determined order and starts with later-rowed layers.
    • Fixed issues with resetting clickables and challenges.
    • Commas should no longer appear in the decimal places of a number.
    • Fixed potential issue in displaying the tree.

    v2.1.2 - 10/19/20

    • Added buyUpgrade function (buyUpg still works though)
    • Added author name to modInfo.
    • Fix to crash caused when the name of a subtab or microtab is changed.
    • Fixes to outdated information in docs.
    • Improvements to Discord links.
    • Thank you to thepaperpilot for contributing to this update!

    v2.1.1 - 10/17/20

    • Added resource-display component, which displays the base currency for the prestige layer, as well as the best and/or total of this layer's prestige currency.
    • Fixed the value for the base currency not updating in resource-display.

    v2.1: We should have thought of this sooner! - 10/17/20

    • Moved most of the code users will want to edit to mod.js, added documentation for it.
      • Specifically, modInfo, VERSION, canGenPoints, getPointGen, and maxTickLength
    • Added getStartPoints()
    • Added the ability to store non-layer-related data
    • Added the ability to display more things at the top of the tree tab below points.
    • Made the endgame condition customizable
    • Added "sell one" and "sell all" buttons for buyables.
    • Moved the old "game" to demo.js, and replaced it with a minimal game that won't cause issues when edited.
    • Fixed issues with version number
    • Fixed number formatting issue making things like "10e9" appear.

    v2.0.5 - 10/16/20

    • Made more features (including prestige parameters) able to be dynamic.
    • Layer nodes can be hidden but still take up space with "ghost" visibility
    • Added clickableEffect for real.
    • Fixed some visual issues with bars.
    • A few other minor tweaks and improvements.

    v2.0.4 - 10/16/20

    • Fixed HTML on buttons interfering with clicking on them.

    v2.0.3 - 10/16/20

    • Fixed hotkeys not displaying in info.
    • Fixed the game supressing all external hotkeys.
    • You can use more things as currencies for upgrade costs and challenge goals using currencyLocation.
    • Added maxTickLength, which can be used to prevent offline time or tab-switching from breaking time-limit based mechanics.
    • Made buyable respec buttons and clickable "master" buttons their own components, and gave them a hide/show feature.
    • Added a general "tooltip" feature for achievements.

    v2.0.2 - 10/15/20

    • Branches are now dynamic (they can be functions).
    • Fixed a crash related to offline time.
    • Fixed links being too wide.

    v2.0.1 - 10/15/20

    • Fixed side layers appearing multiple times.

    v2.0: The Pinnacle of Achievement Mountain - 10/15/20

    • Added progress bars, which are highly customizable and can be horizontal or vertical!
    • Added "side layers", displayed smaller and off to the side, and don't get reset by default. They can be used for global achievements and statistics. Speaking of which...
    • Added achievements!
    • Added clickables, a more generalized variant of buyables.
    • Almost every value in layer data can be either a function or a constant value!
    • Added support for multiple completions of challenges.
    • Added "none" prestige type, which removes the need for any other prestige-related features.
    • The points display and other gui elements stay at the top of the screen when the tree scrolls.
    • Added getter/setter functions for the amounts and effects of most Big Features
    • Moved modInfo to game.js, added a spot in modInfo for a Discord link, changelog link. Also added a separate mod version from the TMT version in VERSION.
    • Tree structure is based on layer data, no index.html editing is needed.
    • Tmp does not need to be manually updated.
    • You don't have to have the same amount of upgrades in every row (and challs and buyables)
    • "unlocked" is optional for all Big Components (defaults to true).
    • All displays will update correctly.
    • Changelog is no longer in index.html at all.
    • Generation of Points now happens in the main game loop
    • Changed the reset functions to make keeping things easier
    • Renamed many things to increase readability (see the list in the link below)
    • Improved documentation based on feedback

    v1.3.5:

    • Completely automated convertToDecimal, now you never have to worry about it again.
    • Branches can be defined without a color id. But they can also use hex values for color ids!
    • Created a tutorial for getting started with TMT and Github.
    • Page title is now automatically taken from mod name.

    v1.3.4 - 10/8/20

    • Added "midsection" feature to add things to a tab's layout while still keeping the standard layout.
    • Fix for being able to buy more buyables than you should.

    v1.3.3 - 10/7/20

    • Fix for the "order of operations" issue in temp.

    v1.3.1 - 10/7/20

    • Added custom CSS and tooltips for Layer Nodes.
    • Added custom CSS for upgrades, buyables, milestones, and challenges, both individually and layer-wide.
    • You can now use HTML in most display text!
    • You can now make milestones unlockable and not display immediately.
    • Fixed importing saves, and issue with upgrades not appearing, and probably more.
    • Optional "name" layer feature, used in confirmation messages.

    v1.3: Tabception... ception! - 10/7/20

    • Added subtabs! And also a Micro-tab component to let you make smaller subtab-esque areas anywhere.
    • Added a "custom" prestige formula type, and a number of features to support it.
    • Added points/sec display (can be disabled).
    • Added h-line, v-line and image-display components, plus components for individual upgrades, challenges, and milestones.
    • Added upgEffect, buyableEffect, and challEffect functions.
    • Added "hide completed challenges" setting.
    • Moved old changelogs to a separate place.
    • Fixed hasMilestone and incr_order.
    • Static layers now show the currency amount needed for the next one if you can buy max.

    v1.2.4 - 10/4/20

    • Layers are now highlighted if you can buy an upgrade, and a new feature, shouldNotify, lets you make it highlight other ways.
    • Fixed bugs with hasUpg, hasChall, hasMilestone, and inChallenge.
    • Changed the sample code to use the above functions for convenience.

    v1.2.3 - 10/3/20

    • Added a row component, which displays a list of objects in a row.
    • Added a column component, which displays a list of objects in a column (useful within a row).
    • Changed blanks to have a customizable width and height.

    v1.2: This Changes Everything! - 10/3/20

    • Many layer features can now be static values or functions. (This made some formats change, which will break old things)
    • You can now use the "this" keyword, to make code easier to transfer when making new layers.
    • Also added "this.layer", which is the current layer's name, and works on existing subfeatures (e.g. individual upgrades) as well! Subfeatures also have "this.id".
    • Fixed a big save issue. If you use a unique mod id, your save will never conflict with other mods.
    • Added a configurable offline time limit in modinfo at the top of index.html. (default 1 hour)
    • Added a few minor features, and updated the docs with new information.

    v1.1.1 - 9/30/20

    • You can define hotkeys directly from layer config.

    v1.1: Enhanced Edition - 9/30/20

    • Added "Buyables", which can function like Space Buildings or Enhancers.
    • Custom CSS can now be used on any component! Make the third argument an object with CSS parameters.
    • Lots of minor good things.

    v1.0 - 9/27/20

    • First release.
    - +

    The Modding Tree changelog:

    v2.5.9.2 - 5/19/21

    • Fixed many issues with things not updating.

    v2.5.9.1 - 5/18/21

    • Made text inputs never give NaNs.

    v2.5.9 - 5/18/21

    • Fixed issue when using text inputs for Numbers.
    • Added particle color feature.
    • Particle speed and dir are updated as it moves.
    • Added setSpeed and setDir for particles.
    • Added more trig functions.

    v2.5.8 - 5/17/21

    • Added makeShinies, which creates a stationary particle in a random spot.
    • Bars will visually update more quickly.
    • Fixed a major particle-related issue.
    • Fixed autoUpgrade.
    • Fixed a minor visual issue with tree nodes.

    v2.5.7 - 5/15/21

    • Added a particle system! Not only can it be used for visual effects, but particles can interact with the mouse. They could be used to create golden cookies or collectables, for example.
    • Added marked feature to buyables, clickables, and challenges. By default, stars multi-completion challenges when maxed.
    • Added 'deactivated' feature to layers, which disables many features.
    • Improved number formatting slightly.

    v2.5.6 - 5/14/21

    • You can now use non-numeric ids for upgrades, buyables, etc.
    • Fixed an exploit that let you buy an extra buyable.
    • Moved basic getter/setter functions to easyAccess.js.

    v2.5.5.2 - 5/12/21

    • Fixed a major issue with buyables.
    • Fixed a variety of tabFormat-related issues.
    • Fixed commas appearing in decimal places (thanks to pg132!)

    v2.5.5.1 - 5/12/21

    • Fixed clickables.

    v2.5.5 - 5/12/21

    • Added grids! They are a grid of buttons which behave the same, but have their own data. Good for inventory grids, map tiles, and more!
    • Added "marked" feature to add a mark to a node. Can be an image instead of a star. (Originally by Jacorb)
    • Added "layer-proxy" component that lets you use components from another layer.
    • Added the ability to display non-whole numbers in main-display.

    v2.5.4 - 5/10/21

    • Added a setting to always use single-tab mode.
    • Added directMult, which multiplies prestige gain after exponents and softcaps. It actually multiplies gain for static layers.
    • Added onEnter and onExit for challenges.
    • Improved displaying numbers between 0.0001 and 0.1.
    • Added documentation on how gainMult/Exp work for static layers.
    • Fixed a visual issue on mobile, thanks to thepaperpilot.
    • Improved documentation in general.

    v2.5.3 - 5/8/21

    • Improved performance of tab formats and bars.
    • Respec confirmation settings are now kept on resets.
    • Improved compatibility with older browsers.
    • Fixed missing pixel on vertical bars.

    v2.5.2.1 - 5/7/21

    • Fixed microtabs making layers highlight incorrectly.

    v2.5.2 - 5/7/21

    • Added glowColor for subtabs.
    • Improved the display for extremely small numbers.
    • Fixed issues in the buyable docs.

    v2.5.1 - 5/7/21

    • Fixed dynamic things in tabFormat not updating.

    v2.5: Dreams Really Do Come True - 5/7/21

    • Optimizations, hopefully a significant amount.
    • Added OOM/s point gen display at high values (thanks to Ducdat!)
    • Only one tab will display if the window is not wide enough (also thanks to Ducdat!)
    • Holding down a buyable's button now buys it continuously.
    • New milestone setting will also show the most recently unlocked milestone. (Also renamed all settings to be clearer)
    • Added an onHold feature for clickables.
    • Layer nodes will be highlighted even if the player is on the same tab.
    • Added customizable node glowColor.
    • Added buyable purchaseLimit.
    • Amount is automatically supplied to buyable cost and effect functions.
    • Locked (not yet visible) milestones no longer take up space. Also fixed hidden milestones taking a tiny bit of space.
    • Re-centered respec buttons.
    • Force-displayed tooltips are not hidden by resets.
    • Added formatting support for very small numbers. Disabled in most places by default because rounding errors might cause issues. Access it with formatSmall, or enable it globally by adding "allowSmall: true" to modInfo.

    v2.4.1 - 4/29/21

    • A number of minor fixes, many thanks to thepaperpilot.
    • The respec confirmation checkbox is now part of the respec-button component. (This also fixes the checkbox appearing when there is no respec button)
    • Added a few undocumented changes to the 2.4 changelog (the two at the bottom)

    v2.4: Rationalized Edition - 4/29/21

    • Completely reworked tooltips. Shift-click a node to force its tooltip to stay displayed. (And hopefully finally fixed flickering!)

    • Added text-input and slider components.

    • Added the ability to toggle respec confirmations.

    • Added custom respec confirmation messages.

    • The red layer highlight will not appear before a layer is unlocked.

    • Added unlocking hotkeys.

    • You no longer need to supply 'rows' and 'cols' for any Big Features.

    • Node symbols can use HTML.

    • Added documentation for the respec button.

    • Added prestigeNotify to subtabs, and prestigeNotify in subtabs also highlights the layer node.

    • The version number no longer contains special characters or irrational numbers.

    • Added ctrlDown and shiftDown variables.

    • Tooltips now use HTML (this means you need to replace any newlines with
      )

    v2.π.1 - 4/7/21

    • Fixed formatting for some larger numbers.
    • Upgrades will expand if there is too much text to display.
    • Fixed styling challenges.
    • No longer attempts to display a base currency when there is none.

    v2.π: Incrementally Updated - 2/5/21

    • Performance improvements.
    • Fixed tooltips overlapping with the top display.
    • Clicking a popup dismisses it immediately.
    • Added support for bulk challenge completions.
    • "Best" is updated automatically.
    • Fixed keeping Decimal values on reset.
    • Code reorganization and style improvements by fudo.

    v2.3.5 - 12/21/20

    • Added resetTime, which tracks the time since a layer prestiged or was reset.
    • A layer node will be highlighted red if one of its subtabs is highlighted red.
    • Fixed issues with keeping challenges, buyables, and clickables on reset.
    • Improved the unlocking of custom layers.
    • Other minor fixes.

    v2.3.4 - 12/16/20

    • Added a node image feature.
    • Resource display now always shows the amount of the currency the layer's gain is based on.
    • Added spacing between tree nodes.
    • Another attempt to fix tooltip flickering.

    v2.3.3 - 12/13/20

    • Fixed the first node in a row always taking up space.
    • layerShown is now optional.
    • All prestige types can now use features for custom prestige types.

    v2.3.2 - 12/13/20

    • Fixed achievement/milestone popups.

    v2.3.1 - 12/12/20

    • Another attempt to fix flickering tooltips.
    • The "this" keyword should work everywhere except tabFormat arrays (although I may have missed some things).
    • Fixed tree branches not updating when scrolling on the right-side tab.
    • Fixed a spacing issue when a node's symbol is ""
    • Removed some old, unneeded files.

    v2.3: Cooler and Newer Edition - 12/10/20

    • Added achievement/milestone popups (thank you to Jacorb for this contribution!)
    • The changelog tab is back, and can be set in mod.js.
    • Layer nodes and respec buttons will not be clicked by pressing "enter".
    • Possible fix for flickering tooltips and strange transitions.
    • The victory screen text is configurable.
    • Added image and textStyle features to achievements.
    • Added an argument to use specific rows in an "upgrades" component.
    • Fixed the comma appearing in the main display when there was no effectDescription
    • Added the ability to easily make a tab that is a collection of layers in subtabs.
    • Improved spacing for embedding layers with subtabs into subtabs.

    v2.2.8 - 12/03/20

    • Double-clicking a layer node brings you to the main subtab for that layer.
    • Attempted to fix challenges visually updating a different way.
    • Added a softcap function for use in formulas.
    • Added displayRow feature, which lets layers be shown somewhere separate from where they are in the reset order (e.g. side layers)
    • Fixed autoupgrade issue.

    v2.2.7 - 11/30/20

    • Added autoUpgrade feature.
    • resource-display now shows resource gain per second if passiveGain is active.
    • Fixed formatting issues on some large numbers.
    • Better support for using classed objects in player and in layers/tmp.
    • Made hard resetting more effective.
    • Removed Herobrine from getStartClickables.

    v2.2.6 - 11/30/20

    • Added goalDescription for challenges and made the new "canComplete" system the standard.
    • Another attempt to fix challenges not visually updating.
    • Fixed side layers not appearing.
    • Fixed getStartClickables again.

    v2.2.5 - 11/29/20

    • Added features for overriding the displays and costs/goals of upgrades and challenges to make them fully custom.
    • best, total, and unlocked are always automatically added to layerData (but best and total will only display if you add them yourself).
    • Fixed getStartClickables.

    v2.2.4 - 11/28/20

    • Added softcap and softcapPower features (for Normal layers)
    • Offline time limit and default max tick length were fixed (previously the limits were 1000x too large)
    • Added fixOldSaves.
    • You can use HTML in main-display.
    • Fixed a number of minor oddities.

    v2.2.3 - 11/28/20

    • Layers will be highlighted if you can finish a challenge.
    • The "can complete challenge" color now overrides the "already completed" color.
    • Button nodes now work as side "layers".
    • Setting a tooltip to "" hides it entirely.

    v2.2.2 - 11/22/20

    • Fixed right half of the screen being unclickable in some circumstances.
    • Fixed tree branches being offset.
    • Fix to lastSafeTab.

    v2.2.1 - 11/7/20

    • Added a small highlight to layers you can meaningfully prestige on.
    • Added passiveGeneration and autoPrestige features to standardize prestige automation. (The old ways still work, but the new ones work better with other things)
    • Improved milestones visually a bit.
    • "best" and "total" are now only displayed if present in startData.
    • Fixed issues with things not updating visually. (Thank you to to Jacorb!)
    • Side layers and button nodes can now be highlighted.
    • Updated docs on the new tree-related features.

    v2.2: Uprooted - 11/7/20

    • You can now embed a layer inside of a subtab or microtab!
    • Added support for hiding or reformatting the tree tab
    • Added non-layer button nodes
    • Added shouldNotify to subtab/microtab buttons. (You can make them highlighted)
    • Added commas to large exponents.
    • Upgrades now only show "currently" if they have an effectDisplay (so not for constant effects).
    • Achievements are part of the default tab format.
    • NaN is now handled more intelligently.
    • Renamed files, and moved less relevant ones to another folder.
    • The "hide completed challenges" setting now only hides challenges at max completions.
    • Thank you to thepaperpilot for fixing errors in docs and improving the infobox appearance!
    • Many other minor fixes.

    v2.1.4 - 10/25/20

    • Added an infobox component. Thank you to thepaperpilot for this contribution!
    • Layer type is now optional, and defaults to "none".
    • Improved the look of bars and tab buttons.
    • Improved spacing between layer nodes (also thanks to thepaperpilot!)
    • Fixed the "blank" component breaking if only specifying the height.
    • Fixed some numbers not displaying with enough digits.
    • Made a few more things able to be functions.
    • A few other minor fixes.

    v2.1.3.1 - 10/21/20

    • Fixed the update function.

    v2.1.3 - 10/21/20

    • gainMult and gainExp are now optional.
    • Layer unlocking is now kept on reset.
    • Game should start up faster.
    • Layer updates now have a determined order and starts with earlier-rowed layers.
    • Automation now has a determined order and starts with later-rowed layers.
    • Fixed issues with resetting clickables and challenges.
    • Commas should no longer appear in the decimal places of a number.
    • Fixed potential issue in displaying the tree.

    v2.1.2 - 10/19/20

    • Added buyUpgrade function (buyUpg still works though)
    • Added author name to modInfo.
    • Fix to crash caused when the name of a subtab or microtab is changed.
    • Fixes to outdated information in docs.
    • Improvements to Discord links.
    • Thank you to thepaperpilot for contributing to this update!

    v2.1.1 - 10/17/20

    • Added resource-display component, which displays the base currency for the prestige layer, as well as the best and/or total of this layer's prestige currency.
    • Fixed the value for the base currency not updating in resource-display.

    v2.1: We should have thought of this sooner! - 10/17/20

    • Moved most of the code users will want to edit to mod.js, added documentation for it.
      • Specifically, modInfo, VERSION, canGenPoints, getPointGen, and maxTickLength
    • Added getStartPoints()
    • Added the ability to store non-layer-related data
    • Added the ability to display more things at the top of the tree tab below points.
    • Made the endgame condition customizable
    • Added "sell one" and "sell all" buttons for buyables.
    • Moved the old "game" to demo.js, and replaced it with a minimal game that won't cause issues when edited.
    • Fixed issues with version number
    • Fixed number formatting issue making things like "10e9" appear.

    v2.0.5 - 10/16/20

    • Made more features (including prestige parameters) able to be dynamic.
    • Layer nodes can be hidden but still take up space with "ghost" visibility
    • Added clickableEffect for real.
    • Fixed some visual issues with bars.
    • A few other minor tweaks and improvements.

    v2.0.4 - 10/16/20

    • Fixed HTML on buttons interfering with clicking on them.

    v2.0.3 - 10/16/20

    • Fixed hotkeys not displaying in info.
    • Fixed the game supressing all external hotkeys.
    • You can use more things as currencies for upgrade costs and challenge goals using currencyLocation.
    • Added maxTickLength, which can be used to prevent offline time or tab-switching from breaking time-limit based mechanics.
    • Made buyable respec buttons and clickable "master" buttons their own components, and gave them a hide/show feature.
    • Added a general "tooltip" feature for achievements.

    v2.0.2 - 10/15/20

    • Branches are now dynamic (they can be functions).
    • Fixed a crash related to offline time.
    • Fixed links being too wide.

    v2.0.1 - 10/15/20

    • Fixed side layers appearing multiple times.

    v2.0: The Pinnacle of Achievement Mountain - 10/15/20

    • Added progress bars, which are highly customizable and can be horizontal or vertical!
    • Added "side layers", displayed smaller and off to the side, and don't get reset by default. They can be used for global achievements and statistics. Speaking of which...
    • Added achievements!
    • Added clickables, a more generalized variant of buyables.
    • Almost every value in layer data can be either a function or a constant value!
    • Added support for multiple completions of challenges.
    • Added "none" prestige type, which removes the need for any other prestige-related features.
    • The points display and other gui elements stay at the top of the screen when the tree scrolls.
    • Added getter/setter functions for the amounts and effects of most Big Features
    • Moved modInfo to game.js, added a spot in modInfo for a Discord link, changelog link. Also added a separate mod version from the TMT version in VERSION.
    • Tree structure is based on layer data, no index.html editing is needed.
    • Tmp does not need to be manually updated.
    • You don't have to have the same amount of upgrades in every row (and challs and buyables)
    • "unlocked" is optional for all Big Components (defaults to true).
    • All displays will update correctly.
    • Changelog is no longer in index.html at all.
    • Generation of Points now happens in the main game loop
    • Changed the reset functions to make keeping things easier
    • Renamed many things to increase readability (see the list in the link below)
    • Improved documentation based on feedback

    v1.3.5:

    • Completely automated convertToDecimal, now you never have to worry about it again.
    • Branches can be defined without a color id. But they can also use hex values for color ids!
    • Created a tutorial for getting started with TMT and Github.
    • Page title is now automatically taken from mod name.

    v1.3.4 - 10/8/20

    • Added "midsection" feature to add things to a tab's layout while still keeping the standard layout.
    • Fix for being able to buy more buyables than you should.

    v1.3.3 - 10/7/20

    • Fix for the "order of operations" issue in temp.

    v1.3.1 - 10/7/20

    • Added custom CSS and tooltips for Layer Nodes.
    • Added custom CSS for upgrades, buyables, milestones, and challenges, both individually and layer-wide.
    • You can now use HTML in most display text!
    • You can now make milestones unlockable and not display immediately.
    • Fixed importing saves, and issue with upgrades not appearing, and probably more.
    • Optional "name" layer feature, used in confirmation messages.

    v1.3: Tabception... ception! - 10/7/20

    • Added subtabs! And also a Micro-tab component to let you make smaller subtab-esque areas anywhere.
    • Added a "custom" prestige formula type, and a number of features to support it.
    • Added points/sec display (can be disabled).
    • Added h-line, v-line and image-display components, plus components for individual upgrades, challenges, and milestones.
    • Added upgEffect, buyableEffect, and challEffect functions.
    • Added "hide completed challenges" setting.
    • Moved old changelogs to a separate place.
    • Fixed hasMilestone and incr_order.
    • Static layers now show the currency amount needed for the next one if you can buy max.

    v1.2.4 - 10/4/20

    • Layers are now highlighted if you can buy an upgrade, and a new feature, shouldNotify, lets you make it highlight other ways.
    • Fixed bugs with hasUpg, hasChall, hasMilestone, and inChallenge.
    • Changed the sample code to use the above functions for convenience.

    v1.2.3 - 10/3/20

    • Added a row component, which displays a list of objects in a row.
    • Added a column component, which displays a list of objects in a column (useful within a row).
    • Changed blanks to have a customizable width and height.

    v1.2: This Changes Everything! - 10/3/20

    • Many layer features can now be static values or functions. (This made some formats change, which will break old things)
    • You can now use the "this" keyword, to make code easier to transfer when making new layers.
    • Also added "this.layer", which is the current layer's name, and works on existing subfeatures (e.g. individual upgrades) as well! Subfeatures also have "this.id".
    • Fixed a big save issue. If you use a unique mod id, your save will never conflict with other mods.
    • Added a configurable offline time limit in modinfo at the top of index.html. (default 1 hour)
    • Added a few minor features, and updated the docs with new information.

    v1.1.1 - 9/30/20

    • You can define hotkeys directly from layer config.

    v1.1: Enhanced Edition - 9/30/20

    • Added "Buyables", which can function like Space Buildings or Enhancers.
    • Custom CSS can now be used on any component! Make the third argument an object with CSS parameters.
    • Lots of minor good things.

    v1.0 - 9/27/20

    • First release.
    + \ No newline at end of file diff --git a/public/kronos/docs/!general-info.html b/public/kronos/docs/!general-info.html index 446cf666..c8583947 100644 --- a/public/kronos/docs/!general-info.html +++ b/public/kronos/docs/!general-info.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

    The-Modding-Tree

    Making a game in The Modding Tree mostly involves defining parameters or functions on objects. If you aren't following the getting started guide, you should start by setting up your basic mod info in mod.js. It's important to set a mod id to ensure saving works properly.

    Beyond that, the main way to add content is through creating layers, often in layers.js. You can add new layers by calling addLayer(layername, layerdata). There is an example of a basic layer in layers.js showing the recommended method. It is just an example and can be freely deleted. You can also use it as a reference or a base for your own layers.

    Most of the time, you won't need to dive deep into the code to create things, but you still can if you really want to, for example to add new Vue components in components.js.

    The Modding Tree uses break_eternity.js to store large values. This means that many numbers are Decimal objects, and must be treated differently. For example, you have to use new Decimal(x) to create a Decimal value instead of a plain number, and perform operations on them by calling functions. e.g, instead of x = x + y, use x = x.add(y). Keep in mind this also applies to comparison operators, which should be replaced with calling the .gt, .gte, .lt, .lte, .eq, and .neq functions. See the break_eternity.js docs for more details on working with Decimal values.

    Almost all values can be either a constant value, or a dynamic value. Dynamic values are defined by putting a function that returns what the value should be at any given time.

    All display text can use basic HTML elements (But you can't use most Vue features there).

    While reading this documentation, the following key will be used when describing features:

    • No label: This is required and the game may crash if it isn't included.
    • sometimes required: This is may be required, depending on other things in the layer.
    • optional: You can leave this out if you don't intend to use that feature for the layer.
    • assigned automagically: This value will be set automatically and override any value you set.
    • deprecated: This feature is not recommended to be used, because newer features are able to achieve the same thing in a better, easier way.

    Table of Contents

    General

    • Getting Started: Getting your own copy of the code set up with Github Desktop.
    • Main mod info: How to set up general things for your mod in mod.js.
    • Basic layer breakdown: Breaking down the components of a layer with minimal features.
    • Layer features: Explanations of all of the different properties that you can give a layer.
    • Custom Tab Layouts: An optional way to give your tabs a different layout. You can even create entirely new components to use.
    • Custom game layouts: You can get rid of the tree tab, add buttons and other things to the tree, or even customize the tab's layout like a layer tab.
    • Updating TMT: Using Github Desktop to update your mod's version of TMT.

    Common components

    • Upgrades: How to create upgrades for a layer.
    • Milestones: How to create milestones for a layer.
    • Buyables: Create rebuyable upgrades for your layer (with the option to make them respec-able). Can be used to make Enhancers or Space Buildings, for example.
    • Clickables: A more generalized variant of buyables, for any kind of thing that is sometimes clickable. Between these and Buyables, you can do just about anything.
    • Achievements: How to create achievements for a layer (or for the whole game).

    Other components and features

    • Challenges: How to create challenges for a layer.
    • Bars: Display some information as a progress bar, gauge, or similar. They are highly customizable, and can be horizontal and vertical as well.
    • Subtabs and Microtabs: Create subtabs for your tabs, as well as "microtab" components that you can put inside the tabs. You can even use them to embed a layer inside another layer!
    • [Grids][grids.md]: Create a group buttons that behave the same, but have their own data. Good for map tiles, an inventory grid, and more!
    • Infoboxes: Boxes containing text that can be shown or hidden.
    • Trees: Make your own trees. You can make non-layer button nodes too!
    • Particle system: Can be used to create particles for visual effects, but also interactable things like golden cookies or collectables.
    - +

    The-Modding-Tree

    Making a game in The Modding Tree mostly involves defining parameters or functions on objects. If you aren't following the getting started guide, you should start by setting up your basic mod info in mod.js. It's important to set a mod id to ensure saving works properly.

    Beyond that, the main way to add content is through creating layers, often in layers.js. You can add new layers by calling addLayer(layername, layerdata). There is an example of a basic layer in layers.js showing the recommended method. It is just an example and can be freely deleted. You can also use it as a reference or a base for your own layers.

    Most of the time, you won't need to dive deep into the code to create things, but you still can if you really want to, for example to add new Vue components in components.js.

    The Modding Tree uses break_eternity.js to store large values. This means that many numbers are Decimal objects, and must be treated differently. For example, you have to use new Decimal(x) to create a Decimal value instead of a plain number, and perform operations on them by calling functions. e.g, instead of x = x + y, use x = x.add(y). Keep in mind this also applies to comparison operators, which should be replaced with calling the .gt, .gte, .lt, .lte, .eq, and .neq functions. See the break_eternity.js docs for more details on working with Decimal values.

    Almost all values can be either a constant value, or a dynamic value. Dynamic values are defined by putting a function that returns what the value should be at any given time.

    All display text can use basic HTML elements (But you can't use most Vue features there).

    While reading this documentation, the following key will be used when describing features:

    • No label: This is required and the game may crash if it isn't included.
    • sometimes required: This is may be required, depending on other things in the layer.
    • optional: You can leave this out if you don't intend to use that feature for the layer.
    • assigned automagically: This value will be set automatically and override any value you set.
    • deprecated: This feature is not recommended to be used, because newer features are able to achieve the same thing in a better, easier way.

    Table of Contents

    General

    • Getting Started: Getting your own copy of the code set up with Github Desktop.
    • Main mod info: How to set up general things for your mod in mod.js.
    • Basic layer breakdown: Breaking down the components of a layer with minimal features.
    • Layer features: Explanations of all of the different properties that you can give a layer.
    • Custom Tab Layouts: An optional way to give your tabs a different layout. You can even create entirely new components to use.
    • Custom game layouts: You can get rid of the tree tab, add buttons and other things to the tree, or even customize the tab's layout like a layer tab.
    • Updating TMT: Using Github Desktop to update your mod's version of TMT.

    Common components

    • Upgrades: How to create upgrades for a layer.
    • Milestones: How to create milestones for a layer.
    • Buyables: Create rebuyable upgrades for your layer (with the option to make them respec-able). Can be used to make Enhancers or Space Buildings, for example.
    • Clickables: A more generalized variant of buyables, for any kind of thing that is sometimes clickable. Between these and Buyables, you can do just about anything.
    • Achievements: How to create achievements for a layer (or for the whole game).

    Other components and features

    • Challenges: How to create challenges for a layer.
    • Bars: Display some information as a progress bar, gauge, or similar. They are highly customizable, and can be horizontal and vertical as well.
    • Subtabs and Microtabs: Create subtabs for your tabs, as well as "microtab" components that you can put inside the tabs. You can even use them to embed a layer inside another layer!
    • [Grids][grids.md]: Create a group buttons that behave the same, but have their own data. Good for map tiles, an inventory grid, and more!
    • Infoboxes: Boxes containing text that can be shown or hidden.
    • Trees: Make your own trees. You can make non-layer button nodes too!
    • Particle system: Can be used to create particles for visual effects, but also interactable things like golden cookies or collectables.
    + \ No newline at end of file diff --git a/public/kronos/docs/achievements.html b/public/kronos/docs/achievements.html index 1a483fae..7026eb95 100644 --- a/public/kronos/docs/achievements.html +++ b/public/kronos/docs/achievements.html @@ -8,11 +8,11 @@ - + - - + + @@ -312,8 +312,8 @@ more features }, etc -}

    Usually, each achievement should have an id where the first digit is the row and the second digit is the column.

    Individual achievement can have these features:

    • name: optional. displayed at the top of the achievement. The only visible text. It can also be a function that returns updating text. Can use basic HTML.

    • done(): A function returning a boolean to determine if the achievement should be awarded.

    • tooltip: Default tooltip for the achievement, appears when it is hovered over. Should convey the goal and any reward for completing the achievement. It can also be a function that returns updating text. Can use basic HTML. Setting this to "" disables the tooltip.

    • effect(): optional. A function that calculates and returns the current values of any bonuses from the achievement. Can return a value or an object containing multiple values.

    • unlocked(): optional. A function returning a bool to determine if the achievement is visible or not. Default is unlocked.

    • onComplete() - optional. this function will be called when the achievement is completed.

    • image: optional, puts the image from the given URL (relative or absolute) in the achievement

    • style: optional. Applies CSS to this achievement, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • textStyle: optional. Applies CSS to the text, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the achievement was stored under, for convenient access. The achievement in the example's id is 11.

    • goalTooltip: optional, deprecated. Appears when the achievement is hovered over and locked, overrides the basic tooltip. This is to display the goal (or a hint). It can also be a function that returns updating text. Can use basic HTML.

    • doneTooltip: optional, deprecated. Appears when the achievement is hovered over and completed, overrides the basic tooltip. This can display what the player achieved (the goal), and the rewards, if any. It can also be a function that returns updating text. Can use basic HTML.

    Disable achievement popups by adding achievementsPopups: false to the layer.

    - +}

    Usually, each achievement should have an id where the first digit is the row and the second digit is the column.

    Individual achievement can have these features:

    • name: optional. displayed at the top of the achievement. The only visible text. It can also be a function that returns updating text. Can use basic HTML.

    • done(): A function returning a boolean to determine if the achievement should be awarded.

    • tooltip: Default tooltip for the achievement, appears when it is hovered over. Should convey the goal and any reward for completing the achievement. It can also be a function that returns updating text. Can use basic HTML. Setting this to "" disables the tooltip.

    • effect(): optional. A function that calculates and returns the current values of any bonuses from the achievement. Can return a value or an object containing multiple values.

    • unlocked(): optional. A function returning a bool to determine if the achievement is visible or not. Default is unlocked.

    • onComplete() - optional. this function will be called when the achievement is completed.

    • image: optional, puts the image from the given URL (relative or absolute) in the achievement

    • style: optional. Applies CSS to this achievement, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • textStyle: optional. Applies CSS to the text, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the achievement was stored under, for convenient access. The achievement in the example's id is 11.

    • goalTooltip: optional, deprecated. Appears when the achievement is hovered over and locked, overrides the basic tooltip. This is to display the goal (or a hint). It can also be a function that returns updating text. Can use basic HTML.

    • doneTooltip: optional, deprecated. Appears when the achievement is hovered over and completed, overrides the basic tooltip. This can display what the player achieved (the goal), and the rewards, if any. It can also be a function that returns updating text. Can use basic HTML.

    Disable achievement popups by adding achievementsPopups: false to the layer.

    + \ No newline at end of file diff --git a/public/kronos/docs/bars.html b/public/kronos/docs/bars.html index 474f4e8a..fb9c9cc4 100644 --- a/public/kronos/docs/bars.html +++ b/public/kronos/docs/bars.html @@ -8,11 +8,11 @@ - + - - + + @@ -315,8 +315,8 @@ etc }, etc -}

    Features:

    • direction: UP, DOWN, LEFT, or RIGHT (not strings). Determines the direction that the bar is filled as it progresses. RIGHT means from left to right.

    • width, height: The size in pixels of the bar, but as numbers (no "px" at the end).

    • progress(): A function that returns the portion of the bar that is filled, from "empty" at 0 to "full" at 1, updating automatically. (Nothing bad happens if the value goes out of these bounds, and it can be a number or Decimal)

    • display(): optional. A function that returns text to be displayed on top of the bar, can use HTML.

    • unlocked(): optional. A function returning a bool to determine if the bar is visible or not. Default is unlocked.

    • baseStyle, fillStyle, borderStyle, textStyle: Optional, Apply CSS to the unfilled portion, filled portion, border, and display text on the bar, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the bar was stored under, for convenient access. The bar in the example's id is "bigBar".

    - +}

    Features:

    • direction: UP, DOWN, LEFT, or RIGHT (not strings). Determines the direction that the bar is filled as it progresses. RIGHT means from left to right.

    • width, height: The size in pixels of the bar, but as numbers (no "px" at the end).

    • progress(): A function that returns the portion of the bar that is filled, from "empty" at 0 to "full" at 1, updating automatically. (Nothing bad happens if the value goes out of these bounds, and it can be a number or Decimal)

    • display(): optional. A function that returns text to be displayed on top of the bar, can use HTML.

    • unlocked(): optional. A function returning a bool to determine if the bar is visible or not. Default is unlocked.

    • baseStyle, fillStyle, borderStyle, textStyle: Optional, Apply CSS to the unfilled portion, filled portion, border, and display text on the bar, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the bar was stored under, for convenient access. The bar in the example's id is "bigBar".

    + \ No newline at end of file diff --git a/public/kronos/docs/basic-layer-breakdown.html b/public/kronos/docs/basic-layer-breakdown.html index 8a6f299b..c6c54d14 100644 --- a/public/kronos/docs/basic-layer-breakdown.html +++ b/public/kronos/docs/basic-layer-breakdown.html @@ -8,11 +8,11 @@ - + - - + + @@ -337,8 +337,8 @@ upgrades: { // Look in the upgrades docs to see what goes here! }, -}) - +}) + \ No newline at end of file diff --git a/public/kronos/docs/buyables.html b/public/kronos/docs/buyables.html index ac8d0193..e2b52d36 100644 --- a/public/kronos/docs/buyables.html +++ b/public/kronos/docs/buyables.html @@ -8,11 +8,11 @@ - + - - + + @@ -318,8 +318,8 @@ etc }, etc -}

    Features:

    • title: optional. displayed at the top in a larger font. It can also be a function that returns updating text.

    • cost(): cost for buying the next buyable. Can have an optional argument "x" to calculate the cost of the x+1th purchase. (x is a Decimal). Can return an object if there are multiple currencies.

    • effect(): optional. A function that calculates and returns the current values of bonuses of this buyable. Can have an optional argument "x" to calculate the effect of having x of the buyable.. Can return a value or an object containing multiple values.

    • display(): A function returning everything that should be displayed on the buyable after the title, likely including the description, amount bought, cost, and current effect. Can use basic HTML.

    • unlocked(): optional. A function returning a bool to determine if the buyable is visible or not. Default is unlocked.

    • canAfford(): A function returning a bool to determine if you can buy one of the buyables.

    • buy(): A function that implements buying one of the buyable, including spending the currency.

    • buyMax(): optional. A function that implements buying as many of the buyable as possible.

    • style: optional. Applies CSS to this buyable, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • purchaseLimit: optional. The limit on how many of the buyable can be bought. The default is no limit.

    • marked: optional Adds a mark to the corner of the buyable. If it's "true" it will be a star, but it can also be an image URL.

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the buyable was stored under, for convenient access. The buyable in the example's id is 11.

    Sell One/Sell All:

    Including a sellOne or sellAll function will cause an additional button to appear beneath the buyable. They are functionally identical, but "sell one" appears above "sell all". You can also use them for other things.

    • sellOne/sellAll(): optional. Called when the button is pressed. The standard use would be to decrease/reset the amount of the buyable, and possibly return some currency to the player.

    • canSellOne/canSellAll(): optional. booleans determining whether or not to show the buttons. If "canSellOne/All" is absent but "sellOne/All" is present, the appropriate button will always show.

    To add a respec button, or something similar, add the respecBuyables function to the main buyables object (not individual buyables). You can use these features along with it:

    • respec(): optional. This is called when the button is pressed (after a toggleable confirmation message).

    • respecText: optional. Text to display on the respec Button.

    • showRespec(): optional. A function determining whether or not to show the button, if respecBuyables is defined. Defaults to true if absent.

    • respecMessage: optional. A custom confirmation message on respec, in place of the default one.

    - +}

    Features:

    • title: optional. displayed at the top in a larger font. It can also be a function that returns updating text.

    • cost(): cost for buying the next buyable. Can have an optional argument "x" to calculate the cost of the x+1th purchase. (x is a Decimal). Can return an object if there are multiple currencies.

    • effect(): optional. A function that calculates and returns the current values of bonuses of this buyable. Can have an optional argument "x" to calculate the effect of having x of the buyable.. Can return a value or an object containing multiple values.

    • display(): A function returning everything that should be displayed on the buyable after the title, likely including the description, amount bought, cost, and current effect. Can use basic HTML.

    • unlocked(): optional. A function returning a bool to determine if the buyable is visible or not. Default is unlocked.

    • canAfford(): A function returning a bool to determine if you can buy one of the buyables.

    • buy(): A function that implements buying one of the buyable, including spending the currency.

    • buyMax(): optional. A function that implements buying as many of the buyable as possible.

    • style: optional. Applies CSS to this buyable, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • purchaseLimit: optional. The limit on how many of the buyable can be bought. The default is no limit.

    • marked: optional Adds a mark to the corner of the buyable. If it's "true" it will be a star, but it can also be an image URL.

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the buyable was stored under, for convenient access. The buyable in the example's id is 11.

    Sell One/Sell All:

    Including a sellOne or sellAll function will cause an additional button to appear beneath the buyable. They are functionally identical, but "sell one" appears above "sell all". You can also use them for other things.

    • sellOne/sellAll(): optional. Called when the button is pressed. The standard use would be to decrease/reset the amount of the buyable, and possibly return some currency to the player.

    • canSellOne/canSellAll(): optional. booleans determining whether or not to show the buttons. If "canSellOne/All" is absent but "sellOne/All" is present, the appropriate button will always show.

    To add a respec button, or something similar, add the respecBuyables function to the main buyables object (not individual buyables). You can use these features along with it:

    • respec(): optional. This is called when the button is pressed (after a toggleable confirmation message).

    • respecText: optional. Text to display on the respec Button.

    • showRespec(): optional. A function determining whether or not to show the button, if respecBuyables is defined. Defaults to true if absent.

    • respecMessage: optional. A custom confirmation message on respec, in place of the default one.

    + \ No newline at end of file diff --git a/public/kronos/docs/challenges.html b/public/kronos/docs/challenges.html index c9a8d8ea..a11d8d0d 100644 --- a/public/kronos/docs/challenges.html +++ b/public/kronos/docs/challenges.html @@ -8,11 +8,11 @@ - + - - + + @@ -314,8 +314,8 @@ etc }, etc -}

    Usually, each challenge should have an id where the first digit is the row and the second digit is the column.

    Individual Challenges can have these features:

    • name: Name of the challenge, can be a string or a function. Can use basic HTML.

    • challengeDescription: A description of what makes the challenge a challenge. You will need to implement these elsewhere. It can also be a function that returns updating text. Can use basic HTML.

    • goalDescription: A description of the win condition for the challenge. It can also be a function that returns updating text. Can use basic HTML. (Optional if using the old goal system)

    • canComplete(): A function that returns true if you meet the win condition for the challenge. Returning a number will allow bulk completing the challenge. (Optional if using the old goal system)

    • rewardDescription: A description of the reward's effect. You will also have to implement the effect where it is applied. It can also be a function that returns updating text. Can use basic HTML.

    • rewardEffect(): optional. A function that calculates and returns the current values of any bonuses from the reward. Can return a value or an object containing multiple values. Can use basic HTML.

    • rewardDisplay(): optional. A function that returns a display of the current effects of the reward with formatting. Default behavior is to just display the a number appropriately formatted.

    • fullDisplay(): OVERRIDE. Overrides the other displays and descriptions, and lets you set the full text for the challenge. Can use basic HTML.

    • unlocked(): optional. A function returning a bool to determine if the challenge is visible or not. Default is unlocked.

    • onComplete() - optional. this function will be called when the challenge is completed when previously incomplete.

    • onEnter() - optional. this function will be called when entering the challenge

    • onExit() - optional. this function will be called when exiting the challenge in any way

    • countsAs: optional. If a challenge combines the effects of other challenges in this layer, you can use this. An array of challenge ids. The player is effectively in all of those challenges when in the current one.

    • completionLimit: optional. the amount of times you can complete this challenge. Default is 1 completion.

    • style: optional. Applies CSS to this challenge, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • marked: optional Adds a mark to the corner of the challenge. If it's "true" it will be a star, but it can also be an image URL. By default, if the challenge has multiple completions, it will be starred at max completions.

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

    • id: assigned automagically. It's the "key" which the challenge was stored under, for convenient access. The challenge in the example's id is 11.

    The old goal system uses these features:

    • goal: deprecated, A Decimal for the amount of currency required to beat the challenge. By default, the goal is in basic Points. The goal can also be a function if its value changes.

    • currencyDisplayName: deprecated. the name to display for the currency for the goal

    • currencyInternalName: deprecated. the internal name for that currency

    • currencyLayer: deprecated. the internal name of the layer that currency is stored in. If it's not in a layer, omit. If it's not stored directly in a layer, instead use the next feature.

    • currencyLocation(): deprecated. if your currency is stored in something inside a layer (e.g. a buyable's amount), you can access it this way. This is a function returning the object in "player" that contains the value (like player[this.layer].buyables)

    - +}

    Usually, each challenge should have an id where the first digit is the row and the second digit is the column.

    Individual Challenges can have these features:

    • name: Name of the challenge, can be a string or a function. Can use basic HTML.

    • challengeDescription: A description of what makes the challenge a challenge. You will need to implement these elsewhere. It can also be a function that returns updating text. Can use basic HTML.

    • goalDescription: A description of the win condition for the challenge. It can also be a function that returns updating text. Can use basic HTML. (Optional if using the old goal system)

    • canComplete(): A function that returns true if you meet the win condition for the challenge. Returning a number will allow bulk completing the challenge. (Optional if using the old goal system)

    • rewardDescription: A description of the reward's effect. You will also have to implement the effect where it is applied. It can also be a function that returns updating text. Can use basic HTML.

    • rewardEffect(): optional. A function that calculates and returns the current values of any bonuses from the reward. Can return a value or an object containing multiple values. Can use basic HTML.

    • rewardDisplay(): optional. A function that returns a display of the current effects of the reward with formatting. Default behavior is to just display the a number appropriately formatted.

    • fullDisplay(): OVERRIDE. Overrides the other displays and descriptions, and lets you set the full text for the challenge. Can use basic HTML.

    • unlocked(): optional. A function returning a bool to determine if the challenge is visible or not. Default is unlocked.

    • onComplete() - optional. this function will be called when the challenge is completed when previously incomplete.

    • onEnter() - optional. this function will be called when entering the challenge

    • onExit() - optional. this function will be called when exiting the challenge in any way

    • countsAs: optional. If a challenge combines the effects of other challenges in this layer, you can use this. An array of challenge ids. The player is effectively in all of those challenges when in the current one.

    • completionLimit: optional. the amount of times you can complete this challenge. Default is 1 completion.

    • style: optional. Applies CSS to this challenge, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • marked: optional Adds a mark to the corner of the challenge. If it's "true" it will be a star, but it can also be an image URL. By default, if the challenge has multiple completions, it will be starred at max completions.

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

    • id: assigned automagically. It's the "key" which the challenge was stored under, for convenient access. The challenge in the example's id is 11.

    The old goal system uses these features:

    • goal: deprecated, A Decimal for the amount of currency required to beat the challenge. By default, the goal is in basic Points. The goal can also be a function if its value changes.

    • currencyDisplayName: deprecated. the name to display for the currency for the goal

    • currencyInternalName: deprecated. the internal name for that currency

    • currencyLayer: deprecated. the internal name of the layer that currency is stored in. If it's not in a layer, omit. If it's not stored directly in a layer, instead use the next feature.

    • currencyLocation(): deprecated. if your currency is stored in something inside a layer (e.g. a buyable's amount), you can access it this way. This is a function returning the object in "player" that contains the value (like player[this.layer].buyables)

    + \ No newline at end of file diff --git a/public/kronos/docs/clickables.html b/public/kronos/docs/clickables.html index 64b0c2c8..5167ddfe 100644 --- a/public/kronos/docs/clickables.html +++ b/public/kronos/docs/clickables.html @@ -8,11 +8,11 @@ - + - - + + @@ -312,8 +312,8 @@ etc } etc -}

    Features:

    • title: optional. displayed at the top in a larger font. It can also be a function that returns updating text.

    • effect(): optional. A function that calculates and returns the current values of bonuses of this clickable. Can return a value or an object containing multiple values.

    • display(): A function returning everything that should be displayed on the clickable after the title, likely changing based on its state. Can use basic HTML.

    • unlocked(): optional. A function returning a bool to determine if the clickable is visible or not. Default is unlocked.

    • canClick(): A function returning a bool to determine if you can click the clickable.

    • onClick(): A function that implements clicking the clickable.

    • onHold(): optional A function that is called 20x/sec when the button is held for at least 0.25 seconds.

    • style: optional. Applies CSS to this clickable, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • marked: optional Adds a mark to the corner of the clickable. If it's "true" it will be a star, but it can also be an image URL.

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the clickable was stored under, for convenient access. The clickable in the example's id is 11.

    You can also use these features on the clickables object to add a button above all the clickables, for implementing a respec button or similar.

    • masterButtonPress(): optional. If present, an additional button will appear above the clickables. Pressing it will call this function.

    • masterButtonText: optional. Text to display on the Master Button.

    • showMasterButton(): optional. A function determining whether or not to show the button, if masterButtonPress is defined. Defaults to true if absent.

    - +}

    Features:

    • title: optional. displayed at the top in a larger font. It can also be a function that returns updating text.

    • effect(): optional. A function that calculates and returns the current values of bonuses of this clickable. Can return a value or an object containing multiple values.

    • display(): A function returning everything that should be displayed on the clickable after the title, likely changing based on its state. Can use basic HTML.

    • unlocked(): optional. A function returning a bool to determine if the clickable is visible or not. Default is unlocked.

    • canClick(): A function returning a bool to determine if you can click the clickable.

    • onClick(): A function that implements clicking the clickable.

    • onHold(): optional A function that is called 20x/sec when the button is held for at least 0.25 seconds.

    • style: optional. Applies CSS to this clickable, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • marked: optional Adds a mark to the corner of the clickable. If it's "true" it will be a star, but it can also be an image URL.

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the clickable was stored under, for convenient access. The clickable in the example's id is 11.

    You can also use these features on the clickables object to add a button above all the clickables, for implementing a respec button or similar.

    • masterButtonPress(): optional. If present, an additional button will appear above the clickables. Pressing it will call this function.

    • masterButtonText: optional. Text to display on the Master Button.

    • showMasterButton(): optional. A function determining whether or not to show the button, if masterButtonPress is defined. Defaults to true if absent.

    + \ No newline at end of file diff --git a/public/kronos/docs/custom-tab-layouts.html b/public/kronos/docs/custom-tab-layouts.html index 4d2af002..0d6ffd70 100644 --- a/public/kronos/docs/custom-tab-layouts.html +++ b/public/kronos/docs/custom-tab-layouts.html @@ -8,11 +8,11 @@ - + - - + + @@ -319,8 +319,8 @@ "blank", "blank", "upgrades" -]

    It is a list of components, which can be either just a name, or an array with arguments. If it's an array, the first item is the name of the component, the second is the data passed into it, and the third (optional) applies a CSS style to it with a "CSS object", where the keys are CSS attributes.

    These are the existing components, but you can create more in components.js:

    • display-text: Displays some text (can use basic HTML). The argument is the text to display. It can also be a function that returns updating text.

    • raw-html: Displays some basic HTML, can also be a function.

    • blank: Adds empty space. The default dimensions are 8px x 17px. The argument changes the dimensions. If it's a single value (e.g. "20px"), that determines the height. If you have a pair of arguments, the first is width and the second is height.

    • row: Display a list of components horizontally. The argument is an array of components in the tab layout format.

    • column: Display a list of components vertically. The argument is an array of components in the tab layout format. This is useful to display columns within a row.

    • main-display: The text that displays the main currency for the layer and its effects. The argument is the amount of precision to use, allowing it to display non-whole numbers.

    • resource-display: The text that displays the currency that this layer is based on, as well as the best and/or total values for this layer's prestige currency (if they are put in startData for this layer).

    • prestige-button: The argument is a string that the prestige button should say before the amount of currency you will gain. It can also be a function that returns updating text.

    • text-input: A text input box. The argument is the name of the variable in player[layer] that the input is for, player[layer][argument] (Works with strings, numbers, and Decimals!)

    • slider: Lets the user input a value with a slider. The argument a 3-element array: [name, min, max]. The name is the name of the variable in player[layer] that the input that the input is for, and min and max are the limits of the slider. (Does not work for Decimal values)

    • upgrades: The layer's upgrades. The argument is optional, and is a the list of rows this component should include, if it doesn't have all of them.

    • milestones, challenges, achievements: Display the upgrades, milestones, and challenges for a layer, as appropriate.

    • buyables, clickables: Display all of the buyables/clickables for this layer, as appropriate. The argument is optional and is the size of the boxes in pixels.

    • microtabs: Display a set of subtabs for an area. The argument is the name of the set of microtabs in the "microtabs" feature.

    • bar: Display a bar. The argument is the id of the bar to display.

    • infobox: Display an infobox. The argument is the id of the infobox to display.

    • tree: Displays a tree. The argument is an array of arrays containing the names of the nodes in the tree (first by row, then by column) See here for more information on tree layouts and nodes!

    • toggle: A toggle button that toggles a bool value. The argument is a pair that identifies the location in player of the bool to toggle, e.g. [layer, id]. 'layer' also affects the color of the toggle.

    • grid: Displays the gridable grid for the layer. If you need more than one grid, use a layer proxy.

    • layer-proxy: Lets you use components from another layer. The argument is a pair, [layer, data], consisting of the id of the layer to proxy from, and the tabFormat for the components to show. (Note: you cannot use a microtab within a layer proxy)

    The rest of the components are sub-components. They can be used just like other components, but are typically part of another component.

    • upgrade, milestone, challenge, buyable, clickable, achievement, gridable: An individual upgrade, challenge, etc. The argument is the id. This can be used if you want to have upgrades split up across multiple subtabs, for example.

    • respec-button, master-button: The respec and master buttons for buyables and clickables, respectively.

    • sell-one, sell-all: The "sell one" and "sell all" for buyables, respectively. The argument is the id of the buyable.

    - +]

    It is a list of components, which can be either just a name, or an array with arguments. If it's an array, the first item is the name of the component, the second is the data passed into it, and the third (optional) applies a CSS style to it with a "CSS object", where the keys are CSS attributes.

    These are the existing components, but you can create more in components.js:

    • display-text: Displays some text (can use basic HTML). The argument is the text to display. It can also be a function that returns updating text.

    • raw-html: Displays some basic HTML, can also be a function.

    • blank: Adds empty space. The default dimensions are 8px x 17px. The argument changes the dimensions. If it's a single value (e.g. "20px"), that determines the height. If you have a pair of arguments, the first is width and the second is height.

    • row: Display a list of components horizontally. The argument is an array of components in the tab layout format.

    • column: Display a list of components vertically. The argument is an array of components in the tab layout format. This is useful to display columns within a row.

    • main-display: The text that displays the main currency for the layer and its effects. The argument is the amount of precision to use, allowing it to display non-whole numbers.

    • resource-display: The text that displays the currency that this layer is based on, as well as the best and/or total values for this layer's prestige currency (if they are put in startData for this layer).

    • prestige-button: The argument is a string that the prestige button should say before the amount of currency you will gain. It can also be a function that returns updating text.

    • text-input: A text input box. The argument is the name of the variable in player[layer] that the input is for, player[layer][argument] (Works with strings, numbers, and Decimals!)

    • slider: Lets the user input a value with a slider. The argument a 3-element array: [name, min, max]. The name is the name of the variable in player[layer] that the input that the input is for, and min and max are the limits of the slider. (Does not work for Decimal values)

    • upgrades: The layer's upgrades. The argument is optional, and is a the list of rows this component should include, if it doesn't have all of them.

    • milestones, challenges, achievements: Display the upgrades, milestones, and challenges for a layer, as appropriate.

    • buyables, clickables: Display all of the buyables/clickables for this layer, as appropriate. The argument is optional and is the size of the boxes in pixels.

    • microtabs: Display a set of subtabs for an area. The argument is the name of the set of microtabs in the "microtabs" feature.

    • bar: Display a bar. The argument is the id of the bar to display.

    • infobox: Display an infobox. The argument is the id of the infobox to display.

    • tree: Displays a tree. The argument is an array of arrays containing the names of the nodes in the tree (first by row, then by column) See here for more information on tree layouts and nodes!

    • toggle: A toggle button that toggles a bool value. The argument is a pair that identifies the location in player of the bool to toggle, e.g. [layer, id]. 'layer' also affects the color of the toggle.

    • grid: Displays the gridable grid for the layer. If you need more than one grid, use a layer proxy.

    • layer-proxy: Lets you use components from another layer. The argument is a pair, [layer, data], consisting of the id of the layer to proxy from, and the tabFormat for the components to show. (Note: you cannot use a microtab within a layer proxy)

    The rest of the components are sub-components. They can be used just like other components, but are typically part of another component.

    • upgrade, milestone, challenge, buyable, clickable, achievement, gridable: An individual upgrade, challenge, etc. The argument is the id. This can be used if you want to have upgrades split up across multiple subtabs, for example.

    • respec-button, master-button: The respec and master buttons for buyables and clickables, respectively.

    • sell-one, sell-all: The "sell one" and "sell all" for buyables, respectively. The argument is the id of the buyable.

    + \ No newline at end of file diff --git a/public/kronos/docs/getting-started.html b/public/kronos/docs/getting-started.html index 6dcb4ea2..fb9339bb 100644 --- a/public/kronos/docs/getting-started.html +++ b/public/kronos/docs/getting-started.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

    Getting started

    Welcome to The Modding Tree!

    Using the Modding Tree, at its simplest level, just requires getting a copy of it onto your computer. However, if you do it the right way, it will help in many ways.

    Don't let the word "Github" scare you away. It's actually much easier to use than most people think, especially because most people use it the hard way. The key is Github Desktop, which lets you do everything you need to, without even touching the command line.

    The benefits of using Github:

    • It makes it much, much easier to update The Modding Tree.
    • You can share your work without any extra effort using githack, or with a bit more effort, set up a github.io site.
    • It lets you undo changes to your code, and to have multiple versions of it.
    • It lets you collaborate with other people, if you want to.

    Getting set up with Github Desktop, Visual Studio Code, and The Modding Tree:

    1. Install Github Desktop and Visual Studio Code.

    2. Make a Github account. You can handle this on your own.

    3. Log in on your browser, and go back to The Modding Tree page. At the top right, there should be a button that says "fork". Click on it, and then on your username. You now have your own fork, or copy, of The Modding Tree.

    4. Open Github Desktop and log in. Ignore everything else and choose "clone a repository". A "repository" is basically a "Github project", like The Modding Tree. "Cloning" is downloading a copy of the repository to your computer.

    5. Look for The Modding Tree in the list of repositiories (it should be the only one) and click "clone".

    6. Select that you're using it for your own purposes, and click continue. It will download the files and handle everything.

    Using your repository

    1. Click on "show in explorer/finder" to the right, and then open the index.html file in the folder. The page should open up on your browser. This will let you view and test your project locally!

    2. To edit your project, click "open in VSCode" in Github Desktop.

    3. Open mod.js in VSCode, and look at the top part where it has a "modInfo" object. Fill in your mod's name to whatever you want, and change the id as well. (It can be any string value, and it's used to determine where the savefile is. Make it something that's probably unique, and don't change it again later or else it'll effectively wipe existing saves)

    4. Save mod.js, and then reload index.html in your browser. The title on the tab, as well as on the info page, will now be updated! You can reload the page every time you change the code to test it quickly and easily.

    5. Go back to Github Desktop. It's time to save your changes into the git system by making a "commit". This basically saves your work and creates a snapshot of what your code looks like at this moment, allowing you to look back at it later.

    6. At the bottom right corner, add a summary of your changes, and then click "commit to master".

    7. Finally, at the top middle, click "push origin" to push your changes out onto the online repository.

    8. You can view your project on line, or share it with others, by going to https://raw.githack.com/[YOUR-GITHUB-USERNAME]/The-Modding-Tree/master/index.html

    And now, you have successfully used Github! You can look at the documentation to see how The Modding Tree's system works and to make your mod a reality.

    - +

    Getting started

    Welcome to The Modding Tree!

    Using the Modding Tree, at its simplest level, just requires getting a copy of it onto your computer. However, if you do it the right way, it will help in many ways.

    Don't let the word "Github" scare you away. It's actually much easier to use than most people think, especially because most people use it the hard way. The key is Github Desktop, which lets you do everything you need to, without even touching the command line.

    The benefits of using Github:

    • It makes it much, much easier to update The Modding Tree.
    • You can share your work without any extra effort using githack, or with a bit more effort, set up a github.io site.
    • It lets you undo changes to your code, and to have multiple versions of it.
    • It lets you collaborate with other people, if you want to.

    Getting set up with Github Desktop, Visual Studio Code, and The Modding Tree:

    1. Install Github Desktop and Visual Studio Code.

    2. Make a Github account. You can handle this on your own.

    3. Log in on your browser, and go back to The Modding Tree page. At the top right, there should be a button that says "fork". Click on it, and then on your username. You now have your own fork, or copy, of The Modding Tree.

    4. Open Github Desktop and log in. Ignore everything else and choose "clone a repository". A "repository" is basically a "Github project", like The Modding Tree. "Cloning" is downloading a copy of the repository to your computer.

    5. Look for The Modding Tree in the list of repositiories (it should be the only one) and click "clone".

    6. Select that you're using it for your own purposes, and click continue. It will download the files and handle everything.

    Using your repository

    1. Click on "show in explorer/finder" to the right, and then open the index.html file in the folder. The page should open up on your browser. This will let you view and test your project locally!

    2. To edit your project, click "open in VSCode" in Github Desktop.

    3. Open mod.js in VSCode, and look at the top part where it has a "modInfo" object. Fill in your mod's name to whatever you want, and change the id as well. (It can be any string value, and it's used to determine where the savefile is. Make it something that's probably unique, and don't change it again later or else it'll effectively wipe existing saves)

    4. Save mod.js, and then reload index.html in your browser. The title on the tab, as well as on the info page, will now be updated! You can reload the page every time you change the code to test it quickly and easily.

    5. Go back to Github Desktop. It's time to save your changes into the git system by making a "commit". This basically saves your work and creates a snapshot of what your code looks like at this moment, allowing you to look back at it later.

    6. At the bottom right corner, add a summary of your changes, and then click "commit to master".

    7. Finally, at the top middle, click "push origin" to push your changes out onto the online repository.

    8. You can view your project on line, or share it with others, by going to https://raw.githack.com/[YOUR-GITHUB-USERNAME]/The-Modding-Tree/master/index.html

    And now, you have successfully used Github! You can look at the documentation to see how The Modding Tree's system works and to make your mod a reality.

    + \ No newline at end of file diff --git a/public/kronos/docs/grids.html b/public/kronos/docs/grids.html index 67c1187f..ab65364e 100644 --- a/public/kronos/docs/grids.html +++ b/public/kronos/docs/grids.html @@ -8,11 +8,11 @@ - + - - + + @@ -326,8 +326,8 @@ }, etc -}

    Features:

    • rows, cols: The amount of rows and columns of gridable to display.

    • maxRows, maxCols: sometimes needed. If rows or cols are dynamic, you need to define the maximum amount that there can be (you can increase it when you update the game though). These CANNOT be dynamic.

    • getStartData(id): Creates the default data for the gridable at this position. This can be an object, or a regular value.

    • getUnlocked(id): optional. Returns true if the gridable at this position should be visible.

    • getTitle(data, id): optional. Returns text that should displayed at the top in a larger font, based on the position and data of the gridable.

    • getDisplay(data, id): optional. Returns everything that should be displayed on the gridable after the title, based on the position and data of the gridable.

    • getStyle(data, id): optional. Returns CSS to apply to this gridable, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • getCanClick(data, id): optional. A function returning a bool to determine if you can click a gridable, based on its data and position. If absent, you can always click it.

    • onClick(data, id): A function that implements clicking on the gridable, based on its position and data.

    • onHold(data, id): optional A function that is called 20x/sec when the button is held for at least 0.25 seconds.

    • getEffect(data, id): optional. A function that calculates and returns a gridable's effect, based on its position and data. (Whatever that means for a gridable)

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    - +}

    Features:

    • rows, cols: The amount of rows and columns of gridable to display.

    • maxRows, maxCols: sometimes needed. If rows or cols are dynamic, you need to define the maximum amount that there can be (you can increase it when you update the game though). These CANNOT be dynamic.

    • getStartData(id): Creates the default data for the gridable at this position. This can be an object, or a regular value.

    • getUnlocked(id): optional. Returns true if the gridable at this position should be visible.

    • getTitle(data, id): optional. Returns text that should displayed at the top in a larger font, based on the position and data of the gridable.

    • getDisplay(data, id): optional. Returns everything that should be displayed on the gridable after the title, based on the position and data of the gridable.

    • getStyle(data, id): optional. Returns CSS to apply to this gridable, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • getCanClick(data, id): optional. A function returning a bool to determine if you can click a gridable, based on its data and position. If absent, you can always click it.

    • onClick(data, id): A function that implements clicking on the gridable, based on its position and data.

    • onHold(data, id): optional A function that is called 20x/sec when the button is held for at least 0.25 seconds.

    • getEffect(data, id): optional. A function that calculates and returns a gridable's effect, based on its position and data. (Whatever that means for a gridable)

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    + \ No newline at end of file diff --git a/public/kronos/docs/infoboxes.html b/public/kronos/docs/infoboxes.html index 595ba2e7..34e84a57 100644 --- a/public/kronos/docs/infoboxes.html +++ b/public/kronos/docs/infoboxes.html @@ -8,11 +8,11 @@ - + - - + + @@ -313,8 +313,8 @@ etc }, etc -}

    Features:

    • title: The text displayed above the main box. Can be a function to be dynamic, and can use basic HTML.

    • body: The text displayed inside the box. Can be a function to be dynamic, and can use basic HTML.

    • style, titleStyle, bodyStyle: optional. Apply CSS to the infobox, or to the title button or body of the infobox, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • unlocked(): optional. A function returning a bool to determine if the infobox is visible or not. Default is unlocked.

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

    • id: assigned automagically. It's the "key" which the bar was stored under, for convenient access. The infobox in the example's id is "lore".

    - +}

    Features:

    • title: The text displayed above the main box. Can be a function to be dynamic, and can use basic HTML.

    • body: The text displayed inside the box. Can be a function to be dynamic, and can use basic HTML.

    • style, titleStyle, bodyStyle: optional. Apply CSS to the infobox, or to the title button or body of the infobox, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • unlocked(): optional. A function returning a bool to determine if the infobox is visible or not. Default is unlocked.

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

    • id: assigned automagically. It's the "key" which the bar was stored under, for convenient access. The infobox in the example's id is "lore".

    + \ No newline at end of file diff --git a/public/kronos/docs/layer-features.html b/public/kronos/docs/layer-features.html index cb543b7f..9ffa76a9 100644 --- a/public/kronos/docs/layer-features.html +++ b/public/kronos/docs/layer-features.html @@ -8,11 +8,11 @@ - + - - + + @@ -316,8 +316,8 @@ ]
  • style: optional. a "CSS object" where the keys are CSS attributes, containing any CSS that should affect this layer's entire tab.

  • tabFormat: optional. use this if you want to add extra things to your tab or change the layout. See here for more info.

  • midsection: optional, an alternative to tabFormat, which is inserted in between Milestones and Buyables in the standard tab layout. (cannot do subtabs)

  • Big features (all optional)

    • upgrades: A set of one-time purchases which can have unique upgrade conditions, currency costs, and bonuses. See here for more info.

    • milestones: A list of bonuses gained upon reaching certain thresholds of a resource. Often used for automation/QOL. See here for more info.

    • challenges: The player can enter challenges, which make the game harder. If they reach a goal and beat the challenge, they recieve a bonus. See here for more info.

    • buyables: Effectively upgrades that can be bought multiple times, and are optionally respeccable. Many uses. See here for more info.

    • clickables: Extremely versatile and generalized buttons which can only be clicked sometimes. See here for more info.

    • microtabs: An area that functions like a set of subtabs, with buttons at the top changing the content within. (Advanced) See here for more info.

    • bars: Display some information as a progress bar, gague, or similar. They are highly customizable, and can be vertical as well. See here for more info.

    • achievements: Kind of like milestones, but with a different display style and some other differences. Extra features are on the way at a later date! See here for more info.

    • achievementPopups, milestonePopups: optional, If false, disables popup message when you get the achievement/milestone. True by default.

    • infoboxes: Displays some text in a box that can be shown or hidden. See here for more info.

    • grid: A grid of buttons that behave the same, but have their own data.See here for more info.

    Prestige formula features

    • type: optional. Determines which prestige formula you use. Defaults to "none".

      • "normal": The amount of currency you gain is independent of its current amount (like Prestige). The formula before bonuses is based on baseResource^exponent
      • "static": The cost is dependent on your total after reset. The formula before bonuses is based on base^(x^exponent)
      • "custom": You can define everything, from the calculations to the text on the button, yourself. (See more at the bottom)
      • "none": This layer does not prestige, and therefore does not need any of the other features in this section.
    • baseResource: The name of the resource that determines how much of the main currency you gain on reset.

    • baseAmount(): A function that gets the current value of the base resource.

    • requires: A Decimal, the amount of the base needed to gain 1 of the prestige currency. Also the amount required to unlock the layer. You can instead make this a function, to make it harder if another layer was unlocked first (based on unlockOrder).

    • exponent: Used as described above.

    • base: sometimes required. required for "static" layers, used as described above. If absent, defaults to 2. Must be greater than 1.

    • roundUpCost: optional. a bool, which is true if the resource cost needs to be rounded up. (use if the base resource is a "static" currency.)

    • gainMult(), gainExp(): optional. For normal layers, these functions calculate the multiplier and exponent on resource gain from upgrades and boosts and such. Plug in most bonuses here. For static layers, they instead divide and root the cost of the resource.

    • directMult(): optional. Directly multiplies the resource gain, after exponents and softcaps. For static layers, actually multiplies resource gain instead of reducing the cost.

    • softcap, softcapPower: optional. For normal layers, gain beyond [softcap] points is put to the [softcapPower]th power Default for softcap is e1e7, and for power is 0.5.

    • canBuyMax(): sometimes required. required for static layers, function used to determine if buying max is permitted.

    • onPrestige(gain): optional. A function that triggers when this layer prestiges, just before you gain the currency. Can be used to have secondary resource gain on prestige, or to recalculate things or whatnot.

    • resetDescription: optional. Use this to replace "Reset for " on the Prestige button with something else.

    • prestigeButtonText(): sometimes required. Use this to make the entirety of the text a Prestige button contains. Only required for custom layers, but usable by all types.

    • passiveGeneration(): optional, returns a regular number. You automatically generate your gain times this number every second (does nothing if absent) This is good for automating Normal layers.

    • autoPrestige(): optional, returns a boolean, if true, the layer will always automatically do a prestige if it can. This is good for automating Static layers.

    Tree/node features

    • symbol: optional. The text that appears on this layer's node. Default is the layer id with the first letter capitalized.

    • image: override. The url (local or global) of an image that goes on the node. (Overrides symbol)

    • position: optional. Determines the horizontal position of the layer in its row in a standard tree. By default, it uses the layer id, and layers are sorted in alphabetical order.

    • branches: optional. An array of layer/node ids. On a tree, a line will appear from this layer to all of the layers in the list. Alternatively, an entry in the array can be a 2-element array consisting of the layer id and a color value. The color value can either be a string with a hex color code, or a number from 1-3 (theme-affected colors).

    • nodeStyle: optional. A CSS object, where the keys are CSS attributes, which styles this layer's node on the tree.

    • tooltip() / tooltipLocked(): optional. Functions that return text, which is the tooltip for the node when the layer is unlocked or locked, respectively. By default the tooltips behave the same as in the original Prestige Tree. If the value is "", the tooltip will be disabled.

    • marked: optional Adds a mark to the corner of the node. If it's "true" it will be a star, but it can also be an image URL.

    Other features

    • doReset(resettingLayer): optional. Is triggered when a layer on a row greater than or equal to this one does a reset. The default behavior is to reset everything on the row, but only if it was triggered by a layer in a higher row. doReset is always called for side layers, but for these the default behavior is to reset nothing.

      If you want to keep things, determine what to keep based on resettingLayer, milestones, and such, then call layerDataReset(layer, keep), where layer is this layer, and keep is an array of the names of things to keep. It can include things like "points", "best", "total" (for this layer's prestige currency), "upgrades", any unique variables like "generatorPower", etc. If you want to only keep specific upgrades or something like that, save them in a separate variable, then call layerDataReset, and then set player[this.layer].upgrades to the saved upgrades.

    • update(diff): optional. This function is called every game tick. Use it for any passive resource production or time-based things. diff is the time since the last tick.

    • autoUpgrade: optional, a boolean value, if true, the game will attempt to buy this layer's upgrades every tick. Defaults to false.

    • automate(): optional. This function is called every game tick, after production. Use it to activate automation things that aren't otherwise supported.

    • resetsNothing: optional. Returns true if this layer shouldn't trigger any resets when you prestige.

    • increaseUnlockOrder: optional. An array of layer ids. When this layer is unlocked for the first time, the unlockOrder value for any not-yet-unlocked layers in this list increases. This can be used to make them harder to unlock.

    • shouldNotify: optional. A function to return true if this layer should be highlighted in the tree. The layer will automatically be highlighted if you can buy an upgrade whether you have this or not.

    • glowColor: optional. The color that this layer will be highlighted if it should notify. The default is red. You can use this if you want several different notification types!

    • componentStyles: optional. An object that contains a set of functions returning CSS objects. Each of these will be applied to any components on the layer with the type of its id. Example:

    js
    componentStyles: {
         "challenge"() { return {'height': '200px'} },
         "prestige-button"() { return {'color': '#AA66AA'} }
    -}
    • deactivated: optional, if this is true, hasUpgrade, hasChallenge, hasAchievement, and hasMilestone will return false for things in the layer, and you will be unable to buy or click things on the layer. You will have to disable effects of buyables, the innate layer effect, and possibly other things yourself.

    Custom Prestige type

    (All of these can also be used by other prestige types)

    • getResetGain(): mostly for custom prestige type. Returns how many points you should get if you reset now. You can call getResetGain(this.layer, useType = "static") or similar to calculate what your gain would be under another prestige type (provided you have all of the required features in the layer).

    • getNextAt(canMax=false): mostly for custom prestige type. Returns how many of the base currency you need to get to the next point. canMax is an optional variable used with Static-ish layers to differentiate between if it's looking for the first point you can reset at, or the requirement for any gain at all (Supporting both is good). You can also call getNextAt(this.layer, canMax=false, useType = "static") or similar to calculate what your next at would be under another prestige type (provided you have all of the required features in the layer).

    • canReset(): mostly for custom prestige type. Return true only if you have the resources required to do a prestige here.

    • prestigeNotify(): mostly for custom prestige types, returns true if this layer should be subtly highlighted to indicate you can prestige for a meaningful gain.

    - +}
    • deactivated: optional, if this is true, hasUpgrade, hasChallenge, hasAchievement, and hasMilestone will return false for things in the layer, and you will be unable to buy or click things on the layer. You will have to disable effects of buyables, the innate layer effect, and possibly other things yourself.

    Custom Prestige type

    (All of these can also be used by other prestige types)

    • getResetGain(): mostly for custom prestige type. Returns how many points you should get if you reset now. You can call getResetGain(this.layer, useType = "static") or similar to calculate what your gain would be under another prestige type (provided you have all of the required features in the layer).

    • getNextAt(canMax=false): mostly for custom prestige type. Returns how many of the base currency you need to get to the next point. canMax is an optional variable used with Static-ish layers to differentiate between if it's looking for the first point you can reset at, or the requirement for any gain at all (Supporting both is good). You can also call getNextAt(this.layer, canMax=false, useType = "static") or similar to calculate what your next at would be under another prestige type (provided you have all of the required features in the layer).

    • canReset(): mostly for custom prestige type. Return true only if you have the resources required to do a prestige here.

    • prestigeNotify(): mostly for custom prestige types, returns true if this layer should be subtly highlighted to indicate you can prestige for a meaningful gain.

    + \ No newline at end of file diff --git a/public/kronos/docs/main-mod-info.html b/public/kronos/docs/main-mod-info.html index b8b0d6be..0f92f756 100644 --- a/public/kronos/docs/main-mod-info.html +++ b/public/kronos/docs/main-mod-info.html @@ -8,11 +8,11 @@ - + - - + + @@ -310,8 +310,8 @@ var doNotCallTheseFunctionsEveryTick = ["doReset", "buy", "onPurchase", "blowUpEverything"]
    • getStartPoints(): A function to determine the amount of points the player starts with after a reset. (returns a Decimal value)

    • canGenPoints(): A function returning a boolean for if points should be generated. Use this if you want an upgrade to unlock generating points.

    • getPointGen(): A function that calculates your points per second. Anything that affects your point gain should go into the calculation here.

    • addedPlayerData(): A function that returns any non-layer-related data that you want to be added to the save data and "player" object.

    js
    function addedPlayerData() { return {
     	weather: "Yes",
     	happiness: new Decimal(72),
    -}}
    • displayThings: An array of functions used to display extra things at the top of the tree tab. Each function returns a string, which is a line to display (with basic HTML support). If a function returns nothing, nothing is displayed (and it doesn't take up a line).

    • isEndgame(): A function to determine if the player has reached the end of the game, at which point the "you win!" screen appears.

    Less important things beyond this point!

    • maxTickLength(): Returns the maximum tick length, in milliseconds. Only really useful if you have something that reduces over time, which long ticks mess up (usually a challenge).

    • fixOldSave(): Can be used to modify a save file when loading into a new version of the game. Use this to undo inflation, never forcibly hard reset your players.

    - +}}
    • displayThings: An array of functions used to display extra things at the top of the tree tab. Each function returns a string, which is a line to display (with basic HTML support). If a function returns nothing, nothing is displayed (and it doesn't take up a line).

    • isEndgame(): A function to determine if the player has reached the end of the game, at which point the "you win!" screen appears.

    Less important things beyond this point!

    • maxTickLength(): Returns the maximum tick length, in milliseconds. Only really useful if you have something that reduces over time, which long ticks mess up (usually a challenge).

    • fixOldSave(): Can be used to modify a save file when loading into a new version of the game. Use this to undo inflation, never forcibly hard reset your players.

    + \ No newline at end of file diff --git a/public/kronos/docs/milestones.html b/public/kronos/docs/milestones.html index 3f94adba..cc5d6ea9 100644 --- a/public/kronos/docs/milestones.html +++ b/public/kronos/docs/milestones.html @@ -8,11 +8,11 @@ - + - - + + @@ -313,8 +313,8 @@ done() { return player.w.points.gte(123) } } etc -}

    You can use hasMilestone(layer, id) to determine if the player has a given milestone

    Milestone features:

    • requirementDescription: A string describing the requirement for unlocking this milestone. Suggestion: Use a "total". It can also be a function that returns updating text. Can use basic HTML.

    • effectDescription: A string describing the reward for having the milestone. You will have to implement the reward elsewhere. It can also be a function that returns updating text. Can use basic HTML.

    • done(): A function returning a boolean to determine if the milestone should be awarded.

    • toggles: optional. Creates toggle buttons that appear on the milestone when it is unlocked. The toggles can toggle a given boolean value in a layer. It is defined as an array of paired items, one pair per toggle. The first is the internal name of the layer the value being toggled is stored in, and the second is the internal name of the variable to toggle. (e.g. [["b", "auto"], ["g", "auto"])

      Tip: Toggles are not de-set if the milestone becomes locked! In this case, you should also check if the player has the milestone.

    • style: optional. Applies CSS to this milestone, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • unlocked(): optional. A function returning a boolean to determine if the milestone should be shown. If absent, it is always shown.

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the milestone was stored under, for convenient access. The milestone in the example's id is 0.

    Disaable milestone popups by adding milestonePopups: false to the layer.

    - +}

    You can use hasMilestone(layer, id) to determine if the player has a given milestone

    Milestone features:

    • requirementDescription: A string describing the requirement for unlocking this milestone. Suggestion: Use a "total". It can also be a function that returns updating text. Can use basic HTML.

    • effectDescription: A string describing the reward for having the milestone. You will have to implement the reward elsewhere. It can also be a function that returns updating text. Can use basic HTML.

    • done(): A function returning a boolean to determine if the milestone should be awarded.

    • toggles: optional. Creates toggle buttons that appear on the milestone when it is unlocked. The toggles can toggle a given boolean value in a layer. It is defined as an array of paired items, one pair per toggle. The first is the internal name of the layer the value being toggled is stored in, and the second is the internal name of the variable to toggle. (e.g. [["b", "auto"], ["g", "auto"])

      Tip: Toggles are not de-set if the milestone becomes locked! In this case, you should also check if the player has the milestone.

    • style: optional. Applies CSS to this milestone, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • unlocked(): optional. A function returning a boolean to determine if the milestone should be shown. If absent, it is always shown.

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the milestone was stored under, for convenient access. The milestone in the example's id is 0.

    Disaable milestone popups by adding milestonePopups: false to the layer.

    + \ No newline at end of file diff --git a/public/kronos/docs/particles.html b/public/kronos/docs/particles.html index 7c73cf4b..1a7868de 100644 --- a/public/kronos/docs/particles.html +++ b/public/kronos/docs/particles.html @@ -8,11 +8,11 @@ - + - - + + @@ -316,8 +316,8 @@ return (Math.random() + 1.2) * 8 }, etc... -}

    Features can be functions or constant. These features will be called when each particle is made, with an id argument, which is assigned based on which of the amount particles being spawned this is. All of these are optional, with a default value.

    All distances are in pixels and angles are in degrees, with 0 being up and going clockwise.

    • time: The amount of time, in seconds, that the particle will last. Default is 3.

    • fadeOutTime: The amount of seconds that fading out at the end should take (part of the total lifetime). Default is 1.

    • fadeInTime: The amount of seconds that fading in should take (part of the total lifetime). Default is 0.

    • image: The image the particle should display. "" will display no image. Default is a generic particle.

    • text: Displays text on the particle. Can use basic HTML.

    • style: Lets you apply other CSS styling to the particle.

    • width, height: The dimensions of the particle. Default is 35 and 35.

    • color: Sets the color of the image to this color.

    • angle: The angle that the particle should face. Default is 0.

    • dir: The initial angle that the particles should move in, before spread is factored in. Default is whatever angle is.

    • spread: If there are several particles, they will be spread out by this many degrees, centered on dir. Default is 30.

    • rotation: The amount that the (visual) angle of the particle should change by. Default is 0.

    • speed: The starting speed of the particle. Default is 15.

    • gravity: The amount the particle should accelerate downwards. Default is 0.

    • x, y: The starting coordinates of the particle. Default is at the mouse position.

    • offset: How far from the start each particle should appear. Default is 10.

    • xVel, yVel: Set initially based on other properties, then used to update movement.

    • layer: When changing tabs, if leaving the layer tab, this particle will be erased.

    • You can add other features to particles, but you must impliment their effects yourself.

    Function features: These stay as functions and are for more advanced things. They are optional.

    • update(): Called each tick. Lets you do more advanced visual and movement behaviors by changing other properties.
    • onClick(), onMouseOver(), onMouseLeave(): Called when the particle is interacted with.

    Other useful things that are not features of the particle object:

    • setDir(particle, dir), setSpeed(particle, speed): Set the speed/direction on a particle.
    • clearParticles(check): Function to delete particles. With no check, it deletes all particles. Check is a function that takes a particle, and returns true if that particle should be deleted.
    • You can use Vue.delete(particles, this.id) to make a particle delete itself.
    • mouseX and mouseY are variables that track the mouse position.
    • sin(x), cos(x), tan(x): functions that do these operations, with x in degrees. (Instead of radians).
    • asin(x), acos(x), atan(x): functions that do these operations, with the returned value in degrees. (instead of radians).
    - +}

    Features can be functions or constant. These features will be called when each particle is made, with an id argument, which is assigned based on which of the amount particles being spawned this is. All of these are optional, with a default value.

    All distances are in pixels and angles are in degrees, with 0 being up and going clockwise.

    • time: The amount of time, in seconds, that the particle will last. Default is 3.

    • fadeOutTime: The amount of seconds that fading out at the end should take (part of the total lifetime). Default is 1.

    • fadeInTime: The amount of seconds that fading in should take (part of the total lifetime). Default is 0.

    • image: The image the particle should display. "" will display no image. Default is a generic particle.

    • text: Displays text on the particle. Can use basic HTML.

    • style: Lets you apply other CSS styling to the particle.

    • width, height: The dimensions of the particle. Default is 35 and 35.

    • color: Sets the color of the image to this color.

    • angle: The angle that the particle should face. Default is 0.

    • dir: The initial angle that the particles should move in, before spread is factored in. Default is whatever angle is.

    • spread: If there are several particles, they will be spread out by this many degrees, centered on dir. Default is 30.

    • rotation: The amount that the (visual) angle of the particle should change by. Default is 0.

    • speed: The starting speed of the particle. Default is 15.

    • gravity: The amount the particle should accelerate downwards. Default is 0.

    • x, y: The starting coordinates of the particle. Default is at the mouse position.

    • offset: How far from the start each particle should appear. Default is 10.

    • xVel, yVel: Set initially based on other properties, then used to update movement.

    • layer: When changing tabs, if leaving the layer tab, this particle will be erased.

    • You can add other features to particles, but you must impliment their effects yourself.

    Function features: These stay as functions and are for more advanced things. They are optional.

    • update(): Called each tick. Lets you do more advanced visual and movement behaviors by changing other properties.
    • onClick(), onMouseOver(), onMouseLeave(): Called when the particle is interacted with.

    Other useful things that are not features of the particle object:

    • setDir(particle, dir), setSpeed(particle, speed): Set the speed/direction on a particle.
    • clearParticles(check): Function to delete particles. With no check, it deletes all particles. Check is a function that takes a particle, and returns true if that particle should be deleted.
    • You can use Vue.delete(particles, this.id) to make a particle delete itself.
    • mouseX and mouseY are variables that track the mouse position.
    • sin(x), cos(x), tan(x): functions that do these operations, with x in degrees. (Instead of radians).
    • asin(x), acos(x), atan(x): functions that do these operations, with the returned value in degrees. (instead of radians).
    + \ No newline at end of file diff --git a/public/kronos/docs/subtabs-and-microtabs.html b/public/kronos/docs/subtabs-and-microtabs.html index a9923e49..74ed8419 100644 --- a/public/kronos/docs/subtabs-and-microtabs.html +++ b/public/kronos/docs/subtabs-and-microtabs.html @@ -8,11 +8,11 @@ - + - - + + @@ -330,8 +330,8 @@ otherStuff: { // There could be another set of microtabs here } -}

    Normal subtabs and microtab subtabs both use the same features:

    Features:

    • content: The tab layout code for the subtab, in the tab layout format.

    • style: optional. Applies CSS to the whole subtab when switched to, in the form of an "CSS Object", where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • buttonStyle: optional. A CSS object, which affects the appearance of the button for that subtab.

    • unlocked(): optional. a function to determine if the button for this subtab should be visible. By default, a subtab is always unlocked. You can't use the "this" keyword in this function.

    • shouldNotify()/prestigeNotify(): optional, if true, the tab button will be highlighted to notify the player that there is something there.

    • glowColor: optional, specifies the color that the subtab glows. If this subtab is causing the main layer to node glow (and it would't otherwise) the node also glows this color. Is NOT overridden by embedding a layer.

    • embedLayer: SIGNIFICANT, the id of another layer. If you have this, it will override "content", "style" and "shouldNotify", instead displaying the entire layer in the subtab.

    - +}

    Normal subtabs and microtab subtabs both use the same features:

    Features:

    • content: The tab layout code for the subtab, in the tab layout format.

    • style: optional. Applies CSS to the whole subtab when switched to, in the form of an "CSS Object", where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • buttonStyle: optional. A CSS object, which affects the appearance of the button for that subtab.

    • unlocked(): optional. a function to determine if the button for this subtab should be visible. By default, a subtab is always unlocked. You can't use the "this" keyword in this function.

    • shouldNotify()/prestigeNotify(): optional, if true, the tab button will be highlighted to notify the player that there is something there.

    • glowColor: optional, specifies the color that the subtab glows. If this subtab is causing the main layer to node glow (and it would't otherwise) the node also glows this color. Is NOT overridden by embedding a layer.

    • embedLayer: SIGNIFICANT, the id of another layer. If you have this, it will override "content", "style" and "shouldNotify", instead displaying the entire layer in the subtab.

    + \ No newline at end of file diff --git a/public/kronos/docs/trees-and-tree-customization.html b/public/kronos/docs/trees-and-tree-customization.html index 5b7624c9..7ad1c864 100644 --- a/public/kronos/docs/trees-and-tree-customization.html +++ b/public/kronos/docs/trees-and-tree-customization.html @@ -8,11 +8,11 @@ - + - - + + @@ -308,8 +308,8 @@

    Trees and tree customization

    If you want to have something beyond the standard tree on the left tab, you can do that in tree.js. You can change the layout of the tree, including making non-layer nodes, change it into something other than a tree, or hide the left tab altogether. This also introduces the "tree" component, which can be used in your layers as well.

    layoutInfo

    The most important part is layoutInfo, containing:

    • startTab: The id of the default tab to show on the left at the start.
    • showTree: True if the tree tab should be shown at the start of the game. (The other tab will fill the whole page)
    • treeLayout: If present, overrides the tree layout and places nodes as you describe instead (explained in the next section).

    Additionally, if you want the main layout to not be a tree, you can edit the "tree-tab" layer at the bottom of tree.js to modify it just like a normal layer's tab. You can even switch between left tabs, using showNavTab(layer) to make that layer appear on the left.

    Trees

    The tree component is defined as an array of arrays of names of layers or nodes to show in the tree. They work just like layers/ nodes in the main tree (but branches between nodes will only work on the first node if you have duplicates.)

    Here is an example tree:

    js
    [["p"],
      ["left", "blank", "right", "blank"]
    - ["a", "b", "blank", "c", "weirdButton"]]

    Nodes

    Nodes are non-layer buttons that can go in trees. They are defined similarly to layers, but with addNode instead of addLayer.

    Features:

    • color: optional, The node's color. (A string in hex format with a #)

    • symbol: optional The text on the button (The id capitalized by default)

    • canClick(): Returns true if the player can click the node. ()

    • onClick(): The function called when the node is clicked.

    • layerShown(): optional, A function returning a bool which determines if this node should be visible. It can also return "ghost", which will hide the layer, but its node will still take up space in its tree.

    • branches: optional. An array of layer/node ids. On a tree, a line will appear from this node to all of the nodes in the list. Alternatively, an entry in the array can be a 2-element array consisting of the id and a color value. The color value can either be a string with a hex color code, or a number from 1-3 (theme-affected colors).

    • nodeStyle: optional. A CSS object, where the keys are CSS attributes, which styles this node on the tree.

    • tooltip() / tooltipLocked(): optional. Functions that return text, which is the tooltip for the node when the layer is unlocked or locked, respectively. By default the tooltips behave the same as in the original Prestige Tree.

    • row: optional, the row that this node appears in (for the default tree).

    • position: optional, Determines the horizontal position of the layer in its row in a default tree. By default, it uses the id, and layers/nodes are sorted in alphabetical order.

    - + ["a", "b", "blank", "c", "weirdButton"]]

    Nodes

    Nodes are non-layer buttons that can go in trees. They are defined similarly to layers, but with addNode instead of addLayer.

    Features:

    • color: optional, The node's color. (A string in hex format with a #)

    • symbol: optional The text on the button (The id capitalized by default)

    • canClick(): Returns true if the player can click the node. ()

    • onClick(): The function called when the node is clicked.

    • layerShown(): optional, A function returning a bool which determines if this node should be visible. It can also return "ghost", which will hide the layer, but its node will still take up space in its tree.

    • branches: optional. An array of layer/node ids. On a tree, a line will appear from this node to all of the nodes in the list. Alternatively, an entry in the array can be a 2-element array consisting of the id and a color value. The color value can either be a string with a hex color code, or a number from 1-3 (theme-affected colors).

    • nodeStyle: optional. A CSS object, where the keys are CSS attributes, which styles this node on the tree.

    • tooltip() / tooltipLocked(): optional. Functions that return text, which is the tooltip for the node when the layer is unlocked or locked, respectively. By default the tooltips behave the same as in the original Prestige Tree.

    • row: optional, the row that this node appears in (for the default tree).

    • position: optional, Determines the horizontal position of the layer in its row in a default tree. By default, it uses the id, and layers/nodes are sorted in alphabetical order.

    + \ No newline at end of file diff --git a/public/kronos/docs/updating-tmt.html b/public/kronos/docs/updating-tmt.html index 1fd4b3df..6b37673a 100644 --- a/public/kronos/docs/updating-tmt.html +++ b/public/kronos/docs/updating-tmt.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

    Updating The Modding Tree

    This tutorial assumes that you have used the Getting Started Tutorial, and are using Github Desktop and VSCode for your mod.

    Here's what you have to do when there's a TMT update:

    1. Look at the changelog. It will warn you if the update will break anything or require any changes. Decide if you want to try to update.

    2. Open Github Desktop, and at the top middle, click "fetch origin". This will make Github Desktop get information about the update.

    3. Click where it says "current branch: master" at the top middle, and at the bottom of the thing that appears, click "choose a branch to merge into master".

    4. Select upstream/master. It will likely say there are conflicts, but you have tools to resolve them. Click "Merge upstream/master into master".

    5. A conflict happens when the things you're trying to merge have both made changes in the same place. Click "open in Visual Studio Code" next to the first file.

    6. Scroll down through the file, and look for the parts highlighted in red and green. One of these is your code, and the other is some code that will be modified by the update. Do your best to try to edit things to keep the updated changes, but keep your content.

    7. Continue to do this for all remaining changes.

    8. Do any other changes required by the update, run the game, fix issues, etc.

    - +

    Updating The Modding Tree

    This tutorial assumes that you have used the Getting Started Tutorial, and are using Github Desktop and VSCode for your mod.

    Here's what you have to do when there's a TMT update:

    1. Look at the changelog. It will warn you if the update will break anything or require any changes. Decide if you want to try to update.

    2. Open Github Desktop, and at the top middle, click "fetch origin". This will make Github Desktop get information about the update.

    3. Click where it says "current branch: master" at the top middle, and at the bottom of the thing that appears, click "choose a branch to merge into master".

    4. Select upstream/master. It will likely say there are conflicts, but you have tools to resolve them. Click "Merge upstream/master into master".

    5. A conflict happens when the things you're trying to merge have both made changes in the same place. Click "open in Visual Studio Code" next to the first file.

    6. Scroll down through the file, and look for the parts highlighted in red and green. One of these is your code, and the other is some code that will be modified by the update. Do your best to try to edit things to keep the updated changes, but keep your content.

    7. Continue to do this for all remaining changes.

    8. Do any other changes required by the update, run the game, fix issues, etc.

    + \ No newline at end of file diff --git a/public/kronos/docs/upgrades.html b/public/kronos/docs/upgrades.html index 4fdbe211..ce0d8bfe 100644 --- a/public/kronos/docs/upgrades.html +++ b/public/kronos/docs/upgrades.html @@ -8,11 +8,11 @@ - + - - + + @@ -313,8 +313,8 @@ etc }, etc -}

    Usually, upgrades should have an id where the first digit is the row and the second digit is the column.

    Individual upgrades can have these features:

    • title: optional. Displayed at the top in a larger font. It can also be a function that returns updating text. Can use basic HTML.

    • description: A description of the upgrade's effect. You will also have to implement the effect where it is applied. It can also be a function that returns updating text. Can use basic HTML.

    • effect(): optional. A function that calculates and returns the current values of any bonuses from the upgrade. Can return a value or an object containing multiple values.

    • effectDisplay(): optional. A function that returns a display of the current effects of the upgrade with formatting. Default displays nothing. Can use basic HTML.

    • fullDisplay(): OVERRIDE. Overrides the other displays and descriptions, and lets you set the full text for the upgrade. Can use basic HTML.

    • cost: A Decimal for the cost of the upgrade. By default, upgrades cost the main prestige currency for the layer.

    • unlocked(): optional. A function returning a bool to determine if the upgrade is visible or not. Default is unlocked.

    • onPurchase(): optional. This function will be called when the upgrade is purchased. Good for upgrades like "makes this layer act like it was unlocked first".

    • style: optional. Applies CSS to this upgrade, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the upgrade was stored under, for convenient access. The upgrade in the example's id is 11.

    By default, upgrades use the main prestige currency for the layer. You can include these to change them (but it needs to be a Decimal):

    • currencyDisplayName: optional. The name to display for the currency for the upgrade.

    • currencyInternalName: optional. The internal name for that currency.

    • currencyLayer: optional. The internal name of the layer that currency is stored in. If it's not in a layer (like Points), omit. If it's not stored directly in a layer, instead use the next feature.

    • currencyLocation: optional. If your currency is stored in something inside a layer (e.g. a buyable's amount), you can access it this way. This is a function returning the object in "player" that contains the value (like player[this.layer].buyables)

    If you want to do something more complicated like upgrades that cost two currencies, you can override the purchase system with these (and you need to use fullDisplay as well)

    • canAfford(): OVERRIDE, a function determining if you are able to buy the upgrade

    • pay(): OVERRIDE, a function that reduces your currencies when you buy the upgrade

    - +}

    Usually, upgrades should have an id where the first digit is the row and the second digit is the column.

    Individual upgrades can have these features:

    • title: optional. Displayed at the top in a larger font. It can also be a function that returns updating text. Can use basic HTML.

    • description: A description of the upgrade's effect. You will also have to implement the effect where it is applied. It can also be a function that returns updating text. Can use basic HTML.

    • effect(): optional. A function that calculates and returns the current values of any bonuses from the upgrade. Can return a value or an object containing multiple values.

    • effectDisplay(): optional. A function that returns a display of the current effects of the upgrade with formatting. Default displays nothing. Can use basic HTML.

    • fullDisplay(): OVERRIDE. Overrides the other displays and descriptions, and lets you set the full text for the upgrade. Can use basic HTML.

    • cost: A Decimal for the cost of the upgrade. By default, upgrades cost the main prestige currency for the layer.

    • unlocked(): optional. A function returning a bool to determine if the upgrade is visible or not. Default is unlocked.

    • onPurchase(): optional. This function will be called when the upgrade is purchased. Good for upgrades like "makes this layer act like it was unlocked first".

    • style: optional. Applies CSS to this upgrade, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the upgrade was stored under, for convenient access. The upgrade in the example's id is 11.

    By default, upgrades use the main prestige currency for the layer. You can include these to change them (but it needs to be a Decimal):

    • currencyDisplayName: optional. The name to display for the currency for the upgrade.

    • currencyInternalName: optional. The internal name for that currency.

    • currencyLayer: optional. The internal name of the layer that currency is stored in. If it's not in a layer (like Points), omit. If it's not stored directly in a layer, instead use the next feature.

    • currencyLocation: optional. If your currency is stored in something inside a layer (e.g. a buyable's amount), you can access it this way. This is a function returning the object in "player" that contains the value (like player[this.layer].buyables)

    If you want to do something more complicated like upgrades that cost two currencies, you can override the purchase system with these (and you need to use fullDisplay as well)

    • canAfford(): OVERRIDE, a function determining if you are able to buy the upgrade

    • pay(): OVERRIDE, a function that reduces your currencies when you buy the upgrade

    + \ No newline at end of file diff --git a/public/lit/Old Things/2.0-format-changes.html b/public/lit/Old Things/2.0-format-changes.html index cf62372a..6d470388 100644 --- a/public/lit/Old Things/2.0-format-changes.html +++ b/public/lit/Old Things/2.0-format-changes.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

    2.0 format changes

    • Temp format is changed from temp.something[layer] to temp[layer].something, for consistency
    • Challenges are now saved as an object with the amount of completions in each spot. (This will break saves.)
    • effectDisplay in Challenges and Upgrades no longer takes an argument, and neither does effect for Buyables
    • Buyable cost can take an argument for amount of buyables, but it needs to function if no argument is supplied (it should do the cost for the next purchase).
    • Generation of Points now happens in the main game loop (not in a layer update function), enabled by canGenPoints in game.js.
    • Changed fullLayerReset to layerDataReset, which takes an array of names of values to keep

    In addition, many names were changed, mostly expanding abbreviations:

    All instances of:

    • chall -> challenge
    • unl -> unlocked
    • upg -> upgrade (besides CSS)
    • amt -> amount
    • desc -> description
    • resCeil -> roundUpCost
    • order -> unlockOrder
    • incr_order -> increaseUnlockOrder

    Challenges:

    • desc -> challengeDescription
    • reward -> rewardDescription
    • effect -> rewardEffect
    • effectDisplay -> rewardDisplay
    • active -> challengeActive
    - +

    2.0 format changes

    • Temp format is changed from temp.something[layer] to temp[layer].something, for consistency
    • Challenges are now saved as an object with the amount of completions in each spot. (This will break saves.)
    • effectDisplay in Challenges and Upgrades no longer takes an argument, and neither does effect for Buyables
    • Buyable cost can take an argument for amount of buyables, but it needs to function if no argument is supplied (it should do the cost for the next purchase).
    • Generation of Points now happens in the main game loop (not in a layer update function), enabled by canGenPoints in game.js.
    • Changed fullLayerReset to layerDataReset, which takes an array of names of values to keep

    In addition, many names were changed, mostly expanding abbreviations:

    All instances of:

    • chall -> challenge
    • unl -> unlocked
    • upg -> upgrade (besides CSS)
    • amt -> amount
    • desc -> description
    • resCeil -> roundUpCost
    • order -> unlockOrder
    • incr_order -> increaseUnlockOrder

    Challenges:

    • desc -> challengeDescription
    • reward -> rewardDescription
    • effect -> rewardEffect
    • effectDisplay -> rewardDisplay
    • active -> challengeActive
    + \ No newline at end of file diff --git a/public/lit/README.html b/public/lit/README.html index dca3ec41..0c5759c0 100644 --- a/public/lit/README.html +++ b/public/lit/README.html @@ -8,10 +8,10 @@ - + - + @@ -307,7 +307,7 @@

    Kronos

    Play here.

    Updating the website:

    • git submodule update --remote
    • git add -A
    • git commit -m "Updated kronos"
    • git push
    - + \ No newline at end of file diff --git a/public/lit/changelog.html b/public/lit/changelog.html index 4b58a38b..e7f55775 100644 --- a/public/lit/changelog.html +++ b/public/lit/changelog.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

    The Modding Tree changelog:

    v2.π: Incrementally Updated - 2/5/21

    • Performance improvements.
    • Fixed tooltips overlapping with the top display.
    • Clicking a popup dismisses it immediately.
    • Added support for bulk challenge completions.
    • "Best" is updated automatically.
    • Fixed keeping Decimal values on reset.
    • Code reorganization and style improvements by fudo.

    v2.3.5 - 12/21/20

    • Added resetTime, which tracks the time since a layer prestiged or was reset.
    • A layer node will be highlighted red if one of its subtabs is highlighted red.
    • Fixed issues with keeping challenges, buyables, and clickables on reset.
    • Improved the unlocking of custom layers.
    • Other minor fixes.

    v2.3.4 - 12/16/20

    • Added a node image feature.
    • Resource display now always shows the amount of the currency the layer's gain is based on.
    • Added spacing between tree nodes.
    • Another attempt to fix tooltip flickering.

    v2.3.3 - 12/13/20

    • Fixed the first node in a row always taking up space.
    • layerShown is now optional.
    • All prestige types can now use features for custom prestige types.

    v2.3.2 - 12/13/20

    • Fixed achievement/milestone popups.

    v2.3.1 - 12/12/20

    • Another attempt to fix flickering tooltips.
    • The "this" keyword should work everywhere except tabFormat arrays (although I may have missed some things).
    • Fixed tree branches not updating when scrolling on the right-side tab.
    • Fixed a spacing issue when a node's symbol is ""
    • Removed some old, unneeded files.

    v2.3: Cooler and Newer Edition - 12/10/20

    • Added achievement/milestone popups (thank you to Jacorb for this contribution!)
    • The changelog tab is back, and can be set in mod.js.
    • Layer nodes and respec buttons will not be clicked by pressing "enter".
    • Possible fix for flickering tooltips and strange transitions.
    • The victory screen text is configurable.
    • Added image and textStyle features to achievements.
    • Added an argument to use specific rows in an "upgrades" component.
    • Fixed the comma appearing in the main display when there was no effectDescription
    • Added the ability to easily make a tab that is a collection of layers in subtabs.
    • Improved spacing for embedding layers with subtabs into subtabs.

    v2.2.8 - 12/03/20

    • Double-clicking a layer node brings you to the main subtab for that layer.
    • Attempted to fix challenges visually updating a different way.
    • Added a softcap function for use in formulas.
    • Added displayRow feature, which lets layers be shown somewhere separate from where they are in the reset order (e.g. side layers)
    • Fixed autoupgrade issue.

    v2.2.7 - 11/30/20

    • Added autoUpgrade feature.
    • resource-display now shows resource gain per second if passiveGain is active.
    • Fixed formatting issues on some large numbers.
    • Better support for using classed objects in player and in layers/tmp.
    • Made hard resetting more effective.
    • Removed Herobrine from getStartClickables.

    v2.2.6 - 11/30/20

    • Added goalDescription for challenges and made the new "canComplete" system the standard.
    • Another attempt to fix challenges not visually updating.
    • Fixed side layers not appearing.
    • Fixed getStartClickables again.

    v2.2.5 - 11/29/20

    • Added features for overriding the displays and costs/goals of upgrades and challenges to make them fully custom.
    • best, total, and unlocked are always automatically added to layerData (but best and total will only display if you add them yourself).
    • Fixed getStartClickables.

    v2.2.4 - 11/28/20

    • Added softcap and softcapPower features (for Normal layers)
    • Offline time limit and default max tick length were fixed (previously the limits were 1000x too large)
    • Added fixOldSaves.
    • You can use HTML in main-display.
    • Fixed a number of minor oddities.

    v2.2.3 - 11/28/20

    • Layers will be highlighted if you can finish a challenge.
    • The "can complete challenge" color now overrides the "already completed" color.
    • Button nodes now work as side "layers".
    • Setting a tooltip to "" hides it entirely.

    v2.2.2 - 11/22/20

    • Fixed right half of the screen being unclickable in some circumstances.
    • Fixed tree branches being offset.
    • Fix to lastSafeTab.

    v2.2.1 - 11/7/20

    • Added a small highlight to layers you can meaningfully prestige on.
    • Added passiveGeneration and autoPrestige features to standardize prestige automation. (The old ways still work, but the new ones work better with other things)
    • Improved milestones visually a bit.
    • "best" and "total" are now only displayed if present in startData.
    • Fixed issues with things not updating visually. (Thank you to to Jacorb!)
    • Side layers and button nodes can now be highlighted.
    • Updated docs on the new tree-related features.

    v2.2: Uprooted - 11/7/20

    • You can now embed a layer inside of a subtab or microtab!
    • Added support for hiding or reformatting the tree tab
    • Added non-layer button nodes
    • Added shouldNotify to subtab/microtab buttons. (You can make them highlighted)
    • Added commas to large exponents.
    • Upgrades now only show "currently" if they have an effectDisplay (so not for constant effects).
    • Achievements are part of the default tab format.
    • NaN is now handled more intelligently.
    • Renamed files, and moved less relevant ones to another folder.
    • The "hide completed challenges" setting now only hides challenges at max completions.
    • Thank you to thepaperpilot for fixing errors in docs and improving the infobox appearance!
    • Many other minor fixes.

    v2.1.4 - 10/25/20

    • Added an infobox component. Thank you to thepaperpilot for this contribution!
    • Layer type is now optional, and defaults to "none".
    • Improved the look of bars and tab buttons.
    • Improved spacing between layer nodes (also thanks to thepaperpilot!)
    • Fixed the "blank" component breaking if only specifying the height.
    • Fixed some numbers not displaying with enough digits.
    • Made a few more things able to be functions.
    • A few other minor fixes.

    v2.1.3.1 - 10/21/20

    • Fixed the update function.

    v2.1.3 - 10/21/20

    • gainMult and gainExp are now optional.
    • Layer unlocking is now kept on reset.
    • Game should start up faster.
    • Layer updates now have a determined order and starts with earlier-rowed layers.
    • Automation now has a determined order and starts with later-rowed layers.
    • Fixed issues with resetting clickables and challenges.
    • Commas should no longer appear in the decimal places of a number.
    • Fixed potential issue in displaying the tree.

    v2.1.2 - 10/19/20

    • Added buyUpgrade function (buyUpg still works though)
    • Added author name to modInfo.
    • Fix to crash caused when the name of a subtab or microtab is changed.
    • Fixes to outdated information in docs.
    • Improvements to Discord links.
    • Thank you to thepaperpilot for contributing to this update!

    v2.1.1 - 10/17/20

    • Added resource-display component, which displays the base currency for the prestige layer, as well as the best and/or total of this layer's prestige currency.
    • Fixed the value for the base currency not updating in resource-display.

    v2.1: We should have thought of this sooner! - 10/17/20

    • Moved most of the code users will want to edit to mod.js, added documentation for it.
      • Specifically, modInfo, VERSION, canGenPoints, getPointGen, and maxTickLength
    • Added getStartPoints()
    • Added the ability to store non-layer-related data
    • Added the ability to display more things at the top of the tree tab below points.
    • Made the endgame condition customizable
    • Added "sell one" and "sell all" buttons for buyables.
    • Moved the old "game" to demo.js, and replaced it with a minimal game that won't cause issues when edited.
    • Fixed issues with version number
    • Fixed number formatting issue making things like "10e9" appear.

    v2.0.5 - 10/16/20

    • Made more features (including prestige parameters) able to be dynamic.
    • Layer nodes can be hidden but still take up space with "ghost" visibility
    • Added clickableEffect for real.
    • Fixed some visual issues with bars.
    • A few other minor tweaks and improvements.

    v2.0.4 - 10/16/20

    • Fixed HTML on buttons interfering with clicking on them.

    v2.0.3 - 10/16/20

    • Fixed hotkeys not displaying in info.
    • Fixed the game supressing all external hotkeys.
    • You can use more things as currencies for upgrade costs and challenge goals using currencyLocation.
    • Added maxTickLength, which can be used to prevent offline time or tab-switching from breaking time-limit based mechanics.
    • Made buyable respec buttons and clickable "master" buttons their own components, and gave them a hide/show feature.
    • Added a general "tooltip" feature for achievements.

    v2.0.2 - 10/15/20

    • Branches are now dynamic (they can be functions).
    • Fixed a crash related to offline time.
    • Fixed links being too wide.

    v2.0.1 - 10/15/20

    • Fixed side layers appearing multiple times.

    v2.0: The Pinnacle of Achievement Mountain - 10/15/20

    • Added progress bars, which are highly customizable and can be horizontal or vertical!
    • Added "side layers", displayed smaller and off to the side, and don't get reset by default. They can be used for global achievements and statistics. Speaking of which...
    • Added achievements!
    • Added clickables, a more generalized variant of buyables.
    • Almost every value in layer data can be either a function or a constant value!
    • Added support for multiple completions of challenges.
    • Added "none" prestige type, which removes the need for any other prestige-related features.
    • The points display and other gui elements stay at the top of the screen when the tree scrolls.
    • Added getter/setter functions for the amounts and effects of most Big Features
    • Moved modInfo to game.js, added a spot in modInfo for a Discord link, changelog link. Also added a separate mod version from the TMT version in VERSION.
    • Tree structure is based on layer data, no index.html editing is needed.
    • Tmp does not need to be manually updated.
    • You don't have to have the same amount of upgrades in every row (and challs and buyables)
    • "unlocked" is optional for all Big Components (defaults to true).
    • All displays will update correctly.
    • Changelog is no longer in index.html at all.
    • Generation of Points now happens in the main game loop
    • Changed the reset functions to make keeping things easier
    • Renamed many things to increase readability (see the list in the link below)
    • Improved documentation based on feedback

    v1.3.5:

    • Completely automated convertToDecimal, now you never have to worry about it again.
    • Branches can be defined without a color id. But they can also use hex values for color ids!
    • Created a tutorial for getting started with TMT and Github.
    • Page title is now automatically taken from mod name.

    v1.3.4 - 10/8/20

    • Added "midsection" feature to add things to a tab's layout while still keeping the standard layout.
    • Fix for being able to buy more buyables than you should.

    v1.3.3 - 10/7/20

    • Fix for the "order of operations" issue in temp.

    v1.3.1 - 10/7/20

    • Added custom CSS and tooltips for Layer Nodes.
    • Added custom CSS for upgrades, buyables, milestones, and challenges, both individually and layer-wide.
    • You can now use HTML in most display text!
    • You can now make milestones unlockable and not display immediately.
    • Fixed importing saves, and issue with upgrades not appearing, and probably more.
    • Optional "name" layer feature, used in confirmation messages.

    v1.3: Tabception... ception! - 10/7/20

    • Added subtabs! And also a Micro-tab component to let you make smaller subtab-esque areas anywhere.
    • Added a "custom" prestige formula type, and a number of features to support it.
    • Added points/sec display (can be disabled).
    • Added h-line, v-line and image-display components, plus components for individual upgrades, challenges, and milestones.
    • Added upgEffect, buyableEffect, and challEffect functions.
    • Added "hide completed challenges" setting.
    • Moved old changelogs to a separate place.
    • Fixed hasMilestone and incr_order.
    • Static layers now show the currency amount needed for the next one if you can buy max.

    v1.2.4 - 10/4/20

    • Layers are now highlighted if you can buy an upgrade, and a new feature, shouldNotify, lets you make it highlight other ways.
    • Fixed bugs with hasUpg, hasChall, hasMilestone, and inChallenge.
    • Changed the sample code to use the above functions for convenience.

    v1.2.3 - 10/3/20

    • Added a row component, which displays a list of objects in a row.
    • Added a column component, which displays a list of objects in a column (useful within a row).
    • Changed blanks to have a customizable width and height.

    v1.2: This Changes Everything! - 10/3/20

    • Many layer features can now be static values or functions. (This made some formats change, which will break old things)
    • You can now use the "this" keyword, to make code easier to transfer when making new layers.
    • Also added "this.layer", which is the current layer's name, and works on existing subfeatures (e.g. individual upgrades) as well! Subfeatures also have "this.id".
    • Fixed a big save issue. If you use a unique mod id, your save will never conflict with other mods.
    • Added a configurable offline time limit in modinfo at the top of index.html. (default 1 hour)
    • Added a few minor features, and updated the docs with new information.

    v1.1.1:

    • You can define hotkeys directly from layer config.

    v1.1: Enhanced Edition

    • Added "Buyables", which can function like Space Buildings or Enhancers.
    • Custom CSS can now be used on any component! Make the third argument an object with CSS parameters.
    • Lots of minor good things.

    v1.0:

    • First release.
    - +

    The Modding Tree changelog:

    v2.π: Incrementally Updated - 2/5/21

    • Performance improvements.
    • Fixed tooltips overlapping with the top display.
    • Clicking a popup dismisses it immediately.
    • Added support for bulk challenge completions.
    • "Best" is updated automatically.
    • Fixed keeping Decimal values on reset.
    • Code reorganization and style improvements by fudo.

    v2.3.5 - 12/21/20

    • Added resetTime, which tracks the time since a layer prestiged or was reset.
    • A layer node will be highlighted red if one of its subtabs is highlighted red.
    • Fixed issues with keeping challenges, buyables, and clickables on reset.
    • Improved the unlocking of custom layers.
    • Other minor fixes.

    v2.3.4 - 12/16/20

    • Added a node image feature.
    • Resource display now always shows the amount of the currency the layer's gain is based on.
    • Added spacing between tree nodes.
    • Another attempt to fix tooltip flickering.

    v2.3.3 - 12/13/20

    • Fixed the first node in a row always taking up space.
    • layerShown is now optional.
    • All prestige types can now use features for custom prestige types.

    v2.3.2 - 12/13/20

    • Fixed achievement/milestone popups.

    v2.3.1 - 12/12/20

    • Another attempt to fix flickering tooltips.
    • The "this" keyword should work everywhere except tabFormat arrays (although I may have missed some things).
    • Fixed tree branches not updating when scrolling on the right-side tab.
    • Fixed a spacing issue when a node's symbol is ""
    • Removed some old, unneeded files.

    v2.3: Cooler and Newer Edition - 12/10/20

    • Added achievement/milestone popups (thank you to Jacorb for this contribution!)
    • The changelog tab is back, and can be set in mod.js.
    • Layer nodes and respec buttons will not be clicked by pressing "enter".
    • Possible fix for flickering tooltips and strange transitions.
    • The victory screen text is configurable.
    • Added image and textStyle features to achievements.
    • Added an argument to use specific rows in an "upgrades" component.
    • Fixed the comma appearing in the main display when there was no effectDescription
    • Added the ability to easily make a tab that is a collection of layers in subtabs.
    • Improved spacing for embedding layers with subtabs into subtabs.

    v2.2.8 - 12/03/20

    • Double-clicking a layer node brings you to the main subtab for that layer.
    • Attempted to fix challenges visually updating a different way.
    • Added a softcap function for use in formulas.
    • Added displayRow feature, which lets layers be shown somewhere separate from where they are in the reset order (e.g. side layers)
    • Fixed autoupgrade issue.

    v2.2.7 - 11/30/20

    • Added autoUpgrade feature.
    • resource-display now shows resource gain per second if passiveGain is active.
    • Fixed formatting issues on some large numbers.
    • Better support for using classed objects in player and in layers/tmp.
    • Made hard resetting more effective.
    • Removed Herobrine from getStartClickables.

    v2.2.6 - 11/30/20

    • Added goalDescription for challenges and made the new "canComplete" system the standard.
    • Another attempt to fix challenges not visually updating.
    • Fixed side layers not appearing.
    • Fixed getStartClickables again.

    v2.2.5 - 11/29/20

    • Added features for overriding the displays and costs/goals of upgrades and challenges to make them fully custom.
    • best, total, and unlocked are always automatically added to layerData (but best and total will only display if you add them yourself).
    • Fixed getStartClickables.

    v2.2.4 - 11/28/20

    • Added softcap and softcapPower features (for Normal layers)
    • Offline time limit and default max tick length were fixed (previously the limits were 1000x too large)
    • Added fixOldSaves.
    • You can use HTML in main-display.
    • Fixed a number of minor oddities.

    v2.2.3 - 11/28/20

    • Layers will be highlighted if you can finish a challenge.
    • The "can complete challenge" color now overrides the "already completed" color.
    • Button nodes now work as side "layers".
    • Setting a tooltip to "" hides it entirely.

    v2.2.2 - 11/22/20

    • Fixed right half of the screen being unclickable in some circumstances.
    • Fixed tree branches being offset.
    • Fix to lastSafeTab.

    v2.2.1 - 11/7/20

    • Added a small highlight to layers you can meaningfully prestige on.
    • Added passiveGeneration and autoPrestige features to standardize prestige automation. (The old ways still work, but the new ones work better with other things)
    • Improved milestones visually a bit.
    • "best" and "total" are now only displayed if present in startData.
    • Fixed issues with things not updating visually. (Thank you to to Jacorb!)
    • Side layers and button nodes can now be highlighted.
    • Updated docs on the new tree-related features.

    v2.2: Uprooted - 11/7/20

    • You can now embed a layer inside of a subtab or microtab!
    • Added support for hiding or reformatting the tree tab
    • Added non-layer button nodes
    • Added shouldNotify to subtab/microtab buttons. (You can make them highlighted)
    • Added commas to large exponents.
    • Upgrades now only show "currently" if they have an effectDisplay (so not for constant effects).
    • Achievements are part of the default tab format.
    • NaN is now handled more intelligently.
    • Renamed files, and moved less relevant ones to another folder.
    • The "hide completed challenges" setting now only hides challenges at max completions.
    • Thank you to thepaperpilot for fixing errors in docs and improving the infobox appearance!
    • Many other minor fixes.

    v2.1.4 - 10/25/20

    • Added an infobox component. Thank you to thepaperpilot for this contribution!
    • Layer type is now optional, and defaults to "none".
    • Improved the look of bars and tab buttons.
    • Improved spacing between layer nodes (also thanks to thepaperpilot!)
    • Fixed the "blank" component breaking if only specifying the height.
    • Fixed some numbers not displaying with enough digits.
    • Made a few more things able to be functions.
    • A few other minor fixes.

    v2.1.3.1 - 10/21/20

    • Fixed the update function.

    v2.1.3 - 10/21/20

    • gainMult and gainExp are now optional.
    • Layer unlocking is now kept on reset.
    • Game should start up faster.
    • Layer updates now have a determined order and starts with earlier-rowed layers.
    • Automation now has a determined order and starts with later-rowed layers.
    • Fixed issues with resetting clickables and challenges.
    • Commas should no longer appear in the decimal places of a number.
    • Fixed potential issue in displaying the tree.

    v2.1.2 - 10/19/20

    • Added buyUpgrade function (buyUpg still works though)
    • Added author name to modInfo.
    • Fix to crash caused when the name of a subtab or microtab is changed.
    • Fixes to outdated information in docs.
    • Improvements to Discord links.
    • Thank you to thepaperpilot for contributing to this update!

    v2.1.1 - 10/17/20

    • Added resource-display component, which displays the base currency for the prestige layer, as well as the best and/or total of this layer's prestige currency.
    • Fixed the value for the base currency not updating in resource-display.

    v2.1: We should have thought of this sooner! - 10/17/20

    • Moved most of the code users will want to edit to mod.js, added documentation for it.
      • Specifically, modInfo, VERSION, canGenPoints, getPointGen, and maxTickLength
    • Added getStartPoints()
    • Added the ability to store non-layer-related data
    • Added the ability to display more things at the top of the tree tab below points.
    • Made the endgame condition customizable
    • Added "sell one" and "sell all" buttons for buyables.
    • Moved the old "game" to demo.js, and replaced it with a minimal game that won't cause issues when edited.
    • Fixed issues with version number
    • Fixed number formatting issue making things like "10e9" appear.

    v2.0.5 - 10/16/20

    • Made more features (including prestige parameters) able to be dynamic.
    • Layer nodes can be hidden but still take up space with "ghost" visibility
    • Added clickableEffect for real.
    • Fixed some visual issues with bars.
    • A few other minor tweaks and improvements.

    v2.0.4 - 10/16/20

    • Fixed HTML on buttons interfering with clicking on them.

    v2.0.3 - 10/16/20

    • Fixed hotkeys not displaying in info.
    • Fixed the game supressing all external hotkeys.
    • You can use more things as currencies for upgrade costs and challenge goals using currencyLocation.
    • Added maxTickLength, which can be used to prevent offline time or tab-switching from breaking time-limit based mechanics.
    • Made buyable respec buttons and clickable "master" buttons their own components, and gave them a hide/show feature.
    • Added a general "tooltip" feature for achievements.

    v2.0.2 - 10/15/20

    • Branches are now dynamic (they can be functions).
    • Fixed a crash related to offline time.
    • Fixed links being too wide.

    v2.0.1 - 10/15/20

    • Fixed side layers appearing multiple times.

    v2.0: The Pinnacle of Achievement Mountain - 10/15/20

    • Added progress bars, which are highly customizable and can be horizontal or vertical!
    • Added "side layers", displayed smaller and off to the side, and don't get reset by default. They can be used for global achievements and statistics. Speaking of which...
    • Added achievements!
    • Added clickables, a more generalized variant of buyables.
    • Almost every value in layer data can be either a function or a constant value!
    • Added support for multiple completions of challenges.
    • Added "none" prestige type, which removes the need for any other prestige-related features.
    • The points display and other gui elements stay at the top of the screen when the tree scrolls.
    • Added getter/setter functions for the amounts and effects of most Big Features
    • Moved modInfo to game.js, added a spot in modInfo for a Discord link, changelog link. Also added a separate mod version from the TMT version in VERSION.
    • Tree structure is based on layer data, no index.html editing is needed.
    • Tmp does not need to be manually updated.
    • You don't have to have the same amount of upgrades in every row (and challs and buyables)
    • "unlocked" is optional for all Big Components (defaults to true).
    • All displays will update correctly.
    • Changelog is no longer in index.html at all.
    • Generation of Points now happens in the main game loop
    • Changed the reset functions to make keeping things easier
    • Renamed many things to increase readability (see the list in the link below)
    • Improved documentation based on feedback

    v1.3.5:

    • Completely automated convertToDecimal, now you never have to worry about it again.
    • Branches can be defined without a color id. But they can also use hex values for color ids!
    • Created a tutorial for getting started with TMT and Github.
    • Page title is now automatically taken from mod name.

    v1.3.4 - 10/8/20

    • Added "midsection" feature to add things to a tab's layout while still keeping the standard layout.
    • Fix for being able to buy more buyables than you should.

    v1.3.3 - 10/7/20

    • Fix for the "order of operations" issue in temp.

    v1.3.1 - 10/7/20

    • Added custom CSS and tooltips for Layer Nodes.
    • Added custom CSS for upgrades, buyables, milestones, and challenges, both individually and layer-wide.
    • You can now use HTML in most display text!
    • You can now make milestones unlockable and not display immediately.
    • Fixed importing saves, and issue with upgrades not appearing, and probably more.
    • Optional "name" layer feature, used in confirmation messages.

    v1.3: Tabception... ception! - 10/7/20

    • Added subtabs! And also a Micro-tab component to let you make smaller subtab-esque areas anywhere.
    • Added a "custom" prestige formula type, and a number of features to support it.
    • Added points/sec display (can be disabled).
    • Added h-line, v-line and image-display components, plus components for individual upgrades, challenges, and milestones.
    • Added upgEffect, buyableEffect, and challEffect functions.
    • Added "hide completed challenges" setting.
    • Moved old changelogs to a separate place.
    • Fixed hasMilestone and incr_order.
    • Static layers now show the currency amount needed for the next one if you can buy max.

    v1.2.4 - 10/4/20

    • Layers are now highlighted if you can buy an upgrade, and a new feature, shouldNotify, lets you make it highlight other ways.
    • Fixed bugs with hasUpg, hasChall, hasMilestone, and inChallenge.
    • Changed the sample code to use the above functions for convenience.

    v1.2.3 - 10/3/20

    • Added a row component, which displays a list of objects in a row.
    • Added a column component, which displays a list of objects in a column (useful within a row).
    • Changed blanks to have a customizable width and height.

    v1.2: This Changes Everything! - 10/3/20

    • Many layer features can now be static values or functions. (This made some formats change, which will break old things)
    • You can now use the "this" keyword, to make code easier to transfer when making new layers.
    • Also added "this.layer", which is the current layer's name, and works on existing subfeatures (e.g. individual upgrades) as well! Subfeatures also have "this.id".
    • Fixed a big save issue. If you use a unique mod id, your save will never conflict with other mods.
    • Added a configurable offline time limit in modinfo at the top of index.html. (default 1 hour)
    • Added a few minor features, and updated the docs with new information.

    v1.1.1:

    • You can define hotkeys directly from layer config.

    v1.1: Enhanced Edition

    • Added "Buyables", which can function like Space Buildings or Enhancers.
    • Custom CSS can now be used on any component! Make the third argument an object with CSS parameters.
    • Lots of minor good things.

    v1.0:

    • First release.
    + \ No newline at end of file diff --git a/public/lit/docs/!general-info.html b/public/lit/docs/!general-info.html index a793830d..ae9071dd 100644 --- a/public/lit/docs/!general-info.html +++ b/public/lit/docs/!general-info.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

    The-Modding-Tree

    The main way to add content is through creating layers. You can either add a layer directly in the layers object in layerSupport.js, or declare it in another file and register it by calling addLayer(layername, layerdata). There is an example layer registration in layers.js showing the recommended method. It is just an example and can be freely deleted. You can also use it as a reference or a base for your own layers.

    The first thing you need to do is fill out the modInfo object at the top of mod.js to set your mod's name, ID (a string), and other information. A unique modId will prevent your mod's saves from conflicting with other mods. Note that changing this after people have started playing will reset their saves.

    Most of the time, you won't need to dive deep into the code to create things, but you still can if you really want to, for example to add new Vue components in v.js.

    The Modding Tree uses break_eternity.js to store large values. This means that many numbers are Decimal objects, and must be treated differently. For example, you have to use new Decimal(x) to create a Decimal value instead of a plain number, and perform operations on them by calling functions. e.g, instead of x = x + y, use x = x.add(y). Keep in mind this also applies to comparison operators, which should be replaced with calling the .gt, .gte, .lt, .lte, .eq, and .neq functions. See the break_eternity.js docs for more details on working with Decimal values.

    Almost all values can be either a constant value, or a dynamic value. Dynamic values are defined by putting a function that returns what the value should be at any given time.

    All display text can use basic HTML elements (But you can't use most Vue features there).

    While reading this documentation, the following key will be used when describing features:

    • No label: This is required and the game may crash if it isn't included.
    • sometimes required: This is may be required, depending on other things in the layer.
    • optional: You can leave this out if you don't intend to use that feature for the layer.
    • assigned automagically: This value will be set automatically and override any value you set.
    • deprecated: This feature is not recommended to be used anymore, and may be removed in future versions of TMT.

    Table of Contents

    General

    • Getting Started: Getting your own copy of the code set up with Github Desktop.
    • Main mod info: How to set up general things for your mod in mod.js.
    • Basic layer breakdown: Breaking down the components of a layer with minimal features.
    • Layer features: Explanations of all of the different properties that you can give a layer.
    • Custom Tab Layouts: An optional way to give your tabs a different layout. You can even create entirely new components to use.
    • Custom game layouts: You can get rid of the tree tab, add buttons and other things to the tree, or even customize the tab's layout like a layer tab.
    • Updating TMT: Using Github Desktop to update your mod's version of TMT.

    Common components

    • Upgrades: How to create upgrades for a layer.
    • Milestones: How to create milestones for a layer.
    • Buyables: Create rebuyable upgrades for your layer (with the option to make them respec-able). Can be used to make Enhancers or Space Buildings.
    • Clickables: A more generalized variant of buyables, for any kind of thing that is sometimes clickable. Between these and Buyables, you can do just about anything.

    Other components and features

    • Challenges: How to create challenges for a layer.
    • Bars: Display some information as a progress bar, gauge, or similar. They are highly customizable, and can be horizontal and vertical as well.
    • Subtabs and Microtabs: Create subtabs for your tabs, as well as "microtab" components that you can put inside the tabs. You can even use them to embed a layer inside another layer!
    • Achievements: How to create achievements for a layer (or for the whole game).
    • Infoboxes: Boxes containing text that can be shown or hidden.
    • Trees: Make your own trees. You can make non-layer button nodes too!
    - +

    The-Modding-Tree

    The main way to add content is through creating layers. You can either add a layer directly in the layers object in layerSupport.js, or declare it in another file and register it by calling addLayer(layername, layerdata). There is an example layer registration in layers.js showing the recommended method. It is just an example and can be freely deleted. You can also use it as a reference or a base for your own layers.

    The first thing you need to do is fill out the modInfo object at the top of mod.js to set your mod's name, ID (a string), and other information. A unique modId will prevent your mod's saves from conflicting with other mods. Note that changing this after people have started playing will reset their saves.

    Most of the time, you won't need to dive deep into the code to create things, but you still can if you really want to, for example to add new Vue components in v.js.

    The Modding Tree uses break_eternity.js to store large values. This means that many numbers are Decimal objects, and must be treated differently. For example, you have to use new Decimal(x) to create a Decimal value instead of a plain number, and perform operations on them by calling functions. e.g, instead of x = x + y, use x = x.add(y). Keep in mind this also applies to comparison operators, which should be replaced with calling the .gt, .gte, .lt, .lte, .eq, and .neq functions. See the break_eternity.js docs for more details on working with Decimal values.

    Almost all values can be either a constant value, or a dynamic value. Dynamic values are defined by putting a function that returns what the value should be at any given time.

    All display text can use basic HTML elements (But you can't use most Vue features there).

    While reading this documentation, the following key will be used when describing features:

    • No label: This is required and the game may crash if it isn't included.
    • sometimes required: This is may be required, depending on other things in the layer.
    • optional: You can leave this out if you don't intend to use that feature for the layer.
    • assigned automagically: This value will be set automatically and override any value you set.
    • deprecated: This feature is not recommended to be used anymore, and may be removed in future versions of TMT.

    Table of Contents

    General

    • Getting Started: Getting your own copy of the code set up with Github Desktop.
    • Main mod info: How to set up general things for your mod in mod.js.
    • Basic layer breakdown: Breaking down the components of a layer with minimal features.
    • Layer features: Explanations of all of the different properties that you can give a layer.
    • Custom Tab Layouts: An optional way to give your tabs a different layout. You can even create entirely new components to use.
    • Custom game layouts: You can get rid of the tree tab, add buttons and other things to the tree, or even customize the tab's layout like a layer tab.
    • Updating TMT: Using Github Desktop to update your mod's version of TMT.

    Common components

    • Upgrades: How to create upgrades for a layer.
    • Milestones: How to create milestones for a layer.
    • Buyables: Create rebuyable upgrades for your layer (with the option to make them respec-able). Can be used to make Enhancers or Space Buildings.
    • Clickables: A more generalized variant of buyables, for any kind of thing that is sometimes clickable. Between these and Buyables, you can do just about anything.

    Other components and features

    • Challenges: How to create challenges for a layer.
    • Bars: Display some information as a progress bar, gauge, or similar. They are highly customizable, and can be horizontal and vertical as well.
    • Subtabs and Microtabs: Create subtabs for your tabs, as well as "microtab" components that you can put inside the tabs. You can even use them to embed a layer inside another layer!
    • Achievements: How to create achievements for a layer (or for the whole game).
    • Infoboxes: Boxes containing text that can be shown or hidden.
    • Trees: Make your own trees. You can make non-layer button nodes too!
    + \ No newline at end of file diff --git a/public/lit/docs/achievements.html b/public/lit/docs/achievements.html index 5054416b..ef64382e 100644 --- a/public/lit/docs/achievements.html +++ b/public/lit/docs/achievements.html @@ -8,11 +8,11 @@ - + - - + + @@ -314,8 +314,8 @@ more features }, etc -}

    Each achievement should have an id where the first digit is the row and the second digit is the column.

    Individual achievement can have these features:

    • name: optional. displayed at the top of the achievement. The only visible text. It can also be a function that returns updating text. Can use basic HTML.

    • done(): A function returning a boolean to determine if the achievement should be awarded.

    • tooltip: Default tooltip for the achievement, appears when it is hovered over. Should convey the goal and any reward for completing the achievement. It can also be a function that returns updating text. Can use basic HTML. Setting this to "" disables the tooltip.

    • effect(): optional. A function that calculates and returns the current values of any bonuses from the achievement. Can return a value or an object containing multiple values.

    • unlocked(): optional. A function returning a bool to determine if the achievement is visible or not. Default is unlocked.

    • onComplete() - optional. this function will be called when the achievement is completed.

    • image: optional, puts the image from the given URL (relative or absolute) in the achievement

    • style: optional. Applies CSS to this achievement, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • textStyle: optional. Applies CSS to the text, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the achievement was stored under, for convenient access. The achievement in the example's id is 11.

    • goalTooltip: optional, deprecated. Appears when the achievement is hovered over and locked, overrides the basic tooltip. This is to display the goal (or a hint). It can also be a function that returns updating text. Can use basic HTML.

    • doneTooltip: optional, deprecated. Appears when the achievement is hovered over and completed, overrides the basic tooltip. This can display what the player achieved (the goal), and the rewards, if any. It can also be a function that returns updating text. Can use basic HTML.

    Disable achievement popups by adding achievementsPopups: false to the layer.

    - +}

    Each achievement should have an id where the first digit is the row and the second digit is the column.

    Individual achievement can have these features:

    • name: optional. displayed at the top of the achievement. The only visible text. It can also be a function that returns updating text. Can use basic HTML.

    • done(): A function returning a boolean to determine if the achievement should be awarded.

    • tooltip: Default tooltip for the achievement, appears when it is hovered over. Should convey the goal and any reward for completing the achievement. It can also be a function that returns updating text. Can use basic HTML. Setting this to "" disables the tooltip.

    • effect(): optional. A function that calculates and returns the current values of any bonuses from the achievement. Can return a value or an object containing multiple values.

    • unlocked(): optional. A function returning a bool to determine if the achievement is visible or not. Default is unlocked.

    • onComplete() - optional. this function will be called when the achievement is completed.

    • image: optional, puts the image from the given URL (relative or absolute) in the achievement

    • style: optional. Applies CSS to this achievement, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • textStyle: optional. Applies CSS to the text, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the achievement was stored under, for convenient access. The achievement in the example's id is 11.

    • goalTooltip: optional, deprecated. Appears when the achievement is hovered over and locked, overrides the basic tooltip. This is to display the goal (or a hint). It can also be a function that returns updating text. Can use basic HTML.

    • doneTooltip: optional, deprecated. Appears when the achievement is hovered over and completed, overrides the basic tooltip. This can display what the player achieved (the goal), and the rewards, if any. It can also be a function that returns updating text. Can use basic HTML.

    Disable achievement popups by adding achievementsPopups: false to the layer.

    + \ No newline at end of file diff --git a/public/lit/docs/bars.html b/public/lit/docs/bars.html index 8e8cc5bb..e4b84da8 100644 --- a/public/lit/docs/bars.html +++ b/public/lit/docs/bars.html @@ -8,11 +8,11 @@ - + - - + + @@ -315,8 +315,8 @@ etc }, etc -}

    Features:

    • direction: UP, DOWN, LEFT, or RIGHT (not strings). Determines the direction that the bar is filled as it progresses. RIGHT means from left to right.

    • width, height: The size in pixels of the bar, but as numbers (no "px" at the end).

    • progress(): A function that returns the portion of the bar that is filled, from "empty" at 0 to "full" at 1, updating automatically. (Nothing bad happens if the value goes out of these bounds, and it can be a number or Decimal)

    • display(): optional. A function that returns text to be displayed on top of the bar, can use HTML.

    • unlocked(): optional. A function returning a bool to determine if the bar is visible or not. Default is unlocked.

    • baseStyle, fillStyle, borderStyle, textStyle: Optional, Apply CSS to the unfilled portion, filled portion, border, and display text on the bar, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the bar was stored under, for convenient access. The bar in the example's id is "bigBar".

    - +}

    Features:

    • direction: UP, DOWN, LEFT, or RIGHT (not strings). Determines the direction that the bar is filled as it progresses. RIGHT means from left to right.

    • width, height: The size in pixels of the bar, but as numbers (no "px" at the end).

    • progress(): A function that returns the portion of the bar that is filled, from "empty" at 0 to "full" at 1, updating automatically. (Nothing bad happens if the value goes out of these bounds, and it can be a number or Decimal)

    • display(): optional. A function that returns text to be displayed on top of the bar, can use HTML.

    • unlocked(): optional. A function returning a bool to determine if the bar is visible or not. Default is unlocked.

    • baseStyle, fillStyle, borderStyle, textStyle: Optional, Apply CSS to the unfilled portion, filled portion, border, and display text on the bar, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the bar was stored under, for convenient access. The bar in the example's id is "bigBar".

    + \ No newline at end of file diff --git a/public/lit/docs/basic-layer-breakdown.html b/public/lit/docs/basic-layer-breakdown.html index b9627717..c042e732 100644 --- a/public/lit/docs/basic-layer-breakdown.html +++ b/public/lit/docs/basic-layer-breakdown.html @@ -8,11 +8,11 @@ - + - - + + @@ -333,8 +333,8 @@ }, layerShown() { return true } // Returns a bool for if this layer's node should be visible in the tree. -}) - +}) + \ No newline at end of file diff --git a/public/lit/docs/buyables.html b/public/lit/docs/buyables.html index a5e305aa..00a6b174 100644 --- a/public/lit/docs/buyables.html +++ b/public/lit/docs/buyables.html @@ -8,11 +8,11 @@ - + - - + + @@ -320,8 +320,8 @@ etc }, etc -}

    Features:

    • title: optional. displayed at the top in a larger font. It can also be a function that returns updating text.

    • cost(): cost for buying the next buyable. Can have an optional argument "x" to calculate the cost of the x+1th object, but needs to use "current amount" as a default value for x. (x is a Decimal). Can return an object if there are multiple currencies.

    • effect(): optional. A function that calculates and returns the current values of bonuses of this buyable. Can return a value or an object containing multiple values.

    • display(): A function returning everything that should be displayed on the buyable after the title, likely including the description, amount bought, cost, and current effect. Can use basic HTML.

    • unlocked(): optional. A function returning a bool to determine if the buyable is visible or not. Default is unlocked.

    • canAfford(): A function returning a bool to determine if you can buy one of the buyables.

    • buy(): A function that implements buying one of the buyable, including spending the currency.

    • buyMax(): optional. A function that implements buying as many of the buyable as possible.

    • style: optional. Applies CSS to this buyable, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the buyable was stored under, for convenient access. The buyable in the example's id is 11.

    Sell One/Sell All:

    Including a sellOne or sellAll function will cause an additional button to appear beneath the buyable. They are functionally identical, but "sell one" appears above "sell all". You can also use them for other things.

    • sellOne/sellAll(): optional. Called when the button is pressed. The standard use would be to decrease/reset the amount of the buyable, and possibly return some currency to the player.

    • canSellOne/canSellAll(): optional. booleans determining whether or not to show the buttons. If "canSellOne/All" is absent but "sellOne/All" is present, the appropriate button will always show.

    - +}

    Features:

    • title: optional. displayed at the top in a larger font. It can also be a function that returns updating text.

    • cost(): cost for buying the next buyable. Can have an optional argument "x" to calculate the cost of the x+1th object, but needs to use "current amount" as a default value for x. (x is a Decimal). Can return an object if there are multiple currencies.

    • effect(): optional. A function that calculates and returns the current values of bonuses of this buyable. Can return a value or an object containing multiple values.

    • display(): A function returning everything that should be displayed on the buyable after the title, likely including the description, amount bought, cost, and current effect. Can use basic HTML.

    • unlocked(): optional. A function returning a bool to determine if the buyable is visible or not. Default is unlocked.

    • canAfford(): A function returning a bool to determine if you can buy one of the buyables.

    • buy(): A function that implements buying one of the buyable, including spending the currency.

    • buyMax(): optional. A function that implements buying as many of the buyable as possible.

    • style: optional. Applies CSS to this buyable, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the buyable was stored under, for convenient access. The buyable in the example's id is 11.

    Sell One/Sell All:

    Including a sellOne or sellAll function will cause an additional button to appear beneath the buyable. They are functionally identical, but "sell one" appears above "sell all". You can also use them for other things.

    • sellOne/sellAll(): optional. Called when the button is pressed. The standard use would be to decrease/reset the amount of the buyable, and possibly return some currency to the player.

    • canSellOne/canSellAll(): optional. booleans determining whether or not to show the buttons. If "canSellOne/All" is absent but "sellOne/All" is present, the appropriate button will always show.

    + \ No newline at end of file diff --git a/public/lit/docs/challenges.html b/public/lit/docs/challenges.html index f10b2abb..7e8f13c3 100644 --- a/public/lit/docs/challenges.html +++ b/public/lit/docs/challenges.html @@ -8,11 +8,11 @@ - + - - + + @@ -316,8 +316,8 @@ etc }, etc -}

    Each challenge should have an id where the first digit is the row and the second digit is the column.

    Individual Challenges can have these features:

    • name: Name of the challenge, can be a string or a function. Can use basic HTML.

    • challengeDescription: A description of what makes the challenge a challenge. You will need to implement these elsewhere. It can also be a function that returns updating text. Can use basic HTML.

    • goalDescription: A description of the win condition for the challenge. It can also be a function that returns updating text. Can use basic HTML. (Optional if using the old goal system)

    • canComplete(): A function that returns true if you meet the win condition for the challenge. Returning a number will allow bulk completing the challenge. (Optional if using the old goal system)

    • rewardDescription: A description of the reward's effect. You will also have to implement the effect where it is applied. It can also be a function that returns updating text. Can use basic HTML.

    • rewardEffect(): optional. A function that calculates and returns the current values of any bonuses from the reward. Can return a value or an object containing multiple values. Can use basic HTML.

    • rewardDisplay(): optional. A function that returns a display of the current effects of the reward with formatting. Default behavior is to just display the a number appropriately formatted.

    • fullDisplay(): OVERRIDE. Overrides the other displays and descriptions, and lets you set the full text for the challenge. Can use basic HTML.

    • unlocked(): optional. A function returning a bool to determine if the challenge is visible or not. Default is unlocked.

    • onComplete() - optional. this function will be called when the challenge is completed when previously incomplete.

    • countsAs: optional. If a challenge combines the effects of other challenges in this layer, you can use this. An array of challenge ids. The player is effectively in all of those challenges when in the current one.

    • completionLimit: optional. the amount of times you can complete this challenge. Default is 1 completion.

    • style: optional. Applies CSS to this challenge, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

    • id: assigned automagically. It's the "key" which the challenge was stored under, for convenient access. The challenge in the example's id is 11.

    The old goal system uses these features:

    • goal: deprecated, A Decimal for the amount of currency required to beat the challenge. By default, the goal is in basic Points. The goal can also be a function if its value changes.

    • currencyDisplayName: deprecated. the name to display for the currency for the goal

    • currencyInternalName: deprecated. the internal name for that currency

    • currencyLayer: deprecated. the internal name of the layer that currency is stored in. If it's not in a layer, omit. If it's not stored directly in a layer, instead use the next feature.

    • currencyLocation(): deprecated. if your currency is stored in something inside a layer (e.g. a buyable's amount), you can access it this way. This is a function returning the object in "player" that contains the value (like player[this.layer].buyables)

    - +}

    Each challenge should have an id where the first digit is the row and the second digit is the column.

    Individual Challenges can have these features:

    • name: Name of the challenge, can be a string or a function. Can use basic HTML.

    • challengeDescription: A description of what makes the challenge a challenge. You will need to implement these elsewhere. It can also be a function that returns updating text. Can use basic HTML.

    • goalDescription: A description of the win condition for the challenge. It can also be a function that returns updating text. Can use basic HTML. (Optional if using the old goal system)

    • canComplete(): A function that returns true if you meet the win condition for the challenge. Returning a number will allow bulk completing the challenge. (Optional if using the old goal system)

    • rewardDescription: A description of the reward's effect. You will also have to implement the effect where it is applied. It can also be a function that returns updating text. Can use basic HTML.

    • rewardEffect(): optional. A function that calculates and returns the current values of any bonuses from the reward. Can return a value or an object containing multiple values. Can use basic HTML.

    • rewardDisplay(): optional. A function that returns a display of the current effects of the reward with formatting. Default behavior is to just display the a number appropriately formatted.

    • fullDisplay(): OVERRIDE. Overrides the other displays and descriptions, and lets you set the full text for the challenge. Can use basic HTML.

    • unlocked(): optional. A function returning a bool to determine if the challenge is visible or not. Default is unlocked.

    • onComplete() - optional. this function will be called when the challenge is completed when previously incomplete.

    • countsAs: optional. If a challenge combines the effects of other challenges in this layer, you can use this. An array of challenge ids. The player is effectively in all of those challenges when in the current one.

    • completionLimit: optional. the amount of times you can complete this challenge. Default is 1 completion.

    • style: optional. Applies CSS to this challenge, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

    • id: assigned automagically. It's the "key" which the challenge was stored under, for convenient access. The challenge in the example's id is 11.

    The old goal system uses these features:

    • goal: deprecated, A Decimal for the amount of currency required to beat the challenge. By default, the goal is in basic Points. The goal can also be a function if its value changes.

    • currencyDisplayName: deprecated. the name to display for the currency for the goal

    • currencyInternalName: deprecated. the internal name for that currency

    • currencyLayer: deprecated. the internal name of the layer that currency is stored in. If it's not in a layer, omit. If it's not stored directly in a layer, instead use the next feature.

    • currencyLocation(): deprecated. if your currency is stored in something inside a layer (e.g. a buyable's amount), you can access it this way. This is a function returning the object in "player" that contains the value (like player[this.layer].buyables)

    + \ No newline at end of file diff --git a/public/lit/docs/clickables.html b/public/lit/docs/clickables.html index 08bbe6fd..df25afe8 100644 --- a/public/lit/docs/clickables.html +++ b/public/lit/docs/clickables.html @@ -8,11 +8,11 @@ - + - - + + @@ -314,8 +314,8 @@ etc } etc -}

    Features:

    • title: optional. displayed at the top in a larger font. It can also be a function that returns updating text.

    • effect(): optional. A function that calculates and returns the current values of bonuses of this clickable. Can return a value or an object containing multiple values.

    • display(): A function returning everything that should be displayed on the clickable after the title, likely changing based on its state. Can use basic HTML.

    • unlocked(): optional. A function returning a bool to determine if the clickable is visible or not. Default is unlocked.

    • canClick(): A function returning a bool to determine if you can click the clickable.

    • onClick(): A function that implements clicking one of the clickable.

    • style: optional. Applies CSS to this clickable, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the clickable was stored under, for convenient access. The clickable in the example's id is 11.

    You can also use these features on the clickables object to add a button above all the clickables, for implementing a respec button or similar.

    • masterButtonPress(): optional. If present, an additional button will appear above the clickables. Pressing it will call this function.

    • masterButtonText: optional. Text to display on the Master Button.

    • showMasterButton(): optional. A function determining whether or not to show the button. Defaults to true if absent.

    - +}

    Features:

    • title: optional. displayed at the top in a larger font. It can also be a function that returns updating text.

    • effect(): optional. A function that calculates and returns the current values of bonuses of this clickable. Can return a value or an object containing multiple values.

    • display(): A function returning everything that should be displayed on the clickable after the title, likely changing based on its state. Can use basic HTML.

    • unlocked(): optional. A function returning a bool to determine if the clickable is visible or not. Default is unlocked.

    • canClick(): A function returning a bool to determine if you can click the clickable.

    • onClick(): A function that implements clicking one of the clickable.

    • style: optional. Applies CSS to this clickable, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the clickable was stored under, for convenient access. The clickable in the example's id is 11.

    You can also use these features on the clickables object to add a button above all the clickables, for implementing a respec button or similar.

    • masterButtonPress(): optional. If present, an additional button will appear above the clickables. Pressing it will call this function.

    • masterButtonText: optional. Text to display on the Master Button.

    • showMasterButton(): optional. A function determining whether or not to show the button. Defaults to true if absent.

    + \ No newline at end of file diff --git a/public/lit/docs/custom-tab-layouts.html b/public/lit/docs/custom-tab-layouts.html index 3e17f615..80546e1d 100644 --- a/public/lit/docs/custom-tab-layouts.html +++ b/public/lit/docs/custom-tab-layouts.html @@ -8,11 +8,11 @@ - + - - + + @@ -319,8 +319,8 @@ "blank", "blank", "upgrades" -]

    It is a list of components, which can be either just a name, or an array with arguments. If it's an array, the first item is the name of the component, the second is the data passed into it, and the third (optional) applies a CSS style to it with a "CSS object", where the keys are CSS attributes.

    These are the existing components, but you can create more in components.js:

    • display-text: Displays some text (can use basic HTML). The argument is the text to display. It can also be a function that returns updating text.

    • raw-html: Displays some basic HTML, can also be a function.

    • blank: Adds empty space. The default dimensions are 8px x 17px. The argument changes the dimensions. If it's a single value (e.g. "20px"), that determines the height. If you have a pair of arguments, the first is width and the second is height.

    • row: Display a list of components horizontally. The argument is an array of components in the tab layout format.

    • column: Display a list of components vertically. The argument is an array of components in the tab layout format. This is useful to display columns within a row.

    • main-display: The text that displays the main currency for the layer and its effects.

    • resource-display: The text that displays the currency that this layer is based on, as well as the best and/or total values for this layer's prestige currency (if they are put in startData for this layer).

    • prestige-button: The argument is a string that the prestige button should say before the amount of currency you will gain. It can also be a function that returns updating text.

    • upgrades: The layer's upgrades. The argument is optional, and is a the list of rows this component should include, if it doesn't have all of them.

    • milestones, challenges, achievements: Display the upgrades, milestones, and challenges for a layer, as appropriate.

    • buyables, clickables: Display all of the buyables/clickables for this layer, as appropriate. The argument is optional and is the size of the boxes in pixels.

    • microtabs: Display a set of subtabs for an area. The argument is the name of the set of microtabs in the "microtabs" feature.

    • bar: Display a bar. The argument is the id of the bar to display.

    • infobox: Display an infobox. The argument is the id of the infobox to display.

    • tree: Displays a tree. The argument is an array of arrays containing the names of the nodes in the tree (first by row, then by column) See here for more information on tree layouts and nodes!

    • toggle: A toggle button that toggles a bool value. The data is a pair that identifies what bool to toggle, e.g. [layer, id]

    The rest of the components are sub-components. They can be used just like other components, but are typically part of another component.

    • upgrade, milestone, challenge, buyable, clickable, achievement: An individual upgrade, challenge, etc. The argument is the id. This can be used if you want to have upgrades split up across multiple subtabs, for example.

    • respec-button, master-button: The respec and master buttons for buyables and clickables, respectively.

    • sell-one, sell-all: The "sell one" and "sell all" for buyables, respectively. The argument is the id of the buyable.

    - +]

    It is a list of components, which can be either just a name, or an array with arguments. If it's an array, the first item is the name of the component, the second is the data passed into it, and the third (optional) applies a CSS style to it with a "CSS object", where the keys are CSS attributes.

    These are the existing components, but you can create more in components.js:

    • display-text: Displays some text (can use basic HTML). The argument is the text to display. It can also be a function that returns updating text.

    • raw-html: Displays some basic HTML, can also be a function.

    • blank: Adds empty space. The default dimensions are 8px x 17px. The argument changes the dimensions. If it's a single value (e.g. "20px"), that determines the height. If you have a pair of arguments, the first is width and the second is height.

    • row: Display a list of components horizontally. The argument is an array of components in the tab layout format.

    • column: Display a list of components vertically. The argument is an array of components in the tab layout format. This is useful to display columns within a row.

    • main-display: The text that displays the main currency for the layer and its effects.

    • resource-display: The text that displays the currency that this layer is based on, as well as the best and/or total values for this layer's prestige currency (if they are put in startData for this layer).

    • prestige-button: The argument is a string that the prestige button should say before the amount of currency you will gain. It can also be a function that returns updating text.

    • upgrades: The layer's upgrades. The argument is optional, and is a the list of rows this component should include, if it doesn't have all of them.

    • milestones, challenges, achievements: Display the upgrades, milestones, and challenges for a layer, as appropriate.

    • buyables, clickables: Display all of the buyables/clickables for this layer, as appropriate. The argument is optional and is the size of the boxes in pixels.

    • microtabs: Display a set of subtabs for an area. The argument is the name of the set of microtabs in the "microtabs" feature.

    • bar: Display a bar. The argument is the id of the bar to display.

    • infobox: Display an infobox. The argument is the id of the infobox to display.

    • tree: Displays a tree. The argument is an array of arrays containing the names of the nodes in the tree (first by row, then by column) See here for more information on tree layouts and nodes!

    • toggle: A toggle button that toggles a bool value. The data is a pair that identifies what bool to toggle, e.g. [layer, id]

    The rest of the components are sub-components. They can be used just like other components, but are typically part of another component.

    • upgrade, milestone, challenge, buyable, clickable, achievement: An individual upgrade, challenge, etc. The argument is the id. This can be used if you want to have upgrades split up across multiple subtabs, for example.

    • respec-button, master-button: The respec and master buttons for buyables and clickables, respectively.

    • sell-one, sell-all: The "sell one" and "sell all" for buyables, respectively. The argument is the id of the buyable.

    + \ No newline at end of file diff --git a/public/lit/docs/getting-started.html b/public/lit/docs/getting-started.html index 4968eb0f..9330ffcf 100644 --- a/public/lit/docs/getting-started.html +++ b/public/lit/docs/getting-started.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

    Getting started

    Welcome to The Modding Tree!

    Using the Modding Tree, at its simplest level, just requires getting a copy of it onto your computer. However, if you do it the right way, it will help in many ways.

    Don't let the word "Github" scare you away. It's actually much easier to use than most people think, especially because most people use it the hard way. The key is Github Desktop, which lets you do everything you need to, without even touching the command line.

    The benefits of using Github:

    • It makes it much, much easier to update The Modding Tree.
    • You can share your work without any extra effort using githack, or with a bit more effort, set up a github.io site.
    • It lets you undo changes to your code, and to have multiple versions of it.
    • It lets you collaborate with other people, if you want to.

    Getting set up with Github Desktop, Visual Studio Code, and The Modding Tree:

    1. Install Github Desktop and Visual Studio Code.

    2. Make a Github account. You can handle this on your own.

    3. Log in on your browser, and go back to The Modding Tree page. At the top right, there should be a button that says "fork". Click on it, and then on your username. You now have your own fork, or copy, of The Modding Tree.

    4. Open Github Desktop and log in. Ignore everything else and choose "clone a repository". A "repository" is basically a "Github project", like The Modding Tree. "Cloning" is downloading a copy of the repository to your computer.

    5. Look for The Modding Tree in the list of repositiories (it should be the only one) and click "clone".

    6. Select that you're using it for your own purposes, and click continue. It will download the files and handle everything.

    Using your repository

    1. Click on "show in explorer/finder" to the right, and then open the index.html file in the folder. The page should open up on your browser. This will let you view and test your project locally!

    2. To edit your project, click "open in VSCode" in Github Desktop.

    3. Open mod.js in VSCode, and look at the top part where it has a "modInfo" object. Fill in your mod's name to whatever you want, and change the id as well. (It can be any string value, and it's used to determine where the savefile is. Make it something that's probably unique, and don't change it again later or else it'll effectively wipe existing saves)

    4. Save mod.js, and then reload index.html in your browser. The title on the tab, as well as on the info page, will now be updated! You can reload the page every time you change the code to test it quickly and easily.

    5. Go back to Github Desktop. It's time to save your changes into the git system by making a "commit". This basically saves your work and creates a snapshot of what your code looks like at this moment, allowing you to look back at it later.

    6. At the bottom right corner, add a summary of your changes, and then click "commit to master".

    7. Finally, at the top middle, click "push origin" to push your changes out onto the online repository.

    8. You can view your project on line, or share it with others, by going to https://raw.githack.com/[YOUR-GITHUB-USERNAME]/The-Modding-Tree/master/index.html

    And now, you have successfully used Github! You can look at the documentation to see how The Modding Tree's system works and to make your mod a reality.

    - +

    Getting started

    Welcome to The Modding Tree!

    Using the Modding Tree, at its simplest level, just requires getting a copy of it onto your computer. However, if you do it the right way, it will help in many ways.

    Don't let the word "Github" scare you away. It's actually much easier to use than most people think, especially because most people use it the hard way. The key is Github Desktop, which lets you do everything you need to, without even touching the command line.

    The benefits of using Github:

    • It makes it much, much easier to update The Modding Tree.
    • You can share your work without any extra effort using githack, or with a bit more effort, set up a github.io site.
    • It lets you undo changes to your code, and to have multiple versions of it.
    • It lets you collaborate with other people, if you want to.

    Getting set up with Github Desktop, Visual Studio Code, and The Modding Tree:

    1. Install Github Desktop and Visual Studio Code.

    2. Make a Github account. You can handle this on your own.

    3. Log in on your browser, and go back to The Modding Tree page. At the top right, there should be a button that says "fork". Click on it, and then on your username. You now have your own fork, or copy, of The Modding Tree.

    4. Open Github Desktop and log in. Ignore everything else and choose "clone a repository". A "repository" is basically a "Github project", like The Modding Tree. "Cloning" is downloading a copy of the repository to your computer.

    5. Look for The Modding Tree in the list of repositiories (it should be the only one) and click "clone".

    6. Select that you're using it for your own purposes, and click continue. It will download the files and handle everything.

    Using your repository

    1. Click on "show in explorer/finder" to the right, and then open the index.html file in the folder. The page should open up on your browser. This will let you view and test your project locally!

    2. To edit your project, click "open in VSCode" in Github Desktop.

    3. Open mod.js in VSCode, and look at the top part where it has a "modInfo" object. Fill in your mod's name to whatever you want, and change the id as well. (It can be any string value, and it's used to determine where the savefile is. Make it something that's probably unique, and don't change it again later or else it'll effectively wipe existing saves)

    4. Save mod.js, and then reload index.html in your browser. The title on the tab, as well as on the info page, will now be updated! You can reload the page every time you change the code to test it quickly and easily.

    5. Go back to Github Desktop. It's time to save your changes into the git system by making a "commit". This basically saves your work and creates a snapshot of what your code looks like at this moment, allowing you to look back at it later.

    6. At the bottom right corner, add a summary of your changes, and then click "commit to master".

    7. Finally, at the top middle, click "push origin" to push your changes out onto the online repository.

    8. You can view your project on line, or share it with others, by going to https://raw.githack.com/[YOUR-GITHUB-USERNAME]/The-Modding-Tree/master/index.html

    And now, you have successfully used Github! You can look at the documentation to see how The Modding Tree's system works and to make your mod a reality.

    + \ No newline at end of file diff --git a/public/lit/docs/infoboxes.html b/public/lit/docs/infoboxes.html index 5a2d597a..c58c18a8 100644 --- a/public/lit/docs/infoboxes.html +++ b/public/lit/docs/infoboxes.html @@ -8,11 +8,11 @@ - + - - + + @@ -313,8 +313,8 @@ etc }, etc -}

    Features:

    • title: The text displayed above the main box. Can be a function to be dynamic, and can use basic HTML.

    • body: The text displayed inside the box. Can be a function to be dynamic, and can use basic HTML.

    • style, titleStyle, bodyStyle: optional. Apply CSS to the infobox, or to the title button or body of the infobox, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • unlocked(): optional. A function returning a bool to determine if the infobox is visible or not. Default is unlocked.

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

    • id: assigned automagically. It's the "key" which the bar was stored under, for convenient access. The infobox in the example's id is "lore".

    - +}

    Features:

    • title: The text displayed above the main box. Can be a function to be dynamic, and can use basic HTML.

    • body: The text displayed inside the box. Can be a function to be dynamic, and can use basic HTML.

    • style, titleStyle, bodyStyle: optional. Apply CSS to the infobox, or to the title button or body of the infobox, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • unlocked(): optional. A function returning a bool to determine if the infobox is visible or not. Default is unlocked.

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar

    • id: assigned automagically. It's the "key" which the bar was stored under, for convenient access. The infobox in the example's id is "lore".

    + \ No newline at end of file diff --git a/public/lit/docs/layer-features.html b/public/lit/docs/layer-features.html index 41737ffd..afa59d93 100644 --- a/public/lit/docs/layer-features.html +++ b/public/lit/docs/layer-features.html @@ -8,11 +8,11 @@ - + - - + + @@ -315,8 +315,8 @@ ]
  • style: optional. a "CSS object" where the keys are CSS attributes, containing any CSS that should affect this layer's entire tab.

  • tabFormat: optional. use this if you want to add extra things to your tab or change the layout. See here for more info.

  • midsection: optional, an alternative to tabFormat, which is inserted in between Milestones and Buyables in the standard tab layout. (cannot do subtabs)

  • Big features (all optional)

    • upgrades: A grid of one-time purchases which can have unique upgrade conditions, currency costs, and bonuses. See here for more info.

    • milestones: A list of bonuses gained upon reaching certain thresholds of a resource. Often used for automation/QOL. See here for more info.

    • challenges: The player can enter challenges, which make the game harder. If they reach a goal and beat the challenge, they recieve a bonus. See here for more info.

    • buyables: Effectively upgrades that can be bought multiple times, and are optionally respeccable. Many uses. See here for more info.

    • clickables: Extremely versatile and generalized buttons which can only be clicked sometimes. See here for more info.

    • microtabs: An area that functions like a set of subtabs, with buttons at the top changing the content within. (Advanced) See here for more info.

    • bars: Display some information as a progress bar, gague, or similar. They are highly customizable, and can be vertical as well. See here for more info.

    • achievements: Kind of like milestones, but with a different display style and some other differences. Extra features are on the way at a later date! See here for more info.

    • infoboxes: Displays some text in a box that can be shown or hidden. See here for more info.

    • achievementPopups, milestonePopups: optional, If false, disables popup message when you get the achievement/milestone. True by default.

    Prestige formula features

    • type: optional. Determines which prestige formula you use. Defaults to "none".

      • "normal": The amount of currency you gain is independent of its current amount (like Prestige). The formula before bonuses is based on baseResource^exponent
      • "static": The cost is dependent on your total after reset. The formula before bonuses is based on base^(x^exponent)
      • "custom": You can define everything, from the calculations to the text on the button, yourself. (See more at the bottom)
      • "none": This layer does not prestige, and therefore does not need any of the other features in this section.
    • baseResource: The name of the resource that determines how much of the main currency you gain on reset.

    • baseAmount(): A function that gets the current value of the base resource.

    • requires: A Decimal, the amount of the base needed to gain 1 of the prestige currency. Also the amount required to unlock the layer. You can instead make this a function, to make it harder if another layer was unlocked first (based on unlockOrder).

    • exponent: Used as described above.

    • base: sometimes required. required for "static" layers, used as described above. If absent, defaults to 2. Must be greater than 1.

    • roundUpCost: optional. a bool, which is true if the resource cost needs to be rounded up. (use if the base resource is a "static" currency.)

    • gainMult(), gainExp(): optional. Functions that calculate the multiplier and exponent on resource gain from upgrades and boosts and such. Plug in any bonuses here.

    • softcap, softcapPower: optional. For normal layers, gain beyond [softcap] points is put to the [softcapPower]th power Default for softcap is e1e7, and for power is 0.5.

    • canBuyMax(): sometimes required. required for static layers, function used to determine if buying max is permitted.

    • onPrestige(gain): optional. A function that triggers when this layer prestiges, just before you gain the currency. Can be used to have secondary resource gain on prestige, or to recalculate things or whatnot.

    • resetDescription: optional. Use this to replace "Reset for " on the Prestige button with something else.

    • prestigeButtonText(): sometimes required. Use this to make the entirety of the text a Prestige button contains. Only required for custom layers, but usable by all types.

    • passiveGeneration(): optional, returns a regular number. You automatically generate your gain times this number every second (does nothing if absent) This is good for automating Normal layers.

    • autoPrestige(): optional, returns a boolean, if true, the layer will always automatically do a prestige if it can. This is good for automating Static layers.

    Tree/node features

    • symbol: optional. The text that appears on this layer's node. Default is the layer id with the first letter capitalized.

    • image: override. The url (local or global) of an image that goes on the node. (Overrides symbol)

    • position: optional. Determines the horizontal position of the layer in its row in a standard tree. By default, it uses the layer id, and layers are sorted in alphabetical order.

    • branches: optional. An array of layer/node ids. On a tree, a line will appear from this layer to all of the layers in the list. Alternatively, an entry in the array can be a 2-element array consisting of the layer id and a color value. The color value can either be a string with a hex color code, or a number from 1-3 (theme-affected colors).

    • nodeStyle: optional. A CSS object, where the keys are CSS attributes, which styles this layer's node on the tree.

    • tooltip() / tooltipLocked(): optional. Functions that return text, which is the tooltip for the node when the layer is unlocked or locked, respectively. By default the tooltips behave the same as in the original Prestige Tree. If the value is "", the tooltip will be disabled.

    Other features

    • doReset(resettingLayer): optional. Is triggered when a layer on a row greater than or equal to this one does a reset. The default behavior is to reset everything on the row, but only if it was triggered by a layer in a higher row. doReset is always called for side layers, but for these the default behavior is to reset nothing.

      If you want to keep things, determine what to keep based on resettingLayer, milestones, and such, then call layerDataReset(layer, keep), where layer is this layer, and keep is an array of the names of things to keep. It can include things like "points", "best", "total" (for this layer's prestige currency), "upgrades", any unique variables like "generatorPower", etc. If you want to only keep specific upgrades or something like that, save them in a separate variable, then call layerDataReset, and then set player[this.layer].upgrades to the saved upgrades.

    • update(diff): optional. This function is called every game tick. Use it for any passive resource production or time-based things. diff is the time since the last tick.

    • autoUpgrade: optional, a boolean value, if true, the game will attempt to buy this layer's upgrades every tick. Defaults to false.

    • automate(): optional. This function is called every game tick, after production. Use it to activate automation things that aren't otherwise supported.

    • resetsNothing: optional. Returns true if this layer shouldn't trigger any resets when you prestige.

    • increaseUnlockOrder: optional. An array of layer ids. When this layer is unlocked for the first time, the unlockOrder value for any not-yet-unlocked layers in this list increases. This can be used to make them harder to unlock.

    • shouldNotify: optional. A function to return true if this layer should be highlighted in the tree. The layer will automatically be highlighted if you can buy an upgrade whether you have this or not.

    • componentStyles: optional. An object that contains a set of functions returning CSS objects. Each of these will be applied to any components on the layer with the type of its id. Example:

    js
    componentStyles: {
         "challenge"() { return {'height': '200px'} },
         "prestige-button"() { return {'color': '#AA66AA'} }
    -}

    Custom Prestige type

    (All of these can also be used by other prestige types)

    • getResetGain(): mostly for custom prestige type. Returns how many points you should get if you reset now. You can call getResetGain(this.layer, useType = "static") or similar to calculate what your gain would be under another prestige type (provided you have all of the required features in the layer).

    • getNextAt(canMax=false): mostly for custom prestige type. Returns how many of the base currency you need to get to the next point. canMax is an optional variable used with Static-ish layers to differentiate between if it's looking for the first point you can reset at, or the requirement for any gain at all (Supporting both is good). You can also call getNextAt(this.layer, canMax=false, useType = "static") or similar to calculate what your next at would be under another prestige type (provided you have all of the required features in the layer).

    • canReset(): mostly for custom prestige type. Return true only if you have the resources required to do a prestige here.

    • prestigeNotify(): mostly for custom prestige types, returns true if this layer should be subtly highlighted to indicate you can prestige for a meaningful gain.

    - +}

    Custom Prestige type

    (All of these can also be used by other prestige types)

    • getResetGain(): mostly for custom prestige type. Returns how many points you should get if you reset now. You can call getResetGain(this.layer, useType = "static") or similar to calculate what your gain would be under another prestige type (provided you have all of the required features in the layer).

    • getNextAt(canMax=false): mostly for custom prestige type. Returns how many of the base currency you need to get to the next point. canMax is an optional variable used with Static-ish layers to differentiate between if it's looking for the first point you can reset at, or the requirement for any gain at all (Supporting both is good). You can also call getNextAt(this.layer, canMax=false, useType = "static") or similar to calculate what your next at would be under another prestige type (provided you have all of the required features in the layer).

    • canReset(): mostly for custom prestige type. Return true only if you have the resources required to do a prestige here.

    • prestigeNotify(): mostly for custom prestige types, returns true if this layer should be subtly highlighted to indicate you can prestige for a meaningful gain.

    + \ No newline at end of file diff --git a/public/lit/docs/main-mod-info.html b/public/lit/docs/main-mod-info.html index f23b5cc2..db8e2c7a 100644 --- a/public/lit/docs/main-mod-info.html +++ b/public/lit/docs/main-mod-info.html @@ -8,11 +8,11 @@ - + - - + + @@ -310,8 +310,8 @@ var doNotCallTheseFunctionsEveryTick = ["doReset", "buy", "onPurchase", "blowUpEverything"]
    • getStartPoints(): A function to determine the amount of points the player starts with after a reset. (returns a Decimal value)

    • canGenPoints(): A function returning a boolean for if points should be generated. Use this if you want an upgrade to unlock generating points.

    • getPointGen(): A function that calculates your points per second. Anything that affects your point gain should go into the calculation here.

    • addedPlayerData(): A function that returns any non-layer-related data that you want to be added to the save data and "player" object.

    js
    function addedPlayerData() { return {
     	weather: "Yes",
     	happiness: new Decimal(72),
    -}}
    • displayThings: An array of functions used to display extra things at the top of the tree tab. Each function returns a string, which is a line to display (with basic HTML support). If a function returns nothing, nothing is displayed (and it doesn't take up a line).

    • isEndgame(): A function to determine if the player has reached the end of the game, at which point the "you win!" screen appears.

    Less important things beyond this point!

    • maxTickLength(): Returns the maximum tick length, in milliseconds. Only really useful if you have something that reduces over time, which long ticks mess up (usually a challenge).
    - +}}
    • displayThings: An array of functions used to display extra things at the top of the tree tab. Each function returns a string, which is a line to display (with basic HTML support). If a function returns nothing, nothing is displayed (and it doesn't take up a line).

    • isEndgame(): A function to determine if the player has reached the end of the game, at which point the "you win!" screen appears.

    Less important things beyond this point!

    • maxTickLength(): Returns the maximum tick length, in milliseconds. Only really useful if you have something that reduces over time, which long ticks mess up (usually a challenge).
    + \ No newline at end of file diff --git a/public/lit/docs/milestones.html b/public/lit/docs/milestones.html index 8c25efdb..2265a259 100644 --- a/public/lit/docs/milestones.html +++ b/public/lit/docs/milestones.html @@ -8,11 +8,11 @@ - + - - + + @@ -313,8 +313,8 @@ done() { return player.w.points.gte(123) } } etc -}

    You can use hasMilestone(layer, id) to determine if the player has a given milestone

    Milestone features:

    • requirementDescription: A string describing the requirement for unlocking this milestone. Suggestion: Use a "total". It can also be a function that returns updating text. Can use basic HTML.

    • effectDescription: A string describing the reward for having the milestone. You will have to implement the reward elsewhere. It can also be a function that returns updating text. Can use basic HTML.

    • done(): A function returning a boolean to determine if the milestone should be awarded.

    • toggles: optional. Creates toggle buttons that appear on the milestone when it is unlocked. The toggles can toggle a given boolean value in a layer. It is defined as an array of paired items, one pair per toggle. The first is the internal name of the layer the value being toggled is stored in, and the second is the internal name of the variable to toggle. (e.g. [["b", "auto"], ["g", "auto"])

      Tip: Toggles are not de-set if the milestone becomes locked! In this case, you should also check if the player has the milestone.

    • style: optional. Applies CSS to this milestone, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • unlocked(): optional. A function returning a boolean to determine if the milestone should be shown. If absent, it is always shown.

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the milestone was stored under, for convenient access. The milestone in the example's id is 0.

    Disaable milestone popups by adding milestonePopups: false to the layer.

    - +}

    You can use hasMilestone(layer, id) to determine if the player has a given milestone

    Milestone features:

    • requirementDescription: A string describing the requirement for unlocking this milestone. Suggestion: Use a "total". It can also be a function that returns updating text. Can use basic HTML.

    • effectDescription: A string describing the reward for having the milestone. You will have to implement the reward elsewhere. It can also be a function that returns updating text. Can use basic HTML.

    • done(): A function returning a boolean to determine if the milestone should be awarded.

    • toggles: optional. Creates toggle buttons that appear on the milestone when it is unlocked. The toggles can toggle a given boolean value in a layer. It is defined as an array of paired items, one pair per toggle. The first is the internal name of the layer the value being toggled is stored in, and the second is the internal name of the variable to toggle. (e.g. [["b", "auto"], ["g", "auto"])

      Tip: Toggles are not de-set if the milestone becomes locked! In this case, you should also check if the player has the milestone.

    • style: optional. Applies CSS to this milestone, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • unlocked(): optional. A function returning a boolean to determine if the milestone should be shown. If absent, it is always shown.

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the milestone was stored under, for convenient access. The milestone in the example's id is 0.

    Disaable milestone popups by adding milestonePopups: false to the layer.

    + \ No newline at end of file diff --git a/public/lit/docs/subtabs-and-microtabs.html b/public/lit/docs/subtabs-and-microtabs.html index 0e767657..78ac809a 100644 --- a/public/lit/docs/subtabs-and-microtabs.html +++ b/public/lit/docs/subtabs-and-microtabs.html @@ -8,11 +8,11 @@ - + - - + + @@ -330,8 +330,8 @@ otherStuff: { // There could be another set of microtabs here } -}

    Normal subtabs and microtab subtabs both use the same features:

    Features:

    • content: The tab layout code for the subtab, in the tab layout format.

    • style: optional. Applies CSS to the whole subtab when switched to, in the form of an "CSS Object", where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • buttonStyle: optional. A CSS object, which affects the appearance of the button for that subtab.

    • unlocked(): optional. a function to determine if the button for this subtab should be visible. By default, a subtab is always unlocked. You can't use the "this" keyword in this function.

    • shouldNotify(): optional, if true, the tab button will be highlighted to notify the player that there is something there.

    • embedLayer: SIGNIFICANT, the id of another layer. If you have this, it will override "content", "style" and "shouldNotify", instead displaying the entire layer in the subtab.

    - +}

    Normal subtabs and microtab subtabs both use the same features:

    Features:

    • content: The tab layout code for the subtab, in the tab layout format.

    • style: optional. Applies CSS to the whole subtab when switched to, in the form of an "CSS Object", where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • buttonStyle: optional. A CSS object, which affects the appearance of the button for that subtab.

    • unlocked(): optional. a function to determine if the button for this subtab should be visible. By default, a subtab is always unlocked. You can't use the "this" keyword in this function.

    • shouldNotify(): optional, if true, the tab button will be highlighted to notify the player that there is something there.

    • embedLayer: SIGNIFICANT, the id of another layer. If you have this, it will override "content", "style" and "shouldNotify", instead displaying the entire layer in the subtab.

    + \ No newline at end of file diff --git a/public/lit/docs/trees-and-tree-customization.html b/public/lit/docs/trees-and-tree-customization.html index b4d2e3a7..b1dea7df 100644 --- a/public/lit/docs/trees-and-tree-customization.html +++ b/public/lit/docs/trees-and-tree-customization.html @@ -8,11 +8,11 @@ - + - - + + @@ -308,8 +308,8 @@

    Trees and tree customization

    If you want to have something beyond the standard tree on the left tab, you can do that in tree.js. You can change the layout of the tree, including making non-layer nodes, change it into something other than a tree, or hide the left tab altogether. This also introduces the "tree" component, which can be used in your layers as well.

    layoutInfo

    The most important part is layoutInfo, containing:

    • startTab: The id of the default tab to show on the left at the start.
    • showTree: True if the tree tab should be shown at the start of the game. (The other tab will fill the whole page)
    • treeLayout: If present, overrides the tree layout and places nodes as you describe instead (explained in the next section).

    Additionally, if you want the main layout to not be a tree, you can edit the "tree-tab" layer at the bottom of tree.js to modify it just like a normal layer's tab. You can even switch between left tabs, using showNavTab(layer) to make that layer appear on the left.

    Trees

    The tree component is defined as an array of arrays of names of layers or nodes to show in the tree. They work just like layers/ nodes in the main tree (but branches between nodes will only work on the first node if you have duplicates.)

    Here is an example tree:

    js
    [["p"],
      ["left", "blank", "right", "blank"]
    - ["a", "b", "blank", "c", "weirdButton"]]

    Nodes

    Nodes are non-layer buttons that can go in trees. They are defined similarly to layers, but with addNode instead of addLayer.

    Features:

    • color: optional, The node's color. (A string in hex format with a #)

    • symbol: optional The text on the button (The id capitalized by default)

    • canClick(): Returns true if the player can click the node. ()

    • onClick(): The function called when the node is clicked.

    • layerShown(): optional, A function returning a bool which determines if this node should be visible. It can also return "ghost", which will hide the layer, but its node will still take up space in its tree.

    • branches: optional. An array of layer/node ids. On a tree, a line will appear from this node to all of the nodes in the list. Alternatively, an entry in the array can be a 2-element array consisting of the id and a color value. The color value can either be a string with a hex color code, or a number from 1-3 (theme-affected colors).

    • nodeStyle: optional. A CSS object, where the keys are CSS attributes, which styles this node on the tree.

    • tooltip() / tooltipLocked(): optional. Functions that return text, which is the tooltip for the node when the layer is unlocked or locked, respectively. By default the tooltips behave the same as in the original Prestige Tree.

    • row: optional, the row that this node appears in (for the default tree).

    • position: optional, Determines the horizontal position of the layer in its row in a default tree. By default, it uses the id, and layers/nodes are sorted in alphabetical order.

    - + ["a", "b", "blank", "c", "weirdButton"]]

    Nodes

    Nodes are non-layer buttons that can go in trees. They are defined similarly to layers, but with addNode instead of addLayer.

    Features:

    • color: optional, The node's color. (A string in hex format with a #)

    • symbol: optional The text on the button (The id capitalized by default)

    • canClick(): Returns true if the player can click the node. ()

    • onClick(): The function called when the node is clicked.

    • layerShown(): optional, A function returning a bool which determines if this node should be visible. It can also return "ghost", which will hide the layer, but its node will still take up space in its tree.

    • branches: optional. An array of layer/node ids. On a tree, a line will appear from this node to all of the nodes in the list. Alternatively, an entry in the array can be a 2-element array consisting of the id and a color value. The color value can either be a string with a hex color code, or a number from 1-3 (theme-affected colors).

    • nodeStyle: optional. A CSS object, where the keys are CSS attributes, which styles this node on the tree.

    • tooltip() / tooltipLocked(): optional. Functions that return text, which is the tooltip for the node when the layer is unlocked or locked, respectively. By default the tooltips behave the same as in the original Prestige Tree.

    • row: optional, the row that this node appears in (for the default tree).

    • position: optional, Determines the horizontal position of the layer in its row in a default tree. By default, it uses the id, and layers/nodes are sorted in alphabetical order.

    + \ No newline at end of file diff --git a/public/lit/docs/updating-tmt.html b/public/lit/docs/updating-tmt.html index 144031ed..80891220 100644 --- a/public/lit/docs/updating-tmt.html +++ b/public/lit/docs/updating-tmt.html @@ -8,11 +8,11 @@ - + - - + + @@ -306,8 +306,8 @@ -

    Updating The Modding Tree

    This tutorial assumes that you have used the Getting Started Tutorial, and are using Github Desktop and VSCode for your mod.

    Here's what you have to do when there's a TMT update:

    1. Look at the changelog. It will warn you if the update will break anything or require any changes. Decide if you want to try to update.

    2. Open Github Desktop, and at the top middle, click "fetch origin". This will make Github Desktop get information about the update.

    3. Click where it says "current branch: master" at the top middle, and at the bottom of the thing that appears, click "choose a branch to merge into master".

    4. Select upstream/master. It will likely say there are conflicts, but you have tools to resolve them. Click "Merge upstream/master into master".

    5. A conflict happens when the things you're trying to merge have both made changes in the same place. Click "open in Visual Studio Code" next to the first file.

    6. Scroll down through the file, and look for the parts highlighted in red and green. One of these is your code, and the other is some code that will be modified by the update. Do your best to try to edit things to keep the updated changes, but keep your content.

    7. Continue to do this for all remaining changes.

    8. Do any other changes required by the update, run the game, fix issues, etc.

    - +

    Updating The Modding Tree

    This tutorial assumes that you have used the Getting Started Tutorial, and are using Github Desktop and VSCode for your mod.

    Here's what you have to do when there's a TMT update:

    1. Look at the changelog. It will warn you if the update will break anything or require any changes. Decide if you want to try to update.

    2. Open Github Desktop, and at the top middle, click "fetch origin". This will make Github Desktop get information about the update.

    3. Click where it says "current branch: master" at the top middle, and at the bottom of the thing that appears, click "choose a branch to merge into master".

    4. Select upstream/master. It will likely say there are conflicts, but you have tools to resolve them. Click "Merge upstream/master into master".

    5. A conflict happens when the things you're trying to merge have both made changes in the same place. Click "open in Visual Studio Code" next to the first file.

    6. Scroll down through the file, and look for the parts highlighted in red and green. One of these is your code, and the other is some code that will be modified by the update. Do your best to try to edit things to keep the updated changes, but keep your content.

    7. Continue to do this for all remaining changes.

    8. Do any other changes required by the update, run the game, fix issues, etc.

    + \ No newline at end of file diff --git a/public/lit/docs/upgrades.html b/public/lit/docs/upgrades.html index 9d9fa510..cef669b9 100644 --- a/public/lit/docs/upgrades.html +++ b/public/lit/docs/upgrades.html @@ -8,11 +8,11 @@ - + - - + + @@ -315,8 +315,8 @@ etc }, etc -}

    Each upgrade should have an id where the first digit is the row and the second digit is the column.

    Individual upgrades can have these features:

    • title: optional. Displayed at the top in a larger font. It can also be a function that returns updating text. Can use basic HTML.

    • description: A description of the upgrade's effect. You will also have to implement the effect where it is applied. It can also be a function that returns updating text. Can use basic HTML.

    • effect(): optional. A function that calculates and returns the current values of any bonuses from the upgrade. Can return a value or an object containing multiple values.

    • effectDisplay(): optional. A function that returns a display of the current effects of the upgrade with formatting. Default displays nothing. Can use basic HTML.

    • fullDisplay(): OVERRIDE. Overrides the other displays and descriptions, and lets you set the full text for the upgrade. Can use basic HTML.

    • cost: A Decimal for the cost of the upgrade. By default, upgrades cost the main prestige currency for the layer.

    • unlocked(): optional. A function returning a bool to determine if the upgrade is visible or not. Default is unlocked.

    • onPurchase(): optional. This function will be called when the upgrade is purchased. Good for upgrades like "makes this layer act like it was unlocked first".

    • style: optional. Applies CSS to this upgrade, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the upgrade was stored under, for convenient access. The upgrade in the example's id is 11.

    By default, upgrades use the main prestige currency for the layer. You can include these to change them (but it needs to be a Decimal):

    • currencyDisplayName: optional. The name to display for the currency for the upgrade.

    • currencyInternalName: optional. The internal name for that currency.

    • currencyLayer: optional. The internal name of the layer that currency is stored in. If it's not in a layer (like Points), omit. If it's not stored directly in a layer, instead use the next feature.

    • currencyLocation: optional. If your currency is stored in something inside a layer (e.g. a buyable's amount), you can access it this way. This is a function returning the object in "player" that contains the value (like player[this.layer].buyables)

    If you want to do something more complicated like upgrades that cost two currencies, you can override the purchase system with these (and you need to use fullDisplay as well)

    • canAfford(): OVERRIDE, a function determining if you are able to buy the upgrade

    • pay(): OVERRIDE, a function that reduces your currencies when you buy the upgrade

    - +}

    Each upgrade should have an id where the first digit is the row and the second digit is the column.

    Individual upgrades can have these features:

    • title: optional. Displayed at the top in a larger font. It can also be a function that returns updating text. Can use basic HTML.

    • description: A description of the upgrade's effect. You will also have to implement the effect where it is applied. It can also be a function that returns updating text. Can use basic HTML.

    • effect(): optional. A function that calculates and returns the current values of any bonuses from the upgrade. Can return a value or an object containing multiple values.

    • effectDisplay(): optional. A function that returns a display of the current effects of the upgrade with formatting. Default displays nothing. Can use basic HTML.

    • fullDisplay(): OVERRIDE. Overrides the other displays and descriptions, and lets you set the full text for the upgrade. Can use basic HTML.

    • cost: A Decimal for the cost of the upgrade. By default, upgrades cost the main prestige currency for the layer.

    • unlocked(): optional. A function returning a bool to determine if the upgrade is visible or not. Default is unlocked.

    • onPurchase(): optional. This function will be called when the upgrade is purchased. Good for upgrades like "makes this layer act like it was unlocked first".

    • style: optional. Applies CSS to this upgrade, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).

    • layer: assigned automagically. It's the same value as the name of this layer, so you can do player[this.layer].points or similar.

    • id: assigned automagically. It's the "key" which the upgrade was stored under, for convenient access. The upgrade in the example's id is 11.

    By default, upgrades use the main prestige currency for the layer. You can include these to change them (but it needs to be a Decimal):

    • currencyDisplayName: optional. The name to display for the currency for the upgrade.

    • currencyInternalName: optional. The internal name for that currency.

    • currencyLayer: optional. The internal name of the layer that currency is stored in. If it's not in a layer (like Points), omit. If it's not stored directly in a layer, instead use the next feature.

    • currencyLocation: optional. If your currency is stored in something inside a layer (e.g. a buyable's amount), you can access it this way. This is a function returning the object in "player" that contains the value (like player[this.layer].buyables)

    If you want to do something more complicated like upgrades that cost two currencies, you can override the purchase system with these (and you need to use fullDisplay as well)

    • canAfford(): OVERRIDE, a function determining if you are able to buy the upgrade

    • pay(): OVERRIDE, a function that reduces your currencies when you buy the upgrade

    + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 29cd9f0f..630de550 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://thepaperpilot.org/changelog/https://thepaperpilot.org/garden/activitypub/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/advent-incremental/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/atproto/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/babble-buds/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/capture-the-citadel/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/chat-glue/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/chronological/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/cinny/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/commune/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/davey-wreden/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/decentralized/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/dice-armor/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/digital-gardens/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/federated-identity/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/fedi-v2/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/fediverse/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/forgejo/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/freeform-vs-chronological-dichotomy/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/freeform/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/game-dev-tree/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/garden-rss/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/guide-to-incrementals/appeal-to-developers/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/guide-to-incrementals/appeal-to-players/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/guide-to-incrementals/defining-the-genre/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/guide-to-incrementals/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/guide-to-incrementals/navigating-criticism/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/guide-to-incrementals/what-is-content/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/incremental-social/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/ivy-road/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/kronos/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/logseq/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/matrix/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/mbin/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/my-personal-website/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/my-projects/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/nostr/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/open-source/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/opti-speech/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/planar-pioneers/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/profectus/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/social-media/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/synapse/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/the-beginner-s-guide/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/the-cozy-web/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/the-small-web/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/this-knowledge-hub/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/v-ecs/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/vitepress/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/wanderstop/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/webrings/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/garden/weird/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/guide-to-incrementals/design/criticism/https://thepaperpilot.org/guide-to-incrementals/https://thepaperpilot.org/guide-to-incrementals/ludology/appeal-developers/https://thepaperpilot.org/guide-to-incrementals/ludology/appeal-gamers/https://thepaperpilot.org/guide-to-incrementals/ludology/content/https://thepaperpilot.org/guide-to-incrementals/ludology/definition/https://thepaperpilot.org/2024-06-11T01:39:28.000Zhttps://thepaperpilot.org/public/gamedevtree/2.0-format-changes2023-11-28T02:07:21.000Zhttps://thepaperpilot.org/public/gamedevtree/README2023-11-28T02:07:21.000Zhttps://thepaperpilot.org/public/gamedevtree/changelog2023-11-28T02:07:21.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/!general-info2023-11-28T02:07:21.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/achievements2023-11-28T02:07:21.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/bars2023-11-28T02:07:21.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/basic-layer-breakdown2023-11-28T02:07:21.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/buyables2023-11-28T02:07:21.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/challenges2023-11-28T02:07:21.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/clickables2023-11-28T02:07:21.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/custom-tab-layouts2023-11-28T02:07:21.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/getting-started2023-11-28T02:07:21.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/infoboxes2023-11-28T02:07:21.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/layer-features2023-11-28T02:07:21.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/main-mod-info2023-11-28T02:07:21.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/milestones2023-11-28T02:07:21.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/subtabs-and-microtabs2023-11-28T02:07:21.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/updating-tmt2023-11-28T02:07:21.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/upgrades2023-11-28T02:07:21.000Zhttps://thepaperpilot.org/public/kronos/Old%20Things/2.0-format-changes2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/README2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/changelog2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/docs/!general-info2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/docs/achievements2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/docs/bars2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/docs/basic-layer-breakdown2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/docs/buyables2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/docs/challenges2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/docs/clickables2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/docs/custom-tab-layouts2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/docs/getting-started2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/docs/grids2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/docs/infoboxes2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/docs/layer-features2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/docs/main-mod-info2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/docs/milestones2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/docs/particles2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/docs/subtabs-and-microtabs2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/docs/trees-and-tree-customization2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/docs/updating-tmt2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/docs/upgrades2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/lit/Old%20Things/2.0-format-changes2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/README2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/changelog2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/docs/!general-info2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/docs/achievements2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/docs/bars2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/docs/basic-layer-breakdown2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/docs/buyables2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/docs/challenges2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/docs/clickables2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/docs/custom-tab-layouts2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/docs/getting-started2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/docs/infoboxes2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/docs/layer-features2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/docs/main-mod-info2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/docs/milestones2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/docs/subtabs-and-microtabs2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/docs/trees-and-tree-customization2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/docs/updating-tmt2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/docs/upgrades2023-11-28T02:07:43.000Z \ No newline at end of file +https://thepaperpilot.org/changelog/https://thepaperpilot.org/garden/activitypub/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/advent-incremental/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/atproto/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/babble-buds/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/capture-the-citadel/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/chat-glue/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/chronological/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/cinny/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/commune/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/davey-wreden/2024-06-09T22:19:05.000Zhttps://thepaperpilot.org/garden/decentralized/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/dice-armor/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/digital-gardens/2024-06-06T06:39:12.000Zhttps://thepaperpilot.org/garden/federated-identity/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/fedi-v2/2024-06-06T06:39:12.000Zhttps://thepaperpilot.org/garden/fediverse/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/forgejo/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/freeform-vs-chronological-dichotomy/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/freeform/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/game-dev-tree/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/garden-rss/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/guide-to-incrementals/appeal-to-developers/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/guide-to-incrementals/appeal-to-players/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/guide-to-incrementals/defining-the-genre/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/guide-to-incrementals/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/guide-to-incrementals/navigating-criticism/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/guide-to-incrementals/what-is-content/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/incremental-social/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/ivy-road/2024-06-09T22:19:05.000Zhttps://thepaperpilot.org/garden/kronos/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/logseq/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/matrix/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/mbin/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/my-personal-website/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/my-projects/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/nostr/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/open-source/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/opti-speech/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/planar-pioneers/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/profectus/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/social-media/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/synapse/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/the-beginner-s-guide/2024-06-09T22:19:05.000Zhttps://thepaperpilot.org/garden/the-cozy-web/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/the-small-web/2024-06-09T22:06:05.000Zhttps://thepaperpilot.org/garden/this-knowledge-hub/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/v-ecs/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/vitepress/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/wanderstop/2024-06-09T22:19:05.000Zhttps://thepaperpilot.org/garden/webrings/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/garden/weird/2024-06-06T04:25:48.000Zhttps://thepaperpilot.org/guide-to-incrementals/design/criticism/https://thepaperpilot.org/guide-to-incrementals/https://thepaperpilot.org/guide-to-incrementals/ludology/appeal-developers/https://thepaperpilot.org/guide-to-incrementals/ludology/appeal-gamers/https://thepaperpilot.org/guide-to-incrementals/ludology/content/https://thepaperpilot.org/guide-to-incrementals/ludology/definition/https://thepaperpilot.org/2024-06-06T03:56:50.000Zhttps://thepaperpilot.org/public/gamedevtree/2.0-format-changes2020-10-19T01:27:03.000Zhttps://thepaperpilot.org/public/gamedevtree/README2020-10-09T01:48:55.000Zhttps://thepaperpilot.org/public/gamedevtree/changelog2020-11-09T15:33:11.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/!general-info2020-10-26T02:25:42.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/achievements2020-10-16T15:39:39.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/bars2020-10-26T02:25:42.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/basic-layer-breakdown2020-10-13T03:28:02.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/buyables2020-10-17T19:50:30.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/challenges2020-10-16T15:39:39.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/clickables2020-10-26T02:25:42.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/custom-tab-layouts2020-10-26T03:00:32.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/getting-started2020-10-19T23:52:52.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/infoboxes2020-10-26T02:25:42.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/layer-features2020-10-26T03:00:32.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/main-mod-info2020-10-19T23:52:52.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/milestones2020-10-15T17:29:25.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/subtabs-and-microtabs2020-10-13T03:08:19.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/updating-tmt2020-10-09T03:45:08.000Zhttps://thepaperpilot.org/public/gamedevtree/docs/upgrades2020-10-20T00:05:53.000Zhttps://thepaperpilot.org/public/kronos/Old%20Things/2.0-format-changes2020-12-13T02:43:22.000Zhttps://thepaperpilot.org/public/kronos/README2023-11-28T02:02:57.000Zhttps://thepaperpilot.org/public/kronos/changelog2022-10-05T00:46:54.000Zhttps://thepaperpilot.org/public/kronos/docs/!general-info2021-05-18T20:06:03.000Zhttps://thepaperpilot.org/public/kronos/docs/achievements2021-05-13T05:44:40.000Zhttps://thepaperpilot.org/public/kronos/docs/bars2020-11-07T22:26:06.000Zhttps://thepaperpilot.org/public/kronos/docs/basic-layer-breakdown2021-05-11T01:24:24.000Zhttps://thepaperpilot.org/public/kronos/docs/buyables2021-05-14T19:32:20.000Zhttps://thepaperpilot.org/public/kronos/docs/challenges2021-05-14T19:32:20.000Zhttps://thepaperpilot.org/public/kronos/docs/clickables2021-05-14T19:32:20.000Zhttps://thepaperpilot.org/public/kronos/docs/custom-tab-layouts2021-05-13T03:21:39.000Zhttps://thepaperpilot.org/public/kronos/docs/getting-started2020-11-07T19:49:07.000Zhttps://thepaperpilot.org/public/kronos/docs/grids2021-05-12T03:34:55.000Zhttps://thepaperpilot.org/public/kronos/docs/infoboxes2020-10-26T20:45:22.000Zhttps://thepaperpilot.org/public/kronos/docs/layer-features2021-05-15T16:31:58.000Zhttps://thepaperpilot.org/public/kronos/docs/main-mod-info2021-05-13T06:51:18.000Zhttps://thepaperpilot.org/public/kronos/docs/milestones2020-12-13T02:43:22.000Zhttps://thepaperpilot.org/public/kronos/docs/particles2021-05-18T20:06:03.000Zhttps://thepaperpilot.org/public/kronos/docs/subtabs-and-microtabs2021-05-07T23:24:32.000Zhttps://thepaperpilot.org/public/kronos/docs/trees-and-tree-customization2020-11-07T22:26:06.000Zhttps://thepaperpilot.org/public/kronos/docs/updating-tmt2020-10-26T20:45:22.000Zhttps://thepaperpilot.org/public/kronos/docs/upgrades2021-05-13T05:44:40.000Zhttps://thepaperpilot.org/public/lit/Old%20Things/2.0-format-changes2020-12-13T02:43:22.000Zhttps://thepaperpilot.org/public/lit/README2023-11-28T02:07:43.000Zhttps://thepaperpilot.org/public/lit/changelog2022-10-05T00:47:12.000Zhttps://thepaperpilot.org/public/lit/docs/!general-info2020-11-07T22:26:06.000Zhttps://thepaperpilot.org/public/lit/docs/achievements2020-12-10T06:31:42.000Zhttps://thepaperpilot.org/public/lit/docs/bars2020-11-07T22:26:06.000Zhttps://thepaperpilot.org/public/lit/docs/basic-layer-breakdown2020-10-26T20:45:22.000Zhttps://thepaperpilot.org/public/lit/docs/buyables2020-12-17T02:20:00.000Zhttps://thepaperpilot.org/public/lit/docs/challenges2021-01-21T22:52:09.000Zhttps://thepaperpilot.org/public/lit/docs/clickables2020-10-26T20:45:22.000Zhttps://thepaperpilot.org/public/lit/docs/custom-tab-layouts2020-12-05T19:52:29.000Zhttps://thepaperpilot.org/public/lit/docs/getting-started2020-11-07T19:49:07.000Zhttps://thepaperpilot.org/public/lit/docs/infoboxes2020-10-26T20:45:22.000Zhttps://thepaperpilot.org/public/lit/docs/layer-features2020-12-22T03:09:33.000Zhttps://thepaperpilot.org/public/lit/docs/main-mod-info2020-12-05T19:52:29.000Zhttps://thepaperpilot.org/public/lit/docs/milestones2020-12-13T02:43:22.000Zhttps://thepaperpilot.org/public/lit/docs/subtabs-and-microtabs2020-10-29T18:57:42.000Zhttps://thepaperpilot.org/public/lit/docs/trees-and-tree-customization2020-11-07T22:26:06.000Zhttps://thepaperpilot.org/public/lit/docs/updating-tmt2020-10-26T20:45:22.000Zhttps://thepaperpilot.org/public/lit/docs/upgrades2020-11-30T20:03:26.000Z \ No newline at end of file