Began creating 'parent' components for the City and Location-specific parts of the UI

This commit is contained in:
danielyxie 2019-03-29 00:12:41 -07:00
parent 75bc34208c
commit 7172f4e527
16 changed files with 551 additions and 344 deletions

@ -1,8 +1,11 @@
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviver";
import { CompanyPosition } from "./CompanyPosition";
import * as posNames from "./data/companypositionnames";
import { CONSTANTS } from "../Constants";
import { IMap } from "../types";
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviver";
export interface IConstructorParams {
name: string;
info: string;
@ -93,6 +96,43 @@ export class Company {
}
}
hasAgentPositions(): boolean {
return (this.companyPositions[posNames.AgentCompanyPositions[0]] != null);
}
hasBusinessConsultantPositions(): boolean {
return (this.companyPositions[posNames.BusinessConsultantCompanyPositions[0]] != null);
}
hasBusinessPositions(): boolean {
return (this.companyPositions[posNames.BusinessCompanyPositions[0]] != null);
}
hasEmployeePositions(): boolean {
return (this.companyPositions[posNames.MiscCompanyPositions[1]] != null);
}
hasITPositions(): boolean {
return (this.companyPositions[posNames.ITCompanyPositions[0]] != null);
}
hasSecurityPositions(): boolean {
return (this.companyPositions[posNames.SecurityCompanyPositions[2]] != null);
}
hasSoftwareConsultantPositions(): boolean {
return (this.companyPositions[posNames.SoftwareConsultantCompanyPositions[0]] != null);
}
hasSoftwarePositions(): boolean {
return (this.companyPositions[posNames.SoftwareCompanyPositions[0]] != null);
}
hasWaiterPositions(): boolean {
return (this.companyPositions[posNames.MiscCompanyPositions[0]] != null);
}
gainFavor(): void {
if (this.favor == null) { this.favor = 0; }
if (this.rolloverRep == null) { this.rolloverRep = 0; }

@ -2,6 +2,7 @@
* Map of all Cities in the game
* Key = City Name, Value = City object
*/
export interface IMetadata = {
name: string;
}
import { City } from "./City";
import { IMap } from "../types";
export const Cities: IMap<City> = {};

@ -1,22 +1,26 @@
/**
* Class representing a City in the game
*/
import { Location } from "./Location";
import { CityName } from "./data/CityNames";
import { LocationName } from "./data/LocationNames";
export class City {
/**
* List of all locations in this city
*/
locations: Location[];
locations: LocationName[];
/**
* Name of this city
*/
name: CityName;
constructor(name: CityName, locations: Location[]) {
constructor(name: CityName, locations: LocationName[]=[]) {
this.name = name;
this.locations = locations;
}
addLocation(loc: LocationName): void {
this.locations.push(loc);
}
}

@ -10,29 +10,44 @@ export interface IConstructorParams {
name?: LocationName;
types?: LocationType[];
techVendorMaxRam?: number;
techVendorMinRam?: number;
}
export class Location {
// Name of city this location is in
// If this property is null, it means this is a generic Location that
// is available in all cities
/**
* Name of city this location is in. If this property is null, it means this i
* is a generic location that is available in all cities
*/
city: CityName | null = null;
// Identifier for location
/**
* Identifier for location
*/
name: LocationName = LocationName.Void;
// List of what type(s) this location is
// A location can be multiple types (e.g. company and tech vendor)
/**
* List of what type(s) this location is. A location can be multiple types
* (e.g. company and tech vendor)
*/
types: LocationType[] = [];
// Tech vendors allow you to purchase servers.
// This property defines the max RAM server you can purchase from this vendor
/**
* Tech vendors allow you to purchase servers.
* This property defines the max RAM server you can purchase from this vendor
*/
techVendorMaxRam: number = 0;
/**
* Tech vendors allow you to purchase servers.
* This property defines the max RAM server you can purchase from this vendor
*/
techVendorMinRam: number = 0;
constructor(p: IConstructorParams) {
if (p.city) { this.city = p.city; }
if (p.name) { this.name = p.name; }
if (p.types) { this.types = p.types; }
if (p.techVendorMaxRam) { this.techVendorMaxRam = p.techVendorMaxRam; }
if (p.techVendorMinRam) { this.techVendorMinRam = p.techVendorMinRam; }
}
}

@ -2,11 +2,11 @@
* Enum defining the different types of possible locations
*/
export enum LocationType {
CityHall,
Company,
Gym,
Hospital,
Slums,
Special, // This location has special options/activities (e.g. Bladeburner, Re-sleeving)
StockMarket,
TechVendor,
TravelAgency,

@ -2,15 +2,23 @@
* Map of all Locations in the game
* Key = Location name, value = Location object
*/
import { City } from "./City";
import { Cities } from "./Cities";
import { Location,
IConstructorParams } from "./Location";
import { CityName } from "./data/CityNames";
import { LocationsMetadata } from "./data/LocationsMetadata";
import { IMap } from "../types";
export const Locations: IMap<Location> = {};
function constructLocation(p: IConstructorParams) {
/**
* Here, we'll initialize both Locations and Cities data. These can both
* be initialized from the `LocationsMetadata`
*/
function constructLocation(p: IConstructorParams): Location {
if (!p.name) {
throw new Error(`Invalid constructor parameters for Location. No 'name' property`);
}
@ -20,8 +28,29 @@ function constructLocation(p: IConstructorParams) {
}
Locations[p.name] = new Location(p);
return Locations[p.name];
}
for (const metadata of LocationsMetadata {
constructLocation(metadata);
// First construct all cities
Cities[CityName.Aevum] = new City(CityName.Aevum);
Cities[CityName.Chongqing] = new City(CityName.Chongqing);
Cities[CityName.Ishima] = new City(CityName.Ishima);
Cities[CityName.NewTokyo] = new City(CityName.NewTokyo);
Cities[CityName.Sector12] = new City(CityName.Sector12);
Cities[CityName.Volhaven] = new City(CityName.Volhaven);
// Then construct all locations, and add them to the cities as we go.
for (const metadata of LocationsMetadata) {
const loc = constructLocation(metadata);
const cityName = loc.city;
if (cityName === null) {
// Generic location, add to all cities
for (const city in Cities) {
Cities[city].addLocation(loc.name);
}
} else {
Cities[cityName].addLocation(loc.name);
}
}

@ -0,0 +1 @@
import { Player } from "../Player";

@ -5,312 +5,278 @@
import { CityName } from "./CityNames";
import { LocationName } from "./LocationNames";
import { IConstructorParams } from "../Location";
import { LocationType } from "../LocationTypeEnum";
export const LocationsMetadata: IConstructorParams[] = [
{
city: CityName.Aevum,
name: LocationName.AevumAeroCorp,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Aevum,
name: LocationName.AevumBachmanAndAssociates,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Aevum,
name: LocationName.AevumClarkeIncorporated,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Aevum,
name: LocationName.AevumCrushFitnessGym,
types:
techVendorMaxRam:
types: [LocationType.Gym],
},
{
city: CityName.Aevum,
name: LocationName.AevumECorp,
types:
techVendorMaxRam:
types: [LocationType.Company, LocationType.TechVendor],
techVendorMaxRam: 512,
techVendorMinRam: 128,
},
{
city: CityName.Aevum,
name: LocationName.AevumFulcrumTechnologies,
types:
techVendorMaxRam:
types: [LocationType.Company, LocationType.TechVendor],
techVendorMaxRam: 1024,
techVendorMinRam: 256,
},
{
city: CityName.Aevum,
name: LocationName.AevumGalacticCybersystems,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Aevum,
name: LocationName.AevumNetLinkTechnologies
types:
techVendorMaxRam:
name: LocationName.AevumNetLinkTechnologies,
types: [LocationType.Company, LocationType.TechVendor],
techVendorMaxRam: 64,
techVendorMinRam: 8,
},
{
city: CityName.Aevum,
name: LocationName.AevumPolice,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Aevum,
name: LocationName.AevumRhoConstruction,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Aevum,
name: LocationName.AevumSnapFitnessGym,
types:
techVendorMaxRam:
types: [LocationType.Gym],
},
{
city: CityName.Aevum,
name: LocationName.AevumSummitUniversity,
types:
techVendorMaxRam:
types: [LocationType.University],
},
{
city: CityName.Aevum,
name: LocationName.AevumWatchdogSecurity,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Chongqing,
name: LocationName.ChongqingKuaiGongInternational,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Chongqing,
name: LocationName.ChongqingSolarisSpaceSystems,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Ishima,
name: LocationName.IshimaNovaMedical,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Ishima,
name: LocationName.IshimaOmegaSoftware,
types:
techVendorMaxRam:
types: [LocationType.Company, LocationType.TechVendor],
techVendorMaxRam: 128,
techVendorMinRam: 4,
},
{
city: CityName.Ishima,
name: LocationName.IshimaStormTechnologies,
types:
techVendorMaxRam:
types: [LocationType.Company, LocationType.TechVendor],
techVendorMaxRam: 512,
techVendorMinRam: 32,
},
{
city: CityName.NewTokyo,
name: LocationName.NewTokyoDefComm,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.NewTokyo,
name: LocationName.NewTokyoGlobalPharmaceuticals,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.NewTokyo,
name: LocationName.NewTokyoNoodleBar,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.NewTokyo,
name: LocationName.NewTokyoVitaLife,
types:
techVendorMaxRam:
types: [LocationType.Company, LocationType.Special],
},
{
city: CityName.Sector12,
name: LocationName.Sector12AlphaEnterprises,
types:
techVendorMaxRam:
types: [LocationType.Company, LocationType.TechVendor],
techVendorMaxRam: 8,
techVendorMinRam: 2,
},
{
city: CityName.Sector12,
name: LocationName.Sector12BladeIndustries,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Sector12,
name: LocationName.Sector12CIA,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Sector12,
name: LocationName.Sector12CarmichaelSecurity,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Sector12,
name: LocationName.Sector12CityHall,
types:
techVendorMaxRam:
types: [LocationType.Special],
},
{
city: CityName.Sector12,
name: LocationName.Sector12DeltaOne,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Sector12,
name: LocationName.Sector12FoodNStuff,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Sector12,
name: LocationName.Sector12FourSigma,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Sector12,
name: LocationName.Sector12IcarusMicrosystems,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Sector12,
name: LocationName.Sector12IronGym,
types:
techVendorMaxRam:
types: [LocationType.Gym],
},
{
city: CityName.Sector12,
name: LocationName.Sector12JoesGuns,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Sector12,
name: LocationName.Sector12MegaCorp,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Sector12,
name: LocationName.Sector12NSA,
types:
techVendorMaxRam:
types: [LocationType.Company, LocationType.Special],
},
{
city: CityName.Sector12,
name: LocationName.Sector12PowerhouseGym,
types:
techVendorMaxRam:
types: [LocationType.Gym],
},
{
city: CityName.Sector12,
name: LocationName.Sector12RothmanUniversity,
types:
techVendorMaxRam:
types: [LocationType.University],
},
{
city: CityName.Sector12,
name: LocationName.Sector12UniversalEnergy,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Volhaven,
name: LocationName.VolhavenCompuTek,
types:
techVendorMaxRam:
types: [LocationType.Company, LocationType.TechVendor],
techVendorMaxRam: 256,
techVendorMinRam: 8,
},
{
city: CityName.Volhaven,
name: LocationName.VolhavenHeliosLabs,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Volhaven,
name: LocationName.VolhavenLexoCorp,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Volhaven,
name: LocationName.VolhavenMilleniumFitnessGym,
types:
techVendorMaxRam:
types: [LocationType.Gym],
},
{
city: CityName.Volhaven,
name: LocationName.VolhavenNWO,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Volhaven,
name: LocationName.VolhavenOmniTekIncorporated,
types:
techVendorMaxRam:
types: [LocationType.Company, LocationType.TechVendor],
techVendorMaxRam: 1024,
techVendorMinRam: 128,
},
{
city: CityName.Volhaven,
name: LocationName.VolhavenOmniaCybersystems,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Volhaven,
name: LocationName.VolhavenSysCoreSecurities,
types:
techVendorMaxRam:
types: [LocationType.Company],
},
{
city: CityName.Volhaven,
name: LocationName.VolhavenZBInstituteOfTechnology,
types:
techVendorMaxRam:
types: [LocationType.University],
},
{
city: null,
name: LocationName.Hospital,
types:
techVendorMaxRam:
types: [LocationType.Hospital],
},
{
city: null,
name: LocationName.Slums,
types:
techVendorMaxRam:
types: [LocationType.Slums],
},
{
city: null,
name: LocationName.TravelAgency,
types:
techVendorMaxRam:
types: [LocationType.TravelAgency],
},
{
city: null,
name: LocationName.WorldStockExchange,
types:
techVendorMaxRam:
types: [LocationType.StockMarket],
},
];

34
src/Locations/ui/City.tsx Normal file

@ -0,0 +1,34 @@
/**
* React Component for displaying a City's UI.
* This UI shows all of the available locations in the city, and lets the player
* visit those locations
*/
import * as React from "react";
import { City } from "../City";
import { LocationName } from "../data/LocationNames";
import { StdButton } from "../../ui/React/StdButton";
type IProps = {
city: City;
enterLocation: (to: LocationName) => void;
}
export class LocationCity extends React.Component<IProps, any> {
render() {
const locationButtons = this.props.city.locations.map((locName) => {
return (
<li>
<StdButton onClick={this.props.enterLocation.bind(this, locName)} text={locName} key={locName} />
</li>
)
});
return (
<ul>
{locationButtons}
</ul>
)
}
}

@ -0,0 +1,112 @@
/**
* React Component for displaying a location's UI, when that location is a company
*/
import * as React from "react";
import { LocationName } from "../data/LocationNames";
import { Companies } from "../../Company/Companies";
import { Company } from "../../Company/Company";
import { IPlayer } from "../../PersonObjects/IPlayer";
import { StdButton } from "../../ui/React/StdButton";
type IProps = {
locName: LocationName;
p: IPlayer;
}
export class CompanyLocation extends React.Component<IProps, any> {
/**
* We'll keep a reference to the Company that this component is being rendered for,
* so we don't have to look it up every time
*/
company: Company;
constructor(props: IProps) {
super(props);
this.applyForAgentJob = this.applyForAgentJob.bind(this);
this.applyForBusinessConsultantJob = this.applyForBusinessConsultantJob.bind(this);
this.applyForBusinessJob = this.applyForBusinessJob.bind(this);
this.applyForEmployeeJob = this.applyForEmployeeJob.bind(this);
this.applyForItJob = this.applyForItJob.bind(this);
this.applyForPartTimeEmployeeJob = this.applyForPartTimeEmployeeJob.bind(this);
this.applyForPartTimeWaiterJob = this.applyForPartTimeWaiterJob.bind(this);
this.applyForSecurityJob = this.applyForSecurityJob.bind(this);
this.applyForSoftwareConsultantJob = this.applyForSoftwareConsultantJob.bind(this);
this.applyForSoftwareJob = this.applyForSoftwareJob.bind(this);
this.applyForWaiterJob = this.applyForWaiterJob.bind(this);
this.company = Companies[props.locName];
if (this.company == null) {
throw new Error(`CompanyLocation component constructed with invalid company: ${props.locName}`);
}
}
applyForAgentJob(e: React.MouseEvent<HTMLElement>) {
if (!e.isTrusted) { return false; }
this.props.p.applyForAgentJob();
}
applyForBusinessConsultantJob(e: React.MouseEvent<HTMLElement>) {
if (!e.isTrusted) { return false; }
this.props.p.applyForBusinessConsultantJob();
}
applyForBusinessJob(e: React.MouseEvent<HTMLElement>) {
if (!e.isTrusted) { return false; }
this.props.p.applyForBusinessJob();
}
applyForEmployeeJob(e: React.MouseEvent<HTMLElement>) {
if (!e.isTrusted) { return false; }
this.props.p.applyForEmployeeJob();
}
applyForItJob(e: React.MouseEvent<HTMLElement>) {
if (!e.isTrusted) { return false; }
this.props.p.applyForItJob();
}
applyForPartTimeEmployeeJob(e: React.MouseEvent<HTMLElement>) {
if (!e.isTrusted) { return false; }
this.props.p.applyForPartTimeEmployeeJob();
}
applyForPartTimeWaiterJob(e: React.MouseEvent<HTMLElement>) {
if (!e.isTrusted) { return false; }
this.props.p.applyForPartTimeWaiterJob();
}
applyForSecurityJob(e: React.MouseEvent<HTMLElement>) {
if (!e.isTrusted) { return false; }
this.props.p.applyForSecurityJob();
}
applyForSoftwareConsultantJob(e: React.MouseEvent<HTMLElement>) {
if (!e.isTrusted) { return false; }
this.props.p.applyForSoftwareConsultantJob();
}
applyForSoftwareJob(e: React.MouseEvent<HTMLElement>) {
if (!e.isTrusted) { return false; }
this.props.p.applyForSoftwareJob();
}
applyForWaiterJob(e: React.MouseEvent<HTMLElement>) {
if (!e.isTrusted) { return false; }
this.props.p.applyForWaiterJob();
}
render() {
return (
<div>
{
this.company.hasAgentPositions() &&
<StdButton onClick={this.applyForAgentJob} text={""}
}
</div>
)
}
}

@ -0,0 +1,95 @@
/**
* React Component for displaying a location's UI
*
* This is a "router" component of sorts, meaning it deduces the type of
* location that is being rendered and then creates the proper component(s) for that.
*/
import * as React from "react";
import { Location } from "../Location";
import { Locations } from "../Locations";
import { LocationType } from "../LocationTypeEnum";
import { LocationName } from "../data/LocationNames";
import { IPlayer } from "../../PersonObjects/IPlayer";
import { StdButton } from "../../ui/React/StdButton";
type IProps = {
locName: LocationName;
p: IPlayer;
returnToCity: () => void;
}
export class GenericLocation extends React.Component<IProps, any> {
/**
* Reference to the Location object that is being rendered
*/
loc: Location;
constructor(props: IProps) {
super(props);
this.loc = Locations[props.locName];
if (this.loc == null) {
throw new Error(`Invalid Location being rendered: ${props.locName}`);
}
}
/**
* Determine what needs to be rendered for this location based on the locations
* type. Returns an array of React components that should be rendered
*/
getLocationSpecificContent(): React.ReactNode[] {
const content: React.ReactNode[] = [];
if (this.loc.types.includes(LocationType.Company)) {
}
if (this.loc.types.includes(LocationType.Gym)) {
}
if (this.loc.types.includes(LocationType.Hospital)) {
}
if (this.loc.types.includes(LocationType.Slums)) {
}
if (this.loc.types.includes(LocationType.Special)) {
}
if (this.loc.types.includes(LocationType.StockMarket)) {
}
if (this.loc.types.includes(LocationType.TechVendor)) {
}
if (this.loc.types.includes(LocationType.TravelAgency)) {
}
if (this.loc.types.includes(LocationType.University)) {
}
}
render() {
const locContent: React.ReactNode[] = this.getLocationSpecificContent();
return (
<div>
<StdButton onClick={this.props.returnToCity} text={"Return to world"} />
<br />
<h1>this.loc.name</h1>
{locContent}
</div>
)
}
}

91
src/Locations/ui/Root.tsx Normal file

@ -0,0 +1,91 @@
/**
* Root React Component for displaying overall Location UI
*/
import * as React from "react";
import { LocationCity } from "./City";
import { CityName } from "../data/CityNames";
import { LocationName } from "../data/LocationNames";
import { IPlayer } from "../../PersonObjects/IPlayer";
type IProps = {
p: IPlayer;
}
type IState = {
city: CityName;
inCity: boolean;
location: LocationName;
}
export class LocationRoot extends React.Component<IProps, IState> {
constructor(props: IProps) {
super(props);
this.state = {
city: props.p.city,
inCity: true,
location: props.p.location,
}
this.changeCity = this.changeCity.bind(this);
this.returnToCity = this.returnToCity.bind(this);
}
changeCity(to: CityName): void {
if (this.props.p.travel(to)) {
this.setState({
city: to
});
}
}
enterLocation(to: LocationName): void {
this.props.p.location = to;
this.setState({
inCity: false,
location: to,
});
}
/**
* Click listener for a button that lets the player go from a specific location
* back to the city
*/
returnToCity(): void {
this.setState({
inCity: true,
});
}
/**
* Render UI for a city
*/
renderCity(): React.ReactNode {
return (
<div>
<h2>{this.state.city}</h2>
<LocationCity city={this.state.city} enterLocation={this.enterLocation} />
</div>
)
}
/**
* Render UI for a specific location
*/
renderLocation(): React.ReactNode {
return (
<GenericLocation />
)
}
render() {
if (this.state.inCity) {
return this.renderCity();
} else {
return this.renderLocation();
}
}
}

@ -9,6 +9,10 @@ import { Sleeve } from "./Sleeve/Sleeve";
import { IMap } from "../types";
import { IPlayerOwnedAugmentation } from "../Augmentation/PlayerOwnedAugmentation";
import { Company } from "../Company/Company";
import { CompanyPosition } from "../Company/CompanyPosition";
import { CityName } from "../Locations/data/CityNames";
import { LocationName } from "../Locations/data/LocationNames";
import { IPlayerOwnedSourceFile } from "../SourceFile/PlayerOwnedSourceFile";
import { MoneySourceTracker } from "../utils/MoneySourceTracker";
@ -17,7 +21,7 @@ export interface IPlayer {
augmentations: IPlayerOwnedAugmentation[];
bladeburner: any;
bitNodeN: number;
city: string;
city: CityName;
companyName: string;
corporation: any;
currentServer: string;
@ -26,6 +30,7 @@ export interface IPlayer {
hasWseAccount: boolean;
jobs: IMap<string>;
karma: number;
location: LocationName;
money: any;
moneySourceA: MoneySourceTracker;
moneySourceB: MoneySourceTracker;
@ -85,6 +90,20 @@ export interface IPlayer {
crime_money_mult: number;
// Methods
applyForAgentJob(sing?: boolean): boolean | void;
applyForBusinessConsultantJob(sing?: boolean): boolean | void;
applyForBusinessJob(sing?: boolean): boolean | void;
applyForEmployeeJob(sing?: boolean): boolean | void;
applyForItJob(sing?: boolean): boolean | void;
applyForJob(entryPosType: CompanyPosition, sing?: boolean): boolean | void;
applyForNetworkEngineerJob(sing?: boolean): boolean | void;
applyForPartTimeEmployeeJob(sing?: boolean): boolean | void;
applyForPartTimeWaiterJob(sing?: boolean): boolean | void;
applyForSecurityEngineerJob(sing?: boolean): boolean | void;
applyForSecurityJob(sing?: boolean): boolean | void;
applyForSoftwareConsultantJob(sing?: boolean): boolean | void;
applyForSoftwareJob(sing?: boolean): boolean | void;
applyForWaiterJob(sing?: boolean): boolean | void;
canAfford(cost: number): boolean;
gainHackingExp(exp: number): void;
gainStrengthExp(exp: number): void;
@ -93,9 +112,11 @@ export interface IPlayer {
gainAgilityExp(exp: number): void;
gainCharismaExp(exp: number): void;
gainMoney(money: number): void;
getNextCompanyPosition(company: Company, entryPosType: CompanyPosition): CompanyPosition;
hasCorporation(): boolean;
inBladeburner(): boolean;
inGang(): boolean;
isQualified(company: Company, position: CompanyPosition): boolean;
loseMoney(money: number): void;
reapplyAllAugmentations(resetMultipliers: boolean): void;
reapplyAllSourceFiles(): void;
@ -110,4 +131,5 @@ export interface IPlayer {
money: number,
time: number,
singParams: any): void;
travel(to: CityName): boolean;
}

@ -0,0 +1,12 @@
import { PlayerObject } from "../../Player";
import { Cities } from "../../Locations/Cities";
PlayerObject.prototype.travel = function(to) {
if (Cities[to] == null) {
console.warn(`Player.travel() called with invalid city: ${to}`);
return false;
}
this.city = to;
return true;
}

@ -236,222 +236,7 @@ if (htmlWebpackPlugin.options.googleAnalytics.trackingId) { %>
<!-- World -->
<div id="world-container" class="generic-menupage-container">
<h2 id="world-city-name"> </h2>
<p id="world-city-desc"> </p>
<ul id="aevum-locations-list">
<li id="aevum-travelagency-li">
<a id="aevum-travelagency" class="a-link-button"> Travel Agency </a>
</li>
<li id="aevum-hospital-li">
<a id="aevum-hospital" class="a-link-button">Hospital</a>
</li>
<li id="aevum-summituniversity-li">
<a id="aevum-summituniversity" class="a-link-button"> Summit University </a>
</li>
<li id="aevum-ecorp-li">
<a id="aevum-ecorp" class="a-link-button"> ECorp </a>
</li>
<li id="aevum-bachmanandassociates-li">
<a id="aevum-bachmanandassociates" class="a-link-button"> Bachman & Associates</a>
</li>
<li id="aevum-clarkeincorporated-li">
<a id="aevum-clarkeincorporated" class="a-link-button"> Clarke Incorporated </a>
</li>
<li id="aevum-fulcrumtechnologies-li">
<a id="aevum-fulcrumtechnologies" class="a-link-button"> Fulcrum Technologies </a>
</li>
<li id="aevum-aerocorp-li">
<a id="aevum-aerocorp" class="a-link-button"> AeroCorp </a>
</li>
<li id="aevum-galacticcybersystems-li">
<a id="aevum-galacticcybersystems" class="a-link-button"> Galactic Cybersystems </a>
</li>
<li id="aevum-watchdogsecurity-li">
<a id="aevum-watchdogsecurity" class="a-link-button">Watchdog Security </a>
</li>
<li id="aevum-rhoconstruction-li">
<a id="aevum-rhoconstruction" class="a-link-button">Rho Construction </a>
</li>
<li id="aevum-aevumpolice-li">
<a id="aevum-aevumpolice" class="a-link-button">Aevum Police</a>
</li>
<li id="aevum-netlinktechnologies-li">
<a id="aevum-netlinktechnologies" class="a-link-button">NetLink Technologies</a>
</li>
<li id="aevum-crushfitnessgym-li">
<a id="aevum-crushfitnessgym" class="a-link-button">Crush Fitness Gym </a>
</li>
<li id="aevum-snapfitnessgym-li">
<a id="aevum-snapfitnessgym" class="a-link-button">Snap Fitness Gym</a>
</li>
<li id="aevum-slums-li">
<a id="aevum-slums" class="a-link-button">The Slums</a>
</li>
</ul>
<ul id="chongqing-locations-list">
<li id="chongqing-travelagency-li">
<a id="chongqing-travelagency" class="a-link-button"> Travel Agency </a>
</li>
<li id="chongqing-hospital-li">
<a id="chongqing-hospital" class="a-link-button">Hospital</a>
</li>
<li id="chonqging-kuaigonginternational-li">
<a id="chongqing-kuaigonginternational" class="a-link-button">KuaiGong International </a>
</li>
<li id="chongqing-solarisspacesystems-li">
<a id="chongqing-solarisspacesystems" class="a-link-button">Solaris Space Systems</a>
</li>
<li id="chongqing-slums-li">
<a id="chongqing-slums" class="a-link-button">The Slums</a>
</li>
</ul>
<ul id="sector12-locations-list">
<li id="sector12-travelagency-li">
<a id="sector12-travelagency" class="a-link-button">Travel Agency </a>
</li>
<li id="sector12-hospital-li">
<a id="sector12-hospital" class="a-link-button">Hospital</a>
</li>
<li id="sector12-rothmanuniversity-li">
<a id="sector12-rothmanuniversity" class="a-link-button"> Rothman University</a>
</li>
<li id="sector12-megacorp-li">
<a id="sector12-megacorp" class="a-link-button">MegaCorp</a>
</li>
<li id="sector12-bladeindustries-li">
<a id="sector12-bladeindustries" class="a-link-button"> Blade Industries</a>
</li>
<li id="sector12-foursigma-li">
<a id="sector12-foursigma" class="a-link-button">Four Sigma</a>
</li>
<li id="sector12-icarusmicrosystems-li">
<a id="sector12-icarusmicrosystems" class="a-link-button"> Icarus Microsystems</a>
</li>
<li id="sector12-universalenergy-li">
<a id="sector12-universalenergy" class="a-link-button">Universal Energy </a>
</li>
<li id="sector12-deltaone-li">
<a id="sector12-deltaone" class="a-link-button">DeltaOne </a>
</li>
<li id="sector12-cia-li">
<a id="sector12-cia" class="a-link-button">Central Intelligence Agency </a>
</li>
<li id="sector12-nsa-li">
<a id="sector12-nsa" class="a-link-button">National Security Agency </a>
</li>
<li id="sector12-alphaenterprises-li">
<a id="sector12-alphaenterprises" class="a-link-button">Alpha Enterprises</a>
</li>
<li id="sector12-carmichaelsecurity-li">
<a id="sector12-carmichaelsecurity" class="a-link-button"> Carmichael Security</a>
</li>
<li id="sector12-foodnstuff-li">
<a id="sector12-foodnstuff" class="a-link-button">FoodNStuff</a>
</li>
<li id="sector12-joesguns-li">
<a id="sector12-joesguns" class="a-link-button"> Joe's Guns</a>
</li>
<li id="sector12-irongym-li">
<a id="sector12-irongym" class="a-link-button">Iron Gym </a>
</li>
<li id="sector12-powerhousegym-li">
<a id="sector12-powerhousegym" class="a-link-button">Powerhouse Gym</a>
</li>
<li id="sector12-slums-li">
<a id="sector12-slums" class="a-link-button">The Slums</a>
</li>
<li id="sector12-cityhall-li">
<a id="sector12-cityhall" class="a-link-button">City Hall</a>
</li>
</ul>
<ul id="newtokyo-locations-list">
<li id="newtokyo-travelagency-li">
<a id="newtokyo-travelagency" class="a-link-button"> Travel Agency</a>
</li>
<li id="newtokyo-hospital-li">
<a id="newtokyo-hospital" class="a-link-button">Hospital</a>
</li>
<li id="newtokyo-defcomm-li">
<a id="newtokyo-defcomm" class="a-link-button"> DefComm</a>
</li>
<li id="newtokyo-vitalife-li">
<a id="newtokyo-vitalife" class="a-link-button">VitaLife </a>
</li>
<li id="newtokyo-globalpharmaceuticals-li">
<a id="newtokyo-globalpharmaceuticals" class="a-link-button">Global Pharmaceuticals</a>
</li>
<li id="newtokyo-noodlebar-li">
<a id="newtokyo-noodlebar" class="a-link-button">Noodle Bar </a>
</li>
<li id="newtokyo-slums-li">
<a id="newtokyo-slums" class="a-link-button">The Slums</a>
</li>
</ul>
<ul id="ishima-locations-list">
<li id="ishima-travelagency-li">
<a id="ishima-travelagency" class="a-link-button">Travel Agency </a>
</li>
<li id="ishima-hospital-li">
<a id="ishima-hospital" class="a-link-button">Hospital</a>
</li>
<li id="ishima-stormtechnologies-li">
<a id="ishima-stormtechnologies" class="a-link-button">Storm Technologies</a>
</li>
<li id="ishima-novamedical-li">
<a id="ishima-novamedical" class="a-link-button">Nova Medical</a>
</li>
<li id="ishima-omegasoftware-li">
<a id="ishima-omegasoftware" class="a-link-button">Omega Software </a>
</li>
<li id="ishima-slums-li">
<a id="ishima-slums" class="a-link-button">The Slums</a>
</li>
</ul>
<ul id="volhaven-locations-list">
<li id="volhaven-travelagency-li">
<a id="volhaven-travelagency" class="a-link-button">Travel Agency </a>
</li>
<li id="volhaven-hospital-li">
<a id="volhaven-hospital" class="a-link-button">Hospital</a>
</li>
<li id="volhaven-zbinstituteoftechnology-li">
<a id="volhaven-zbinstituteoftechnology" class="a-link-button">ZB Insitute of Technology</a>
</li>
<li id="volhaven-omnitekincorporated-li">
<a id="volhaven-omnitekincorporated" class="a-link-button">OmniTek Incorporated </a>
</li>
<li id="volhaven-nwo-li">
<a id="volhaven-nwo" class="a-link-button">NWO</a>
</li>
<li id="volhaven-helislabs-li">
<a id="volhaven-helioslabs" class="a-link-button">Helios Labs</a>
</li>
<li id="volhaven-omniacybersystems-li">
<a id="volhaven-omniacybersystems" class="a-link-button">Omnia Cybersystems</a>
</li>
<li id="volhaven-lexocorp-li">
<a id="volhaven-lexocorp" class="a-link-button">LexoCorp</a>
</li>
<li id="volhaven-syscoresecurities-li">
<a id="volhaven-syscoresecurities" class="a-link-button">SysCore Securities</a>
</li>
<li id="volhaven-computek-li">
<a id="volhaven-computek" class="a-link-button">CompuTek</a>
</li>
<li id="volhaven-milleniumfitnessgym-li">
<a id="volhaven-milleniumfitnessgym" class="a-link-button">Millenium Fitness Gym</a>
</li>
<li id="volhaven-slums-li">
<a id="volhaven-slums" class="a-link-button">The Slums</a>
</li>
</ul>
<ul id="generic-locations-list"></ul>
<!-- React Component -->
</div>
<!-- Create a program(executable) -->