PREVIEW D1 — Safe to mutate. This is omcalc-data-preview, not production. Formula Explorer for Yacht Club testers.

Formula Browser

Every calculation module documented — inputs, outputs, dependencies, and the actual formula. Hover any input row for a game-concept note. Click to pin the tooltip for a longer read.

realm-resolve

Realm Resolution

Converts a realm name string + progress percentage into a fully-resolved path object. Looks up the realm in REALM_DATA.minorRealms to get total XP, absorption value, and position in the global realm order. Computes currentXP, remainingXP, and flags (isComplete, isLate).

Inputs

FieldLabel
mainPath.realmRealm Name
mainPath.progressPctProgress %

Outputs

FieldLabelUnit
mainPath.realmIndexRealm Index (global order)
mainPath.totalXPRealm Total XP
mainPath.remainingXPRemaining XP to Complete
mainPath.isCompleteIs Late Tier Completed
mainPath.isLateIs Late Tier
mainPath.absorptionRealm Base Absorption
Formula
realmData    = REALM_DATA.minorRealms[realm]
currentXP    = realmData.totalXP × progressPct / 100
remainingXP  = realmData.totalXP - currentXP
realmIndex   = REALM_DATA.minorRealmOrder.indexOf(realm)
majorRealm   = realm.split(" ")[0...-1].join(" ")  // strips tier
tier         = realm.split(" ").last()  // Early/Mid/Late
isLate       = tier === "Late"
isComplete   = isLate AND progressPct >= 100
virya-stage-detect

VirYa Stage Detection

Determines the player's current VirYa stage (No Virya → Quasi) by comparing main and aux realm positions. Quasi requires all three paths at the same late-stage realm. Half-Step requires both main and aux to be in the same major realm's Late tier. Perfection requires aux ≤ 2 minor realms behind main-Late. Eminence requires aux ≤ 4 minor realms behind. Completion requires main to be in Late tier.

Depends on
Realm Resolution

Inputs

FieldLabel
mainPath.realmMain Path Realm
auxPath.realmAux Path Realm
thirdPath.realmThird Path Realm

Outputs

FieldLabelUnit
virYaStageVirYa Stage
Formula
Quasi: main=Late AND aux=Late AND same major AND third=mainRealm
Half-Step: main=Late AND aux=Late AND same major
Perfection: main=Complete AND (mainIdx - auxIdx) ≤ 2
Eminence: main=Complete AND (mainIdx - auxIdx) ≤ 4
Completion: main=Complete AND main=Late
No Virya: none of the above
absorption-compute

Total Absorption (Cultivation Speed)

Computes the player's total cultivation speed ratio — the multiplier applied to cosmoapsis speed. Combines base realm absorption, VirYa bonus, bloodline bonus, and strive multiplier. EP-TRIB v1.1 formula. Bloodline "average" mode time-weights the event boost over the remaining season: 7 event days at current boost + (seasonDays-7) days at the stage's raw bonus, divided by total days.

Depends on
VirYa Stage DetectionRealm Resolution

Inputs

FieldLabel
mainPath.realmMain Path Realm
virYaStageVirYa Stage (derived)
bloodline.stageBloodline Stage
bloodline.seasonModeSeason Mode (current/average)
bloodline.currentBoostBloodline Current Boost
bloodline.seasonDurationDaysSeason Duration (days)
striveStrive Bonus (%)

Outputs

FieldLabelUnit
absorption.main.baseAbsorptionBase Absorption
absorption.main.viryaBonusVirYa Bonus
absorption.main.bloodlineBonusBloodline Bonus (effective)
absorption.main.striveMultiplierStrive Multiplier
absorption.main.totalAbsorptionTotal Absorption
Formula
viryaBonus  = VIRYA_ABSORPTION_BONUS[virYaStage]  // 0 / 0.20 / 0.40
bloodlineBonus (current mode)  = currentBoost
bloodlineBonus (average mode)  = (currentBoost × 7 + rawStageBonus × (seasonDays-7)) / seasonDays
striveMultiplier = 1 + strive
totalAbsorption  = (baseAbsorption + viryaBonus) × striveMultiplier × (1 + bloodlineBonus)
passive-abode

Abode Aura Energy Bonus

Sums all abode energy bonuses (or uses the manual override from the in-game Skyward Rush screen). The abode bonus multiplied by the base cosmoapsis energy (130) yields the bonus energy above the base 130.

Inputs

FieldLabel
abodeTotalManualManual Abode Override
abode.*Individual Abode Fields

