SRL Archive - Discussions and Debates

(UBI) Looking for very Advance SCAR Scripter


ruler

2007-07-03 01:54:20

Well, genodemon has been buggin me to bring back UBI.* So i coded that stuff needed to do it.* Now he wants me to do the SCAR code when he is the scripter….


Anyone want to code this?
connect to socket 3000, send strings and parse results.

UBI in it new form runs on top of iBot is able to use everything from the iBot api.


/*
* Commands:
* getx
* gety
* doweb int int
* dowalk int int
* dobank
* mousemove int int
* mouseclickr int int
* mouseclickl int int
*/



package impsoft.nexus.bots.ubi;

import impsoft.nexus.bots.color.ColorBot;
import impsoft.nexus.bots.color.scriptable.ColorScript;
import impsoft.nexus.bots.reflection.objects.AryanPath;
import impsoft.nexus.bots.reflection.structures.AryanTile;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class UbiScript extends ColorScript {
public static String[] commands = new String[] { "" };

public final static int PORT = 3000;

public UbiScript(ColorBot b) {
super(b);
}

/*
* Commands:
* getx
* gety
* doweb int int
* dowalk int int
* dobank
* mousemove int int
* mouseclickr int int
* mouseclickl int int
*/
public void script() throws InterruptedException, Exception {
log("UBI START");
ServerSocket server = new ServerSocket(PORT);
while (true) {
Socket aSocket = server.accept();
try {
BufferedReader in = new BufferedReader(new InputStreamReader(
aSocket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
aSocket.getOutputStream()));
while (true) {
String packet = in.readLine();
debug("Packet Recieved: '" + packet + "'");
try {
if (packet.contains("get")) {
if (packet.equals("getx")) {
out.write(getLocation().x);
} else if (packet.equals("gety")) {
out.write(getLocation().y);
}
} else if (packet.contains("do")) {
if (packet.contains("web")) {
String firstSpace = packet.substring(packet
.indexOf(" ") + 1);
String secondSpace = firstSpace
.substring(packet.indexOf(" ") + 1);
int x = Integer.parseInt(firstSpace.trim());
int y = Integer.parseInt(secondSpace.trim());
theWorldMap.walkTo(new AryanTile(x, y));
} else if (packet.contains("walk")) {
String firstSpace = packet.substring(packet
.indexOf(" ") + 1);
String secondSpace = firstSpace
.substring(packet.indexOf(" ") + 1);
int x = Integer.parseInt(firstSpace.trim());
int y = Integer.parseInt(secondSpace.trim());
new AryanPath(new AryanTile(x, y), this)
.walkToEnd();
} else if (packet.contains("bank")) {
theWorldMap.walkToBank();
}
} else if (packet.contains("mouse")) {
String firstSpace = packet.substring(packet
.indexOf(" ") + 1);
String secondSpace = firstSpace
.substring(packet.indexOf(" ") + 1);
int x = Integer.parseInt(firstSpace.trim());
int y = Integer.parseInt(secondSpace.trim());
if(packet.contains("move")){
mouseMove(x, y);
}else if(packet.contains("clickr")){
mouseClickRight(x, y);
}else if(packet.contains("clickl")){
mouseClickLeft(x, y);
}
out.write("done");
}
} catch (IOException ioe) {
throw ioe;
} catch (InterruptedException e) {
throw e;
} catch (Throwable t) {
log("Exception in processing packet");
exception(t);
}

}
} catch (IOException ioe) {
log("Lost Connection");
return;
}
}
}

}


Santa_Clause

2007-07-03 02:07:58

I don't really understand what you need. Although, probably 90% of the members are better scripters than me.

danrox2004

2007-07-03 04:14:42

I think this is what you mean…

function Connect: Boolean;
begin
f := OpenConnection('127.0.0.1', 3000, 3000);
Result := (f > 0);
end;

function SendData(S: String; var R: String): Boolean;
begin
if(not SendConnectionData(f, s)) then
begin
Result := False;
Exit;
end
if(not ReadConnectionData(f, r)) then
begin
Result := False;
Exit;
end
Result := True;
end;

procedure EndConnection;
begin
if(f > 0) then
FreeConnection(f);
end;

In senddata s is the string you want to send, r is the result.

Markus

2007-07-03 07:29:46

