parametric game fules. minor simulator refactoring

This commit is contained in:
azykov@mail.ru
2026-02-19 22:19:05 +03:00
parent ef5caab748
commit d07f2043e7
22 changed files with 1170 additions and 181 deletions
+13 -6
View File
@@ -2,6 +2,7 @@ import { type ResourceGenerator } from "@idle-economy/engine";
import { observer } from "mobx-react-lite";
import { ResourcesView } from "./ResourcesView";
import { root } from "./state/Root";
import { formatNumber } from "./tools/format";
type Props = {
generator: ResourceGenerator,
@@ -12,8 +13,10 @@ export const ResourceGeneratorView = observer(function (props: Props) {
let gen = props.generator;
let showName = gen.rule.name === 'prestige';
const upgradeLevelsAvailable = gen.upgradeLevelsAvailable(root.upgradeStep);
const upgradeToLevel = gen.level + upgradeLevelsAvailable;
const realUpgradeLevelsAvailable = gen.upgradeLevelsAvailable(root.upgradeStep);
const isUpgradable = realUpgradeLevelsAvailable === 0;
const upgradeLevelsAvailable = Math.max(1, realUpgradeLevelsAvailable);
const upgradeToLevel = gen.level + (realUpgradeLevelsAvailable > 0 ? upgradeLevelsAvailable : (root.upgradeStep === 'max' ? 1 : root.upgradeStep));
function handleGeneratorClick(): void {
if (props.generator.rule.manualGeneration)
@@ -36,7 +39,7 @@ export const ResourceGeneratorView = observer(function (props: Props) {
>
<div className={`name ${showName ? '' : 'hidden'}`}>{gen.rule.name}</div>
<div>LEVEL {gen.level}</div>
<div>+<ResourcesView resources={gen.getGain().toObject()} /> / {gen.getPeriod()} sec</div>
<div>+<ResourcesView resources={gen.getGain().toObject()} /> / {formatNumber(gen.getPeriod())} sec</div>
{/* <div><ProgressView period={gen.getPeriod()} progress={gen.progress} /></div> */}
{/* <div>{gen.isVisible ? 'visible' : 'not visible'}</div>
<div>{gen.isUpgradable ? 'upgradable' : 'not upgradable'}</div>
@@ -45,12 +48,16 @@ export const ResourceGeneratorView = observer(function (props: Props) {
<button
className="upgrade"
onClick={handleGeneratorUpgradeClick}
disabled={upgradeLevelsAvailable === 0}
disabled={isUpgradable}
>
<div>UPGRADE {gen.level} ⇒ {upgradeToLevel}</div>
<div>at: <ResourcesView resources={gen.getUpgradePrice(upgradeToLevel).toObject()} /></div>
<div>at: <ResourcesView resources={gen.getUpgradePrice(upgradeToLevel - 1).toObject()} /></div>
<div>cost: </div>
<div>+<ResourcesView resources={gen.getGain(upgradeToLevel).toObject()} /> / {gen.getPeriod(upgradeToLevel)} sec</div>
<div>+<ResourcesView resources={gen.getGain(upgradeToLevel).toObject()} /> / {formatNumber(gen.getPeriod(upgradeToLevel))} sec</div>
{/* <div>realUpgradeLevelsAvailable: {realUpgradeLevelsAvailable}</div>
<div>isUpgradable: {isUpgradable ? 'true' : 'false'}</div>
<div>upgradeLevelsAvailable: {upgradeLevelsAvailable}</div>
<div>upgradeToLevel: {upgradeToLevel}</div> */}
</button>
</div>
</>)
+12 -1
View File
@@ -2,10 +2,21 @@ import { makeGame, ResourceGenerator, ResourceSet } from "@idle-economy/engine";
import { makeAutoObservable } from "mobx";
import { Notation, Presets } from 'eternal_notations';
import { now } from "../tools/time";
import { defaultGameRulesOptions, type GameRulesOptions } from "@idle-economy/engine/src/rulesets/rules";
const gameRulesOptions: GameRulesOptions = defaultGameRulesOptions;
// const gameRulesOptions: GameRulesOptions = {
// startingResources: 0,
// generationBasePrice: 1,
// generationPower: 1.2,
// upgradeBasePrice: 2000,
// upgradeFactor: 1.01,
// }
export class Root {
private readonly game = makeGame();
private readonly game = makeGame(gameRulesOptions);
public resources: ResourceSet = new ResourceSet();
public generators: ResourceGenerator[] = [];
+8 -3
View File
@@ -1,6 +1,11 @@
import type Decimal from 'break_eternity.js';
import { root } from '../state/Root';
import Decimal, { type DecimalSource } from 'break_eternity.js';
import { Presets } from 'eternal_notations';
export function formatNumber(value: Decimal | undefined): string {
return root.numberNotation.format(value ?? 0);
export function formatNumber(value: DecimalSource | undefined): string {
const v = new Decimal(value ?? 0);
if (v.lt(1))
return Presets.Default.format(v)
else
return root.numberNotation.format(v);
}