Outputs

FieldLabelUnit
passive.abodeBonusTotalAbode Bonus Total
passive.bonusEnergyBonus Energyenergy
passive.totalEnergyTotal Cosmoapsis Energyenergy
Formula
abodeBonusTotal = abodeTotalManual ?? SUM(all abode fields)
bonusEnergy     = abodeBonusTotal × GAME_CONSTANTS.cosmoapsiBaseEnergy  // 130
totalEnergy     = bonusEnergy + 130
passive-cosmo

Cosmoapsis XP per Day

The primary passive XP source. Cosmoapsis speed = total energy × total absorption. XP/day = cosmo speed × 10,800 cultivation cycles/day (GAME_CONSTANTS). This is the foundation all other passive sources scale against.

Depends on
Abode Aura Energy BonusTotal Absorption (Cultivation Speed)

Inputs

FieldLabel
passive.totalEnergyTotal Energy (from Abode)
absorption.main.totalAbsorptionTotal Absorption (includes VirYa/Bloodline)

Outputs

FieldLabelUnit
passive.cosmoSpeedCosmoapsis Speed
passive.cosmoXPPerDayCosmo XP/DayXP/day
Formula
cosmoSpeed    = totalEnergy × totalAbsorption
cosmoXPPerDay = cosmoSpeed × 10800  // cultivationCyclesPerDay
passive-gem

Gem XP per Day

The Cultivation Gem (Auraseep) adds a speed bonus on top of cosmoapsis. EP-TRIB v1.1 folds the base auraseep multiplier into EFFICIENCY_DATA (gemSpeedBonusByQuality). The total gem bonus is additive: base gem speed + auraseep temper1 + that sum × baseBonus.

Depends on
Cosmoapsis XP per Day

Inputs

FieldLabel
gem.rarityGem Quality
auraseep.baseBonusAuraseep Base Bonus
auraseep.temper1Auraseep Temper 1 Bonus

Outputs

FieldLabelUnit
passive.gemSpeedBaseGem Speed Base
passive.gemSpeedWithBonusesGem Speed Total
passive.cosmoSpeedPlusGemCosmo+Gem Speed
passive.gemXPPerDayGem XP/DayXP/day
Formula
gemSpeedBase        = EFFICIENCY_DATA.gemSpeedBonusByQuality[gem.rarity]
gemSpeedWithBonuses = gemSpeedBase + temper1 + (gemSpeedBase + temper1) × baseBonus
cosmoSpeedPlusGem   = cosmoSpeed × (1 + gemSpeedWithBonuses)
gemXPPerDay         = cosmoSpeedPlusGem × 10800 - cosmoXPPerDay
passive-pearl

Pearl Artifact XP per Day

The Pearl artifact generates passive cultivation via energy → pills → XP. EP-TRIB v1.1: No-star pearl = 2000 cycles/day, 1+ stars = 2400 cycles/day. Star-level cost reductions apply: 1-2 stars = -5% pill cost, 3+ stars = -10%. Pearl XP uses base cosmo speed (not total, unlike gem) per the Fatty PassiveXP sheet.

Depends on
Cosmoapsis XP per Day

Inputs

FieldLabel
artifacts.pearl.starsPearl Star Level

Outputs

FieldLabelUnit
passive.pearlCyclesPerDayPearl Cycles/Daycycles
passive.pearlPillsPerDayPearl Pills/Daypills
passive.pearlXPPerDayPearl XP/DayXP/day
Formula
pearlCycles  = 2000 (No star) | 2400 (1+ stars)  // from ARTIFACT_DATA
costMult     = 1 | 0.95 (1-2 star) | 0.90 (3+ star)
pillsPerDay  = (artifactEnergyPerDay(stars) + 5starBonus) / (basePillCost × costMult)
pearlXPPerDay= cosmoSpeedBase × pearlCycles × pillsPerDay
passive-red-curio

Red Curio Aux XP per Day

The Red Curio provides an auxiliary cultivation speed effect that generates XP as a fraction of cosmoapsis XP. Sum the four Red Curio bonus fields to get the fraction, then multiply by cosmoXPPerDay.

Depends on
Cosmoapsis XP per Day

Inputs

FieldLabel
redCurioAux.baseEffectRed Curio Base Effect
redCurioAux.auxIndepCultSpeedAux Independent Cult Speed
redCurioAux.auxIndepCultEfficiencyAux Independent Cult Efficiency
redCurioAux.temperingEnhancedTempering Enhanced Bonus

