Results 1 to 13 of 13

Thread: Core Anti-Random Mods

  1. #1
    Join Date
    Aug 2007
    Location
    Colorado
    Posts
    7,421
    Mentioned
    268 Post(s)
    Quoted
    1442 Post(s)

    Default Core Anti-Random Mods

    I've had these up and running for a while but because they're only seen in Monkfishies & Al-Kharid Cooker not many people have been utilizing them. So here's a set of modifications I've made to our current anti-randoms as well as a few new ones that scripters might find handy.

    [Note] All modifications are done in 'antirandoms.simba' (Includes > SRL-OSR > SRL > core > antirandoms > antirandoms.simba)

    -Solving the Frog random-

    First you'll want to define this DTM as a global variable:
    Simba Code:
    Var
      DTM_Royal_Frog: Integer;

    Create a procedure we'll use later on to free this DTM:
    Simba Code:
    Procedure FreeCRGlobals;
    begin
      FreeDTM(DTM_Royal_Frog);
    end;

    Create a procedure to define the DTM:
    Simba Code:
    Procedure SetupCustomRandoms;
    begin
      DTM_Royal_Frog := DTMFromString('mbQAAAHicY2VgYLgDxLeB+CYQ34OyeRgZGDgZIbQAEPMD8cpOYYbfZ1QZDs4RYziuKcbw+5wxgxxQLTpmxoLBAAB7VQzf');
      AddOnTerminate('FreeCRGlobals');
    end;
    That's so the DTM is only defined one time and is also freed when the script stops.

    And the actual frog-solving function:
    Simba Code:
    (**
    * Author: Flight
    * Description: Handles solving the random event.
    *)

    function Frog_Solve2: Boolean;
    var
      cRan: Boolean;
      t,i,F,X,Y: Integer;
      responses: TStringArray;
    label
      Start;
    begin
      Start:
      cRan := false;
      responses := ['lrigh','Okay','kay.','I supp','pose so','yeah','Yeah','Sure','ure'];
      for i:=1 to 5 do
        if FindDTM(DTM_Royal_Frog, X, Y, MSx1, MSy1, MSx2, MSy2) then
        begin
          MMouse(X, Y, 0, 0);
          if WaitUpTextMulti(['Frog','to Fr'], 300) then
          begin
            Writeln('Frog_Solve2: Found royal frog');
            ClickMouse2(mouse_right);
            Wait(randomRange(100,250));
            cRan := waitOptionMulti(['Talk-to Frog','to Fr','Frog'], 500);
            if cRan then
              break
            else
              MouseBox(MCx1, MCy1, MCx2, MCy2, mouse_move);
          end;
        end;

      if not cRan then
      begin
        Writeln('Frog_Solve2: Failed to locate the royal frog, exiting');
        Exit;
      end;

      Writeln('Frog_Solve2: Talking to royal frog...');

      if not waitFunc(@areTalking, 10, 6000) then
      begin
        Inc(F);
        if (F > 4) then
        begin
          Writeln('Frog_Solve2: Failed to talk to the royal frog, exiting');
          Exit;
        end;
        GoTo Start;
      end;

      MarkTime(t)
      repeat
        if DoConversationEx(responses) then
        begin
          Writeln('Frog_Solve2: Reached response');
          for i:=0 to High(responses) do
            if findTextTPA(0, 5, MCx1, MCy1, MCx2, MCy2, responses[i], CharsNPC07, ClickLeft) then
            begin
              Writeln('Frog_Solve2: Chose correct option');
              ClickToContinue;
              break;
            end;
        end;
      until(timeFromMark(t) > 15000)

      MarkTime(t)
      repeat
        if ClickContinueEx(True, True) then
          break;
      until(timeFromMark(t) > 10000)

      Result := True;
      Writeln('Frog_Solve2: Successfully solved the Frog random!');
    end;

    And for that to work you're going to need a function similar to DoConversation but one that will search for an array of text. Luckily I made one already for you to use, so define this as well:
    Simba Code:
    (*
    DoConversationEx
    ~~~~~~~~~~~~~~

    .. code-block:: pascal

        function DoConversationEx(resultText: TStringArray; clickresult: boolean): boolean;

    Goes through the initial dialog of a random.  Will keep clicking to continue
    until any of the conversation's 'resultText' is found.  Will click to continue when
    any 'resultText' is found if 'clickresult' is set to true.  Set 'resultText' to ['']
    to click continue until conversation is over.

    .. note::

        Author: Coh3n, Flight
        Last Modified: Jun. 15th, 2013 by Flight

    Example:

    .. code-block:: pascal

        if (DoConversationEx(['thank','nk you'], true)) then
          writeln('Finished conversation');
    *)

    function DoConversationEx(resultText: TStringArray): boolean;
    var
      t,i: integer;
    begin
      while (t < 25) do // max of 25 "click to continue's"
      begin
        if (length(resultText) > 0) then
          for i:=0 to high(resultText) do
            if (findNPCChatText(resultText[i], nothing)) then
            begin
              result := true;
              exit;
            end;

        // break if there's no more conversation
        if (not clickContinue(true)) then
          break;

        wait(100 + random(200));
        inc(t);
      end;
    end;

    For this random to be detected and handled correctly you'll need to stick it in your 'FindTalk' function so that when your player's nickname is detected on screen you'll first search for the DTM_Royal_Frog, and if it's found then FindTalk will skip the right-click "Talk-to" and instead attempt to solve the Frog random. I've made an example (which I'll post below) of how to go about doing this.


    -A safer way to handle talking randoms-

    A problem I found pretty quickly is when FindTalk finds a random NPC that says our name, and that same random that we need to talk to is standing in in the same tile as another NPC with the "Talk-to" option, there's a good chance we talk to the wrong NPC and fail the random event. So we should be more specific on our "Talk-to" option when handling all random events. Here's what I've done to prevent such a thing from happening:

    Simba Code:
    {*******************************************************************************
    function FindTalk: Boolean;
    by: Ashaman88 & Flight
    Description: Searches screen for NickName and handles ALL Talking Randoms
    *******************************************************************************}


    function FindTalk: Boolean;
    var
      ax,ay,yCount,zCount,Count2,x1,y1,x2,y2,
      X,Y,Count1,bmpScreen: Integer;
      RawMenuText: String;
      rTalkStrings: TStringArray;
    begin
      Result := False;
      if (GetArrayLength(Players) < 1) then Exit;

      if FindColor(ax, ay, 65535, MSX1, MSY1, MSX2, MSY2) then
      begin

        SetArrayLength(gtalksBox, 0);
        SetArrayLength(YelSkipBoxs, 0);

        y1 := ay;
        if ( ( ay + 5 ) > 334 ) then y2 := 334 else y2 := ay + 5;

        x1 := ax; x2 := x1;
        zCount := 0;

        repeat
          if FindColor(ax, ay, 65535, x2, y1 + 2, x2 + 3, y2 + 3) then
            zCount := 0
          else
            zCount := zCount + 1;

          if ( zCount = 4 ) then Break;
          x2 := x2 + 3;
        until ( x2 + 3 > 515 );

        if ( x2 + 3 <= 515 ) then x2 := x2 - 12;

        if (x2 - x1 >= length(Players[CurrentPlayer].Nick) * 4) then
        begin

          x1 := x1 - 8;
          y1 := y1 - 8;
          x2 := x2 + 8;
          y2 := y2 + 8;

          if ( x1 < 0 ) then x1 := 0;
          if ( y1 < 0 ) then y1 := 0;
          if ( x2 > 515 ) then x2 := 515;
          if ( y2 > 334 ) then y2 := 334;

          Count2 := Count2 + 1;
          Count1 := Count1 + 1;
          SetArrayLength(gtalksBox, Count2);
          gtalksBox[Count2 - 1].x1 := x1;
          gtalksBox[Count2 - 1].y1 := y1;
          gtalksBox[Count2 - 1].x2 := x2;
          gtalksBox[Count2 - 1].y2 := y2 + 6;

          SetArrayLength(YelSkipBoxs, Count1);
          YelSkipBoxs[Count1 - 1].x1 := x1;
          YelSkipBoxs[Count1 - 1].y1 := y1;
          YelSkipBoxs[Count1 - 1].x2 := x2;
          YelSkipBoxs[Count1 - 1].y2 := y2;

        end else
        begin
          y1 := y1 - 2;
          y2 := y2 + 8;
          x1 := x1 - 5;
          x2 := x2 + 5;
          if ( x1 < 0 ) then x1 := 0;
          if ( y1 < 0 ) then y1 := 0;
          if ( x2 > 515 ) then x2 := 515;
          if ( y2 > 334 ) then y2 := 334;

          Count1 := Count1 + 1;
          SetArrayLength(YelSkipBoxs, Count1);
          YelSkipBoxs[Count1 - 1].x1 := x1;
          YelSkipBoxs[Count1 - 1].y1 := y1;
          YelSkipBoxs[Count1 - 1].x2 := x2;
          YelSkipBoxs[Count1 - 1].y2 := y2;
        end;

        if ( GetArrayLength(gtalksBox) <> 0 ) then
        begin
          for yCount := 0 to GetArrayLength(gtalksBox) - 1 do
          begin
            if FindBitmapMaskTolerance(NickNameBMP, ax, ay, gtalksBox[yCount].x1, gtalksBox[yCount].y1, gtalksBox[yCount].x2, gtalksBox[yCount].y2, 0, 40) then
            begin
              WriteLn('Found NickName');
              ax := (gtalksBox[yCount].x2 + gtalksBox[yCount].x1) shr 1;
              ay := gtalksBox[yCount].y2 - 2;

              if gTalkSaveBitmap then
              begin
                bmpScreen := BitmapFromString(515, 334, '');
                CopyClientToBitmap(bmpScreen, 1, 1, 515, 334);

                if ( gtalksBox[yCount].x1 = 0 ) then x1 := 1 else x1 := gtalksBox[yCount].x1;
                if ( gtalksBox[yCount].y1 = 0 ) then y1 := 1 else y1 := gtalksBox[yCount].y1;

                gTalksCount := gTalksCount + 1;
                for Count1 := -1 to 1 do
                  for Count2 := -1 to 1 do
                    FastSetPixel(bmpScreen, Count1 + x1, Count2 + y1, 255);

                if ( gtalksBox[yCount].x2 = 515 ) then x1 := 515 else x1 := gtalksBox[yCount].x2;
                if ( gtalksBox[yCount].y2 = 334 ) then y1 := 334 else y1 := gtalksBox[yCount].y2;

                for Count1 := -1 to 1 do
                  for Count2 := -1 to 1 do
                    FastSetPixel(bmpScreen, Count1 + x1, Count2 + y1, 255);

                for Count1 := -1 to 1 do
                  for Count2 := -1 to 1 do
                    FastSetPixel(bmpScreen, Count1 + ax, Count2 + ay, 255);
                SaveBitmap(bmpScreen, ScriptPath + 'FTalk' + IntToStr(gTalksCount) + '.bmp');
                FreeBitmap(bmpScreen);
              end;

              if not FindDTM(DTM_Royal_Frog, X, Y, MSx1, MSy1, MSx2, MSy2) then
              begin
                MMouse(ax, ay, 0, 0);
                Wait(100 + Random(50));
                if WaitUpTextMulti(['Talk','lk-to','uard','ard','security','ecurity','curity'], RandomRange(150,300)) then
                begin
                  Mouse(ax, ay, 0, 0, mouse_Right);
                  Wait(150 + Random(100));

                  rTalkStrings := ['o Sec','o San','o Gen','o Mil','o Gil','o Nil','o Ric',
                                   'o Dru','o Cap','o Mys','o Dr'];
                  if (ChooseOptiongetMenuText(RawMenuText, rTalkStrings, ClickLeft)) then
                  begin
                    WriteLn('******** FOUND TALKING RANDOM TEXT********: ' + RawMenuText);
                    Flag;
                    Wait(700 + Random(300))
                    if SolveTalkingRandom(RawMenuText) then
                      Result := True;
                    Exit;
                  end;
                end;
              end else
              begin
                WriteLn('******** SOLVING FROG RANDOM ********');
                if Frog_Solve2 then
                  Result := True;
                Exit;
              end;
            end;
          end;
        end;
      end;
    end;

    The above modified function also correctly detects & handles the Frog random event, if you've already installed what I've written above.

    Anyways, I'll attach a file already containing all of the modifications if you don't feel like doing them yourself. If you're just using C_AntiRandoms from this post then you'll need to know a couple things. First, download the attached file and place it in "Includes > SRL-OSR > SRL > core > antirandoms". You'll want to include it in your script like so:
    Simba Code:
    {$i SRL-OSR/SRL/core/antirandoms/C_AntiRandoms.simba}

    Also you'll need to call "SetupCustomRandoms;" after you've called "SetupSRL;". From now on you'll be using "FindCustomRandoms" as opposed to "FindNormalRandoms".
    Simba Code:
    {$i SRL-OSR/SRL.Simba}
    {$i SRL-OSR/SRL/core/antirandoms/C_AntiRandoms.simba}

    Procedure declarePlayers;
    begin
      HowManyPlayers := 1;
      NumberOfPlayers(HowManyPlayers);
      CurrentPlayer := 0;

      with Players[0] do
      begin
        Name        := '';
        Pass        := '';
        Nick        := 'nick';  // DO NOT FORGET THIS!
        Pin         := '';
        LampSkill   := Skill_Herblore;
        WorldInfo   := [];
        Member      := True;
        Active      := True;
      end;
    end;

    begin
      declarePlayers;
      SetupSRL;
      SetupCustomRandoms;

      Repeat
        Writeln('Searching for random events...');
        FindCustomRandoms;
      Until(AllPlayersInactive)
    end.

    That's all I have so far for the core anti-randoms. I have some detection & handling for others but they're more specific to the script so it wouldn't be appropriate to post them here.
    Attached Files Attached Files
    Last edited by Flight; 07-27-2013 at 10:41 AM.

    Current projects:
    [ AeroGuardians (GotR minigame), Motherlode Miner, Blast furnace ]

    "I won't fall in your gravity. Open your eyes,
    you're the Earth and I'm the sky..."


  2. #2
    Join Date
    Mar 2012
    Location
    127.0.0.1
    Posts
    3,383
    Mentioned
    95 Post(s)
    Quoted
    717 Post(s)

    Default

    Nice release.
    It's the thought that counts, right?

  3. #3
    Join Date
    Aug 2007
    Location
    Colorado
    Posts
    7,421
    Mentioned
    268 Post(s)
    Quoted
    1442 Post(s)

    Default

    Quote Originally Posted by NKN View Post
    Nice release.
    It's the thought that counts, right?
    Indeed, thank you.

    Current projects:
    [ AeroGuardians (GotR minigame), Motherlode Miner, Blast furnace ]

    "I won't fall in your gravity. Open your eyes,
    you're the Earth and I'm the sky..."


  4. #4
    Join Date
    Dec 2011
    Location
    Hyrule
    Posts
    8,662
    Mentioned
    179 Post(s)
    Quoted
    1870 Post(s)

    Default

    Have you thought about merging with the official version? Or at least parts? Good stuff man!

  5. #5
    Join Date
    Aug 2007
    Location
    Colorado
    Posts
    7,421
    Mentioned
    268 Post(s)
    Quoted
    1442 Post(s)

    Default

    Quote Originally Posted by Ashaman88 View Post
    Have you thought about merging with the official version? Or at least parts? Good stuff man!
    Nah I've never used Github before. When I make things like this I don't consider it to be "SRL-quality" so it's best it stays out of the official include.

    Current projects:
    [ AeroGuardians (GotR minigame), Motherlode Miner, Blast furnace ]

    "I won't fall in your gravity. Open your eyes,
    you're the Earth and I'm the sky..."


  6. #6
    Join Date
    Sep 2008
    Posts
    754
    Mentioned
    8 Post(s)
    Quoted
    275 Post(s)

    Default

    Nice work Flight, looking good.
    Quit gaming

  7. #7
    Join Date
    Aug 2007
    Location
    Colorado
    Posts
    7,421
    Mentioned
    268 Post(s)
    Quoted
    1442 Post(s)

    Default

    Quote Originally Posted by samerdl View Post
    Nice work Flight, looking good.
    Thanks mate. I still have detection for things like whirlpools and evil chickens but, like the strangeplant handler I posted about, they're really specific to the script. I believe I have the detection of the Evil Chicken in C_AntiRandoms.simba but I didn't include it in the tutorial.

    Current projects:
    [ AeroGuardians (GotR minigame), Motherlode Miner, Blast furnace ]

    "I won't fall in your gravity. Open your eyes,
    you're the Earth and I'm the sky..."


  8. #8
    Join Date
    Jun 2013
    Posts
    49
    Mentioned
    0 Post(s)
    Quoted
    23 Post(s)

    Default

    Very nice creation Flight! My only concern is:

    Code:
    [Error] C:\Simba\Includes\SRL-OSR/SRL/core/antirandoms/C_AntiRandoms.simba(344:3): Unknown identifier '_resetColorMods' at line 343
    Know any reason to why I would get this error when I compile my script?

  9. #9
    Join Date
    Mar 2006
    Location
    Belgium
    Posts
    3,564
    Mentioned
    111 Post(s)
    Quoted
    1475 Post(s)

    Default

    Quote Originally Posted by Success View Post
    Very nice creation Flight! My only concern is:

    Code:
    [Error] C:\Simba\Includes\SRL-OSR/SRL/core/antirandoms/C_AntiRandoms.simba(344:3): Unknown identifier '_resetColorMods' at line 343
    Know any reason to why I would get this error when I compile my script?
    Yeah that's normal, since it's meant to be used as an include for scripts.

    Creds to DannyRS for this wonderful sig!

  10. #10
    Join Date
    Jun 2013
    Posts
    49
    Mentioned
    0 Post(s)
    Quoted
    23 Post(s)

    Default

    Quote Originally Posted by Sjoe View Post
    Yeah that's normal, since it's meant to be used as an include for scripts.
    So... It's normal for this error to occur so I can't use my scripts?

  11. #11
    Join Date
    Mar 2006
    Location
    Belgium
    Posts
    3,564
    Mentioned
    111 Post(s)
    Quoted
    1475 Post(s)

    Default

    Quote Originally Posted by Success View Post
    So... It's normal for this error to occur so I can't use my scripts?
    oh this happened when you compiled your script? lol
    Thought it happened when u compiled c_antirandoms

    Make sure you call {$i SRL-OSR/SRL/core/antirandoms/C_AntiRandoms.simba} after {$i srl-osr/srl.simba}
    Last edited by Sjoe; 09-12-2013 at 05:07 AM.

    Creds to DannyRS for this wonderful sig!

  12. #12
    Join Date
    Jun 2013
    Posts
    49
    Mentioned
    0 Post(s)
    Quoted
    23 Post(s)

    Default

    Quote Originally Posted by Sjoe View Post
    oh this happened when you compiled your script? lol
    Thought it happened when u compiled c_antirandoms

    Make sure you call {$i SRL-OSR/SRL/core/antirandoms/C_AntiRandoms.simba} after {$i srl-osr/srl.simba}
    I got it like so:
    Simba Code:
    {$DEFINE SMART8}
    {$I SRL-OSR/SRL.Simba}
    {$i SRL-OSR/SRL/core/antirandoms/C_AntiRandoms.simba}
    {$I SRL/SRL/Misc/Debug.Simba}
    {$I SRL-OSR/SRL/Misc/SmartGraphics.simba}
    and I still get the error.

  13. #13
    Join Date
    Mar 2006
    Location
    Belgium
    Posts
    3,564
    Mentioned
    111 Post(s)
    Quoted
    1475 Post(s)

    Default

    called SetupCustomRandoms; after SetupSRL;?

    Try replacing your current SRL-OSR with the latest one. Sometimes fixes errors.

    Creds to DannyRS for this wonderful sig!

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •