From 8587625bd6f060ac9fbb2a61434b5f59bf532b07 Mon Sep 17 00:00:00 2001 From: Olivier Gagnon Date: Tue, 4 Jan 2022 18:03:44 -0500 Subject: [PATCH] hacking algos --- doc/source/advancedgameplay/batch.png | Bin 0 -> 51633 bytes .../advancedgameplay/hackingalgorithms.rst | 143 ++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 doc/source/advancedgameplay/batch.png create mode 100644 doc/source/advancedgameplay/hackingalgorithms.rst diff --git a/doc/source/advancedgameplay/batch.png b/doc/source/advancedgameplay/batch.png new file mode 100644 index 0000000000000000000000000000000000000000..837a62b2fab112422294f0a4ec58fc8ce343ee41 GIT binary patch literal 51633 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 z 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 literal 0 HcmV?d00001 diff --git a/doc/source/advancedgameplay/hackingalgorithms.rst b/doc/source/advancedgameplay/hackingalgorithms.rst new file mode 100644 index 000000000..6018973db --- /dev/null +++ b/doc/source/advancedgameplay/hackingalgorithms.rst @@ -0,0 +1,143 @@ + + +Hacking algorithms +================== + +There are 3 main family of hacking algorithms. This guide will go over each of them and give advice on how to +implement them. + +Self-contained algorithms +------------------------- + +Implementation difficulty: Easy + +pros: + +* Easy to implement +* Does not require other scripts to work +* Works at any stage of the game + +cons: + +* Limits income generation +* Very inefficient with ram +* Makes poor use of your script online time. + +This family of algorithms are the simplest to implement they are called self-contained because a single script +contains everything needed to maintain a constant flow of money. + +The general logic goes like this: + + .. code-block:: javascript + + for ever { + if security is not minimum { + weaken(target) + } else if money is not maximum { + grow(target) + } else { + hack(target) + } + } + +This is a perfectly fine algorithm to start with and can get you through most of the game. But it does have +some very serious issues. + +- It tends to make all your scripts on every server do the same thing. + This means if you are 0.01 security above minimum most scripts will be doing a weaken when only a + handful of thread should be. +- At higher thread count it can drain a server of all it's money in 1 hack(). Recovering from $0 is + possible but extremely slow. +- It makes very poor use of the servers RAM. To implement this you will need to call functions like + getServerSecurityLevel and that functions ram cost will be multiplied by the number of thread. + +loop algorithms +--------------- + +Implementation difficulty: Easy to Medium. + +pros: + +* Simple to understand +* Works at any stage of the game +* Maximize RAM usage. + +cons: + +* Support scripts are required to make things easy. + +We can kill 2 birds with 1 stone from the previous algorithm by splitting our 3 main functions into 3 files + + .. code-block:: javascript + + for ever { + hack(target) // or grow, or weaken + } + +Now we take the total amount of thread available and split it. We allocate: +- 1 part to the hack script. +- 10 part to the grow script. +- 2 part to the weaken script. + +Meaning if we have room for 100 thread across all network 7 thread will go to hack, 76 thread to grow and 15 to weaken. +These ratios are arbitrary and can be improved but this is generally a good idea. + +Carefull when applying this algorithm that you monitor the amount of money in the server, it should hover around maximum. +For that reason it may be wise to start the hack script later than the grow / weaken. If you find that the ratio is not +right feel free to modify it. + +To some extent it's better to split the grow processes into smaller parts. +4 process with 20 thread each is better than 1 process with 80 threads. + +It can be useful to add a delay to your scripts in order to prevent them from all starting at the same time. +The sleep function has no RAM cost. + +batch algorithms (aka hwgw or cycles) +------------------------------------- + +Implementation difficulty: Hard + +pros: + +* Maximize money + +cons: + +* Very hard to implement +* Does not work well without a large player bought server. + +Batch algorithms are so called because you have a master script that `exec` a lot of other scripts in batches. + +The basic building blocks are even simpler than the previous algorithm but a controller is required and is much +more complex. + + .. code-block:: javascript + + sleep(a bit) + hack(target) // or grow, or weaken + +We need to know a couple of things before we can implement this algorithm. + +- The effect of hack / grow depends on the server security. +- The time it takes for hack/grow/weaken takes to complete is determined when the + function is called but the effect is calculated at the end. + +A batch consist of a set of 4 special process + +1. A hack script that will remove a predefined, precalculated amount of money from the server. +2. A weaken script that counters the security increase of the hack process. +3. A grow script that counters the money decrease of the hack process. +4. A weaken script that counters the security increase of the grow process. + +It is also important that these 4 scripts finish in the order specified. Hence why you need a delay in your script. +It's possible to make a batch with 3 scripts (hgw) but that it less efficient as the effectiveness of `grow` is based off server security. + +Here's a picture demonstrating batch in action. + +.. image:: batch.png + +For batches to work the server needs to be at max money and min security. It is possible to use batches +to reach max money and min sec, just don't use any hack in your cycles. + +The time set between each script ending cannot be tighter than 20ms as this is the best the javascript engine can do. +