Outputs

FieldLabelUnit
passive.redCurioAuxFracRed Curio Fraction
passive.redCurioXPPerDayRed Curio XP/DayXP/day
passive.totalPassiveXPPerDayTotal Passive XP/DayXP/day
Formula
redCurioAuxFrac  = baseEffect + auxIndepCultSpeed + auxIndepCultEfficiency + temperingEnhanced
redCurioXPPerDay = cosmoXPPerDay × redCurioAuxFrac
totalPassiveXPPerDay = cosmoXPPerDay + gemXPPerDay + pearlXPPerDay + redCurioXPPerDay
active-pills

Pill Artifact XP per Day

The three pill-producing artifacts (Vase, Mirror, Token) each generate energy per day (Fate recharge + per-year rate × 96 Taoist years/day). That energy converts to pills at the relevant pill cost, and pills convert to XP at the current major realm's pill XP rate. Higher star levels grant +5% / +10% 5-star bonus energy on Vase.

Depends on
Realm Resolution

Inputs

FieldLabel
artifacts.vase.starsVase Stars
artifacts.vase.pillRarityVase Pill Rarity
artifacts.mirror.starsMirror Stars
artifacts.mirror.duplicatesMythicMirror Duplicates Mythic
artifacts.token.starsToken Stars

Outputs

FieldLabelUnit
active.vaseXPPerDayVase XP/DayXP/day
active.mirrorXPPerDayMirror XP/DayXP/day
active.tokenXPPerDayToken XP/DayXP/day
Formula
energyPerDay   = Fate(100) + perYear[stars] × 96
pillsPerDay    = energyPerDay / pillCost[rarity]
artifactXPPerDay = pillsPerDay × PILL_DATA.pillXpByRealm[majorRealm]
active-respira

Respira (Cultivation Gush) XP per Day

Respira attempts generate a "cultivation gush" — a burst of extra XP. Total attempts = technique + curio + friends. Each attempt has a base gush chance modified by technique/friends/curio/worldRift/dipperMansion bonuses. The average gush multiplier is then applied to the daily XP rate.

Depends on
Cosmoapsis XP per Day

Inputs

FieldLabel
respira.techniqueAttemptsTechnique Attempts
respira.curioAttemptsCurio Attempts
respira.friendsAttemptsFriends Attempts
respira.techniqueBonusTechnique Gush Bonus
respira.friendsBonusFriends Gush Bonus
respira.curioBonusCurio Gush Bonus
respira.worldRiftBonusWorld Rift Bonus
respira.dipperMansionBonusDipper Mansion Bonus

Outputs

FieldLabelUnit
active.totalRespirationAttemptsTotal Respiration Attempts
active.respiraBonusTotalRespira Bonus Total
active.avgGushMultiplierAvg Gush Multiplier
active.respiraXPPerDayRespira XP/DayXP/day
Formula
totalAttempts  = techniqueAttempts + curioAttempts + friendsAttempts
respiraBonus   = techniqueBonus + friendsBonus + curioBonus + worldRiftBonus + dipperMansionBonus
avgGushMult    = computed from base gush chance × (1 + respiraBonus) × attempts
respiraXPPerDay= cosmoXPPerDay × avgGushMultiplier
active-elixir

Elixir XP per Day

Elixirs convert directly to cultivation XP. The elixir efficiency multiplier scales with how many elixirs have already been used (diminishing returns), tracked via elixirTotalUsed.

Depends on
Realm Resolution

Inputs

FieldLabel
pills.elixirPerDayElixirs per Day
pills.elixirTotalUsedTotal Elixirs Used

Outputs

FieldLabelUnit
active.elixirEfficiencyMultiplierElixir Efficiency Multiplier
active.elixirXPPerDayElixir XP/DayXP/day
Formula
efficiencyMult = EFFICIENCY_DATA.elixirEfficiency[elixirTotalUsed bucket]
elixirXPPerDay = elixirPerDay × efficiencyMult × PILL_DATA.elixirXPValue
daily-xp

Daily XP Aggregation

Sums all XP sources to compute the total XP earned per day on the main path and aux path. The path focus (Main or Secondary) determines which path gets the larger active XP allocation. Also provides a breakdown by source category.

Depends on
Red Curio Aux XP per DayPill Artifact XP per DayRespira (Cultivation Gush) XP per DayElixir XP per Day

Inputs