Let's write this, seems pretty easy to do. Hold on a few mins.
edit: Here they are, took me ten minutes to write:

var UbiCon : integer;

function CreateConnection : boolean;
begin
UbiCon := OpenConnection('127.0.0.1', 3000, 10);
result := UbiCon <> 0;
end;

function GetX : integer;
var str : string;
begin
if Ubicon = 0 then exit;
SendConnectionData(ubicon, 'getx');
ReadConnectionData(ubicon, str);
try
result := StrToInt(TrimNumbers(str));
except
writeln('Error obtaining X');
end;
end;

function GetY : integer;
var str : string;
begin
if Ubicon = 0 then exit;
SendConnectionData(ubicon, 'gety');
ReadConnectionData(ubicon, str);
try
result := StrToInt(TrimNumbers(str));
except
writeln('Error obtaining Y');
end;
end;

procedure DoWeb(x, y : integer);
var str : string;
begin
if Ubicon = 0 then exit;
SendConnectionData(ubicon, 'doweb '+ inttostr(x) + ' ' + inttostr(y));
ReadConnectionData(ubicon, str);
end;

procedure DoWalk(x, y : integer);
var str : string;
begin
if Ubicon = 0 then exit;
SendConnectionData(ubicon, 'dowalk '+ inttostr(x) + ' ' + inttostr(y));
ReadConnectionData(ubicon, str);
end;

procedure DoBank;
var str : string;
begin
if Ubicon = 0 then exit;
SendConnectionData(ubicon, 'dobank');
ReadConnectionData(ubicon, str);
end;

procedure MouseMove(x, y : integer);
var str : string;
begin
if ubicon = 0 then exit;
SendConnectionData(ubicon, 'mousemove '+ inttostr(x) + ' ' + inttostr(y));
ReadConnectionData(ubicon, str);
end;

procedure MouseClick(x, y : integer; left : boolean);
var str : string;
begin
if ubicon = 0 then exit;
if left then str := 'l' else str := 'r';
SendConnectionData(ubicon, 'mouseclick' + str + ' ' + inttostr(x) + ' ' + inttostr(y));
ReadConnectionData(ubicon, str);
end;

procedure CloseConnection;
begin
FreeConnection(ubicon);
end;
Haven't tested them, but will do that now if Java stops being not nice to me.
Hmm, can't seem to compile it. Oh well, I'm pretty sure it works according to your code.

ruler

2007-07-03 15:42:42

Here is the java side, un tested, you can modify it also.

UBI download:
http://rscheata.net/ubi.zip

You need neXus 15.5 for this:
http://rscheata.net/lite155.zip

You put the ubi.jar into the jars folder of nexus.

You turn on nexus, then add UBI bot. After the bot loads try writing a SCAR script that interacts with it, it is port 3000.

ALL UNTESTED

Wanted

2007-07-03 16:41:27

Place inside folder Includes/SRL/SRL/Misc/

UBI.scar, Revision 13:


//-----------------------------------------------------------------//
//-- Scar Standard Resource Library --//
//-- UBI Routines for UBI vX.xx --//
//-----------------------------------------------------------------//
// * procedure UBI_Connect; // * by IceFire908.
// * procedure UBI_DisConnect; // * by IceFire908.
// * function UBI_Connected: Boolean; // * by IceFire908.
// * function SetUpUBI: Boolean; // * by IceFire908.
// * function UBI_GetPlayerX: LongInt; // * by IceFire908.
// * function UBI_GetPlayerY: LongInt; // * by IceFire908.
// * function UBI_GetLocation: TPoint; // * by IceFire908.
// * procedure UBI_WalkToTile(X, Y: LongInt); // * by IceFire908.
// * procedure UBI_MMouse(X, Y: LongInt); // * by IceFire908.
// * procedure UBI_Mouse(X, Y: LongInt; Left: Boolean); // * by IceFire908.

{ var UBI_Conn_Index: LongInt;
Description: The index of the connection with UBI. }
var
UBI_Conn_Index: LongInt;

{ const UBIDebug;
Description: Debugmessages will be diplayed if UBIDebug = True. }
const
UBIDebug = False;

{*******************************************************************************
procedure UBI_Connect;
By: IceFire908.
Description: Connects to UBI.
*******************************************************************************}

