2023-06-29 13:22:10 -04:00
|
|
|
import type { MoneySource } from "../utils/MoneySourceTracker";
|
|
|
|
|
2023-03-05 22:39:42 -05:00
|
|
|
import { Person } from "../PersonObjects/Person";
|
2022-10-09 18:42:14 -04:00
|
|
|
import { Player } from "@player";
|
2022-11-06 17:27:04 -05:00
|
|
|
import { Multipliers } from "../PersonObjects/Multipliers";
|
2022-07-07 17:28:23 -04:00
|
|
|
|
|
|
|
export interface WorkStats {
|
|
|
|
money: number;
|
2022-07-12 22:43:03 -04:00
|
|
|
reputation: number;
|
2022-07-07 17:28:23 -04:00
|
|
|
hackExp: number;
|
|
|
|
strExp: number;
|
|
|
|
defExp: number;
|
|
|
|
dexExp: number;
|
|
|
|
agiExp: number;
|
|
|
|
chaExp: number;
|
|
|
|
intExp: number;
|
|
|
|
}
|
|
|
|
|
2022-11-06 17:27:04 -05:00
|
|
|
export const newWorkStats = (params?: Partial<WorkStats>): WorkStats => {
|
2022-07-07 17:28:23 -04:00
|
|
|
return {
|
|
|
|
money: params?.money ?? 0,
|
2022-07-12 22:43:03 -04:00
|
|
|
reputation: params?.reputation ?? 0,
|
2022-07-07 17:28:23 -04:00
|
|
|
hackExp: params?.hackExp ?? 0,
|
|
|
|
strExp: params?.strExp ?? 0,
|
|
|
|
defExp: params?.defExp ?? 0,
|
|
|
|
dexExp: params?.dexExp ?? 0,
|
|
|
|
agiExp: params?.agiExp ?? 0,
|
|
|
|
chaExp: params?.chaExp ?? 0,
|
|
|
|
intExp: params?.intExp ?? 0,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2022-11-06 17:27:04 -05:00
|
|
|
/** Add two workStats objects */
|
2022-07-07 17:28:23 -04:00
|
|
|
export const sumWorkStats = (w0: WorkStats, w1: WorkStats): WorkStats => {
|
|
|
|
return {
|
|
|
|
money: w0.money + w1.money,
|
2022-07-12 22:43:03 -04:00
|
|
|
reputation: w0.reputation + w1.reputation,
|
2022-07-07 17:28:23 -04:00
|
|
|
hackExp: w0.hackExp + w1.hackExp,
|
|
|
|
strExp: w0.strExp + w1.strExp,
|
|
|
|
defExp: w0.defExp + w1.defExp,
|
|
|
|
dexExp: w0.dexExp + w1.dexExp,
|
|
|
|
agiExp: w0.agiExp + w1.agiExp,
|
|
|
|
chaExp: w0.chaExp + w1.chaExp,
|
|
|
|
intExp: w0.intExp + w1.intExp,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2022-11-06 17:27:04 -05:00
|
|
|
/** Scale all stats on a WorkStats object by a number. Money scaling optional but defaults to true. */
|
2022-07-27 20:37:32 -04:00
|
|
|
export const scaleWorkStats = (w: WorkStats, n: number, scaleMoney = true): WorkStats => {
|
|
|
|
const m = scaleMoney ? n : 1;
|
2022-07-07 17:28:23 -04:00
|
|
|
return {
|
2022-07-27 20:37:32 -04:00
|
|
|
money: w.money * m,
|
2022-07-12 22:43:03 -04:00
|
|
|
reputation: w.reputation * n,
|
2022-07-07 17:28:23 -04:00
|
|
|
hackExp: w.hackExp * n,
|
|
|
|
strExp: w.strExp * n,
|
|
|
|
defExp: w.defExp * n,
|
|
|
|
dexExp: w.dexExp * n,
|
|
|
|
agiExp: w.agiExp * n,
|
|
|
|
chaExp: w.chaExp * n,
|
|
|
|
intExp: w.intExp * n,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2023-06-29 13:22:10 -04:00
|
|
|
export const applyWorkStats = (
|
|
|
|
target: Person,
|
|
|
|
workStats: WorkStats,
|
|
|
|
cycles: number,
|
|
|
|
source: MoneySource,
|
|
|
|
): WorkStats => {
|
2022-07-27 20:37:32 -04:00
|
|
|
const expStats = applyWorkStatsExp(target, workStats, cycles);
|
2022-07-07 17:28:23 -04:00
|
|
|
const gains = {
|
|
|
|
money: workStats.money * cycles,
|
2022-07-12 22:43:03 -04:00
|
|
|
reputation: 0,
|
2022-07-27 20:37:32 -04:00
|
|
|
hackExp: expStats.hackExp,
|
|
|
|
strExp: expStats.strExp,
|
|
|
|
defExp: expStats.defExp,
|
|
|
|
dexExp: expStats.dexExp,
|
|
|
|
agiExp: expStats.agiExp,
|
|
|
|
chaExp: expStats.chaExp,
|
|
|
|
intExp: expStats.intExp,
|
|
|
|
};
|
2022-09-06 09:07:12 -04:00
|
|
|
Player.gainMoney(gains.money, source);
|
2022-07-27 20:37:32 -04:00
|
|
|
|
|
|
|
return gains;
|
|
|
|
};
|
|
|
|
|
2022-11-10 21:56:46 -05:00
|
|
|
export const applyWorkStatsExp = (target: Person, workStats: WorkStats, mult = 1): WorkStats => {
|
|
|
|
const gains = scaleWorkStats(workStats, mult, false);
|
|
|
|
gains.money = 0;
|
|
|
|
gains.reputation = 0;
|
2022-07-27 20:37:32 -04:00
|
|
|
target.gainHackingExp(gains.hackExp);
|
|
|
|
target.gainStrengthExp(gains.strExp);
|
|
|
|
target.gainDefenseExp(gains.defExp);
|
|
|
|
target.gainDexterityExp(gains.dexExp);
|
|
|
|
target.gainAgilityExp(gains.agiExp);
|
|
|
|
target.gainCharismaExp(gains.chaExp);
|
|
|
|
target.gainIntelligenceExp(gains.intExp);
|
2022-07-07 17:28:23 -04:00
|
|
|
return gains;
|
|
|
|
};
|
2022-11-06 17:27:04 -05:00
|
|
|
|
|
|
|
/** Calculate the application of a person's multipliers to a WorkStats object */
|
|
|
|
export function multWorkStats(workStats: Partial<WorkStats>, mults: Multipliers, moneyMult = 1, repMult = 1) {
|
|
|
|
return {
|
|
|
|
money: (workStats.money ?? 0) * moneyMult,
|
|
|
|
reputation: (workStats.reputation ?? 0) * repMult,
|
|
|
|
hackExp: (workStats.hackExp ?? 0) * mults.hacking_exp,
|
|
|
|
strExp: (workStats.strExp ?? 0) * mults.strength_exp,
|
|
|
|
defExp: (workStats.defExp ?? 0) * mults.defense_exp,
|
|
|
|
dexExp: (workStats.dexExp ?? 0) * mults.dexterity_exp,
|
|
|
|
agiExp: (workStats.agiExp ?? 0) * mults.agility_exp,
|
|
|
|
chaExp: (workStats.chaExp ?? 0) * mults.charisma_exp,
|
|
|
|
intExp: workStats.intExp ?? 0,
|
|
|
|
};
|
|
|
|
}
|