FieldLabel
pathFocusPath Focus (Main/Secondary)
passive.totalPassiveXPPerDayTotal Passive XP/Day (derived)
active.totalActiveXPPerDayTotal Active XP/Day (derived)

Outputs

FieldLabelUnit
dailyXP.mainPathXPPerDayMain Path XP/DayXP/day
dailyXP.auxPathXPPerDayAux Path XP/DayXP/day
dailyXP.breakdownPer-Source Breakdown
Formula
mainPathXPPerDay = totalPassiveXPPerDay + (pathFocus=Main ? totalActiveXPPerDay : 0)
auxPathXPPerDay  = totalPassiveXPPerDay + (pathFocus=Secondary ? totalActiveXPPerDay : 0)
fruits

Myrimon Fruit XP

Calculates the total XP value of all Myrimon fruits accumulated before the Target Gate. Factors in weekly fruit acquisition (basic runs + ranking + shop + token runs), the number of Wednesdays remaining (weekly reset day), the Extractor's cultivation multiplier (raises XP per orb), and gush chance (average burst XP per orb).

Depends on
Realm Resolution

Inputs

FieldLabel
fruits.weeklyBasicRunsWeekly Basic Runs
fruits.weeklyRankingWeekly Ranking Runs
fruits.weeklyShopWeekly Shop Fruits
fruits.weeklyTokenRunsWeekly Token Runs
fruits.ownedFruits Already Owned
fruits.isLastUnlockedRealmIs Last Unlocked Realm
timegate.endDateTG End Date

Outputs

FieldLabelUnit
fruits.numWednesdaysWednesdays to TG
fruits.totalFruitsToTGTotal Fruits to TG
fruits.baseFruitXPBase XP per Fruit Orb
fruits.avgFruitXPPerOrbAvg XP per Orb (current extractor)
fruits.totalFruitXPTotal Fruit XP (current extractor)
fruits.totalFruitXPMaxedTotal Fruit XP (maxed extractor)
Formula
numWednesdays     = count of Wednesdays between now and TG endDate
weeklyFruits      = weeklyBasicRuns + weeklyRanking + weeklyShop + weeklyTokenRuns
totalFruitsToTG   = owned + weeklyFruits × numWednesdays
baseFruitXP       = REALM_DATA[currentRealm].fruitXP × (isLastUnlockedRealm ? 1.5 : 1)
avgFruitXPPerOrb  = baseFruitXP × extractorCultMultiplier × avgGushMultiplier
totalFruitXP      = totalFruitsToTG × avgFruitXPPerOrb
breakthrough-minor

Days to Minor Breakthrough

Calculates how many days until the player completes their current minor realm (Early/Mid/Late) and can perform a minor breakthrough. Separate calculations for main and aux paths. A "with fruits" variant applies Myrimon fruit XP as a one-time lump sum reduction.

Depends on
Daily XP AggregationMyrimon Fruit XP

Inputs

FieldLabel
mainPath.realmMain Path Realm
mainPath.progressPctMain Path Progress %
dailyXP.mainPathXPPerDayMain Path XP/Day (derived)
fruits.totalFruitXPTotal Fruit XP (derived)

Outputs

FieldLabelUnit
breakthrough.daysToMinorBT_mainDays to Minor BT (Main)
breakthrough.daysToMinorBT_auxDays to Minor BT (Aux)
breakthrough.daysToMinorBT_main_withFruitsDays to Minor BT (Main) w/ Fruits
breakthrough.daysToMinorBT_aux_withFruitsDays to Minor BT (Aux) w/ Fruits
breakthrough.btDateMinorMainMinor BT Date (Main)
Formula
remainingXP         = totalXP × (1 - progressPct/100)
daysToMinorBT       = max(0, remainingXP) / mainPathXPPerDay
daysToMinorBT_fruits= max(0, remainingXP - totalFruitXP) / mainPathXPPerDay
breakthrough-major

Days to Major Breakthrough

Calculates days to complete the entire current major realm (all three tiers). Includes variants: plain, with fruits, and with a fully-maxed Extractor (which increases fruit XP). Also projects what percentage of the NEXT major realm the player will have completed by their Target Gate (TG) date.

Depends on
Days to Minor BreakthroughDaily XP AggregationMyrimon Fruit XP

Inputs

FieldLabel
mainPath.realmMain Path Realm
timegate.endDateTarget Gate End Date
dailyXP.mainPathXPPerDayMain XP/Day (derived)
fruits.totalFruitXPFruit XP (current extractor, derived)
fruits.totalFruitXPMaxedFruit XP (maxed extractor, derived)

