initial commit
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
export type UpgradeId = 'moveSpeed' | 'chopSpeed' | 'logValue' | 'pickupRadius' | 'coinSpeed';
|
||||
|
||||
export interface UpgradeDef {
|
||||
id: UpgradeId;
|
||||
name: string;
|
||||
baseCost: number;
|
||||
costGrowth: number;
|
||||
/** The upgrade's stat value at a given level (levels start at 1, unbounded above). */
|
||||
effectAtLevel: (level: number) => number;
|
||||
formatEffect: (value: number) => string;
|
||||
}
|
||||
|
||||
export const UPGRADE_LIST: UpgradeDef[] = [
|
||||
{
|
||||
id: 'moveSpeed',
|
||||
name: 'Скорость движения',
|
||||
baseCost: 5,
|
||||
costGrowth: 1.35,
|
||||
effectAtLevel: (level) => 160 + (level - 1) * 20,
|
||||
formatEffect: (v) => `${Math.round(v)} px/с`,
|
||||
},
|
||||
{
|
||||
id: 'chopSpeed',
|
||||
name: 'Скорость рубки',
|
||||
baseCost: 6,
|
||||
costGrowth: 1.35,
|
||||
effectAtLevel: (level) => (1 / 0.6) * Math.pow(1.15, level - 1),
|
||||
formatEffect: (v) => `${v.toFixed(2)} бревен/с`,
|
||||
},
|
||||
{
|
||||
id: 'logValue',
|
||||
name: 'Стоимость бревна',
|
||||
baseCost: 8,
|
||||
costGrowth: 1.4,
|
||||
effectAtLevel: (level) => level,
|
||||
formatEffect: (v) => `${v} монет/бревно`,
|
||||
},
|
||||
{
|
||||
id: 'pickupRadius',
|
||||
name: 'Радиус подбора',
|
||||
baseCost: 5,
|
||||
costGrowth: 1.3,
|
||||
effectAtLevel: (level) => 46 + (level - 1) * 6,
|
||||
formatEffect: (v) => `${Math.round(v)} px`,
|
||||
},
|
||||
{
|
||||
id: 'coinSpeed',
|
||||
name: 'Скорость обмена на монеты',
|
||||
baseCost: 7,
|
||||
costGrowth: 1.35,
|
||||
effectAtLevel: (level) => Math.pow(1.15, level - 1),
|
||||
formatEffect: (v) => `${v.toFixed(2)} бревен/с`,
|
||||
},
|
||||
];
|
||||
|
||||
export const UPGRADES: Record<UpgradeId, UpgradeDef> = Object.fromEntries(
|
||||
UPGRADE_LIST.map((def) => [def.id, def]),
|
||||
) as Record<UpgradeId, UpgradeDef>;
|
||||
|
||||
/** Cost (in coins) to go from `currentLevel` to `currentLevel + 1`. */
|
||||
export function costForNextLevel(def: UpgradeDef, currentLevel: number): number {
|
||||
return Math.ceil(def.baseCost * Math.pow(def.costGrowth, currentLevel - 1));
|
||||
}
|
||||
Reference in New Issue
Block a user