Add some new features to Anomalies bot

hello there,
thanks for your great work, but I have also couple ideas to optimize:
in ‘null’-space it is much more efficient not to dock into the structure, but to warp to a bookmark in tether range of any friendly citadel, this allows you to restart farming couple minutes after enemy/neutral leaves local:

If ( Enemy or Neutral show up in Local Chat) 
   Then (warp to bookmark and wait 5min)
If ( ship is on tether and no enemies in local) 
   Then (restart farming)

When I try to add multiple settings like --app-settings=“anomaly-name=Drone Patrol,anomaly-name=Drone Horde” the bot only uses the last one in the line

Yes, that app-settings string is a new kind of scenario.
I changed the bot to support this scenario too:

Here is the bot that supports settings strings like anomaly-name=Drone Patrol,anomaly-name=Drone Horde: FrontendWeb.Main

Thank you! does this also allow you to set multiple rat-name-to-go-to-next-anomaly=Lookout Tower,rat-name-to-go-to-next-anomaly=

?

Not yet, this is a new example.
I can adapt the bot to support that too, but there is something that I understand about your current app:
About the friendly-alliance-name setting: When you see an object in the overview that has a non-empty string in the ‘Alliance’ column: As long as it not matches the setting, it does not cause you to leave this anomaly? This is how I understood your app. Is this correct?

Maybe we can find an even simpler set of scenarios to describe the choice:

  • When you see a pilot from the specified alliance in the overview, you skip this anomaly.
  • When you see a pilot from another alliance in the overview, you continue working in this anomaly.

@BrianCorner @link858 why this distinction?

When seeing pilot from another alliance that mean it a neutral or enemy in localchat. We going to dock, wait them to get in anomaly site that mean we are dead :smiley:

Thank you for the clarification.

Does this mean we can simplify the setting friendly-alliance-name?
Can we replace friendly-alliance-name by skip-anomaly-with-other-pilot and only allow true or false for this setting?
Why should the user need to type the name of an alliance in friendly-alliance-name?
What if the user makes a typing error in friendly-alliance-name? Then the bot will continue in the anomaly when there is a friendly in the anomaly. If I understand correctly, this could be avoided by friendly-alliance-name with skip-anomaly-with-other-pilot.

Does this make sense?

Maybe another angle to explain it:

This is only true as long as the user correctly wrote the alliance name in friendly-alliance-name right?

Yes. It true. Using Pilot only should be good too. But mostly we only need to avoid same alliance. Different one will be known as enemies so we already have local watch to get docked

Good to know.
Based on todays learnings, I coded this version, much simpler then before:

Is there any problem with this change?

Small problem. You still let it check for pilot in overview even we in anomaly site first. It should be check in this part like my own version :grin:

nextOverviewEntryToLock :: _ ->
                                        DescribeBranch "I see an overview entry to lock."
                                            (lockTargetFromOverviewEntry nextOverviewEntryToLock)
                                )

Wait. How about we keep alliance setting and check for pilot in site. If Pilot wasnt in alliance so we lock and shot him ? This could become pvp combat bot too :star_struck:

Hello. I think this bot dont need some PVP activity. But Viir, why you destroy
this “good and excelent standings and is in your fleet\corporation”? It was on sanderling and was great job. Like here Implement local intel watch · Viir/bots@37de0ce · GitHub. He worked right with this code.
If you return this i think it was better for local check. If someone not in this standings bot just dock up
About @Freindly alliance name@ it was a bad idea. You can be on site with friendly alliance, not yours.
Can you do the bot can orbit not NPCs but wrecks and objects?

What you mean ? It is Intel bot and it not destroyed. lol

why you destroy
this “good and excelent standings and is in your fleet\corporation”?

About this one, Yes, we can do it

Oh, sorry. really it was intel bot. My bad:D

So how does that work? Do you have a link to your version?

Can we do this by checking only when the shipUI shows a transition from warping to not warping?
I found this function to look for warp:

Can we solve the problem you mentioned by performing the check for other pilots only when the return value from that function transitions to False?

Do you see any scenario where this would not work?

@You are in warp@ → came to anomaly → check it, if it busy then you go to next anomaly else combat mode

