diff --git a/src/Gang/Gang.ts b/src/Gang/Gang.ts index d0267b8d0..30b5adf15 100644 --- a/src/Gang/Gang.ts +++ b/src/Gang/Gang.ts @@ -24,6 +24,7 @@ import { GangMemberUpgrade } from "./GangMemberUpgrade"; import { GangConstants } from "./data/Constants"; import { CONSTANTS } from "../Constants"; import { GangMemberTasks } from "./GangMemberTasks"; +import { IAscensionResult } from "./IAscensionResult"; import { AllGangs } from "./AllGangs"; import { GangMember } from "./GangMember"; @@ -53,7 +54,7 @@ export class Gang { notifyMemberDeath: boolean; - constructor(facName: string = "", hacking: boolean = false) { + constructor(facName = "", hacking = false) { this.facName = facName; this.members = []; this.wanted = 1; @@ -87,7 +88,7 @@ export class Gang { return AllGangs[this.facName].territory; } - process(numCycles: number = 1, player: IPlayer): void { + process(numCycles = 1, player: IPlayer): void { const CyclesPerSecond = 1000 / CONSTANTS._idleSpeed; if (isNaN(numCycles)) { @@ -110,7 +111,7 @@ export class Gang { } - processGains(numCycles: number = 1, player: IPlayer): void { + processGains(numCycles = 1, player: IPlayer): void { // Get gains per cycle let moneyGains = 0, respectGains = 0, wantedLevelGains = 0; let justice = 0; @@ -170,7 +171,7 @@ export class Gang { } } - processTerritoryAndPowerGains(numCycles: number = 1): void { + processTerritoryAndPowerGains(numCycles = 1): void { this.storedTerritoryAndPowerCycles += numCycles; if (this.storedTerritoryAndPowerCycles < GangConstants.CyclesPerTerritoryAndPowerUpdate) { return; } this.storedTerritoryAndPowerCycles -= GangConstants.CyclesPerTerritoryAndPowerUpdate; @@ -268,14 +269,14 @@ export class Gang { } } - processExperienceGains(numCycles: number = 1): void { + processExperienceGains(numCycles = 1): void { for (let i = 0; i < this.members.length; ++i) { this.members[i].gainExperience(numCycles); this.members[i].updateSkillLevels(); } } - clash(won: boolean = false): void { + clash(won = false): void { // Determine if a gang member should die let baseDeathChance = 0.01; if (won) { baseDeathChance /= 2; } @@ -370,14 +371,8 @@ export class Gang { } - ascendMember(member: GangMember, workerScript: WorkerScript): void { + ascendMember(member: GangMember, workerScript?: WorkerScript): IAscensionResult { try { - - // res is an object with the following format: - // { - // respect: Amount of respect to deduct - // hack/str/def/dex/agi/cha: Ascension multipliers gained for each stat - // } const res = member.ascend(); this.respect = Math.max(1, this.respect - res.respect); if (workerScript == null) { @@ -399,9 +394,8 @@ export class Gang { } catch(e) { if (workerScript == null) { exceptionAlert(e); - } else { - throw e; // Re-throw, will be caught in the Netscript Function } + throw e; // Re-throw, will be caught in the Netscript Function } } diff --git a/src/Gang/GangMember.ts b/src/Gang/GangMember.ts index 78ebfde8c..8ec426953 100644 --- a/src/Gang/GangMember.ts +++ b/src/Gang/GangMember.ts @@ -2,12 +2,22 @@ import { GangMemberTask } from "./GangMemberTask"; import { GangMemberTasks } from "./GangMemberTasks"; import { GangMemberUpgrade } from "./GangMemberUpgrade"; import { GangMemberUpgrades } from "./GangMemberUpgrades"; +import { IAscensionResult } from "./IAscensionResult"; import { IPlayer } from "../PersonObjects/IPlayer"; import { GangConstants } from "./data/Constants"; import { AllGangs } from "./AllGangs"; import { IGang } from "./IGang"; import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviver"; +interface IMults { + hack: number; + str: number; + def: number; + dex: number; + agi: number; + cha: number; +} + export class GangMember { name: string; task = "Unassigned"; @@ -67,13 +77,12 @@ export class GangMember { } assignToTask(taskName: string): boolean { - if (GangMemberTasks.hasOwnProperty(taskName)) { - this.task = taskName; - return true; - } else { + if (!GangMemberTasks.hasOwnProperty(taskName)) { this.task = "Unassigned"; return false; } + this.task = taskName; + return true; } unassignFromTask(): void { @@ -151,25 +160,37 @@ export class GangMember { return 5 * task.baseMoney * statWeight * territoryMult * respectMult; } + expMult(): IMults { + return { + hack: (this.hack_mult-1)/10+1, + str: (this.str_mult-1)/10+1, + def: (this.def_mult-1)/10+1, + dex: (this.dex_mult-1)/10+1, + agi: (this.agi_mult-1)/10+1, + cha: (this.cha_mult-1)/10+1, + }; + } + gainExperience(numCycles = 1): void { const task = this.getTask(); if (task === GangMemberTasks["Unassigned"]) return; const difficultyMult = Math.pow(task.difficulty, 0.9); const difficultyPerCycles = difficultyMult * numCycles; const weightDivisor = 1500; - this.hack_exp += (task.hackWeight / weightDivisor) * difficultyPerCycles; - this.str_exp += (task.strWeight / weightDivisor) * difficultyPerCycles; - this.def_exp += (task.defWeight / weightDivisor) * difficultyPerCycles; - this.dex_exp += (task.dexWeight / weightDivisor) * difficultyPerCycles; - this.agi_exp += (task.agiWeight / weightDivisor) * difficultyPerCycles; - this.cha_exp += (task.chaWeight / weightDivisor) * difficultyPerCycles; + const expMult = this.expMult(); + this.hack_exp += (task.hackWeight / weightDivisor) * difficultyPerCycles * expMult.hack; + this.str_exp += (task.strWeight / weightDivisor) * difficultyPerCycles * expMult.str; + this.def_exp += (task.defWeight / weightDivisor) * difficultyPerCycles * expMult.def; + this.dex_exp += (task.dexWeight / weightDivisor) * difficultyPerCycles * expMult.dex; + this.agi_exp += (task.agiWeight / weightDivisor) * difficultyPerCycles * expMult.agi; + this.cha_exp += (task.chaWeight / weightDivisor) * difficultyPerCycles * expMult.cha; } recordEarnedRespect(numCycles = 1, gang: IGang): void { this.earnedRespect += (this.calculateRespectGain(gang) * numCycles); } - getAscensionResults(): any { + getAscensionResults(): IMults { //Calculate ascension bonus to stat multipliers. //This is based on the current number of multipliers from Non-Augmentation upgrades //+ Ascension Bonus = N% of current bonus from Augmentations @@ -201,7 +222,7 @@ export class GangMember { } } - getAscensionEfficiency(): any { + getAscensionEfficiency(): IMults { function formula(mult: number): number { return 1/(1+Math.log(mult)/Math.log(20)); } @@ -215,7 +236,7 @@ export class GangMember { }; } - ascend(): any { + ascend(): IAscensionResult { const res = this.getAscensionResults(); const hackAscMult = res.hack; const strAscMult = res.str; @@ -275,12 +296,6 @@ export class GangMember { } buyUpgrade(upg: GangMemberUpgrade, player: IPlayer, gang: IGang): boolean { - if (typeof upg === 'string') { - upg = GangMemberUpgrades[upg]; - } - if (!(upg instanceof GangMemberUpgrade)) { - return false; - } // Prevent purchasing of already-owned upgrades if (this.augmentations.includes(upg.name) || this.upgrades.includes(upg.name)) { return false; diff --git a/src/Gang/GangMemberTask.ts b/src/Gang/GangMemberTask.ts index a684a09cb..053fe0777 100644 --- a/src/Gang/GangMemberTask.ts +++ b/src/Gang/GangMemberTask.ts @@ -1,23 +1,4 @@ - -interface ITerritory { - money: number; - respect: number; - wanted: number; -} - -export interface ITaskParams { - baseRespect?: number; - baseWanted?: number; - baseMoney?: number; - hackWeight?: number; - strWeight?: number; - defWeight?: number; - dexWeight?: number; - agiWeight?: number; - chaWeight?: number; - difficulty?: number; - territory?: ITerritory; -} +import { ITaskParams, ITerritory } from "./ITaskParams"; export class GangMemberTask { name: string; diff --git a/src/Gang/Helpers.tsx b/src/Gang/Helpers.tsx index bf7de1029..0d7091a52 100644 --- a/src/Gang/Helpers.tsx +++ b/src/Gang/Helpers.tsx @@ -34,6 +34,7 @@ export function displayGangContent(engine: IEngine, gang: Gang, player: IPlayer) } export function clearGangUI(): void { + if(UIElems.gangContainer) UIElems.gangContainer.style.display = 'none'; if (UIElems.gangContainer instanceof Element) ReactDOM.unmountComponentAtNode(UIElems.gangContainer); UIElems.gangContainer = null; UIElems.gangContentCreated = false; diff --git a/src/Gang/IAscensionResult.ts b/src/Gang/IAscensionResult.ts new file mode 100644 index 000000000..f42f7c603 --- /dev/null +++ b/src/Gang/IAscensionResult.ts @@ -0,0 +1,9 @@ +export interface IAscensionResult { + respect: number; + hack: number; + str: number; + def: number; + dex: number; + agi: number; + cha: number; +}; \ No newline at end of file diff --git a/src/Gang/ITaskParams.ts b/src/Gang/ITaskParams.ts new file mode 100644 index 000000000..44178e42f --- /dev/null +++ b/src/Gang/ITaskParams.ts @@ -0,0 +1,20 @@ + +export interface ITerritory { + money: number; + respect: number; + wanted: number; +} + +export interface ITaskParams { + baseRespect?: number; + baseWanted?: number; + baseMoney?: number; + hackWeight?: number; + strWeight?: number; + defWeight?: number; + dexWeight?: number; + agiWeight?: number; + chaWeight?: number; + difficulty?: number; + territory?: ITerritory; +} \ No newline at end of file diff --git a/src/Gang/data/tasks.ts b/src/Gang/data/tasks.ts index 60c5a6662..c5d83e7c8 100644 --- a/src/Gang/data/tasks.ts +++ b/src/Gang/data/tasks.ts @@ -1,3 +1,4 @@ +import { ITaskParams } from "../ITaskParams"; /* tslint:disable:max-line-length */ /** @@ -29,7 +30,7 @@ export interface IGangMemberTaskMetadata { * An object containing weighting parameters for the task. These parameters are used for * various calculations (respect gain, wanted gain, etc.) */ - params?: any; + params: ITaskParams; } /** @@ -254,7 +255,7 @@ export const gangMemberTasksMetadata: IGangMemberTaskMetadata[] = [ name: "Train Combat", params: { strWeight: 25, defWeight: 25, dexWeight: 25, agiWeight: 25, - difficulty: 5, + difficulty: 200, }, }, { @@ -262,7 +263,7 @@ export const gangMemberTasksMetadata: IGangMemberTaskMetadata[] = [ isCombat: true, isHacking: true, name: "Train Hacking", - params: {hackWeight: 100, difficulty: 8}, + params: {hackWeight: 100, difficulty: 45}, }, { desc: "Assign this gang member to train their charisma", diff --git a/src/Gang/ui/GangMemberAccordionContent.tsx b/src/Gang/ui/GangMemberAccordionContent.tsx index 882a0149f..573f95738 100644 --- a/src/Gang/ui/GangMemberAccordionContent.tsx +++ b/src/Gang/ui/GangMemberAccordionContent.tsx @@ -1,20 +1,23 @@ -import * as React from "react"; +import React, { useState } from "react"; import { Panel1 } from "./Panel1"; import { Panel2 } from "./Panel2"; import { Panel3 } from "./Panel3"; +import { Gang } from "../Gang"; +import { GangMember } from "../GangMember"; interface IProps { - gang: any; - member: any; + gang: Gang; + member: GangMember; } export function GangMemberAccordionContent(props: IProps): React.ReactElement { + const setRerender = useState(false)[1]; return (<>
- + setRerender(old => !old)} gang={props.gang} member={props.member} />
diff --git a/src/Gang/ui/GangMemberList.tsx b/src/Gang/ui/GangMemberList.tsx index 44fffdfa8..3accc7163 100644 --- a/src/Gang/ui/GangMemberList.tsx +++ b/src/Gang/ui/GangMemberList.tsx @@ -4,21 +4,17 @@ import { GangMemberAccordionContent } from "./GangMemberAccordionContent" import { GangMemberUpgradePopup } from "./GangMemberUpgradePopup" import { createPopup } from "../../ui/React/createPopup"; import { IPlayer } from "../../PersonObjects/IPlayer"; +import { Gang } from "../Gang"; +import { GangMember } from "../GangMember"; interface IProps { - gang: any; + gang: Gang; player: IPlayer; } export function GangMemberList(props: IProps): React.ReactElement { - const setRerender = useState(false)[1]; const [filter, setFilter] = useState(""); - useEffect(() => { - const id = setInterval(() => setRerender(old => !old), 1000); - return () => clearInterval(id); - }, []); - function openUpgradePopup(): void { const popupId = `gang-upgrade-popup`; createPopup(popupId, GangMemberUpgradePopup, { @@ -32,15 +28,15 @@ export function GangMemberList(props: IProps): React.ReactElement { setFilter(event.target.value); } - function members(): any { - return props.gang.members.filter((member: any) => member.name.indexOf(filter) > -1 || member.task.indexOf(filter) > -1) + function members(): GangMember[] { + return props.gang.members.filter((member: GangMember) => member.name.indexOf(filter) > -1 || member.task.indexOf(filter) > -1) } return (<> Manage Equipment