diff --git a/src/Corporation/Actions.ts b/src/Corporation/Actions.ts index 570de5d71..7358e25a8 100644 --- a/src/Corporation/Actions.ts +++ b/src/Corporation/Actions.ts @@ -15,7 +15,7 @@ import { EmployeePositions } from "./EmployeePositions"; import { ResearchMap } from "./ResearchMap"; import { isRelevantMaterial } from "./ui/Helpers"; import { checkEnum } from "../utils/helpers/checkEnum"; -import { CityName } from "src/Locations/data/CityNames"; +import { CityName } from "../Locations/data/CityNames"; export function NewIndustry(corporation: Corporation, industry: IndustryType, name: string): void { if (corporation.divisions.find(({ type }) => industry == type)) @@ -46,7 +46,7 @@ export function NewIndustry(corporation: Corporation, industry: IndustryType, na } } -export function NewCity(corporation: Corporation, division: Industry, city: string): void { +export function NewCity(corporation: Corporation, division: Industry, city: CityName): void { if (corporation.funds < CorporationConstants.OfficeInitialCost) { throw new Error("You don't have enough company funds to open a new office!"); } @@ -389,7 +389,7 @@ export function HireAdVert(corp: Corporation, division: Industry): void { export function MakeProduct( corp: Corporation, division: Industry, - city: string, + city: CityName, productName: string, designInvest: number, marketingInvest: number, diff --git a/src/Corporation/Industry.ts b/src/Corporation/Industry.ts index b27066d2f..4f0008dff 100644 --- a/src/Corporation/Industry.ts +++ b/src/Corporation/Industry.ts @@ -64,7 +64,7 @@ export class Industry { warehouses: Record; //Maps locations to offices. 0 if no office at that location - offices: { [key: string]: OfficeSpace | 0 } = { + offices: Record = { [CityName.Aevum]: 0, [CityName.Chongqing]: 0, [CityName.Sector12]: new OfficeSpace({ @@ -194,7 +194,7 @@ export class Industry { // Process offices (and the employees in them) let employeeSalary = 0; - for (const officeLoc of Object.keys(this.offices)) { + for (const officeLoc of Object.values(CityName)) { const office = this.offices[officeLoc]; if (office) employeeSalary += office.process(marketCycles, corporation, this); } diff --git a/src/Corporation/OfficeSpace.ts b/src/Corporation/OfficeSpace.ts index 36b0325c3..674c7c60b 100644 --- a/src/Corporation/OfficeSpace.ts +++ b/src/Corporation/OfficeSpace.ts @@ -121,7 +121,7 @@ export class OfficeSpace { if (corporation.funds < 0 && industry.lastCycleRevenue < 0) { perfMult = Math.pow(0.995, marketCycles); } else if (corporation.funds > 0 && industry.lastCycleRevenue > 0) { - perfMult = Math.pow(1.005, marketCycles); + perfMult = Math.pow(0.999, marketCycles); } if (this.autoCoffee) { diff --git a/src/Corporation/Product.ts b/src/Corporation/Product.ts index 63aed2156..092f5aaf2 100644 --- a/src/Corporation/Product.ts +++ b/src/Corporation/Product.ts @@ -7,13 +7,14 @@ import { createCityMap } from "../Locations/createCityMap"; import { Generic_fromJSON, Generic_toJSON, IReviverValue, Reviver } from "../utils/JSONReviver"; import { getRandomInt } from "../utils/helpers/getRandomInt"; +import { CityName } from "../Locations/data/CityNames"; interface IConstructorParams { name?: string; demand?: number; competition?: number; markup?: number; - createCity?: string; + createCity?: CityName; designCost?: number; advCost?: number; quality?: number; @@ -50,7 +51,7 @@ export class Product { // Variables for handling the creation process of this Product fin = false; // Whether this Product has finished being created prog = 0; // Creation progress - A number between 0-100 representing percentage - createCity = ""; // City in which the product is/was being created + createCity = CityName.Sector12; // City in which the product is/was being created designCost = 0; // How much money was invested into designing this Product advCost = 0; // How much money was invested into advertising this Product @@ -112,7 +113,7 @@ export class Product { this.dmd = params.demand ? params.demand : 0; this.cmp = params.competition ? params.competition : 0; this.mku = params.markup ? params.markup : 0; - this.createCity = params.createCity ? params.createCity : ""; + this.createCity = params.createCity ? params.createCity : CityName.Sector12; this.designCost = params.designCost ? params.designCost : 0; this.advCost = params.advCost ? params.advCost : 0; this.qlt = params.quality ? params.quality : 0; diff --git a/src/Corporation/ui/CityTabs.tsx b/src/Corporation/ui/CityTabs.tsx index 2981e5f9a..a94d018fd 100644 --- a/src/Corporation/ui/CityTabs.tsx +++ b/src/Corporation/ui/CityTabs.tsx @@ -18,17 +18,24 @@ export function CityTabs(props: IProps): React.ReactElement { const division = useDivision(); const [city, setCity] = useState(props.city); - const office = division.offices[city]; - if (office === 0) { - setCity(CityName.Sector12); - return <>; + let mainContent: JSX.Element; + if (city === "Expand") { + mainContent = ; + } else { + const office = division.offices[city]; + if (office === 0) { + setCity(CityName.Sector12); + return <>; + } + mainContent = ( + + ); } - - const canExpand = - Object.keys(division.offices).filter((cityName: string) => division.offices[cityName] === 0).length > 0; + const canExpand = Object.values(CityName).filter((cityName) => division.offices[cityName] === 0).length > 0; function handleChange(event: React.SyntheticEvent, tab: CityName | "Expand"): void { setCity(tab); } + return ( <> @@ -37,18 +44,7 @@ export function CityTabs(props: IProps): React.ReactElement { )} {canExpand && } - - {city !== "Expand" ? ( - - ) : ( - - )} + {mainContent} ); } diff --git a/src/Corporation/ui/MaterialElem.tsx b/src/Corporation/ui/MaterialElem.tsx index 67f250a7b..46783c5ec 100644 --- a/src/Corporation/ui/MaterialElem.tsx +++ b/src/Corporation/ui/MaterialElem.tsx @@ -21,10 +21,11 @@ import Paper from "@mui/material/Paper"; import Button from "@mui/material/Button"; import Box from "@mui/material/Box"; import { LimitMaterialProductionModal } from "./modals/LimitMaterialProductionModal"; +import { CityName } from "../../Locations/data/CityNames"; interface IMaterialProps { warehouse: Warehouse; - city: string; + city: CityName; mat: Material; rerender: () => void; } diff --git a/src/Corporation/ui/modals/MakeProductModal.tsx b/src/Corporation/ui/modals/MakeProductModal.tsx index 0bb46deca..dbdcc9987 100644 --- a/src/Corporation/ui/modals/MakeProductModal.tsx +++ b/src/Corporation/ui/modals/MakeProductModal.tsx @@ -11,6 +11,7 @@ import MenuItem from "@mui/material/MenuItem"; import Select, { SelectChangeEvent } from "@mui/material/Select"; import { KEY } from "../../../utils/helpers/keyCodes"; import { NumberInput } from "../../../ui/React/NumberInput"; +import { CityName } from "../../../Locations/data/CityNames"; interface IProps { open: boolean; @@ -32,8 +33,8 @@ function productPlaceholder(type: string): string { export function MakeProductModal(props: IProps): React.ReactElement { const corp = useCorporation(); const division = useDivision(); - const allCities = Object.keys(division.offices).filter((cityName) => division.offices[cityName] !== 0); - const [city, setCity] = useState(allCities.length > 0 ? allCities[0] : ""); + const allCities = Object.values(CityName).filter((cityName) => division.offices[cityName] !== 0); + const [city, setCity] = useState(allCities.length > 0 ? allCities[0] : CityName.Sector12); const [name, setName] = useState(""); const [design, setDesign] = useState(NaN); const [marketing, setMarketing] = useState(NaN); @@ -51,7 +52,7 @@ export function MakeProductModal(props: IProps): React.ReactElement { } function onCityChange(event: SelectChangeEvent): void { - setCity(event.target.value); + setCity(event.target.value as CityName); } function onProductNameChange(event: React.ChangeEvent): void { diff --git a/src/NetscriptFunctions/Corporation.ts b/src/NetscriptFunctions/Corporation.ts index 94a3b2bfd..3f689d10a 100644 --- a/src/NetscriptFunctions/Corporation.ts +++ b/src/NetscriptFunctions/Corporation.ts @@ -223,7 +223,7 @@ export function NetscriptCorporation(): InternalAPI { function getOffice(divisionName: string, cityName: string): OfficeSpace { const division = getDivision(divisionName); - if (!(cityName in division.offices)) throw new Error(`Invalid city name '${cityName}'`); + if (!checkEnum(CityName, cityName)) throw new Error(`Invalid city name '${cityName}'`); const office = division.offices[cityName]; if (office === 0) throw new Error(`${division.name} has not expanded to '${cityName}'`); return office;