mirror of
https://github.com/thepaperpilot/Planar-Pioneers.git
synced 2024-11-22 00:21:31 +00:00
Add xp mechanc to planes
This commit is contained in:
parent
4b1428bcde
commit
545b1c94d1
1 changed files with 102 additions and 13 deletions
|
@ -2,13 +2,21 @@ import ModalVue from "components/Modal.vue";
|
||||||
import SpacerVue from "components/layout/Spacer.vue";
|
import SpacerVue from "components/layout/Spacer.vue";
|
||||||
import StickyVue from "components/layout/Sticky.vue";
|
import StickyVue from "components/layout/Sticky.vue";
|
||||||
import { GenericAchievement, createAchievement } from "features/achievements/achievement";
|
import { GenericAchievement, createAchievement } from "features/achievements/achievement";
|
||||||
|
import { createBar } from "features/bars/bar";
|
||||||
import { BoardNode, getUniqueNodeID } from "features/boards/board";
|
import { BoardNode, getUniqueNodeID } from "features/boards/board";
|
||||||
|
import { createClickable } from "features/clickables/clickable";
|
||||||
|
import { createCumulativeConversion } from "features/conversion";
|
||||||
import { CoercableComponent, findFeatures, isVisible, jsx } from "features/feature";
|
import { CoercableComponent, findFeatures, isVisible, jsx } from "features/feature";
|
||||||
import { GenericRepeatable, RepeatableType, createRepeatable } from "features/repeatable";
|
import { GenericRepeatable, RepeatableType, createRepeatable } from "features/repeatable";
|
||||||
import { createResource, displayResource } from "features/resources/resource";
|
import { createResource, displayResource } from "features/resources/resource";
|
||||||
|
import TooltipVue from "features/tooltips/Tooltip.vue";
|
||||||
import { addTooltip } from "features/tooltips/tooltip";
|
import { addTooltip } from "features/tooltips/tooltip";
|
||||||
import { GenericUpgrade, UpgradeType, createUpgrade } from "features/upgrades/upgrade";
|
import { GenericUpgrade, UpgradeType, createUpgrade } from "features/upgrades/upgrade";
|
||||||
import Formula, { unrefFormulaSource } from "game/formulas/formulas";
|
import Formula, {
|
||||||
|
calculateCost,
|
||||||
|
calculateMaxAffordable,
|
||||||
|
unrefFormulaSource
|
||||||
|
} from "game/formulas/formulas";
|
||||||
import { FormulaSource, GenericFormula } from "game/formulas/types";
|
import { FormulaSource, GenericFormula } from "game/formulas/types";
|
||||||
import { BaseLayer, createLayer } from "game/layers";
|
import { BaseLayer, createLayer } from "game/layers";
|
||||||
import {
|
import {
|
||||||
|
@ -22,12 +30,14 @@ import { State, noPersist, persistent } from "game/persistence";
|
||||||
import { createCostRequirement } from "game/requirements";
|
import { createCostRequirement } from "game/requirements";
|
||||||
import { adjectives, colors, uniqueNamesGenerator } from "unique-names-generator";
|
import { adjectives, colors, uniqueNamesGenerator } from "unique-names-generator";
|
||||||
import Decimal, { DecimalSource } from "util/bignum";
|
import Decimal, { DecimalSource } from "util/bignum";
|
||||||
import { format } from "util/break_eternity";
|
import { format, formatWhole } from "util/break_eternity";
|
||||||
import { Direction, WithRequired, camelToTitle } from "util/common";
|
import { Direction, WithRequired, camelToTitle } from "util/common";
|
||||||
import { Computable, ProcessedComputable, convertComputable } from "util/computed";
|
import { Computable, ProcessedComputable, convertComputable } from "util/computed";
|
||||||
import { VueFeature, render, renderRow, trackHover } from "util/vue";
|
import { VueFeature, render, renderRow, trackHover } from "util/vue";
|
||||||
import { ComputedRef, Ref, computed, ref, unref } from "vue";
|
import { ComputedRef, Ref, computed, ref, unref } from "vue";
|
||||||
|
import { useToast } from "vue-toastification";
|
||||||
import { createCollapsibleModifierSections, createFormulaPreview, estimateTime } from "./common";
|
import { createCollapsibleModifierSections, createFormulaPreview, estimateTime } from "./common";
|
||||||
|
import type { PortalState, ResourceState, Resources } from "./projEntry";
|
||||||
import {
|
import {
|
||||||
BoosterState,
|
BoosterState,
|
||||||
InfluenceState,
|
InfluenceState,
|
||||||
|
@ -38,13 +48,7 @@ import {
|
||||||
relics,
|
relics,
|
||||||
resourceNames
|
resourceNames
|
||||||
} from "./projEntry";
|
} from "./projEntry";
|
||||||
import type { ResourceState, Resources, PortalState } from "./projEntry";
|
|
||||||
import { getColor, getName, sfc32 } from "./utils";
|
import { getColor, getName, sfc32 } from "./utils";
|
||||||
import { useToast } from "vue-toastification";
|
|
||||||
import TooltipVue from "features/tooltips/Tooltip.vue";
|
|
||||||
import { createConversion, createCumulativeConversion } from "features/conversion";
|
|
||||||
import { createClickable } from "features/clickables/clickable";
|
|
||||||
import ResourceVue from "features/resources/Resource.vue";
|
|
||||||
|
|
||||||
const toast = useToast();
|
const toast = useToast();
|
||||||
|
|
||||||
|
@ -194,8 +198,8 @@ export function createPlane(
|
||||||
const featureWeights = {
|
const featureWeights = {
|
||||||
upgrades: 32,
|
upgrades: 32,
|
||||||
repeatables: i <= 1 ? 0 : 16,
|
repeatables: i <= 1 ? 0 : 16,
|
||||||
conversion: i <= 3 ? 0 : 8
|
conversion: i <= 3 ? 0 : 8,
|
||||||
// xp: i <= 5 ? 0 : 4,
|
xp: i <= 5 ? 0 : 4
|
||||||
// dimensions: i <= 7 ? 0 : 2,
|
// dimensions: i <= 7 ? 0 : 2,
|
||||||
// prestige: i <= 7 && i < length - 1 ? 0 : 1
|
// prestige: i <= 7 && i < length - 1 ? 0 : 1
|
||||||
};
|
};
|
||||||
|
@ -488,7 +492,7 @@ export function createPlane(
|
||||||
showPreview,
|
showPreview,
|
||||||
conversion.actualGain
|
conversion.actualGain
|
||||||
);
|
);
|
||||||
const effectReview = createFormulaPreview(
|
const effectPreview = createFormulaPreview(
|
||||||
formula,
|
formula,
|
||||||
showPreview,
|
showPreview,
|
||||||
conversion.actualGain
|
conversion.actualGain
|
||||||
|
@ -508,7 +512,7 @@ export function createPlane(
|
||||||
</h2>{" "}
|
</h2>{" "}
|
||||||
{prestigeResource.displayName},
|
{prestigeResource.displayName},
|
||||||
<br />
|
<br />
|
||||||
providing a {effectReview()}x multiplier to previous{" "}
|
providing a {effectPreview()}x multiplier to previous{" "}
|
||||||
{resource.displayName} gain
|
{resource.displayName} gain
|
||||||
</div>
|
</div>
|
||||||
) : null}
|
) : null}
|
||||||
|
@ -516,6 +520,91 @@ export function createPlane(
|
||||||
</>
|
</>
|
||||||
));
|
));
|
||||||
break;
|
break;
|
||||||
|
case "xp": {
|
||||||
|
const xp = createResource<DecimalSource>(0);
|
||||||
|
const barVisibility = visibility;
|
||||||
|
const currentN = n.value;
|
||||||
|
const title = getRandomUpgrade(random);
|
||||||
|
const cost = Decimal.add(difficulty, random() - 0.5)
|
||||||
|
.pow_base(2)
|
||||||
|
.times(10);
|
||||||
|
const levelDifficulty = random() / 4 + 1.125; // 1.125 - 1.375
|
||||||
|
const effectExponent = random() / 2 + 1.25; // 1.25 - 1.75
|
||||||
|
const xpReq = Formula.variable(0).pow(levelDifficulty).times(cost);
|
||||||
|
const level = calculateMaxAffordable(xpReq, xp, true, 10, Decimal.dInf);
|
||||||
|
const xpForCurrentLevel = computed(() =>
|
||||||
|
calculateCost(xpReq, level.value, true, 10)
|
||||||
|
);
|
||||||
|
const xpToNextLevel = computed(() =>
|
||||||
|
calculateCost(xpReq, Decimal.add(level.value, 1), true, 10)
|
||||||
|
);
|
||||||
|
const effect = computed(() => Decimal.pow(effectExponent, level.value));
|
||||||
|
const modifier = createMultiplicativeModifier(() => ({
|
||||||
|
multiplier: effect,
|
||||||
|
description: title,
|
||||||
|
enabled: () => isVisible(bar.visibility)
|
||||||
|
}));
|
||||||
|
costFormula = costFormula.add(
|
||||||
|
computed(() =>
|
||||||
|
Decimal.sub(n.value, currentN)
|
||||||
|
.add(1)
|
||||||
|
.sqrt()
|
||||||
|
.times(3)
|
||||||
|
.pow(effectExponent)
|
||||||
|
.times(cachedGain[currentN - 1])
|
||||||
|
)
|
||||||
|
);
|
||||||
|
cachedGain[n.value] = costFormula.evaluate();
|
||||||
|
n.value += 2;
|
||||||
|
const barColor = getColor([0.18, 0.2, 0.25], random);
|
||||||
|
const bar = createBar(() => ({
|
||||||
|
direction: Direction.Right,
|
||||||
|
width: 300,
|
||||||
|
height: 20,
|
||||||
|
progress: () =>
|
||||||
|
Decimal.sub(xp.value, xpForCurrentLevel.value)
|
||||||
|
.div(Decimal.sub(xpToNextLevel.value, xpForCurrentLevel.value))
|
||||||
|
.toNumber(),
|
||||||
|
visibility: barVisibility,
|
||||||
|
xp,
|
||||||
|
display: jsx(() => (
|
||||||
|
<span>
|
||||||
|
{format(xp.value)}/{format(xpToNextLevel.value)}
|
||||||
|
</span>
|
||||||
|
)),
|
||||||
|
fillStyle: `background-color: ${barColor}`
|
||||||
|
}));
|
||||||
|
this.on("preUpdate", diff => {
|
||||||
|
if (
|
||||||
|
main.activePortals.value.some(
|
||||||
|
n => (n.state as unknown as PortalState).id === id
|
||||||
|
) &&
|
||||||
|
isVisible(bar.visibility)
|
||||||
|
) {
|
||||||
|
const totalDiff = Decimal.times(
|
||||||
|
computedPlanarSpeedModifier.value,
|
||||||
|
diff
|
||||||
|
);
|
||||||
|
xp.value = Decimal.add(totalDiff, xp.value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
resourceModifiers.push(modifier);
|
||||||
|
features.push([bar]);
|
||||||
|
displays[i * 2] = jsx(() => (
|
||||||
|
<>
|
||||||
|
{isVisible(bar.visibility) ? (
|
||||||
|
<div style="margin: 10px">
|
||||||
|
You have <h3>{title}</h3> Lv. {formatWhole(level.value)},<br />
|
||||||
|
providing a {format(effect.value)}x multiplier to previous{" "}
|
||||||
|
{resource.displayName} gain
|
||||||
|
<br />
|
||||||
|
</div>
|
||||||
|
) : null}
|
||||||
|
{renderRow(bar)}
|
||||||
|
</>
|
||||||
|
));
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
const treasureWeights = {
|
const treasureWeights = {
|
||||||
cache: "increaseCaches" in influenceState ? 10 : 1,
|
cache: "increaseCaches" in influenceState ? 10 : 1,
|
||||||
|
@ -576,7 +665,7 @@ export function createPlane(
|
||||||
break;
|
break;
|
||||||
case "energyMulti":
|
case "energyMulti":
|
||||||
effectedResource = "energy";
|
effectedResource = "energy";
|
||||||
resourceMulti = Decimal.div(rewardsLevel, 17);
|
resourceMulti = Decimal.div(rewardsLevel, 17).add(1);
|
||||||
description = `Gain ${format(resourceMulti)}x energy while plane is active.`;
|
description = `Gain ${format(resourceMulti)}x energy while plane is active.`;
|
||||||
break;
|
break;
|
||||||
case "influences":
|
case "influences":
|
||||||
|
|
Loading…
Reference in a new issue