Merge pull request #819 from danielyxie/dev

v0.50.1
This commit is contained in:
hydroflame 2021-03-22 18:44:49 -04:00 committed by GitHub
commit d170693da4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 124 additions and 46 deletions

File diff suppressed because one or more lines are too long

20
dist/vendor.bundle.js vendored

File diff suppressed because one or more lines are too long

@ -3,6 +3,28 @@
Changelog Changelog
========= =========
v0.50.1 - 2021-03-22 (hydroflame)
---------------------------------
**Netscript**
* getTaskTasks works
**Source-File -1**
* Added a new Exploit
**Factions**
* Augmentations offered by a Faction but already bought are in a separate list at the bottom of the page.
**Bug fixed**
* Fixed a bug where completing a maxed non-repeatable BitNode would make its color on the BitVerse like level 1.
**Misc.**
* Minor spacing in stats tables.
v0.50.0 - 2021-03-20 Intelligence (hydroflame) v0.50.0 - 2021-03-20 Intelligence (hydroflame)
---------------------------------------------- ----------------------------------------------

@ -64,9 +64,9 @@ documentation_title = '{0} Documentation'.format(project)
# built documents. # built documents.
# #
# The short X.Y version. # The short X.Y version.
version = '0.47' version = '0.50'
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = '0.47.0' release = '0.50.1'
# The language for content autogenerated by Sphinx. Refer to documentation # The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages. # for a list of supported languages.

@ -590,6 +590,8 @@
<p>If the game fails to load, consider <a href="?noScripts">killing all scripts</a></p> <p>If the game fails to load, consider <a href="?noScripts">killing all scripts</a></p>
</div> </div>
</div> </div>
<div id="unclickable" style="display: none">Click on this to upgrade your Source-File -1!</div>
<script type="text/javascript" src="dist/vendor.bundle.js"></script><script type="text/javascript" src="dist/engine.bundle.js"></script><script type="text/javascript" src="dist/engineStyle.bundle.js"></script></body> <script type="text/javascript" src="dist/vendor.bundle.js"></script><script type="text/javascript" src="dist/engine.bundle.js"></script><script type="text/javascript" src="dist/engineStyle.bundle.js"></script></body>
<!-- Misc Scripts --> <!-- Misc Scripts -->

@ -121,5 +121,5 @@
"watch": "webpack --watch --mode production", "watch": "webpack --watch --mode production",
"watch:dev": "webpack --watch --mode development" "watch:dev": "webpack --watch --mode development"
}, },
"version": "0.49.2" "version": "0.50.1"
} }