I have it on c#
if ( (0 < listOverviewEntryFriends?.Length || ListCelestialToAvoid?.Length > 0 ) )
{
if ( ListCelestialToAvoid?.Length > 0)
{
Host.Log(" Gas Haven, better run!!“);
ClickMenuEntryOnMenuRoot(scanActuallyAnomaly, “Ignore Result”);
return TakeAnomaly;
}
if (0 < listOverviewEntryFriends?.Length )
{
Messages(” Friends on site!");
return TakeAnomaly;
}
}
Just i dont know the ELM language but i will learn it for it:D

I was fix it long time ago by doing this:

If anomalySiteAlreadyHasAFriendly then  
(continueIfCombatComplete context)
 Else 
(lockTargetFromOverviewEntry nextOverviewEntryToLock)
decisionIfAlreadyOrbiting =
     case targetsToUnlock |> List.head of
         Just targetToUnlock ->
             DescribeBranch "I see a target to unlock."
                 (useContextMenuCascade
                     ( "locked target", targetToUnlock.barAndImageCont |> Maybe.withDefault targetToUnlock.uiNode )
                     (useMenuEntryWithTextContaining "unlock" menuCascadeCompleted)
                 )

         Nothing ->
             case context.readingFromGameClient.targets |> List.head of
                 Nothing ->
                     DescribeBranch "I see no locked target."
                         (case overviewEntriesToLock of
                             [] ->
                                 DescribeBranch "I see no overview entry to lock."
                                     (if overviewEntriesToAttack |> List.isEmpty then
                                         returnDronesToBay context.readingFromGameClient
                                             |> Maybe.withDefault
                                                 (DescribeBranch "No drones to return." (continueIfCombatComplete context))

                                      else
                                         DescribeBranch "Wait for target locking to complete." waitForProgressInGame
                                     )

                             nextOverviewEntryToLock :: _ ->
                                 DescribeBranch "I see an overview entry to lock."
                                     (if anomalySiteAlreadyHasAFriendly then
                                         returnDronesToBay context.readingFromGameClient
                                             |> Maybe.withDefault
                                                 (DescribeBranch "Site have Friendly Ratting, go next anomaly site." (continueIfCombatComplete context))
                                     else
                                                                 
                                         (lockTargetFromOverviewEntry nextOverviewEntryToLock)
                                     )
                         )```

:+1: Ok, looks like we are done here for now.

In case anybody discovers a scenario where it does not work, don’t hesitate to share that.

1 Like

Hi everyone. I am new. I have a small question. Is there any way to configure the bot not to orbit the enemy? Because I use Sentry drone and I able to tank without flying around.
Thank you.

Yes, you can run this app that does not orbit: bots/implement/applications/eve-online/eve-online-combat-anomaly-bot/BotEngineApp.elm at 97363f3aada8e5fad76fa802c1de919b8e351e4e · Viir/bots · GitHub

1 Like

Improve bot speed by using Shortcuts key in Drone Control and Lock Target, i think it will better than using Mouse and Menu Viir
Example in Return Drones:

returnDronesToBay : ReadingFromGameClient -> Maybe DecisionPathNode
        returnDronesToBay parsedUserInterface =
            parsedUserInterface.dronesWindow
                |> maybeNothingFromCanNotSeeIt
                |> Maybe.andThen .droneGroupInLocalSpace
                |> Maybe.andThen
                    (\droneGroupInLocalSpace ->
                        let
                                    returningDrones =
                                        droneGroupInLocalSpace.drones
                                            |> List.filter (.uiNode >> .uiNode >> EveOnline.ParseUserInterface.getAllContainedDisplayTexts >> List.any (String.toLower >> String.contains "returning"))

                        in
                        if ((droneGroupInLocalSpace.header.quantityFromTitle |> Maybe.withDefault 0) < 1) || (0 < (returningDrones |> List.length)) then
                            Nothing

                        else
                            Just
                                (DescribeBranch "I see there are drones in local space. Return those to bay."
                                    (EndDecisionPath
                                                (actWithoutFurtherReadings            
                                                    ( " by using SHIFT + R Key"
                                                    , [ VolatileHostInterface.KeyDown Common.EffectOnWindow.VK_SHIFT
                                                    ,   VolatileHostInterface.KeyDown Common.EffectOnWindow.VK_R
                                                      , VolatileHostInterface.KeyUp Common.EffectOnWindow.VK_R
                                                      , VolatileHostInterface.KeyUp Common.EffectOnWindow.VK_SHIFT
                                                      ]
                                                    )

                                            )
                                        )
                                )
                    )

Why i can’t put the code inside ‘’’ code ‘’’ To make it show color like above post