add Add several upgrade functions

This commit is contained in:
Olivier Gagnon 2024-06-09 15:10:14 -04:00
parent ffaa657296
commit 863be2abed
No known key found for this signature in database
GPG Key ID: 0018772EA86FA03F
4 changed files with 251 additions and 24 deletions

@ -22,10 +22,10 @@ export const NewBus = (name: string, x: number, y: number) => {
content: [], content: [],
maxContent: 1, maxContent: 1,
moveLvl: 1, moveLvl: 0,
transferLvl: 1, transferLvl: 0,
reduceLvl: 1, reduceLvl: 0,
installLvl: 1, installLvl: 0,
// energy: 16, // energy: 16,
}); });
}; };
@ -63,7 +63,7 @@ export const NewISocket = (name: string, x: number, y: number, dispensing: Compo
x, x,
y, y,
emitting: dispensing, emitting: dispensing,
cooldown: 10000, emissionLvl: 0,
cooldownUntil: 0, cooldownUntil: 0,
content: [dispensing], content: [dispensing],
maxContent: 1, maxContent: 1,

@ -20,10 +20,11 @@ export const upgradeMaxContentCost = (type: DeviceType, currentMaxContent: numbe
exp(maxContentScale[type], currentMaxContent); exp(maxContentScale[type], currentMaxContent);
export const busPrice = (currentBusses: number): number => Math.pow(2, currentBusses + 3); export const busPrice = (currentBusses: number): number => Math.pow(2, currentBusses + 3);
export const moveSpeed = (level: number) => 1000 / (level + 9); export const moveSpeed = (level: number) => 1000 / (level + 10);
export const reduceSpeed = (level: number) => 50000 / (level + 9); export const reduceSpeed = (level: number) => 50000 / (level + 10);
export const transferSpeed = (level: number) => 1000 / (level + 9); export const transferSpeed = (level: number) => 1000 / (level + 10);
export const installSpeed = (level: number) => 100000 / (level + 9); export const installSpeed = (level: number) => 100000 / (level + 10);
export const isocketSpeed = (level: number) => 10000 / (level + 10);
const countDevices = (type: DeviceType) => myrian.devices.reduce((acc, d) => (d.type === type ? acc + 1 : acc), 0); const countDevices = (type: DeviceType) => myrian.devices.reduce((acc, d) => (d.type === type ? acc + 1 : acc), 0);
@ -46,12 +47,6 @@ export const getNextISocketRequest = (tier: number) => {
.map(() => potential[Math.floor(Math.random() * potential.length)]); .map(() => potential[Math.floor(Math.random() * potential.length)]);
}; };
(() => {
for (let i = 0; i < 10; i++) {
console.log(getNextISocketRequest(0));
}
})();
export const tierScale: Record<DeviceType, FactoryFormulaParams> = { export const tierScale: Record<DeviceType, FactoryFormulaParams> = {
[DeviceType.Bus]: [Infinity, Infinity, Infinity, Infinity], [DeviceType.Bus]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.ISocket]: [Infinity, Infinity, Infinity, Infinity], [DeviceType.ISocket]: [Infinity, Infinity, Infinity, Infinity],
@ -63,6 +58,61 @@ export const tierScale: Record<DeviceType, FactoryFormulaParams> = {
export const tierCost = (type: DeviceType, tier: number) => exp(tierScale[type], tier); export const tierCost = (type: DeviceType, tier: number) => exp(tierScale[type], tier);
export const emissionScale: Record<DeviceType, FactoryFormulaParams> = {
[DeviceType.Bus]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.ISocket]: [2, 1, 3, 0],
[DeviceType.OSocket]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.Reducer]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.Cache]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.Lock]: [Infinity, Infinity, Infinity, Infinity],
};
export const emissionCost = (type: DeviceType, emissionLvl: number) => exp(emissionScale[type], emissionLvl);
export const moveLvlScale: Record<DeviceType, FactoryFormulaParams> = {
[DeviceType.Bus]: [2, 1, 3, 0],
[DeviceType.ISocket]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.OSocket]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.Reducer]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.Cache]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.Lock]: [Infinity, Infinity, Infinity, Infinity],
};
export const moveLvlCost = (type: DeviceType, moveLvl: number) => exp(moveLvlScale[type], moveLvl);
export const transferLvlScale: Record<DeviceType, FactoryFormulaParams> = {
[DeviceType.Bus]: [2, 1, 3, 0],
[DeviceType.ISocket]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.OSocket]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.Reducer]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.Cache]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.Lock]: [Infinity, Infinity, Infinity, Infinity],
};
export const transferLvlCost = (type: DeviceType, transferLvl: number) => exp(transferLvlScale[type], transferLvl);
export const reduceLvlScale: Record<DeviceType, FactoryFormulaParams> = {
[DeviceType.Bus]: [2, 1, 3, 0],
[DeviceType.ISocket]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.OSocket]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.Reducer]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.Cache]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.Lock]: [Infinity, Infinity, Infinity, Infinity],
};
export const reduceLvlCost = (type: DeviceType, reduceLvl: number) => exp(reduceLvlScale[type], reduceLvl);
export const installLvlScale: Record<DeviceType, FactoryFormulaParams> = {
[DeviceType.Bus]: [2, 1, 3, 0],
[DeviceType.ISocket]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.OSocket]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.Reducer]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.Cache]: [Infinity, Infinity, Infinity, Infinity],
[DeviceType.Lock]: [Infinity, Infinity, Infinity, Infinity],
};
export const installLvlCost = (type: DeviceType, installLvl: number) => exp(installLvlScale[type], installLvl);
/** /**
glitches: glitches:

@ -25,11 +25,17 @@ import {
} from "../Myrian/Myrian"; } from "../Myrian/Myrian";
import { import {
deviceCost, deviceCost,
emissionCost,
getNextISocketRequest, getNextISocketRequest,
installLvlCost,
installSpeed, installSpeed,
isocketSpeed,
moveLvlCost,
moveSpeed, moveSpeed,
reduceLvlCost,
reduceSpeed, reduceSpeed,
tierCost, tierCost,
transferLvlCost,
transferSpeed, transferSpeed,
upgradeMaxContentCost, upgradeMaxContentCost,
} from "../Myrian/formulas/formulas"; } from "../Myrian/formulas/formulas";
@ -39,6 +45,10 @@ import { componentTiers } from "../Myrian/formulas/components";
export function NetscriptMyrian(): InternalAPI<IMyrian> { export function NetscriptMyrian(): InternalAPI<IMyrian> {
return { return {
DEUBG_RESET: () => resetMyrian, DEUBG_RESET: () => resetMyrian,
DEBUG_GIVE_VULNS: (ctx) => (_amount) => {
const amount = helpers.number(ctx, "amount", _amount);
myrian.vulns += amount;
},
getDevice: (ctx) => (_id) => { getDevice: (ctx) => (_id) => {
const id = helpers.deviceID(ctx, "id", _id); const id = helpers.deviceID(ctx, "id", _id);
const device = findDevice(id); const device = findDevice(id);
@ -170,10 +180,11 @@ export function NetscriptMyrian(): InternalAPI<IMyrian> {
switch (container.type) { switch (container.type) {
case DeviceType.ISocket: { case DeviceType.ISocket: {
container.cooldownUntil = Date.now() + container.cooldown; const cooldown = isocketSpeed(container.emissionLvl);
container.cooldownUntil = Date.now() + cooldown;
setTimeout(() => { setTimeout(() => {
container.content = new Array(container.maxContent).fill(container.emitting); container.content = new Array(container.maxContent).fill(container.emitting);
}, container.cooldown); }, cooldown);
break; break;
} }
@ -409,6 +420,13 @@ export function NetscriptMyrian(): InternalAPI<IMyrian> {
placedDevice.isBusy = false; placedDevice.isBusy = false;
}); });
}, },
getUpgradeTierCost: (ctx) => (_id) => {
const id = helpers.deviceID(ctx, "device", _id);
const device = findDevice(id);
if (!device) return -1;
if (!("tier" in device)) return -1;
return tierCost(device.type, device.tier);
},
upgradeTier: (ctx) => (_id) => { upgradeTier: (ctx) => (_id) => {
const id = helpers.deviceID(ctx, "device", _id); const id = helpers.deviceID(ctx, "device", _id);
const device = findDevice(id); const device = findDevice(id);
@ -420,16 +438,95 @@ export function NetscriptMyrian(): InternalAPI<IMyrian> {
device.tier++; device.tier++;
return true; return true;
}, },
getUpgradeTierCost: (ctx) => (_id) => { getUpgradeEmissionLvlCost: (ctx) => (_id) => {
const id = helpers.deviceID(ctx, "device", _id); const id = helpers.deviceID(ctx, "device", _id);
const device = findDevice(id); const device = findDevice(id);
if (!device) return -1; if (!device) return -1;
if (!("tier" in device)) return -1; if (!("emissionLvl" in device)) return -1;
return tierCost(device.type, device.tier); return emissionCost(device.type, device.emissionLvl);
}, },
DEBUG_GIVE_VULNS: (ctx) => (_amount) => { upgradeEmissionLvl: (ctx) => (_id) => {
const amount = helpers.number(ctx, "amount", _amount); const id = helpers.deviceID(ctx, "device", _id);
myrian.vulns += amount; const device = findDevice(id);
if (!device) return false;
if (!("emissionLvl" in device)) return false;
const cost = emissionCost(device.type, device.emissionLvl);
if (myrian.vulns < cost) return false;
myrian.vulns -= cost;
device.emissionLvl++;
return true;
},
getUpgradeMoveLvlCost: (ctx) => (_id) => {
const id = helpers.deviceID(ctx, "device", _id);
const device = findDevice(id);
if (!device) return -1;
if (!("moveLvl" in device)) return -1;
return moveLvlCost(device.type, device.moveLvl);
},
upgradeMoveLvl: (ctx) => (_id) => {
const id = helpers.deviceID(ctx, "device", _id);
const device = findDevice(id);
if (!device) return false;
if (!("moveLvl" in device)) return false;
const cost = moveLvlCost(device.type, device.moveLvl);
if (myrian.vulns < cost) return false;
myrian.vulns -= cost;
device.moveLvl++;
return true;
},
getUpgradeTransferLvlCost: (ctx) => (_id) => {
const id = helpers.deviceID(ctx, "device", _id);
const device = findDevice(id);
if (!device) return -1;
if (!("transferLvl" in device)) return -1;
return transferLvlCost(device.type, device.transferLvl);
},
upgradeTransferLvl: (ctx) => (_id) => {
const id = helpers.deviceID(ctx, "device", _id);
const device = findDevice(id);
if (!device) return false;
if (!("transferLvl" in device)) return false;
const cost = transferLvlCost(device.type, device.transferLvl);
if (myrian.vulns < cost) return false;
myrian.vulns -= cost;
device.transferLvl++;
return true;
},
getUpgradeReduceLvlCost: (ctx) => (_id) => {
const id = helpers.deviceID(ctx, "device", _id);
const device = findDevice(id);
if (!device) return -1;
if (!("reduceLvl" in device)) return -1;
return reduceLvlCost(device.type, device.reduceLvl);
},
upgradeReduceLvl: (ctx) => (_id) => {
const id = helpers.deviceID(ctx, "device", _id);
const device = findDevice(id);
if (!device) return false;
if (!("reduceLvl" in device)) return false;
const cost = reduceLvlCost(device.type, device.reduceLvl);
if (myrian.vulns < cost) return false;
myrian.vulns -= cost;
device.reduceLvl++;
return true;
},
getUpgradeInstallLvlCost: (ctx) => (_id) => {
const id = helpers.deviceID(ctx, "device", _id);
const device = findDevice(id);
if (!device) return -1;
if (!("installLvl" in device)) return -1;
return installLvlCost(device.type, device.installLvl);
},
upgradeInstallLvl: (ctx) => (_id) => {
const id = helpers.deviceID(ctx, "device", _id);
const device = findDevice(id);
if (!device) return false;
if (!("installLvl" in device)) return false;
const cost = installLvlCost(device.type, device.installLvl);
if (myrian.vulns < cost) return false;
myrian.vulns -= cost;
device.installLvl++;
return true;
}, },
}; };
} }

@ -5248,7 +5248,7 @@ export interface ContainerDevice extends BaseDevice {
export interface ISocket extends ContainerDevice { export interface ISocket extends ContainerDevice {
type: DeviceType.ISocket; type: DeviceType.ISocket;
emitting: Component; emitting: Component;
cooldown: number; emissionLvl: number;
cooldownUntil: number; cooldownUntil: number;
} }
@ -5396,6 +5396,86 @@ interface Myrian {
* @returns cost of upgrading the tier of a device, -1 on failure. * @returns cost of upgrading the tier of a device, -1 on failure.
*/ */
getUpgradeTierCost(device: DeviceID): number; getUpgradeTierCost(device: DeviceID): number;
/**
* Get the cost of upgrading the emission of a device
* @remarks
* RAM cost: 0 GB
* @returns cost of upgrading the emission of a device, -1 on failure.
*/
getUpgradeEmissionLvlCost(device: DeviceID): number;
/**
* Upgrade the emissionLvl of a device
* @remarks
* RAM cost: 0 GB
* @returns true if the upgrade succeeded, false otherwise.
*/
upgradeEmissionLvl(device: DeviceID): boolean;
/**
* Get the cost of upgrading the moveLvl of a device
* @remarks
* RAM cost: 0 GB
* @returns cost of upgrading the moveLvl of a device, -1 on failure.
*/
getUpgradeMoveLvlCost(device: DeviceID): number;
/**
* Upgrade the moveLvl of a device
* @remarks
* RAM cost: 0 GB
* @returns true if the upgrade succeeded, false otherwise.
*/
upgradeMoveLvl(device: DeviceID): boolean;
/**
* Get the cost of upgrading the transferLvl of a device
* @remarks
* RAM cost: 0 GB
* @returns cost of upgrading the transferLvl of a device, -1 on failure.
*/
getUpgradeTransferLvlCost(device: DeviceID): number;
/**
* Upgrade the moveLvl of a device
* @remarks
* RAM cost: 0 GB
* @returns true if the upgrade succeeded, false otherwise.
*/
upgradeTransferLvl(device: DeviceID): boolean;
/**
* Get the cost of upgrading the reduceLvl of a device
* @remarks
* RAM cost: 0 GB
* @returns cost of upgrading the reduceLvl of a device, -1 on failure.
*/
getUpgradeReduceLvlCost(device: DeviceID): number;
/**
* Upgrade the reduceLvl of a device
* @remarks
* RAM cost: 0 GB
* @returns true if the upgrade succeeded, false otherwise.
*/
upgradeReduceLvl(device: DeviceID): boolean;
/**
* Get the cost of upgrading the installLvl of a device
* @remarks
* RAM cost: 0 GB
* @returns cost of upgrading the installLvl of a device, -1 on failure.
*/
getUpgradeInstallLvlCost(device: DeviceID): number;
/**
* Upgrade the installLvl of a device
* @remarks
* RAM cost: 0 GB
* @returns true if the upgrade succeeded, false otherwise.
*/
upgradeInstallLvl(device: DeviceID): boolean;
} }
/** @public */ /** @public */