@ -6,7 +6,7 @@
import { IMap } from "./types"; import { IMap } from "./types";
export let CONSTANTS: IMap<any> = { export let CONSTANTS: IMap<any> = {
Version: "0.50.0", Version: "0.5X.X",
/** Max level for any skill, assuming no multipliers. Determined by max numerical value in javascript for experience /** Max level for any skill, assuming no multipliers. Determined by max numerical value in javascript for experience
* and the skill level formula in Player.js. Note that all this means it that when experience hits MAX_INT, then * and the skill level formula in Player.js. Note that all this means it that when experience hits MAX_INT, then
@ -228,20 +228,21 @@ export let CONSTANTS: IMap<any> = {
LatestUpdate: LatestUpdate:
` `
v0.50.0 - 2021-03-20 Intelligence (hydroflame) v0.50.1 - 2021-03-22 (hydroflame)
------- -------
Intelligence Netscript
* int exp gain and effect has been reworked. It is now much more easy to * getTaskTasks works
acquire and far more powerful. The goal here is to feel like players have
another tool in their arsenal. Source-File -1
* Added a new Exploit
Factions Factions
* Hacking factions no longer have hacking level requirements since their associated servers do. * Augmentations offered by a Faction but already bought are in a separate list at the bottom of the page.
Bug fixed
* Fixed a bug where completing a maxed non-repeatable BitNode would make its color on the BitVerse like level 1.
Misc. Misc.
* Sleeve styling. * Minor spacing in stats tables.
* number formatting
* remove wiki button in Hacking Missions.
* Fix NaN displayed when very very large numbers are reached.
` `
} }

@ -12,10 +12,11 @@ Source-File minus 1 is extremely weak because it can be fully level up quickly.
export enum Exploit { export enum Exploit {
UndocumentedFunctionCall = 'UndocumentedFunctionCall', UndocumentedFunctionCall = 'UndocumentedFunctionCall',
Unclickable = 'Unclickable',
PrototypeTampering = 'PrototypeTampering', PrototypeTampering = 'PrototypeTampering',
// To the players reading this. Yes you're supposed to add EditSaveFile by // To the players reading this. Yes you're supposed to add EditSaveFile by
// editing your save file, yes you could add them all, no we don't care // editing your save file, yes you could add them all, no we don't care
// that's not the point // that's not the point.
EditSaveFile = 'EditSaveFile' EditSaveFile = 'EditSaveFile'
} }
@ -25,6 +26,7 @@ const names: {
'UndocumentedFunctionCall': 'by looking beyond the documentation.', 'UndocumentedFunctionCall': 'by looking beyond the documentation.',
'EditSaveFile': 'by editing your save file.', 'EditSaveFile': 'by editing your save file.',
'PrototypeTampering': 'by tampering with Numbers prototype.', 'PrototypeTampering': 'by tampering with Numbers prototype.',
'Unclickable': 'by clicking the unclickable.',
} }

@ -0,0 +1,24 @@
import { Player } from "../Player";
import { Exploit } from "./Exploit";
(function() {
function clickTheUnclickable(event: MouseEvent) {
if(!event.target || !(event.target instanceof Element)) return;
const display = window.getComputedStyle(event.target as Element).display;
if(display === 'none' && event.isTrusted)
Player.giveExploit(Exploit.Unclickable);
}
function targetElement() {
const elem = document.getElementById('unclickable');
if(elem == null) {
console.error('Could not find the unclickable elem for the related exploit.');
return;
}
elem.addEventListener("click", clickTheUnclickable);
document.removeEventListener('DOMContentLoaded', targetElement);
}
document.addEventListener('DOMContentLoaded', targetElement);
})();

@ -6,6 +6,7 @@ import * as React from "react";
import { PurchaseableAugmentation } from "./PurchaseableAugmentation"; import { PurchaseableAugmentation } from "./PurchaseableAugmentation";
import { Augmentations } from "../../Augmentation/Augmentations"; import { Augmentations } from "../../Augmentation/Augmentations";
import { AugmentationNames } from "../../Augmentation/data/AugmentationNames";
import { Faction } from "../../Faction/Faction"; import { Faction } from "../../Faction/Faction";
import { IPlayer } from "../../PersonObjects/IPlayer"; import { IPlayer } from "../../PersonObjects/IPlayer";
import { PurchaseAugmentationsOrderSetting } from "../../Settings/SettingEnums"; import { PurchaseAugmentationsOrderSetting } from "../../Settings/SettingEnums";
@ -44,7 +45,7 @@ export class AugmentationsPage extends React.Component<IProps, IState> {
this.rerender = this.rerender.bind(this); this.rerender = this.rerender.bind(this);
} }
getAugs() { getAugs(): string[] {
if (this.isPlayersGang) { if (this.isPlayersGang) {
const augs: string[] = []; const augs: string[] = [];
for (const augName in Augmentations) { for (const augName in Augmentations) {
@ -60,7 +61,7 @@ export class AugmentationsPage extends React.Component<IProps, IState> {
} }
} }
getAugsSorted() { getAugsSorted(): string[] {
switch (Settings.PurchaseAugmentationsOrder) { switch (Settings.PurchaseAugmentationsOrder) {
case PurchaseAugmentationsOrderSetting.Cost: { case PurchaseAugmentationsOrderSetting.Cost: {
return this.getAugsSortedByCost(); return this.getAugsSortedByCost();
@ -73,7 +74,7 @@ export class AugmentationsPage extends React.Component<IProps, IState> {
} }
} }
getAugsSortedByCost() { getAugsSortedByCost(): string[] {
const augs = this.getAugs(); const augs = this.getAugs();
augs.sort((augName1, augName2)=>{ augs.sort((augName1, augName2)=>{
var aug1 = Augmentations[augName1], aug2 = Augmentations[augName2]; var aug1 = Augmentations[augName1], aug2 = Augmentations[augName2];
@ -87,7 +88,7 @@ export class AugmentationsPage extends React.Component<IProps, IState> {
return augs; return augs;
} }
getAugsSortedByReputation() { getAugsSortedByReputation(): string[] {
const augs = this.getAugs(); const augs = this.getAugs();
augs.sort((augName1, augName2)=>{ augs.sort((augName1, augName2)=>{
var aug1 = Augmentations[augName1], aug2 = Augmentations[augName2]; var aug1 = Augmentations[augName1], aug2 = Augmentations[augName2];
@ -100,16 +101,16 @@ export class AugmentationsPage extends React.Component<IProps, IState> {
return augs; return augs;
} }
getAugsSortedByDefault() { getAugsSortedByDefault(): string[] {
return this.getAugs(); return this.getAugs();
} }
switchSortOrder(newOrder: PurchaseAugmentationsOrderSetting) { switchSortOrder(newOrder: PurchaseAugmentationsOrderSetting): void {
Settings.PurchaseAugmentationsOrder = newOrder; Settings.PurchaseAugmentationsOrder = newOrder;
this.rerender(); this.rerender();
} }
rerender() { rerender(): void {
this.setState((prevState) => { this.setState((prevState) => {
return { return {
rerenderFlag: !prevState.rerenderFlag, rerenderFlag: !prevState.rerenderFlag,
@ -119,17 +120,39 @@ export class AugmentationsPage extends React.Component<IProps, IState> {
render() { render() {
const augs = this.getAugsSorted(); const augs = this.getAugsSorted();
const augList = augs.map((aug) => { const purchasable = augs.filter((aug: string) =>
aug === AugmentationNames.NeuroFluxGovernor ||
(!this.props.p.augmentations.some(a => a.name === aug) &&
!this.props.p.queuedAugmentations.some(a => a.name === aug))
)
const parent = this;
function purchaseableAugmentation(aug: string) {
return ( return (
<PurchaseableAugmentation <PurchaseableAugmentation
augName={aug} augName={aug}
faction={this.props.faction} faction={parent.props.faction}
key={aug} key={aug}
p={this.props.p} p={parent.props.p}
rerender={this.rerender} rerender={parent.rerender}
/> />
) )
}); }
const augListElems = purchasable.map(aug => purchaseableAugmentation(aug));
let ownedElem = <></>
const owned = augs.filter((aug: string) => !purchasable.includes(aug));
if (owned.length !== 0) {
ownedElem = <>
<br />
<h2>Purchased Augmentations</h2>
<p style={infoStyleMarkup}>
This factions also offers these augmentations but you already own them.
</p>
{owned.map(aug => purchaseableAugmentation(aug))}
</>
}
return ( return (
<div> <div>
@ -156,7 +179,8 @@ export class AugmentationsPage extends React.Component<IProps, IState> {
text={"Sort by Default Order"} text={"Sort by Default Order"}
/> />
<br /> <br />
{augList} {augListElems}
{ownedElem}
</div> </div>
) )
} }

@ -114,7 +114,6 @@ export class PurchaseableAugmentation extends React.Component<IProps, any> {
color = "red"; color = "red";
} else if (this.aug.name !== AugmentationNames.NeuroFluxGovernor && (this.aug.owned || this.owned())) { } else if (this.aug.name !== AugmentationNames.NeuroFluxGovernor && (this.aug.owned || this.owned())) {
disabled = true; disabled = true;
statusTxt = "ALREADY OWNED";
} else if (this.hasReputation()) { } else if (this.hasReputation()) {
statusTxt = `UNLOCKED - ${numeralWrapper.formatMoney(moneyCost)}`; statusTxt = `UNLOCKED - ${numeralWrapper.formatMoney(moneyCost)}`;
} else { } else {

@ -490,9 +490,9 @@ function NetscriptFunctions(workerScript) {
} }
const getGangTask = function(func, name) { const getGangTask = function(func, name) {
const task = GangMemberTasks[taskName]; const task = GangMemberTasks[name];
if (!task) { if (!task) {
throw makeRuntimeErrorMsg(`gang.${func}`, `Invalid task: '${taskName}'`); throw makeRuntimeErrorMsg(`gang.${func}`, `Invalid task: '${name}'`);
} }
return task; return task;

@ -151,7 +151,8 @@ function loadBitVerse(destroyedBitNodeNum, flume=false) {
// Update NextSourceFileFlags // Update NextSourceFileFlags
nextSourceFileFlags = SourceFileFlags.slice(); nextSourceFileFlags = SourceFileFlags.slice();
if (!flume) { if (!flume) {
++nextSourceFileFlags[destroyedBitNodeNum]; if (nextSourceFileFlags[destroyedBitNodeNum] < 3 && destroyedBitNodeNum !== 12)
++nextSourceFileFlags[destroyedBitNodeNum];
} }
// Create the Bit Verse // Create the Bit Verse

@ -102,6 +102,7 @@ import { exceptionAlert } from "../utils/helpers/exceptionAlert";
import { removeLoadingScreen } from "../utils/uiHelpers/removeLoadingScreen"; import { removeLoadingScreen } from "../utils/uiHelpers/removeLoadingScreen";
import { KEY } from "../utils/helpers/keyCodes"; import { KEY } from "../utils/helpers/keyCodes";
import "./Exploits/tampering"; import "./Exploits/tampering";
import "./Exploits/unclickable";
import React from "react"; import React from "react";
import ReactDOM from "react-dom"; import ReactDOM from "react-dom";

@ -603,6 +603,8 @@ if (htmlWebpackPlugin.options.googleAnalytics.trackingId) { %>
<p>If the game fails to load, consider <a href="?noScripts">killing all scripts</a></p> <p>If the game fails to load, consider <a href="?noScripts">killing all scripts</a></p>
</div> </div>
</div> </div>
<div id="unclickable" style="display: none">Click on this to upgrade your Source-File -1!</div>
</body> </body>
<!-- Misc Scripts --> <!-- Misc Scripts -->

@ -78,7 +78,7 @@ export function CharacterInfo(p: IPlayer): React.ReactElement {
if(SourceFileFlags[5] > 0 && r.length > 2 && r[1] != r[2]) { if(SourceFileFlags[5] > 0 && r.length > 2 && r[1] != r[2]) {
return <td key='2' style={{textAlign: 'right'}}> ({numeralWrapper.formatPercentage(r[2])})</td> return <td key='2' style={{textAlign: 'right'}}> ({numeralWrapper.formatPercentage(r[2])})</td>
} }
return undefined; return <></>;
} }
return <> return <>
<table> <table>

@ -13,7 +13,7 @@ export function StatsTable(rows: any[][], title: string | null): React.ReactElem
return <tr key={row[0]}> return <tr key={row[0]}>
{row.map((elem: any, i: number) => { {row.map((elem: any, i: number) => {
let style = {}; let style = {};
if (i !== 0) style = {textAlign: 'right'}; if (i !== 0) style = {textAlign: 'right', paddingLeft: '.25em'};
return <td key={i} style={style}>{elem}</td> return <td key={i} style={style}>{elem}</td>
})} })}
</tr> </tr>