From ee9287972fbddaba685be3dfde896b1d08e7f758 Mon Sep 17 00:00:00 2001 From: dtookey Date: Tue, 15 Aug 2023 21:16:25 -0400 Subject: [PATCH] put the comments on a diet --- .idea/misc.xml | 1 - src/main/kotlin/Entry.kt | 4 +- .../kotlin/controllers/TemporalController.kt | 2 +- src/main/kotlin/controllers/windows/User32.kt | 2 +- .../game_logic/runescape/RunescapeRoutines.kt | 131 +----------------- src/main/kotlin/util/HelperFunctions.kt | 28 ++-- src/test/kotlin/util/HelperFunctionsTest.kt | 9 +- 7 files changed, 23 insertions(+), 154 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 24a2080..9bde07d 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/src/main/kotlin/Entry.kt b/src/main/kotlin/Entry.kt index c2afab1..f4d7844 100644 --- a/src/main/kotlin/Entry.kt +++ b/src/main/kotlin/Entry.kt @@ -1,7 +1,7 @@ import game_logic.runescape.RunescapeRoutines fun main() { -// RunescapeRoutines.fullRunIncense(0, 4514, 4870, 308) - RunescapeRoutines.createNecromancyInk(2960) +// RunescapeRoutines.fullRunIncense(0, 158, 348, 0) + RunescapeRoutines.processInventoryAtFurnace(2500) } diff --git a/src/main/kotlin/controllers/TemporalController.kt b/src/main/kotlin/controllers/TemporalController.kt index 04dec0a..d47de19 100644 --- a/src/main/kotlin/controllers/TemporalController.kt +++ b/src/main/kotlin/controllers/TemporalController.kt @@ -29,7 +29,7 @@ interface TemporalController { val duration = if(maxAdditionalDuration == 0L){ baseDuration }else{ - baseDuration + util.HelperFunctions.getGaussianLong(maxAdditionalDuration) + baseDuration + util.HelperFunctions.getApproximatelyNormalLong(maxAdditionalDuration) } TimeUnit.MILLISECONDS.sleep(duration) diff --git a/src/main/kotlin/controllers/windows/User32.kt b/src/main/kotlin/controllers/windows/User32.kt index 1ef9906..52c8196 100644 --- a/src/main/kotlin/controllers/windows/User32.kt +++ b/src/main/kotlin/controllers/windows/User32.kt @@ -79,7 +79,7 @@ interface User32 : StdCallLibrary { * @param userData Optional user-defined data to pass to the callback. * @return True if successful, false otherwise. */ - fun EnumWindows(lpEnumFunc: WNDENUMPROC?, userData: Pointer?): Boolean + fun EnumWindows(lpEnumFunc: StdCallLibrary.StdCallCallback?, userData: Pointer?): Boolean /** * Gets the title text of the specified window. diff --git a/src/main/kotlin/game_logic/runescape/RunescapeRoutines.kt b/src/main/kotlin/game_logic/runescape/RunescapeRoutines.kt index 9a31479..d102369 100644 --- a/src/main/kotlin/game_logic/runescape/RunescapeRoutines.kt +++ b/src/main/kotlin/game_logic/runescape/RunescapeRoutines.kt @@ -48,28 +48,6 @@ object RunescapeRoutines { * @param volLogs The number of magic logs to cut into sticks. * @param volAshes The number of sticks to coat in ashes. * @param volCleanHerbs The number of clean herbs to infuse into sticks. - * - * This handles the entire incense stick crafting process: - * - Cleaning grimy herbs - * - Cutting magic logs into sticks - * - Coating sticks in ashes - * - Infusing clean herbs into sticks - * - * It loops through each step based on the provided volumes, performing the - * actions at the bank. - * - * Usage example: - * - * ``` - * val herbs = 1000 - * val logs = 2000 - * val ashes = 1500 - * val cleanHerbs = herbs + 150 - * - * Routines.fullRunIncense(herbs, logs, ashes, cleanHerbs) - * ``` - * - * Progress is printed after each step. Total elapsed time is printed at the end. */ fun fullRunIncense(volHerbs: Int, volLogs: Int, volAshes: Int, volCleanHerbs: Int) { val start = System.currentTimeMillis() @@ -126,24 +104,6 @@ object RunescapeRoutines { * @param agent Optional. The Agent instance to use for banking actions. * @param bankPoint Optional. The Point location of the bank to use. * - * This handles the workflow of: - * - Withdrawing grimy herb preset - * - Cleaning grimy herbs without dialog - * - Depositing clean herbs - * - * It performs the actions at the bank location using the provided agent. - * - * Usage examples: - * ``` - * val volume = 1000 - * val bankPoint = Point(100, 200) - * val agent = RSAgent.getInstance() - * Routines.cleanHerbs(volume, agent, bankPoint) - * ``` - * Can also omit agent and bankPoint to use defaults: - * ``` - * Routines.cleanHerbs(1000) - * ``` */ fun cleanHerbs(volume: Int, agent: RSOrchestrator = RSOrchestrator.getInstance(), bankPoint: Point = agent.getBankPoint()) { val params = StandingTaskParams( @@ -166,23 +126,6 @@ object RunescapeRoutines { * @param agent Optional. The Agent instance to use for banking actions. * @param bankPoint Optional. The Point location of the bank to use. * - * This handles the workflow of: - * - Withdrawing magic log preset - * - Cutting magic logs into incense sticks without dialog - * - Depositing incense sticks - * - * Usage examples: - * ``` - * val logs = 1000 - * val bankPoint = Point(100, 200) - * val agent = RSAgent.getInstance() - * - * Routines.cutIncenseSticks(logs, agent, bankPoint) - * ``` - * Can also omit agent and bankPoint to use defaults: - * ``` - * Routines.cutIncenseSticks(1000) - * ``` */ fun cutIncenseSticks(volume: Int, agent: RSOrchestrator = RSOrchestrator.getInstance(), bankPoint: Point = agent.getBankPoint()) { val params = StandingTaskParams( @@ -205,24 +148,6 @@ object RunescapeRoutines { * @param agent Optional Agent instance to use for banking actions. * @param bankPoint Optional Point location of the bank to use. * - * This handles the workflow of: - * - Withdrawing incense stick preset - * - Coating incense sticks with ashes using hotkey - * - Depositing coated sticks - * - * Usage examples: - * ``` - * val sticks = 1000 - * val bankPoint = Point(100, 200) - * val agent = RSAgent.getInstance() - * - * Routines.coatIncenseSticks(sticks, agent, bankPoint) - * ``` - * Can also omit agent and bankPoint to use defaults: - * - * ``` - * Routines.coatIncenseSticks(1000) - * ``` */ fun coatIncenseSticks(volume: Int, agent: RSOrchestrator = RSOrchestrator.getInstance(), bankPoint: Point = agent.getBankPoint()) { val params = StandingTaskParams( @@ -243,24 +168,6 @@ object RunescapeRoutines { * @param volume The number of incense sticks to infuse with herbs. * @param agent Optional Agent instance to use for banking actions. * @param bankPoint Optional Point location of the bank to use. - * - * This handles the workflow of: - * - Withdrawing incense stick preset - * - Infusing incense sticks with herbs using hotkey - * - Depositing infused incense sticks - * - * Usage examples: - * ``` - * val sticks = 1000 - * val bankPoint = Point(100, 200) - * val agent = RSAgent.getInstance() - * - * Routines.infuseIncenseSticks(sticks, agent, bankPoint) - * ``` - * Can also omit agent and bankPoint to use defaults: - * ``` - * Routines.infuseIncenseSticks(1000) - * ``` */ fun infuseIncenseSticks(volume: Int, agent: RSOrchestrator = RSOrchestrator.getInstance(), bankPoint: Point = agent.getBankPoint()) { val params = StandingTaskParams( @@ -282,21 +189,6 @@ object RunescapeRoutines { * @param agent The RSOrchestrator instance to use. Defaults to default instance. * @param bankPoint The location of the bank. Defaults to agent's configured bank point. * - * This method handles the workflow of crafting potions using hotkeys while standing at a bank: - * - * - It constructs a StandingTaskParams instance defining: - * - The volume, volume per trip, bank point, crafting hotkey, and other details - * - It calls the orchestrator's doStandingTask() method to execute the task. - * - * Usage example: - * ``` - * val volume = 1000 - * val bankPoint = Point(100, 200) - * val agent = RSAgent.getInstance() - * Routines.craftPotionsAtBank(volume, agent, bankPoint) - * ``` - * - * Progress is automatically printed during execution. * * @deprecated This method needs validation before use in production. */ @@ -316,32 +208,13 @@ object RunescapeRoutines { /** * Grinds potions using a well location for water. + * It prompts the user to position the mouse over the well location to get its coordinates. * * @param volume The total number of potions to make. * @param travelDurationInMillis The time in ms for the agent to travel between the bank and the well. * @param agent The RSOrchestrator instance to use. Defaults to the default instance. * @param bankPoint The Point location of the bank. Defaults to the agent's configured bank point. * - * This method handles the workflow of grinding potions using a well as the water source. - * - * It prompts the user to position the mouse over the well location to get its coordinates. - * - * It then constructs a TravelTaskParams instance to define: - * - The volume, volume per trip, bank point, well point, and other task details. - * - * It calls the orchestrator's doTravelTask() method to execute the grinding task. - * - * Usage example: - * ``` - * val volume = 1000 - * val travelDuration = 5000 // 5 seconds - * val bankPoint = Point(100, 200) - * val wellPoint = Point(300, 400) // Prompted from user - * Routines.potionGrindWithWell(volume, travelDuration, bankPoint, wellPoint) - * ``` - * - * Progress is automatically printed during execution. - * * @deprecated This method needs validation before use in production. */ @Deprecated("Needs validation before you use it for realsies") @@ -397,7 +270,7 @@ object RunescapeRoutines { fun processInventoryAtFurnace(volume: Int) { //these two points are specific to my computer. we need to export these into a file or something val furnaceFromChest = Point(776, 321) - val chestFromFurnance = Point(1713, 843) + val chestFromFurnance = Point(1813, 893) val agent = RSOrchestrator.getInstance() val params = TravelTaskParams( volume, diff --git a/src/main/kotlin/util/HelperFunctions.kt b/src/main/kotlin/util/HelperFunctions.kt index 44846c9..786f2aa 100644 --- a/src/main/kotlin/util/HelperFunctions.kt +++ b/src/main/kotlin/util/HelperFunctions.kt @@ -32,29 +32,26 @@ object HelperFunctions { 0 } - /** - * Generates a random long value approximating a normal distribution. + * Generates a random long that approximates a normal distribution. * - * Takes two random samples from 0 to upperBound/2 and adds them together. This approximates a normal distribution - * better than a single random sample. + * Works by taking two random samples from 0 to upperBound/2 and adding them together. This tends to give a more natural + * spread than a single random sample. * - * @param upperBound The upper bound to sample from - * @return A random long value following an approximate normal distribution + * This approach relies on the Central Limit Theorem: that the sum of multiple independent random variables will + * tend towards a normal distribution, even if the original variables themselves are not normally distributed. + * + * @param upperBound The upper bound for the random range. Must be >= 2. + * @return A random long value following an approximate normal distribution. */ - fun getGaussianLong(upperBound: Long): Long { + fun getApproximatelyNormalLong(upperBound: Long): Long { // anything lower to 2 will round down to zero, so return zero. Additionally, this guarantees a positive upper //bound in one step - if (upperBound <= 2L) { + if (upperBound < 2L) { return 0L } - - // To create more natural distribution Take two random samples from 0 to upperBound/2 and add them. This - // approximates a normal distribution better than single random sample. - val subBound = upperBound / 2L - val result1 = Random.nextLong(subBound) - val result2 = Random.nextLong(subBound) - return result1 + result2 + // Generate two random longs from 0 to upperBound/2 and add them together to approximate a normal distribution. + return Random.nextLong(upperBound.shr(1)) + Random.nextLong(upperBound.shr(1)) } /** @@ -66,6 +63,7 @@ object HelperFunctions { * @return A random long value */ fun getNextGaussian(upperBound: Long): Long { + require(upperBound > 0) return java.util.Random() .nextGaussian( upperBound.toDouble() / 2.0, diff --git a/src/test/kotlin/util/HelperFunctionsTest.kt b/src/test/kotlin/util/HelperFunctionsTest.kt index 905667a..8c9f542 100644 --- a/src/test/kotlin/util/HelperFunctionsTest.kt +++ b/src/test/kotlin/util/HelperFunctionsTest.kt @@ -2,7 +2,6 @@ package util import kotlin.math.pow import kotlin.system.measureNanoTime -import kotlin.system.measureTimeMillis import kotlin.test.Test @@ -16,7 +15,7 @@ class HelperFunctionsTest { val numSamples = 10000 val upperBound = 1000L val samples = (1..numSamples).map { - HelperFunctions.getGaussianLong(upperBound) + HelperFunctions.getApproximatelyNormalLong(upperBound) } // Calculate mean and standard deviation @@ -40,7 +39,7 @@ class HelperFunctionsTest { val samples = ArrayList(iterations) val time = doBenchmark(iterations, upperBound) { - val v = HelperFunctions.getGaussianLong(it) + val v = HelperFunctions.getApproximatelyNormalLong(it) samples.add(v) v } @@ -105,7 +104,7 @@ class HelperFunctionsTest { println("Warming up for a few iterations") val consumer = ArrayList(iterations) repeat(iterations){ - consumer.add(HelperFunctions.getGaussianLong(upperBound)) + consumer.add(HelperFunctions.getApproximatelyNormalLong(upperBound)) consumer.add(HelperFunctions.getNextGaussian(upperBound)) } @@ -114,7 +113,7 @@ class HelperFunctionsTest { var total = 0L val time1 = measureNanoTime { repeat(iterations) { - total += HelperFunctions.getGaussianLong(upperBound) + total += HelperFunctions.getApproximatelyNormalLong(upperBound) } }