Outputs

FieldLabelUnit
breakthrough.daysToMajorBT_mainDays to Major BT (Main)
breakthrough.daysToMajorBT_auxDays to Major BT (Aux)
breakthrough.daysToMajorBT_main_withFruitsDays to Major BT w/ Fruits
breakthrough.daysToMajorBT_main_maxedExtractorDays to Major BT w/ Maxed Extractor
breakthrough.daysRemainingDays Remaining to TG
breakthrough.nextMajorRealmPctAtBTNext Major Realm % at BT%
breakthrough.btDayOverchargeBT Day Overcharge XP
Formula
needed      = remainingMinorXP + SUM(remaining tiers XP in major realm)
daysToMajor = max(0, needed - fruitXP) / xpPerDay
nextMajorPct= max(0, (xpEarnedBeforeTG - xpToEndCurrentMajor) / nextMajorTotalXP) × 100
virya-scenarios

VirYa Scenario Projections

For each VirYa stage (Completion through Quasi), projects how many days remain until the player can achieve it, whether it is reachable before the Target Gate, and the XP surplus/deficit vs the TG window. Each scenario re-scales the daily XP rate using the ratio of that stage's absorption bonus vs current absorption — this is aspirational speed (what you'd earn if you already had that bonus). Fruit XP is also applied as an offset.

Depends on
Total Absorption (Cultivation Speed)Daily XP AggregationMyrimon Fruit XPDays to Major Breakthrough

Inputs

FieldLabel
mainPath.realmMain Path Realm
auxPath.realmAux Path Realm
thirdPath.realmThird Path Realm
dailyXP.mainPathXPPerDayMain XP/Day (derived)
dailyXP.auxPathXPPerDayAux XP/Day (derived)
absorption.mainMain Absorption (derived)
breakthrough.daysRemainingDays Remaining to TG (derived)
fruits.totalFruitXPFruit XP (derived)

Outputs

FieldLabelUnit
virya.scenarios.Completion.daysToReachDays to Completion
virya.scenarios.Eminence.daysToReachDays to Eminence
virya.scenarios.Perfection.daysToReachDays to Perfection
virya.scenarios["Half-Step"].daysToReachDays to Half-Step
virya.scenarios.Quasi.daysToReachDays to Quasi
virya.conditions.currentStageCurrent VirYa Stage
Formula
targetIdx[Completion]  = mainLateIdx
targetIdx[Eminence]    = mainLateIdx - 4
targetIdx[Perfection]  = mainLateIdx - 2
targetIdx[Half-Step]   = mainLateIdx
targetIdx[Quasi]       = mainLateIdx (both aux AND third)

scenarioXPD  = baseXPD × scenarioAbsorption / currentAbsorption
xpNeeded     = SUM(minorRealm.totalXP for each realm from current to targetIdx)
daysToReach  = max(0, xpNeeded - fruitXP) / scenarioXPD
reachable    = daysToReach ≤ daysRemaining
extractor

Extractor Leveling Projection

Projects the Extractor's bubble levels (Cultivation EXP, Quality, Gush) at the Target Gate, based on Myrimon souls earned from boss runs, ranking, and shop. Determines if the Extractor can be fully maxed before breakthrough.

Depends on
Days to Major Breakthrough

Inputs

FieldLabel
extractor.rarityExtractor Rarity
extractor.cultExpLevelCurrent Cult EXP Level
extractor.qualityLevelCurrent Quality Level
extractor.gushLevelCurrent Gush Level
extractor.highestBossHighest Boss Cleared
myrimon.additionalRunsAdditional Myrimon Runs
myrimon.avgWeeklyRankingAvg Weekly Ranking
myrimon.shopSoulsShop Souls per Week

Outputs

FieldLabelUnit
extractor.weeklyTotalSoulsWeekly Souls
extractor.totalSoulsToTGTotal Souls to TG
extractor.projectedCultLevelProjected Cult Level at TG
extractor.projectedQualityLevelProjected Quality Level at TG
extractor.projectedGushLevelProjected Gush Level at TG
extractor.canMaxBeforeBTCan Max Before BT
Formula
weeklySouls = soulsFromBoss + soulsFrom3WeeklyRuns + soulsFromRanking + soulsFromShop
totalSouls  = soulsSpentOnCurrentLevels + weeklySouls × weeksToTG
projectedLevel = highest level affordable with totalSouls from EXTRACTOR_DATA