procedure UBI_Connect;
begin
if (UBI_Conn_Index <> 0) then FreeConnection(UBI_Conn_Index);
UBI_Conn_Index := OpenConnection('127.0.0.1', 3000, 3000);
end;

{*******************************************************************************
procedure UBI_DisConnect;
By: IceFire908.
Description: Closes the UBI connection.
*******************************************************************************}

procedure UBI_DisConnect;
begin
FreeConnection(UBI_Conn_Index);
UBI_Conn_Index := 0;
end;

{*******************************************************************************
function UBI_Connected: Boolean;
By: IceFire908.
Description: Returns true if UBI is connected.
*******************************************************************************}

function UBI_Connected: Boolean;
begin
Result := IsConnectionOpen(UBI_Conn_Index);
end;

{*******************************************************************************
function SetUpUBI: Boolean;
By: IceFire908.
Description: Sets up UBI, returns true if connection did not fail.
*******************************************************************************}

function SetUpUBI: Boolean;
begin
if (UBI_Conn_Index <> 0) then FreeConnection(UBI_Conn_Index);
UBI_Connect;
Result := UBI_Connected;
end;

{*******************************************************************************
function UBI_GetPlayerX: LongInt;
By: IceFire908.
Description: Returns the current x-axis value for your tile.
*******************************************************************************}

function UBI_GetPlayerX: LongInt;
var
Str: string;
begin
if (not (UBI_Connected)) then Exit;
SendConnectionData(UBI_Conn_Index, 'getx');
ReadConnectionData(UBI_Conn_Index, Str);
Result := StrToIntDef(Str, 0);
end;

{*******************************************************************************
function UBI_GetPlayerY: LongInt;
By: IceFire908.
Description: Returns the current y-axis value for your tile.
*******************************************************************************}

function UBI_GetPlayerY: LongInt;
var
Str: string;
begin
if (not (UBI_Connected)) then Exit;
SendConnectionData(UBI_Conn_Index, 'gety');
ReadConnectionData(UBI_Conn_Index, Str);
Result := StrToIntDef(Str, 0);
end;

{*******************************************************************************
function UBI_GetLocation: TPoint;
By: IceFire908.
Description: Returns current tile as a TPoint.
*******************************************************************************}

function UBI_GetLocation: TPoint;
begin
if (not (UBI_Connected)) then Exit;
Result.X := UBI_GetPlayerX;
Result.Y := UBI_GetPlayerY;
end;

{*******************************************************************************
procedure UBI_WalkToTile(X, Y: LongInt);
By: IceFire908.
Description: Walks to a tile using UBI.
*******************************************************************************}

procedure UBI_WalkToTile(X, Y: LongInt);
begin
if (not (UBI_Connected)) then Exit;
SendConnectionData(UBI_Conn_Index, 'dowalk ' + IntToStr(X) + ' ' + IntToStr(Y));
end;

{*******************************************************************************
procedure UBI_MMouse(X, Y: LongInt);
By: IceFire908.
Description: Moves the UBI mouse.
*******************************************************************************}

procedure UBI_MMouse(X, Y: LongInt);
begin
if (not (UBI_Connected)) then Exit;
SendConnectionData(UBI_Conn_Index, 'mousemove ' + IntToStr(X) + ' ' + IntToStr(Y));
end;

{*******************************************************************************
procedure UBI_Mouse(X, Y: LongInt; Left: Boolean);
By: IceFire908.
Description: Clicks the UBI mouse.
*******************************************************************************}

procedure UBI_Mouse(X, Y: LongInt; Left: Boolean);
var
Str: string;
begin
if (not (UBI_Connected)) then Exit;
case (Left) of
True: Str := 'l ';
False: Str := 'r ';
end;
SendConnectionData(UBI_Conn_Index, 'mouseclick' + Str + IntToStr(X) + ' ' + IntToStr(Y));
end;

ruler

2007-07-03 20:12:51

ok genodemon should be home soon then he can show me how to test those scar functions.

Wanted

2007-07-03 21:14:46

Ok, feel free to edit anything in UBI.scar…

I'll be updating here I guess with revision numbers so you can keep track.

Just remember to post new revisions with new revision numbers.

