mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-11-26 17:43:48 +01:00
Merge pull request #910 from danielyxie/lint-fix
The mega linting patch
This commit is contained in:
commit
34a20802c9
@ -2,3 +2,7 @@ node_modules/
|
||||
doc/build/
|
||||
dist/
|
||||
tests/*.bundle.*
|
||||
src/ThirdParty/*
|
||||
src/ScriptEditor/CodeMirrorNetscriptMode.js
|
||||
src/ScriptEditor/CodeMirrorNetscriptLint.js
|
||||
src/JSInterpreter.js
|
384
.eslintrc.js
384
.eslintrc.js
@ -76,7 +76,7 @@ module.exports = {
|
||||
"imports": "always-multiline",
|
||||
"exports": "always-multiline",
|
||||
"functions": "always-multiline",
|
||||
}
|
||||
},
|
||||
],
|
||||
"comma-spacing": [
|
||||
"off",
|
||||
@ -102,14 +102,14 @@ module.exports = {
|
||||
"error",
|
||||
],
|
||||
"curly": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"default-case": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"dot-location": [
|
||||
"error",
|
||||
"property"
|
||||
"property",
|
||||
],
|
||||
"dot-notation": [
|
||||
"off",
|
||||
@ -310,104 +310,104 @@ module.exports = {
|
||||
"error",
|
||||
],
|
||||
"no-div-regex": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-dupe-args": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-dupe-class-members": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-dupe-keys": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-duplicate-case": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-duplicate-imports": [
|
||||
"error",
|
||||
{
|
||||
"includeExports": true
|
||||
}
|
||||
"includeExports": true,
|
||||
},
|
||||
],
|
||||
"no-else-return": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-empty": [
|
||||
"off",
|
||||
{
|
||||
"allowEmptyCatch": false
|
||||
}
|
||||
"allowEmptyCatch": false,
|
||||
},
|
||||
],
|
||||
"no-empty-character-class": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-empty-function": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-empty-pattern": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-eq-null": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-ex-assign": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-extra-boolean-cast": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-extra-parens": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-extra-semi": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-eval": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-extend-native": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-extra-bind": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-extra-label": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-fallthrough": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-floating-decimal": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-func-assign": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-global-assign": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-implicit-coercion": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-implicit-globals": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-implied-eval": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-inline-comments": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-inner-declarations": [
|
||||
"off",
|
||||
"both"
|
||||
"both",
|
||||
],
|
||||
"no-invalid-regexp": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-invalid-this": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-irregular-whitespace": [
|
||||
"error",
|
||||
@ -415,451 +415,461 @@ module.exports = {
|
||||
"skipStrings": false,
|
||||
"skipComments": false,
|
||||
"skipRegExps": false,
|
||||
"skipTemplates": false
|
||||
}
|
||||
"skipTemplates": false,
|
||||
},
|
||||
],
|
||||
"no-iterator": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-label-var": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-labels": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-lone-blocks": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-lonely-if": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-loop-func": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-magic-numbers": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-mixed-operators": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-mixed-requires": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-mixed-spaces-and-tabs": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-multi-assign": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-multi-spaces": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-multi-str": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-multiple-empty-lines": [
|
||||
"off",
|
||||
{
|
||||
"max": 1
|
||||
}
|
||||
"max": 1,
|
||||
},
|
||||
],
|
||||
"no-native-reassign": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-negated-condition": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-negated-in-lhs": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-nested-ternary": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-new": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-new-func": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-new-object": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-new-require": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-new-symbol": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-new-wrappers": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-octal": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-octal-escape": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-obj-calls": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-param-reassign": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-path-concat": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-plusplus": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-process-env": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-process-exit": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-proto": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-prototype-builtins": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-redeclare": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-regex-spaces": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-restricted-globals": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-restricted-imports": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-restricted-modules": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-restricted-properties": [
|
||||
"off",
|
||||
{
|
||||
"object": "console",
|
||||
"property": "log",
|
||||
"message": "'log' is too general, use an appropriate level when logging."
|
||||
}
|
||||
"message": "'log' is too general, use an appropriate level when logging.",
|
||||
},
|
||||
],
|
||||
"no-restricted-syntax": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-return-assign": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-return-await": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-script-url": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-self-assign": [
|
||||
"error",
|
||||
{
|
||||
"props": false
|
||||
}
|
||||
"props": false,
|
||||
},
|
||||
],
|
||||
"no-self-compare": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-sequences": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-shadow": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-shadow-restricted-names": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-spaced-func": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-sparse-arrays": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-sync": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-tabs": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-template-curly-in-string": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-ternary": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-this-before-super": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-throw-literal": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-trailing-spaces": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-undef": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-undef-init": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-undefined": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-underscore-dangle": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-unexpected-multiline": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-unmodified-loop-condition": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-unneeded-ternary": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-unreachable": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-unsafe-finally": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-unsafe-negation": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-unused-expressions": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-unused-labels": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-unused-vars": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-use-before-define": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-useless-call": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-useless-computed-key": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-useless-concat": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-useless-constructor": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-useless-escape": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-useless-rename": [
|
||||
"error",
|
||||
{
|
||||
"ignoreDestructuring": false,
|
||||
"ignoreExport": false,
|
||||
"ignoreImport": false
|
||||
}
|
||||
"ignoreImport": false,
|
||||
},
|
||||
],
|
||||
"no-useless-return": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-var": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-void": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-warning-comments": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"no-whitespace-before-property": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"no-with": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"nonblock-statement-body-position": [
|
||||
"off",
|
||||
"below"
|
||||
"below",
|
||||
],
|
||||
"object-curly-newline": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"object-curly-spacing": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"object-property-newline": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"object-shorthand": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"one-var": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"one-var-declaration-per-line": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"operator-assignment": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"operator-linebreak": [
|
||||
"off",
|
||||
"none"
|
||||
"none",
|
||||
],
|
||||
"padded-blocks": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"padding-line-between-statements": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"prefer-arrow-callback": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"prefer-const": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"prefer-destructuring": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"prefer-numeric-literals": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"prefer-promise-reject-errors": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"prefer-reflect": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"prefer-rest-params": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"prefer-spread": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"prefer-template": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"quote-props": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"quotes": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"radix": [
|
||||
"off",
|
||||
"as-needed"
|
||||
"as-needed",
|
||||
],
|
||||
"require-await": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"require-jsdoc": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"require-yield": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"rest-spread-spacing": [
|
||||
"error",
|
||||
"never"
|
||||
"never",
|
||||
],
|
||||
"semi": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"semi-spacing": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"semi-style": [
|
||||
"error",
|
||||
"last"
|
||||
"last",
|
||||
],
|
||||
"sort-imports": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"sort-keys": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"sort-vars": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"space-before-blocks": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"space-before-function-paren": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"space-in-parens": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"space-infix-ops": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"space-unary-ops": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"spaced-comment": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"strict": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"switch-colon-spacing": [
|
||||
"error",
|
||||
{
|
||||
"after": true,
|
||||
"before": false
|
||||
}
|
||||
"before": false,
|
||||
},
|
||||
],
|
||||
"symbol-description": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"template-curly-spacing": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"template-tag-spacing": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"unicode-bom": [
|
||||
"error",
|
||||
"never"
|
||||
"never",
|
||||
],
|
||||
"use-isnan": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"valid-jsdoc": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"valid-typeof": [
|
||||
"error"
|
||||
"error",
|
||||
],
|
||||
"vars-on-top": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"wrap-iife": [
|
||||
"error",
|
||||
"any"
|
||||
"any",
|
||||
],
|
||||
"wrap-regex": [
|
||||
"off"
|
||||
"off",
|
||||
],
|
||||
"yield-star-spacing": [
|
||||
"error",
|
||||
"before"
|
||||
"before",
|
||||
],
|
||||
"yoda": [
|
||||
"error",
|
||||
"never"
|
||||
]
|
||||
"never",
|
||||
],
|
||||
"@typescript-eslint/explicit-module-boundary-types": "off",
|
||||
"@typescript-eslint/explicit-function-return-type": "off",
|
||||
},
|
||||
"overrides": [
|
||||
{
|
||||
// enable the rule specifically for TypeScript files
|
||||
"files": ["*.ts", "*.tsx"],
|
||||
"rules": {
|
||||
"@typescript-eslint/explicit-function-return-type": ["error"],
|
||||
"@typescript-eslint/explicit-module-boundary-types": ["error"],
|
||||
},
|
||||
},
|
||||
{
|
||||
// TypeScript configuration
|
||||
"files": [ "**/*.ts", "**/*.tsx" ],
|
||||
@ -888,7 +898,7 @@ module.exports = {
|
||||
"singleline": {
|
||||
"delimiter": "semi",
|
||||
"requireLast": false,
|
||||
}
|
||||
},
|
||||
}],
|
||||
"@typescript-eslint/member-ordering": ["error", {
|
||||
"default": [
|
||||
@ -900,11 +910,11 @@ module.exports = {
|
||||
"instance-method",
|
||||
"abstract-method",
|
||||
"static-method",
|
||||
]
|
||||
],
|
||||
}],
|
||||
"@typescript-eslint/no-explicit-any": "off",
|
||||
"@typescript-eslint/no-use-before-define": "off",
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
@ -1,24 +1,24 @@
|
||||
.casino-card {
|
||||
padding: 10px;
|
||||
border: solid 1px #808080;
|
||||
background-color: white;
|
||||
display: inline-block;
|
||||
border-radius: 10px;
|
||||
font-size: 14pt;
|
||||
text-align: center;
|
||||
margin: 3px;
|
||||
font-weight: bold;
|
||||
padding: 10px;
|
||||
border: solid 1px #808080;
|
||||
background-color: white;
|
||||
display: inline-block;
|
||||
border-radius: 10px;
|
||||
font-size: 14pt;
|
||||
text-align: center;
|
||||
margin: 3px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.casino-card .value {
|
||||
font-size:15pt;
|
||||
font-family: sans-serif;
|
||||
font-size:15pt;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
.casino-card.red {
|
||||
color: red;
|
||||
color: red;
|
||||
}
|
||||
|
||||
.casino-card.black {
|
||||
color: black;
|
||||
}
|
||||
color: black;
|
||||
}
|
||||
|
@ -43,9 +43,9 @@
|
||||
background-color: #444;
|
||||
}
|
||||
|
||||
.character-stat-cell {
|
||||
text-align: right;
|
||||
}
|
||||
.character-stat-cell {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
#character-hack-wrapper td,
|
||||
#character-agi-wrapper td {
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
#codemirror-form-wrapper {
|
||||
height: 80%;
|
||||
margin: 10px 0px 0px 6px;
|
||||
margin: 10px 0 0 6px;
|
||||
}
|
||||
|
||||
.CodeMirror {
|
||||
@ -22,11 +22,11 @@
|
||||
* Highlight matches
|
||||
*/
|
||||
.cm-matchhighlight {
|
||||
background-color: #8F908A;
|
||||
background-color: #8f908a;
|
||||
}
|
||||
|
||||
.CodeMirror-selection-highlight-scrollbar {
|
||||
background-color: #8F908A;
|
||||
background-color: #8f908a;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -35,7 +35,7 @@
|
||||
.cm-whitespace::before {
|
||||
position: absolute;
|
||||
pointer-events: none;
|
||||
color: #404F7D;
|
||||
color: #404f7d;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,36 +1,36 @@
|
||||
.add-exp-button {
|
||||
margin-right: 0px;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.remove-exp-button {
|
||||
margin-left:0px;
|
||||
margin-left:0;
|
||||
}
|
||||
|
||||
.exp-input {
|
||||
margin-right: 0px;
|
||||
margin-left:0px;
|
||||
margin-right: 0;
|
||||
margin-left:0;
|
||||
|
||||
margin-top: 5px;
|
||||
margin-bottom: 5px;
|
||||
margin-top: 5px;
|
||||
margin-bottom: 5px;
|
||||
|
||||
padding: 2px 5px;
|
||||
padding: 2px 5px;
|
||||
}
|
||||
|
||||
.text-center {
|
||||
margin: auto;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
margin: auto;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.touch-right {
|
||||
margin-right: 0px;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.touch-left {
|
||||
margin-left: 0px;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.touch-sides {
|
||||
margin-left: 0px;
|
||||
margin-right: 0px;
|
||||
}
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
2
css/grid.min.css
vendored
2
css/grid.min.css
vendored
File diff suppressed because one or more lines are too long
@ -2,4 +2,4 @@
|
||||
position: fixed;
|
||||
padding: 6px;
|
||||
width: 60%;
|
||||
}
|
||||
}
|
||||
|
@ -17,7 +17,7 @@
|
||||
}
|
||||
|
||||
&.level-2 {
|
||||
color: #48D1CC;
|
||||
color: #48d1cc;
|
||||
}
|
||||
|
||||
&.level-3 {
|
||||
|
@ -1,4 +1,4 @@
|
||||
/**
|
||||
/**
|
||||
* Styling for the Re-Sleeving Page
|
||||
*/
|
||||
@import "theme";
|
||||
@ -15,7 +15,7 @@
|
||||
|
||||
.resleeve-panel {
|
||||
display: inline-block;
|
||||
margin: 0px;
|
||||
margin: 0;
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
||||
|
||||
.sleeve-panel {
|
||||
display: inline-block;
|
||||
margin: 0px;
|
||||
margin: 0;
|
||||
padding: 2px;
|
||||
|
||||
select {
|
||||
|
@ -375,7 +375,7 @@ a:visited {
|
||||
}
|
||||
|
||||
.noscrollbar::-webkit-scrollbar {
|
||||
display: none;
|
||||
display: none;
|
||||
}
|
||||
|
||||
input[type=checkbox] {
|
||||
@ -383,42 +383,42 @@ input[type=checkbox] {
|
||||
}
|
||||
|
||||
.optionCheckbox {
|
||||
margin: 5px;
|
||||
float: right;
|
||||
margin: 5px;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.optionRange {
|
||||
-webkit-appearance: none;
|
||||
background: #777;
|
||||
outline: none;
|
||||
opacity: 0.7;
|
||||
height: 10px;
|
||||
-webkit-transition: .2s;
|
||||
transition: opacity .2s;
|
||||
margin: 3px;
|
||||
-webkit-appearance: none;
|
||||
background: #777;
|
||||
outline: none;
|
||||
opacity: 0.7;
|
||||
height: 10px;
|
||||
-webkit-transition: 0.2s;
|
||||
transition: opacity 0.2s;
|
||||
margin: 3px;
|
||||
}
|
||||
|
||||
|
||||
.optionRange::-webkit-slider-thumb {
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
background: var(--my-font-color);
|
||||
cursor: pointer;
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
background: var(--my-font-color);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.optionRange::-moz-range-thumb {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
background: var(--my-font-color);
|
||||
cursor: pointer;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
background: var(--my-font-color);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.noselect {
|
||||
-moz-user-select: -moz-none;
|
||||
-khtml-user-select: none;
|
||||
-webkit-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
-moz-user-select: -moz-none;
|
||||
-khtml-user-select: none;
|
||||
-webkit-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
@ -35,7 +35,7 @@
|
||||
left: 50%;
|
||||
transform: translate(-100%, -100%);
|
||||
|
||||
/* Backwards compatibility */
|
||||
/* Backwards compatibility */
|
||||
-webkit-transform: translate(-100%, -100%);
|
||||
-moz-transform: translate(-100%, -100%);
|
||||
-o-transform: translate(-100%, -100%);
|
||||
@ -126,4 +126,4 @@
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
transition: opacity 0.3s;
|
||||
}
|
||||
}
|
||||
|
@ -7,16 +7,16 @@
|
||||
.Treant.Treant-loaded .pseudo { visibility: visible; }
|
||||
.Treant > .pseudo { width: 0; height: 0; border: none; padding: 0; }
|
||||
.Treant .collapse-switch { width: 3px; height: 3px; display: block; border: 1px solid black; position: absolute; top: 1px; right: 1px; cursor: pointer; }
|
||||
.Treant .collapsed .collapse-switch { background-color: #868DEE; }
|
||||
.Treant .collapsed .collapse-switch { background-color: #868dee; }
|
||||
.Treant > .node img { border: none; float: left; }
|
||||
.Treant > .node {
|
||||
cursor: pointer;
|
||||
padding: 4px;
|
||||
min-width: 60px;
|
||||
text-align: center;
|
||||
border: 2px solid #E8E8E3;
|
||||
border-radius: 2px;
|
||||
box-shadow: 1px 1px 1px rgba(0,0,0,.5);
|
||||
padding: 4px;
|
||||
min-width: 60px;
|
||||
text-align: center;
|
||||
border: 2px solid #e8e8e3;
|
||||
border-radius: 2px;
|
||||
box-shadow: 1px 1px 1px rgba(0,0,0,0.5);
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
|
@ -117,8 +117,8 @@
|
||||
"build:dev": "webpack --mode development",
|
||||
"build:test": "webpack --config webpack.config-test.js",
|
||||
"lint": "npm run lint:jsts & npm run lint:style",
|
||||
"lint:jsts": "eslint '*.{js,jsx,ts,tsx}' './src/**/*.{js,jsx,ts,tsx}' './test/**/*.{js,jsx,ts,tsx}' './utils/**/*.{js,jsx,ts,tsx}'",
|
||||
"lint:style": "stylelint ./css/*",
|
||||
"lint:jsts": "eslint --fix '*.{js,jsx,ts,tsx}' './src/**/*.{js,jsx,ts,tsx}' './test/**/*.{js,jsx,ts,tsx}' './utils/**/*.{js,jsx,ts,tsx}'",
|
||||
"lint:style": "stylelint --fix ./css/*",
|
||||
"preinstall": "node ./scripts/engines-check.js",
|
||||
"test": "mochapack --webpack-config webpack.config-test.js -r jsdom-global/register ./test/index.js",
|
||||
"watch": "webpack --watch --mode production",
|
||||
|
16
src/Alias.ts
16
src/Alias.ts
@ -22,12 +22,12 @@ export function loadGlobalAliases(saveString: string): void {
|
||||
|
||||
// Prints all aliases to terminal
|
||||
export function printAliases(): void {
|
||||
for (var name in Aliases) {
|
||||
for (const name in Aliases) {
|
||||
if (Aliases.hasOwnProperty(name)) {
|
||||
post("alias " + name + "=" + Aliases[name]);
|
||||
}
|
||||
}
|
||||
for (var name in GlobalAliases) {
|
||||
for (const name in GlobalAliases) {
|
||||
if (GlobalAliases.hasOwnProperty(name)) {
|
||||
post("global alias " + name + "=" + GlobalAliases[name]);
|
||||
}
|
||||
@ -36,8 +36,8 @@ export function printAliases(): void {
|
||||
|
||||
// Returns true if successful, false otherwise
|
||||
export function parseAliasDeclaration(dec: string, global = false): boolean {
|
||||
var re = /^([_|\w|!|%|,|@]+)="(.+)"$/;
|
||||
var matches = dec.match(re);
|
||||
const re = /^([_|\w|!|%|,|@]+)="(.+)"$/;
|
||||
const matches = dec.match(re);
|
||||
if (matches == null || matches.length != 3) {return false;}
|
||||
if (global){
|
||||
addGlobalAlias(matches[1],matches[2]);
|
||||
@ -100,17 +100,17 @@ export function substituteAliases(origCommand: string): string {
|
||||
// For the unalias command, dont substite
|
||||
if (commandArray[0] === "unalias") { return commandArray.join(" "); }
|
||||
|
||||
var alias = getAlias(commandArray[0]);
|
||||
const alias = getAlias(commandArray[0]);
|
||||
if (alias != null) {
|
||||
commandArray[0] = alias;
|
||||
} else {
|
||||
var alias = getGlobalAlias(commandArray[0]);
|
||||
const alias = getGlobalAlias(commandArray[0]);
|
||||
if (alias != null) {
|
||||
commandArray[0] = alias;
|
||||
}
|
||||
}
|
||||
for (var i = 0; i < commandArray.length; ++i) {
|
||||
var alias = getGlobalAlias(commandArray[i]);
|
||||
for (let i = 0; i < commandArray.length; ++i) {
|
||||
const alias = getGlobalAlias(commandArray[i]);
|
||||
if (alias != null) {
|
||||
commandArray[i] = alias;
|
||||
}
|
||||
|
@ -49,31 +49,27 @@ interface IConstructorParams {
|
||||
}
|
||||
|
||||
export class Augmentation {
|
||||
// Initiatizes a Augmentation object from a JSON save state.
|
||||
static fromJSON(value: any): Augmentation {
|
||||
return Generic_fromJSON(Augmentation, value.data);
|
||||
}
|
||||
|
||||
// How much money this costs to buy
|
||||
baseCost: number = 0;
|
||||
baseCost = 0;
|
||||
|
||||
// How much faction reputation is required to unlock this
|
||||
baseRepRequirement: number = 0;
|
||||
baseRepRequirement = 0;
|
||||
|
||||
// Description of what this Aug is and what it does
|
||||
info: string = "";
|
||||
info = "";
|
||||
|
||||
// Any Augmentation not immediately available in BitNode-1 is special (e.g. Bladeburner augs)
|
||||
isSpecial: boolean = false;
|
||||
isSpecial = false;
|
||||
|
||||
// Augmentation level - for repeatable Augs like NeuroFlux Governor
|
||||
level: number = 0;
|
||||
level = 0;
|
||||
|
||||
// Name of Augmentation
|
||||
name: string = "";
|
||||
name = "";
|
||||
|
||||
// Whether the player owns this Augmentation
|
||||
owned: boolean = false;
|
||||
owned = false;
|
||||
|
||||
// Array of names of all prerequisites
|
||||
prereqs: string[] = [];
|
||||
@ -83,7 +79,7 @@ export class Augmentation {
|
||||
mults: IMap<number> = {}
|
||||
|
||||
// Initial cost. Doesn't change when you purchase multiple Augmentation
|
||||
startingCost: number = 0;
|
||||
startingCost = 0;
|
||||
|
||||
constructor(params: IConstructorParams={ info: "", moneyCost: 0, name: "", repCost: 0 }) {
|
||||
this.name = params.name;
|
||||
@ -141,7 +137,7 @@ export class Augmentation {
|
||||
console.warn(`In Augmentation.addToFactions(), could not find faction with this name: ${factionList[i]}`);
|
||||
continue;
|
||||
}
|
||||
faction!.augmentations.push(this.name);
|
||||
faction.augmentations.push(this.name);
|
||||
}
|
||||
}
|
||||
|
||||
@ -154,7 +150,7 @@ export class Augmentation {
|
||||
console.warn(`Invalid Faction object in addToAllFactions(). Key value: ${fac}`);
|
||||
continue;
|
||||
}
|
||||
facObj!.augmentations.push(this.name);
|
||||
facObj.augmentations.push(this.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -163,6 +159,12 @@ export class Augmentation {
|
||||
toJSON(): any {
|
||||
return Generic_toJSON("Augmentation", this);
|
||||
}
|
||||
|
||||
// Initiatizes a Augmentation object from a JSON save state.
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
static fromJSON(value: any): Augmentation {
|
||||
return Generic_fromJSON(Augmentation, value.data);
|
||||
}
|
||||
}
|
||||
|
||||
Reviver.constructors.Augmentation = Augmentation;
|
||||
|
@ -8,29 +8,13 @@ import { AugmentationsRoot } from "./ui/Root";
|
||||
import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers";
|
||||
import { CONSTANTS } from "../Constants";
|
||||
import { Factions, factionExists } from "../Faction/Factions";
|
||||
import { startWorkerScript } from "../NetscriptWorker";
|
||||
import { Player } from "../Player";
|
||||
import { prestigeAugmentation } from "../Prestige";
|
||||
import { saveObject } from "../SaveObject";
|
||||
import { RunningScript } from "../Script/RunningScript";
|
||||
import { Script } from "../Script/Script";
|
||||
import { Server } from "../Server/Server";
|
||||
import { OwnedAugmentationsOrderSetting } from "../Settings/SettingEnums";
|
||||
import { Settings } from "../Settings/Settings";
|
||||
import { Page, routing } from "../ui/navigationTracking";
|
||||
|
||||
import { dialogBoxCreate } from "../../utils/DialogBox";
|
||||
import { createAccordionElement } from "../../utils/uiHelpers/createAccordionElement";
|
||||
import {
|
||||
Reviver,
|
||||
Generic_toJSON,
|
||||
Generic_fromJSON
|
||||
} from "../../utils/JSONReviver";
|
||||
import { formatNumber } from "../../utils/StringHelperFunctions";
|
||||
import { clearObject } from "../../utils/helpers/clearObject";
|
||||
import { createElement } from "../../utils/uiHelpers/createElement";
|
||||
import { isString } from "../../utils/helpers/isString";
|
||||
import { removeChildrenFromElement } from "../../utils/uiHelpers/removeChildrenFromElement";
|
||||
import { Money } from "../ui/React/Money";
|
||||
|
||||
import React from "react";
|
||||
@ -1256,7 +1240,7 @@ function initAugmentations() {
|
||||
// Daedalus
|
||||
const RedPill = new Augmentation({
|
||||
name:AugmentationNames.TheRedPill, repCost:1e6, moneyCost:0,
|
||||
info:"It's time to leave the cave."
|
||||
info:"It's time to leave the cave.",
|
||||
});
|
||||
RedPill.addToFactions(["Daedalus"]);
|
||||
if (augmentationExists(AugmentationNames.TheRedPill)) {
|
||||
@ -1556,7 +1540,7 @@ function initAugmentations() {
|
||||
and upload the assets.<br /><br />
|
||||
This augmentation:<br />
|
||||
Lets the player start with {Money(1e6)} after a reset.<br />
|
||||
Lets the player start with the BruteSSH.exe program after a reset.</>
|
||||
Lets the player start with the BruteSSH.exe program after a reset.</>,
|
||||
});
|
||||
CashRoot.addToFactions(["Sector-12"]);
|
||||
if (augmentationExists(AugmentationNames.CashRoot)) {
|
||||
@ -2098,7 +2082,7 @@ export function displayAugmentationsContent(contentEl) {
|
||||
exportGameFn={saveObject.exportGame.bind(saveObject)}
|
||||
installAugmentationsFn={installAugmentations}
|
||||
/>,
|
||||
contentEl
|
||||
contentEl,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { Augmentation } from "./Augmentation";
|
||||
import { IMap } from "../types";
|
||||
|
||||
export let Augmentations: IMap<Augmentation> = {};
|
||||
export const Augmentations: IMap<Augmentation> = {};
|
||||
|
@ -1,8 +1,8 @@
|
||||
export class PlayerOwnedAugmentation {
|
||||
level: number = 1;
|
||||
name: string = "";
|
||||
level = 1;
|
||||
name = "";
|
||||
|
||||
constructor(name: string = "") {
|
||||
constructor(name = "") {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { IMap } from "../../types";
|
||||
|
||||
export let AugmentationNames: IMap<string> = {
|
||||
export const AugmentationNames: IMap<string> = {
|
||||
Targeting1: "Augmented Targeting I",
|
||||
Targeting2: "Augmented Targeting II",
|
||||
Targeting3: "Augmented Targeting III",
|
||||
|
@ -15,7 +15,9 @@ import { SourceFileMinus1 } from "./SourceFileMinus1";
|
||||
import { Settings } from "../../Settings/Settings";
|
||||
import { OwnedAugmentationsOrderSetting } from "../../Settings/SettingEnums";
|
||||
|
||||
type IProps = {}
|
||||
type IProps = {
|
||||
// nothing special.
|
||||
}
|
||||
|
||||
type IState = {
|
||||
rerenderFlag: boolean;
|
||||
@ -39,7 +41,7 @@ export class InstalledAugmentationsAndSourceFiles extends React.Component<IProps
|
||||
this.listRef = React.createRef();
|
||||
}
|
||||
|
||||
collapseAllHeaders() {
|
||||
collapseAllHeaders(): void {
|
||||
const ul = this.listRef.current;
|
||||
if (ul == null) { return; }
|
||||
const tickers = ul.getElementsByClassName("accordion-header");
|
||||
@ -55,7 +57,7 @@ export class InstalledAugmentationsAndSourceFiles extends React.Component<IProps
|
||||
}
|
||||
}
|
||||
|
||||
expandAllHeaders() {
|
||||
expandAllHeaders(): void {
|
||||
const ul = this.listRef.current;
|
||||
if (ul == null) { return; }
|
||||
const tickers = ul.getElementsByClassName("accordion-header");
|
||||
@ -71,7 +73,7 @@ export class InstalledAugmentationsAndSourceFiles extends React.Component<IProps
|
||||
}
|
||||
}
|
||||
|
||||
rerender() {
|
||||
rerender(): void {
|
||||
this.setState((prevState) => {
|
||||
return {
|
||||
rerenderFlag: !prevState.rerenderFlag,
|
||||
@ -79,17 +81,17 @@ export class InstalledAugmentationsAndSourceFiles extends React.Component<IProps
|
||||
});
|
||||
}
|
||||
|
||||
sortByAcquirementTime() {
|
||||
sortByAcquirementTime(): void {
|
||||
Settings.OwnedAugmentationsOrder = OwnedAugmentationsOrderSetting.AcquirementTime;
|
||||
this.rerender();
|
||||
}
|
||||
|
||||
sortInOrder() {
|
||||
sortInOrder(): void {
|
||||
Settings.OwnedAugmentationsOrder = OwnedAugmentationsOrderSetting.Alphabetically
|
||||
this.rerender();
|
||||
}
|
||||
|
||||
render() {
|
||||
render(): React.ReactNode {
|
||||
return (
|
||||
<>
|
||||
<ListConfiguration
|
||||
|
@ -7,7 +7,7 @@ import { Player } from "../../Player";
|
||||
import { numeralWrapper } from "../../ui/numeralFormat";
|
||||
import { Augmentations} from "../Augmentations";
|
||||
|
||||
function calculateAugmentedStats() {
|
||||
function calculateAugmentedStats(): any {
|
||||
const augP: any = {};
|
||||
for(const aug of Player.queuedAugmentations) {
|
||||
const augObj = Augmentations[aug.name];
|
||||
@ -22,12 +22,12 @@ function calculateAugmentedStats() {
|
||||
export function PlayerMultipliers(): React.ReactElement {
|
||||
const mults = calculateAugmentedStats();
|
||||
function MultiplierTable(rows: any[]): React.ReactElement {
|
||||
function improvements(r: number) {
|
||||
let elems: any[] = [];
|
||||
function improvements(r: number): JSX.Element[] {
|
||||
let elems: JSX.Element[] = [];
|
||||
if(r) {
|
||||
elems = [
|
||||
<td key="2"> {"=>"} </td>,
|
||||
<td key="3">{numeralWrapper.formatPercentage(r)}</td>
|
||||
<td key="3">{numeralWrapper.formatPercentage(r)}</td>,
|
||||
];
|
||||
}
|
||||
return elems;
|
||||
@ -51,38 +51,38 @@ export function PlayerMultipliers(): React.ReactElement {
|
||||
['Hacking Chance ', Player.hacking_chance_mult, Player.hacking_chance_mult*mults.hacking_chance_mult],
|
||||
['Hacking Speed ', Player.hacking_speed_mult, Player.hacking_speed_mult*mults.hacking_speed_mult],
|
||||
['Hacking Money ', Player.hacking_money_mult, Player.hacking_money_mult*mults.hacking_money_mult],
|
||||
['Hacking Growth ', Player.hacking_grow_mult, Player.hacking_grow_mult*mults.hacking_grow_mult]
|
||||
['Hacking Growth ', Player.hacking_grow_mult, Player.hacking_grow_mult*mults.hacking_grow_mult],
|
||||
])}<br />
|
||||
|
||||
{MultiplierTable([
|
||||
['Hacking Level ', Player.hacking_mult, Player.hacking_mult*mults.hacking_mult],
|
||||
['Hacking Experience ', Player.hacking_exp_mult, Player.hacking_exp_mult*mults.hacking_exp_mult]
|
||||
['Hacking Experience ', Player.hacking_exp_mult, Player.hacking_exp_mult*mults.hacking_exp_mult],
|
||||
])}<br />
|
||||
|
||||
|
||||
{MultiplierTable([
|
||||
['Strength Level ', Player.strength_mult, Player.strength_mult*mults.strength_mult],
|
||||
['Strength Experience ', Player.strength_exp_mult, Player.strength_exp_mult*mults.strength_exp_mult]
|
||||
['Strength Experience ', Player.strength_exp_mult, Player.strength_exp_mult*mults.strength_exp_mult],
|
||||
])}<br />
|
||||
|
||||
{MultiplierTable([
|
||||
['Defense Level ', Player.defense_mult, Player.defense_mult*mults.defense_mult],
|
||||
['Defense Experience ', Player.defense_exp_mult, Player.defense_exp_mult*mults.defense_exp_mult]
|
||||
['Defense Experience ', Player.defense_exp_mult, Player.defense_exp_mult*mults.defense_exp_mult],
|
||||
])}<br />
|
||||
|
||||
{MultiplierTable([
|
||||
['Dexterity Level ', Player.dexterity_mult, Player.dexterity_mult*mults.dexterity_mult],
|
||||
['Dexterity Experience ', Player.dexterity_exp_mult, Player.dexterity_exp_mult*mults.dexterity_exp_mult]
|
||||
['Dexterity Experience ', Player.dexterity_exp_mult, Player.dexterity_exp_mult*mults.dexterity_exp_mult],
|
||||
])}<br />
|
||||
|
||||
{MultiplierTable([
|
||||
['Agility Level ', Player.agility_mult, Player.agility_mult*mults.agility_mult],
|
||||
['Agility Experience ', Player.agility_exp_mult, Player.agility_exp_mult*mults.agility_exp_mult]
|
||||
['Agility Experience ', Player.agility_exp_mult, Player.agility_exp_mult*mults.agility_exp_mult],
|
||||
])}<br />
|
||||
|
||||
{MultiplierTable([
|
||||
['Charisma Level ', Player.charisma_mult, Player.charisma_mult*mults.charisma_mult],
|
||||
['Charisma Experience ', Player.charisma_exp_mult, Player.charisma_exp_mult*mults.charisma_exp_mult]
|
||||
['Charisma Experience ', Player.charisma_exp_mult, Player.charisma_exp_mult*mults.charisma_exp_mult],
|
||||
])}<br />
|
||||
|
||||
{MultiplierTable([
|
||||
@ -90,13 +90,13 @@ export function PlayerMultipliers(): React.ReactElement {
|
||||
['Hacknet Node purchase cost ', Player.hacknet_node_purchase_cost_mult, Player.hacknet_node_purchase_cost_mult*mults.hacknet_node_purchase_cost_mult],
|
||||
['Hacknet Node RAM upgrade cost ', Player.hacknet_node_ram_cost_mult, Player.hacknet_node_ram_cost_mult*mults.hacknet_node_ram_cost_mult],
|
||||
['Hacknet Node Core purchase cost ', Player.hacknet_node_core_cost_mult, Player.hacknet_node_core_cost_mult*mults.hacknet_node_core_cost_mult],
|
||||
['Hacknet Node level upgrade cost ', Player.hacknet_node_level_cost_mult, Player.hacknet_node_level_cost_mult*mults.hacknet_node_level_cost_mult]
|
||||
['Hacknet Node level upgrade cost ', Player.hacknet_node_level_cost_mult, Player.hacknet_node_level_cost_mult*mults.hacknet_node_level_cost_mult],
|
||||
])}<br />
|
||||
|
||||
{MultiplierTable([
|
||||
['Company reputation gain ', Player.company_rep_mult, Player.company_rep_mult*mults.company_rep_mult],
|
||||
['Faction reputation gain ', Player.faction_rep_mult, Player.faction_rep_mult*mults.faction_rep_mult],
|
||||
['Salary ', Player.work_money_mult, Player.work_money_mult*mults.work_money_mult]
|
||||
['Salary ', Player.work_money_mult, Player.work_money_mult*mults.work_money_mult],
|
||||
])}<br />
|
||||
|
||||
{MultiplierTable([
|
||||
|
@ -22,7 +22,7 @@ export function PurchasedAugmentations(): React.ReactElement {
|
||||
augs.push(
|
||||
<li key={`${ownedAug.name}${ownedAug.level}`}>
|
||||
<AugmentationAccordion aug={aug} level={level} />
|
||||
</li>
|
||||
</li>,
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -25,7 +25,7 @@ export class AugmentationsRoot extends React.Component<IProps, IState> {
|
||||
super(props);
|
||||
}
|
||||
|
||||
render() {
|
||||
render(): React.ReactNode {
|
||||
return (
|
||||
<div id="augmentations-content">
|
||||
<h1>Purchased Augmentations</h1>
|
||||
|
@ -5,15 +5,12 @@
|
||||
import * as React from "react";
|
||||
|
||||
import { Player } from "../../Player";
|
||||
import { Settings } from "../../Settings/Settings";
|
||||
import { OwnedAugmentationsOrderSetting } from "../../Settings/SettingEnums";
|
||||
import { SourceFiles } from "../../SourceFile/SourceFiles";
|
||||
import { Exploit, ExploitName } from "../../Exploits/Exploit";
|
||||
|
||||
import { Accordion } from "../../ui/React/Accordion";
|
||||
|
||||
export function SourceFileMinus1(): React.ReactElement {
|
||||
let exploits = Player.exploits;
|
||||
const exploits = Player.exploits;
|
||||
|
||||
if(exploits.length === 0) {
|
||||
return <></>
|
||||
|
@ -16,7 +16,7 @@ class BitNode {
|
||||
number: number;
|
||||
|
||||
|
||||
constructor(n: number, name: string, desc: string="", info: string="") {
|
||||
constructor(n: number, name: string, desc="", info="") {
|
||||
this.number = n;
|
||||
this.name = name;
|
||||
this.desc = desc;
|
||||
@ -252,11 +252,11 @@ BitNodes["BitNode22"] = new BitNode(22, "", "COMING SOON");
|
||||
BitNodes["BitNode23"] = new BitNode(23, "", "COMING SOON");
|
||||
BitNodes["BitNode24"] = new BitNode(24, "", "COMING SOON");
|
||||
|
||||
export function initBitNodeMultipliers(p: IPlayer) {
|
||||
export function initBitNodeMultipliers(p: IPlayer): void {
|
||||
if (p.bitNodeN == null) {
|
||||
p.bitNodeN = 1;
|
||||
}
|
||||
for (var mult in BitNodeMultipliers) {
|
||||
for (const mult in BitNodeMultipliers) {
|
||||
if (BitNodeMultipliers.hasOwnProperty(mult)) {
|
||||
BitNodeMultipliers[mult] = 1;
|
||||
}
|
||||
@ -433,15 +433,15 @@ export function initBitNodeMultipliers(p: IPlayer) {
|
||||
BitNodeMultipliers.FourSigmaMarketDataCost = 4;
|
||||
BitNodeMultipliers.FourSigmaMarketDataApiCost = 4;
|
||||
break;
|
||||
case 12: //The Recursion
|
||||
var sf12Lvl = 0;
|
||||
for (var i = 0; i < p.sourceFiles.length; i++) {
|
||||
case 12: { //The Recursion
|
||||
let sf12Lvl = 0;
|
||||
for (let i = 0; i < p.sourceFiles.length; i++) {
|
||||
if (p.sourceFiles[i].n === 12) {
|
||||
sf12Lvl = p.sourceFiles[i].lvl;
|
||||
}
|
||||
}
|
||||
var inc = Math.pow(1.02, sf12Lvl);
|
||||
var dec = 1/inc;
|
||||
const inc = Math.pow(1.02, sf12Lvl);
|
||||
const dec = 1/inc;
|
||||
|
||||
// Multiplier for number of augs needed for Daedalus increases
|
||||
// up to a maximum of 1.34, which results in 40 Augs required
|
||||
@ -499,6 +499,7 @@ export function initBitNodeMultipliers(p: IPlayer) {
|
||||
BitNodeMultipliers.BladeburnerRank = dec;
|
||||
BitNodeMultipliers.BladeburnerSkillCost = inc;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
console.warn("Player.bitNodeN invalid");
|
||||
break;
|
||||
|
@ -1,7 +1,6 @@
|
||||
import { Augmentations } from "./Augmentation/Augmentations";
|
||||
import { AugmentationNames } from "./Augmentation/data/AugmentationNames";
|
||||
import { BitNodeMultipliers } from "./BitNode/BitNodeMultipliers";
|
||||
import { CONSTANTS } from "./Constants";
|
||||
import { Engine } from "./engine";
|
||||
import { Faction } from "./Faction/Faction";
|
||||
import { Factions, factionExists } from "./Faction/Factions";
|
||||
@ -17,17 +16,19 @@ import { dialogBoxCreate } from "../utils/DialogBox";
|
||||
import {
|
||||
Reviver,
|
||||
Generic_toJSON,
|
||||
Generic_fromJSON
|
||||
Generic_fromJSON,
|
||||
} from "../utils/JSONReviver";
|
||||
import { setTimeoutRef } from "./utils/SetTimeoutRef";
|
||||
import { formatNumber } from "../utils/StringHelperFunctions";
|
||||
import {
|
||||
formatNumber,
|
||||
convertTimeMsToTimeElapsedString,
|
||||
} from "../utils/StringHelperFunctions";
|
||||
|
||||
import { ConsoleHelpText } from "./Bladeburner/data/Help";
|
||||
import { City } from "./Bladeburner/City";
|
||||
import { BladeburnerConstants } from "./Bladeburner/data/Constants";
|
||||
import { Skill } from "./Bladeburner/Skill";
|
||||
import { Skills } from "./Bladeburner/Skills";
|
||||
import { SkillNames } from "./Bladeburner/data/SkillNames";
|
||||
import { Operation } from "./Bladeburner/Operation";
|
||||
import { BlackOperation } from "./Bladeburner/BlackOperation";
|
||||
import { BlackOperations } from "./Bladeburner/BlackOperations";
|
||||
@ -45,7 +46,6 @@ import { KEY } from "../utils/helpers/keyCodes";
|
||||
|
||||
import { removeChildrenFromElement } from "../utils/uiHelpers/removeChildrenFromElement";
|
||||
import { appendLineBreaks } from "../utils/uiHelpers/appendLineBreaks";
|
||||
import { convertTimeMsToTimeElapsedString } from "../utils/StringHelperFunctions";
|
||||
import { createElement } from "../utils/uiHelpers/createElement";
|
||||
import { createPopup } from "../utils/uiHelpers/createPopup";
|
||||
import { removeElement } from "../utils/uiHelpers/removeElement";
|
||||
@ -236,7 +236,7 @@ Bladeburner.prototype.create = function() {
|
||||
count:getRandomInt(25, 150), countGrowth:getRandomInt(5, 75)/10,
|
||||
weights:{hack:0,str:0.05,def:0.05,dex:0.35,agi:0.35,cha:0.1, int:0.05},
|
||||
decays:{hack:0,str:0.91,def:0.91,dex:0.91,agi:0.91,cha:0.9, int:1},
|
||||
isStealth:true
|
||||
isStealth:true,
|
||||
});
|
||||
this.contracts["Bounty Hunter"] = new Contract({
|
||||
name:"Bounty Hunter",
|
||||
@ -248,7 +248,7 @@ Bladeburner.prototype.create = function() {
|
||||
count:getRandomInt(5, 150), countGrowth:getRandomInt(5, 75)/10,
|
||||
weights:{hack:0,str:0.15,def:0.15,dex:0.25,agi:0.25,cha:0.1, int:0.1},
|
||||
decays:{hack:0,str:0.91,def:0.91,dex:0.91,agi:0.91,cha:0.8, int:0.9},
|
||||
isKill:true
|
||||
isKill:true,
|
||||
});
|
||||
this.contracts["Retirement"] = new Contract({
|
||||
name:"Retirement",
|
||||
@ -260,7 +260,7 @@ Bladeburner.prototype.create = function() {
|
||||
count:getRandomInt(5, 150), countGrowth:getRandomInt(5, 75)/10,
|
||||
weights:{hack:0,str:0.2,def:0.2,dex:0.2,agi:0.2,cha:0.1, int:0.1},
|
||||
decays:{hack:0,str:0.91,def:0.91,dex:0.91,agi:0.91,cha:0.8, int:0.9},
|
||||
isKill:true
|
||||
isKill:true,
|
||||
});
|
||||
|
||||
this.operations["Investigation"] = new Operation({
|
||||
@ -275,7 +275,7 @@ Bladeburner.prototype.create = function() {
|
||||
count:getRandomInt(1, 100), countGrowth:getRandomInt(10, 40)/10,
|
||||
weights:{hack:0.25,str:0.05,def:0.05,dex:0.2,agi:0.1,cha:0.25, int:0.1},
|
||||
decays:{hack:0.85,str:0.9,def:0.9,dex:0.9,agi:0.9,cha:0.7, int:0.9},
|
||||
isStealth:true
|
||||
isStealth:true,
|
||||
});
|
||||
this.operations["Undercover Operation"] = new Operation({
|
||||
name:"Undercover Operation",
|
||||
@ -288,7 +288,7 @@ Bladeburner.prototype.create = function() {
|
||||
count:getRandomInt(1, 100), countGrowth:getRandomInt(10, 40)/10,
|
||||
weights:{hack:0.2,str:0.05,def:0.05,dex:0.2,agi:0.2,cha:0.2, int:0.1},
|
||||
decays:{hack:0.8,str:0.9,def:0.9,dex:0.9,agi:0.9,cha:0.7, int:0.9},
|
||||
isStealth:true
|
||||
isStealth:true,
|
||||
});
|
||||
this.operations["Sting Operation"] = new Operation({
|
||||
name:"Sting Operation",
|
||||
@ -299,7 +299,7 @@ Bladeburner.prototype.create = function() {
|
||||
count:getRandomInt(1, 150), countGrowth:getRandomInt(3, 40)/10,
|
||||
weights:{hack:0.25,str:0.05,def:0.05,dex:0.25,agi:0.1,cha:0.2, int:0.1},
|
||||
decays:{hack:0.8,str:0.85,def:0.85,dex:0.85,agi:0.85,cha:0.7, int:0.9},
|
||||
isStealth:true
|
||||
isStealth:true,
|
||||
});
|
||||
this.operations["Raid"] = new Operation({
|
||||
name:"Raid",
|
||||
@ -311,7 +311,7 @@ Bladeburner.prototype.create = function() {
|
||||
count:getRandomInt(1, 150), countGrowth:getRandomInt(2, 40)/10,
|
||||
weights:{hack:0.1,str:0.2,def:0.2,dex:0.2,agi:0.2,cha:0, int:0.1},
|
||||
decays:{hack:0.7,str:0.8,def:0.8,dex:0.8,agi:0.8,cha:0, int:0.9},
|
||||
isKill:true
|
||||
isKill:true,
|
||||
});
|
||||
this.operations["Stealth Retirement Operation"] = new Operation({
|
||||
name:"Stealth Retirement Operation",
|
||||
@ -323,7 +323,7 @@ Bladeburner.prototype.create = function() {
|
||||
count:getRandomInt(1, 150), countGrowth:getRandomInt(1, 20)/10,
|
||||
weights:{hack:0.1,str:0.1,def:0.1,dex:0.3,agi:0.3,cha:0, int:0.1},
|
||||
decays:{hack:0.7,str:0.8,def:0.8,dex:0.8,agi:0.8,cha:0, int:0.9},
|
||||
isStealth:true, isKill:true
|
||||
isStealth:true, isKill:true,
|
||||
});
|
||||
this.operations["Assassination"] = new Operation({
|
||||
name:"Assassination",
|
||||
@ -335,7 +335,7 @@ Bladeburner.prototype.create = function() {
|
||||
count:getRandomInt(1, 150), countGrowth:getRandomInt(1, 20)/10,
|
||||
weights:{hack:0.1,str:0.1,def:0.1,dex:0.3,agi:0.3,cha:0, int:0.1},
|
||||
decays:{hack:0.6,str:0.8,def:0.8,dex:0.8,agi:0.8,cha:0, int:0.8},
|
||||
isStealth:true, isKill:true
|
||||
isStealth:true, isKill:true,
|
||||
});
|
||||
}
|
||||
|
||||
@ -1271,7 +1271,7 @@ Bladeburner.prototype.createContent = function() {
|
||||
DomElems.consoleInput.focus();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
DomElems.consoleTable = createElement("table", {class:"bladeburner-console-table"});
|
||||
DomElems.consoleInputRow = createElement("tr", {class:"bladeburner-console-input-row", id:"bladeburner-console-input-row"});
|
||||
@ -1279,7 +1279,7 @@ Bladeburner.prototype.createContent = function() {
|
||||
DomElems.consoleInputHeader = createElement("pre", {innerText:"> "});
|
||||
DomElems.consoleInput = createElement("input", {
|
||||
type:"text", class:"bladeburner-console-input", tabIndex:1,
|
||||
onfocus:() => {DomElems.consoleInput.value = DomElems.consoleInput.value}
|
||||
onfocus:() => {DomElems.consoleInput.value = DomElems.consoleInput.value},
|
||||
});
|
||||
|
||||
DomElems.consoleInputCell.appendChild(DomElems.consoleInputHeader);
|
||||
@ -1363,7 +1363,7 @@ Bladeburner.prototype.createOverviewContent = function() {
|
||||
innerText:"Est. Synthoid Population: ",
|
||||
display:"inline-block",
|
||||
tooltip:"This is your Bladeburner division's estimate of how many Synthoids exist " +
|
||||
"in your current city."
|
||||
"in your current city.",
|
||||
});
|
||||
|
||||
DomElems.overviewEstPopHelpTip = createElement("div", {
|
||||
@ -1381,7 +1381,7 @@ Bladeburner.prototype.createOverviewContent = function() {
|
||||
"The Synthoid populations of cities can change due to your " +
|
||||
"actions or random events. If random events occur, they will " +
|
||||
"be logged in the Bladeburner Console.");
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
DomElems.overviewEstComms = createElement("p", {
|
||||
@ -1395,14 +1395,14 @@ Bladeburner.prototype.createOverviewContent = function() {
|
||||
innerText:"City Chaos: ",
|
||||
display:"inline-block",
|
||||
tooltip:"The city's chaos level due to tensions and conflicts between humans and Synthoids. " +
|
||||
"Having too high of a chaos level can make contracts and operations harder."
|
||||
"Having too high of a chaos level can make contracts and operations harder.",
|
||||
});
|
||||
|
||||
DomElems.overviewBonusTime = createElement("p", {
|
||||
innerText: "Bonus time: ",
|
||||
display: "inline-block",
|
||||
tooltip: "You gain bonus time while offline or when the game is inactive (e.g. when the tab is throttled by browser). " +
|
||||
"Bonus time makes the Bladeburner mechanic progress faster, up to 5x the normal speed."
|
||||
"Bonus time makes the Bladeburner mechanic progress faster, up to 5x the normal speed.",
|
||||
});
|
||||
DomElems.overviewSkillPoints = createElement("p", {display:"block"});
|
||||
|
||||
@ -1438,7 +1438,7 @@ Bladeburner.prototype.createOverviewContent = function() {
|
||||
innerText:"Cancel", class:"a-link-button",
|
||||
clickListener:() => {
|
||||
removeElementById(popupId); return false;
|
||||
}
|
||||
},
|
||||
}))
|
||||
popupArguments.push(createElement("p", { // Info Text
|
||||
innerText:"Travel to a different city for your Bladeburner " +
|
||||
@ -1460,12 +1460,12 @@ Bladeburner.prototype.createOverviewContent = function() {
|
||||
removeElementById(popupId);
|
||||
inst.updateOverviewContent();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
}));
|
||||
})(this, i);
|
||||
}
|
||||
createPopup(popupId, popupArguments);
|
||||
}
|
||||
},
|
||||
}));
|
||||
|
||||
// Faction button
|
||||
@ -1493,7 +1493,7 @@ Bladeburner.prototype.createOverviewContent = function() {
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
},
|
||||
}));
|
||||
}
|
||||
|
||||
@ -1526,14 +1526,14 @@ Bladeburner.prototype.createActionAndSkillsContent = function() {
|
||||
DomElems.currentTab = buttons[i].toLowerCase();
|
||||
inst.createActionAndSkillsContent();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
}));
|
||||
}) (buttons, i, this, currTab);
|
||||
}
|
||||
|
||||
// General info/description for each action
|
||||
DomElems.actionsAndSkillsDesc = createElement("p", {
|
||||
display:"block", margin:"4px", padding:"4px"
|
||||
display:"block", margin:"4px", padding:"4px",
|
||||
});
|
||||
|
||||
// List for actions/skills
|
||||
@ -1578,7 +1578,7 @@ Bladeburner.prototype.createGeneralActionsContent = function() {
|
||||
for (var actionName in GeneralActions) {
|
||||
if (GeneralActions.hasOwnProperty(actionName)) {
|
||||
DomElems.generalActions[actionName] = createElement("div", {
|
||||
class:"bladeburner-action", name:actionName
|
||||
class:"bladeburner-action", name:actionName,
|
||||
});
|
||||
DomElems.actionsAndSkillsList.appendChild(DomElems.generalActions[actionName]);
|
||||
}
|
||||
@ -1600,7 +1600,7 @@ Bladeburner.prototype.createContractsContent = function() {
|
||||
for (var contractName in this.contracts) {
|
||||
if (this.contracts.hasOwnProperty(contractName)) {
|
||||
DomElems.contracts[contractName] = createElement("div", {
|
||||
class:"bladeburner-action", name:contractName
|
||||
class:"bladeburner-action", name:contractName,
|
||||
});
|
||||
DomElems.actionsAndSkillsList.appendChild(DomElems.contracts[contractName]);
|
||||
}
|
||||
@ -1629,7 +1629,7 @@ Bladeburner.prototype.createOperationsContent = function() {
|
||||
for (var operationName in this.operations) {
|
||||
if (this.operations.hasOwnProperty(operationName)) {
|
||||
DomElems.operations[operationName] = createElement("div", {
|
||||
class:"bladeburner-action", name:operationName
|
||||
class:"bladeburner-action", name:operationName,
|
||||
});
|
||||
DomElems.actionsAndSkillsList.appendChild(DomElems.operations[operationName]);
|
||||
}
|
||||
@ -1667,7 +1667,7 @@ Bladeburner.prototype.createBlackOpsContent = function() {
|
||||
for (var i = blackops.length-1; i >= 0 ; --i) {
|
||||
if (this.blackops[[blackops[i].name]] == null && i !== 0 && this.blackops[[blackops[i-1].name]] == null) {continue;} // If this one nor the next are completed then this isn't unlocked yet.
|
||||
DomElems.blackops[blackops[i].name] = createElement("div", {
|
||||
class:"bladeburner-action", name:blackops[i].name
|
||||
class:"bladeburner-action", name:blackops[i].name,
|
||||
});
|
||||
DomElems.actionsAndSkillsList.appendChild(DomElems.blackops[blackops[i].name]);
|
||||
}
|
||||
@ -1750,7 +1750,7 @@ Bladeburner.prototype.createSkillsContent = function() {
|
||||
|
||||
// Skill Points
|
||||
DomElems.skillPointsDisplay = createElement("p", {
|
||||
innerHTML:"<br><strong>Skill Points: " + formatNumber(this.skillPoints, 0) + "</strong>"
|
||||
innerHTML:"<br><strong>Skill Points: " + formatNumber(this.skillPoints, 0) + "</strong>",
|
||||
});
|
||||
DomElems.actionAndSkillsDiv.appendChild(DomElems.skillPointsDisplay);
|
||||
|
||||
@ -1758,7 +1758,7 @@ Bladeburner.prototype.createSkillsContent = function() {
|
||||
for (var skillName in Skills) {
|
||||
if (Skills.hasOwnProperty(skillName)) {
|
||||
DomElems.skills[skillName] = createElement("div", {
|
||||
class:"bladeburner-action", name:skillName
|
||||
class:"bladeburner-action", name:skillName,
|
||||
});
|
||||
DomElems.actionsAndSkillsList.appendChild(DomElems.skills[skillName]);
|
||||
}
|
||||
@ -1902,7 +1902,7 @@ Bladeburner.prototype.updateGeneralActionsUIElement = function(el, action) {
|
||||
var progress = this.actionTimeCurrent / this.actionTimeToComplete;
|
||||
el.appendChild(createElement("p", {
|
||||
display:"block",
|
||||
innerText:createProgressBarText({progress:progress})
|
||||
innerText:createProgressBarText({progress:progress}),
|
||||
}));
|
||||
} else {
|
||||
// Start button
|
||||
@ -1915,13 +1915,13 @@ Bladeburner.prototype.updateGeneralActionsUIElement = function(el, action) {
|
||||
this.startAction(this.action);
|
||||
this.updateActionAndSkillsContent();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
}));
|
||||
}
|
||||
|
||||
appendLineBreaks(el, 2);
|
||||
el.appendChild(createElement("pre", { // Info
|
||||
innerHTML:action.desc, display:"inline-block"
|
||||
innerHTML:action.desc, display:"inline-block",
|
||||
}));
|
||||
|
||||
|
||||
@ -1937,14 +1937,14 @@ Bladeburner.prototype.updateContractsUIElement = function(el, action) {
|
||||
formatNumber(this.actionTimeCurrent, 0) + " / " +
|
||||
formatNumber(this.actionTimeToComplete, 0) + ")"
|
||||
: action.name,
|
||||
display:"inline-block"
|
||||
display:"inline-block",
|
||||
}));
|
||||
|
||||
if (isActive) { // Progress bar if its active
|
||||
var progress = this.actionTimeCurrent / this.actionTimeToComplete;
|
||||
el.appendChild(createElement("p", {
|
||||
display:"block",
|
||||
innerText:createProgressBarText({progress:progress})
|
||||
innerText:createProgressBarText({progress:progress}),
|
||||
}));
|
||||
} else { // Start button
|
||||
el.appendChild(createElement("a", {
|
||||
@ -1956,7 +1956,7 @@ Bladeburner.prototype.updateContractsUIElement = function(el, action) {
|
||||
this.startAction(this.action);
|
||||
this.updateActionAndSkillsContent();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
}));
|
||||
}
|
||||
|
||||
@ -1967,7 +1967,7 @@ Bladeburner.prototype.updateContractsUIElement = function(el, action) {
|
||||
display:"inline-block",
|
||||
innerText:"Level: " + action.level + " / " + action.maxLevel,
|
||||
tooltip:action.getSuccessesNeededForNextLevel(BladeburnerConstants.ContractSuccessesPerLevel) + " successes " +
|
||||
"needed for next level"
|
||||
"needed for next level",
|
||||
}));
|
||||
el.appendChild(createElement("a", {
|
||||
class: maxLevel ? "a-link-button-inactive" : "a-link-button", innerHTML:"↑",
|
||||
@ -1979,7 +1979,7 @@ Bladeburner.prototype.updateContractsUIElement = function(el, action) {
|
||||
if (isActive) {this.startAction(this.action);} // Restart Action
|
||||
this.updateContractsUIElement(el, action);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
}));
|
||||
el.appendChild(createElement("a", {
|
||||
class: (action.level <= 1) ? "a-link-button-inactive" : "a-link-button", innerHTML:"↓",
|
||||
@ -1991,7 +1991,7 @@ Bladeburner.prototype.updateContractsUIElement = function(el, action) {
|
||||
if (isActive) {this.startAction(this.action);} // Restart Action
|
||||
this.updateContractsUIElement(el, action);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
}));
|
||||
|
||||
var actionTime = action.getActionTime(this);
|
||||
@ -2011,7 +2011,7 @@ Bladeburner.prototype.updateContractsUIElement = function(el, action) {
|
||||
var autolevelCheckboxId = "bladeburner-" + action.name + "-autolevel-checkbox";
|
||||
el.appendChild(createElement("label", {
|
||||
for:autolevelCheckboxId, innerText:"Autolevel: ",color:"white",
|
||||
tooltip:"Automatically increase contract level when possible"
|
||||
tooltip:"Automatically increase contract level when possible",
|
||||
}));
|
||||
|
||||
const checkboxInput = createElement("input", {
|
||||
@ -2035,14 +2035,14 @@ Bladeburner.prototype.updateOperationsUIElement = function(el, action) {
|
||||
formatNumber(this.actionTimeCurrent, 0) + " / " +
|
||||
formatNumber(this.actionTimeToComplete, 0) + ")"
|
||||
: action.name,
|
||||
display:"inline-block"
|
||||
display:"inline-block",
|
||||
}));
|
||||
|
||||
if (isActive) { // Progress bar if its active
|
||||
var progress = this.actionTimeCurrent / this.actionTimeToComplete;
|
||||
el.appendChild(createElement("p", {
|
||||
display:"block",
|
||||
innerText:createProgressBarText({progress:progress})
|
||||
innerText:createProgressBarText({progress:progress}),
|
||||
}));
|
||||
} else { // Start button and set Team Size button
|
||||
el.appendChild(createElement("a", {
|
||||
@ -2054,7 +2054,7 @@ Bladeburner.prototype.updateOperationsUIElement = function(el, action) {
|
||||
this.startAction(this.action);
|
||||
this.updateActionAndSkillsContent();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
}));
|
||||
el.appendChild(createElement("a", {
|
||||
innerText:"Set Team Size (Curr Size: " + formatNumber(action.teamCount, 0) + ")", class:"a-link-button",
|
||||
@ -2065,7 +2065,7 @@ Bladeburner.prototype.updateOperationsUIElement = function(el, action) {
|
||||
innerText:"Enter the amount of team members you would like to take on these " +
|
||||
"operations. If you do not have the specified number of team members, " +
|
||||
"then as many as possible will be used. Note that team members may " +
|
||||
"be lost during operations."
|
||||
"be lost during operations.",
|
||||
|
||||
});
|
||||
var input = createElement("input", {
|
||||
@ -2083,17 +2083,17 @@ Bladeburner.prototype.updateOperationsUIElement = function(el, action) {
|
||||
}
|
||||
removeElementById(popupId);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
var cancelBtn = createElement("a", {
|
||||
innerText:"Cancel", class:"a-link-button",
|
||||
clickListener:() => {
|
||||
removeElementById(popupId);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
createPopup(popupId, [txt, input, setBtn, cancelBtn]);
|
||||
}
|
||||
},
|
||||
}));
|
||||
}
|
||||
|
||||
@ -2104,7 +2104,7 @@ Bladeburner.prototype.updateOperationsUIElement = function(el, action) {
|
||||
display:"inline-block",
|
||||
innerText:"Level: " + action.level + " / " + action.maxLevel,
|
||||
tooltip:action.getSuccessesNeededForNextLevel(BladeburnerConstants.OperationSuccessesPerLevel) + " successes " +
|
||||
"needed for next level"
|
||||
"needed for next level",
|
||||
}));
|
||||
el.appendChild(createElement("a", {
|
||||
class: maxLevel ? "a-link-button-inactive" : "a-link-button", innerHTML:"↑",
|
||||
@ -2116,7 +2116,7 @@ Bladeburner.prototype.updateOperationsUIElement = function(el, action) {
|
||||
if (isActive) {this.startAction(this.action);} // Restart Action
|
||||
this.updateOperationsUIElement(el, action);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
}));
|
||||
el.appendChild(createElement("a", {
|
||||
class: (action.level <= 1) ? "a-link-button-inactive" : "a-link-button", innerHTML:"↓",
|
||||
@ -2128,11 +2128,10 @@ Bladeburner.prototype.updateOperationsUIElement = function(el, action) {
|
||||
if (isActive) {this.startAction(this.action);} // Restart Action
|
||||
this.updateOperationsUIElement(el, action);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
}));
|
||||
|
||||
// General Info
|
||||
var difficulty = action.getDifficulty();
|
||||
var actionTime = action.getActionTime(this);
|
||||
appendLineBreaks(el, 2);
|
||||
el.appendChild(createElement("pre", {
|
||||
@ -2150,7 +2149,7 @@ Bladeburner.prototype.updateOperationsUIElement = function(el, action) {
|
||||
var autolevelCheckboxId = "bladeburner-" + action.name + "-autolevel-checkbox";
|
||||
el.appendChild(createElement("label", {
|
||||
for:autolevelCheckboxId, innerText:"Autolevel: ",color:"white",
|
||||
tooltip:"Automatically increase operation level when possible"
|
||||
tooltip:"Automatically increase operation level when possible",
|
||||
}));
|
||||
|
||||
const checkboxInput = createElement("input", {
|
||||
@ -2170,7 +2169,6 @@ Bladeburner.prototype.updateBlackOpsUIElement = function(el, action) {
|
||||
var isActive = el.classList.contains(ActiveActionCssClass);
|
||||
var isCompleted = (this.blackops[action.name] != null);
|
||||
var estimatedSuccessChance = action.getSuccessChance(this, {est:true});
|
||||
var difficulty = action.getDifficulty();
|
||||
var actionTime = action.getActionTime(this);
|
||||
var hasReqdRank = this.rank >= action.reqdRank;
|
||||
|
||||
@ -2194,7 +2192,7 @@ Bladeburner.prototype.updateBlackOpsUIElement = function(el, action) {
|
||||
var progress = this.actionTimeCurrent / this.actionTimeToComplete;
|
||||
el.appendChild(createElement("p", {
|
||||
display:"block",
|
||||
innerText:createProgressBarText({progress:progress})
|
||||
innerText:createProgressBarText({progress:progress}),
|
||||
}));
|
||||
} else {
|
||||
el.appendChild(createElement("a", { // Start button
|
||||
@ -2206,7 +2204,7 @@ Bladeburner.prototype.updateBlackOpsUIElement = function(el, action) {
|
||||
this.startAction(this.action);
|
||||
this.updateActionAndSkillsContent();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
}));
|
||||
el.appendChild(createElement("a", { // Set Team Size Button
|
||||
innerText:"Set Team Size (Curr Size: " + formatNumber(action.teamCount, 0) + ")", class:"a-link-button",
|
||||
@ -2217,7 +2215,7 @@ Bladeburner.prototype.updateBlackOpsUIElement = function(el, action) {
|
||||
innerText:"Enter the amount of team members you would like to take on this " +
|
||||
"BlackOp. If you do not have the specified number of team members, " +
|
||||
"then as many as possible will be used. Note that team members may " +
|
||||
"be lost during operations."
|
||||
"be lost during operations.",
|
||||
|
||||
});
|
||||
var input = createElement("input", {
|
||||
@ -2235,17 +2233,17 @@ Bladeburner.prototype.updateBlackOpsUIElement = function(el, action) {
|
||||
}
|
||||
removeElementById(popupId);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
var cancelBtn = createElement("a", {
|
||||
innerText:"Cancel", class:"a-link-button",
|
||||
clickListener:() => {
|
||||
removeElementById(popupId);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
createPopup(popupId, [txt, input, setBtn, cancelBtn]);
|
||||
}
|
||||
},
|
||||
}));
|
||||
}
|
||||
|
||||
@ -2257,7 +2255,7 @@ Bladeburner.prototype.updateBlackOpsUIElement = function(el, action) {
|
||||
}));
|
||||
el.appendChild(createElement("p", {
|
||||
display:"block", color:hasReqdRank ? "white" : "red",
|
||||
innerHTML:"Required Rank: " + formatNumber(action.reqdRank, 0) + "<br>"
|
||||
innerHTML:"Required Rank: " + formatNumber(action.reqdRank, 0) + "<br>",
|
||||
}));
|
||||
el.appendChild(createElement("p", {
|
||||
display:"inline-block",
|
||||
@ -2297,7 +2295,7 @@ Bladeburner.prototype.updateSkillsUIElement = function(el, skill) {
|
||||
this.upgradeSkill(skill);
|
||||
this.createActionAndSkillsContent();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
}));
|
||||
appendLineBreaks(el, 2);
|
||||
el.appendChild(createElement("p", {
|
||||
@ -2307,7 +2305,7 @@ Bladeburner.prototype.updateSkillsUIElement = function(el, skill) {
|
||||
if (maxLvl) {
|
||||
el.appendChild(createElement("p", {
|
||||
color:"red", display:"block",
|
||||
innerText:"MAX LEVEL"
|
||||
innerText:"MAX LEVEL",
|
||||
}));
|
||||
} else {
|
||||
el.appendChild(createElement("p", {
|
||||
@ -2508,7 +2506,7 @@ Bladeburner.prototype.executeAutomateConsoleCommand = function(args) {
|
||||
case "gen":
|
||||
if (GeneralActions[val] != null) {
|
||||
var action = new ActionIdentifier({
|
||||
type:ActionTypes[val], name:val
|
||||
type:ActionTypes[val], name:val,
|
||||
});
|
||||
if (highLow) {
|
||||
this.automateActionHigh = action;
|
||||
@ -2524,7 +2522,7 @@ Bladeburner.prototype.executeAutomateConsoleCommand = function(args) {
|
||||
case "contracts":
|
||||
if (this.contracts[val] != null) {
|
||||
var action = new ActionIdentifier({
|
||||
type:ActionTypes.Contract, name:val
|
||||
type:ActionTypes.Contract, name:val,
|
||||
});
|
||||
if (highLow) {
|
||||
this.automateActionHigh = action;
|
||||
@ -2542,7 +2540,7 @@ Bladeburner.prototype.executeAutomateConsoleCommand = function(args) {
|
||||
case "operation":
|
||||
if (this.operations[val] != null) {
|
||||
var action = new ActionIdentifier({
|
||||
type:ActionTypes.Operation, name:val
|
||||
type:ActionTypes.Operation, name:val,
|
||||
});
|
||||
if (highLow) {
|
||||
this.automateActionHigh = action;
|
||||
@ -3210,7 +3208,7 @@ Bladeburner.prototype.setTeamSizeNetscriptFn = function(type, name, size, worker
|
||||
return -1;
|
||||
}
|
||||
|
||||
const sanitizedSize = Math.round(size);
|
||||
let sanitizedSize = Math.round(size);
|
||||
if (isNaN(sanitizedSize) || sanitizedSize < 0) {
|
||||
workerScript.log("bladeburner.setTeamSize", `Invalid size: ${size}`);
|
||||
return -1;
|
||||
|
@ -3,21 +3,20 @@ import { getRandomInt } from "../../utils/helpers/getRandomInt";
|
||||
import { addOffset } from "../../utils/helpers/addOffset";
|
||||
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviver";
|
||||
import { BladeburnerConstants } from "./data/Constants";
|
||||
// import { Contract } from "./Contract";
|
||||
// import { Operation } from "./Operation";
|
||||
// import { BlackOperation } from "./BlackOperation";
|
||||
import { IBladeburner } from "./IBladeburner";
|
||||
import { IAction, ISuccessChanceParams } from "./IAction";
|
||||
|
||||
class StatsMultiplier {
|
||||
hack: number = 0;
|
||||
str: number = 0;
|
||||
def: number = 0;
|
||||
dex: number = 0;
|
||||
agi: number = 0;
|
||||
cha: number = 0;
|
||||
int: number = 0;
|
||||
|
||||
[key: string]: number;
|
||||
};
|
||||
|
||||
hack = 0;
|
||||
str = 0;
|
||||
def = 0;
|
||||
dex = 0;
|
||||
agi = 0;
|
||||
cha = 0;
|
||||
int = 0;
|
||||
}
|
||||
|
||||
export interface IActionParams {
|
||||
name?: string;
|
||||
@ -43,32 +42,32 @@ export interface IActionParams {
|
||||
teamCount?: number;
|
||||
}
|
||||
|
||||
export class Action {
|
||||
name: string = "";
|
||||
desc: string = "";
|
||||
export class Action implements IAction {
|
||||
name = "";
|
||||
desc = "";
|
||||
|
||||
// Difficulty scales with level. See getDifficulty() method
|
||||
level: number = 1;
|
||||
maxLevel: number = 1;
|
||||
autoLevel: boolean = true;
|
||||
baseDifficulty: number = 100;
|
||||
difficultyFac: number = 1.01;
|
||||
level = 1;
|
||||
maxLevel = 1;
|
||||
autoLevel = true;
|
||||
baseDifficulty = 100;
|
||||
difficultyFac = 1.01;
|
||||
|
||||
// Rank increase/decrease is affected by this exponent
|
||||
rewardFac: number = 1.02;
|
||||
rewardFac = 1.02;
|
||||
|
||||
successes: number = 0;
|
||||
failures: number = 0;
|
||||
successes = 0;
|
||||
failures = 0;
|
||||
|
||||
// All of these scale with level/difficulty
|
||||
rankGain: number = 0;
|
||||
rankLoss: number = 0;
|
||||
hpLoss: number = 0;
|
||||
hpLost: number = 0;
|
||||
rankGain = 0;
|
||||
rankLoss = 0;
|
||||
hpLoss = 0;
|
||||
hpLost = 0;
|
||||
|
||||
// Action Category. Current categories are stealth and kill
|
||||
isStealth: boolean = false;
|
||||
isKill: boolean = false;
|
||||
isStealth = false;
|
||||
isKill = false;
|
||||
|
||||
/**
|
||||
* Number of this contract remaining, and its growth rate
|
||||
@ -81,7 +80,7 @@ export class Action {
|
||||
weights: StatsMultiplier = {hack:1/7,str:1/7,def:1/7,dex:1/7,agi:1/7,cha:1/7,int:1/7};
|
||||
// Diminishing returns of stats (stat ^ decay where 0 <= decay <= 1)
|
||||
decays: StatsMultiplier = { hack: 0.9, str: 0.9, def: 0.9, dex: 0.9, agi: 0.9, cha: 0.9, int: 0.9 };
|
||||
teamCount: number = 0;
|
||||
teamCount = 0;
|
||||
|
||||
// Base Class for Contracts, Operations, and BlackOps
|
||||
constructor(params: IActionParams| null = null) { // | null = null
|
||||
@ -138,7 +137,7 @@ export class Action {
|
||||
* Tests for success. Should be called when an action has completed
|
||||
* @param inst {Bladeburner} - Bladeburner instance
|
||||
*/
|
||||
attempt(inst: any): boolean {
|
||||
attempt(inst: IBladeburner): boolean {
|
||||
return (Math.random() < this.getSuccessChance(inst));
|
||||
}
|
||||
|
||||
@ -147,7 +146,7 @@ export class Action {
|
||||
return 1;
|
||||
}
|
||||
|
||||
getActionTime(inst: any): number {
|
||||
getActionTime(inst: IBladeburner): number {
|
||||
const difficulty = this.getDifficulty();
|
||||
let baseTime = difficulty / BladeburnerConstants.DifficultyToTimeFactor;
|
||||
const skillFac = inst.skillMultipliers.actionTime; // Always < 1
|
||||
@ -165,15 +164,15 @@ export class Action {
|
||||
}
|
||||
|
||||
// For actions that have teams. To be implemented by subtypes.
|
||||
getTeamSuccessBonus(inst: any): number {
|
||||
getTeamSuccessBonus(inst: IBladeburner): number {
|
||||
return 1;
|
||||
}
|
||||
|
||||
getActionTypeSkillSuccessBonus(inst: any): number {
|
||||
getActionTypeSkillSuccessBonus(inst: IBladeburner): number {
|
||||
return 1;
|
||||
}
|
||||
|
||||
getChaosCompetencePenalty(inst: any, params: any): number {
|
||||
getChaosCompetencePenalty(inst: IBladeburner, params: ISuccessChanceParams): number {
|
||||
const city = inst.getCurrentCity();
|
||||
if (params.est) {
|
||||
return Math.pow((city.popEst / BladeburnerConstants.PopulationThreshold), BladeburnerConstants.PopulationExponent);
|
||||
@ -182,7 +181,7 @@ export class Action {
|
||||
}
|
||||
}
|
||||
|
||||
getChaosDifficultyBonus(inst: any, params: any): number {
|
||||
getChaosDifficultyBonus(inst: IBladeburner/*, params: ISuccessChanceParams*/): number {
|
||||
const city = inst.getCurrentCity();
|
||||
if (city.chaos > BladeburnerConstants.ChaosThreshold) {
|
||||
const diff = 1 + (city.chaos - BladeburnerConstants.ChaosThreshold);
|
||||
@ -198,14 +197,14 @@ export class Action {
|
||||
* @params - options:
|
||||
* est (bool): Get success chance estimate instead of real success chance
|
||||
*/
|
||||
getSuccessChance(inst: any, params: any={}) {
|
||||
getSuccessChance(inst: IBladeburner, params: ISuccessChanceParams={est: false}): number {
|
||||
if (inst == null) {throw new Error("Invalid Bladeburner instance passed into Action.getSuccessChance");}
|
||||
let difficulty = this.getDifficulty();
|
||||
let competence = 0;
|
||||
for (let stat in this.weights) {
|
||||
for (const stat in this.weights) {
|
||||
if (this.weights.hasOwnProperty(stat)) {
|
||||
let playerStatLvl = Player.queryStatFromString(stat);
|
||||
let key = "eff" + stat.charAt(0).toUpperCase() + stat.slice(1);
|
||||
const playerStatLvl = Player.queryStatFromString(stat);
|
||||
const key = "eff" + stat.charAt(0).toUpperCase() + stat.slice(1);
|
||||
let effMultiplier = inst.skillMultipliers[key];
|
||||
if (effMultiplier == null) {
|
||||
console.error(`Failed to find Bladeburner Skill multiplier for: ${stat}`);
|
||||
@ -220,7 +219,7 @@ export class Action {
|
||||
competence *= this.getTeamSuccessBonus(inst);
|
||||
|
||||
competence *= this.getChaosCompetencePenalty(inst, params);
|
||||
difficulty *= this.getChaosDifficultyBonus(inst, params);
|
||||
difficulty *= this.getChaosDifficultyBonus(inst);
|
||||
|
||||
if(this.name == "Raid" && inst.getCurrentCity().comms <= 0) {
|
||||
return 0;
|
||||
@ -253,18 +252,14 @@ export class Action {
|
||||
}
|
||||
}
|
||||
|
||||
static fromJSON(value: any): Action {
|
||||
return Generic_fromJSON(Action, value.data);
|
||||
}
|
||||
|
||||
toJSON(): any {
|
||||
return Generic_toJSON("Action", this);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
static fromJSON(value: any): Action {
|
||||
return Generic_fromJSON(Action, value.data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reviver.constructors.Action = Action;
|
@ -13,21 +13,22 @@ export class BlackOperation extends Operation {
|
||||
return 1.5;
|
||||
}
|
||||
|
||||
getChaosCompetencePenalty(inst: any, params: any): number {
|
||||
getChaosCompetencePenalty(/*inst: IBladeburner, params: ISuccessChanceParams*/): number {
|
||||
return 1;
|
||||
}
|
||||
|
||||
getChaosDifficultyBonus(inst: any, params: any): number {
|
||||
getChaosDifficultyBonus(/*inst: IBladeburner, params: ISuccessChanceParams*/): number {
|
||||
return 1;
|
||||
}
|
||||
|
||||
static fromJSON(value: any): Operation {
|
||||
return Generic_fromJSON(BlackOperation, value.data);
|
||||
}
|
||||
|
||||
toJSON(): any {
|
||||
return Generic_toJSON("BlackOperation", this);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
static fromJSON(value: any): Operation {
|
||||
return Generic_fromJSON(BlackOperation, value.data);
|
||||
}
|
||||
}
|
||||
|
||||
Reviver.constructors.BlackOperation = BlackOperation;
|
@ -16,7 +16,7 @@ export const BlackOperations: IMap<BlackOperation> = {};
|
||||
rankGain:50, rankLoss:10, hpLoss:100,
|
||||
weights:{hack:0.1,str:0.2,def:0.2,dex:0.2,agi:0.2,cha:0, int:0.1},
|
||||
decays:{hack:0.6,str:0.8,def:0.8,dex:0.8,agi:0.8,cha:0, int:0.75},
|
||||
isKill:true
|
||||
isKill:true,
|
||||
});
|
||||
BlackOperations["Operation Zero"] = new BlackOperation({
|
||||
name:"Operation Zero",
|
||||
@ -33,7 +33,7 @@ export const BlackOperations: IMap<BlackOperation> = {};
|
||||
rankGain:60, rankLoss:15, hpLoss:50,
|
||||
weights:{hack:0.2,str:0.15,def:0.15,dex:0.2,agi:0.2,cha:0, int:0.1},
|
||||
decays:{hack:0.6,str:0.8,def:0.8,dex:0.8,agi:0.8,cha:0, int:0.75},
|
||||
isStealth:true
|
||||
isStealth:true,
|
||||
});
|
||||
BlackOperations["Operation X"] = new BlackOperation({
|
||||
name:"Operation X",
|
||||
@ -52,7 +52,7 @@ export const BlackOperations: IMap<BlackOperation> = {};
|
||||
rankGain:75, rankLoss:15, hpLoss:100,
|
||||
weights:{hack:0.1,str:0.2,def:0.2,dex:0.2,agi:0.2,cha:0, int:0.1},
|
||||
decays:{hack:0.6,str:0.8,def:0.8,dex:0.8,agi:0.8,cha:0, int:0.75},
|
||||
isKill:true
|
||||
isKill:true,
|
||||
});
|
||||
BlackOperations["Operation Titan"] = new BlackOperation({
|
||||
name:"Operation Titan",
|
||||
@ -70,7 +70,7 @@ export const BlackOperations: IMap<BlackOperation> = {};
|
||||
rankGain:100, rankLoss:20, hpLoss:100,
|
||||
weights:{hack:0.1,str:0.2,def:0.2,dex:0.2,agi:0.2,cha:0, int:0.1},
|
||||
decays:{hack:0.6,str:0.8,def:0.8,dex:0.8,agi:0.8,cha:0, int:0.75},
|
||||
isKill:true
|
||||
isKill:true,
|
||||
});
|
||||
BlackOperations["Operation Ares"] = new BlackOperation({
|
||||
name:"Operation Ares",
|
||||
@ -84,7 +84,7 @@ export const BlackOperations: IMap<BlackOperation> = {};
|
||||
rankGain:125, rankLoss:20, hpLoss:200,
|
||||
weights:{hack:0,str:0.25,def:0.25,dex:0.25,agi:0.25,cha:0, int:0},
|
||||
decays:{hack:0,str:0.8,def:0.8,dex:0.8,agi:0.8,cha:0, int:0.75},
|
||||
isKill:true
|
||||
isKill:true,
|
||||
});
|
||||
BlackOperations["Operation Archangel"] = new BlackOperation({
|
||||
name:"Operation Archangel",
|
||||
@ -152,7 +152,7 @@ export const BlackOperations: IMap<BlackOperation> = {};
|
||||
rankGain:750, rankLoss:60, hpLoss:1000,
|
||||
weights:{hack:0.05,str:0.2,def:0.2,dex:0.25,agi:0.25,cha:0, int:0.05},
|
||||
decays:{hack:0.6,str:0.8,def:0.8,dex:0.8,agi:0.8,cha:0, int:0.75},
|
||||
isKill:true
|
||||
isKill:true,
|
||||
});
|
||||
BlackOperations["Operation Deckard"] = new BlackOperation({
|
||||
name:"Operation Deckard",
|
||||
@ -202,7 +202,7 @@ export const BlackOperations: IMap<BlackOperation> = {};
|
||||
rankGain:2e3, rankLoss:150, hpLoss:1500,
|
||||
weights:{hack:0,str:0.24,def:0.24,dex:0.24,agi:0.24,cha:0, int:0.04},
|
||||
decays:{hack:0.6,str:0.8,def:0.8,dex:0.8,agi:0.8,cha:0, int:0.75},
|
||||
isKill:true
|
||||
isKill:true,
|
||||
});
|
||||
BlackOperations["Operation Shoulder of Orion"] = new BlackOperation({
|
||||
name:"Operation Shoulder of Orion",
|
||||
@ -218,7 +218,7 @@ export const BlackOperations: IMap<BlackOperation> = {};
|
||||
rankGain:2.5e3, rankLoss:500, hpLoss:1500,
|
||||
weights:{hack:0.1,str:0.2,def:0.2,dex:0.2,agi:0.2,cha:0, int:0.1},
|
||||
decays:{hack:0.6,str:0.8,def:0.8,dex:0.8,agi:0.8,cha:0, int:0.75},
|
||||
isStealth:true
|
||||
isStealth:true,
|
||||
});
|
||||
BlackOperations["Operation Hyron"] = new BlackOperation({
|
||||
name:"Operation Hyron",
|
||||
@ -240,7 +240,7 @@ export const BlackOperations: IMap<BlackOperation> = {};
|
||||
rankGain:3e3, rankLoss:1e3, hpLoss:500,
|
||||
weights:{hack:0.1,str:0.2,def:0.2,dex:0.2,agi:0.2,cha:0, int:0.1},
|
||||
decays:{hack:0.6,str:0.8,def:0.8,dex:0.8,agi:0.8,cha:0, int:0.75},
|
||||
isKill:true
|
||||
isKill:true,
|
||||
});
|
||||
BlackOperations["Operation Morpheus"] = new BlackOperation({
|
||||
name:"Operation Morpheus",
|
||||
@ -257,7 +257,7 @@ export const BlackOperations: IMap<BlackOperation> = {};
|
||||
rankGain:4e3, rankLoss:1e3, hpLoss:100,
|
||||
weights:{hack:0.05,str:0.15,def:0.15,dex:0.3,agi:0.3,cha:0, int:0.05},
|
||||
decays:{hack:0.6,str:0.8,def:0.8,dex:0.8,agi:0.8,cha:0, int:0.75},
|
||||
isStealth:true
|
||||
isStealth:true,
|
||||
});
|
||||
BlackOperations["Operation Ion Storm"] = new BlackOperation({
|
||||
name:"Operation Ion Storm",
|
||||
@ -272,7 +272,7 @@ export const BlackOperations: IMap<BlackOperation> = {};
|
||||
rankGain:5e3, rankLoss:1e3, hpLoss:5000,
|
||||
weights:{hack:0,str:0.24,def:0.24,dex:0.24,agi:0.24,cha:0, int:0.04},
|
||||
decays:{hack:0.6,str:0.8,def:0.8,dex:0.8,agi:0.8,cha:0, int:0.75},
|
||||
isKill:true
|
||||
isKill:true,
|
||||
});
|
||||
BlackOperations["Operation Annihilus"] = new BlackOperation({
|
||||
name:"Operation Annihilus",
|
||||
@ -286,7 +286,7 @@ export const BlackOperations: IMap<BlackOperation> = {};
|
||||
rankGain:7.5e3, rankLoss:1e3, hpLoss:10e3,
|
||||
weights:{hack:0,str:0.24,def:0.24,dex:0.24,agi:0.24,cha:0, int:0.04},
|
||||
decays:{hack:0.6,str:0.8,def:0.8,dex:0.8,agi:0.8,cha:0, int:0.75},
|
||||
isKill:true
|
||||
isKill:true,
|
||||
});
|
||||
BlackOperations["Operation Ultron"] = new BlackOperation({
|
||||
name:"Operation Ultron",
|
||||
@ -306,7 +306,7 @@ export const BlackOperations: IMap<BlackOperation> = {};
|
||||
rankGain:10e3, rankLoss:2e3, hpLoss:10e3,
|
||||
weights:{hack:0.1,str:0.2,def:0.2,dex:0.2,agi:0.2,cha:0, int:0.1},
|
||||
decays:{hack:0.6,str:0.8,def:0.8,dex:0.8,agi:0.8,cha:0, int:0.75},
|
||||
isKill:true
|
||||
isKill:true,
|
||||
});
|
||||
BlackOperations["Operation Centurion"] = new BlackOperation({
|
||||
name:"Operation Centurion",
|
||||
|
@ -5,13 +5,13 @@ import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviv
|
||||
import { addOffset } from "../../utils/helpers/addOffset";
|
||||
|
||||
export class ChangePopulationByCountParams {
|
||||
estChange: number = 0;
|
||||
estOffset: number = 0;
|
||||
estChange = 0;
|
||||
estOffset = 0;
|
||||
}
|
||||
|
||||
export class ChangePopulationByPercentageParams {
|
||||
nonZero: boolean = false;
|
||||
changeEstEqually: boolean = false;
|
||||
nonZero = false;
|
||||
changeEstEqually = false;
|
||||
}
|
||||
|
||||
export class City {
|
||||
@ -19,32 +19,32 @@ export class City {
|
||||
/**
|
||||
* Name of the city.
|
||||
*/
|
||||
name: string = "";
|
||||
name = "";
|
||||
|
||||
/**
|
||||
* Population of the city.
|
||||
*/
|
||||
pop: number = 0;
|
||||
pop = 0;
|
||||
|
||||
/**
|
||||
* Population estimation of the city.
|
||||
*/
|
||||
popEst: number = 0;
|
||||
popEst = 0;
|
||||
|
||||
/**
|
||||
* Number of communities in the city.
|
||||
*/
|
||||
comms: number = 0;
|
||||
comms = 0;
|
||||
|
||||
/**
|
||||
* Estimated number of communities in the city.
|
||||
*/
|
||||
commsEst: number = 0;
|
||||
commsEst = 0;
|
||||
|
||||
/**
|
||||
* Chaos level of the city.
|
||||
*/
|
||||
chaos: number = 0;
|
||||
chaos = 0;
|
||||
|
||||
constructor(name: string = BladeburnerConstants.CityNames[2]) {
|
||||
this.name = name;
|
||||
@ -84,7 +84,7 @@ export class City {
|
||||
/**
|
||||
* p is the percentage, not the multiplier (e.g. pass in p = 5 for 5%)
|
||||
*/
|
||||
improvePopulationEstimateByPercentage(p: number, skillMult: number=1): void {
|
||||
improvePopulationEstimateByPercentage(p: number, skillMult=1): void {
|
||||
p = p*skillMult;
|
||||
if (isNaN(p)) {throw new Error("NaN passed into City.improvePopulationEstimateByPercentage()");}
|
||||
if (this.popEst < this.pop) {
|
||||
@ -97,7 +97,7 @@ export class City {
|
||||
}
|
||||
}
|
||||
|
||||
improveCommunityEstimate(n: number=1): void {
|
||||
improveCommunityEstimate(n=1): void {
|
||||
if (isNaN(n)) {throw new Error("NaN passed into City.improveCommunityEstimate()");}
|
||||
if (this.commsEst < this.comms) {
|
||||
this.commsEst += n;
|
||||
@ -154,19 +154,20 @@ export class City {
|
||||
if (this.chaos < 0) {this.chaos = 0;}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initiatizes a City object from a JSON save state.
|
||||
*/
|
||||
static fromJSON(value: any): City {
|
||||
return Generic_fromJSON(City, value.data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Serialize the current object to a JSON save state.
|
||||
*/
|
||||
toJSON(): any {
|
||||
return Generic_toJSON("City", this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initiatizes a City object from a JSON save state.
|
||||
*/
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
static fromJSON(value: any): City {
|
||||
return Generic_fromJSON(City, value.data);
|
||||
}
|
||||
}
|
||||
|
||||
Reviver.constructors.City = City;
|
||||
|
@ -1,4 +1,4 @@
|
||||
// import { BladeburnerConstants } from "./data/Constants";
|
||||
import { IBladeburner } from "./IBladeburner";
|
||||
import { Action, IActionParams } from "./Action";
|
||||
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviver";
|
||||
|
||||
@ -8,17 +8,18 @@ export class Contract extends Action {
|
||||
super(params);
|
||||
}
|
||||
|
||||
getActionTypeSkillSuccessBonus(inst: any): number {
|
||||
getActionTypeSkillSuccessBonus(inst: IBladeburner): number {
|
||||
return inst.skillMultipliers.successChanceContract;
|
||||
}
|
||||
|
||||
static fromJSON(value: any): Contract {
|
||||
return Generic_fromJSON(Contract, value.data);
|
||||
}
|
||||
|
||||
toJSON(): any {
|
||||
return Generic_toJSON("Contract", this);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
static fromJSON(value: any): Contract {
|
||||
return Generic_fromJSON(Contract, value.data);
|
||||
}
|
||||
}
|
||||
|
||||
Reviver.constructors.Contract = Contract;
|
@ -11,7 +11,7 @@ export const GeneralActions: IMap<Action> = {};
|
||||
name:actionName,
|
||||
desc:"Improve your abilities at the Bladeburner unit's specialized training " +
|
||||
"center. Doing this gives experience for all combat stats and also " +
|
||||
"increases your max stamina."
|
||||
"increases your max stamina.",
|
||||
});
|
||||
|
||||
actionName = "Field Analysis";
|
||||
@ -21,7 +21,7 @@ export const GeneralActions: IMap<Action> = {};
|
||||
"Bladeburner's unit intelligence on Synthoid locations and " +
|
||||
"activities. Completing this action will improve the accuracy " +
|
||||
"of your Synthoid population estimated in the current city.<br><br>" +
|
||||
"Does NOT require stamina."
|
||||
"Does NOT require stamina.",
|
||||
});
|
||||
|
||||
actionName = "Recruitment";
|
||||
@ -29,7 +29,7 @@ export const GeneralActions: IMap<Action> = {};
|
||||
name:actionName,
|
||||
desc:"Attempt to recruit members for your Bladeburner team. These members " +
|
||||
"can help you conduct operations.<br><br>" +
|
||||
"Does NOT require stamina."
|
||||
"Does NOT require stamina.",
|
||||
});
|
||||
|
||||
actionName = "Diplomacy";
|
||||
@ -37,7 +37,7 @@ export const GeneralActions: IMap<Action> = {};
|
||||
name: actionName,
|
||||
desc: "Improve diplomatic relations with the Synthoid population. " +
|
||||
"Completing this action will reduce the Chaos level in your current city.<br><br>" +
|
||||
"Does NOT require stamina."
|
||||
"Does NOT require stamina.",
|
||||
});
|
||||
|
||||
actionName = "Hyperbolic Regeneration Chamber";
|
||||
|
71
src/Bladeburner/IAction.ts
Normal file
71
src/Bladeburner/IAction.ts
Normal file
@ -0,0 +1,71 @@
|
||||
import { IBladeburner } from "./IBladeburner";
|
||||
|
||||
export interface IStatsMultiplier {
|
||||
[key: string]: number;
|
||||
|
||||
hack: number;
|
||||
str: number;
|
||||
def: number;
|
||||
dex: number;
|
||||
agi: number;
|
||||
cha: number;
|
||||
int: number;
|
||||
}
|
||||
|
||||
export interface ISuccessChanceParams {
|
||||
est: boolean;
|
||||
}
|
||||
|
||||
export interface IAction {
|
||||
name: string;
|
||||
desc: string;
|
||||
|
||||
// Difficulty scales with level. See getDifficulty() method
|
||||
level: number;
|
||||
maxLevel: number;
|
||||
autoLevel: boolean;
|
||||
baseDifficulty: number;
|
||||
difficultyFac: number;
|
||||
|
||||
// Rank increase/decrease is affected by this exponent
|
||||
rewardFac: number;
|
||||
|
||||
successes: number;
|
||||
failures: number;
|
||||
|
||||
// All of these scale with level/difficulty
|
||||
rankGain: number;
|
||||
rankLoss: number;
|
||||
hpLoss: number;
|
||||
hpLost: number;
|
||||
|
||||
// Action Category. Current categories are stealth and kill
|
||||
isStealth: boolean;
|
||||
isKill: boolean;
|
||||
|
||||
/**
|
||||
* Number of this contract remaining, and its growth rate
|
||||
* Growth rate is an integer and the count will increase by that integer every "cycle"
|
||||
*/
|
||||
count: number;
|
||||
countGrowth: number;
|
||||
|
||||
// Weighting of each stat in determining action success rate
|
||||
weights: IStatsMultiplier;
|
||||
// Diminishing returns of stats (stat ^ decay where 0 <= decay <= 1)
|
||||
decays: IStatsMultiplier;
|
||||
teamCount: number;
|
||||
|
||||
getDifficulty(): number;
|
||||
attempt(inst: IBladeburner): boolean;
|
||||
getActionTimePenalty(): number;
|
||||
getActionTime(inst: IBladeburner): number;
|
||||
getTeamSuccessBonus(inst: IBladeburner): number;
|
||||
getActionTypeSkillSuccessBonus(inst: IBladeburner): number;
|
||||
getChaosCompetencePenalty(inst: IBladeburner, params: ISuccessChanceParams): number;
|
||||
getChaosDifficultyBonus(inst: IBladeburner): number;
|
||||
getSuccessChance(inst: IBladeburner, params: ISuccessChanceParams): number;
|
||||
getSuccessesNeededForNextLevel(baseSuccessesPerLevel: number): number;
|
||||
setMaxLevel(baseSuccessesPerLevel: number): void;
|
||||
toJSON(): any;
|
||||
}
|
4
src/Bladeburner/IActionIdentifier.ts
Normal file
4
src/Bladeburner/IActionIdentifier.ts
Normal file
@ -0,0 +1,4 @@
|
||||
export interface IActionIdentifier {
|
||||
name: string;
|
||||
type: string;
|
||||
}
|
39
src/Bladeburner/IBladeburner.ts
Normal file
39
src/Bladeburner/IBladeburner.ts
Normal file
@ -0,0 +1,39 @@
|
||||
import { IActionIdentifier } from "./IActionIdentifier";
|
||||
import { City } from "./City";
|
||||
|
||||
export interface IBladeburner {
|
||||
numHosp: number;
|
||||
moneyLost: number;
|
||||
rank: number;
|
||||
maxRank: number;
|
||||
skillPoints: number;
|
||||
totalSkillPoints: number;
|
||||
teamSize: number;
|
||||
teamLost: number;
|
||||
storedCycles: number;
|
||||
randomEventCounter: number;
|
||||
actionTimeToComplete: number;
|
||||
actionTimeCurrent: number;
|
||||
action: IActionIdentifier;
|
||||
cities: any;
|
||||
city: string;
|
||||
skills: any;
|
||||
skillMultipliers: any;
|
||||
staminaBonus: number;
|
||||
maxStamina: number;
|
||||
stamina: number;
|
||||
contracts: any;
|
||||
operations: any;
|
||||
blackops: any;
|
||||
logging: any;
|
||||
automateEnabled: boolean;
|
||||
automateActionHigh: number;
|
||||
automateThreshHigh: number;
|
||||
automateActionLow: number;
|
||||
automateThreshLow: number;
|
||||
consoleHistory: string[];
|
||||
consoleLogs: string[];
|
||||
|
||||
getCurrentCity(): City;
|
||||
calculateStaminaPenalty(): number;
|
||||
}
|
@ -1,3 +1,4 @@
|
||||
import { IBladeburner } from "./IBladeburner";
|
||||
import { BladeburnerConstants } from "./data/Constants";
|
||||
import { Action, IActionParams } from "./Action";
|
||||
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviver";
|
||||
@ -8,8 +9,8 @@ export interface IOperationParams extends IActionParams {
|
||||
}
|
||||
|
||||
export class Operation extends Action {
|
||||
reqdRank: number = 100;
|
||||
teamCount: number = 0;
|
||||
reqdRank = 100;
|
||||
teamCount = 0;
|
||||
|
||||
constructor(params: IOperationParams | null = null) {
|
||||
super(params);
|
||||
@ -18,38 +19,39 @@ export class Operation extends Action {
|
||||
}
|
||||
|
||||
// For actions that have teams. To be implemented by subtypes.
|
||||
getTeamSuccessBonus(inst: any): number {
|
||||
getTeamSuccessBonus(inst: IBladeburner): number {
|
||||
if (this.teamCount && this.teamCount > 0) {
|
||||
this.teamCount = Math.min(this.teamCount, inst.teamSize);
|
||||
let teamMultiplier = Math.pow(this.teamCount, 0.05);
|
||||
const teamMultiplier = Math.pow(this.teamCount, 0.05);
|
||||
return teamMultiplier;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
getActionTypeSkillSuccessBonus(inst: any): number {
|
||||
getActionTypeSkillSuccessBonus(inst: IBladeburner): number {
|
||||
return inst.skillMultipliers.successChanceOperation;
|
||||
}
|
||||
|
||||
getChaosDifficultyBonus(inst: any, params: any): number {
|
||||
getChaosDifficultyBonus(inst: IBladeburner/*, params: ISuccessChanceParams*/): number {
|
||||
const city = inst.getCurrentCity();
|
||||
if (city.chaos > BladeburnerConstants.ChaosThreshold) {
|
||||
let diff = 1 + (city.chaos - BladeburnerConstants.ChaosThreshold);
|
||||
let mult = Math.pow(diff, 0.1);
|
||||
const diff = 1 + (city.chaos - BladeburnerConstants.ChaosThreshold);
|
||||
const mult = Math.pow(diff, 0.1);
|
||||
return mult;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static fromJSON(value: any): Operation {
|
||||
return Generic_fromJSON(Operation, value.data);
|
||||
}
|
||||
|
||||
toJSON(): any {
|
||||
return Generic_toJSON("Operation", this);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
static fromJSON(value: any): Operation {
|
||||
return Generic_fromJSON(Operation, value.data);
|
||||
}
|
||||
}
|
||||
|
||||
Reviver.constructors.Operation = Operation;
|
@ -33,36 +33,36 @@ export class Skill {
|
||||
name: string;
|
||||
desc: string;
|
||||
// Cost is in Skill Points
|
||||
baseCost: number = 1;
|
||||
baseCost = 1;
|
||||
// Additive cost increase per level
|
||||
costInc: number = 1;
|
||||
maxLvl: number = 0;
|
||||
costInc = 1;
|
||||
maxLvl = 0;
|
||||
|
||||
/**
|
||||
* These benefits are additive. So total multiplier will be level (handled externally) times the
|
||||
* effects below
|
||||
*/
|
||||
successChanceAll: number = 0;
|
||||
successChanceStealth: number = 0;
|
||||
successChanceKill: number = 0;
|
||||
successChanceContract: number = 0;
|
||||
successChanceOperation: number = 0;
|
||||
successChanceAll = 0;
|
||||
successChanceStealth = 0;
|
||||
successChanceKill = 0;
|
||||
successChanceContract = 0;
|
||||
successChanceOperation = 0;
|
||||
|
||||
/**
|
||||
* This multiplier affects everything that increases synthoid population/community estimate
|
||||
* e.g. Field analysis, Investigation Op, Undercover Op
|
||||
*/
|
||||
successChanceEstimate: number = 0;
|
||||
actionTime: number = 0;
|
||||
effHack: number = 0;
|
||||
effStr: number = 0;
|
||||
effDef: number = 0;
|
||||
effDex: number = 0;
|
||||
effAgi: number = 0;
|
||||
effCha: number = 0;
|
||||
stamina: number = 0;
|
||||
money: number = 0;
|
||||
expGain: number = 0;
|
||||
successChanceEstimate = 0;
|
||||
actionTime = 0;
|
||||
effHack = 0;
|
||||
effStr = 0;
|
||||
effDef = 0;
|
||||
effDex = 0;
|
||||
effAgi = 0;
|
||||
effCha = 0;
|
||||
stamina = 0;
|
||||
money = 0;
|
||||
expGain = 0;
|
||||
|
||||
constructor(params: ISkillParams={name:"foo", desc:"foo"}) {
|
||||
if (!params.name) {
|
||||
|
@ -10,55 +10,55 @@ export const Skills: IMap<Skill> = {};
|
||||
desc:"Each level of this skill increases your success chance " +
|
||||
"for all Contracts, Operations, and BlackOps by 3%",
|
||||
baseCost: 3, costInc: 2.1,
|
||||
successChanceAll:3
|
||||
successChanceAll:3,
|
||||
});
|
||||
Skills[SkillNames.Cloak] = new Skill({
|
||||
name:SkillNames.Cloak,
|
||||
desc:"Each level of this skill increases your " +
|
||||
"success chance in stealth-related Contracts, Operations, and BlackOps by 5.5%",
|
||||
baseCost: 2, costInc: 1.1,
|
||||
successChanceStealth:5.5
|
||||
successChanceStealth:5.5,
|
||||
});
|
||||
Skills[SkillNames.ShortCircuit] = new Skill({
|
||||
name:SkillNames.ShortCircuit,
|
||||
desc:"Each level of this skill increases your success chance " +
|
||||
"in Contracts, Operations, and BlackOps that involve retirement by 5.5%",
|
||||
baseCost: 2, costInc: 2.1,
|
||||
successChanceKill:5.5
|
||||
successChanceKill:5.5,
|
||||
});
|
||||
Skills[SkillNames.DigitalObserver] = new Skill({
|
||||
name:SkillNames.DigitalObserver,
|
||||
desc:"Each level of this skill increases your success chance in " +
|
||||
"all Operations and BlackOps by 4%",
|
||||
baseCost: 2, costInc: 2.1,
|
||||
successChanceOperation:4
|
||||
successChanceOperation:4,
|
||||
});
|
||||
Skills[SkillNames.Tracer] = new Skill({
|
||||
name:SkillNames.Tracer,
|
||||
desc:"Each level of this skill increases your success chance in " +
|
||||
"all Contracts by 4%",
|
||||
baseCost: 2, costInc: 2.1,
|
||||
successChanceContract:4
|
||||
successChanceContract:4,
|
||||
});
|
||||
Skills[SkillNames.Overclock] = new Skill({
|
||||
name:SkillNames.Overclock,
|
||||
desc:"Each level of this skill decreases the time it takes " +
|
||||
"to attempt a Contract, Operation, and BlackOp by 1% (Max Level: 90)",
|
||||
baseCost: 3, costInc: 1.4, maxLvl: 90,
|
||||
actionTime:1
|
||||
actionTime:1,
|
||||
});
|
||||
Skills[SkillNames.Reaper] = new Skill({
|
||||
name: SkillNames.Reaper,
|
||||
desc: "Each level of this skill increases your effective combat stats for Bladeburner actions by 2%",
|
||||
baseCost: 2, costInc: 2.1,
|
||||
effStr: 2, effDef: 2, effDex: 2, effAgi: 2
|
||||
effStr: 2, effDef: 2, effDex: 2, effAgi: 2,
|
||||
});
|
||||
Skills[SkillNames.EvasiveSystem] = new Skill({
|
||||
name:SkillNames.EvasiveSystem,
|
||||
desc:"Each level of this skill increases your effective " +
|
||||
"dexterity and agility for Bladeburner actions by 4%",
|
||||
baseCost: 2, costInc: 2.1,
|
||||
effDex: 4, effAgi: 4
|
||||
effDex: 4, effAgi: 4,
|
||||
});
|
||||
Skills[SkillNames.Datamancer] = new Skill({
|
||||
name:SkillNames.Datamancer,
|
||||
@ -67,13 +67,13 @@ export const Skills: IMap<Skill> = {};
|
||||
"This affects all actions that can potentially increase " +
|
||||
"the accuracy of your synthoid population/community estimates.",
|
||||
baseCost:3, costInc:1,
|
||||
successChanceEstimate:5
|
||||
successChanceEstimate:5,
|
||||
});
|
||||
Skills[SkillNames.CybersEdge] = new Skill({
|
||||
name:SkillNames.CybersEdge,
|
||||
desc:"Each level of this skill increases your max stamina by 2%",
|
||||
baseCost:1, costInc:3,
|
||||
stamina:2
|
||||
stamina:2,
|
||||
});
|
||||
Skills[SkillNames.HandsOfMidas] = new Skill({
|
||||
name: SkillNames.HandsOfMidas,
|
||||
|
@ -1,4 +1,14 @@
|
||||
export const ConsoleHelpText: {} = {
|
||||
export const ConsoleHelpText: {
|
||||
helpList: string[];
|
||||
automate: string[];
|
||||
clear: string[];
|
||||
cls: string[];
|
||||
help: string[];
|
||||
log: string[];
|
||||
skill: string[];
|
||||
start: string[];
|
||||
stop: string[];
|
||||
} = {
|
||||
helpList: [
|
||||
"Use 'help [command]' to get more information about a particular Bladeburner console command.",
|
||||
"",
|
||||
@ -8,7 +18,7 @@ export const ConsoleHelpText: {} = {
|
||||
" log [en/dis] [type] Enable or disable logging for events and actions",
|
||||
" skill [action] [name] Level or display info about your Bladeburner skills",
|
||||
" start [type] [name] Start a Bladeburner action/task" ,
|
||||
" stop Stops your current Bladeburner action/task"
|
||||
" stop Stops your current Bladeburner action/task",
|
||||
],
|
||||
automate: [
|
||||
"automate [var] [val] [hi/low]",
|
||||
@ -30,17 +40,17 @@ export const ConsoleHelpText: {} = {
|
||||
"Using the four console commands above will set the automation to perform Tracking contracts " +
|
||||
"if your stamina is 100 or higher, and then switch to Field Analysis if your stamina drops below " +
|
||||
"50. Note that when setting the action, the name of the action is CASE-SENSITIVE. It must " +
|
||||
"exactly match whatever the name is in the UI."
|
||||
"exactly match whatever the name is in the UI.",
|
||||
],
|
||||
clear: [
|
||||
"clear",
|
||||
"",
|
||||
"Clears the console"
|
||||
"Clears the console",
|
||||
],
|
||||
cls: [
|
||||
"cls",
|
||||
"",
|
||||
"Clears the console"
|
||||
"Clears the console",
|
||||
],
|
||||
help: [
|
||||
"help [command]",
|
||||
@ -51,7 +61,7 @@ export const ConsoleHelpText: {} = {
|
||||
"",
|
||||
" help automate",
|
||||
"",
|
||||
"will display specific information about using the automate console command"
|
||||
"will display specific information about using the automate console command",
|
||||
],
|
||||
log: [
|
||||
"log [en/dis] [type]",
|
||||
@ -71,7 +81,7 @@ export const ConsoleHelpText: {} = {
|
||||
"Logging can be universally enabled/disabled using the 'all' keyword:",
|
||||
"",
|
||||
" log dis all",
|
||||
" log en all"
|
||||
" log en all",
|
||||
],
|
||||
skill: [
|
||||
"skill [action] [name]",
|
||||
@ -91,7 +101,7 @@ export const ConsoleHelpText: {} = {
|
||||
"",
|
||||
"This console command can also be used to level up skills:",
|
||||
"",
|
||||
" skill level [skill name]"
|
||||
" skill level [skill name]",
|
||||
],
|
||||
start: [
|
||||
"start [type] [name]",
|
||||
@ -106,11 +116,11 @@ export const ConsoleHelpText: {} = {
|
||||
"Examples:",
|
||||
"",
|
||||
" start contract Tracking",
|
||||
" start op 'Undercover Operation'"
|
||||
" start op 'Undercover Operation'",
|
||||
],
|
||||
stop:[
|
||||
"stop",
|
||||
"",
|
||||
"Stop your current action and go idle."
|
||||
"Stop your current action and go idle.",
|
||||
],
|
||||
}
|
@ -38,7 +38,7 @@ for (var i = blackops.length-1; i >= 0 ; --i) {
|
||||
|
||||
import * as React from "react";
|
||||
|
||||
export function BlackOperationsPage(inst: any): React.ReactElement {
|
||||
export function BlackOperationsPage(): React.ReactElement {
|
||||
// Put Black Operations in sequence of required rank
|
||||
const blackops = [];
|
||||
for (const name in BlackOperations) {
|
||||
@ -55,9 +55,8 @@ export function BlackOperationsPage(inst: any): React.ReactElement {
|
||||
Black Operations (Black Ops) are special, one-time covert operations. Each Black Op must be unlocked successively by completing the one before it.<br /><br />
|
||||
<b>Your ultimate goal to climb through the ranks of Bladeburners is to complete all of the Black Ops.</b><br /><br />
|
||||
Like normal operations, you may use a team for Black Ops. Failing a black op will incur heavy HP and rank losses.</p>
|
||||
{blackops.map( op =>
|
||||
<div className="bladeburner-action">
|
||||
</div>
|
||||
{blackops.map(() => <div className="bladeburner-action">
|
||||
</div>,
|
||||
)}
|
||||
</div>)
|
||||
}
|
||||
|
@ -41,7 +41,7 @@ export class CoinFlip extends Game<IProps, IState> {
|
||||
this.updateInvestment = this.updateInvestment.bind(this);
|
||||
}
|
||||
|
||||
updateInvestment(e: React.FormEvent<HTMLInputElement>) {
|
||||
updateInvestment(e: React.FormEvent<HTMLInputElement>): void {
|
||||
let investment: number = parseInt(e.currentTarget.value);
|
||||
if (isNaN(investment)) {
|
||||
investment = minPlay;
|
||||
@ -55,7 +55,7 @@ export class CoinFlip extends Game<IProps, IState> {
|
||||
this.setState({investment: investment});
|
||||
}
|
||||
|
||||
play(guess: string) {
|
||||
play(guess: string): void {
|
||||
if(this.reachedLimit(this.props.p)) return;
|
||||
const v = BadRNG.random();
|
||||
let letter: string;
|
||||
@ -80,7 +80,7 @@ export class CoinFlip extends Game<IProps, IState> {
|
||||
}
|
||||
|
||||
|
||||
render() {
|
||||
render(): React.ReactNode {
|
||||
return <>
|
||||
<pre>
|
||||
+———————+<br />
|
||||
@ -89,7 +89,7 @@ export class CoinFlip extends Game<IProps, IState> {
|
||||
| | | |<br />
|
||||
+———————+<br />
|
||||
</pre>
|
||||
<span className="text">Play for: </span><input type="number" className='text-input' onChange={this.updateInvestment} value={this.state.investment} /><br />
|
||||
<span className="text">Play for: </span><input type="number" className="text-input" onChange={this.updateInvestment} value={this.state.investment} /><br />
|
||||
<StdButton onClick={trusted(() => this.play('H'))} text={"Head!"} disabled={this.state.playLock} />
|
||||
<StdButton onClick={trusted(() => this.play('T'))} text={"Tail!"} disabled={this.state.playLock} />
|
||||
<h1>{this.state.status}</h1>
|
||||
|
@ -1,6 +1,6 @@
|
||||
|
||||
export interface RNG {
|
||||
random(): number
|
||||
random(): number;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -9,16 +9,16 @@ export interface RNG {
|
||||
*/
|
||||
class RNG0 implements RNG {
|
||||
x: number;
|
||||
m: number = 1024;
|
||||
a: number = 341;
|
||||
c: number = 1;
|
||||
m = 1024;
|
||||
a = 341;
|
||||
c = 1;
|
||||
|
||||
constructor() {
|
||||
this.x = 0;
|
||||
this.reset();
|
||||
}
|
||||
|
||||
step() {
|
||||
step(): void {
|
||||
this.x = (this.a*this.x+this.c) % this.m;
|
||||
}
|
||||
|
||||
@ -27,7 +27,7 @@ class RNG0 implements RNG {
|
||||
return this.x/this.m;
|
||||
}
|
||||
|
||||
reset() {
|
||||
reset(): void {
|
||||
this.x = (new Date()).getTime() % this.m;
|
||||
}
|
||||
}
|
||||
@ -39,9 +39,9 @@ export const BadRNG: RNG0 = new RNG0();
|
||||
* The period is 6e12.
|
||||
*/
|
||||
export class WHRNG implements RNG {
|
||||
s1: number = 0;
|
||||
s2: number = 0;
|
||||
s3: number = 0;
|
||||
s1 = 0;
|
||||
s2 = 0;
|
||||
s3 = 0;
|
||||
|
||||
constructor(totalPlaytime: number) {
|
||||
// This one is seeded by the players total play time.
|
||||
@ -51,7 +51,7 @@ export class WHRNG implements RNG {
|
||||
this.s3 = v;
|
||||
}
|
||||
|
||||
step() {
|
||||
step(): void {
|
||||
this.s1 = (171 * this.s1) % 30269;
|
||||
this.s2 = (172 * this.s2) % 30307;
|
||||
this.s3 = (170 * this.s3) % 30323;
|
||||
|
@ -28,10 +28,6 @@ function isRed(n: number): boolean {
|
||||
21, 23, 25, 27, 30, 32, 34, 36].includes(n);
|
||||
}
|
||||
|
||||
function isBlack(n: number): boolean {
|
||||
return !isRed(n);
|
||||
}
|
||||
|
||||
type Strategy = {
|
||||
match: (n: number) => boolean;
|
||||
payout: number;
|
||||
@ -102,14 +98,14 @@ const strategies: {
|
||||
Third2: {
|
||||
match: (n: number): boolean => {
|
||||
if (n === 0) return false;
|
||||
return 13 <= n && n <= 24;
|
||||
return n >= 13 && n <= 24;
|
||||
},
|
||||
payout: 2,
|
||||
},
|
||||
Third3: {
|
||||
match: (n: number): boolean => {
|
||||
if (n === 0) return false;
|
||||
return 25 <= n;
|
||||
return n >= 25;
|
||||
},
|
||||
payout: 2,
|
||||
},
|
||||
@ -125,7 +121,7 @@ function Single(s: number): Strategy {
|
||||
}
|
||||
|
||||
export class Roulette extends Game<IProps, IState> {
|
||||
interval: number = -1;
|
||||
interval = -1;
|
||||
rng: WHRNG;
|
||||
|
||||
constructor(props: IProps) {
|
||||
@ -140,7 +136,7 @@ export class Roulette extends Game<IProps, IState> {
|
||||
lock: true,
|
||||
strategy: {
|
||||
payout: 0,
|
||||
match: (n: number): boolean => { return false },
|
||||
match: (): boolean => { return false },
|
||||
},
|
||||
}
|
||||
|
||||
@ -150,21 +146,21 @@ export class Roulette extends Game<IProps, IState> {
|
||||
}
|
||||
|
||||
|
||||
componentDidMount() {
|
||||
componentDidMount(): void {
|
||||
this.interval = setInterval(this.step, 50);
|
||||
}
|
||||
|
||||
step() {
|
||||
step(): void {
|
||||
if (!this.state.lock) {
|
||||
this.setState({n: Math.floor(Math.random()*37)});
|
||||
}
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
componentWillUnmount(): void {
|
||||
clearInterval(this.interval);
|
||||
}
|
||||
|
||||
updateInvestment(e: React.FormEvent<HTMLInputElement>) {
|
||||
updateInvestment(e: React.FormEvent<HTMLInputElement>): void {
|
||||
let investment: number = parseInt(e.currentTarget.value);
|
||||
if (isNaN(investment)) {
|
||||
investment = minPlay;
|
||||
@ -178,13 +174,13 @@ export class Roulette extends Game<IProps, IState> {
|
||||
this.setState({investment: investment});
|
||||
}
|
||||
|
||||
currentNumber() {
|
||||
currentNumber(): string {
|
||||
if (this.state.n === 0) return '0';
|
||||
const color = isRed(this.state.n) ? 'R' : 'B';
|
||||
return `${this.state.n}${color}`;
|
||||
}
|
||||
|
||||
play(s: Strategy) {
|
||||
play(s: Strategy): void {
|
||||
if(this.reachedLimit(this.props.p)) return;
|
||||
this.setState({
|
||||
canPlay: false,
|
||||
@ -223,10 +219,10 @@ export class Roulette extends Game<IProps, IState> {
|
||||
}
|
||||
|
||||
|
||||
render() {
|
||||
render(): React.ReactNode {
|
||||
return <>
|
||||
<h1>{this.currentNumber()}</h1>
|
||||
<input type="number" className='text-input' onChange={this.updateInvestment} placeholder={"Amount to play"} value={this.state.investment} disabled={!this.state.canPlay} />
|
||||
<input type="number" className="text-input" onChange={this.updateInvestment} placeholder={"Amount to play"} value={this.state.investment} disabled={!this.state.canPlay} />
|
||||
<h1>{this.state.status}</h1>
|
||||
<table>
|
||||
<tbody>
|
||||
|
@ -20,7 +20,7 @@ type IState = {
|
||||
}
|
||||
|
||||
// statically shuffled array of symbols.
|
||||
let symbols = ["D", "C", "$", "?", "♥", "A", "C", "B", "C", "E", "B", "E", "C",
|
||||
const symbols = ["D", "C", "$", "?", "♥", "A", "C", "B", "C", "E", "B", "E", "C",
|
||||
"*", "D", "♥", "B", "A", "A", "A", "C", "A", "D", "B", "E", "?", "D", "*",
|
||||
"@", "♥", "B", "E", "?"];
|
||||
|
||||
@ -63,7 +63,7 @@ const maxPlay = 1e6;
|
||||
|
||||
export class SlotMachine extends Game<IProps, IState> {
|
||||
rng: WHRNG;
|
||||
interval: number = -1;
|
||||
interval = -1;
|
||||
|
||||
constructor(props: IProps) {
|
||||
super(props);
|
||||
@ -86,11 +86,11 @@ export class SlotMachine extends Game<IProps, IState> {
|
||||
this.updateInvestment = this.updateInvestment.bind(this);
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
componentDidMount(): void {
|
||||
this.interval = setInterval(this.step, 50);
|
||||
}
|
||||
|
||||
step() {
|
||||
step(): void {
|
||||
let stoppedOne = false;
|
||||
const index = this.state.index.slice();
|
||||
for(const i in index) {
|
||||
@ -106,7 +106,7 @@ export class SlotMachine extends Game<IProps, IState> {
|
||||
}
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
componentWillUnmount(): void {
|
||||
clearInterval(this.interval);
|
||||
}
|
||||
|
||||
@ -118,7 +118,7 @@ export class SlotMachine extends Game<IProps, IState> {
|
||||
];
|
||||
}
|
||||
|
||||
play() {
|
||||
play(): void {
|
||||
if(this.reachedLimit(this.props.p)) return;
|
||||
this.setState({status: 'playing'});
|
||||
this.win(this.props.p, -this.state.investment);
|
||||
@ -127,7 +127,7 @@ export class SlotMachine extends Game<IProps, IState> {
|
||||
setTimeout(this.lock, this.rng.random()*2000+1000);
|
||||
}
|
||||
|
||||
lock() {
|
||||
lock(): void {
|
||||
this.setState({
|
||||
locks: [
|
||||
Math.floor(this.rng.random()*symbols.length),
|
||||
@ -139,10 +139,10 @@ export class SlotMachine extends Game<IProps, IState> {
|
||||
})
|
||||
}
|
||||
|
||||
checkWinnings() {
|
||||
checkWinnings(): void {
|
||||
const t = this.getTable();
|
||||
const getPaylineData = function(payline: number[][]): string[] {
|
||||
let data = [];
|
||||
const data = [];
|
||||
for(const point of payline) {
|
||||
data.push(t[point[0]][point[1]]);
|
||||
}
|
||||
@ -176,14 +176,14 @@ export class SlotMachine extends Game<IProps, IState> {
|
||||
if(this.reachedLimit(this.props.p)) return;
|
||||
}
|
||||
|
||||
unlock() {
|
||||
unlock(): void {
|
||||
this.setState({
|
||||
locks: [-1, -1, -1, -1, -1],
|
||||
canPlay: false,
|
||||
})
|
||||
}
|
||||
|
||||
updateInvestment(e: React.FormEvent<HTMLInputElement>) {
|
||||
updateInvestment(e: React.FormEvent<HTMLInputElement>): void {
|
||||
let investment: number = parseInt(e.currentTarget.value);
|
||||
if (isNaN(investment)) {
|
||||
investment = minPlay;
|
||||
@ -197,7 +197,7 @@ export class SlotMachine extends Game<IProps, IState> {
|
||||
this.setState({investment: investment});
|
||||
}
|
||||
|
||||
render() {
|
||||
render(): React.ReactNode {
|
||||
const t = this.getTable();
|
||||
return <>
|
||||
<pre>
|
||||
@ -209,7 +209,7 @@ export class SlotMachine extends Game<IProps, IState> {
|
||||
| | {symbols[(this.state.index[0]+1)%symbols.length]} | {symbols[(this.state.index[1]+1)%symbols.length]} | {symbols[(this.state.index[2]+1)%symbols.length]} | {symbols[(this.state.index[3]+1)%symbols.length]} | {symbols[(this.state.index[4]+1)%symbols.length]} | |<br />
|
||||
+———————————————————————+<br />
|
||||
</pre>
|
||||
<input type="number" className='text-input' onChange={this.updateInvestment} placeholder={"Amount to play"} value={this.state.investment} disabled={!this.state.canPlay} />
|
||||
<input type="number" className="text-input" onChange={this.updateInvestment} placeholder={"Amount to play"} value={this.state.investment} disabled={!this.state.canPlay} />
|
||||
<StdButton onClick={trusted(this.play)} text={"Spin!"} disabled={!this.state.canPlay} />
|
||||
<h1>{this.state.status}</h1>
|
||||
<h2>Pay lines</h2>
|
||||
|
@ -90,7 +90,7 @@ function cinematicTextEnd() {
|
||||
var mainMenu = document.getElementById("mainmenu-container");
|
||||
container.appendChild(createElement("br"));
|
||||
|
||||
return new Promise (function(resolve, reject) {
|
||||
return new Promise (function(resolve) {
|
||||
container.appendChild(createElement("a", {
|
||||
class:"a-link-button", innerText:"Continue...",
|
||||
clickListener:()=>{
|
||||
@ -99,7 +99,7 @@ function cinematicTextEnd() {
|
||||
mainMenu.style.visibility = "visible";
|
||||
cinematicTextFlag = false;
|
||||
resolve();
|
||||
}
|
||||
},
|
||||
}));
|
||||
});
|
||||
}
|
||||
|
@ -2,7 +2,7 @@ import {
|
||||
CodingContract,
|
||||
CodingContractRewardType,
|
||||
CodingContractTypes,
|
||||
ICodingContractReward
|
||||
ICodingContractReward,
|
||||
} from "./CodingContracts";
|
||||
import { Factions } from "./Faction/Factions";
|
||||
import { Player } from "./Player";
|
||||
@ -15,7 +15,7 @@ import { HacknetServer } from "./Hacknet/HacknetServer";
|
||||
import { getRandomInt } from "../utils/helpers/getRandomInt";
|
||||
|
||||
|
||||
export function generateRandomContract() {
|
||||
export function generateRandomContract(): void {
|
||||
// First select a random problem type
|
||||
const problemType = getRandomProblemType();
|
||||
|
||||
@ -31,7 +31,7 @@ export function generateRandomContract() {
|
||||
randServer.addContract(contract);
|
||||
}
|
||||
|
||||
export function generateRandomContractOnHome() {
|
||||
export function generateRandomContractOnHome(): void {
|
||||
// First select a random problem type
|
||||
const problemType = getRandomProblemType();
|
||||
|
||||
@ -53,7 +53,7 @@ export interface IGenerateContractParams {
|
||||
fn?: string;
|
||||
}
|
||||
|
||||
export function generateContract(params: IGenerateContractParams) {
|
||||
export function generateContract(params: IGenerateContractParams): void {
|
||||
// Problem Type
|
||||
let problemType;
|
||||
const problemTypes = Object.keys(CodingContractTypes);
|
||||
@ -88,7 +88,7 @@ export function generateContract(params: IGenerateContractParams) {
|
||||
fn = getRandomFilename(server, reward);
|
||||
}
|
||||
|
||||
let contract = new CodingContract(fn, problemType, reward);
|
||||
const contract = new CodingContract(fn, problemType, reward);
|
||||
server.addContract(contract);
|
||||
}
|
||||
|
||||
@ -117,15 +117,15 @@ function sanitizeRewardType(rewardType: CodingContractRewardType): CodingContrac
|
||||
return type;
|
||||
}
|
||||
|
||||
function getRandomProblemType() {
|
||||
function getRandomProblemType(): string {
|
||||
const problemTypes = Object.keys(CodingContractTypes);
|
||||
let randIndex = getRandomInt(0, problemTypes.length - 1);
|
||||
const randIndex = getRandomInt(0, problemTypes.length - 1);
|
||||
|
||||
return problemTypes[randIndex];
|
||||
}
|
||||
|
||||
function getRandomReward(): ICodingContractReward {
|
||||
let reward: ICodingContractReward = {
|
||||
const reward: ICodingContractReward = {
|
||||
name: "",
|
||||
type: getRandomInt(0, CodingContractRewardType.Money),
|
||||
};
|
||||
@ -145,8 +145,8 @@ function getRandomReward(): ICodingContractReward {
|
||||
case CodingContractRewardType.FactionReputation: {
|
||||
// Get a random faction that player is a part of. That
|
||||
// faction must allow hacking contracts
|
||||
var numFactions = factionsThatAllowHacking.length;
|
||||
var randFaction = factionsThatAllowHacking[getRandomInt(0, numFactions - 1)];
|
||||
const numFactions = factionsThatAllowHacking.length;
|
||||
const randFaction = factionsThatAllowHacking[getRandomInt(0, numFactions - 1)];
|
||||
reward.name = randFaction;
|
||||
break;
|
||||
}
|
||||
|
@ -2,7 +2,7 @@ import {
|
||||
codingContractTypesMetadata,
|
||||
DescriptionFunc,
|
||||
GeneratorFunc,
|
||||
SolverFunc
|
||||
SolverFunc,
|
||||
} from "./data/codingcontracttypes";
|
||||
|
||||
import { IMap } from "./types";
|
||||
@ -10,7 +10,7 @@ import { IMap } from "./types";
|
||||
import {
|
||||
Generic_fromJSON,
|
||||
Generic_toJSON,
|
||||
Reviver
|
||||
Reviver,
|
||||
} from "../utils/JSONReviver";
|
||||
import { KEY } from "../utils/helpers/keyCodes";
|
||||
import { createElement } from "../utils/uiHelpers/createElement";
|
||||
@ -108,12 +108,6 @@ export interface ICodingContractReward {
|
||||
* The player receives a reward if the problem is solved correctly
|
||||
*/
|
||||
export class CodingContract {
|
||||
/**
|
||||
* Initiatizes a CodingContract from a JSON save state.
|
||||
*/
|
||||
static fromJSON(value: any): CodingContract {
|
||||
return Generic_fromJSON(CodingContract, value.data);
|
||||
}
|
||||
|
||||
/* Relevant data for the contract's problem */
|
||||
data: any;
|
||||
@ -126,13 +120,13 @@ export class CodingContract {
|
||||
reward: ICodingContractReward | null;
|
||||
|
||||
/* Number of times the Contract has been attempted */
|
||||
tries: number = 0;
|
||||
tries = 0;
|
||||
|
||||
/* String representing the contract's type. Must match type in ContractTypes */
|
||||
type: string;
|
||||
|
||||
constructor(fn: string = "",
|
||||
type: string = "Find Largest Prime Factor",
|
||||
constructor(fn = "",
|
||||
type = "Find Largest Prime Factor",
|
||||
reward: ICodingContractReward | null = null) {
|
||||
this.fn = fn;
|
||||
if (!this.fn.endsWith(".cct")) {
|
||||
@ -178,9 +172,9 @@ export class CodingContract {
|
||||
*/
|
||||
async prompt(): Promise<CodingContractResult> {
|
||||
// tslint:disable-next-line
|
||||
return new Promise<CodingContractResult>((resolve: Function, reject: Function) => {
|
||||
return new Promise<CodingContractResult>((resolve) => {
|
||||
const contractType: CodingContractType = CodingContractTypes[this.type];
|
||||
const popupId: string = `coding-contract-prompt-popup-${this.fn}`;
|
||||
const popupId = `coding-contract-prompt-popup-${this.fn}`;
|
||||
const title: HTMLElement = createElement("h1", {
|
||||
innerHTML: this.type,
|
||||
});
|
||||
@ -190,10 +184,16 @@ export class CodingContract {
|
||||
"after which the contract will self-destruct.<br><br>",
|
||||
`${contractType.desc(this.data).replace(/\n/g, "<br>")}`].join(" "),
|
||||
});
|
||||
let answerInput: HTMLInputElement;
|
||||
let solveBtn: HTMLElement;
|
||||
let cancelBtn: HTMLElement;
|
||||
answerInput = createElement("input", {
|
||||
const cancelBtn = createElement("a", {
|
||||
class: "a-link-button",
|
||||
clickListener: () => {
|
||||
resolve(CodingContractResult.Cancelled);
|
||||
removeElementById(popupId);
|
||||
},
|
||||
innerText: "Cancel",
|
||||
});
|
||||
const answerInput = createElement("input", {
|
||||
onkeydown: (e: any) => {
|
||||
if (e.keyCode === KEY.ENTER && answerInput.value !== "") {
|
||||
e.preventDefault();
|
||||
@ -219,14 +219,6 @@ export class CodingContract {
|
||||
},
|
||||
innerText: "Solve",
|
||||
});
|
||||
cancelBtn = createElement("a", {
|
||||
class: "a-link-button",
|
||||
clickListener: () => {
|
||||
resolve(CodingContractResult.Cancelled);
|
||||
removeElementById(popupId);
|
||||
},
|
||||
innerText: "Cancel",
|
||||
});
|
||||
const lineBreak: HTMLElement = createElement("br");
|
||||
createPopup(popupId, [title, lineBreak, txt, lineBreak, lineBreak, answerInput, solveBtn, cancelBtn]);
|
||||
answerInput.focus();
|
||||
@ -239,6 +231,14 @@ export class CodingContract {
|
||||
toJSON(): any {
|
||||
return Generic_toJSON("CodingContract", this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initiatizes a CodingContract from a JSON save state.
|
||||
*/
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
static fromJSON(value: any): CodingContract {
|
||||
return Generic_fromJSON(CodingContract, value.data);
|
||||
}
|
||||
}
|
||||
|
||||
Reviver.constructors.CodingContract = CodingContract;
|
||||
|
@ -6,7 +6,7 @@ import { Reviver } from "../../utils/JSONReviver";
|
||||
|
||||
export let Companies: IMap<Company> = {};
|
||||
|
||||
function addCompany(params: IConstructorParams) {
|
||||
function addCompany(params: IConstructorParams): void {
|
||||
if (Companies[params.name] != null) {
|
||||
console.warn(`Duplicate Company Position being defined: ${params.name}`);
|
||||
}
|
||||
@ -15,7 +15,7 @@ function addCompany(params: IConstructorParams) {
|
||||
|
||||
// Used to initialize new Company objects for the Companies map
|
||||
// Called when creating new game or after a prestige/reset
|
||||
export function initCompanies() {
|
||||
export function initCompanies(): void {
|
||||
// Save Old Company data for 'favor'
|
||||
const oldCompanies = Companies;
|
||||
|
||||
@ -40,11 +40,11 @@ export function initCompanies() {
|
||||
}
|
||||
|
||||
// Used to load Companies map from a save
|
||||
export function loadCompanies(saveString: string) {
|
||||
export function loadCompanies(saveString: string): void {
|
||||
Companies = JSON.parse(saveString, Reviver);
|
||||
}
|
||||
|
||||
// Utility function to check if a string is valid company name
|
||||
export function companyExists(name: string) {
|
||||
export function companyExists(name: string): boolean {
|
||||
return Companies.hasOwnProperty(name);
|
||||
}
|
||||
|
@ -25,12 +25,6 @@ const DefaultConstructorParams: IConstructorParams = {
|
||||
}
|
||||
|
||||
export class Company {
|
||||
/**
|
||||
* Initiatizes a Company from a JSON save state.
|
||||
*/
|
||||
static fromJSON(value: any): Company {
|
||||
return Generic_fromJSON(Company, value.data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Company name
|
||||
@ -136,7 +130,7 @@ export class Company {
|
||||
gainFavor(): void {
|
||||
if (this.favor == null) { this.favor = 0; }
|
||||
if (this.rolloverRep == null) { this.rolloverRep = 0; }
|
||||
var res = this.getFavorGain();
|
||||
const res = this.getFavorGain();
|
||||
if (res.length != 2) {
|
||||
console.error("Invalid result from getFavorGain() function");
|
||||
return;
|
||||
@ -170,6 +164,14 @@ export class Company {
|
||||
toJSON(): any {
|
||||
return Generic_toJSON("Company", this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initiatizes a Company from a JSON save state.
|
||||
*/
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
static fromJSON(value: any): Company {
|
||||
return Generic_fromJSON(Company, value.data);
|
||||
}
|
||||
}
|
||||
|
||||
Reviver.constructors.Company = Company;
|
||||
|
@ -5,7 +5,7 @@ import { IMap } from "../types";
|
||||
|
||||
export const CompanyPositions: IMap<CompanyPosition> = {};
|
||||
|
||||
function addCompanyPosition(params: IConstructorParams) {
|
||||
function addCompanyPosition(params: IConstructorParams): void {
|
||||
if (CompanyPositions[params.name] != null) {
|
||||
console.warn(`Duplicate Company Position being defined: ${params.name}`);
|
||||
}
|
||||
|
@ -5,8 +5,8 @@ import { CompanyPosition } from "./CompanyPosition";
|
||||
* Returns a string with the given CompanyPosition's stat requirements
|
||||
*/
|
||||
|
||||
export function getJobRequirementText(company: Company, pos: CompanyPosition, tooltiptext: boolean = false): string {
|
||||
let reqText: string = "";
|
||||
export function getJobRequirementText(company: Company, pos: CompanyPosition, tooltiptext = false): string {
|
||||
let reqText = "";
|
||||
const offset: number = company.jobStatReqOffset;
|
||||
const reqHacking: number = pos.requiredHacking > 0 ? pos.requiredHacking+offset : 0;
|
||||
const reqStrength: number = pos.requiredStrength > 0 ? pos.requiredStrength+offset : 0;
|
||||
|
@ -95,7 +95,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
companyPositions: Object.assign({},
|
||||
AllTechnologyPositions,
|
||||
AllBusinessPositions,
|
||||
AllSecurityPositions
|
||||
AllSecurityPositions,
|
||||
),
|
||||
expMultiplier: 3,
|
||||
salaryMultiplier: 3,
|
||||
@ -107,7 +107,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
companyPositions: Object.assign({},
|
||||
AllTechnologyPositions,
|
||||
AllBusinessPositions,
|
||||
AllSecurityPositions
|
||||
AllSecurityPositions,
|
||||
),
|
||||
expMultiplier: 3,
|
||||
salaryMultiplier: 3,
|
||||
@ -119,7 +119,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
companyPositions: Object.assign({},
|
||||
AllTechnologyPositions,
|
||||
AllBusinessPositions,
|
||||
AllSecurityPositions
|
||||
AllSecurityPositions,
|
||||
),
|
||||
expMultiplier: 2.6,
|
||||
salaryMultiplier: 2.6,
|
||||
@ -131,7 +131,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
companyPositions: Object.assign({},
|
||||
AllTechnologyPositions,
|
||||
AllBusinessPositions,
|
||||
AllSecurityPositions
|
||||
AllSecurityPositions,
|
||||
),
|
||||
expMultiplier: 2.75,
|
||||
salaryMultiplier: 2.75,
|
||||
@ -143,7 +143,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
companyPositions: Object.assign({},
|
||||
AllTechnologyPositions,
|
||||
AllBusinessPositions,
|
||||
AllSecurityPositions
|
||||
AllSecurityPositions,
|
||||
),
|
||||
expMultiplier: 2.75,
|
||||
salaryMultiplier: 2.75,
|
||||
@ -155,7 +155,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
companyPositions: Object.assign({},
|
||||
AllTechnologyPositions,
|
||||
AllBusinessPositions,
|
||||
AllSecurityPositions
|
||||
AllSecurityPositions,
|
||||
),
|
||||
expMultiplier: 2.25,
|
||||
salaryMultiplier: 2.25,
|
||||
@ -167,7 +167,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
companyPositions: Object.assign({},
|
||||
AllTechnologyPositions,
|
||||
AllBusinessPositions,
|
||||
AllSecurityPositions
|
||||
AllSecurityPositions,
|
||||
),
|
||||
expMultiplier: 2.25,
|
||||
salaryMultiplier: 2.25,
|
||||
@ -179,7 +179,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
companyPositions: Object.assign({},
|
||||
AllTechnologyPositions,
|
||||
AllBusinessPositions,
|
||||
AllSecurityPositions
|
||||
AllSecurityPositions,
|
||||
),
|
||||
expMultiplier: 2.5,
|
||||
salaryMultiplier: 2.5,
|
||||
@ -191,7 +191,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
companyPositions: Object.assign({},
|
||||
AllTechnologyPositions,
|
||||
AllBusinessPositions,
|
||||
AllSecurityPositions
|
||||
AllSecurityPositions,
|
||||
),
|
||||
expMultiplier: 2.2,
|
||||
salaryMultiplier: 2.2,
|
||||
@ -202,7 +202,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
info: "",
|
||||
companyPositions: Object.assign({},
|
||||
AllTechnologyPositions,
|
||||
AllBusinessPositions
|
||||
AllBusinessPositions,
|
||||
),
|
||||
expMultiplier: 2,
|
||||
salaryMultiplier: 2,
|
||||
@ -214,7 +214,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
companyPositions: Object.assign({},
|
||||
AllTechnologyPositions,
|
||||
AllSoftwareConsultantPositions,
|
||||
AllBusinessPositions
|
||||
AllBusinessPositions,
|
||||
),
|
||||
expMultiplier: 1.8,
|
||||
salaryMultiplier: 1.8,
|
||||
@ -226,7 +226,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
companyPositions: Object.assign({},
|
||||
CEOOnly,
|
||||
AllTechnologyPositions,
|
||||
AllSoftwareConsultantPositions
|
||||
AllSoftwareConsultantPositions,
|
||||
),
|
||||
expMultiplier: 1.75,
|
||||
salaryMultiplier: 1.75,
|
||||
@ -238,7 +238,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
companyPositions: Object.assign({},
|
||||
CEOOnly,
|
||||
AllTechnologyPositions,
|
||||
AllSoftwareConsultantPositions
|
||||
AllSoftwareConsultantPositions,
|
||||
),
|
||||
expMultiplier: 1.8,
|
||||
salaryMultiplier: 1.8,
|
||||
@ -250,7 +250,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
companyPositions: Object.assign({},
|
||||
AllTechnologyPositions,
|
||||
AllBusinessPositions,
|
||||
AllSoftwareConsultantPositions
|
||||
AllSoftwareConsultantPositions,
|
||||
),
|
||||
expMultiplier: 1.8,
|
||||
salaryMultiplier: 1.8,
|
||||
@ -262,7 +262,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
companyPositions: Object.assign({},
|
||||
AllTechnologyPositions,
|
||||
AllBusinessPositions,
|
||||
AllSoftwareConsultantPositions
|
||||
AllSoftwareConsultantPositions,
|
||||
),
|
||||
expMultiplier: 1.9,
|
||||
salaryMultiplier: 1.9,
|
||||
@ -274,7 +274,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
companyPositions: Object.assign({},
|
||||
AllTechnologyPositions,
|
||||
AllBusinessPositions,
|
||||
AllSoftwareConsultantPositions
|
||||
AllSoftwareConsultantPositions,
|
||||
),
|
||||
expMultiplier: 2,
|
||||
salaryMultiplier: 2,
|
||||
@ -286,7 +286,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
companyPositions: Object.assign({},
|
||||
AllTechnologyPositions,
|
||||
AllBusinessPositions,
|
||||
AllSoftwareConsultantPositions
|
||||
AllSoftwareConsultantPositions,
|
||||
),
|
||||
expMultiplier: 1.9,
|
||||
salaryMultiplier: 1.9,
|
||||
@ -299,7 +299,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
CEOOnly,
|
||||
OperationsManagerOnly,
|
||||
AllTechnologyPositions,
|
||||
AllSecurityPositions
|
||||
AllSecurityPositions,
|
||||
),
|
||||
expMultiplier: 1.7,
|
||||
salaryMultiplier: 1.7,
|
||||
@ -351,7 +351,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
AllTechnologyPositions,
|
||||
AllBusinessPositions,
|
||||
AllSoftwareConsultantPositions,
|
||||
AllSecurityPositions
|
||||
AllSecurityPositions,
|
||||
),
|
||||
expMultiplier: 1.8,
|
||||
salaryMultiplier: 1.8,
|
||||
@ -364,7 +364,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
AllTechnologyPositions,
|
||||
AllBusinessPositions,
|
||||
AllSoftwareConsultantPositions,
|
||||
AllSecurityPositions
|
||||
AllSecurityPositions,
|
||||
),
|
||||
expMultiplier: 1.75,
|
||||
salaryMultiplier: 1.75,
|
||||
@ -379,7 +379,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
SecurityEngineerPositions,
|
||||
AllITPositions,
|
||||
AllSecurityPositions,
|
||||
AllAgentPositions
|
||||
AllAgentPositions,
|
||||
),
|
||||
expMultiplier: 2,
|
||||
salaryMultiplier: 2,
|
||||
@ -394,7 +394,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
SecurityEngineerPositions,
|
||||
AllITPositions,
|
||||
AllSecurityPositions,
|
||||
AllAgentPositions
|
||||
AllAgentPositions,
|
||||
),
|
||||
expMultiplier: 2,
|
||||
salaryMultiplier: 2,
|
||||
@ -409,7 +409,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
AllITPositions,
|
||||
AllSecurityPositions,
|
||||
AllAgentPositions,
|
||||
AllSoftwareConsultantPositions
|
||||
AllSoftwareConsultantPositions,
|
||||
),
|
||||
expMultiplier: 1.5,
|
||||
salaryMultiplier: 1.5,
|
||||
@ -422,7 +422,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
AllTechnologyPositions,
|
||||
AllSoftwareConsultantPositions,
|
||||
AllBusinessPositions,
|
||||
AllSecurityPositions
|
||||
AllSecurityPositions,
|
||||
),
|
||||
expMultiplier: 1.4,
|
||||
salaryMultiplier: 1.4,
|
||||
@ -433,7 +433,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
info: "",
|
||||
companyPositions: Object.assign({},
|
||||
SoftwarePositionsUpToLeadDeveloper,
|
||||
BusinessPositionsUpToOperationsManager
|
||||
BusinessPositionsUpToOperationsManager,
|
||||
),
|
||||
expMultiplier: 1.3,
|
||||
salaryMultiplier: 1.3,
|
||||
@ -445,7 +445,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
companyPositions: Object.assign({},
|
||||
SoftwarePositionsUpToLeadDeveloper,
|
||||
BusinessPositionsUpToOperationsManager,
|
||||
AllSoftwareConsultantPositions
|
||||
AllSoftwareConsultantPositions,
|
||||
),
|
||||
expMultiplier: 1.5,
|
||||
salaryMultiplier: 1.5,
|
||||
@ -456,7 +456,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
info: "",
|
||||
companyPositions: Object.assign({},
|
||||
AllSecurityPositions,
|
||||
SoftwarePositionsUpToLeadDeveloper
|
||||
SoftwarePositionsUpToLeadDeveloper,
|
||||
),
|
||||
expMultiplier: 1.3,
|
||||
salaryMultiplier: 1.3,
|
||||
@ -466,7 +466,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
name: LocationName.VolhavenSysCoreSecurities,
|
||||
info: "",
|
||||
companyPositions: Object.assign({},
|
||||
AllTechnologyPositions
|
||||
AllTechnologyPositions,
|
||||
),
|
||||
expMultiplier: 1.3,
|
||||
salaryMultiplier: 1.3,
|
||||
@ -476,7 +476,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
name: LocationName.VolhavenCompuTek,
|
||||
info: "",
|
||||
companyPositions: Object.assign({},
|
||||
AllTechnologyPositions
|
||||
AllTechnologyPositions,
|
||||
),
|
||||
expMultiplier: 1.2,
|
||||
salaryMultiplier: 1.2,
|
||||
@ -486,7 +486,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
name: LocationName.AevumNetLinkTechnologies,
|
||||
info: "",
|
||||
companyPositions: Object.assign({},
|
||||
AllTechnologyPositions
|
||||
AllTechnologyPositions,
|
||||
),
|
||||
expMultiplier: 1.2,
|
||||
salaryMultiplier: 1.2,
|
||||
@ -509,7 +509,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
name: LocationName.Sector12FoodNStuff,
|
||||
info: "",
|
||||
companyPositions: Object.assign({},
|
||||
EmployeeOnly, PartTimeEmployeeOnly
|
||||
EmployeeOnly, PartTimeEmployeeOnly,
|
||||
),
|
||||
expMultiplier: 1,
|
||||
salaryMultiplier: 1,
|
||||
@ -519,7 +519,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
name: LocationName.Sector12JoesGuns,
|
||||
info: "",
|
||||
companyPositions: Object.assign({},
|
||||
EmployeeOnly, PartTimeEmployeeOnly
|
||||
EmployeeOnly, PartTimeEmployeeOnly,
|
||||
),
|
||||
expMultiplier: 1,
|
||||
salaryMultiplier: 1,
|
||||
@ -531,7 +531,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
companyPositions: Object.assign({},
|
||||
AllSoftwarePositions,
|
||||
AllSoftwareConsultantPositions,
|
||||
AllITPositions
|
||||
AllITPositions,
|
||||
),
|
||||
expMultiplier: 1.1,
|
||||
salaryMultiplier: 1.1,
|
||||
@ -541,7 +541,7 @@ export const companiesMetadata: IConstructorParams[] = [
|
||||
name: LocationName.NewTokyoNoodleBar,
|
||||
info: "",
|
||||
companyPositions: Object.assign({},
|
||||
WaiterOnly, PartTimeWaiterOnly
|
||||
WaiterOnly, PartTimeWaiterOnly,
|
||||
),
|
||||
expMultiplier: 1,
|
||||
salaryMultiplier: 1,
|
||||
|
@ -8,23 +8,23 @@ export const SoftwareCompanyPositions: string[] = [
|
||||
"Head of Software",
|
||||
"Head of Engineering",
|
||||
"Vice President of Technology",
|
||||
"Chief Technology Officer"
|
||||
"Chief Technology Officer",
|
||||
];
|
||||
|
||||
export const ITCompanyPositions: string[] = [
|
||||
"IT Intern",
|
||||
"IT Analyst",
|
||||
"IT Manager",
|
||||
"Systems Administrator"
|
||||
"Systems Administrator",
|
||||
];
|
||||
|
||||
export const SecurityEngineerCompanyPositions: string[] = [
|
||||
"Security Engineer"
|
||||
"Security Engineer",
|
||||
];
|
||||
|
||||
export const NetworkEngineerCompanyPositions: string[] = [
|
||||
"Network Engineer",
|
||||
"Network Administrator"
|
||||
"Network Administrator",
|
||||
];
|
||||
|
||||
export const BusinessCompanyPositions: string[] = [
|
||||
@ -33,7 +33,7 @@ export const BusinessCompanyPositions: string[] = [
|
||||
"Business Manager",
|
||||
"Operations Manager",
|
||||
"Chief Financial Officer",
|
||||
"Chief Executive Officer"
|
||||
"Chief Executive Officer",
|
||||
];
|
||||
|
||||
export const SecurityCompanyPositions: string[] = [
|
||||
@ -42,31 +42,31 @@ export const SecurityCompanyPositions: string[] = [
|
||||
"Security Guard",
|
||||
"Security Officer",
|
||||
"Security Supervisor",
|
||||
"Head of Security"
|
||||
"Head of Security",
|
||||
];
|
||||
|
||||
export const AgentCompanyPositions: string[] = [
|
||||
"Field Agent",
|
||||
"Secret Agent",
|
||||
"Special Operative"
|
||||
"Special Operative",
|
||||
];
|
||||
|
||||
export const MiscCompanyPositions: string[] = [
|
||||
"Waiter",
|
||||
"Employee"
|
||||
"Employee",
|
||||
];
|
||||
|
||||
export const SoftwareConsultantCompanyPositions: string[] = [
|
||||
"Software Consultant",
|
||||
"Senior Software Consultant"
|
||||
"Senior Software Consultant",
|
||||
];
|
||||
|
||||
export const BusinessConsultantCompanyPositions: string[] = [
|
||||
"Business Consultant",
|
||||
"Senior Business Consultant"
|
||||
"Senior Business Consultant",
|
||||
];
|
||||
|
||||
export const PartTimeCompanyPositions: string[] = [
|
||||
"Part-time Waiter",
|
||||
"Part-time Employee"
|
||||
"Part-time Employee",
|
||||
];
|
||||
|
@ -5,7 +5,7 @@
|
||||
*/
|
||||
import { IMap } from "./types";
|
||||
|
||||
export let CONSTANTS: IMap<any> = {
|
||||
export const CONSTANTS: IMap<any> = {
|
||||
Version: "0.51.6",
|
||||
|
||||
/** Max level for any skill, assuming no multipliers. Determined by max numerical value in javascript for experience
|
||||
@ -268,5 +268,5 @@ export let CONSTANTS: IMap<any> = {
|
||||
* so many documentation and typos fixes (@Pimgd)
|
||||
* A corruption visual effect has been added to location with servers that
|
||||
have backdoor installed. (@dewint)
|
||||
`
|
||||
`,
|
||||
}
|
@ -5,7 +5,6 @@ import { CorporationUpgrades } from "./data/Corporation
|
||||
import { EmployeePositions } from "./EmployeePositions";
|
||||
import { Industries,
|
||||
IndustryStartingCosts,
|
||||
IndustryDescriptions,
|
||||
IndustryResearchTrees } from "./IndustryData";
|
||||
import { IndustryUpgrades } from "./IndustryUpgrades";
|
||||
import { Material } from "./Material";
|
||||
@ -15,11 +14,8 @@ import { ResearchMap } from "./ResearchMap";
|
||||
import { Warehouse } from "./Warehouse";
|
||||
|
||||
import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers";
|
||||
import { CONSTANTS } from "../Constants";
|
||||
import { Factions } from "../Faction/Factions";
|
||||
import { showLiterature } from "../Literature/LiteratureHelpers";
|
||||
import { LiteratureNames } from "../Literature/data/LiteratureNames";
|
||||
import { createCityMap } from "../Locations/Cities";
|
||||
import { CityName } from "../Locations/data/CityNames";
|
||||
import { Player } from "../Player";
|
||||
|
||||
@ -29,7 +25,6 @@ import { Page, routing } from "../ui/navigationTr
|
||||
import { calculateEffectWithFactors } from "../utils/calculateEffectWithFactors";
|
||||
|
||||
import { dialogBoxCreate } from "../../utils/DialogBox";
|
||||
import { clearSelector } from "../../utils/uiHelpers/clearSelector";
|
||||
import { Reviver,
|
||||
Generic_toJSON,
|
||||
Generic_fromJSON } from "../../utils/JSONReviver";
|
||||
@ -99,7 +94,6 @@ export const BaseMaxProducts = 3; // Initial value for maximum
|
||||
let researchTreeBoxOpened = false;
|
||||
let researchTreeBox = null;
|
||||
$(document).mousedown(function(event) {
|
||||
const boxId = "corporation-research-popup-box";
|
||||
const contentId = "corporation-research-popup-box-content";
|
||||
if (researchTreeBoxOpened) {
|
||||
if ( $(event.target).closest("#" + contentId).get(0) == null ) {
|
||||
@ -111,7 +105,6 @@ $(document).mousedown(function(event) {
|
||||
}
|
||||
});
|
||||
|
||||
var empManualAssignmentModeActive = false;
|
||||
function Industry(params={}) {
|
||||
this.offices = { //Maps locations to offices. 0 if no office at that location
|
||||
[CityName.Aevum]: 0,
|
||||
@ -122,7 +115,7 @@ function Industry(params={}) {
|
||||
}),
|
||||
[CityName.NewTokyo]: 0,
|
||||
[CityName.Ishima]: 0,
|
||||
[CityName.Volhaven]: 0
|
||||
[CityName.Volhaven]: 0,
|
||||
};
|
||||
|
||||
this.name = params.name ? params.name : 0;
|
||||
@ -183,7 +176,7 @@ function Industry(params={}) {
|
||||
}),
|
||||
[CityName.NewTokyo]: 0,
|
||||
[CityName.Ishima]: 0,
|
||||
[CityName.Volhaven]: 0
|
||||
[CityName.Volhaven]: 0,
|
||||
};
|
||||
|
||||
this.init();
|
||||
@ -378,7 +371,7 @@ Industry.prototype.init = function() {
|
||||
"Metal": 5,
|
||||
"Energy": 5,
|
||||
"Water": 2,
|
||||
"Hardware": 4
|
||||
"Hardware": 4,
|
||||
}
|
||||
this.prodMats = ["RealEstate"];
|
||||
this.makesProducts = true;
|
||||
@ -441,8 +434,7 @@ Industry.prototype.calculateProductionFactors = function() {
|
||||
continue;
|
||||
}
|
||||
|
||||
var materials = warehouse.materials,
|
||||
office = this.offices[city];
|
||||
var materials = warehouse.materials;
|
||||
|
||||
var cityMult = Math.pow(0.002 * materials.RealEstate.qty+1, this.reFac) *
|
||||
Math.pow(0.002 * materials.Hardware.qty+1, this.hwFac) *
|
||||
@ -535,7 +527,7 @@ Industry.prototype.process = function(marketCycles=1, state, company) {
|
||||
}
|
||||
|
||||
// Process change in demand and competition for this industry's materials
|
||||
Industry.prototype.processMaterialMarket = function(marketCycles=1) {
|
||||
Industry.prototype.processMaterialMarket = function() {
|
||||
//References to prodMats and reqMats
|
||||
var reqMats = this.reqMats, prodMats = this.prodMats;
|
||||
|
||||
@ -589,7 +581,7 @@ Industry.prototype.processProductMarket = function(marketCycles=1) {
|
||||
|
||||
//Process production, purchase, and import/export of materials
|
||||
Industry.prototype.processMaterials = function(marketCycles=1, company) {
|
||||
var revenue = 0, expenses = 0, industry = this;
|
||||
var revenue = 0, expenses = 0;
|
||||
this.calculateProductionFactors();
|
||||
|
||||
//At the start of the export state, set the imports of everything to 0
|
||||
@ -642,7 +634,7 @@ Industry.prototype.processMaterials = function(marketCycles=1, company) {
|
||||
mat.qty += buyAmt;
|
||||
expenses += (buyAmt * mat.bCost);
|
||||
}
|
||||
})(matName, industry);
|
||||
})(matName, this);
|
||||
this.updateWarehouseSizeUsed(warehouse);
|
||||
}
|
||||
} //End process purchase of materials
|
||||
@ -1003,7 +995,7 @@ Industry.prototype.processProduct = function(marketCycles=1, product, corporatio
|
||||
if (warehouse instanceof Warehouse) {
|
||||
switch(this.state) {
|
||||
|
||||
case "PRODUCTION":
|
||||
case "PRODUCTION": {
|
||||
//Calculate the maximum production of this material based
|
||||
//on the office's productivity
|
||||
var maxProd = this.getOfficeProductivity(office, {forProduct:true})
|
||||
@ -1065,8 +1057,8 @@ Industry.prototype.processProduct = function(marketCycles=1, product, corporatio
|
||||
//Keep track of production Per second
|
||||
product.data[city][1] = prod * producableFrac / (SecsPerMarketCycle * marketCycles);
|
||||
break;
|
||||
|
||||
case "SALE":
|
||||
}
|
||||
case "SALE": {
|
||||
//Process sale of Products
|
||||
product.pCost = 0; //Estimated production cost
|
||||
for (var reqMatName in product.reqMats) {
|
||||
@ -1174,7 +1166,7 @@ Industry.prototype.processProduct = function(marketCycles=1, product, corporatio
|
||||
product.data[city][2] = 0; //data[2] is sell property
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
case "START":
|
||||
case "PURCHASE":
|
||||
case "EXPORT":
|
||||
@ -1199,10 +1191,9 @@ Industry.prototype.discontinueProduct = function(product) {
|
||||
}
|
||||
|
||||
Industry.prototype.upgrade = function(upgrade, refs) {
|
||||
var corporation = refs.corporation, division = refs.division,
|
||||
office = refs.office;
|
||||
var upgN = upgrade[0], basePrice = upgrade[1], priceMult = upgrade[2],
|
||||
upgradeBenefit = upgrade[3];
|
||||
var corporation = refs.corporation;
|
||||
var office = refs.office;
|
||||
var upgN = upgrade[0];
|
||||
while (this.upgrades.length <= upgN) {this.upgrades.push(0);}
|
||||
++this.upgrades[upgN];
|
||||
|
||||
@ -1374,9 +1365,6 @@ Industry.prototype.createResearchBox = function() {
|
||||
},
|
||||
}
|
||||
|
||||
// Construct the tree with Treant
|
||||
const treantTree = new Treant(markup);
|
||||
|
||||
// Add Event Listeners for all Nodes
|
||||
const allResearch = researchTree.getAllNodes();
|
||||
for (let i = 0; i < allResearch.length; ++i) {
|
||||
@ -1620,7 +1608,7 @@ var OfficeSpaceTiers = {
|
||||
Basic: "Basic",
|
||||
Enhanced: "Enhanced",
|
||||
Luxurious: "Luxurious",
|
||||
Extravagant: "Extravagant"
|
||||
Extravagant: "Extravagant",
|
||||
}
|
||||
|
||||
function OfficeSpace(params={}) {
|
||||
@ -1658,7 +1646,7 @@ OfficeSpace.prototype.atCapacity = function() {
|
||||
}
|
||||
|
||||
OfficeSpace.prototype.process = function(marketCycles=1, parentRefs) {
|
||||
var corporation = parentRefs.corporation, industry = parentRefs.industry;
|
||||
var industry = parentRefs.industry;
|
||||
|
||||
// HRBuddy AutoRecruitment and training
|
||||
if (industry.hasResearch("HRBuddy-Recruitment") && !this.atCapacity()) {
|
||||
@ -1741,7 +1729,6 @@ OfficeSpace.prototype.calculateEmployeeProductivity = function(parentRefs) {
|
||||
|
||||
//Takes care of UI as well
|
||||
OfficeSpace.prototype.findEmployees = function(parentRefs) {
|
||||
var company = parentRefs.corporation, division = parentRefs.industry;
|
||||
if (this.atCapacity()) { return; }
|
||||
if (document.getElementById("cmpy-mgmt-hire-employee-popup") != null) {return;}
|
||||
|
||||
@ -1800,7 +1787,7 @@ OfficeSpace.prototype.findEmployees = function(parentRefs) {
|
||||
office.hireEmployee(employee, parentRefs);
|
||||
removeElementById("cmpy-mgmt-hire-employee-popup");
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
return div;
|
||||
};
|
||||
@ -1812,7 +1799,7 @@ OfficeSpace.prototype.findEmployees = function(parentRefs) {
|
||||
clickListener:() => {
|
||||
removeElementById("cmpy-mgmt-hire-employee-popup");
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
var elems = [text,
|
||||
@ -1825,7 +1812,7 @@ OfficeSpace.prototype.findEmployees = function(parentRefs) {
|
||||
}
|
||||
|
||||
OfficeSpace.prototype.hireEmployee = function(employee, parentRefs) {
|
||||
var company = parentRefs.corporation, division = parentRefs.industry;
|
||||
var company = parentRefs.corporation;
|
||||
var yesBtn = yesNoTxtInpBoxGetYesButton(),
|
||||
noBtn = yesNoTxtInpBoxGetNoButton();
|
||||
yesBtn.innerHTML = "Hire";
|
||||
@ -1958,15 +1945,14 @@ Corporation.prototype.storeCycles = function(numCycles=1) {
|
||||
}
|
||||
|
||||
Corporation.prototype.process = function() {
|
||||
var corp = this;
|
||||
if (this.storedCycles >= CyclesPerIndustryStateCycle) {
|
||||
const state = this.getState();
|
||||
const marketCycles = 1;
|
||||
const gameCycles = (marketCycles * CyclesPerIndustryStateCycle);
|
||||
this.storedCycles -= gameCycles;
|
||||
|
||||
this.divisions.forEach(function(ind) {
|
||||
ind.process(marketCycles, state, corp);
|
||||
this.divisions.forEach((ind) => {
|
||||
ind.process(marketCycles, state, this);
|
||||
});
|
||||
|
||||
// Process cooldowns
|
||||
@ -2111,7 +2097,7 @@ Corporation.prototype.goPublic = function() {
|
||||
onkeyup:(e) => {
|
||||
e.preventDefault();
|
||||
if (e.keyCode === KEY.ENTER) {yesBtn.click();}
|
||||
}
|
||||
},
|
||||
});
|
||||
var br = createElement("br", {});
|
||||
yesBtn = createElement("a", {
|
||||
@ -2138,7 +2124,7 @@ Corporation.prototype.goPublic = function() {
|
||||
dialogBoxCreate(`You took your ${this.name} public and earned ` +
|
||||
`${numeralWrapper.formatMoney(numShares * initialSharePrice)} in your IPO`);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
var noBtn = createElement("a", {
|
||||
class:"a-link-button",
|
||||
@ -2146,7 +2132,7 @@ Corporation.prototype.goPublic = function() {
|
||||
clickListener:() => {
|
||||
removeElementById(goPublicPopupId);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
createPopup(goPublicPopupId, [txt, br, input, yesBtn, noBtn]);
|
||||
}
|
||||
@ -2208,7 +2194,6 @@ Corporation.prototype.calculateShareSale = function(numShares) {
|
||||
|
||||
Corporation.prototype.convertCooldownToString = function(cd) {
|
||||
// The cooldown value is based on game cycles. Convert to a simple string
|
||||
const CyclesPerSecond = 1000 / CONSTANTS.MilliPerCycle;
|
||||
const seconds = cd / 5;
|
||||
|
||||
const SecondsPerMinute = 60;
|
||||
@ -2351,7 +2336,7 @@ Corporation.prototype.createUI = function() {
|
||||
companyManagementDiv = createElement("div", {
|
||||
id:"cmpy-mgmt-container",
|
||||
position:"fixed",
|
||||
class:"generic-menupage-container"
|
||||
class:"generic-menupage-container",
|
||||
});
|
||||
document.getElementById("entire-game-container").appendChild(companyManagementDiv);
|
||||
|
||||
|
@ -6,16 +6,10 @@ import { Generic_fromJSON,
|
||||
export const AllCorporationStates: string[] = ["START", "PURCHASE", "PRODUCTION", "SALE", "EXPORT"];
|
||||
|
||||
export class CorporationState {
|
||||
// Initiatizes a CorporationState object from a JSON save state.
|
||||
static fromJSON(value: any): CorporationState {
|
||||
return Generic_fromJSON(CorporationState, value.data);
|
||||
}
|
||||
|
||||
// Number representing what state the Corporation is in. The number
|
||||
// is an index for the array that holds all Corporation States
|
||||
state: number = 0;
|
||||
|
||||
constructor() {}
|
||||
state = 0;
|
||||
|
||||
// Get the name of the current state
|
||||
// NOTE: This does NOT return the number stored in the 'state' property,
|
||||
@ -40,6 +34,12 @@ export class CorporationState {
|
||||
toJSON(): any {
|
||||
return Generic_toJSON("CorporationState", this);
|
||||
}
|
||||
|
||||
// Initiatizes a CorporationState object from a JSON save state.
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
static fromJSON(value: any): CorporationState {
|
||||
return Generic_fromJSON(CorporationState, value.data);
|
||||
}
|
||||
}
|
||||
|
||||
Reviver.constructors.CorporationState = CorporationState;
|
||||
|
@ -4,8 +4,6 @@ import { getBaseResearchTreeCopy,
|
||||
|
||||
import { numeralWrapper } from "../ui/numeralFormat";
|
||||
|
||||
import { Reviver } from "../../utils/JSONReviver";
|
||||
|
||||
interface IIndustryMap<T> {
|
||||
Energy: T;
|
||||
Utilities: T;
|
||||
@ -107,7 +105,7 @@ export const IndustryDescriptions: IIndustryMap<string> = {
|
||||
|
||||
// Map of available Research for each Industry. This data is held in a
|
||||
// ResearchTree object
|
||||
export let IndustryResearchTrees: IIndustryMap<ResearchTree> = {
|
||||
export const IndustryResearchTrees: IIndustryMap<ResearchTree> = {
|
||||
Energy: getBaseResearchTreeCopy(),
|
||||
Utilities: getBaseResearchTreeCopy(),
|
||||
Agriculture: getBaseResearchTreeCopy(),
|
||||
@ -124,7 +122,7 @@ export let IndustryResearchTrees: IIndustryMap<ResearchTree> = {
|
||||
RealEstate: getProductIndustryResearchTreeCopy(),
|
||||
}
|
||||
|
||||
export function resetIndustryResearchTrees() {
|
||||
export function resetIndustryResearchTrees(): void {
|
||||
IndustryResearchTrees.Energy = getBaseResearchTreeCopy();
|
||||
IndustryResearchTrees.Utilities = getBaseResearchTreeCopy();
|
||||
IndustryResearchTrees.Agriculture = getBaseResearchTreeCopy();
|
||||
|
@ -11,5 +11,5 @@ export const IndustryUpgrades: IMap<any[]> = {
|
||||
"this upgrade grants your company a static increase of 3 and 1 to its awareness and " +
|
||||
"popularity, respectively. It will then increase your company's awareness by 1%, and its popularity " +
|
||||
"by a random percentage between 1% and 3%. These effects are increased by other upgrades " +
|
||||
"that increase the power of your advertising."]
|
||||
"that increase the power of your advertising."],
|
||||
}
|
||||
|
@ -7,56 +7,52 @@ interface IConstructorParams {
|
||||
}
|
||||
|
||||
export class Material {
|
||||
// Initiatizes a Material object from a JSON save state.
|
||||
static fromJSON(value: any): Material {
|
||||
return Generic_fromJSON(Material, value.data);
|
||||
}
|
||||
|
||||
// Name of material
|
||||
name: string = "InitName";
|
||||
name = "InitName";
|
||||
|
||||
// Amount of material owned
|
||||
qty: number = 0;
|
||||
qty = 0;
|
||||
|
||||
// Material's "quality". Unbounded
|
||||
qlt: number = 0;
|
||||
qlt = 0;
|
||||
|
||||
// How much demand the Material has in the market, and the range of possible
|
||||
// values for this "demand"
|
||||
dmd: number = 0;
|
||||
dmd = 0;
|
||||
dmdR: number[] = [0, 0];
|
||||
|
||||
// How much competition there is for this Material in the market, and the range
|
||||
// of possible values for this "competition"
|
||||
cmp: number = 0;
|
||||
cmp = 0;
|
||||
cmpR: number[] = [0, 0];
|
||||
|
||||
// Maximum volatility of this Materials stats
|
||||
mv: number = 0;
|
||||
mv = 0;
|
||||
|
||||
// Markup. Determines how high of a price you can charge on the material
|
||||
// compared to the market price without suffering loss in # of sales
|
||||
// Quality is divided by this to determine markup limits
|
||||
// e,g, If mku is 10 and quality is 100 then you can markup prices by 100/10 = 10
|
||||
mku: number = 0;
|
||||
mku = 0;
|
||||
|
||||
// How much of this material is being bought, sold, imported and produced every second
|
||||
buy: number = 0;
|
||||
sll: number = 0;
|
||||
prd: number = 0;
|
||||
imp: number = 0;
|
||||
buy = 0;
|
||||
sll = 0;
|
||||
prd = 0;
|
||||
imp = 0;
|
||||
|
||||
// Exports of this material to another warehouse/industry
|
||||
exp: any[] = [];
|
||||
|
||||
// Total amount of this material exported in the last cycle
|
||||
totalExp: number = 0;
|
||||
totalExp = 0;
|
||||
|
||||
// Cost / sec to buy this material. AKA Market Price
|
||||
bCost: number = 0;
|
||||
bCost = 0;
|
||||
|
||||
// Cost / sec to sell this material
|
||||
sCost: number = 0;
|
||||
sCost = 0;
|
||||
|
||||
// Flags to keep track of whether production and/or sale of this material is limited
|
||||
// [Whether production/sale is limited, limit amount]
|
||||
@ -64,9 +60,9 @@ export class Material {
|
||||
sllman: any[] = [false, 0]; // Sale
|
||||
|
||||
// Flags that signal whether automatic sale pricing through Market TA is enabled
|
||||
marketTa1: boolean = false;
|
||||
marketTa2: boolean = false;
|
||||
marketTa2Price: number = 0;
|
||||
marketTa1 = false;
|
||||
marketTa2 = false;
|
||||
marketTa2Price = 0;
|
||||
|
||||
constructor(params: IConstructorParams = {}) {
|
||||
if (params.name) { this.name = params.name; }
|
||||
@ -166,7 +162,7 @@ export class Material {
|
||||
const compChange: number = 1 + compVolatility;
|
||||
if (Math.random() < 0.5) {
|
||||
this.cmp *= compChange;
|
||||
if (this.cmp > this.cmpR[1]) {this.cmp = this.cmpR[1]};
|
||||
if (this.cmp > this.cmpR[1]) {this.cmp = this.cmpR[1]}
|
||||
this.bCost *= (1 / priceChange); // Competition increases, so price goes down
|
||||
} else {
|
||||
this.cmp *= (1 / compChange);
|
||||
@ -192,6 +188,12 @@ export class Material {
|
||||
toJSON(): any {
|
||||
return Generic_toJSON("Material", this);
|
||||
}
|
||||
|
||||
// Initiatizes a Material object from a JSON save state.
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
static fromJSON(value: any): Material {
|
||||
return Generic_fromJSON(Material, value.data);
|
||||
}
|
||||
}
|
||||
|
||||
Reviver.constructors.Material = Material;
|
||||
|
@ -42,49 +42,45 @@ interface IIndustry {
|
||||
|
||||
|
||||
export class Product {
|
||||
// Initiatizes a Product object from a JSON save state.
|
||||
static fromJSON(value: any): Product {
|
||||
return Generic_fromJSON(Product, value.data);
|
||||
}
|
||||
|
||||
// Product name
|
||||
name: string = "";
|
||||
name = "";
|
||||
|
||||
// The demand for this Product in the market. Gradually decreases
|
||||
dmd: number = 0;
|
||||
dmd = 0;
|
||||
|
||||
// How much competition there is in the market for this Product
|
||||
cmp: number = 0;
|
||||
cmp = 0;
|
||||
|
||||
// Markup. Affects how high of a price you can charge for this Product
|
||||
// without suffering a loss in the # of sales
|
||||
mku: number = 0;
|
||||
mku = 0;
|
||||
|
||||
// Production cost - estimation of how much money it costs to make this Product
|
||||
pCost: number = 0;
|
||||
pCost = 0;
|
||||
|
||||
// Sell cost
|
||||
sCost: number = 0;
|
||||
sCost = 0;
|
||||
|
||||
// Variables for handling the creation process of this Product
|
||||
fin: boolean = false; // Whether this Product has finished being created
|
||||
prog: number = 0; // Creation progress - A number betwee 0-100 representing percentage
|
||||
createCity: string = ""; // City in which the product is/was being created
|
||||
designCost: number = 0; // How much money was invested into designing this Product
|
||||
advCost: number = 0; // How much money was invested into advertising this Product
|
||||
fin = false; // Whether this Product has finished being created
|
||||
prog = 0; // Creation progress - A number betwee 0-100 representing percentage
|
||||
createCity = ""; // 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
|
||||
|
||||
// Aggregate score for this Product's 'rating'
|
||||
// This is based on the stats/properties below. The weighting of the
|
||||
// stats/properties below differs between different industries
|
||||
rat: number = 0;
|
||||
rat = 0;
|
||||
|
||||
// Stats/properties of this Product
|
||||
qlt: number = 0;
|
||||
per: number = 0;
|
||||
dur: number = 0;
|
||||
rel: number = 0;
|
||||
aes: number = 0;
|
||||
fea: number = 0;
|
||||
qlt = 0;
|
||||
per = 0;
|
||||
dur = 0;
|
||||
rel = 0;
|
||||
aes = 0;
|
||||
fea = 0;
|
||||
|
||||
// Data refers to the production, sale, and quantity of the products
|
||||
// These values are specific to a city
|
||||
@ -93,11 +89,11 @@ export class Product {
|
||||
|
||||
// Location of this Product
|
||||
// Only applies for location-based products like restaurants/hospitals
|
||||
loc: string = "";
|
||||
loc = "";
|
||||
|
||||
// How much space 1 unit of the Product takes (in the warehouse)
|
||||
// Not applicable for all Products
|
||||
siz: number = 0;
|
||||
siz = 0;
|
||||
|
||||
// Material requirements. An object that maps the name of a material to how much it requires
|
||||
// to make 1 unit of the product.
|
||||
@ -110,8 +106,8 @@ export class Product {
|
||||
sllman: IMap<any[]> = createCityMap<any[]>([false, 0]);
|
||||
|
||||
// Flags that signal whether automatic sale pricing through Market TA is enabled
|
||||
marketTa1: boolean = false;
|
||||
marketTa2: boolean = false;
|
||||
marketTa1 = false;
|
||||
marketTa2 = false;
|
||||
marketTa2Price: IMap<number> = createCityMap<number>(0);
|
||||
|
||||
constructor(params: IConstructorParams={}) {
|
||||
@ -135,7 +131,7 @@ export class Product {
|
||||
|
||||
// empWorkMult is a multiplier that increases progress rate based on
|
||||
// productivity of employees
|
||||
createProduct(marketCycles: number=1, empWorkMult: number=1): void {
|
||||
createProduct(marketCycles=1, empWorkMult=1): void {
|
||||
if (this.fin) { return; }
|
||||
this.prog += (marketCycles * .01 * empWorkMult);
|
||||
}
|
||||
@ -145,18 +141,18 @@ export class Product {
|
||||
this.fin = true;
|
||||
|
||||
//Calculate properties
|
||||
var progrMult = this.prog / 100;
|
||||
const progrMult = this.prog / 100;
|
||||
|
||||
const engrRatio = employeeProd[EmployeePositions.Engineer] / employeeProd["total"];
|
||||
const mgmtRatio = employeeProd[EmployeePositions.Management] / employeeProd["total"];
|
||||
const rndRatio = employeeProd[EmployeePositions.RandD] / employeeProd["total"];
|
||||
const opsRatio = employeeProd[EmployeePositions.Operations] / employeeProd["total"];
|
||||
const busRatio = employeeProd[EmployeePositions.Business] / employeeProd["total"];
|
||||
var designMult = 1 + (Math.pow(this.designCost, 0.1) / 100);
|
||||
var balanceMult = (1.2 * engrRatio) + (0.9 * mgmtRatio) + (1.3 * rndRatio) +
|
||||
const designMult = 1 + (Math.pow(this.designCost, 0.1) / 100);
|
||||
const balanceMult = (1.2 * engrRatio) + (0.9 * mgmtRatio) + (1.3 * rndRatio) +
|
||||
(1.5 * opsRatio) + (busRatio);
|
||||
var sciMult = 1 + (Math.pow(industry.sciResearch.qty, industry.sciFac) / 800);
|
||||
var totalMult = progrMult * balanceMult * designMult * sciMult;
|
||||
const sciMult = 1 + (Math.pow(industry.sciResearch.qty, industry.sciFac) / 800);
|
||||
const totalMult = progrMult * balanceMult * designMult * sciMult;
|
||||
|
||||
this.qlt = totalMult * ((0.10 * employeeProd[EmployeePositions.Engineer]) +
|
||||
(0.05 * employeeProd[EmployeePositions.Management]) +
|
||||
@ -189,14 +185,14 @@ export class Product {
|
||||
(0.05 * employeeProd[EmployeePositions.Operations]) +
|
||||
(0.05 * employeeProd[EmployeePositions.Business]));
|
||||
this.calculateRating(industry);
|
||||
var advMult = 1 + (Math.pow(this.advCost, 0.1) / 100);
|
||||
const advMult = 1 + (Math.pow(this.advCost, 0.1) / 100);
|
||||
this.mku = 100 / (advMult * Math.pow((this.qlt + 0.001), 0.65) * (busRatio + mgmtRatio));
|
||||
this.dmd = industry.awareness === 0 ? 20 : Math.min(100, advMult * (100 * (industry.popularity / industry.awareness)));
|
||||
this.cmp = getRandomInt(0, 70);
|
||||
|
||||
//Calculate the product's required materials
|
||||
//For now, just set it to be the same as the requirements to make materials
|
||||
for (var matName in industry.reqMats) {
|
||||
for (const matName in industry.reqMats) {
|
||||
if (industry.reqMats.hasOwnProperty(matName)) {
|
||||
this.reqMats[matName] = industry.reqMats[matName];
|
||||
}
|
||||
@ -205,7 +201,7 @@ export class Product {
|
||||
//Calculate the product's size
|
||||
//For now, just set it to be the same size as the requirements to make materials
|
||||
this.siz = 0;
|
||||
for (var matName in industry.reqMats) {
|
||||
for (const matName in industry.reqMats) {
|
||||
this.siz += MaterialSizes[matName] * industry.reqMats[matName];
|
||||
}
|
||||
|
||||
@ -240,6 +236,12 @@ export class Product {
|
||||
toJSON(): any {
|
||||
return Generic_toJSON("Product", this);
|
||||
}
|
||||
|
||||
// Initiatizes a Product object from a JSON save state.
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
static fromJSON(value: any): Product {
|
||||
return Generic_fromJSON(Product, value.data);
|
||||
}
|
||||
}
|
||||
|
||||
Reviver.constructors.Product = Product;
|
||||
|
@ -10,7 +10,7 @@ export interface IProductRatingWeight {
|
||||
Reliability?: number;
|
||||
}
|
||||
|
||||
export const ProductRatingWeights: IMap<object> = {
|
||||
export const ProductRatingWeights: IMap<any> = {
|
||||
[Industries.Food]: {
|
||||
Quality: 0.7,
|
||||
Durability: 0.1,
|
||||
@ -73,5 +73,5 @@ export const ProductRatingWeights: IMap<object> = {
|
||||
Reliability: 0.1,
|
||||
Aesthetics: 0.35,
|
||||
Features: 0.1,
|
||||
}
|
||||
},
|
||||
}
|
||||
|
@ -16,25 +16,25 @@ export interface IConstructorParams {
|
||||
|
||||
export class Research {
|
||||
// Name of research. This will be used to identify researches in the Research Tree
|
||||
name: string = "";
|
||||
name = "";
|
||||
|
||||
// How much scientific research it costs to unlock this
|
||||
cost: number = 0;
|
||||
cost = 0;
|
||||
|
||||
// Description of what the Research does
|
||||
desc: string = "";
|
||||
desc = "";
|
||||
|
||||
// All possible generic upgrades for the company, in the form of multipliers
|
||||
advertisingMult: number = 1;
|
||||
employeeChaMult: number = 1;
|
||||
employeeCreMult: number = 1;
|
||||
employeeEffMult: number = 1;
|
||||
employeeIntMult: number = 1;
|
||||
productionMult: number = 1;
|
||||
productProductionMult: number = 1;
|
||||
salesMult: number = 1;
|
||||
sciResearchMult: number = 1;
|
||||
storageMult: number = 1;
|
||||
advertisingMult = 1;
|
||||
employeeChaMult = 1;
|
||||
employeeCreMult = 1;
|
||||
employeeEffMult = 1;
|
||||
employeeIntMult = 1;
|
||||
productionMult = 1;
|
||||
productProductionMult = 1;
|
||||
salesMult = 1;
|
||||
sciResearchMult = 1;
|
||||
storageMult = 1;
|
||||
|
||||
constructor(p: IConstructorParams={name: "", cost: 0, desc: ""}) {
|
||||
this.name = p.name;
|
||||
|
@ -5,9 +5,9 @@ import { Research,
|
||||
import { researchMetadata } from "./data/ResearchMetadata";
|
||||
import { IMap } from "../types";
|
||||
|
||||
export let ResearchMap: IMap<Research> = {};
|
||||
export const ResearchMap: IMap<Research> = {};
|
||||
|
||||
function addResearch(p: IConstructorParams) {
|
||||
function addResearch(p: IConstructorParams): void {
|
||||
if (ResearchMap[p.name] != null) {
|
||||
console.warn(`Duplicate Research being defined: ${p.name}`);
|
||||
}
|
||||
|
@ -26,10 +26,10 @@ export class Node {
|
||||
|
||||
// How much Scientific Research is needed for this
|
||||
// Necessary to show it on the UI
|
||||
cost: number = 0;
|
||||
cost = 0;
|
||||
|
||||
// Whether or not this Research has been unlocked
|
||||
researched: boolean = false;
|
||||
researched = false;
|
||||
|
||||
// Parent node in the tree
|
||||
// The parent node defines the prerequisite Research (there can only be one)
|
||||
@ -37,7 +37,7 @@ export class Node {
|
||||
parent: Node | null = null;
|
||||
|
||||
// Name of the Research held in this Node
|
||||
text: string = "";
|
||||
text = "";
|
||||
|
||||
constructor(p: IConstructorParams = {cost: 0, text: ""}) {
|
||||
if (ResearchMap[p.text] == null) {
|
||||
@ -56,21 +56,21 @@ export class Node {
|
||||
}
|
||||
}
|
||||
|
||||
addChild(n: Node) {
|
||||
addChild(n: Node): void {
|
||||
this.children.push(n);
|
||||
n.parent = this;
|
||||
}
|
||||
|
||||
// Return an object that describes a TreantJS-compatible markup/config for this Node
|
||||
// See: http://fperucic.github.io/treant-js/
|
||||
createTreantMarkup(): object {
|
||||
createTreantMarkup(): any {
|
||||
const childrenArray = [];
|
||||
for (let i = 0; i < this.children.length; ++i) {
|
||||
childrenArray.push(this.children[i].createTreantMarkup());
|
||||
}
|
||||
|
||||
// Determine what css class this Node should have in the diagram
|
||||
let htmlClass: string = "";
|
||||
let htmlClass = "";
|
||||
if (this.researched) {
|
||||
htmlClass = "researched";
|
||||
} else if (this.parent && this.parent.researched === false) {
|
||||
@ -109,7 +109,7 @@ export class Node {
|
||||
return null;
|
||||
}
|
||||
|
||||
setParent(n: Node) {
|
||||
setParent(n: Node): void {
|
||||
this.parent = n;
|
||||
}
|
||||
}
|
||||
@ -124,11 +124,9 @@ export class ResearchTree {
|
||||
// Root Node
|
||||
root: Node | null = null;
|
||||
|
||||
constructor() {}
|
||||
|
||||
// Return an object that contains a Tree markup for TreantJS (using the JSON approach)
|
||||
// See: http://fperucic.github.io/treant-js/
|
||||
createTreantMarkup(): object {
|
||||
createTreantMarkup(): any {
|
||||
if (this.root == null) { return {}; }
|
||||
|
||||
const treeMarkup = this.root.createTreantMarkup();
|
||||
@ -205,7 +203,7 @@ export class ResearchTree {
|
||||
|
||||
// Helper function for all the multiplier getter fns
|
||||
getMultiplierHelper(propName: string): number {
|
||||
let res: number = 1;
|
||||
let res = 1;
|
||||
if (this.root == null) { return res; }
|
||||
|
||||
const queue: Node[] = [];
|
||||
|
@ -19,17 +19,13 @@ interface IConstructorParams {
|
||||
}
|
||||
|
||||
export class Warehouse {
|
||||
// Initiatizes a Warehouse object from a JSON save state.
|
||||
static fromJSON(value: any): Warehouse {
|
||||
return Generic_fromJSON(Warehouse, value.data);
|
||||
}
|
||||
|
||||
// Text that describes how the space in this Warehouse is being used
|
||||
// Used to create a tooltip in the UI
|
||||
breakdown: string = "";
|
||||
breakdown = "";
|
||||
|
||||
// Warehouse's level, which affects its maximum size
|
||||
level: number = 1;
|
||||
level = 1;
|
||||
|
||||
// City that this Warehouse is in
|
||||
loc: string;
|
||||
@ -41,19 +37,19 @@ export class Warehouse {
|
||||
size: number;
|
||||
|
||||
// Amount of space currently used by warehouse
|
||||
sizeUsed: number = 0;
|
||||
sizeUsed = 0;
|
||||
|
||||
// Whether Smart Supply is enabled for this Industry (the Industry that this Warehouse is for)
|
||||
smartSupplyEnabled: boolean = false;
|
||||
smartSupplyEnabled = false;
|
||||
|
||||
// Flag that indicates whether Smart Supply accounts for imports when calculating
|
||||
// the amount fo purchase
|
||||
smartSupplyConsiderExports: boolean = false;
|
||||
smartSupplyConsiderExports = false;
|
||||
|
||||
// Stores the amount of product to be produced. Used for Smart Supply unlock.
|
||||
// The production tracked by smart supply is always based on the previous cycle,
|
||||
// so it will always trail the "true" production by 1 cycle
|
||||
smartSupplyStore: number = 0;
|
||||
smartSupplyStore = 0;
|
||||
|
||||
constructor(params: IConstructorParams = {}) {
|
||||
this.loc = params.loc ? params.loc : "";
|
||||
@ -70,7 +66,7 @@ export class Warehouse {
|
||||
Drugs: new Material({name: "Drugs"}),
|
||||
Robots: new Material({name: "Robots"}),
|
||||
AICores: new Material({name: "AI Cores"}),
|
||||
RealEstate: new Material({name: "Real Estate"})
|
||||
RealEstate: new Material({name: "Real Estate"}),
|
||||
}
|
||||
|
||||
if (params.corp && params.industry) {
|
||||
@ -79,11 +75,11 @@ export class Warehouse {
|
||||
}
|
||||
|
||||
// Re-calculate how much space is being used by this Warehouse
|
||||
updateMaterialSizeUsed() {
|
||||
updateMaterialSizeUsed(): void {
|
||||
this.sizeUsed = 0;
|
||||
this.breakdown = "";
|
||||
for (const matName in this.materials) {
|
||||
var mat = this.materials[matName];
|
||||
const mat = this.materials[matName];
|
||||
if (MaterialSizes.hasOwnProperty(matName)) {
|
||||
this.sizeUsed += (mat.qty * MaterialSizes[matName]);
|
||||
if (mat.qty > 0) {
|
||||
@ -96,7 +92,7 @@ export class Warehouse {
|
||||
}
|
||||
}
|
||||
|
||||
updateSize(corporation: IParent, industry: IParent) {
|
||||
updateSize(corporation: IParent, industry: IParent): void {
|
||||
try {
|
||||
this.size = (this.level * 100)
|
||||
* corporation.getStorageMultiplier()
|
||||
@ -110,6 +106,12 @@ export class Warehouse {
|
||||
toJSON(): any {
|
||||
return Generic_toJSON("Warehouse", this);
|
||||
}
|
||||
|
||||
// Initiatizes a Warehouse object from a JSON save state.
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
static fromJSON(value: any): Warehouse {
|
||||
return Generic_fromJSON(Warehouse, value.data);
|
||||
}
|
||||
}
|
||||
|
||||
Reviver.constructors.Warehouse = Warehouse;
|
||||
|
@ -82,7 +82,7 @@ export const researchMetadata: IConstructorParams[] = [
|
||||
cost: 15e3,
|
||||
desc: "Use automated software to handle the hiring of employees. With this " +
|
||||
"research, each office will automatically hire one employee per " +
|
||||
"market cycle if there is available space."
|
||||
"market cycle if there is available space.",
|
||||
|
||||
},
|
||||
{
|
||||
@ -90,7 +90,7 @@ export const researchMetadata: IConstructorParams[] = [
|
||||
cost: 20e3,
|
||||
desc: "Use automated software to handle the training of employees. With this " +
|
||||
"research, each employee hired with HRBuddy-Recruitment will automatically " +
|
||||
"be assigned to 'Training', rather than being unassigned."
|
||||
"be assigned to 'Training', rather than being unassigned.",
|
||||
},
|
||||
{
|
||||
name: "JoyWire",
|
||||
|
@ -17,6 +17,4 @@ export class BaseReactComponent extends Component {
|
||||
routing() {
|
||||
return this.props.routing;
|
||||
}
|
||||
|
||||
render() {}
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ import { Corporation,
|
||||
import { Industries,
|
||||
IndustryStartingCosts,
|
||||
IndustryDescriptions,
|
||||
IndustryResearchTrees } from "../IndustryData";
|
||||
} from "../IndustryData";
|
||||
|
||||
import { MaterialSizes } from "../MaterialSizes";
|
||||
|
||||
@ -61,13 +61,13 @@ export class CorporationEventHandler {
|
||||
createBribeFactionsPopup() {
|
||||
const popupId = "cmpy-mgmt-bribe-factions-popup";
|
||||
const txt = createElement("p", {
|
||||
innerText:"You can use Corporation funds or stock shares to bribe Faction Leaders in exchange for faction reputation"
|
||||
innerText:"You can use Corporation funds or stock shares to bribe Faction Leaders in exchange for faction reputation",
|
||||
});
|
||||
const factionSelector = createElement("select", { margin:"3px" });
|
||||
for (let i = 0; i < Player.factions.length; ++i) {
|
||||
const facName = Player.factions[i];
|
||||
factionSelector.add(createElement("option", {
|
||||
text: facName, value: facName
|
||||
text: facName, value: facName,
|
||||
}));
|
||||
}
|
||||
var repGainText = createElement("p");
|
||||
@ -93,7 +93,7 @@ export class CorporationEventHandler {
|
||||
factionSelector.options[factionSelector.selectedIndex].value +
|
||||
" with this bribe";
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
stockSharesInput = createElement("input", {
|
||||
type:"number", placeholder:"Stock Shares", margin: "5px",
|
||||
@ -115,7 +115,7 @@ export class CorporationEventHandler {
|
||||
factionSelector.options[factionSelector.selectedIndex].value +
|
||||
" with this bribe";
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
var confirmButton = createElement("button", {
|
||||
class:"a-link-button", innerText:"Bribe", display:"inline-block",
|
||||
@ -145,7 +145,7 @@ export class CorporationEventHandler {
|
||||
removeElementById(popupId);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
const cancelButton = createPopupCloseButton(popupId, {
|
||||
class: "std-button",
|
||||
@ -187,7 +187,7 @@ export class CorporationEventHandler {
|
||||
costIndicator.innerText = "Purchase " + numShares + " shares for a total of " +
|
||||
numeralWrapper.format(numShares * buybackPrice, '$0.000a');
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
var confirmBtn = createElement("button", {
|
||||
class:"a-link-button", innerText:"Buy shares", display:"inline-block",
|
||||
@ -221,7 +221,7 @@ export class CorporationEventHandler {
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
},
|
||||
});
|
||||
var cancelBtn = createPopupCloseButton(popupId, {
|
||||
class: "std-button",
|
||||
@ -249,7 +249,7 @@ export class CorporationEventHandler {
|
||||
removeElementById(popupId);
|
||||
this.rerender();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
const cancelBtn = createPopupCloseButton(popupId, { innerText: "Cancel" });
|
||||
|
||||
@ -264,7 +264,7 @@ export class CorporationEventHandler {
|
||||
const exportTxt = createElement("p", {
|
||||
innerText:"Select the industry and city to export this material to, as well as " +
|
||||
"how much of this material to export per second. You can set the export " +
|
||||
"amount to 'MAX' to export all of the materials in this warehouse."
|
||||
"amount to 'MAX' to export all of the materials in this warehouse.",
|
||||
});
|
||||
|
||||
//Select industry and city to export to
|
||||
@ -286,7 +286,7 @@ export class CorporationEventHandler {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
for (let i = 0; i < corp.divisions.length; ++i) {
|
||||
@ -299,7 +299,7 @@ export class CorporationEventHandler {
|
||||
//Select amount to export
|
||||
const exportAmount = createElement("input", {
|
||||
class: "text-input",
|
||||
placeholder:"Export amount / s"
|
||||
placeholder:"Export amount / s",
|
||||
});
|
||||
|
||||
const exportBtn = createElement("button", {
|
||||
@ -328,14 +328,14 @@ export class CorporationEventHandler {
|
||||
mat.exp.push(exportObj);
|
||||
removeElementById(popupId);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
const cancelBtn = createPopupCloseButton(popupId, { innerText: "Cancel" });
|
||||
|
||||
const currExportsText = createElement("p", {
|
||||
innerText:"Below is a list of all current exports of this material from this warehouse. " +
|
||||
"Clicking on one of the exports below will REMOVE that export."
|
||||
"Clicking on one of the exports below will REMOVE that export.",
|
||||
});
|
||||
const currExports = [];
|
||||
for (var i = 0; i < mat.exp.length; ++i) {
|
||||
@ -349,7 +349,7 @@ export class CorporationEventHandler {
|
||||
mat.exp.splice(i, 1); //Remove export object
|
||||
removeElementById(popupId);
|
||||
createExportMaterialPopup(mat);
|
||||
}
|
||||
},
|
||||
}));
|
||||
})(i, mat, currExports);
|
||||
}
|
||||
@ -385,7 +385,7 @@ export class CorporationEventHandler {
|
||||
onkeyup: (e) => {
|
||||
e.preventDefault();
|
||||
if (e.keyCode === KEY.ENTER) {allocateBtn.click();}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
allocateBtn = createElement("button", {
|
||||
@ -404,7 +404,7 @@ export class CorporationEventHandler {
|
||||
|
||||
this.rerender();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
const cancelBtn = createPopupCloseButton(popupId, {
|
||||
@ -478,7 +478,7 @@ export class CorporationEventHandler {
|
||||
} else {
|
||||
updateDynamicText(this.corp);
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
issueBtn = createElement("button", {
|
||||
@ -523,7 +523,7 @@ export class CorporationEventHandler {
|
||||
|
||||
this.rerender();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
const cancelBtn = createPopupCloseButton(popupId, {
|
||||
@ -541,7 +541,7 @@ export class CorporationEventHandler {
|
||||
const popupId = "cmpy-mgmt-limit-product-production-popup";
|
||||
const txt = createElement("p", {
|
||||
innerText:"Enter a limit to the amount of this product you would " +
|
||||
"like to product per second. Leave the box empty to set no limit."
|
||||
"like to product per second. Leave the box empty to set no limit.",
|
||||
});
|
||||
let confirmBtn;
|
||||
const input = createElement("input", {
|
||||
@ -551,7 +551,7 @@ export class CorporationEventHandler {
|
||||
onkeyup: (e) => {
|
||||
e.preventDefault();
|
||||
if (e.keyCode === KEY.ENTER) { confirmBtn.click(); }
|
||||
}
|
||||
},
|
||||
});
|
||||
confirmBtn = createElement("button", {
|
||||
class: "std-button",
|
||||
@ -578,7 +578,7 @@ export class CorporationEventHandler {
|
||||
removeElementById(popupId);
|
||||
this.rerender();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
const cancelBtn = createPopupCloseButton(popupId, { innerText: "Cancel" });
|
||||
cancelBtn.style.margin = "6px";
|
||||
@ -600,7 +600,7 @@ export class CorporationEventHandler {
|
||||
if (division.offices[cityName] instanceof OfficeSpace) {
|
||||
designCity.add(createElement("option", {
|
||||
value: cityName,
|
||||
text: cityName
|
||||
text: cityName,
|
||||
}));
|
||||
}
|
||||
}
|
||||
@ -630,7 +630,7 @@ export class CorporationEventHandler {
|
||||
onkeyup: (e) => {
|
||||
e.preventDefault();
|
||||
if (e.keyCode === KEY.ENTER) { confirmBtn.click(); }
|
||||
}
|
||||
},
|
||||
});
|
||||
confirmBtn = createElement("button", {
|
||||
class: "std-button",
|
||||
@ -665,7 +665,7 @@ export class CorporationEventHandler {
|
||||
}
|
||||
this.rerender();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
})
|
||||
const cancelBtn = createPopupCloseButton(popupId, {
|
||||
class: "std-button",
|
||||
@ -679,8 +679,6 @@ export class CorporationEventHandler {
|
||||
|
||||
// Create a popup that lets the player use the Market TA research for Materials
|
||||
createMaterialMarketTaPopup(mat, industry) {
|
||||
const corp = this.corp;
|
||||
|
||||
const popupId = "cmpy-mgmt-marketta-popup";
|
||||
const markupLimit = mat.getMarkupLimit();
|
||||
const ta1 = createElement("p", {
|
||||
@ -699,7 +697,7 @@ export class CorporationEventHandler {
|
||||
for: useTa1AutoSaleId,
|
||||
innerText: "Use Market-TA.I for Auto-Sale Price",
|
||||
tooltip: "If this is enabled, then this Material will automatically " +
|
||||
"be sold at the price identified by Market-TA.I (i.e. the price shown above)"
|
||||
"be sold at the price identified by Market-TA.I (i.e. the price shown above)",
|
||||
})
|
||||
const useTa1AutoSaleCheckbox = createElement("input", {
|
||||
checked: mat.marketTa1,
|
||||
@ -708,7 +706,7 @@ export class CorporationEventHandler {
|
||||
type: "checkbox",
|
||||
changeListener: (e) => {
|
||||
mat.marketTa1 = e.target.checked;
|
||||
}
|
||||
},
|
||||
});
|
||||
useTa1AutoSaleDiv.appendChild(useTa1AutoSaleLabel);
|
||||
useTa1AutoSaleDiv.appendChild(useTa1AutoSaleCheckbox);
|
||||
@ -766,7 +764,7 @@ export class CorporationEventHandler {
|
||||
tooltip: "If this is enabled, then this Material will automatically " +
|
||||
"be sold at the optimal price such that the amount sold matches the " +
|
||||
"amount produced. (i.e. the highest possible price, while still ensuring " +
|
||||
" that all produced materials will be sold)"
|
||||
" that all produced materials will be sold)",
|
||||
})
|
||||
const useTa2AutoSaleCheckbox = createElement("input", {
|
||||
checked: mat.marketTa2,
|
||||
@ -775,14 +773,14 @@ export class CorporationEventHandler {
|
||||
type: "checkbox",
|
||||
changeListener: (e) => {
|
||||
mat.marketTa2 = e.target.checked;
|
||||
}
|
||||
},
|
||||
});
|
||||
useTa2AutoSaleDiv.appendChild(useTa2AutoSaleLabel);
|
||||
useTa2AutoSaleDiv.appendChild(useTa2AutoSaleCheckbox);
|
||||
|
||||
const ta2OverridesTa1 = createElement("p", {
|
||||
innerText: "Note that Market-TA.II overrides Market-TA.I. This means that if " +
|
||||
"both are enabled, then Market-TA.II will take effect, not Market-TA.I"
|
||||
"both are enabled, then Market-TA.II will take effect, not Market-TA.I",
|
||||
});
|
||||
|
||||
createPopup(popupId, [ta1, useTa1AutoSaleDiv, ta2Text, ta2Input, useTa2AutoSaleDiv, ta2OverridesTa1, closeBtn]);
|
||||
@ -805,7 +803,7 @@ export class CorporationEventHandler {
|
||||
if (!(division.offices[cityName] instanceof OfficeSpace)) {
|
||||
citySelector.add(createElement("option", {
|
||||
text: cityName,
|
||||
value: cityName
|
||||
value: cityName,
|
||||
}));
|
||||
}
|
||||
}
|
||||
@ -832,7 +830,7 @@ export class CorporationEventHandler {
|
||||
removeElementById(popupId);
|
||||
this.rerender();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
const cancelBtn = createPopupCloseButton(popupId, {
|
||||
class: "std-button",
|
||||
@ -852,7 +850,7 @@ export class CorporationEventHandler {
|
||||
innerHTML: "Create a new division to expand into a new industry:",
|
||||
});
|
||||
var selector = createElement("select", {
|
||||
class:"dropdown"
|
||||
class:"dropdown",
|
||||
});
|
||||
var industryDescription = createElement("p", {});
|
||||
var yesBtn;
|
||||
@ -866,11 +864,11 @@ export class CorporationEventHandler {
|
||||
onkeyup:(e)=>{
|
||||
e.preventDefault();
|
||||
if (e.keyCode === KEY.ENTER) {yesBtn.click();}
|
||||
}
|
||||
},
|
||||
});
|
||||
var nameLabel = createElement("label", {
|
||||
for:"cmpy-mgmt-expand-industry-name-input",
|
||||
innerText:"Division name: "
|
||||
innerText:"Division name: ",
|
||||
});
|
||||
yesBtn = createElement("span", {
|
||||
class:"popup-box-button",
|
||||
@ -905,7 +903,7 @@ export class CorporationEventHandler {
|
||||
this.rerender();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
const noBtn = createPopupCloseButton(popupId, {
|
||||
@ -923,7 +921,7 @@ export class CorporationEventHandler {
|
||||
// Have Agriculture be first as recommended option
|
||||
if (!ownedIndustries["Agriculture"]) {
|
||||
selector.add(createElement("option", {
|
||||
text:Industries["Agriculture"], value:"Agriculture"
|
||||
text:Industries["Agriculture"], value:"Agriculture",
|
||||
}));
|
||||
}
|
||||
|
||||
@ -964,8 +962,6 @@ export class CorporationEventHandler {
|
||||
|
||||
// Create a popup that lets the player use the Market TA research for Products
|
||||
createProductMarketTaPopup(product, industry) {
|
||||
const corp = this.corp;
|
||||
|
||||
const popupId = "cmpy-mgmt-marketta-popup";
|
||||
const markupLimit = product.rat / product.mku;
|
||||
const ta1 = createElement("p", {
|
||||
@ -984,7 +980,7 @@ export class CorporationEventHandler {
|
||||
for: useTa1AutoSaleId,
|
||||
innerText: "Use Market-TA.I for Auto-Sale Price",
|
||||
tooltip: "If this is enabled, then this Product will automatically " +
|
||||
"be sold at the price identified by Market-TA.I (i.e. the price shown above)"
|
||||
"be sold at the price identified by Market-TA.I (i.e. the price shown above)",
|
||||
})
|
||||
const useTa1AutoSaleCheckbox = createElement("input", {
|
||||
checked: product.marketTa1,
|
||||
@ -993,7 +989,7 @@ export class CorporationEventHandler {
|
||||
type: "checkbox",
|
||||
changeListener: (e) => {
|
||||
product.marketTa1 = e.target.checked;
|
||||
}
|
||||
},
|
||||
});
|
||||
useTa1AutoSaleDiv.appendChild(useTa1AutoSaleLabel);
|
||||
useTa1AutoSaleDiv.appendChild(useTa1AutoSaleCheckbox);
|
||||
@ -1043,7 +1039,7 @@ export class CorporationEventHandler {
|
||||
tooltip: "If this is enabled, then this Product will automatically " +
|
||||
"be sold at the optimal price such that the amount sold matches the " +
|
||||
"amount produced. (i.e. the highest possible price, while still ensuring " +
|
||||
" that all produced materials will be sold)"
|
||||
" that all produced materials will be sold)",
|
||||
})
|
||||
const useTa2AutoSaleCheckbox = createElement("input", {
|
||||
checked: product.marketTa2,
|
||||
@ -1052,14 +1048,14 @@ export class CorporationEventHandler {
|
||||
type: "checkbox",
|
||||
changeListener: (e) => {
|
||||
product.marketTa2 = e.target.checked;
|
||||
}
|
||||
},
|
||||
});
|
||||
useTa2AutoSaleDiv.appendChild(useTa2AutoSaleLabel);
|
||||
useTa2AutoSaleDiv.appendChild(useTa2AutoSaleCheckbox);
|
||||
|
||||
const ta2OverridesTa1 = createElement("p", {
|
||||
innerText: "Note that Market-TA.II overrides Market-TA.I. This means that if " +
|
||||
"both are enabled, then Market-TA.II will take effect, not Market-TA.I"
|
||||
"both are enabled, then Market-TA.II will take effect, not Market-TA.I",
|
||||
});
|
||||
|
||||
createPopup(popupId, [ta1, useTa1AutoSaleDiv, ta2Text, ta2Input, useTa2AutoSaleDiv, ta2OverridesTa1, closeBtn]);
|
||||
@ -1076,7 +1072,7 @@ export class CorporationEventHandler {
|
||||
const purchasePopupId = "cmpy-mgmt-material-purchase-popup";
|
||||
const txt = createElement("p", {
|
||||
innerHTML: "Enter the amount of " + mat.name + " you would like " +
|
||||
"to purchase per second. This material's cost changes constantly"
|
||||
"to purchase per second. This material's cost changes constantly",
|
||||
});
|
||||
let confirmBtn;
|
||||
let input = createElement("input", {
|
||||
@ -1087,7 +1083,7 @@ export class CorporationEventHandler {
|
||||
onkeyup: (e) => {
|
||||
e.preventDefault();
|
||||
if (e.keyCode === KEY.ENTER) {confirmBtn.click();}
|
||||
}
|
||||
},
|
||||
});
|
||||
confirmBtn = createElement("button", {
|
||||
innerText: "Confirm", class: "std-button",
|
||||
@ -1101,7 +1097,7 @@ export class CorporationEventHandler {
|
||||
this.rerender();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
const clearButton = createElement("button", {
|
||||
innerText: "Clear Purchase", class: "std-button",
|
||||
@ -1110,7 +1106,7 @@ export class CorporationEventHandler {
|
||||
removeElementById(purchasePopupId);
|
||||
this.rerender();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
const cancelBtn = createPopupCloseButton(purchasePopupId, {
|
||||
class: "std-button",
|
||||
@ -1153,7 +1149,7 @@ export class CorporationEventHandler {
|
||||
e.preventDefault();
|
||||
updateBulkPurchaseText(e.target.value);
|
||||
if (e.keyCode === KEY.ENTER) {bulkPurchaseConfirmBtn.click();}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
bulkPurchaseConfirmBtn = createElement("button", {
|
||||
@ -1184,7 +1180,7 @@ export class CorporationEventHandler {
|
||||
removeElementById(purchasePopupId);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
elems.push(bulkPurchaseInfo);
|
||||
@ -1224,7 +1220,7 @@ export class CorporationEventHandler {
|
||||
onkeyup: (e) => {
|
||||
e.preventDefault();
|
||||
if (e.keyCode === KEY.ENTER) {confirmBtn.click();}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
let inputButtonInitValue = mat.sCost ? mat.sCost : null;
|
||||
@ -1241,7 +1237,7 @@ export class CorporationEventHandler {
|
||||
onkeyup: (e) => {
|
||||
e.preventDefault();
|
||||
if (e.keyCode === KEY.ENTER) {confirmBtn.click();}
|
||||
}
|
||||
},
|
||||
});
|
||||
confirmBtn = createElement("button", {
|
||||
class: "std-button",
|
||||
@ -1307,7 +1303,7 @@ export class CorporationEventHandler {
|
||||
removeElementById(sellPopupId);
|
||||
this.rerender();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
const cancelBtn = createPopupCloseButton(sellPopupId, {
|
||||
class: "std-button",
|
||||
@ -1347,7 +1343,7 @@ export class CorporationEventHandler {
|
||||
onkeyup: (e) => {
|
||||
e.preventDefault();
|
||||
if (e.keyCode === KEY.ENTER) {confirmBtn.click();}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
let inputButtonInitValue = product.sCost ? product.sCost : null;
|
||||
@ -1365,7 +1361,7 @@ export class CorporationEventHandler {
|
||||
onkeyup: (e) => {
|
||||
e.preventDefault();
|
||||
if (e.keyCode === KEY.ENTER) {confirmBtn.click();}
|
||||
}
|
||||
},
|
||||
});
|
||||
const checkboxDiv = createElement("div", {
|
||||
border: "1px solid white",
|
||||
@ -1478,7 +1474,7 @@ export class CorporationEventHandler {
|
||||
removeElementById(popupId);
|
||||
this.rerender();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
const cancelBtn = createPopupCloseButton(popupId, { class: "std-button" });
|
||||
|
||||
@ -1515,12 +1511,10 @@ export class CorporationEventHandler {
|
||||
} else {
|
||||
const stockSaleResults = this.corp.calculateShareSale(numShares);
|
||||
const profit = stockSaleResults[0];
|
||||
const newSharePrice = stockSaleResults[1];
|
||||
const newSharesUntilUpdate = stockSaleResults[2];
|
||||
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",
|
||||
@ -1562,7 +1556,7 @@ export class CorporationEventHandler {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
});
|
||||
const cancelBtn = createPopupCloseButton(popupId, {
|
||||
class: "std-button",
|
||||
@ -1579,10 +1573,10 @@ export class CorporationEventHandler {
|
||||
const popupId = "cmpy-mgmt-throw-office-party-popup";
|
||||
const txt = createElement("p", {
|
||||
innerText:"Enter the amount of money you would like to spend PER EMPLOYEE " +
|
||||
"on this office party"
|
||||
"on this office party",
|
||||
});
|
||||
const totalCostTxt = createElement("p", {
|
||||
innerText:"Throwing this party will cost a total of $0"
|
||||
innerText:"Throwing this party will cost a total of $0",
|
||||
});
|
||||
let confirmBtn;
|
||||
const input = createElement("input", {
|
||||
@ -1598,7 +1592,7 @@ export class CorporationEventHandler {
|
||||
onkeyup:(e)=>{
|
||||
e.preventDefault();
|
||||
if (e.keyCode === KEY.ENTER) {confirmBtn.click();}
|
||||
}
|
||||
},
|
||||
});
|
||||
confirmBtn = createElement("button", {
|
||||
class: "std-button",
|
||||
@ -1622,7 +1616,7 @@ export class CorporationEventHandler {
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
const cancelBtn = createPopupCloseButton(popupId, { class: "std-button", innerText: "Cancel" });
|
||||
|
||||
@ -1661,7 +1655,7 @@ export class CorporationEventHandler {
|
||||
const upgradeCostMax = OfficeInitialCost * mult;
|
||||
|
||||
const text = createElement("p", {
|
||||
innerText:"Increase the size of your office space to fit additional employees!"
|
||||
innerText:"Increase the size of your office space to fit additional employees!",
|
||||
});
|
||||
const text2 = createElement("p", { innerText: "Upgrade size: " });
|
||||
|
||||
@ -1680,7 +1674,7 @@ export class CorporationEventHandler {
|
||||
}
|
||||
removeElementById(popupId);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
const confirmBtn15 = createElement("button", {
|
||||
class: this.corp.funds.lt(upgradeCost15) ? "a-link-button-inactive" : "a-link-button",
|
||||
@ -1697,7 +1691,7 @@ export class CorporationEventHandler {
|
||||
}
|
||||
removeElementById(popupId);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
const confirmBtnMax = createElement("button", {
|
||||
class:this.corp.funds.lt(upgradeCostMax) ? "a-link-button-inactive" : "a-link-button",
|
||||
@ -1714,7 +1708,7 @@ export class CorporationEventHandler {
|
||||
}
|
||||
removeElementById(popupId);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
const cancelBtn = createPopupCloseButton(popupId, { innerText: "Cancel" });
|
||||
cancelBtn.style.margin = "4px";
|
||||
|
@ -4,8 +4,6 @@
|
||||
import React from "react";
|
||||
import { BaseReactComponent } from "./BaseReactComponent";
|
||||
|
||||
import { overviewPage } from "./Routing";
|
||||
|
||||
function HeaderTab(props) {
|
||||
let className = "cmpy-mgmt-header-tab";
|
||||
if (props.current) {
|
||||
@ -71,7 +69,7 @@ export class HeaderTabs extends BaseReactComponent {
|
||||
{
|
||||
this.renderTab({
|
||||
onClick: this.eventHandler().createNewIndustryPopup.bind(this.eventHandler()),
|
||||
text: "Expand into new Industry"
|
||||
text: "Expand into new Industry",
|
||||
})
|
||||
}
|
||||
</div>
|
||||
|
@ -62,7 +62,6 @@ export class IndustryOffice extends BaseReactComponent {
|
||||
|
||||
// Calculate how many NEW emplyoees we need to account for
|
||||
const currentNumEmployees = office.employees.length;
|
||||
const newEmployees = currentNumEmployees - this.state.numEmployees;
|
||||
|
||||
// Record the number of employees in each position, for NEW employees only
|
||||
for (let i = this.state.numEmployees; i < office.employees.length; ++i) {
|
||||
|
@ -12,7 +12,6 @@ import { createProgressBarText } from "../../../utils/helpers/createProgressB
|
||||
|
||||
export class IndustryOverview extends BaseReactComponent {
|
||||
renderMakeProductButton() {
|
||||
const corp = this.corp();
|
||||
const division = this.routing().currentDivision; // Validated inside render()
|
||||
|
||||
var createProductButtonText, createProductPopupText;
|
||||
@ -97,7 +96,6 @@ export class IndustryOverview extends BaseReactComponent {
|
||||
const popularity = `Popularity: ${numeralWrapper.format(division.popularity, "0.000")}`;
|
||||
|
||||
let advertisingInfo = false;
|
||||
let advertisingTooltip;
|
||||
const advertisingFactors = division.getAdvertisingFactors();
|
||||
const awarenessFac = advertisingFactors[1];
|
||||
const popularityFac = advertisingFactors[2];
|
||||
|
@ -19,7 +19,6 @@ import { isString } from "../../../utils/helpers/isString";
|
||||
function ProductComponent(props) {
|
||||
const corp = props.corp;
|
||||
const division = props.division;
|
||||
const warehouse = props.warehouse;
|
||||
const city = props.city;
|
||||
const product = props.product;
|
||||
const eventHandler = props.eventHandler;
|
||||
@ -203,15 +202,6 @@ function MaterialComponent(props) {
|
||||
// Total gain or loss of this material (per second)
|
||||
const totalGain = mat.buy + mat.prd + mat.imp - mat.sll - mat.totalExp;
|
||||
|
||||
// Competition and demand info, if they're unlocked
|
||||
let cmpAndDmdText = "";
|
||||
if (corp.unlockUpgrades[2] === 1) {
|
||||
cmpAndDmdText += "<br>Demand: " + numeralWrapper.format(mat.dmd, nf);
|
||||
}
|
||||
if (corp.unlockUpgrades[3] === 1) {
|
||||
cmpAndDmdText += "<br>Competition: " + numeralWrapper.format(mat.cmp, nf);
|
||||
}
|
||||
|
||||
// Flag that determines whether this industry is "new" and the current material should be
|
||||
// marked with flashing-red lights
|
||||
const tutorial = division.newInd && Object.keys(division.reqMats).includes(mat.name) &&
|
||||
@ -511,7 +501,6 @@ export class IndustryWarehouse extends BaseReactComponent {
|
||||
}
|
||||
|
||||
render() {
|
||||
const corp = this.corp();
|
||||
const division = this.routing().currentDivision;
|
||||
if (division == null) {
|
||||
throw new Error(`Routing does not hold reference to the current Industry`);
|
||||
|
@ -7,7 +7,6 @@ import { BaseReactComponent } from "./BaseReactComponent";
|
||||
import { CityTabs } from "./CityTabs";
|
||||
import { Industry } from "./Industry";
|
||||
import { Overview } from "./Overview";
|
||||
import { overviewPage } from "./Routing";
|
||||
|
||||
import { OfficeSpace } from "../Corporation";
|
||||
|
||||
|
@ -158,7 +158,7 @@ export class Overview extends BaseReactComponent {
|
||||
onClick: findInvestorsOnClick,
|
||||
style: "inline-block",
|
||||
text: "Find Investors",
|
||||
tooltip: findInvestorsTooltip
|
||||
tooltip: findInvestorsTooltip,
|
||||
});
|
||||
const goPublicBtn = this.createButton({
|
||||
class: "std-button",
|
||||
@ -167,7 +167,7 @@ export class Overview extends BaseReactComponent {
|
||||
text: "Go Public",
|
||||
tooltip: "Become a publicly traded and owned entity. Going public " +
|
||||
"involves issuing shares for an IPO. Once you are a public " +
|
||||
"company, your shares will be traded on the stock market."
|
||||
"company, your shares will be traded on the stock market.",
|
||||
});
|
||||
|
||||
return (
|
||||
|
@ -1,15 +1,27 @@
|
||||
import { IMap } from "../../types";
|
||||
|
||||
export const overviewPage: string = "Overview";
|
||||
export const overviewPage = "Overview";
|
||||
|
||||
// Interfaces for whatever's required to sanitize routing with Corporation Data
|
||||
interface IOfficeSpace {
|
||||
|
||||
loc: string;
|
||||
cost: number;
|
||||
size: number;
|
||||
comf: number;
|
||||
beau: number;
|
||||
tier: any;
|
||||
minEne: number;
|
||||
maxEne: number;
|
||||
minHap: number;
|
||||
maxHap: number;
|
||||
maxMor: number;
|
||||
employees: any;
|
||||
employeeProd: any;
|
||||
}
|
||||
|
||||
interface IDivision {
|
||||
name: string;
|
||||
offices: IMap<IOfficeSpace>
|
||||
offices: IMap<IOfficeSpace>;
|
||||
}
|
||||
|
||||
interface ICorporation {
|
||||
@ -76,7 +88,7 @@ export class CorporationRouting {
|
||||
for (let i = 0; i < this.corp.divisions.length; ++i) {
|
||||
if (this.corp.divisions[i].name === page) {
|
||||
this.currentDivision = this.corp.divisions[i];
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// 'currentDivision' should not be null, since the routing is either on
|
||||
|
@ -22,49 +22,49 @@ export interface IConstructorParams {
|
||||
|
||||
export class Crime {
|
||||
// Number representing the difficulty of the crime. Used for success chance calculations
|
||||
difficulty: number = 0;
|
||||
difficulty = 0;
|
||||
|
||||
// Amount of karma lost for SUCCESSFULLY committing this crime
|
||||
karma: number = 0;
|
||||
karma = 0;
|
||||
|
||||
// How many people die as a result of this crime
|
||||
kills: number = 0;
|
||||
kills = 0;
|
||||
|
||||
// How much money is given by the
|
||||
money: number = 0;
|
||||
money = 0;
|
||||
|
||||
// Name of crime
|
||||
name: string = "";
|
||||
name = "";
|
||||
|
||||
// Milliseconds it takes to attempt the crime
|
||||
time: number = 0;
|
||||
time = 0;
|
||||
|
||||
// Corresponding type in CONSTANTS. Contains a description for the crime activity
|
||||
type: string = "";
|
||||
type = "";
|
||||
|
||||
// Weighting factors that determine how stats affect the success rate of this crime
|
||||
hacking_success_weight: number = 0;
|
||||
strength_success_weight: number = 0;
|
||||
defense_success_weight: number = 0;
|
||||
dexterity_success_weight: number = 0;
|
||||
agility_success_weight: number = 0;
|
||||
charisma_success_weight: number = 0;
|
||||
hacking_success_weight = 0;
|
||||
strength_success_weight = 0;
|
||||
defense_success_weight = 0;
|
||||
dexterity_success_weight = 0;
|
||||
agility_success_weight = 0;
|
||||
charisma_success_weight = 0;
|
||||
|
||||
// How much stat experience is granted by this crime
|
||||
hacking_exp: number = 0;
|
||||
strength_exp: number = 0;
|
||||
defense_exp: number = 0;
|
||||
dexterity_exp: number = 0;
|
||||
agility_exp: number = 0;
|
||||
charisma_exp: number = 0;
|
||||
intelligence_exp: number = 0;
|
||||
hacking_exp = 0;
|
||||
strength_exp = 0;
|
||||
defense_exp = 0;
|
||||
dexterity_exp = 0;
|
||||
agility_exp = 0;
|
||||
charisma_exp = 0;
|
||||
intelligence_exp = 0;
|
||||
|
||||
constructor(name: string = "",
|
||||
type: string = "",
|
||||
time: number = 0,
|
||||
money: number = 0,
|
||||
difficulty: number = 0,
|
||||
karma: number = 0,
|
||||
constructor(name = "",
|
||||
type = "",
|
||||
time = 0,
|
||||
money = 0,
|
||||
difficulty = 0,
|
||||
karma = 0,
|
||||
params: IConstructorParams={}) {
|
||||
this.name = name;
|
||||
this.type = type;
|
||||
@ -91,7 +91,7 @@ export class Crime {
|
||||
this.kills = params.kills ? params.kills : 0;
|
||||
}
|
||||
|
||||
commit(p: IPlayer, div: number=1, singParams: any=null): number {
|
||||
commit(p: IPlayer, div=1, singParams: any=null): number {
|
||||
if (div <= 0) { div = 1; }
|
||||
p.startCrime(
|
||||
this.type,
|
||||
@ -103,7 +103,7 @@ export class Crime {
|
||||
this.charisma_exp/div,
|
||||
this.money/div,
|
||||
this.time,
|
||||
singParams
|
||||
singParams,
|
||||
);
|
||||
|
||||
return this.time;
|
||||
|
@ -1,13 +1,14 @@
|
||||
import { Crimes } from "./Crimes";
|
||||
import { Crime } from "./Crime";
|
||||
import { IPlayer } from "../PersonObjects/IPlayer";
|
||||
|
||||
import { dialogBoxCreate } from "../../utils/DialogBox";
|
||||
|
||||
export function determineCrimeSuccess(p: IPlayer, type: string) {
|
||||
let chance: number = 0;
|
||||
let found: boolean = false;
|
||||
export function determineCrimeSuccess(p: IPlayer, type: string): boolean {
|
||||
let chance = 0;
|
||||
let found = false;
|
||||
for (const i in Crimes) {
|
||||
let crime = Crimes[i];
|
||||
const crime = Crimes[i];
|
||||
if (crime.type == type) {
|
||||
chance = crime.successRate(p);
|
||||
found = true;
|
||||
@ -17,7 +18,7 @@ export function determineCrimeSuccess(p: IPlayer, type: string) {
|
||||
|
||||
if (!found) {
|
||||
dialogBoxCreate(`ERR: Unrecognized crime type: ${type} This is probably a bug please contact the developer`, false);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (Math.random() <= chance) {
|
||||
@ -29,7 +30,7 @@ export function determineCrimeSuccess(p: IPlayer, type: string) {
|
||||
}
|
||||
}
|
||||
|
||||
export function findCrime(roughName: string) {
|
||||
export function findCrime(roughName: string): Crime | null {
|
||||
if (roughName.includes("shoplift")) {
|
||||
return Crimes.Shoplift;
|
||||
} else if (roughName.includes("rob") && roughName.includes("store")) {
|
||||
|
@ -22,7 +22,7 @@ export interface IPerson {
|
||||
crime_success_mult: number;
|
||||
}
|
||||
|
||||
export function calculateCrimeSuccessChance(crime: ICrime, person: IPerson) {
|
||||
export function calculateCrimeSuccessChance(crime: ICrime, person: IPerson): number {
|
||||
let chance: number = (crime.hacking_success_weight * person.hacking_skill +
|
||||
crime.strength_success_weight * person.strength +
|
||||
crime.defense_success_weight * person.defense +
|
||||
|
@ -7,8 +7,6 @@ import { post, postElement } from "../ui/postToTerminal";
|
||||
import { Money } from "../ui/React/Money";
|
||||
|
||||
import { isValidIPAddress } from "../../utils/helpers/isValidIPAddress";
|
||||
import { formatNumber } from "../../utils/StringHelperFunctions";
|
||||
import { numeralWrapper } from "../ui/numeralFormat";
|
||||
|
||||
//Posts a "help" message if connected to DarkWeb
|
||||
export function checkIfConnectedToDarkweb(): void {
|
||||
@ -29,27 +27,28 @@ export function checkIfConnectedToDarkweb(): void {
|
||||
export function executeDarkwebTerminalCommand(commandArray: string[]): void {
|
||||
if (commandArray.length == 0) {return;}
|
||||
switch (commandArray[0]) {
|
||||
case "buy":
|
||||
case "buy": {
|
||||
if (commandArray.length != 2) {
|
||||
post("Incorrect number of arguments. Usage: ");
|
||||
post("buy -l");
|
||||
post("buy [item name]");
|
||||
return;
|
||||
}
|
||||
var arg = commandArray[1];
|
||||
const arg = commandArray[1];
|
||||
if (arg == "-l") {
|
||||
listAllDarkwebItems();
|
||||
} else {
|
||||
buyDarkwebItem(arg);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
post("Command not found");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function listAllDarkwebItems() {
|
||||
function listAllDarkwebItems(): void {
|
||||
for(const key in DarkWebItems) {
|
||||
const item = DarkWebItems[key];
|
||||
postElement(<>{item.program} - {Money(item.price)} - {item.description}</>);
|
||||
|
@ -1,5 +1,3 @@
|
||||
import { numeralWrapper } from "../ui/numeralFormat";
|
||||
|
||||
export class DarkWebItem {
|
||||
program: string;
|
||||
price: number;
|
||||
|
@ -3,10 +3,9 @@ import { CodingContractTypes } from "./CodingContracts";
|
||||
import {
|
||||
generateContract,
|
||||
generateRandomContract,
|
||||
generateRandomContractOnHome
|
||||
generateRandomContractOnHome,
|
||||
} from "./CodingContractGenerator";
|
||||
import { Companies } from "./Company/Companies";
|
||||
import { Company } from "./Company/Company";
|
||||
import { Programs } from "./Programs/Programs";
|
||||
import { Factions } from "./Faction/Factions";
|
||||
import { Player } from "./Player";
|
||||
@ -14,17 +13,11 @@ import { PlayerOwnedSourceFile } from "./SourceFile/PlayerOwnedSourceFile";
|
||||
import { AllServers } from "./Server/AllServers";
|
||||
import { GetServerByHostname } from "./Server/ServerHelpers";
|
||||
import { hackWorldDaemon } from "./RedPill";
|
||||
import { StockMarket, SymbolToStockMap } from "./StockMarket/StockMarket";
|
||||
import { StockMarket } from "./StockMarket/StockMarket";
|
||||
import { Stock } from "./StockMarket/Stock";
|
||||
import { Terminal } from "./Terminal";
|
||||
|
||||
import { numeralWrapper } from "./ui/numeralFormat";
|
||||
|
||||
import { dialogBoxCreate } from "../utils/DialogBox";
|
||||
import { exceptionAlert } from "../utils/helpers/exceptionAlert";
|
||||
import { createElement } from "../utils/uiHelpers/createElement";
|
||||
import { createOptionElement } from "../utils/uiHelpers/createOptionElement";
|
||||
import { getSelectText } from "../utils/uiHelpers/getSelectData";
|
||||
import { removeElementById } from "../utils/uiHelpers/removeElementById";
|
||||
import { Money } from "./ui/React/Money";
|
||||
|
||||
@ -47,12 +40,13 @@ class ValueAdjusterComponent extends Component {
|
||||
this.state = { value: '' };
|
||||
this.setValue = this.setValue.bind(this);
|
||||
}
|
||||
|
||||
setValue(event) {
|
||||
this.setState({ value: parseFloat(event.target.value) });
|
||||
}
|
||||
|
||||
render() {
|
||||
const { title, add, subtract, reset } = this.props;
|
||||
const { value } = this.state;
|
||||
return (
|
||||
<>
|
||||
<button className="std-button add-exp-button" onClick={() => add(this.state.value)}>+</button>
|
||||
@ -279,9 +273,8 @@ class DevMenuComponent extends Component {
|
||||
}
|
||||
|
||||
modifyFactionRep(modifier) {
|
||||
const component = this;
|
||||
return function(reputation) {
|
||||
const fac = Factions[component.state.faction];
|
||||
return (reputation) => {
|
||||
const fac = Factions[this.state.faction];
|
||||
if (fac != null && !isNaN(reputation)) {
|
||||
fac.playerReputation += reputation*modifier;
|
||||
}
|
||||
@ -296,9 +289,8 @@ class DevMenuComponent extends Component {
|
||||
}
|
||||
|
||||
modifyFactionFavor(modifier) {
|
||||
const component = this;
|
||||
return function(favor) {
|
||||
const fac = Factions[component.state.faction];
|
||||
return (favor) => {
|
||||
const fac = Factions[this.state.faction];
|
||||
if (fac != null && !isNaN(favor)) {
|
||||
fac.favor += favor*modifier;
|
||||
}
|
||||
@ -368,10 +360,9 @@ class DevMenuComponent extends Component {
|
||||
}
|
||||
|
||||
setAllSF(sfLvl) {
|
||||
const component = this;
|
||||
return function(){
|
||||
return () => {
|
||||
for (let i = 0; i < validSFN.length; i++) {
|
||||
component.setSF(validSFN[i], sfLvl)();
|
||||
this.setSF(validSFN[i], sfLvl)();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -441,9 +432,8 @@ class DevMenuComponent extends Component {
|
||||
}
|
||||
|
||||
modifyCompanyRep(modifier) {
|
||||
const component = this;
|
||||
return function(reputation) {
|
||||
const company = Companies[component.state.company];
|
||||
return (reputation) => {
|
||||
const company = Companies[this.state.company];
|
||||
if (company != null && !isNaN(reputation)) {
|
||||
company.playerReputation += reputation*modifier;
|
||||
}
|
||||
@ -456,9 +446,8 @@ class DevMenuComponent extends Component {
|
||||
}
|
||||
|
||||
modifyCompanyFavor(modifier) {
|
||||
const component = this;
|
||||
return function(favor) {
|
||||
const company = Companies[component.state.company];
|
||||
return (favor) => {
|
||||
const company = Companies[this.state.company];
|
||||
if (company != null && !isNaN(favor)) {
|
||||
company.favor += favor*modifier;
|
||||
}
|
||||
@ -496,7 +485,7 @@ class DevMenuComponent extends Component {
|
||||
|
||||
modifyBladeburnerRank(modify) {
|
||||
return function(rank) {
|
||||
if (!!Player.bladeburner) {
|
||||
if (Player.bladeburner) {
|
||||
Player.bladeburner.changeRank(rank*modify);
|
||||
}
|
||||
}
|
||||
@ -508,67 +497,67 @@ class DevMenuComponent extends Component {
|
||||
}
|
||||
|
||||
addTonsBladeburnerRank() {
|
||||
if (!!Player.bladeburner) {
|
||||
if (Player.bladeburner) {
|
||||
Player.bladeburner.changeRank(tonsP);
|
||||
}
|
||||
}
|
||||
|
||||
modifyBladeburnerCycles(modify) {
|
||||
return function(cycles) {
|
||||
if (!!Player.bladeburner) {
|
||||
if (Player.bladeburner) {
|
||||
Player.bladeburner.storedCycles += cycles*modify;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
resetBladeburnerCycles() {
|
||||
if (!!Player.bladeburner) {
|
||||
if (Player.bladeburner) {
|
||||
Player.bladeburner.storedCycles = 0;
|
||||
}
|
||||
}
|
||||
|
||||
addTonsBladeburnerCycles() {
|
||||
if (!!Player.bladeburner) {
|
||||
if (Player.bladeburner) {
|
||||
Player.bladeburner.storedCycles += tonsP;
|
||||
}
|
||||
}
|
||||
|
||||
addTonsGangCycles() {
|
||||
if (!!Player.gang) {
|
||||
if (Player.gang) {
|
||||
Player.gang.storedCycles = tonsP;
|
||||
}
|
||||
}
|
||||
|
||||
modifyGangCycles(modify) {
|
||||
return function(cycles) {
|
||||
if (!!Player.gang) {
|
||||
if (Player.gang) {
|
||||
Player.gang.storedCycles += cycles*modify;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
resetGangCycles() {
|
||||
if (!!Player.gang) {
|
||||
if (Player.gang) {
|
||||
Player.gang.storedCycles = 0;
|
||||
}
|
||||
}
|
||||
|
||||
addTonsCorporationCycles() {
|
||||
if (!!Player.corporation) {
|
||||
if (Player.corporation) {
|
||||
Player.corporation.storedCycles = tonsP;
|
||||
}
|
||||
}
|
||||
|
||||
modifyCorporationCycles(modify) {
|
||||
return function(cycles) {
|
||||
if (!!Player.corporation) {
|
||||
if (Player.corporation) {
|
||||
Player.corporation.storedCycles += cycles*modify;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
resetCorporationCycles() {
|
||||
if (!!Player.corporation) {
|
||||
if (Player.corporation) {
|
||||
Player.corporation.storedCycles = 0;
|
||||
}
|
||||
}
|
||||
@ -580,10 +569,10 @@ class DevMenuComponent extends Component {
|
||||
});
|
||||
}
|
||||
|
||||
processStocks(cb) {
|
||||
processStocks(sub) {
|
||||
const inputSymbols = document.getElementById('dev-stock-symbol').value.toString().replace(/\s/g, '');
|
||||
|
||||
let match = function(symbol) { return true; }
|
||||
let match = function() { return true; }
|
||||
|
||||
if (inputSymbols !== '' && inputSymbols !== 'all') {
|
||||
match = function(symbol) {
|
||||
@ -595,7 +584,7 @@ class DevMenuComponent extends Component {
|
||||
if (StockMarket.hasOwnProperty(name)) {
|
||||
const stock = StockMarket[name];
|
||||
if (stock instanceof Stock && match(stock.symbol)) {
|
||||
cb(stock);
|
||||
sub(stock);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -636,13 +625,13 @@ class DevMenuComponent extends Component {
|
||||
}
|
||||
}
|
||||
|
||||
sleeveMaxAllSync() {
|
||||
sleeveSyncMaxAll() {
|
||||
for (let i = 0; i < Player.sleeves.length; ++i) {
|
||||
Player.sleeves[i].sync = 100;
|
||||
}
|
||||
}
|
||||
|
||||
sleeveClearAllSync() {
|
||||
sleeveSyncClearAll() {
|
||||
for (let i = 0; i < Player.sleeves.length; ++i) {
|
||||
Player.sleeves[i].sync = 0;
|
||||
}
|
||||
@ -674,7 +663,7 @@ class DevMenuComponent extends Component {
|
||||
<button className="std-button touch-sides" onClick={this.setSF(i, 2)}>2</button>
|
||||
<button className="std-button touch-left" onClick={this.setSF(i, 3)}>3</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tr>,
|
||||
));
|
||||
|
||||
|
||||
@ -1210,8 +1199,8 @@ class DevMenuComponent extends Component {
|
||||
</tr>
|
||||
<tr>
|
||||
<td><span className="text">Sync:</span></td>
|
||||
<td><button className="std-button" onClick={this.sleeveMaxAllSync}>Max all</button></td>
|
||||
<td><button className="std-button" onClick={this.sleeveClearAllSync}>Clear all</button></td>
|
||||
<td><button className="std-button" onClick={this.sleeveSyncMaxAll}>Max all</button></td>
|
||||
<td><button className="std-button" onClick={this.sleeveSyncClearAll}>Clear all</button></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { Player } from "../Player";
|
||||
|
||||
export function applyExploit() {
|
||||
export function applyExploit(): void {
|
||||
if (Player.exploits && Player.exploits.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
@ -2,7 +2,7 @@ import { Player } from "../Player";
|
||||
import { Exploit } from "./Exploit";
|
||||
|
||||
(function() {
|
||||
function clickTheUnclickable(event: MouseEvent) {
|
||||
function clickTheUnclickable(event: MouseEvent): void {
|
||||
if(!event.target || !(event.target instanceof Element)) return;
|
||||
const display = window.getComputedStyle(event.target as Element).display;
|
||||
if(display === 'none' && event.isTrusted)
|
||||
@ -10,7 +10,7 @@ import { Exploit } from "./Exploit";
|
||||
}
|
||||
|
||||
|
||||
function targetElement() {
|
||||
function targetElement(): void {
|
||||
const elem = document.getElementById('unclickable');
|
||||
if(elem == null) {
|
||||
console.error('Could not find the unclickable elem for the related exploit.');
|
||||
|
@ -4,18 +4,12 @@ import { FactionInfo,
|
||||
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviver";
|
||||
|
||||
export class Faction {
|
||||
/**
|
||||
* Initiatizes a Faction object from a JSON save state.
|
||||
*/
|
||||
static fromJSON(value: any): Faction {
|
||||
return Generic_fromJSON(Faction, value.data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Flag signalling whether the player has already received an invitation
|
||||
* to this faction
|
||||
*/
|
||||
alreadyInvited: boolean = false;
|
||||
alreadyInvited = false;
|
||||
|
||||
/**
|
||||
* Holds names of all augmentations that this Faction offers
|
||||
@ -25,35 +19,35 @@ export class Faction {
|
||||
/**
|
||||
* Amount of favor the player has with this faction.
|
||||
*/
|
||||
favor: number = 0;
|
||||
favor = 0;
|
||||
|
||||
/**
|
||||
* Flag signalling whether player has been banned from this faction
|
||||
*/
|
||||
isBanned: boolean = false;
|
||||
isBanned = false;
|
||||
|
||||
/**
|
||||
* Flag signalling whether player is a member of this faction
|
||||
*/
|
||||
isMember: boolean = false;
|
||||
isMember = false;
|
||||
|
||||
/**
|
||||
* Name of faction
|
||||
*/
|
||||
name: string = "";
|
||||
name = "";
|
||||
|
||||
/**
|
||||
* Amount of reputation player has with this faction
|
||||
*/
|
||||
playerReputation: number = 0;
|
||||
playerReputation = 0;
|
||||
|
||||
/**
|
||||
* Reputation from the last "prestige" that was not converted to favor.
|
||||
* This reputation rolls over and is used for the next favor calculation
|
||||
*/
|
||||
rolloverRep: number = 0;
|
||||
rolloverRep = 0;
|
||||
|
||||
constructor(name: string="") {
|
||||
constructor(name="") {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@ -82,7 +76,7 @@ export class Faction {
|
||||
getFavorGain(): number[] {
|
||||
if (this.favor == null) { this.favor = 0; }
|
||||
if (this.rolloverRep == null) { this.rolloverRep = 0; }
|
||||
var favorGain = 0, rep = this.playerReputation + this.rolloverRep;
|
||||
let favorGain = 0, rep = this.playerReputation + this.rolloverRep;
|
||||
let reqdRep = CONSTANTS.FactionReputationToFavorBase *
|
||||
Math.pow(CONSTANTS.FactionReputationToFavorMult, this.favor);
|
||||
while(rep > 0) {
|
||||
@ -103,6 +97,14 @@ export class Faction {
|
||||
toJSON(): any {
|
||||
return Generic_toJSON("Faction", this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initiatizes a Faction object from a JSON save state.
|
||||
*/
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
static fromJSON(value: any): Faction {
|
||||
return Generic_fromJSON(Faction, value.data);
|
||||
}
|
||||
}
|
||||
|
||||
Reviver.constructors.Faction = Faction;
|
||||
|
@ -24,19 +24,12 @@ import {
|
||||
import { Page, routing } from "../ui/navigationTracking";
|
||||
import { dialogBoxCreate } from "../../utils/DialogBox";
|
||||
import { factionInvitationBoxCreate } from "../../utils/FactionInvitationBox";
|
||||
import {
|
||||
Reviver,
|
||||
Generic_toJSON,
|
||||
Generic_fromJSON
|
||||
} from "../../utils/JSONReviver";
|
||||
import { formatNumber } from "../../utils/StringHelperFunctions";
|
||||
import { numeralWrapper } from "../ui/numeralFormat";
|
||||
import { Money } from "../ui/React/Money";
|
||||
import {
|
||||
yesNoBoxCreate,
|
||||
yesNoBoxGetYesButton,
|
||||
yesNoBoxGetNoButton,
|
||||
yesNoBoxClose
|
||||
yesNoBoxClose,
|
||||
} from "../../utils/YesNoBox";
|
||||
|
||||
export function inviteToFaction(faction) {
|
||||
@ -90,7 +83,7 @@ export function displayFactionContent(factionName, initiallyOnAugmentationsPage=
|
||||
p={Player}
|
||||
startHackingMissionFn={startHackingMission}
|
||||
/>,
|
||||
Engine.Display.factionContent
|
||||
Engine.Display.factionContent,
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,7 @@ export function loadFactions(saveString: string): void {
|
||||
Factions = JSON.parse(saveString, Reviver);
|
||||
}
|
||||
|
||||
export function AddToFactions(faction: Faction) {
|
||||
export function AddToFactions(faction: Faction): void {
|
||||
const name: string = faction.name;
|
||||
Factions[name] = faction;
|
||||
}
|
||||
@ -25,7 +25,7 @@ export function factionExists(name: string): boolean {
|
||||
return Factions.hasOwnProperty(name);
|
||||
}
|
||||
|
||||
export function initFactions(bitNode: number=1) {
|
||||
export function initFactions(): void {
|
||||
for (const name in FactionInfos) {
|
||||
resetFaction(new Faction(name));
|
||||
}
|
||||
@ -34,7 +34,7 @@ export function initFactions(bitNode: number=1) {
|
||||
//Resets a faction during (re-)initialization. Saves the favor in the new
|
||||
//Faction object and deletes the old Faction Object from "Factions". Then
|
||||
//reinserts the new Faction object
|
||||
export function resetFaction(newFactionObject: Faction) {
|
||||
export function resetFaction(newFactionObject: Faction): void {
|
||||
if (!(newFactionObject instanceof Faction)) {
|
||||
throw new Error("Invalid argument 'newFactionObject' passed into resetFaction()");
|
||||
}
|
||||
|
@ -77,7 +77,7 @@ export class AugmentationsPage extends React.Component<IProps, IState> {
|
||||
getAugsSortedByCost(): string[] {
|
||||
const augs = this.getAugs();
|
||||
augs.sort((augName1, augName2)=>{
|
||||
var aug1 = Augmentations[augName1], aug2 = Augmentations[augName2];
|
||||
const aug1 = Augmentations[augName1], aug2 = Augmentations[augName2];
|
||||
if (aug1 == null || aug2 == null) {
|
||||
throw new Error("Invalid Augmentation Names");
|
||||
}
|
||||
@ -91,7 +91,7 @@ export class AugmentationsPage extends React.Component<IProps, IState> {
|
||||
getAugsSortedByReputation(): string[] {
|
||||
const augs = this.getAugs();
|
||||
augs.sort((augName1, augName2)=>{
|
||||
var aug1 = Augmentations[augName1], aug2 = Augmentations[augName2];
|
||||
const aug1 = Augmentations[augName1], aug2 = Augmentations[augName2];
|
||||
if (aug1 == null || aug2 == null) {
|
||||
throw new Error("Invalid Augmentation Names");
|
||||
}
|
||||
@ -118,23 +118,21 @@ export class AugmentationsPage extends React.Component<IProps, IState> {
|
||||
});
|
||||
}
|
||||
|
||||
render() {
|
||||
render(): React.ReactNode {
|
||||
const augs = this.getAugsSorted();
|
||||
const purchasable = augs.filter((aug: string) =>
|
||||
aug === AugmentationNames.NeuroFluxGovernor ||
|
||||
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))
|
||||
!this.props.p.queuedAugmentations.some(a => a.name === aug)),
|
||||
)
|
||||
|
||||
const parent = this;
|
||||
function purchaseableAugmentation(aug: string) {
|
||||
const purchaseableAugmentation = (aug: string): React.ReactNode => {
|
||||
return (
|
||||
<PurchaseableAugmentation
|
||||
augName={aug}
|
||||
faction={parent.props.faction}
|
||||
faction={this.props.faction}
|
||||
key={aug}
|
||||
p={parent.props.p}
|
||||
rerender={parent.rerender}
|
||||
p={this.props.p}
|
||||
rerender={this.rerender}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
@ -7,7 +7,6 @@ import { CONSTANTS } from "../../Constants";
|
||||
import { Faction } from "../../Faction/Faction";
|
||||
import { IPlayer } from "../../PersonObjects/IPlayer";
|
||||
|
||||
import { numeralWrapper } from "../../ui/numeralFormat";
|
||||
import { Money } from "../../ui/React/Money";
|
||||
import { Reputation } from "../../ui/React/Reputation";
|
||||
|
||||
@ -32,7 +31,7 @@ const inputStyleMarkup = {
|
||||
|
||||
export class DonateOption extends React.Component<IProps, IState> {
|
||||
// Style markup for block elements. Stored as property
|
||||
blockStyle: object = { display: "block" };
|
||||
blockStyle: any = { display: "block" };
|
||||
|
||||
constructor(props: IProps) {
|
||||
super(props);
|
||||
@ -87,11 +86,11 @@ export class DonateOption extends React.Component<IProps, IState> {
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
render(): React.ReactNode {
|
||||
return (
|
||||
<div className={"faction-work-div"}>
|
||||
<div className={"faction-work-div-wrapper"}>
|
||||
<input className='text-input' onChange={this.handleChange} placeholder={"Donation amount"} style={inputStyleMarkup} />
|
||||
<input className="text-input" onChange={this.handleChange} placeholder={"Donation amount"} style={inputStyleMarkup} />
|
||||
<StdButton
|
||||
onClick={this.donate}
|
||||
text={"Donate Money"}
|
||||
|
@ -6,7 +6,6 @@ import * as React from "react";
|
||||
|
||||
import { Faction } from "../../Faction/Faction";
|
||||
import { FactionInfo } from "../../Faction/FactionInfo";
|
||||
import { numeralWrapper } from "../../ui/numeralFormat";
|
||||
|
||||
import { AutoupdatingParagraph } from "../../ui/React/AutoupdatingParagraph";
|
||||
import { ParagraphWithTooltip } from "../../ui/React/ParagraphWithTooltip";
|
||||
@ -48,7 +47,7 @@ export class Info extends React.Component<IProps, any> {
|
||||
return <>Reputation: {Reputation(this.props.faction.playerReputation)}</>
|
||||
}
|
||||
|
||||
render() {
|
||||
render(): React.ReactNode {
|
||||
const favorTooltip = "Faction favor increases the rate at which you earn reputation for " +
|
||||
"this faction by 1% per favor. Faction favor is gained whenever you " +
|
||||
"reset after installing an Augmentation. The amount of " +
|
||||
|
@ -14,7 +14,7 @@ type IProps = {
|
||||
}
|
||||
|
||||
export class Option extends React.Component<IProps, any> {
|
||||
render() {
|
||||
render(): React.ReactNode {
|
||||
return (
|
||||
<div className={"faction-work-div"}>
|
||||
<div className={"faction-work-div-wrapper"}>
|
||||
|
@ -17,7 +17,6 @@ import { AugmentationNames } from "../../Augmentation/data/AugmentationNames";
|
||||
import { Faction } from "../../Faction/Faction";
|
||||
import { IPlayer } from "../../PersonObjects/IPlayer";
|
||||
import { Settings } from "../../Settings/Settings";
|
||||
import { numeralWrapper } from "../../ui/numeralFormat";
|
||||
import { Money } from "../../ui/React/Money";
|
||||
import { Reputation } from "../../ui/React/Reputation";
|
||||
import { IMap } from "../../types";
|
||||
@ -42,35 +41,37 @@ const inlineStyleMarkup = {
|
||||
}
|
||||
|
||||
export class PurchaseableAugmentation extends React.Component<IProps, any> {
|
||||
aug: Augmentation | null;
|
||||
aug: Augmentation;
|
||||
|
||||
constructor(props: IProps) {
|
||||
super(props);
|
||||
|
||||
this.aug = Augmentations[this.props.augName];
|
||||
const aug = Augmentations[this.props.augName];
|
||||
if(aug == null) throw new Error(`aug ${this.props.augName} does not exists`);
|
||||
this.aug = aug;
|
||||
|
||||
this.handleClick = this.handleClick.bind(this);
|
||||
}
|
||||
|
||||
getMoneyCost(): number {
|
||||
return this.aug!.baseCost * this.props.faction.getInfo().augmentationPriceMult;
|
||||
return this.aug.baseCost * this.props.faction.getInfo().augmentationPriceMult;
|
||||
}
|
||||
|
||||
getRepCost(): number {
|
||||
return this.aug!.baseRepRequirement * this.props.faction.getInfo().augmentationRepRequirementMult;
|
||||
return this.aug.baseRepRequirement * this.props.faction.getInfo().augmentationRepRequirementMult;
|
||||
}
|
||||
|
||||
handleClick() {
|
||||
handleClick(): void {
|
||||
if (!Settings.SuppressBuyAugmentationConfirmation) {
|
||||
purchaseAugmentationBoxCreate(this.aug!, this.props.faction);
|
||||
purchaseAugmentationBoxCreate(this.aug, this.props.faction);
|
||||
} else {
|
||||
purchaseAugmentation(this.aug!, this.props.faction);
|
||||
purchaseAugmentation(this.aug, this.props.faction);
|
||||
}
|
||||
}
|
||||
|
||||
// Whether the player has the prerequisite Augmentations
|
||||
hasPrereqs(): boolean {
|
||||
return hasAugmentationPrereqs(this.aug!);
|
||||
return hasAugmentationPrereqs(this.aug);
|
||||
}
|
||||
|
||||
// Whether the player has enough rep for this Augmentation
|
||||
@ -98,7 +99,7 @@ export class PurchaseableAugmentation extends React.Component<IProps, any> {
|
||||
return owned;
|
||||
}
|
||||
|
||||
render() {
|
||||
render(): React.ReactNode {
|
||||
if (this.aug == null) {
|
||||
console.error(`Invalid Augmentation when trying to create PurchaseableAugmentation display element: ${this.props.augName}`);
|
||||
return null;
|
||||
@ -108,9 +109,9 @@ export class PurchaseableAugmentation extends React.Component<IProps, any> {
|
||||
const repCost = this.getRepCost();
|
||||
|
||||
// Determine UI properties
|
||||
let disabled: boolean = false;
|
||||
let disabled = false;
|
||||
let status: JSX.Element = <></>;
|
||||
let color: string = "";
|
||||
let color = "";
|
||||
if (!this.hasPrereqs()) {
|
||||
disabled = true;
|
||||
status = <>LOCKED (Requires {this.aug.prereqs.map(aug => AugFormat(aug))} as prerequisite)</>;
|
||||
|
@ -69,7 +69,7 @@ const GangNames = [
|
||||
"The Dark Army",
|
||||
"Speakers for the Dead",
|
||||
"NiteSec",
|
||||
"The Black Hand"
|
||||
"The Black Hand",
|
||||
];
|
||||
|
||||
export class FactionRoot extends React.Component<IProps, IState> {
|
||||
@ -92,7 +92,7 @@ export class FactionRoot extends React.Component<IProps, IState> {
|
||||
this.startSecurityWork = this.startSecurityWork.bind(this);
|
||||
}
|
||||
|
||||
manageGang() {
|
||||
manageGang(): void {
|
||||
// If player already has a gang, just go to the gang UI
|
||||
if (this.props.p.inGang()) {
|
||||
return this.props.engine.loadGangContent();
|
||||
@ -146,7 +146,7 @@ export class FactionRoot extends React.Component<IProps, IState> {
|
||||
"create a Gang with, and each of these Factions have all Augmentations available.");
|
||||
}
|
||||
|
||||
rerender() {
|
||||
rerender(): void {
|
||||
this.setState((prevState) => {
|
||||
return {
|
||||
rerenderFlag: !prevState.rerenderFlag,
|
||||
@ -155,42 +155,42 @@ export class FactionRoot extends React.Component<IProps, IState> {
|
||||
}
|
||||
|
||||
// Route to the main faction page
|
||||
routeToMain() {
|
||||
routeToMain(): void {
|
||||
this.setState({ purchasingAugs: false });
|
||||
}
|
||||
|
||||
// Route to the purchase augmentation UI for this faction
|
||||
routeToPurchaseAugs() {
|
||||
routeToPurchaseAugs(): void {
|
||||
this.setState({ purchasingAugs: true });
|
||||
}
|
||||
|
||||
sleevePurchases() {
|
||||
sleevePurchases(): void {
|
||||
createSleevePurchasesFromCovenantPopup(this.props.p);
|
||||
}
|
||||
|
||||
startFieldWork() {
|
||||
startFieldWork(): void {
|
||||
this.props.p.startFactionFieldWork(this.props.faction);
|
||||
}
|
||||
|
||||
startHackingContracts() {
|
||||
startHackingContracts(): void {
|
||||
this.props.p.startFactionHackWork(this.props.faction);
|
||||
}
|
||||
|
||||
startHackingMission() {
|
||||
startHackingMission(): void {
|
||||
const fac = this.props.faction;
|
||||
this.props.engine.loadMissionContent();
|
||||
this.props.startHackingMissionFn(fac);
|
||||
}
|
||||
|
||||
startSecurityWork() {
|
||||
startSecurityWork(): void {
|
||||
this.props.p.startFactionSecurityWork(this.props.faction);
|
||||
}
|
||||
|
||||
render() {
|
||||
render(): React.ReactNode {
|
||||
return this.state.purchasingAugs ? this.renderAugmentationsPage() : this.renderMainPage();
|
||||
}
|
||||
|
||||
renderMainPage() {
|
||||
renderMainPage(): React.ReactNode {
|
||||
const p = this.props.p;
|
||||
const faction = this.props.faction;
|
||||
const factionInfo = faction.getInfo();
|
||||
@ -288,7 +288,7 @@ export class FactionRoot extends React.Component<IProps, IState> {
|
||||
)
|
||||
}
|
||||
|
||||
renderAugmentationsPage() {
|
||||
renderAugmentationsPage(): React.ReactNode {
|
||||
return (
|
||||
<div>
|
||||
<AugmentationsPage
|
||||
|
60
src/Gang.jsx
60
src/Gang.jsx
@ -19,9 +19,12 @@ import { dialogBoxCreate } from "../utils/DialogBox";
|
||||
import {
|
||||
Reviver,
|
||||
Generic_toJSON,
|
||||
Generic_fromJSON
|
||||
Generic_fromJSON,
|
||||
} from "../utils/JSONReviver";
|
||||
import { formatNumber } from "../utils/StringHelperFunctions";
|
||||
import {
|
||||
formatNumber,
|
||||
convertTimeMsToTimeElapsedString,
|
||||
} from "../utils/StringHelperFunctions";
|
||||
|
||||
import { exceptionAlert } from "../utils/helpers/exceptionAlert";
|
||||
import { getRandomInt } from "../utils/helpers/getRandomInt";
|
||||
@ -33,7 +36,6 @@ import { createPopup } from "../utils/uiHelpers/createPopup";
|
||||
import { removeChildrenFromElement } from "../utils/uiHelpers/removeChildrenFromElement";
|
||||
import { removeElement } from "../utils/uiHelpers/removeElement";
|
||||
import { removeElementById } from "../utils/uiHelpers/removeElementById";
|
||||
import { convertTimeMsToTimeElapsedString } from "../utils/StringHelperFunctions";
|
||||
|
||||
import { StatsTable } from "./ui/React/StatsTable";
|
||||
import { Money } from "./ui/React/Money";
|
||||
@ -47,7 +49,6 @@ import { renderToStaticMarkup } from "react-dom/server"
|
||||
// Constants
|
||||
const GangRespectToReputationRatio = 5; // Respect is divided by this to get rep gain
|
||||
const MaximumGangMembers = 30;
|
||||
const GangRecruitCostMultiplier = 2;
|
||||
const CyclesPerTerritoryAndPowerUpdate = 100;
|
||||
const AscensionMultiplierRatio = 15 / 100; // Portion of upgrade multiplier that is kept after ascending
|
||||
|
||||
@ -69,7 +70,6 @@ $(document).keydown(function(event) {
|
||||
|
||||
// Delete upgrade box when clicking outside
|
||||
$(document).mousedown(function(event) {
|
||||
var boxId = "gang-member-upgrade-popup-box";
|
||||
var contentId = "gang-member-upgrade-popup-box-content";
|
||||
if (UIElems.gangMemberUpgradeBoxOpened) {
|
||||
if ( $(event.target).closest("#" + contentId).get(0) == null ) {
|
||||
@ -90,7 +90,7 @@ const GangNames = [
|
||||
"The Dark Army",
|
||||
"Speakers for the Dead",
|
||||
"NiteSec",
|
||||
"The Black Hand"
|
||||
"The Black Hand",
|
||||
];
|
||||
|
||||
export let AllGangs = {
|
||||
@ -461,8 +461,6 @@ Gang.prototype.clash = function(won=false) {
|
||||
}
|
||||
|
||||
Gang.prototype.killMember = function(memberObj) {
|
||||
const gangName = this.facName;
|
||||
|
||||
// Player loses a percentage of total respect, plus whatever respect that member has earned
|
||||
const totalRespect = this.respect;
|
||||
const lostRespect = (0.05 * totalRespect) + memberObj.earnedRespect;
|
||||
@ -1055,14 +1053,14 @@ Gang.prototype.createGangMemberUpgradeBox = function(player, initialFilter="") {
|
||||
onkeyup:() => {
|
||||
var filterValue = UIElems.gangMemberUpgradeBoxFilter.value.toString();
|
||||
this.createGangMemberUpgradeBox(player, filterValue);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
UIElems.gangMemberUpgradeBoxDiscount = createElement("p", {
|
||||
innerText: "Discount: -" + numeralWrapper.formatPercentage(1 - 1 / this.getDiscount()),
|
||||
marginLeft: "6px",
|
||||
tooltip: "You get a discount on equipment and upgrades based on your gang's " +
|
||||
"respect and power. More respect and power leads to more discounts."
|
||||
"respect and power. More respect and power leads to more discounts.",
|
||||
});
|
||||
|
||||
UIElems.gangMemberUpgradeBoxElements = [UIElems.gangMemberUpgradeBoxFilter, UIElems.gangMemberUpgradeBoxDiscount];
|
||||
@ -1087,7 +1085,7 @@ GangMember.prototype.createGangMemberUpgradePanel = function(gangObj, player) {
|
||||
});
|
||||
|
||||
var header = createElement("h1", {
|
||||
innerText: this.name + " (" + this.task + ")"
|
||||
innerText: this.name + " (" + this.task + ")",
|
||||
});
|
||||
container.appendChild(header);
|
||||
|
||||
@ -1192,7 +1190,7 @@ GangMember.prototype.createGangMemberUpgradePanel = function(gangObj, player) {
|
||||
clickListener:() => {
|
||||
memberObj.buyUpgrade(upg, player, gangObj);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
// For the last two divs, tooltip should be on the left
|
||||
@ -1266,10 +1264,7 @@ Gang.prototype.displayGangContent = function(player) {
|
||||
});
|
||||
|
||||
// Get variables
|
||||
var facName = this.facName,
|
||||
members = this.members,
|
||||
wanted = this.wanted,
|
||||
respect = this.respect;
|
||||
var facName = this.facName;
|
||||
|
||||
// Back button
|
||||
UIElems.gangContainer.appendChild(createElement("a", {
|
||||
@ -1278,7 +1273,7 @@ Gang.prototype.displayGangContent = function(player) {
|
||||
Engine.loadFactionContent();
|
||||
displayFactionContent(facName);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
}));
|
||||
|
||||
// Buttons to switch between panels
|
||||
@ -1294,7 +1289,7 @@ Gang.prototype.displayGangContent = function(player) {
|
||||
UIElems.territoryButton.classList.toggle("a-link-button");
|
||||
this.updateGangContent();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
})
|
||||
UIElems.territoryButton = createElement("a", {
|
||||
id:"gang-territory-subpage-button", class:"a-link-button",
|
||||
@ -1308,7 +1303,7 @@ Gang.prototype.displayGangContent = function(player) {
|
||||
UIElems.territoryButton.classList.toggle("a-link-button");
|
||||
this.updateGangContent();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
UIElems.gangContainer.appendChild(UIElems.managementButton);
|
||||
UIElems.gangContainer.appendChild(UIElems.territoryButton);
|
||||
@ -1338,7 +1333,7 @@ Gang.prototype.displayGangContent = function(player) {
|
||||
"Installing Augmentations does NOT reset your progress with your Gang. " +
|
||||
"Furthermore, after installing Augmentations, you will " +
|
||||
"automatically be a member of whatever Faction you created your gang with.<br><br>" +
|
||||
"You can also manage your gang programmatically through Netscript using the Gang API"
|
||||
"You can also manage your gang programmatically through Netscript using the Gang API",
|
||||
});
|
||||
UIElems.gangManagementSubpage.appendChild(UIElems.gangDesc);
|
||||
|
||||
@ -1399,7 +1394,7 @@ Gang.prototype.displayGangContent = function(player) {
|
||||
});
|
||||
createPopup(popupId, [txt, br, nameInput, yesBtn, noBtn]);
|
||||
nameInput.focus();
|
||||
}
|
||||
},
|
||||
});
|
||||
UIElems.gangManagementSubpage.appendChild(UIElems.gangRecruitMemberButton);
|
||||
|
||||
@ -1425,7 +1420,7 @@ Gang.prototype.displayGangContent = function(player) {
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
UIElems.gangCollapseAllButton = createElement("a", {
|
||||
class:"a-link-button", display:"inline-block",
|
||||
@ -1439,21 +1434,21 @@ Gang.prototype.displayGangContent = function(player) {
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
UIElems.gangMemberFilter = createElement("input", {
|
||||
type:"text", placeholder:"Filter gang members", margin:"5px", padding:"5px",
|
||||
class:"text-input",
|
||||
onkeyup:() => {
|
||||
this.displayGangMemberList();
|
||||
}
|
||||
},
|
||||
});
|
||||
UIElems.gangManageEquipmentButton = createElement("a", {
|
||||
class:"a-link-button", display:"inline-block",
|
||||
innerHTML:"Manage Equipment",
|
||||
clickListener: () => {
|
||||
this.createGangMemberUpgradeBox(player);
|
||||
}
|
||||
},
|
||||
});
|
||||
UIElems.gangManagementSubpage.appendChild(UIElems.gangExpandAllButton);
|
||||
UIElems.gangManagementSubpage.appendChild(UIElems.gangCollapseAllButton);
|
||||
@ -1467,7 +1462,7 @@ Gang.prototype.displayGangContent = function(player) {
|
||||
|
||||
// Subpage for seeing gang territory information
|
||||
UIElems.gangTerritorySubpage = createElement("div", {
|
||||
id:"gang-territory-subpage", display:"none"
|
||||
id:"gang-territory-subpage", display:"none",
|
||||
});
|
||||
|
||||
// Info text for territory page
|
||||
@ -1485,7 +1480,7 @@ Gang.prototype.displayGangContent = function(player) {
|
||||
"NOTE: Gang members assigned to 'Territory Warfare' can be killed during clashes. This can happen regardless of whether you win " +
|
||||
"or lose the clash. A gang member being killed results in both respect and power loss for your gang.<br><br>" +
|
||||
"The amount of territory you have affects all aspects of your Gang members' production, including " +
|
||||
"money, respect, and wanted level. It is very beneficial to have high territory control.<br><br>"
|
||||
"money, respect, and wanted level. It is very beneficial to have high territory control.<br><br>",
|
||||
});
|
||||
UIElems.gangTerritorySubpage.appendChild(UIElems.gangTerritoryDescText);
|
||||
|
||||
@ -1654,7 +1649,7 @@ Gang.prototype.updateGangContent = function() {
|
||||
tooltip: "Represents the amount of respect your gang has from other gangs and criminal " +
|
||||
"organizations. Your respect affects the amount of money " +
|
||||
"your gang members will earn, and also determines how much " +
|
||||
"reputation you are earning with your gang's corresponding Faction."
|
||||
"reputation you are earning with your gang's corresponding Faction.",
|
||||
}));
|
||||
UIElems.gangInfo.appendChild(createElement("br"));
|
||||
|
||||
@ -1664,7 +1659,7 @@ Gang.prototype.updateGangContent = function() {
|
||||
" (" + numeralWrapper.formatWanted(5*this.wantedGainRate) + " / sec)",
|
||||
tooltip: "Represents how much the gang is wanted by law enforcement. The higher " +
|
||||
"your gang's wanted level, the harder it will be for your gang members " +
|
||||
"to make money and earn respect. Note that the minimum wanted level is 1."
|
||||
"to make money and earn respect. Note that the minimum wanted level is 1.",
|
||||
}));
|
||||
UIElems.gangInfo.appendChild(createElement("br"));
|
||||
|
||||
@ -1673,7 +1668,7 @@ Gang.prototype.updateGangContent = function() {
|
||||
UIElems.gangInfo.appendChild(createElement("p", { // Wanted Level multiplier
|
||||
display: "inline-block",
|
||||
innerText: `Wanted Level Penalty: -${formatNumber(wantedPenalty, 2)}%`,
|
||||
tooltip: "Penalty for respect and money gain rates due to Wanted Level"
|
||||
tooltip: "Penalty for respect and money gain rates due to Wanted Level",
|
||||
}));
|
||||
UIElems.gangInfo.appendChild(createElement("br"));
|
||||
|
||||
@ -1695,7 +1690,7 @@ Gang.prototype.updateGangContent = function() {
|
||||
UIElems.gangInfo.appendChild(createElement("p", { // Territory multiplier
|
||||
display: "inline-block",
|
||||
innerText: `Territory: ${formatNumber(displayNumber, 3)}%`,
|
||||
tooltip: "The percentage of total territory your Gang controls"
|
||||
tooltip: "The percentage of total territory your Gang controls",
|
||||
}));
|
||||
UIElems.gangInfo.appendChild(createElement("br"));
|
||||
|
||||
@ -1757,7 +1752,6 @@ Gang.prototype.createGangMemberDisplayElement = function(memberObj) {
|
||||
hdrText: name,
|
||||
});
|
||||
const li = accordion[0];
|
||||
const hdr = accordion[1];
|
||||
const gangMemberDiv = accordion[2];
|
||||
|
||||
UIElems.gangMemberPanels[name]["panel"] = gangMemberDiv;
|
||||
@ -1819,7 +1813,7 @@ Gang.prototype.createGangMemberDisplayElement = function(memberObj) {
|
||||
innerText: "Cancel",
|
||||
});
|
||||
createPopup(popupId, [txt, confirmBtn, cancelBtn]);
|
||||
}
|
||||
},
|
||||
});
|
||||
const ascendHelpTip = createElement("div", {
|
||||
class: "help-tip",
|
||||
|
@ -1,9 +1,7 @@
|
||||
import { BitNodeMultipliers } from "./BitNode/BitNodeMultipliers";
|
||||
import { Player } from "./Player";
|
||||
import { IPlayer } from "./PersonObjects/IPlayer";
|
||||
import { calculateIntelligenceBonus } from "./PersonObjects/formulas/intelligence";
|
||||
import { Server } from "./Server/Server";
|
||||
import { HacknetServer } from "./Hacknet/HacknetServer";
|
||||
|
||||
/**
|
||||
* Returns the chance the player has to successfully hack a server
|
||||
|
@ -15,7 +15,7 @@ function baseCheck(server: Server, fnName: string): IReturnStatus {
|
||||
if (!("requiredHackingSkill" in server)) {
|
||||
return {
|
||||
res: false,
|
||||
msg: `Cannot ${fnName} ${hostname} server because it is a Hacknet Node`
|
||||
msg: `Cannot ${fnName} ${hostname} server because it is a Hacknet Node`,
|
||||
}
|
||||
}
|
||||
|
||||
@ -33,7 +33,7 @@ export function netscriptCanHack(server: Server, p: IPlayer): IReturnStatus {
|
||||
const initialCheck = baseCheck(server, "hack");
|
||||
if (!initialCheck.res) { return initialCheck; }
|
||||
|
||||
let s = server;
|
||||
const s = server;
|
||||
if (s.requiredHackingSkill > p.hacking_skill) {
|
||||
return {
|
||||
res: false,
|
||||
|
@ -20,7 +20,7 @@ import { generateRandomContract } from "../CodingContractGenerator";
|
||||
import {
|
||||
iTutorialSteps,
|
||||
iTutorialNextStep,
|
||||
ITutorial
|
||||
ITutorial,
|
||||
} from "../InteractiveTutorial";
|
||||
import { Player } from "../Player";
|
||||
import { AllServers } from "../Server/AllServers";
|
||||
@ -28,8 +28,6 @@ import { GetServerByHostname } from "../Server/ServerHelpers";
|
||||
import { SourceFileFlags } from "../SourceFile/SourceFileFlags";
|
||||
import { Page, routing } from "../ui/navigationTracking";
|
||||
|
||||
import { getElementById } from "../../utils/uiHelpers/getElementById";
|
||||
|
||||
import React from "react";
|
||||
import ReactDOM from "react-dom";
|
||||
import { HacknetRoot } from "./ui/Root";
|
||||
@ -68,7 +66,7 @@ export function purchaseHacknet() {
|
||||
|
||||
if (!Player.canAfford(cost)) { return -1; }
|
||||
Player.loseMoney(cost);
|
||||
const server = Player.createHacknetServer();
|
||||
Player.createHacknetServer();
|
||||
updateHashManagerCapacity();
|
||||
|
||||
return numOwned;
|
||||
|
@ -8,7 +8,6 @@ import { IHacknetNode } from "./IHacknetNode";
|
||||
|
||||
import { CONSTANTS } from "../Constants";
|
||||
|
||||
import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers";
|
||||
import {
|
||||
calculateMoneyGainRate,
|
||||
calculateLevelUpgradeCost,
|
||||
@ -23,58 +22,52 @@ import { Generic_fromJSON,
|
||||
Reviver } from "../../utils/JSONReviver";
|
||||
|
||||
export class HacknetNode implements IHacknetNode {
|
||||
/**
|
||||
* Initiatizes a HacknetNode object from a JSON save state.
|
||||
*/
|
||||
static fromJSON(value: any): HacknetNode {
|
||||
return Generic_fromJSON(HacknetNode, value.data);
|
||||
}
|
||||
|
||||
// Node's number of cores
|
||||
cores: number = 1;
|
||||
cores = 1;
|
||||
|
||||
// Node's Level
|
||||
level: number = 1;
|
||||
level = 1;
|
||||
|
||||
// Node's production per second
|
||||
moneyGainRatePerSecond: number = 0;
|
||||
moneyGainRatePerSecond = 0;
|
||||
|
||||
// Identifier for Node. Includes the full "name" (hacknet-node-N)
|
||||
name: string;
|
||||
|
||||
// How long this Node has existed, in seconds
|
||||
onlineTimeSeconds: number = 0;
|
||||
onlineTimeSeconds = 0;
|
||||
|
||||
// Node's RAM (GB)
|
||||
ram: number = 1;
|
||||
ram = 1;
|
||||
|
||||
// Total money earned by this Node
|
||||
totalMoneyGenerated: number = 0;
|
||||
totalMoneyGenerated = 0;
|
||||
|
||||
constructor(name: string="", prodMult: number=1) {
|
||||
constructor(name="", prodMult=1) {
|
||||
this.name = name;
|
||||
|
||||
this.updateMoneyGainRate(prodMult);
|
||||
}
|
||||
|
||||
// Get the cost to upgrade this Node's number of cores
|
||||
calculateCoreUpgradeCost(levels: number=1, costMult: number): number {
|
||||
calculateCoreUpgradeCost(levels=1, costMult: number): number {
|
||||
return calculateCoreUpgradeCost(this.cores, levels, costMult);
|
||||
}
|
||||
|
||||
// Get the cost to upgrade this Node's level
|
||||
calculateLevelUpgradeCost(levels: number=1, costMult: number): number {
|
||||
calculateLevelUpgradeCost(levels=1, costMult: number): number {
|
||||
return calculateLevelUpgradeCost(this.level, levels, costMult);
|
||||
}
|
||||
|
||||
// Get the cost to upgrade this Node's RAM
|
||||
calculateRamUpgradeCost(levels: number=1, costMult: number): number {
|
||||
calculateRamUpgradeCost(levels=1, costMult: number): number {
|
||||
return calculateRamUpgradeCost(this.ram, levels, costMult);
|
||||
}
|
||||
|
||||
// Process this Hacknet Node in the game loop.
|
||||
// Returns the amount of money generated
|
||||
process(numCycles: number=1): number {
|
||||
process(numCycles=1): number {
|
||||
const seconds = numCycles * CONSTANTS.MilliPerCycle / 1000;
|
||||
let gain = this.moneyGainRatePerSecond * seconds;
|
||||
if (isNaN(gain)) {
|
||||
@ -90,21 +83,21 @@ export class HacknetNode implements IHacknetNode {
|
||||
|
||||
// Upgrade this Node's number of cores, if possible
|
||||
// Returns a boolean indicating whether new cores were successfully bought
|
||||
upgradeCore(levels: number=1, prodMult: number): void {
|
||||
upgradeCore(levels=1, prodMult: number): void {
|
||||
this.cores = Math.min(HacknetNodeConstants.MaxCores, Math.round(this.cores + levels));
|
||||
this.updateMoneyGainRate(prodMult);
|
||||
}
|
||||
|
||||
// Upgrade this Node's level, if possible
|
||||
// Returns a boolean indicating whether the level was successfully updated
|
||||
upgradeLevel(levels: number=1, prodMult: number): void {
|
||||
upgradeLevel(levels=1, prodMult: number): void {
|
||||
this.level = Math.min(HacknetNodeConstants.MaxLevel, Math.round(this.level + levels));
|
||||
this.updateMoneyGainRate(prodMult);
|
||||
}
|
||||
|
||||
// Upgrade this Node's RAM, if possible
|
||||
// Returns a boolean indicating whether the RAM was successfully upgraded
|
||||
upgradeRam(levels: number=1, prodMult: number): void {
|
||||
upgradeRam(levels=1, prodMult: number): void {
|
||||
for (let i = 0; i < levels; ++i) {
|
||||
this.ram *= 2; // Ram is always doubled
|
||||
}
|
||||
@ -127,6 +120,14 @@ export class HacknetNode implements IHacknetNode {
|
||||
toJSON(): any {
|
||||
return Generic_toJSON("HacknetNode", this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initiatizes a HacknetNode object from a JSON save state.
|
||||
*/
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
static fromJSON(value: any): HacknetNode {
|
||||
return Generic_fromJSON(HacknetNode, value.data);
|
||||
}
|
||||
}
|
||||
|
||||
Reviver.constructors.HacknetNode = HacknetNode;
|
||||
|
@ -5,7 +5,6 @@ import { CONSTANTS } from "../Constants";
|
||||
|
||||
import { IHacknetNode } from "./IHacknetNode";
|
||||
|
||||
import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers";
|
||||
import { BaseServer } from "../Server/BaseServer";
|
||||
import { RunningScript } from "../Script/RunningScript";
|
||||
import { HacknetServerConstants } from "./data/Constants";
|
||||
@ -22,7 +21,7 @@ import { createRandomIp } from "../../utils/IPAddress";
|
||||
import {
|
||||
Generic_fromJSON,
|
||||
Generic_toJSON,
|
||||
Reviver
|
||||
Reviver,
|
||||
} from "../../utils/JSONReviver";
|
||||
|
||||
interface IConstructorParams {
|
||||
@ -35,31 +34,27 @@ interface IConstructorParams {
|
||||
}
|
||||
|
||||
export class HacknetServer extends BaseServer implements IHacknetNode {
|
||||
// Initializes a HacknetServer Object from a JSON save state
|
||||
static fromJSON(value: any): HacknetServer {
|
||||
return Generic_fromJSON(HacknetServer, value.data);
|
||||
}
|
||||
|
||||
// Cache level. Affects hash Capacity
|
||||
cache: number = 1;
|
||||
cache = 1;
|
||||
|
||||
// Number of cores. Improves hash production
|
||||
cores: number = 1;
|
||||
cores = 1;
|
||||
|
||||
// Number of hashes that can be stored by this Hacknet Server
|
||||
hashCapacity: number = 0;
|
||||
hashCapacity = 0;
|
||||
|
||||
// Hashes produced per second
|
||||
hashRate: number = 0;
|
||||
hashRate = 0;
|
||||
|
||||
// Similar to Node level. Improves hash production
|
||||
level: number = 1;
|
||||
level = 1;
|
||||
|
||||
// How long this HacknetServer has existed, in seconds
|
||||
onlineTimeSeconds: number = 0;
|
||||
onlineTimeSeconds = 0;
|
||||
|
||||
// Total number of hashes earned by this server
|
||||
totalHashesGenerated: number = 0;
|
||||
totalHashesGenerated = 0;
|
||||
|
||||
constructor(params: IConstructorParams={ hostname: "", ip: createRandomIp() }) {
|
||||
super(params);
|
||||
@ -85,7 +80,7 @@ export class HacknetServer extends BaseServer implements IHacknetNode {
|
||||
}
|
||||
|
||||
// Process this Hacknet Server in the game loop. Returns the number of hashes generated
|
||||
process(numCycles: number=1): number {
|
||||
process(numCycles=1): number {
|
||||
const seconds = numCycles * CONSTANTS.MilliPerCycle / 1000;
|
||||
|
||||
return this.hashRate * seconds;
|
||||
@ -141,6 +136,12 @@ export class HacknetServer extends BaseServer implements IHacknetNode {
|
||||
toJSON(): any {
|
||||
return Generic_toJSON("HacknetServer", this);
|
||||
}
|
||||
|
||||
// Initializes a HacknetServer Object from a JSON save state
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
static fromJSON(value: any): HacknetServer {
|
||||
return Generic_fromJSON(HacknetServer, value.data);
|
||||
}
|
||||
}
|
||||
|
||||
Reviver.constructors.HacknetServer = HacknetServer;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user