mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-11-26 09:33:49 +01:00
more conversion
This commit is contained in:
parent
8bb4e8b7cf
commit
4b6d049da2
@ -695,56 +695,6 @@ export class CorporationEventHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a popup that lets the player expand into a new city (for the current industry)
|
|
||||||
// The 'cityStateSetter' arg is a function that sets the UI's 'city' state property
|
|
||||||
createNewCityPopup(division, cityStateSetter) {
|
|
||||||
const popupId = "cmpy-mgmt-expand-city-popup";
|
|
||||||
const text = createElement("p", {
|
|
||||||
innerText: "Would you like to expand into a new city by opening an office? " +
|
|
||||||
"This would cost " + numeralWrapper.format(OfficeInitialCost, '$0.000a'),
|
|
||||||
});
|
|
||||||
const citySelector = createElement("select", { class: "dropdown", margin:"5px" });
|
|
||||||
for (const cityName in division.offices) {
|
|
||||||
if (!(division.offices[cityName] instanceof OfficeSpace)) {
|
|
||||||
citySelector.add(createElement("option", {
|
|
||||||
text: cityName,
|
|
||||||
value: cityName,
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const confirmBtn = createElement("button", {
|
|
||||||
class:"std-button",
|
|
||||||
display:"inline-block",
|
|
||||||
innerText: "Confirm",
|
|
||||||
clickListener: () => {
|
|
||||||
if (citySelector.length <= 0) { return false; }
|
|
||||||
let city = citySelector.options[citySelector.selectedIndex].value;
|
|
||||||
if (this.corp.funds.lt(OfficeInitialCost)) {
|
|
||||||
dialogBoxCreate("You don't have enough company funds to open a new office!");
|
|
||||||
} else {
|
|
||||||
this.corp.funds = this.corp.funds.minus(OfficeInitialCost);
|
|
||||||
dialogBoxCreate("Opened a new office in " + city + "!");
|
|
||||||
division.offices[city] = new OfficeSpace({
|
|
||||||
loc: city,
|
|
||||||
size: OfficeInitialSize,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
cityStateSetter(city);
|
|
||||||
removeElementById(popupId);
|
|
||||||
this.rerender();
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const cancelBtn = createPopupCloseButton(popupId, {
|
|
||||||
class: "std-button",
|
|
||||||
innerText: "Cancel",
|
|
||||||
});
|
|
||||||
|
|
||||||
createPopup(popupId, [text, citySelector, confirmBtn, cancelBtn]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a popup that lets the player create a new industry.
|
// Create a popup that lets the player create a new industry.
|
||||||
// This is created when the player clicks the "Expand into new Industry" header tab
|
// This is created when the player clicks the "Expand into new Industry" header tab
|
||||||
createNewIndustryPopup() {
|
createNewIndustryPopup() {
|
||||||
@ -1390,90 +1340,6 @@ export class CorporationEventHandler {
|
|||||||
inputQty.focus();
|
inputQty.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a popup that lets the player sell Corporation shares
|
|
||||||
// This is created when the player clicks the "Sell Shares" button in the overview panel
|
|
||||||
createSellSharesPopup() {
|
|
||||||
const popupId = "cmpy-mgmt-sell-shares-popup";
|
|
||||||
const currentStockPrice = this.corp.sharePrice;
|
|
||||||
const txt = createElement("p", {
|
|
||||||
innerHTML: "Enter the number of shares you would like to sell. The money from " +
|
|
||||||
"selling your shares will go directly to you (NOT your Corporation).<br><br>" +
|
|
||||||
"Selling your shares will cause your corporation's stock price to fall due to " +
|
|
||||||
"dilution. Furthermore, selling a large number of shares all at once will have an immediate effect " +
|
|
||||||
"in reducing your stock price.<br><br>" +
|
|
||||||
"The current price of your " +
|
|
||||||
"company's stock is " + numeralWrapper.format(currentStockPrice, "$0.000a"),
|
|
||||||
});
|
|
||||||
const profitIndicator = createElement("p");
|
|
||||||
const input = createElement("input", {
|
|
||||||
class: "text-input",
|
|
||||||
type:"number", placeholder:"Shares to sell", margin:"5px",
|
|
||||||
inputListener: ()=> {
|
|
||||||
var numShares = Math.round(input.value);
|
|
||||||
if (isNaN(numShares) || numShares <= 0) {
|
|
||||||
profitIndicator.innerText = "ERROR: Invalid value entered for number of shares to sell"
|
|
||||||
} else if (numShares > this.corp.numShares) {
|
|
||||||
profitIndicator.innerText = "You don't have this many shares to sell!";
|
|
||||||
} else {
|
|
||||||
const stockSaleResults = this.corp.calculateShareSale(numShares);
|
|
||||||
const profit = stockSaleResults[0];
|
|
||||||
profitIndicator.innerText = "Sell " + numShares + " shares for a total of " +
|
|
||||||
numeralWrapper.format(profit, '$0.000a');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const confirmBtn = createElement("button", {
|
|
||||||
class:"a-link-button", innerText:"Sell shares", display:"inline-block",
|
|
||||||
clickListener:()=>{
|
|
||||||
var shares = Math.round(input.value);
|
|
||||||
if (isNaN(shares) || shares <= 0) {
|
|
||||||
dialogBoxCreate("ERROR: Invalid value for number of shares");
|
|
||||||
} else if (shares > this.corp.numShares) {
|
|
||||||
dialogBoxCreate("ERROR: You don't have this many shares to sell");
|
|
||||||
} else {
|
|
||||||
const stockSaleResults = this.corp.calculateShareSale(shares);
|
|
||||||
const profit = stockSaleResults[0];
|
|
||||||
const newSharePrice = stockSaleResults[1];
|
|
||||||
const newSharesUntilUpdate = stockSaleResults[2];
|
|
||||||
|
|
||||||
this.corp.numShares -= shares;
|
|
||||||
if (isNaN(this.corp.issuedShares)) {
|
|
||||||
console.error(`Corporation issuedShares is NaN: ${this.corp.issuedShares}`);
|
|
||||||
var res = parseInt(this.corp.issuedShares);
|
|
||||||
if (isNaN(res)) {
|
|
||||||
this.corp.issuedShares = 0;
|
|
||||||
} else {
|
|
||||||
this.corp.issuedShares = res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.corp.issuedShares += shares;
|
|
||||||
this.corp.sharePrice = newSharePrice;
|
|
||||||
this.corp.shareSalesUntilPriceUpdate = newSharesUntilUpdate;
|
|
||||||
this.corp.shareSaleCooldown = SellSharesCooldown;
|
|
||||||
Player.gainMoney(profit);
|
|
||||||
Player.recordMoneySource(profit, "corporation");
|
|
||||||
removeElementById(popupId);
|
|
||||||
dialogBoxCreate(`Sold ${numeralWrapper.formatMoney(shares, "0.000a")} shares for ` +
|
|
||||||
`${numeralWrapper.formatMoney(profit, "$0.000a")}. ` +
|
|
||||||
`The corporation's stock price fell to ${numeralWrapper.formatMoney(this.corp.sharePrice)} ` +
|
|
||||||
`as a result of dilution.`);
|
|
||||||
|
|
||||||
this.rerender();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const cancelBtn = createPopupCloseButton(popupId, {
|
|
||||||
class: "std-button",
|
|
||||||
display: "inline-block",
|
|
||||||
innerText: "Cancel",
|
|
||||||
});
|
|
||||||
|
|
||||||
createPopup(popupId, [txt, profitIndicator, input, confirmBtn, cancelBtn]);
|
|
||||||
input.focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
rerender() {
|
rerender() {
|
||||||
this.corp.rerender();
|
this.corp.rerender();
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ import React from "react";
|
|||||||
import { LevelableUpgrade } from "./LevelableUpgrade";
|
import { LevelableUpgrade } from "./LevelableUpgrade";
|
||||||
import { UnlockUpgrade } from "./UnlockUpgrade";
|
import { UnlockUpgrade } from "./UnlockUpgrade";
|
||||||
import { BribeFactionPopup } from "./BribeFactionPopup";
|
import { BribeFactionPopup } from "./BribeFactionPopup";
|
||||||
|
import { SellSharesPopup } from "./SellSharesPopup";
|
||||||
|
|
||||||
import { CorporationConstants } from "../data/Constants";
|
import { CorporationConstants } from "../data/Constants";
|
||||||
import { CorporationUnlockUpgrades } from "../data/CorporationUnlockUpgrades";
|
import { CorporationUnlockUpgrades } from "../data/CorporationUnlockUpgrades";
|
||||||
@ -215,7 +216,12 @@ export function Overview(props: IProps): React.ReactElement {
|
|||||||
display: "inline-block",
|
display: "inline-block",
|
||||||
onClick: function(event: MouseEvent) {
|
onClick: function(event: MouseEvent) {
|
||||||
if(!event.isTrusted) return;
|
if(!event.isTrusted) return;
|
||||||
props.eventHandler.createSellSharesPopup(event);
|
const popupId = "cmpy-mgmt-sell-shares-popup";
|
||||||
|
createPopup(popupId, SellSharesPopup, {
|
||||||
|
corp: props.corp,
|
||||||
|
player: props.player,
|
||||||
|
popupId: popupId,
|
||||||
|
});
|
||||||
},
|
},
|
||||||
text: "Sell Shares",
|
text: "Sell Shares",
|
||||||
tooltip: sellSharesTooltip,
|
tooltip: sellSharesTooltip,
|
||||||
|
97
src/Corporation/ui/SellSharesPopup.tsx
Normal file
97
src/Corporation/ui/SellSharesPopup.tsx
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
import React, { useState } from 'react';
|
||||||
|
import { numeralWrapper } from "../../ui/numeralFormat";
|
||||||
|
import { dialogBoxCreate } from "../../../utils/DialogBox";
|
||||||
|
import { IPlayer } from "../../PersonObjects/IPlayer";
|
||||||
|
import { removePopup } from "../../ui/React/createPopup";
|
||||||
|
import { CorporationConstants } from "../data/Constants";
|
||||||
|
import { createElement } from "../../../utils/uiHelpers/createElement";
|
||||||
|
|
||||||
|
interface IProps {
|
||||||
|
corp: any;
|
||||||
|
player: IPlayer;
|
||||||
|
popupId: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a popup that lets the player sell Corporation shares
|
||||||
|
// This is created when the player clicks the "Sell Shares" button in the overview panel
|
||||||
|
export function SellSharesPopup(props: IProps): React.ReactElement {
|
||||||
|
const [shares, setShares] = useState<number | null>(null);
|
||||||
|
|
||||||
|
function changeShares(event: React.ChangeEvent<HTMLInputElement>): void {
|
||||||
|
if(event.target.value === "") setShares(null);
|
||||||
|
else setShares(Math.round(parseFloat(event.target.value)));
|
||||||
|
}
|
||||||
|
|
||||||
|
function ProfitIndicator(props: {shares: number | null, corp: any}): React.ReactElement {
|
||||||
|
if(props.shares === null) return (<></>);
|
||||||
|
if (isNaN(props.shares) || props.shares <= 0) {
|
||||||
|
return (<>ERROR: Invalid value entered for number of shares to sell</>);
|
||||||
|
} else if (props.shares > props.corp.numShares) {
|
||||||
|
return (<>You don't have this many shares to sell!</>);
|
||||||
|
} else {
|
||||||
|
const stockSaleResults = props.corp.calculateShareSale(props.shares);
|
||||||
|
const profit = stockSaleResults[0];
|
||||||
|
return (<>Sell {props.shares} shares for a total of {numeralWrapper.formatMoney(profit)}</>);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function sell() {
|
||||||
|
if(shares === null) return;
|
||||||
|
if (isNaN(shares) || shares <= 0) {
|
||||||
|
dialogBoxCreate("ERROR: Invalid value for number of shares");
|
||||||
|
} else if (shares > props.corp.numShares) {
|
||||||
|
dialogBoxCreate("ERROR: You don't have this many shares to sell");
|
||||||
|
} else {
|
||||||
|
const stockSaleResults = props.corp.calculateShareSale(shares);
|
||||||
|
const profit = stockSaleResults[0];
|
||||||
|
const newSharePrice = stockSaleResults[1];
|
||||||
|
const newSharesUntilUpdate = stockSaleResults[2];
|
||||||
|
|
||||||
|
props.corp.numShares -= shares;
|
||||||
|
if (isNaN(props.corp.issuedShares)) {
|
||||||
|
console.error(`Corporation issuedShares is NaN: ${props.corp.issuedShares}`);
|
||||||
|
var res = parseInt(props.corp.issuedShares);
|
||||||
|
if (isNaN(res)) {
|
||||||
|
props.corp.issuedShares = 0;
|
||||||
|
} else {
|
||||||
|
props.corp.issuedShares = res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
props.corp.issuedShares += shares;
|
||||||
|
props.corp.sharePrice = newSharePrice;
|
||||||
|
props.corp.shareSalesUntilPriceUpdate = newSharesUntilUpdate;
|
||||||
|
props.corp.shareSaleCooldown = CorporationConstants.SellSharesCooldown;
|
||||||
|
props.player.gainMoney(profit);
|
||||||
|
props.player.recordMoneySource(profit, "corporation");
|
||||||
|
removePopup(props.popupId);
|
||||||
|
dialogBoxCreate(`Sold ${numeralWrapper.formatMoney(shares)} shares for ` +
|
||||||
|
`${numeralWrapper.formatMoney(profit)}. ` +
|
||||||
|
`The corporation's stock price fell to ${numeralWrapper.formatMoney(props.corp.sharePrice)} ` +
|
||||||
|
`as a result of dilution.`);
|
||||||
|
|
||||||
|
props.corp.rerender();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function onKeyDown(event: React.KeyboardEvent<HTMLInputElement>) {
|
||||||
|
if (event.keyCode === 13) sell();
|
||||||
|
}
|
||||||
|
|
||||||
|
return (<>
|
||||||
|
<p>
|
||||||
|
Enter the number of shares you would like to sell. The money from
|
||||||
|
selling your shares will go directly to you (NOT your Corporation).<br /><br />
|
||||||
|
Selling your shares will cause your corporation's stock price to fall due to
|
||||||
|
dilution. Furthermore, selling a large number of shares all at once will have an immediate effect
|
||||||
|
in reducing your stock price.<br /><br />
|
||||||
|
The current price of your
|
||||||
|
company's stock is {numeralWrapper.formatMoney(props.corp.sharePrice)}
|
||||||
|
</p>
|
||||||
|
<ProfitIndicator shares={shares} corp={props.corp} />
|
||||||
|
<br />
|
||||||
|
<input autoFocus={true} className="text-input" type="number" placeholder="Shares to sell" style={{margin: "5px"}} onChange={changeShares} onKeyDown={onKeyDown} />
|
||||||
|
<button onClick={sell} className="a-link-button" style={{display:"inline-block"}}>Sell shares</button>
|
||||||
|
</>);
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user