Edit: Also, please no messy coding, I really don't like messy coding always try and have good standards/ capitalization/ parameters/ and keep your 'style' constant :)

LordGregGreg

2007-07-03 21:23:55

Please correct me if I am wrong. But this ubi script would make it possible to run a scar script inside ibot? And like, still be able to use all of the player switching teqniques that scar uses?
If so, I am really glad that you guys are reviving this!
I'll take a look at the code, im really good with java, but not so much with scar… I'll let ya know if i think I can help.

Markus

2007-07-04 03:46:39

From: lordgreggreg
Please correct me if I am wrong. But this ubi script would make it possible to run a scar script inside ibot?


No, if you actually look at the code, you can see it is something that can move/click the mouse within ibot with an command send by scar. Something like silent mouse, but it has a little bit more features, just like ibot has. It can also get your X and Y position, I don't know what dobank does, but I assume that'll go to the nearest bank.

edit± It's probably my own problem, but I get "error in processing packet" errors :(

LordGregGreg

2007-07-04 11:34:38

Yeah, i got cha, Kinda like another kyab thing…
So esentially it would be possible to convert any swcript to work with i bot, it would just take about as much time as it would for cherokee.

Wanted

2009-12-10 23:32:19

Massive grave dig I know, but would anyone be interested in bringing this back? Perhaps contact ruler if anyone has his MSN or whatever… maybe use iBot forums?

P1nky

2009-12-10 23:37:24

From: IceFire908
Massive grave dig I know, but would anyone be interested in bringing this back? Perhaps contact ruler if anyone has his MSN or whatever… maybe use iBot forums?


woah haha, i was like wtf Santa Clause is back :o than checked date and was like uhh who would post on this :) but looks like a legit reason to post.

Daniel

2009-12-11 02:34:29

From: ~~Joker~~
woah haha, i was like wtf Santa Clause is back :o than checked date and was like uhh who would post on this :) but looks like a legit reason to post.


Erm, he actually is back. Read his latest posts and the date they were made. Who knows why so recently? It's near Christmas, some might say, as he is getting his good and his bad list ready. But we will never know for sure (unless Sam tells us himself) :p

YoHoJo

2009-12-11 02:36:13

