From 5868cda0dac8d4ef696ba6b897c081036c4a3842 Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Wed, 21 Dec 2022 08:15:25 -0600 Subject: [PATCH 1/9] Fix typo --- src/data/layers/workshop.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/layers/workshop.tsx b/src/data/layers/workshop.tsx index 042c20e..5c49a8a 100644 --- a/src/data/layers/workshop.tsx +++ b/src/data/layers/workshop.tsx @@ -293,7 +293,7 @@ const layer = createLayer(id, function (this: BaseLayer) { const extraExpansionMilestone6 = createMilestone(() => ({ display: { requirement: "1200% Foundation Completed", - effectDisplay: "Quadruple oil gain" + effectDisplay: "Quadruple drill power" }, shouldEarn: () => Decimal.gte(foundationProgress.value, 1200), visibility: () => From cad540735ee2d2f349cdfaf3265e337f1a2ce097 Mon Sep 17 00:00:00 2001 From: Yhvr Date: Wed, 21 Dec 2022 11:08:16 -0500 Subject: [PATCH 2/9] Drop periods in milestone effects I kept them when there were 2+ sentences --- src/data/layers/management.tsx | 55 +++++++++++++++++----------------- src/data/layers/oil.tsx | 4 +-- src/data/layers/toys.tsx | 8 ++--- 3 files changed, 33 insertions(+), 34 deletions(-) diff --git a/src/data/layers/management.tsx b/src/data/layers/management.tsx index 90812f6..2a5742b 100644 --- a/src/data/layers/management.tsx +++ b/src/data/layers/management.tsx @@ -311,7 +311,7 @@ const layer = createLayer(id, () => { effectDisplay: jsx(() => ( <> Multiply log gain by 9 - Cutter amount. + Cutter amount )) }, @@ -320,7 +320,7 @@ const layer = createLayer(id, () => { createMilestone(() => ({ display: { requirement: "Holly Level 2", - effectDisplay: "Holly now buys max." + effectDisplay: "Holly now buys max" }, visibility: () => showIf(cutterElfMilestones[0].earned.value), shouldEarn: () => cutterElfTraining.level.value >= 2 @@ -330,8 +330,7 @@ const layer = createLayer(id, () => { requirement: "Holly Level 3", effectDisplay: jsx(() => ( <> - Multiply all cloth actions' effectiveness by log10(Cutter - amount). + Multiply all cloth actions' effectiveness by log10(Cutter amount) )) }, @@ -349,7 +348,7 @@ const layer = createLayer(id, () => { createMilestone(() => ({ display: { requirement: "Holly Level 5", - effectDisplay: "Unlock an elf that autobuys oil drills and extractors." + effectDisplay: "Unlock an elf that autobuys oil drills and extractors" }, visibility: () => showIf(cutterElfMilestones[3].earned.value && main.day.value >= 13), shouldEarn: () => cutterElfTraining.level.value >= 5, @@ -362,14 +361,14 @@ const layer = createLayer(id, () => { createMilestone(() => ({ display: { requirement: "Ivy Level 1", - effectDisplay: "Planters are now twice as efficent." + effectDisplay: "Planters are now twice as efficent" }, shouldEarn: () => planterElfTraining.level.value >= 1 })), createMilestone(() => ({ display: { requirement: "Ivy Level 2", - effectDisplay: "Ivy now buys max." + effectDisplay: "Ivy now buys max" }, visibility: () => showIf(planterElfMilestones[0].earned.value), shouldEarn: () => planterElfTraining.level.value >= 2 @@ -418,7 +417,7 @@ const layer = createLayer(id, () => { createMilestone(() => ({ display: { requirement: "Hope Level 2", - effectDisplay: "Hope now buys max." + effectDisplay: "Hope now buys max" }, visibility: () => showIf(expanderElfMilestones[0].earned.value), shouldEarn: () => expandersElfTraining.level.value >= 2 @@ -426,7 +425,7 @@ const layer = createLayer(id, () => { createMilestone(() => ({ display: { requirement: "Hope Level 3", - effectDisplay: "The workshop can be expanded past 100%, but costs scale faster." + effectDisplay: "The workshop can be expanded past 100%, but costs scale faster" }, visibility: () => showIf(expanderElfMilestones[1].earned.value), shouldEarn: () => expandersElfTraining.level.value >= 3 @@ -434,7 +433,7 @@ const layer = createLayer(id, () => { createMilestone(() => ({ display: { requirement: "Hope Level 4", - effectDisplay: "Unlock an elf that autobuys coal drills." + effectDisplay: "Unlock an elf that autobuys coal drills" }, visibility: () => showIf(expanderElfMilestones[2].earned.value && main.day.value >= 13), shouldEarn: () => expandersElfTraining.level.value >= 4, @@ -455,7 +454,7 @@ const layer = createLayer(id, () => { createMilestone(() => ({ display: { requirement: "Jack Level 1", - effectDisplay: '"Fahrenheit 451" affects "Heated Cutters" twice.' + effectDisplay: '"Fahrenheit 451" affects "Heated Cutters" twice' }, shouldEarn: () => heatedCutterElfTraining.level.value >= 1 })), @@ -470,7 +469,7 @@ const layer = createLayer(id, () => { createMilestone(() => ({ display: { requirement: "Jack Level 3", - effectDisplay: "Jack and Joy now buy max." + effectDisplay: "Jack and Joy now buy max" }, visibility: () => showIf(heatedCutterElfMilestones[1].earned.value), shouldEarn: () => heatedCutterElfTraining.level.value >= 3 @@ -480,7 +479,7 @@ const layer = createLayer(id, () => { requirement: "Jack Level 4", effectDisplay: jsx(() => ( <> - Oil gain is multiplied by total elf levels. + Oil gain is multiplied by total elf levels )) }, @@ -491,7 +490,7 @@ const layer = createLayer(id, () => { createMilestone(() => ({ display: { requirement: "Jack Level 5", - effectDisplay: "Unlock an elf that autobuys oil-using machines." + effectDisplay: "Unlock an elf that autobuys oil-using machines" }, visibility: () => showIf(heatedCutterElfMilestones[3].earned.value && main.day.value >= 13), @@ -505,14 +504,14 @@ const layer = createLayer(id, () => { createMilestone(() => ({ display: { requirement: "Mary Level 1", - effectDisplay: `"Tillamook Burn Country" affects "Heated Planters" twice.` + effectDisplay: `"Tillamook Burn Country" affects "Heated Planters" twice` }, shouldEarn: () => heatedPlanterElfTraining.level.value >= 1 })), createMilestone(() => ({ display: { requirement: "Mary Level 2", - effectDisplay: "Metal gain is raised to the 1.1." + effectDisplay: "Metal gain is raised to the 1.1" }, visibility: () => showIf(heatedPlanterElfMilestones[0].earned.value), shouldEarn: () => heatedPlanterElfTraining.level.value >= 2 @@ -520,7 +519,7 @@ const layer = createLayer(id, () => { createMilestone(() => ({ display: { requirement: "Mary Level 3", - effectDisplay: "Mary, Noel, and Faith now buy max." + effectDisplay: "Mary, Noel, and Faith now buy max" }, visibility: () => showIf(heatedPlanterElfMilestones[1].earned.value), shouldEarn: () => heatedPlanterElfTraining.level.value >= 3 @@ -539,7 +538,7 @@ const layer = createLayer(id, () => { requirement: "Mary Level 5", effectDisplay: jsx(() => ( <> - Auto smelting speed is multiplied by total XP/1e6. + Auto smelting speed is multiplied by total XP/1e6 )) }, @@ -554,7 +553,7 @@ const layer = createLayer(id, () => { requirement: "Noel Level 1", effectDisplay: jsx(() => ( <> - Log gain is multiplied by total elf levels. + Log gain is multiplied by total elf levels )) }, @@ -606,7 +605,7 @@ const layer = createLayer(id, () => { createMilestone(() => ({ display: { requirement: "Joy Level 1", - effectDisplay: "Small Fire synergy counts bonfires at reduced rate." + effectDisplay: "Small Fire synergy counts bonfires at reduced rate" }, shouldEarn: () => smallfireElfTraining.level.value >= 1 })), @@ -649,7 +648,7 @@ const layer = createLayer(id, () => { createMilestone(() => ({ display: { requirement: "Faith Level 1", - effectDisplay: "Multiply bonfire efficiency by 5." + effectDisplay: "Multiply bonfire efficiency by 5" }, shouldEarn: () => bonfireElfTraining.level.value >= 1 })), @@ -690,7 +689,7 @@ const layer = createLayer(id, () => { createMilestone(() => ({ display: { requirement: "Snowball Level 1", - effectDisplay: "Multiply kiln efficiency by 5." + effectDisplay: "Multiply kiln efficiency by 5" }, shouldEarn: () => kilnElfTraining.level.value >= 1 })), @@ -731,7 +730,7 @@ const layer = createLayer(id, () => { createMilestone(() => ({ display: { requirement: "Star Level 1", - effectDisplay: "Book cost is divided by total books bought." + effectDisplay: "Book cost is divided by total books bought" }, shouldEarn: () => paperElfTraining.level.value >= 1 })), @@ -762,7 +761,7 @@ const layer = createLayer(id, () => { createMilestone(() => ({ display: { requirement: "Star Level 5", - effectDisplay: "Gain 5 free books for all prior elves that are at level 5 or above." + effectDisplay: "Gain 5 free books for all prior elves that are at level 5 or above" }, visibility: () => showIf(paperElfMilestones[3].earned.value && main.day.value >= 13), shouldEarn: () => paperElfTraining.level.value >= 5 @@ -774,7 +773,7 @@ const layer = createLayer(id, () => { requirement: "Bell Level 1", effectDisplay: jsx(() => ( <> - Every box buyable adds level levels to same-row box buyables. + Every box buyable adds level levels to same-row box buyables )) }, @@ -823,7 +822,7 @@ const layer = createLayer(id, () => { createMilestone(() => ({ display: { requirement: "Gingersnap Level 1", - effectDisplay: "Multiply all primary dye colors by ln(cloth + e)." + effectDisplay: "Multiply all primary dye colors by ln(cloth + e)" }, shouldEarn: () => clothElfTraining.level.value >= 1 })), @@ -932,7 +931,7 @@ const layer = createLayer(id, () => { createMilestone(() => ({ display: { requirement: "Twinkle Level 3", - effectDisplay: "Auto smelting multi is tripled." + effectDisplay: "Auto smelting multi is tripled" }, visibility: () => showIf(metalElfMilestones[1].earned.value), shouldEarn: () => metalElfTraining.level.value >= 3 @@ -1107,7 +1106,7 @@ const layer = createLayer(id, () => { effectDisplay: jsx(() => ( <> Every plastic buyable adds level levels to the other plastic - buyables. + buyables )) }, diff --git a/src/data/layers/oil.tsx b/src/data/layers/oil.tsx index e9bf0a5..a047ba9 100644 --- a/src/data/layers/oil.tsx +++ b/src/data/layers/oil.tsx @@ -513,7 +513,7 @@ const layer = createLayer(id, function (this: BaseLayer) { display: { requirement: "5m Well Depth", effectDisplay: - "Gain 25% more coal for each metre of well depth (after the 3 elf milestone)." + "Gain 25% more coal for each metre of well depth (after the 3 elf milestone)" }, shouldEarn: () => Decimal.gte(depth.value, 5) })), @@ -528,7 +528,7 @@ const layer = createLayer(id, function (this: BaseLayer) { createMilestone(() => ({ display: { requirement: "25m Well Depth", - effectDisplay: "Gain 5% more ore for each metre of well depth." + effectDisplay: "Gain 5% more ore for each metre of well depth" }, shouldEarn: () => Decimal.gte(depth.value, 25), visibility: () => showIf(depthMilestones[1].earned.value) diff --git a/src/data/layers/toys.tsx b/src/data/layers/toys.tsx index 503bbd2..2654250 100644 --- a/src/data/layers/toys.tsx +++ b/src/data/layers/toys.tsx @@ -231,14 +231,14 @@ const layer = createLayer(id, function (this: BaseLayer) { display: { requirement: "10 toys", effectDisplay: - "The cost of making toys is divided by the number of complete workshops you have." + "The cost of making toys is divided by the number of complete workshops you have" }, shouldEarn: () => Decimal.gte(toySum.value, 10) })); const milestone2 = createMilestone(() => ({ display: { requirement: "100 toys", - effectDisplay: "Unlock black dyes." + effectDisplay: "Unlock black dyes" }, shouldEarn: () => Decimal.gte(toySum.value, 100), visibility: () => showIf(milestone1.earned.value) @@ -247,7 +247,7 @@ const layer = createLayer(id, function (this: BaseLayer) { const milestone3 = createMilestone(() => ({ display: { requirement: "200 toys", - effectDisplay: "Beach wrapping paper is much more powerful." + effectDisplay: "Beach wrapping paper is much more powerful" }, shouldEarn: () => Decimal.gte(toySum.value, 200), visibility: () => showIf(milestone2.earned.value) @@ -255,7 +255,7 @@ const layer = createLayer(id, function (this: BaseLayer) { const milestone4 = createMilestone(() => ({ display: { requirement: "350 toys", - effectDisplay: "Gain 50x oil and plastic." + effectDisplay: "Gain 50x oil and plastic" }, shouldEarn: () => Decimal.gte(toySum.value, 350), visibility: () => showIf(milestone3.earned.value) From 7039ea077f91c58edea1944685fe4017c37117e0 Mon Sep 17 00:00:00 2001 From: unsoftcapped3 <75136164+unsoftcapped3@users.noreply.github.com> Date: Wed, 21 Dec 2022 10:39:44 -0800 Subject: [PATCH 3/9] display letter hardcap --- src/data/layers/letters.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/layers/letters.tsx b/src/data/layers/letters.tsx index 1191824..af594f4 100644 --- a/src/data/layers/letters.tsx +++ b/src/data/layers/letters.tsx @@ -339,6 +339,7 @@ const layer = createLayer(id, function (this: BaseLayer) { {render(process)}
+ You cannot have more letters than people in the world. The more letters you process, the more you'll improve at processing letters.
Currently: {format(synergy.value)}x
From 247085978ae01f9c471f54a79c326a643228db24 Mon Sep 17 00:00:00 2001 From: Yhvr Date: Wed, 21 Dec 2022 14:35:16 -0500 Subject: [PATCH 4/9] hide "limited by" for trees after ivy lv 5 --- src/data/layers/trees.tsx | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/data/layers/trees.tsx b/src/data/layers/trees.tsx index 8bc93e2..84f32f6 100644 --- a/src/data/layers/trees.tsx +++ b/src/data/layers/trees.tsx @@ -908,17 +908,27 @@ const layer = createLayer(id, function (this: BaseLayer) { style="margin-bottom: 0" productionDisplay={ Decimal.gt(computedAutoCuttingAmount.value, 0) - ? `+${format( - averageLogGain.value - )}/s average
equilibrium: +${formatLimit( - [ - [computedAutoCuttingAmount.value, "cutting speed"], - [computedAutoPlantingAmount.value, "planting speed"], - [Decimal.mul(computedTotalTrees.value, 20), "forest cap"] - ], - "/s", - logGain.apply(1) - )}` + ? `+${format(averageLogGain.value)}/s average
equilibrium: +${ + management.elfTraining.planterElfTraining.milestones[4].earned + .value + ? format(logGain.apply(computedAutoCuttingAmount.value)) + + "/s" + : formatLimit( + [ + [computedAutoCuttingAmount.value, "cutting speed"], + [ + computedAutoPlantingAmount.value, + "planting speed" + ], + [ + Decimal.mul(computedTotalTrees.value, 20), + "forest cap" + ] + ], + "/s", + logGain.apply(1) + ) + }` : undefined } /> From 0bbfe4c170dfe31b846c77a02f96110b2726769a Mon Sep 17 00:00:00 2001 From: Yhvr Date: Wed, 21 Dec 2022 14:56:49 -0500 Subject: [PATCH 5/9] hide "lmited by" for metal after mastery --- src/data/layers/metal.tsx | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/data/layers/metal.tsx b/src/data/layers/metal.tsx index ffb1f28..0ee308d 100644 --- a/src/data/layers/metal.tsx +++ b/src/data/layers/metal.tsx @@ -746,21 +746,31 @@ const layer = createLayer(id, function (this: BaseLayer) { {autoSmeltEnabled.value && (Decimal.gte(industrialCrucible.amount.value, 1) || masteryEffectActive.value) - ? `+${formatLimit( - [ - [computedAutoSmeltSpeed.value, "smelting speed"], - [computedOreGain.value, "ore gain"], - [ - Decimal.div(coal.computedCoalGain.value, coalCost), - "coal gain" - ] - ], - "/s", - Decimal.mul( - computedOrePurity.value, - computedAutoSmeltMulti.value + ? masteryEffectActive.value + ? formatGain( + Decimal.mul( + computedOrePurity.value, + computedOrePurity.value + ).mul(computedAutoSmeltSpeed.value) ) - )}` + : `+${formatLimit( + [ + [computedAutoSmeltSpeed.value, "smelting speed"], + [computedOreGain.value, "ore gain"], + [ + Decimal.div( + coal.computedCoalGain.value, + coalCost + ), + "coal gain" + ] + ], + "/s", + Decimal.mul( + computedOrePurity.value, + computedAutoSmeltMulti.value + ) + )}` : undefined} ))} From 6a353642d68989213eebf1fdebb9a76176d9b12c Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Wed, 21 Dec 2022 18:43:36 -0600 Subject: [PATCH 6/9] Change how letters handles being maxed out --- src/data/layers/letters.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/data/layers/letters.tsx b/src/data/layers/letters.tsx index af594f4..49485fd 100644 --- a/src/data/layers/letters.tsx +++ b/src/data/layers/letters.tsx @@ -68,6 +68,7 @@ const layer = createLayer(id, function (this: BaseLayer) { style: { minHeight: "80px" }, + visibility: () => showIf(Decimal.lt(totalLetters.value, 8e9)), canClick: () => Decimal.gte(processingProgress.value, computedProcessingCooldown.value) && (!main.isMastery.value || masteryEffectActive.value), @@ -338,11 +339,14 @@ const layer = createLayer(id, function (this: BaseLayer) { ) : null} {render(process)} -
- You cannot have more letters than people in the world. - The more letters you process, the more you'll improve at processing letters. -
-
Currently: {format(synergy.value)}x
+ {Decimal.lt(totalLetters.value, 8e9) ? ( +
+ The more letters you process, the more you'll improve at processing letters. +
Currently: {format(synergy.value)}x
+
+ ) : ( +
You've processed all of humanity's letters to Santa!
+ )} {renderRow(...Object.values(buyables))} From 10482aaf90926be2f2fd27ba204275affb8b1ee7 Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Wed, 21 Dec 2022 18:44:16 -0600 Subject: [PATCH 7/9] Fix typo --- src/data/projEntry.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/projEntry.tsx b/src/data/projEntry.tsx index 49ed1d3..c60cfed 100644 --- a/src/data/projEntry.tsx +++ b/src/data/projEntry.tsx @@ -421,7 +421,7 @@ export const main = createLayer("main", function (this: BaseLayer) { symbol: toysSymbol, story: "You've had enough of this running around and stalling - it is time to create some toys NOW! You have everything you need and then some, so let's finally just sit down and get this process started!", completedStory: - "In your haste you may have been a bit wasteful with resources, but it feels really good to finally make some meaningful process on making toys for Santa. You already envision plans on how to get elves to help you out and start pumping out these toys, but for now... Good Job!", + "In your haste you may have been a bit wasteful with resources, but it feels really good to finally make some meaningful progress on making toys for Santa. You already envision plans on how to get elves to help you out and start pumping out these toys, but for now... Good Job!", masteredStory: "" })), createDay(() => ({ From ef4c0b606da44b2eed41f609e5b2c6aa16a9446a Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Wed, 21 Dec 2022 20:27:06 -0600 Subject: [PATCH 8/9] Stop selecting tooltip text --- src/data/layers/styles/factory.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/data/layers/styles/factory.css b/src/data/layers/styles/factory.css index 1cc656b..371e0ed 100644 --- a/src/data/layers/styles/factory.css +++ b/src/data/layers/styles/factory.css @@ -32,6 +32,9 @@ pointer-events: none; transition: height .3s; + + pointer-events: none; + user-select: none; } .factory-container { position: absolute; From 7cbbf732fc1fdd3f732dba9bf7e482c38869f991 Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Wed, 21 Dec 2022 20:37:11 -0600 Subject: [PATCH 9/9] Implement energy that affects factory tick rate --- src/data/layers/factory.tsx | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/data/layers/factory.tsx b/src/data/layers/factory.tsx index e99e725..f4b2a10 100644 --- a/src/data/layers/factory.tsx +++ b/src/data/layers/factory.tsx @@ -8,7 +8,7 @@ import { globalBus } from "game/events"; import { createLayer } from "game/layers"; import { Persistent, persistent, State } from "game/persistence"; import player from "game/player"; -import { formatWhole } from "util/bignum"; +import Decimal, { formatWhole } from "util/bignum"; import { Direction } from "util/common"; import { computed, ComputedRef, reactive, ref, watchEffect } from "vue"; import conveyor from "./factory-components/conveyor.png"; @@ -75,6 +75,16 @@ const factory = createLayer(id, () => { const name = "The Factory"; const color = "grey"; + const energy = computed(() => 100); + const energyConsumption = computed(() => + Object.values(components.value) + .map(c => FACTORY_COMPONENTS[c.type].energyCost ?? 0) + .reduce((a, b) => a + b, 0) + ); + const tickRate = computed(() => + Decimal.div(energyConsumption.value, energy.value).pow(2).min(1) + ); + // ---------------------------------------------- Components const FACTORY_COMPONENTS = { @@ -94,6 +104,7 @@ const factory = createLayer(id, () => { imageSrc: conveyor, name: "Conveyor", description: "Moves items at 1 block per second.", + energyCost: 1, tick: 1, ports: { [Direction.Left]: { @@ -108,6 +119,7 @@ const factory = createLayer(id, () => { imageSrc: square, name: "Producer", description: "Produces 1 square every 1 second.", + energyCost: 10, tick: 1, outputs: { square: { @@ -131,6 +143,7 @@ const factory = createLayer(id, () => { name: "Shrinker", description: "Converts 100 squares to 1 square. I don't know why you would want to do this but here you go anyways.", + energyCost: 20, tick: 1, inputs: { square: { @@ -178,6 +191,7 @@ const factory = createLayer(id, () => { imageSrc: string; name: string; description: string; + energyCost?: number; /** amount it consumes */ inputs?: Record< @@ -308,6 +322,9 @@ const factory = createLayer(id, () => { globalBus.on("update", diff => { if (!loaded) return; + + const factoryTicks = tickRate.value.times(diff).toNumber(); + //debugger // make them produce for (const id in components.value) { @@ -361,7 +378,8 @@ const factory = createLayer(id, () => { key--; } else { const change = - dirAmt * Math.min(Math.abs(x + 1.3 * dirAmt - block.x), diff); + dirAmt * + Math.min(Math.abs(x + 1.3 * dirAmt - block.x), factoryTicks); block.x += change; block.sprite.x += change * blockSize; } @@ -395,7 +413,8 @@ const factory = createLayer(id, () => { key--; } else { const change = - dirAmt * Math.min(Math.abs(y + 1.3 * dirAmt - block.y), diff); + dirAmt * + Math.min(Math.abs(y + 1.3 * dirAmt - block.y), factoryTicks); block.y += change; block.sprite.y += change * blockSize; } @@ -425,7 +444,7 @@ const factory = createLayer(id, () => { data.ticksDone -= cyclesDone * factoryData.tick; } } else { - data.ticksDone += diff; + data.ticksDone += factoryTicks; } // now look at each component direction and see if it accepts items coming in // components are 1x1 so simple math for now