Orca Targeting / Mining

Hello - With COVID I have been WFH a lot and have eve running in the background running. I’m keeping an eye one it - but I’m trying to find something (or learn how to create something) that will esentially just keep targeting astroids and send drones to mine. I’m doing all the warping and figuring out where to mine and unload, but just want it to keep targeting and keep mining so I don’t have to keep coming back.

I also run several clients at once… just for fun…

I’m confused as to how to get started though and would appreciate any help.

One way to start is by recording the inputs that you sent to the game client. For example, if you want to engage drones, you could start like this:

  • Step one: Right-click on the drones group in the drones window.
  • Step two: Click on a menu entry containing the text “engage”.

With your specific activity, you can take a shortcut and skip this step because there are already building blocks for locking asteroids and engaging drones. There is already a comprehensive framework for EVE Online that gets you there 97% of the way.

To write a program to automate these behaviors, I search the catalog for these functions and combine them into a new app. To find a building block to engage drones, I search for a ratting bot and find this one: FrontendWeb.Main
In this bots source code, I find this function to launch and engage drones:

In this function code, we also see the behavior to engage the drones described above.
To make a new bot, we can copy one of the existing popular bots and replace the decision tree’s root. Using a decision tree to pick the next action is a typical pattern that you find in mining, ratting, autopilot, and other bots. These different kinds of bots share the same language/type to describe the outcome of a decision tree so that we can copy branches and reuse them in other apps.
We can copy this function as-is and use it at the root of the decision tree. (We don’t need to worry about the branch for launching drones, because the bot will only enter it if necessary.)

I took an autopilot bot, replaced the decision tree root, and removed obsolete code. Here is the result: FrontendWeb.Main

1 Like

For mining it is not engaging target it is just minemining drone it seems to be looking for engage target in the drone sub window but its just simply mine or just use the shortcut key for drone engage which is f

I was going to say the same thing, but haven’t had time!

No problem, here is a change to use the context menu entry containing the text “mine”:

You can also load the app from FrontendWeb.Main

ok the mining drones are mining now thats good but it is not targeting the next asteroid to mine it like the miner bot does

No problem, I copied this part from a mining bot to add targeting the next asteroid:

You can run it from FrontendWeb.Main

This works great now! Thank you! Now I’m figuring out how to make it online so it lasts longer that 15 min.

did you manage to make it online so it lasts longer than 15 minutes?

Since this variant became popular, I used it as an input for a new variant supporting input focus scheduling and the latest engine version.

With this merge, you can use the variant from @Mactastic08 and @annar_731 with the engine version 2020-12-07 and newer. (Input focus scheduling is automatic).

You can run this composition from FrontendWeb.Main

1 Like

I checked out this branch, but my problem is that I have no access to the actual Groups, i.e., I assign drones to a group but I have no access to that in the ParsedInterface therefore cannot tell the bot to select a specific group of drones.

There is droneGroupInBay but it does not actually contain any groups, only the ungrouped drones.

I browsed the UI Tree an what I am looking for is the DroneSubGroup but I have no idea how I can access that easily.

ᐯdrones = List (8)

ᐳ0
ᐳ1
ᐳ2
ᐳ3
ᐳ4
ᐳ5
ᐳ6
ᐳ7

Am I missing something?

If I understand this correctly I need to adjust the ParseUserInterface.elm to parse/add what I need

droneSubGroupHeaders =
                    windowNode
                        |> listDescendantsWithDisplayRegion
                        |> List.filter (.uiNode >> .pythonObjectTypeName >> (==) "DroneSubGroup")
                        |> List.map parseDronesWindowDroneGroupHeader

But the problems seems to be that the subgroup does not actually have the DroneEntries as children I am correct.

How do I log debug output when I am testing such things btw?

Can you see the thing in a screenshot?
Do you see it in the visualization of the raw memory reading?
If it is visible in the raw memory reading but not in the parsed, the solution is to adapt the parsing function.

Depends on the reading from your game client. If you link your reading I can look into how you could access it.

When you run an app using the run or simulate-run command, the engine logs everything by default.
In both cases, sessions on live game clients and simulations, you will get a new session entry in devtools.
The simplest way to view the logs is by using the graphical user interface in devtools.
(If you used the --detailed-session-recording=off option in a session, the logs will not be available for that session)

Thx for the quick reply.
I haven’t tested my adapted Parser yet. I still need to learn how to execute my code in a simulation instead of the real client.

Is there another way to print debug information like pythons print or do I have to nest describeBranch calls? I would love to be able to print the stuff that I wrote to the console somehow

You don’t need describeBranch to log. If you want to log text extract text, you can add that into the statusTextFromState function here:

Ok. Going to check that. But that means I need to write into the context so that this function can read it from the context. I guess there is no direct way to log at any arbitrary code point.

Sorry, I used the wrong word “log” instead of “extract” in the earlier post.
You do not need to write to that context because everything is logged automatically.
When you run an app using the run or simulate-run command, the engine logs everything by default.
In both cases, sessions on live game clients and simulations, you will get a new session entry in devtools.
The simplest way to view the logs is by using the graphical user interface in devtools.
(If you used the --detailed-session-recording=off option in a session, the logs will not be available for that session)

The statusTextFromState is one way to extract text from the raw log. For example, when you feed a session log into a simulation, you can easily extract more text this way.

What do mean by log everything?
I am constructing a specific list of DroneSubGroup items and I want to log that. I would need to use Debug - core 1.0.0

I doubt that the engine just logs every variable value by default?

The detailed session recording contains everything that happened in a session.

If you added that construction to an app program code, it is logged in every detailed session recording of that app.

I will look into that and post here when I know more.

Why should it not?

@ooJ.2XU9bqJD2AKL-QhHb

You can see the output from Debug.log for example by running in the Elm Editor at https://editor.elm-fullstack.org

Here is an example project containing a Debug.log statement: Elm Editor

When you run the file DemoDebugLog.elm in this project, you can see the entries from Debug.log in the web browser devtools console:

Thank you very much so far. I am going to try and apply those things, but when I run botengine simulate-ru mylocalcode with a session I recorded I do not see the debug output anywhere.

The botengine devtools however do not display any of that debug output.

If I understand it correctly the only way to get log information out is via the describeBranch i.e., sending the information per tick to the c# host which automatically displays it.

Debug.log works fine for a regular elm App in a browser but the bot does not run in the browser it runs in a c# js VM if I read the code correctly.