[QUOTE=Dan's The Man;664486]Erm, he actually is back. Read his latest posts and the date they were made. Who knows why so recently? It's near Christmas, some might say, as he is getting his good and his bad list ready. But we will never know for sure (unless Sam tells us himself) :p

>:0 Get you own jokes, I used that line already!
Also, yeah Ruler/Icefire I'm totally for this idea I have no idea why it died. It could even potentially be a new reflection-type-of-thing for us.

marpis

2009-12-11 06:11:12

So, this will remotely control iBot, allowing mouse to stay free?

Bobarkinator

2009-12-11 08:06:20

From: marpis
So, this will remotely control iBot, allowing mouse to stay free?


Yes

Method

2009-12-11 09:41:32

Except you'll only be able to bot on weekends unless you buy the pro version.

Griff

2009-12-11 11:26:02

[QUOTE=Dan's The Man;664486]Erm, he actually is back. Read his latest posts and the date they were made. Who knows why so recently? It's near Christmas, some might say, as he is getting his good and his bad list ready. But we will never know for sure (unless Sam tells us himself) :p

/me deletes inappropriate posts.

YoHoJo

2009-12-11 13:59:26

From: Method
Except you'll only be able to bot on weekends unless you buy the pro version.


Oh really? iBot is free only on weekends unless you get pro version? :/

Kyle Undefined

2009-12-11 15:42:08

Hmm, I'd like to help where I can. Not the greatest, but can provide feedback?

~Camo

Method

2009-12-11 18:05:56

From: YoHoJo
Oh really? iBot is free only on weekends unless you get pro version? :/


I'm pretty sure that's the case, yeah.

Daniel

2009-12-11 18:31:34

From: Method
Except you'll only be able to bot on weekends unless you buy the pro version.


I thought that there were no differences from pro and lite, except you couldn't minimize and run more than one version of the client?

Unless it has changed.

Wanted

2009-12-11 18:35:58

[QUOTE=Dan's The Man;664683]I thought that there were no differences from pro and lite, except you couldn't minimize and run more than one version of the client?

Unless it has changed.

That's the way I remember it, but we really need to contact ruler… can someone do this?

YoHoJo

2009-12-11 18:45:02

I sent him a PM though SRL. I tried PMing him on iBot but his inbox is full :p.
IceFire, just make a post at iBot and get his attention.

Wanted

2009-12-11 19:47:15

Done

ruler

2009-12-11 22:29:50

We did this all 3.5 years ago and presented it all to SRL.
http://impsoft.net/public/video/UBI%202%20bots%20v%208%20beta%20vid.avi

We didn't know alot back then. SRL devs rejected it. They were the number #1 cheating community back then.

From my point of view SCAR should focus on C# for the future and run on .NET. Pascal is too limited. It lack much syntactical sugar and the interpretor adds cost. Some of you prefer pascal because of familiarity and you would be better to do Java or C#.

I don't have a good way for SCAR to interface with nexus/ibot.
SMART is much better suited for this it did everything in 1 process.

To be a replacement to SMART i need Cruels Client. Only with cruels client did we have a solution that was minimizable.

But even then the solution Gutted SCAR so that all scar did was interpret pascal function calls were all replaced with cruels.

Focus on fixing SMART or try to get SMART source.

I recommend asking Benland for the SMART source and adding the stuff you need. Or at least ask Benland to separate it out into the SMART native code the and Java code.

Santa_Clause

2009-12-12 06:47:00

From: ~~Joker~~
woah haha, i was like wtf Santa Clause is back :o than checked date and was like uhh who would post on this :) but looks like a legit reason to post.


[QUOTE=Dan's The Man;664486]Erm, he actually is back. Read his latest posts and the date they were made. Who knows why so recently? It's near Christmas, some might say, as he is getting his good and his bad list ready. But we will never know for sure (unless Sam tells us himself) :p

Haha, I'm just lurking around at the moment. Exams finished (actually I came top of the state in extension 1 mathematics in case you're interested) so I have some time on my hands :D

Daniel

2009-12-16 00:38:15

From: Santa_Clause
I came top of the state in extension 1 mathematics in case you're interested


Typical :p

Congratulations :)

P.S: You're never on MSN anymore ='(

Freddy1990

2009-12-16 14:29:46

From: ruler
From my point of view SCAR should focus on C# for the future and run on .NET. Pascal is too limited. It lack much syntactical sugar and the interpretor adds cost. Some of you prefer pascal because of familiarity and you would be better to do Java or C#.


The interpreter may add cost, but the .NET platform adds cost to the internal routines, it's slow, not available on every computer and it sucks. Delphi or c++ are a lot faster because they use plain memory mode.

MylesMadness

2009-12-16 15:46:17

From: ruler
I recommend asking Benland for the SMART source and adding the stuff you need. Or at least ask Benland to separate it out into the SMART native code the and Java code.
Did you just say get source code from ben? Ha, thats funny

ruler

2009-12-19 09:42:07

From: Freddy1990
The interpreter may add cost, but the .NET platform adds cost to the internal routines, it's slow, not available on every computer and it sucks. Delphi or c++ are a lot faster because they use plain memory mode.

Its not a question of if the interpreter adds cost. An interpreter is going to be slower than a complier.

http://en.wikipedia.org/wiki/Interpreter_(computing)
"Interpreting code is slower than running the compiled code because the interpreter must analyze each statement in the program each time it is executed and then perform the desired action, whereas the compiled code just performs the action within a fixed context determined by the compilation. "


2 years ago I benchmarks comparing the SCAR interpreter to a interpreter running on Java made as some guys Senior project.
https://epascal.dev.java.net/

It was magnitudes difference in speed in favor of the Java interpreter.

I am not sure what you mean by internal routines?

By memory mode i think your talking about how .NET does Garbage Collection. Where as you have to manually manage memory.

Hard to theorize what would be best.

CUDA would be awesome in any regard due to its scale.

From: MylesMadness
Did you just say get source code from ben? Ha, thats funny

get him to spin off the java side into a jar he loads.

Freddy1990

2009-12-19 12:44:39

From: ruler
Its not a question of if the interpreter adds cost. An interpreter is going to be slower than a complier.

http://en.wikipedia.org/wiki/Interpreter_(computing)
"Interpreting code is slower than running the compiled code because the interpreter must analyze each statement in the program each time it is executed and then perform the desired action, whereas the compiled code just performs the action within a fixed context determined by the compilation. "


2 years ago I benchmarks comparing the SCAR interpreter to a interpreter running on Java made as some guys Senior project.
https://epascal.dev.java.net/

It was magnitudes difference in speed in favor of the Java interpreter.

I am not sure what you mean by internal routines?


I never claimed that the interpreter didn't add cost, it does so quite a lot, the interpreter that SCAR uses is quite slow… However, the script engine for SCAR 4 runs nearly as fast as pre-compiled code because it compiles scripts into machine code. Code that takes SCAR 3.5 seconds is executed in 15ms by Delphi and 45ms by the SCAR 4 script engine. It's just a matter of the right tools… And by internal routines I mean the actual functions, FindColor or any of the other functions in SCAR are not interpreted, they're all compiled by Delphi, that's where speed really matters.

ruler

2009-12-20 00:11:40

From: Freddy1990
I never claimed that the interpreter didn't add cost, it does so quite a lot, the interpreter that SCAR uses is quite slow… However, the script engine for SCAR 4 runs nearly as fast as pre-compiled code because it compiles scripts into machine code. Code that takes SCAR 3.5 seconds is executed in 15ms by Delphi and 45ms by the SCAR 4 script engine. It's just a matter of the right tools… And by internal routines I mean the actual functions, FindColor or any of the other functions in SCAR are not interpreted, they're all compiled by Delphi, that's where speed really matters.

My color methods are often over 800 lines all inlined no method innovations, i strip all new invocations, any expensive memcopies, replace objects with primitives etc. After taking those principals more can be taken in regards to the upper level problem solving, buffering, decision trees, etc.

So you can have a curve of lower level cost and upper level design cost and the overall cost of both verse the results.

Good point but by internal functions, you can hand code your own in C# for speed. Pointers are allowed in unsafe functions. Stack structures are also allowed so I believe you may be able to get more speed then what i get in my Java methods. This would all be major in regards to processor caches.

Also the prospect of more Data type like unsigned etc offer more avenues for resolution in computation and space savings compared to Java.

Also the comparison of the machine code from the delphi complier to that from the .NET. I believe the C# complier will take advantage of SSE instructions and be up to date with processor specific optimizations. All while at least on paper being able to optimize code based on feedback from the runtime of code blocks/methods etc.

But really its hard to compare without actually prototyping both and benchmarking them due to the amount of unknowns.

If your aim is speed then you should be in C if your aim is ease of scripting than it is C#. Think of a curve comparing them. Also consider development time.

I would also mention that you will find more CUDA compatilbity with C# then Delphi.
http://www.nvidia.com/object/tesla_software.html

Freddy1990

2009-12-20 04:38:30

From: ruler
If your aim is speed then you should be in C if your aim is ease of scripting than it is C#. Think of a curve comparing them. Also consider development time.

I would also mention that you will find more CUDA compatibility with C# then Delphi.
http://www.nvidia.com/object/tesla_software.html


Delphi code runs as fast if not faster than C code, something that a lot of people, for some reason don't seem to want to believe… The Delphi compiler is extremely good at optimizing machine code… Also, I'm aware that CUDA is more compatible with the .NET platform, however, my plans to implement CUDA and the ATI Stream Technology are currently far into the future. And it's not because it's more compatible with .NET that it isn't with Delphi, it's just a challenge to implement it, and I just so happen to like challenges…

ruler

2009-12-22 02:42:32

From: Freddy1990
Delphi code runs as fast if not faster than C code, something that a lot of people, for some reason don't seem to want to believe… The Delphi compiler is extremely good at optimizing machine code… Also, I'm aware that CUDA is more compatible with the .NET platform, however, my plans to implement CUDA and the ATI Stream Technology are currently far into the future. And it's not because it's more compatible with .NET that it isn't with Delphi, it's just a challenge to implement it, and I just so happen to like challenges…

http://shootout.alioth.debian.org/u64/benchmark.php?test=all&lang=all

Freddy1990

2009-12-22 15:57:35

From: ruler
http://shootout.alioth.debian.org/u64/benchmark.php?test=all&lang=all


Not sure what you're trying to prove with that… That's a benchmark for Ubuntu x64 if I understand correctly and Delphi is windows-only…