SRL Archive - Reflection Development

TileToMS fixed (mostly)


i luffs yeww

2010-05-07 02:37:36

Well I'm not the best in Java, and I could do more now that I read through it a couple times, but it's basically fixed. All that needs to be done is change try..except things to Pascal, and use the proper functions for a couple things (instead of GetFieldObject it's SmartGetFieldObject, I think, but I wasn't sure so I didn't do it). Also, I dunno what the equivalent to the Object type in Java is in Pascal, so I just left it as GetFieldObject. Other than that, it's pretty much good to go. :)

Except for one big thing that I didn't know what to do, but now I think I do, but it's almost midnight and I have to wake up in a couple hours so I think I should rest.

If nobody else finishes this up soon, I can finish the rest. :p

(By the way, I really didn't do anything. All credit goes to TRiLeZ. :) I'm just posting it.)


private static class Render {
static int absoluteX1 = 0, absoluteX2 = 0;
static int absoluteY1 = 0, absoluteY2 = 0;
static int xMultiplier = 512, yMultiplier = 512;
static int zNear = 50, zFar = 3500;
}

private static class RenderData {
static int xOff = 0, xX = 32768, xY = 0, xZ = 0;
static int yOff = 0, yX = 0, yY = 32768, yZ = 0;
static int zOff = 0, zX = 0, zY = 0, zZ = 32768;
}

public boolean onScreen(final Point point) {
final int x = point.x, y = point.y;
return (x > 4) && (x < this.bot.getRsClient().getWidth() - 253)
&& (y > 4) && (y < this.bot.getRsClient().getHeight() - 169);
}

public Point tileToScreen(int x, int y, int height) {
Tile t = getLocalPos(new Tile(x, y));

Point p = worldToScreen(t.x, t.y, 0);

return p;
}
/*Wasn't sure what to do for this.*/
private void updateRenderInfo() {
try {
RenderData.xOff = getRenderDataInt(Constants.getXOff);
RenderData.xX = getRenderDataInt(Constants.getXX);
RenderData.xY = getRenderDataInt(Constants.getXY);
RenderData.xZ = getRenderDataInt(Constants.getXZ);

RenderData.yOff = getRenderDataInt(Constants.getYOff);
RenderData.yX = getRenderDataInt(Constants.getYX);
RenderData.yY = getRenderDataInt(Constants.getYY);
RenderData.yZ = getRenderDataInt(Constants.getYZ);

RenderData.zOff = getRenderDataInt(Constants.getZOff);
RenderData.zX = getRenderDataInt(Constants.getZX);
RenderData.zY = getRenderDataInt(Constants.getZY);
RenderData.zZ = getRenderDataInt(Constants.getZZ);

Render.absoluteX1 = getRenderInt(Constants.getAbsoluteX1);
Render.absoluteX2 = getRenderInt(Constants.getAbsoluteX2);
Render.absoluteY1 = getRenderInt(Constants.getAbsoluteY1);
Render.absoluteY2 = getRenderInt(Constants.getAbsoluteY2);

Render.xMultiplier = getRenderInt(Constants.getXMultiplier);
Render.yMultiplier = getRenderInt(Constants.getYMultiplier);
Render.zNear = getRenderInt(Constants.getZNear);
Render.zFar = getRenderInt(Constants.getZFar);
} catch (Exception e) {
e.printStackTrace();
}
}

private int getTileHeight(int x, int y) {
int i = x >> getScale();
int i1 = y >> getScale();
if ((i < 0) || (i1 < 0) || (i > getPlaneSize("x") - 1)
|| (i1 > getPlaneSize("z") - 1))
return 0;

int i2 = x & getPlaneSize("y") - 1;
int i3 = y & getPlaneSize("y") - 1;

int i4 = getTileHeights()[i][i1] * (getPlaneSize("y") - i2)
+ getTileHeights()[(i + 1)][i1] * i2 >> getScale();
int i5 = getTileHeights()[i][(i1 + 1)] * (getPlaneSize("y") - i2)
+ getTileHeights()[(i + 1)][(i1 + 1)] * i2 >> getScale();

return (i4 * (getPlaneSize("y") - i3) + i5 * i3 >> getScale());

}

private Point w2s(int localX, int tileHeight, int localY) {
updateRenderInfo();
int i = RenderData.zOff
+ (RenderData.zX * localX + RenderData.zY * tileHeight
+ RenderData.zZ * localY >> 15);

if ((i < Render.zNear) || (i > Render.zFar)) {
return new Point(-1, -1);
}

int j = Render.xMultiplier
* (RenderData.xOff + (RenderData.xX * localX + RenderData.xY
* tileHeight + RenderData.xZ * localY >> 15)) / i;

int k = Render.yMultiplier
* (RenderData.yOff + (RenderData.yX * localX + RenderData.yY
* tileHeight + RenderData.yZ * localY >> 15)) / i;

if ((j >= Render.absoluteX1) && (j <= Render.absoluteX2)
&& (k >= Render.absoluteY1) && (k <= Render.absoluteY2)) {
return new Point(j - Render.absoluteX1, k - Render.absoluteY1);
}

return new Point(-1, -1);
}

private Point worldToScreen(final int x, final int y, final int height) {

int tileHeight = getTileHeight(x, y) - height;

Point p = w2s(x, tileHeight, y);

if ((p != null) && onScreen(p))
return p;

return new Point(-1, -1);
}

private int getRenderInt(String hookName) {
Object toolkit = this.me.getFieldObject(Constants.getToolkit);
return this.me.getFieldInt(hookName, toolkit);
}

private int getRenderDataInt(String hookName) {
Object toolkit = this.me.getFieldObject(Constants.getToolkit);
Object viewport = this.me.getFieldObject(Constants.getViewport, toolkit);
return this.me.getFieldInt(hookName, viewport);
}

private Tile getLocalPos(Tile globalPos) {
int x = (int) ((globalPos.x - this.me.getBaseX() + 0.5) * 128);
int y = (int) ((globalPos.y - this.me.getBaseY() + 0.5) * 128);

return new Tile(x, y);
}

private int[][] getTileHeights() {
Object[] planes = (Object[]) this.me
.getFieldObject(Constants.getPlanes);
Object actPlaneInstance = planes[this.me.getPlayerPlane()];
return this.me.getFieldInt2dArray(Constants.getTileHeights,
actPlaneInstance);
}

private int getScale() {
try {
Object[] planes = (Object[]) this.me
.getFieldObject(Constants.getPlanes);
Object actPlaneInstance = planes[this.me.getPlayerPlane()];
return this.me.getFieldInt(Constants.getScale, actPlaneInstance);
} catch (Exception e) {

}
return -1;
}

private int getPlaneSize(String dimension) {
try {
String str = "";
if (dimension.equalsIgnoreCase("x"))
str = Constants.getXSize;
else if (dimension.equalsIgnoreCase("y"))
str = Constants.getYSize;
else if (dimension.equalsIgnoreCase("z"))
str = Constants.getZSize;
else
return -1;

Object[] planes = (Object[]) this.me
.getFieldObject(Constants.getPlanes);
Object actPlaneInstance = planes[this.me.getPlayerPlane()];
return this.me.getFieldInt(str, actPlaneInstance);
} catch (Exception e) {

}
return -1;
}

That's what TRiLeZ uses, hopefully he doesn't mind me posting. Only posting so that people can see what needs to be changed. ;)


procedure Render;
var
AbsoluteX1, AbsoluteX2, AbsoluteY1, AbsoluteY2,
XMultiplier, YMultiplier, ZNear, ZFar: Integer;
begin
AbsoluteX1 := 0;
AbsoluteX2 := 0;
AbsoluteY1 := 0;
AbsoluteY2 := 0;
XMultiplier := 512;
YMultiplier := 512;
ZNear := 50;
ZFar := 3500;
end;

procedure RenderData;
var
XOff, XX, XY, XZ, YOff, YX, YY, YZ, ZOff, ZX, ZY, ZZ: Integer;
begin
XOff := 0;
XX := 32768;
XY := 0;
XZ := 0;
YOff := 0;
YX := 0;
YY := 32768;
YZ := 0;
ZOff := 0;
ZX := 0;
ZY := 0;
ZZ := 32768;
end;

function OnScreen(Point: TPoint): Boolean;
var
x, y: Integer;
begin
x := Point.x;
y := Point.y;
Result := (((x > 4) and (x < 511)) and ((y > 4) and (y < 333)));
end;

function TileToScreen(x, y, Height: Integer): TPoint;
var
Tile: TPoint;
begin
Tile := GetMyPos;
PointToTile(Tile);
Result := WorldToScreen(Tile.x, Tile.y, 0);//Not sure.
end;

procedure UpdateRenderInfo;
begin
//I dunno.
end;

function GetTileHeight(x, y: Integer): Integer;
var
i, i1, i2, i3, i4, i5: Integer;
begin
i := x shr GetScale;
i1 := y shr GetScale;
if ((i < 0) or (i1 < 0) or (i > GetPlaneSize('x') - 1) or (i1 > GetPlaneSize('z') - 1))then
Result := 0;
i2 := x + GetPlaneSize('y') - 1;
i3 := y + GetPlaneSize('y') - 1;
i4 := GetTileHeights[i][i1] * (GetPlaneSize('y') - i2) + GetTileHeights[(i + 1)][i1] * i2 shr GetScale;
i5 := GetTileHeights[i][(i1 + 1)] * GetPlaneSize('y') - i2) + GetTileHeights[(i + 1)][(i1 + 1)] * i2 shr GetScale;
Result := (i4 * (GetPlaneSize('y') - i3) + i5 * i3 shr GetScale);
end;

function W2S(LocalX, LocalY, TileHeight): TPoint;
var
i, j, k: Integer;
begin
i := RenderData.ZOff + (RenderData.ZX * LocalX + RanderData.ZY * TileHeight + RenderData.ZZ * LocalY shr 15));
if((i < Render.ZNear) or (i > Rander.ZFar))then
begin
Result.x := -1;
Result.y := -1;
end;
j := Render.XMultiplier * (RanderData.XOff + (RenderData.XX * LocalX + RenderData.XY * TileHeight + RenderData.XZ * LocalY shr 15)) / i;
k := Render.YMultiplier * (RenderData.YOff + (RenderData.YX * LocalX + RenderData.YY * TileHeight + RenderData.YZ * LocalY shr 15)) / i;
if((j >= Render.AbsoluteX1) and (j <= Render.AbsoluteX2) and (k >= Render.AbsoluteY1) and (k <= Render.AbsoluteY2))then
begin
Result.x := (j - Render.AbsoluteX1);
Result.y := (k - Render.AbsoluteY1);
end;
end;

function WorldToScreen(x, y, Height: Integer): TPoint;
var
TileHeight: Integer;
p: TPoint;
begin
TileHeight := GetTileHeight(x, y) - Height;
p := W2S(x, TileHeight, y);
if((p <> null) and OnScreen(p))then
begin
Result.x := p.x;
Result.y := p.y;
end;
else begin
Result.x := -1;
Result.y := -1;
end;
end;

function GetRenderInt(HookName: String): Integer;//I think it's an integer..
{var
ToolKit: Object}
begin
//ToolKit := GetFieldObject(Constants.GetToolKit);
Result := GetFieldInt(HookName, ToolKit);
end;

function GetRenderDataInt(HookName: String): Integer;//I think.
{var
ToolKit, ViewPort: Object;}
begin
//ToolKit := GetFieldObject(Constants.GetToolKit);
//ViewPort := GetFieldObjects(Constants.GetViewPort);
Result := GetFieldInt(HookName, ViewPort);
end;

function GetLocalPos(GlobalPos: TTile): TTile;
var
p: TPoint;
begin
p.x := ((GlobalPos.x - GetBaseX + 0.5) * 128);
p.y := ((GlobalPos.x - GetBaseX + 0.5) * 128);
Result := PointToTile(p);
end;

function GetTileHeights: array of array of Integer;
{var
Planes, ActPlaneInstance: Object;}
begin
//Planes := GetFieldObject(Constants.GetPlanes);
//ActPlaneInstance := Planes[GetPlayerPlane];
Result := GetFieldInt2dArray(Constants.GetTileHeights, ActPlaneInstance);
end;

function GetScale: Integer;
{var
Planes, ActPlaneInstance: Object;}
begin
//try
//Planes := GetFieldObject(Constants.GetPlanes);
//ActPlaneInstance := Planes[GetPlayerPlane];
//end except (I dunno)
Result := -1;
end;

function GetPlaneSize(Dimension: String): Integer;
var
str: String;
//Planes, ActPlaneInstance: Object;
begin
//try blah blah
str := '';
case LowerCase(Dimension) of
'x': str := Constants.GetXSize;
'y': str := Constants.GetYSize;
'z': str := Constants.GetZSize;
else
Result := -1;
end;
//Planes := GetFieldObject(Constants.GetPlanes);
//ActPlaneInstance := Planes[GetPlayerPlane];
Result := GetFieldInt(str, ActPlaneInstance);
//except blah blah
Result := -1;
end;

Hopefully someone can finish this up. :) I know I really didn't do much, but I think it'll help someone.

Just wanted to reiterate, I can most definitely convert it all to Pascal to make it work just fine with SCAR, but I didn't have time to look up the type Object or any of that. This was just a basic skim over edit to try to convert as much as I could in as little time as I could. I can read up more about Java stuff (mainly Object and try..exception) and maybe ask TRiLeZ for more of the source so I can get a better understanding, and I can finish this within the next week, probably. But if anyone has the chance to do it before me, go for it. :)

And, again, all credit to TRiLeZ. I really didn't do anything. (I'd love to help, because I think it's quite interesting, and I will try to keep reflection up-to-date as much as I can. :))

So I was just looking up some stuff, and I think Variant would be a viable substitute for the Object class in Java. If anyone could do that, or if anyone knows what it should/could be, that'd be cool. :)

I'll work on this tomorrow if it's not finished.

(Lots of smiles.)

Drakan

2010-05-07 06:08:39

I'm pretty sure that TRiLeZ and P_Dizzle are working on converting this right now.

JPHamlett

2010-05-07 07:29:03

ya me and trile_z are working on converting this as we speek i should have most of it done tonight

mastaraymond

2010-05-07 07:42:28

Pretty sure the methods for updating the RenderData/Render have been posted in another thread already, so you could just copy+paste that.

Dynamite

2010-05-07 07:52:24

If it isn't done by the time I get home, I will give it a go.

Method

2010-05-07 09:29:39

Your Render and RenderData procedures do nothing. I would also suggest letting them finish working on it because, looking at your code, you don't really understand what needs to be done.

i luffs yeww

2010-05-07 17:15:02

:p The whole point of posting this wasn't to say that "I fixed reflection," or anything of that sort. I was just posting what I did in a short amount of time so that if anyone else who knows Java better wanted to, they could help. I don't see any reason why only J_Pizzle should try to convert TileToMS to PS.

And I didn't intend to post a working version last night. I worked on it for hardly any time at all, and I just did a quick skim to make it semi understandable in PS. Hopefully, this will help someone. ^^

Method

2010-05-07 22:51:13

The problem is that you don't know what you're doing and probably will just confuse people instead of helping them. For example, you decided to make two class declarations from Java into procedures in that effectively do nothing, then subsequently try to refer to those classes in the W2S function.

I just think it would be best to let whoever is working on it at this point continue to do so.

3Garrett3

2010-05-07 22:57:46

From: Method
The problem is that you don't know what you're doing and probably will just confuse people instead of helping them. For example, you decided to make two class declarations from Java into procedures in that effectively do nothing, then subsequently try to refer to those classes in the W2S function.

I just think it would be best to let whoever is working on it at this point continue to do so.


These are the people who are working on it. Nobody knows 100% what to do. There are lots of people trying to pitch in, but the whole thing seems to be very slow and tiresome work, because there is such a barrier between java code and pascal for the people who are converting it.

i luffs yeww

2010-05-08 01:22:50

^ Yes. And Method, I'm sorry if this bothers you. If you really think it's not helpful (or even it hurts reflection development), I'll gladly take it down. :) Just know that I don't really think that anyone who WOULD use what I posted (either the Java or Pascal) would finish it or anything. J_Pizzle is still working on his (I hope), and this may just be something fun that someone can try to do. ^^ I know I had fun, even though nothing was solved. :p

JPHamlett

2010-05-08 01:26:49

ok im stuck here can someone tell me why this thing crashes scar or fun this in a scar wiondow and see what happens

i luffs yeww

2010-05-08 01:29:05

You mean what I posted? It won't even compile, so I assume not.

Do you have SRL/SRL/Reflection? And you deleted Embedded_SMART.dll and used the one from the reflection place inside plugins folder?

mormonman

2010-05-08 03:31:15

From: J_Pizzle
ok im stuck here can someone tell me why this thing crashes scar or fun this in a scar wiondow and see what happens


When scar crashes that means that you aren't calling the right fields, I am pretty sure that I have told you this(heard it from method) before.

JPHamlett

2010-05-08 09:46:52

From: mormonman
When scar crashes that means that you aren't calling the right fields, I am pretty sure that I have told you this(heard it from method) before.


but I'm pretty sure the fields are correct


http://pastebin.ws/95ljg1



theres the way i did it and the java funciton im converting

Baked0420

2010-05-08 10:22:40

From: J_Pizzle
but I'm pretty sure the fields are correct


http://pastebin.ws/95ljg1



theres the way i did it and the java funciton im converting


the only thing I can notice that's different is there is a loop in the Pascal version that's not in the Java version. But the planes object does get assigned an array of objects, so you may have used a loop to just set each value one at a time I suppose. The only thing I could think of other than that is what mormonman said and try checking the hooks making sure you're using the right ones.

JPHamlett

2010-05-08 10:28:08

From: Baked0420
the only thing I can notice that's different is there is a loop in the Pascal version that's not in the Java version. But the planes object does get assigned an array of objects, so you may have used a loop to just set each value one at a time I suppose. The only thing I could think of other than that is what mormonman said and try checking the hooks making sure you're using the right ones.


i figured it out i was reading th efunction wrong int the



actinstance or w/e line

it says planes [getplayerplanes()]

that a method not a hook lol

Baked0420

2010-05-08 10:38:03

lol oh, well good job, sorry I wasn't able to help, I tried :p

JPHamlett

2010-05-08 10:43:27

From: Baked0420
lol oh, well good job, sorry I wasn't able to help, I tried :p


its ok bro lol

mastaraymond

2010-05-09 13:58:28

Care to post the source for getPlayerPlane as well?

i luffs yeww

2010-05-09 16:17:27

^ It would've helped, wouldn't it have? This was all I had to work with, sorry.

JPHamlett

2010-05-09 17:21:44

From: mastaraymond
Care to post the source for getPlayerPlane as well?



public byte getPlayerPlane() {
Object p = getMyPlayer();
return (hooks.getHookValueByte("getMyPlane()", p));
}

mastaraymond

2010-05-09 18:23:06

Shit.. Smart doesn't have SmartGetFieldByte..

The rest of the code should look something like this:
Note that I'm missing some hooks here (myplane, Scale,getXSize,getYSize, getZSize)

program new;
{.LoadDLL libsmart}
{$define smart}
{$i srl/srl.scar}
const
Toolkit = 'bm.V';
Plane = 'cw.T';
GroundByteArray = 'tk.k';
TileData = 'ta.M';
TileHeights = 'r';
BaseX = 'ut.a';
BaseY = 'dq.N';

getAbsoluteX1 = 'L';
getAbsoluteX2 = 'B';
getAbsoluteY1 = 'y';
getAbsoluteY2 = 'nb';
getZNear = 'W';
getZFar = 'lb';
getXMultiplier = 'ab';
getYMultiplier = 'eb';
getViewport = 'z';

getXOff = 'u';
getXX = 't';
getXY = 'k';
getXZ = 'p';
getYOff = 'o';
getYX = 'r';
getYY = 's';
getYZ = 'm';
getZOff = 'l';
getZX = 'q';
getZY = 'j';
getZZ = 'n';

MyPlayer = 'cn.n';
myplane = 'wat';
Scale = 'doh';
getXSize = 'joh';
getYSize = 'noh';
getZSize = 'wat';
Currenty = 'q';
Currentx = 'm';

//returns the current plane.. Note this is the OBJECT
function GetPlayerPlane : integer;
var
Player : integer;
CurPlane : integer;
begin
Player := SmartGetFieldObject(0,myplayer);
CurPlane := SmartGetFieldInt(player,myplane);
SmartFreeObject(Player);
Result := SmartGetFieldArrayObject(0,TileData,CurPlane);
end;

function GetScale : integer;
var
PlaneInstance : integer;
begin
PlaneInstance := GetPlayerPlane;
result := SmartGetFieldInt(PlaneInstance,Scale);
SmartFreeObject(PlaneInstance);
end;

function getPlaneSize(dimension : string) : integer;
var
hook : string;
PlaneInstance : integer;
begin
result := -1;
hook := '';
case dimension of
'x' : hook := getXSize;
'y' : hook := getYSize;
'z' : hook := getZSize;
else
exit;
end;
PlaneInstance := GetPlayerPlane;
result := SmartGetFieldInt(PlaneInstance,hook);
SmartFreeObject(PlaneInstance);
end;

{function tilePlaneGetHeight(obj,xx,zz : integer) : integer;
var
x,z : integer;
i,j,k,l : integer;
begin
x := xx shr 7;
z := zz shr 7;
if ((x < 0) or (x>104) or (z < 0) or (z>104)) then
result := 0
else
begin
i := x and 128 - 1;
j := z and 128 - 1;
k := SmartGetFieldArray2DInt(obj,tileheights,x,z) * (128 - i) + (SmartGetFieldArray2DInt(obj,tileheights,x+1,z) * i) shr 7;
l := SmartGetFieldArray2DInt(obj,tileheights,x,z+1) * (128 - i) + (SmartGetFieldArray2DInt(obj,tileheights,x+1,z+1) * i) shr 7;
result := k * (128 - j) + (l * j) shr 7;
end;
end;
}

function GetTileHeight(xx,yy : integer) : integer;
var
p : integer;
x,y : integer;
i2,i3,i4,i5 : integer;
obj : integer;
ysize,xsize,zsize : integer;
CurrScale : integer;
PlaneInstance : integer;

begin;
CurrScale := GetScale;
ysize := getPlaneSize('y');
xsize := getPlaneSize('x');
zsize := getPlaneSize('z');
x := XX shr CurrScale;
y := yy shr CurrScale;
if ((x < 0) or (x>xsize-1) or (y < 0) or (y>zsize-1)) then
begin
result := 0;
exit;
end;
i2 := xx and ysize -1;
i3 := yy and ysize -1;
PlaneInstance := GetPlayerPlane;
i4 := SmartGetFieldArray2DInt(PlaneInstance,tileheights,x,y) * (ysize - i2) +
SmartGetFieldArray2DInt(PlaneInstance,tileheights,(x + 1),y) * i2 shr CurrScale;
i5 := SmartGetFieldArray2DInt(PlaneInstance,tileheights,x,(y + 1)) * (ysize - i2) +
SmartGetFieldArray2DInt(PlaneInstance,tileheights,(x + 1),(y + 1)) * i2 shr CurrScale;
smartfreeobject(PlaneInstance);
result := (i4 * (ysize - i3) + i5 * i3 shr currScale);
end;

type
TRenderData = record
xOff,xX,xY,xZ : integer;
yOff,yX,yY,yZ : integer;
zOff,zX,zY,zZ : integer;
end;
TRender = record
absoluteX1,absoluteX2 : integer;
absoluteY1,absoluteY2 : integer;
xMultiplier,yMultiplier : integer;
zNear,zFar : integer;
end;

procedure UpdateRenderInfo(var Render : TRender; var RenderData : TRenderData);
var
tk, vp: Integer;
begin
tk := SmartGetFieldObject(0, Toolkit);
vp := SmartGetFieldObject(tk, getViewport);
with RenderData do
begin
xOff := SmartGetFieldInt(vp,getXOff);
xX :=SmartGetFieldInt(vp,getXX);
xY := SmartGetFieldInt(vp,getxY);
xZ := SmartGetFieldInt(vp,getxz);
yOff := SmartGetFieldInt(vp,getyoff);
yX := SmartGetFieldInt(vp,getyx);
yY :=SmartGetFieldInt(vp,getyy);
yZ := SmartGetFieldInt(vp,getyz);
zOff := SmartGetFieldInt(vp,getzoff);
zX := SmartGetFieldInt(vp,getzx);
zY := SmartGetFieldInt(vp,getzy);
zZ := SmartGetFieldInt(vp,getzz);
end;
with Render do
begin
absoluteX1 := SmartGetFieldInt(tk, getabsoluteX1);
absoluteX2 := SmartGetFieldInt(tk, getabsoluteX2);
absoluteY1 := SmartGetFieldInt(tk, getabsoluteY1);
absoluteY2 := SmartGetFieldInt(tk, getabsolutey2);
xMultiplier := SmartGetFieldInt(tk, getxmultiplier);
yMultiplier := SmartGetFieldInt(tk, getymultiplier);
zNear := SmartGetFieldInt(tk, getznear);
zFar := SmartGetFieldInt(tk, getzfar);
end;
SmartFreeObject(tk);
SmartFreeObject(vp);
end;

function w2s(localx,tileheight,localy : integer) : TPoint;
var
RenderData : TRenderData;
Render : TRender;
i,j,k : integer;
begin;
result := point(-1,-1);
with RenderData do
begin
xOff := 0; xX := 32768; xY := 0; xZ := 0;
yOff := 0; yX := 0; yY := 32768; yZ := 0;
zOff := 0; zX := 0; zY := 0; zZ := 32768;
end;
with Render do
begin
absoluteX1 := 0; absoluteX2 := 0;
absoluteY1 := 0; absoluteY2 := 0;
xMultiplier := 512; yMultiplier := 512;
zNear := 50; zFar := 3500;
end;
UpdateRenderInfo(render,renderdata);
i := RenderData.zOff + (RenderData.zX * localX + RenderData.zY * tileHeight
+ RenderData.zZ * localY shr 15);
if ((i < Render.zNear) or (i > Render.zFar)) then
exit;
j := Render.xMultiplier * (RenderData.xOff + (RenderData.xX * localX + RenderData.xY
* tileHeight + RenderData.xZ * localY shr 15)) / i;
k := Render.yMultiplier * (RenderData.yOff + (RenderData.yX * localX + RenderData.yY
* tileHeight + RenderData.yZ * localY shr 15)) / i;
if ((j >= Render.absoluteX1) and(j <= Render.absoluteX2) and
(k >= Render.absoluteY1) and (k <= Render.absoluteY2)) then
result := Point(j - Render.absoluteX1, k - Render.absoluteY1);
end;

function OnScreen(Point: TPoint): Boolean;
var
x, y: Integer;
begin
x := Point.x;
y := Point.y;
Result := (((x > 4) and (x < 511)) and ((y > 4) and (y < 333)));
end;

function worldToScreen(x,y,height : integer) : TPoint;
var
tileheight : integer;
P : TPoint;
begin
tileheight := GetTileHeight(x,y) - height;
Writeln('TileHeight: ' + IntToStr(tileheight));
result := w2s(x,tileheight,y);
if not OnScreen(result) then
result := point(-1,-1);
end;

function TileToMSEx(x,y : integer; dx,dy : double; height : integer) : TPoint;
begin
result := worldToScreen(Round(x-SmartGetFieldInt(0,BaseX) + DX) * 128,
Round(y-SmartGetFieldInt(0,BaseY) + dy) * 128, height);
end;
//Requires a global x,y
function TileToMS(x,y,height : integer) : TPoint;
begin
result := TileToMSEx(x,y,0.5,0.5,height);
end;

function GetMyPos:TPoint;
var
me: Integer;
begin
me := SmartGetFieldObject(0, MyPlayer);
Result.x := SmartGetFieldInt(0, BaseX) + SmartGetFieldInt(me, CurrentX) shr 7;
Result.y := SmartGetFieldInt(0, BaseY) + SmartGetFieldInt(me, CurrentY) shr 7;
SmartFreeObject(me);
end;

var
p : TPoint;
begin
Smart_Members := false;
Smart_Server := 118;
Smart_Signed := true;
Smart_SuperDetail := false;
setupsrl;
p := GetMyPos;
writeln(p);
p := TileToMS(p.x + 1,p.y - 1,0);
Writeln(p);
MMouse(p.x,p.y,5,5);

end.

See if this helps

i luffs yeww

2010-05-09 19:09:08

^ :D Yay for developers working on ref!

Drakan

2010-05-09 19:21:55

mastaraymond:

I asked ben, and he so kindly added SmartGetFieldByte for us. He updated the repos, but here is the link to the dll. Tested, and it recognizes the new function, but I havnt been able to do a full test on functionality, but he says hes 99% sure it works.

http://blanddns.no-ip.org:81/files/Public_SMART.dll

mastaraymond

2010-05-09 20:00:36

So.. With the latest SMART I'm getting somewhere.. The following code returns the correct PlaneSize/getScale.. However GetTileHeight still returns invalid results.. Kinda stuck here..


program new;
{.LoadDLL libsmart}
{$define smart}
{$i srl/srl.scar}
const
Toolkit = 'bm.V';
Plane = 'cw.T';
GroundByteArray = 'tk.k';
TileData = 'ta.M';
TileHeights = 'r';
BaseX = 'ut.a';
BaseY = 'dq.N';

getAbsoluteX1 = 'L';
getAbsoluteX2 = 'B';
getAbsoluteY1 = 'y';
getAbsoluteY2 = 'nb';
getZNear = 'W';
getZFar = 'lb';
getXMultiplier = 'ab';
getYMultiplier = 'eb';
getViewport = 'z';

getXOff = 'u';
getXX = 't';
getXY = 'k';
getXZ = 'p';
getYOff = 'o';
getYX = 'r';
getYY = 's';
getYZ = 'm';
getZOff = 'l';
getZX = 'q';
getZY = 'j';
getZZ = 'n';

MyPlayer = 'cn.n';
myplane = 'h';
Scale = 'a';
getXSize = 'c';
getYSize = 'b';
getZSize = 'f';
Currenty = 'q';
Currentx = 'm';

//returns the current plane.. Note this is the OBJECT
function GetPlayerPlane : integer;
var
Player : integer;
CurPlane : integer;
begin
Player := SmartGetFieldObject(0,myplayer);
CurPlane := SmartGetFieldByte(player,myplane);
SmartFreeObject(Player);
Result := SmartGetFieldArrayObject(0,TileData,CurPlane);
end;

function GetScale : integer;
var
PlaneInstance : integer;
begin
PlaneInstance := GetPlayerPlane;
result := SmartGetFieldInt(PlaneInstance,Scale);
SmartFreeObject(PlaneInstance);
end;

function getPlaneSize(dimension : string) : integer;
var
hook : string;
PlaneInstance : integer;
begin
result := -1;
hook := '';
case dimension of
'x' : hook := getXSize;
'y' : hook := getYSize;
'z' : hook := getZSize;
else
exit;
end;
PlaneInstance := GetPlayerPlane;
result := SmartGetFieldInt(PlaneInstance,hook);
SmartFreeObject(PlaneInstance);
end;

{function tilePlaneGetHeight(obj,xx,zz : integer) : integer;
var
x,z : integer;
i,j,k,l : integer;
begin
x := xx shr 7;
z := zz shr 7;
if ((x < 0) or (x>104) or (z < 0) or (z>104)) then
result := 0
else
begin
i := x and 128 - 1;
j := z and 128 - 1;
k := SmartGetFieldArray2DInt(obj,tileheights,x,z) * (128 - i) + (SmartGetFieldArray2DInt(obj,tileheights,x+1,z) * i) shr 7;
l := SmartGetFieldArray2DInt(obj,tileheights,x,z+1) * (128 - i) + (SmartGetFieldArray2DInt(obj,tileheights,x+1,z+1) * i) shr 7;
result := k * (128 - j) + (l * j) shr 7;
end;
end;
}

function GetTileHeight(xx,yy : integer) : integer;
var
p : integer;
x,y : integer;
i2,i3,i4,i5 : integer;
obj : integer;
ysize,xsize,zsize : integer;
CurrScale : integer;
PlaneInstance : integer;

begin;
CurrScale := GetScale;
ysize := getPlaneSize('y');
xsize := getPlaneSize('x');
zsize := getPlaneSize('z');
Writeln([ysize,xsize,zsize,CurrScale]);
x := XX shr CurrScale;
y := yy shr CurrScale;
if ((x < 0) or (x>xsize-1) or (y < 0) or (y>zsize-1)) then
begin
result := 0;
exit;
end;
i2 := xx and ysize -1;
i3 := yy and ysize -1;
PlaneInstance := GetPlayerPlane;
i4 := SmartGetFieldArray2DInt(PlaneInstance,tileheights,x,y) * (ysize - i2) +
SmartGetFieldArray2DInt(PlaneInstance,tileheights,(x + 1),y) * i2 shr CurrScale;
i5 := SmartGetFieldArray2DInt(PlaneInstance,tileheights,x,(y + 1)) * (ysize - i2) +
SmartGetFieldArray2DInt(PlaneInstance,tileheights,(x + 1),(y + 1)) * i2 shr CurrScale;
smartfreeobject(PlaneInstance);
result := (i4 * (ysize - i3) + (i5 * i3) shr currScale);
end;

type
TRenderData = record
xOff,xX,xY,xZ : integer;
yOff,yX,yY,yZ : integer;
zOff,zX,zY,zZ : integer;
end;
TRender = record
absoluteX1,absoluteX2 : integer;
absoluteY1,absoluteY2 : integer;
xMultiplier,yMultiplier : integer;
zNear,zFar : integer;
end;

procedure UpdateRenderInfo(var Render : TRender; var RenderData : TRenderData);
var
tk, vp: Integer;
begin
tk := SmartGetFieldObject(0, Toolkit);
vp := SmartGetFieldObject(tk, getViewport);
with RenderData do
begin
xOff := SmartGetFieldInt(vp,getXOff);
xX :=SmartGetFieldInt(vp,getXX);
xY := SmartGetFieldInt(vp,getxY);
xZ := SmartGetFieldInt(vp,getxz);
yOff := SmartGetFieldInt(vp,getyoff);
yX := SmartGetFieldInt(vp,getyx);
yY :=SmartGetFieldInt(vp,getyy);
yZ := SmartGetFieldInt(vp,getyz);
zOff := SmartGetFieldInt(vp,getzoff);
zX := SmartGetFieldInt(vp,getzx);
zY := SmartGetFieldInt(vp,getzy);
zZ := SmartGetFieldInt(vp,getzz);
end;
with Render do
begin
absoluteX1 := SmartGetFieldInt(tk, getabsoluteX1);
absoluteX2 := SmartGetFieldInt(tk, getabsoluteX2);
absoluteY1 := SmartGetFieldInt(tk, getabsoluteY1);
absoluteY2 := SmartGetFieldInt(tk, getabsolutey2);
xMultiplier := SmartGetFieldInt(tk, getxmultiplier);
yMultiplier := SmartGetFieldInt(tk, getymultiplier);
zNear := SmartGetFieldInt(tk, getznear);
zFar := SmartGetFieldInt(tk, getzfar);
end;
SmartFreeObject(tk);
SmartFreeObject(vp);
end;

function w2s(localx,tileheight,localy : integer) : TPoint;
var
RenderData : TRenderData;
Render : TRender;
i,j,k : integer;
begin;
result := point(-1,-1);
with RenderData do
begin
xOff := 0; xX := 32768; xY := 0; xZ := 0;
yOff := 0; yX := 0; yY := 32768; yZ := 0;
zOff := 0; zX := 0; zY := 0; zZ := 32768;
end;
with Render do
begin
absoluteX1 := 0; absoluteX2 := 0;
absoluteY1 := 0; absoluteY2 := 0;
xMultiplier := 512; yMultiplier := 512;
zNear := 50; zFar := 3500;
end;
UpdateRenderInfo(render,renderdata);
i := RenderData.zOff + (RenderData.zX * localX + RenderData.zY * tileHeight
+ RenderData.zZ * localY shr 15);
if ((i < Render.zNear) or (i > Render.zFar)) then
exit;
j := Render.xMultiplier * (RenderData.xOff + (RenderData.xX * localX + RenderData.xY
* tileHeight + RenderData.xZ * localY shr 15)) / i;
k := Render.yMultiplier * (RenderData.yOff + (RenderData.yX * localX + RenderData.yY
* tileHeight + RenderData.yZ * localY shr 15)) / i;
if ((j >= Render.absoluteX1) and(j <= Render.absoluteX2) and
(k >= Render.absoluteY1) and (k <= Render.absoluteY2)) then
result := Point(j - Render.absoluteX1, k - Render.absoluteY1);
end;

function OnScreen(Point: TPoint): Boolean;
var
x, y: Integer;
begin
x := Point.x;
y := Point.y;
Result := (((x > 4) and (x < 511)) and ((y > 4) and (y < 333)));
end;

function worldToScreen(x,y,height : integer) : TPoint;
var
tileheight : integer;
P : TPoint;
begin
tileheight := GetTileHeight(x,y) - height;
Writeln('TileHeight: ' + IntToStr(tileheight));
result := w2s(x,tileheight,y);
if not OnScreen(result) then
result := point(-1,-1);
end;

function TileToMSEx(x,y : integer; dx,dy : double; height : integer) : TPoint;
begin
result := worldToScreen(Round(x-SmartGetFieldInt(0,BaseX) + DX) * 128,
Round(y-SmartGetFieldInt(0,BaseY) + dy) * 128, height);
end;
//Requires a global x,y
function TileToMS(x,y,height : integer) : TPoint;
begin
result := TileToMSEx(x,y,0.5,0.5,height);
end;

function GetMyPos:TPoint;
var
me: Integer;
begin
me := SmartGetFieldObject(0, MyPlayer);
Result.x := SmartGetFieldInt(0, BaseX) + SmartGetFieldInt(me, CurrentX) shr 7;
Result.y := SmartGetFieldInt(0, BaseY) + SmartGetFieldInt(me, CurrentY) shr 7;
SmartFreeObject(me);
end;


var
p : TPoint;
begin
Smart_Members := false;
Smart_Server := 118;
Smart_Signed := true;
Smart_SuperDetail := false;
setupsrl;
p := GetMyPos;
writeln(p);
p := TileToMS(p.x,p.y,0);
Writeln(p);
MMouse(p.x,p.y,5,5);

end.

TRiLeZ

2010-05-09 20:58:27

Fixed some stuff up on mastaraymond's conversion.


program new;
{.LoadDLL libsmart}
{$define smart}
{$i srl/srl.scar}
const
Toolkit = 'bm.V';
Plane = 'cw.T';
Planes = 'ta.M';
GroundByteArray = 'tk.k';
TileData = 'ta.M';
TileHeights = 'r';
BaseX = 'ut.a';
BaseY = 'dq.N';

getAbsoluteX1 = 'L';
getAbsoluteX2 = 'B';
getAbsoluteY1 = 'y';
getAbsoluteY2 = 'nb';
getZNear = 'W';
getZFar = 'lb';
getXMultiplier = 'ab';
getYMultiplier = 'eb';
getViewport = 'z';

getXOff = 'u';
getXX = 't';
getXY = 'k';
getXZ = 'p';
getYOff = 'o';
getYX = 'r';
getYY = 's';
getYZ = 'm';
getZOff = 'l';
getZX = 'q';
getZY = 'j';
getZZ = 'n';

MyPlayer = 'cn.n';
myplane = 'h';
Scale = 'a';
getXSize = 'c';
getYSize = 'b';
getZSize = 'f';
Currenty = 'q';
Currentx = 'm';

//returns the current plane.. Note this is the OBJECT
function GetPlayerPlane : integer;
var
Player : integer;
CurPlane : integer;
begin
Player := SmartGetFieldObject(0,myplayer);
CurPlane := SmartGetFieldByte(player,myplane);
SmartFreeObject(Player);
Result := SmartGetFieldArrayObject(0,TileData,CurPlane);
end;

function GetScale : integer;
var
PlaneInstance : integer;
begin
PlaneInstance := GetPlayerPlane;
result := SmartGetFieldInt(PlaneInstance,Scale);
SmartFreeObject(PlaneInstance);
end;

function getPlaneSize(dimension : string) : integer;
var
hook : string;
PlaneInstance : integer;
begin
result := -1;
hook := '';
case dimension of
'x' : hook := getXSize;
'y' : hook := getYSize;
'z' : hook := getZSize;
else
exit;
end;
PlaneInstance := GetPlayerPlane;
result := SmartGetFieldInt(PlaneInstance,hook);
SmartFreeObject(PlaneInstance);
end;

function GetTileHeight(xx,yy : integer) : integer;
var
p : integer;
x,y : integer;
i2,i3,i4,i5 : integer;
obj : integer;
ysize,xsize,zsize : integer;
CurrScale : integer;
PlaneInstance : integer;
begin;
CurrScale := GetScale;
ysize := getPlaneSize('y');
xsize := getPlaneSize('x');
zsize := getPlaneSize('z');
Writeln([ysize,xsize,zsize,CurrScale]);
x := XX shr CurrScale;
y := yy shr CurrScale;
if ((x < 0) or (x>xsize-1) or (y < 0) or (y>zsize-1)) then
begin
result := 0;
exit;
end;
i2 := xx and ysize -1;
i3 := yy and ysize -1;

PlaneInstance := SmartGetFieldArrayObject(0, planes, GetPlayerPlane);

i4 := SmartGetFieldArray2DInt(PlaneInstance,tileheights,x,y) * (ysize - i2) +
SmartGetFieldArray2DInt(PlaneInstance,tileheights,(x + 1),y) * i2 shr CurrScale;
i5 := SmartGetFieldArray2DInt(PlaneInstance,tileheights,x,(y + 1)) * (ysize - i2) +
SmartGetFieldArray2DInt(PlaneInstance,tileheights,(x + 1),(y + 1)) * i2 shr CurrScale;
smartfreeobject(PlaneInstance);
result := (i4 * (ysize - i3) + (i5 * i3) shr currScale);
end;

type
TRenderData = record
xOff,xX,xY,xZ : integer;
yOff,yX,yY,yZ : integer;
zOff,zX,zY,zZ : integer;
end;
TRender = record
absoluteX1,absoluteX2 : integer;
absoluteY1,absoluteY2 : integer;
xMultiplier,yMultiplier : integer;
zNear,zFar : integer;
end;

procedure UpdateRenderInfo(var Render : TRender; var RenderData : TRenderData);
var
tk, vp: Integer;
begin
tk := SmartGetFieldObject(0, Toolkit);
vp := SmartGetFieldObject(tk, getViewport);
with RenderData do
begin
xOff := SmartGetFieldInt(vp,getXOff);
xX :=SmartGetFieldInt(vp,getXX);
xY := SmartGetFieldInt(vp,getxY);
xZ := SmartGetFieldInt(vp,getxz);
yOff := SmartGetFieldInt(vp,getyoff);
yX := SmartGetFieldInt(vp,getyx);
yY :=SmartGetFieldInt(vp,getyy);
yZ := SmartGetFieldInt(vp,getyz);
zOff := SmartGetFieldInt(vp,getzoff);
zX := SmartGetFieldInt(vp,getzx);
zY := SmartGetFieldInt(vp,getzy);
zZ := SmartGetFieldInt(vp,getzz);
end;
with Render do
begin
absoluteX1 := SmartGetFieldInt(tk, getabsoluteX1);
absoluteX2 := SmartGetFieldInt(tk, getabsoluteX2);
absoluteY1 := SmartGetFieldInt(tk, getabsoluteY1);
absoluteY2 := SmartGetFieldInt(tk, getabsolutey2);
xMultiplier := SmartGetFieldInt(tk, getxmultiplier);
yMultiplier := SmartGetFieldInt(tk, getymultiplier);
zNear := SmartGetFieldInt(tk, getznear);
zFar := SmartGetFieldInt(tk, getzfar);
end;
SmartFreeObject(tk);
SmartFreeObject(vp);
end;

function w2s(localx,tileheight,localy : integer) : TPoint;
var
RenderData : TRenderData;
Render : TRender;
i,j,k : integer;
begin;
result := point(-1,-1);
with RenderData do
begin
xOff := 0; xX := 32768; xY := 0; xZ := 0;
yOff := 0; yX := 0; yY := 32768; yZ := 0;
zOff := 0; zX := 0; zY := 0; zZ := 32768;
end;
with Render do
begin
absoluteX1 := 0; absoluteX2 := 0;
absoluteY1 := 0; absoluteY2 := 0;
xMultiplier := 512; yMultiplier := 512;
zNear := 50; zFar := 3500;
end;
UpdateRenderInfo(render,renderdata);
i := RenderData.zOff + (RenderData.zX * localX + RenderData.zY * tileHeight
+ RenderData.zZ * localY shr 15);
if ((i < Render.zNear) or (i > Render.zFar)) then
exit;
Writeln('I: ' + inttostr(i));
j := Render.xMultiplier * (RenderData.xOff + RenderData.xX * localX + RenderData.xY
* tileHeight + RenderData.xZ * localY shr 15) / i;
k := Render.yMultiplier * (RenderData.yOff + RenderData.yX * localX + RenderData.yY
* tileHeight + RenderData.yZ * localY shr 15) / i;
if ((j >= Render.absoluteX1) and(j <= Render.absoluteX2) and
(k >= Render.absoluteY1) and (k <= Render.absoluteY2)) then
result := Point(j - Render.absoluteX1, k - Render.absoluteY1);
Writeln('J: ' + inttostr(j));
Writeln('K: ' + inttostr(k));
end;

function OnScreen(Point: TPoint): Boolean;
var
x, y: Integer;
begin
x := Point.x;
y := Point.y;
Result := (((x > 4) and (x < 511)) and ((y > 4) and (y < 333)));
end;

function worldToScreen(x,y,height : integer) : TPoint;
var
tileheight : integer;
P : TPoint;
begin
tileheight := getTileHeight(x, y) - height;
Writeln('TileHeight: ' + IntToStr(tileheight));
result := w2s(x,tileheight,y);
if not OnScreen(result) then
result := point(-1,-1);
end;

function TileToMSEx(x,y : integer; dx,dy : double; height : integer) : TPoint;
begin
result := worldToScreen(Round(x-SmartGetFieldInt(0,BaseX) + DX) * 128,
Round(y-SmartGetFieldInt(0,BaseY) + dy) * 128, height);
end;
//Requires a global x,y
function TileToMS(x,y,height : integer) : TPoint;
begin
result := TileToMSEx(x,y,0.5,0.5,height);
end;

function GetMyPos:TPoint;
var
me: Integer;
begin
me := SmartGetFieldObject(0, MyPlayer);
Result.x := SmartGetFieldInt(0, BaseX) + SmartGetFieldInt(me, CurrentX) shr 7;
Result.y := SmartGetFieldInt(0, BaseY) + SmartGetFieldInt(me, CurrentY) shr 7;
SmartFreeObject(me);
end;


var
p : TPoint;
begin
Smart_Members := false;
Smart_Server := 118;
Smart_Signed := true;
Smart_SuperDetail := false;
setupsrl;
p := GetMyPos;
writeln(p);
p := TileToMS(p.x + 2,p.y,0);
Writeln(p);
MMouse(p.x,p.y,5,5);
end.

It doesn't work, but it should. I don't know what's wrong with it. Maybe it's just PS.

mastaraymond

2010-05-10 05:15:11

From: TRiLeZ
Fixed some stuff up on mastaraymond's conversion.


program new;
{.LoadDLL libsmart}
{$define smart}
{$i srl/srl.scar}
const
Toolkit = 'bm.V';
Plane = 'cw.T';
Planes = 'ta.M';
GroundByteArray = 'tk.k';
TileData = 'ta.M';
TileHeights = 'r';
BaseX = 'ut.a';
BaseY = 'dq.N';

getAbsoluteX1 = 'L';
getAbsoluteX2 = 'B';
getAbsoluteY1 = 'y';
getAbsoluteY2 = 'nb';
getZNear = 'W';
getZFar = 'lb';
getXMultiplier = 'ab';
getYMultiplier = 'eb';
getViewport = 'z';

getXOff = 'u';
getXX = 't';
getXY = 'k';
getXZ = 'p';
getYOff = 'o';
getYX = 'r';
getYY = 's';
getYZ = 'm';
getZOff = 'l';
getZX = 'q';
getZY = 'j';
getZZ = 'n';

MyPlayer = 'cn.n';
myplane = 'h';
Scale = 'a';
getXSize = 'c';
getYSize = 'b';
getZSize = 'f';
Currenty = 'q';
Currentx = 'm';

//returns the current plane.. Note this is the OBJECT
function GetPlayerPlane : integer;
var
Player : integer;
CurPlane : integer;
begin
Player := SmartGetFieldObject(0,myplayer);
CurPlane := SmartGetFieldByte(player,myplane);
SmartFreeObject(Player);
Result := SmartGetFieldArrayObject(0,TileData,CurPlane);
end;

function GetScale : integer;
var
PlaneInstance : integer;
begin
PlaneInstance := GetPlayerPlane;
result := SmartGetFieldInt(PlaneInstance,Scale);
SmartFreeObject(PlaneInstance);
end;

function getPlaneSize(dimension : string) : integer;
var
hook : string;
PlaneInstance : integer;
begin
result := -1;
hook := '';
case dimension of
'x' : hook := getXSize;
'y' : hook := getYSize;
'z' : hook := getZSize;
else
exit;
end;
PlaneInstance := GetPlayerPlane;
result := SmartGetFieldInt(PlaneInstance,hook);
SmartFreeObject(PlaneInstance);
end;

function GetTileHeight(xx,yy : integer) : integer;
var
p : integer;
x,y : integer;
i2,i3,i4,i5 : integer;
obj : integer;
ysize,xsize,zsize : integer;
CurrScale : integer;
PlaneInstance : integer;
begin;
CurrScale := GetScale;
ysize := getPlaneSize('y');
xsize := getPlaneSize('x');
zsize := getPlaneSize('z');
Writeln([ysize,xsize,zsize,CurrScale]);
x := XX shr CurrScale;
y := yy shr CurrScale;
if ((x < 0) or (x>xsize-1) or (y < 0) or (y>zsize-1)) then
begin
result := 0;
exit;
end;
i2 := xx and ysize -1;
i3 := yy and ysize -1;

PlaneInstance := SmartGetFieldArrayObject(0, planes, GetPlayerPlane);

i4 := SmartGetFieldArray2DInt(PlaneInstance,tileheights,x,y) * (ysize - i2) +
SmartGetFieldArray2DInt(PlaneInstance,tileheights,(x + 1),y) * i2 shr CurrScale;
i5 := SmartGetFieldArray2DInt(PlaneInstance,tileheights,x,(y + 1)) * (ysize - i2) +
SmartGetFieldArray2DInt(PlaneInstance,tileheights,(x + 1),(y + 1)) * i2 shr CurrScale;
smartfreeobject(PlaneInstance);
result := (i4 * (ysize - i3) + (i5 * i3) shr currScale);
end;

type
TRenderData = record
xOff,xX,xY,xZ : integer;
yOff,yX,yY,yZ : integer;
zOff,zX,zY,zZ : integer;
end;
TRender = record
absoluteX1,absoluteX2 : integer;
absoluteY1,absoluteY2 : integer;
xMultiplier,yMultiplier : integer;
zNear,zFar : integer;
end;

procedure UpdateRenderInfo(var Render : TRender; var RenderData : TRenderData);
var
tk, vp: Integer;
begin
tk := SmartGetFieldObject(0, Toolkit);
vp := SmartGetFieldObject(tk, getViewport);
with RenderData do
begin
xOff := SmartGetFieldInt(vp,getXOff);
xX :=SmartGetFieldInt(vp,getXX);
xY := SmartGetFieldInt(vp,getxY);
xZ := SmartGetFieldInt(vp,getxz);
yOff := SmartGetFieldInt(vp,getyoff);
yX := SmartGetFieldInt(vp,getyx);
yY :=SmartGetFieldInt(vp,getyy);
yZ := SmartGetFieldInt(vp,getyz);
zOff := SmartGetFieldInt(vp,getzoff);
zX := SmartGetFieldInt(vp,getzx);
zY := SmartGetFieldInt(vp,getzy);
zZ := SmartGetFieldInt(vp,getzz);
end;
with Render do
begin
absoluteX1 := SmartGetFieldInt(tk, getabsoluteX1);
absoluteX2 := SmartGetFieldInt(tk, getabsoluteX2);
absoluteY1 := SmartGetFieldInt(tk, getabsoluteY1);
absoluteY2 := SmartGetFieldInt(tk, getabsolutey2);
xMultiplier := SmartGetFieldInt(tk, getxmultiplier);
yMultiplier := SmartGetFieldInt(tk, getymultiplier);
zNear := SmartGetFieldInt(tk, getznear);
zFar := SmartGetFieldInt(tk, getzfar);
end;
SmartFreeObject(tk);
SmartFreeObject(vp);
end;

function w2s(localx,tileheight,localy : integer) : TPoint;
var
RenderData : TRenderData;
Render : TRender;
i,j,k : integer;
begin;
result := point(-1,-1);
with RenderData do
begin
xOff := 0; xX := 32768; xY := 0; xZ := 0;
yOff := 0; yX := 0; yY := 32768; yZ := 0;
zOff := 0; zX := 0; zY := 0; zZ := 32768;
end;
with Render do
begin
absoluteX1 := 0; absoluteX2 := 0;
absoluteY1 := 0; absoluteY2 := 0;
xMultiplier := 512; yMultiplier := 512;
zNear := 50; zFar := 3500;
end;
UpdateRenderInfo(render,renderdata);
i := RenderData.zOff + (RenderData.zX * localX + RenderData.zY * tileHeight
+ RenderData.zZ * localY shr 15);
if ((i < Render.zNear) or (i > Render.zFar)) then
exit;
Writeln('I: ' + inttostr(i));
j := Render.xMultiplier * (RenderData.xOff + RenderData.xX * localX + RenderData.xY
* tileHeight + RenderData.xZ * localY shr 15) / i;
k := Render.yMultiplier * (RenderData.yOff + RenderData.yX * localX + RenderData.yY
* tileHeight + RenderData.yZ * localY shr 15) / i;
if ((j >= Render.absoluteX1) and(j <= Render.absoluteX2) and
(k >= Render.absoluteY1) and (k <= Render.absoluteY2)) then
result := Point(j - Render.absoluteX1, k - Render.absoluteY1);
Writeln('J: ' + inttostr(j));
Writeln('K: ' + inttostr(k));
end;

function OnScreen(Point: TPoint): Boolean;
var
x, y: Integer;
begin
x := Point.x;
y := Point.y;
Result := (((x > 4) and (x < 511)) and ((y > 4) and (y < 333)));
end;

function worldToScreen(x,y,height : integer) : TPoint;
var
tileheight : integer;
P : TPoint;
begin
tileheight := getTileHeight(x, y) - height;
Writeln('TileHeight: ' + IntToStr(tileheight));
result := w2s(x,tileheight,y);
if not OnScreen(result) then
result := point(-1,-1);
end;

function TileToMSEx(x,y : integer; dx,dy : double; height : integer) : TPoint;
begin
result := worldToScreen(Round(x-SmartGetFieldInt(0,BaseX) + DX) * 128,
Round(y-SmartGetFieldInt(0,BaseY) + dy) * 128, height);
end;
//Requires a global x,y
function TileToMS(x,y,height : integer) : TPoint;
begin
result := TileToMSEx(x,y,0.5,0.5,height);
end;

function GetMyPos:TPoint;
var
me: Integer;
begin
me := SmartGetFieldObject(0, MyPlayer);
Result.x := SmartGetFieldInt(0, BaseX) + SmartGetFieldInt(me, CurrentX) shr 7;
Result.y := SmartGetFieldInt(0, BaseY) + SmartGetFieldInt(me, CurrentY) shr 7;
SmartFreeObject(me);
end;


var
p : TPoint;
begin
Smart_Members := false;
Smart_Server := 118;
Smart_Signed := true;
Smart_SuperDetail := false;
setupsrl;
p := GetMyPos;
writeln(p);
p := TileToMS(p.x + 2,p.y,0);
Writeln(p);
MMouse(p.x,p.y,5,5);
end.

It doesn't work, but it should. I don't know what's wrong with it. Maybe it's just PS.


PlaneInstance := SmartGetFieldArrayObject(0, planes, GetPlayerPlane);
Doubt that is correct, as getScale etc work when using

PlaneInstance :=GetPlayerPlane;

Drakan

2010-05-10 07:04:31

TileHeight is messed up as it is here. Me and ben spent 5 hours last night fixing it. I have the fix, and I'll be posting it tonight amond (hopefully) and full functional TileToMS and possibly a revamped reflection folder.

TRiLeZ

2010-05-10 18:09:08

From: mastaraymond

PlaneInstance := SmartGetFieldArrayObject(0, planes, GetPlayerPlane);
Doubt that is correct, as getScale etc work when using

PlaneInstance :=GetPlayerPlane;


It's for getTileHeight(), in replace of my getTileHeights() function. Trust me, it's correct.

Drakan

2010-05-10 18:23:27

TriLez, can we talk on msn? We have the x-coord working perfect on our WorldToScreen.

Drakan

2010-05-10 18:26:52

http://pastebin.com/spam.php?i=h7n77rzR

mastaraymond

2010-05-11 14:07:33

Unforeseen bottleneck is the fact that ">>" in java is not the same as "shr" in Pascal..

Besides that, Drags please commit the fixed TileToMS (+the hooks) to the reflection SVN? I want to keep this topic hot, otherwise it will just fade to the background like every other time.

Camaro'

2010-05-11 15:28:42

From: mastaraymond
Unforeseen bottleneck is the fact that ">>" in java is not the same as "shr" in Pascal..

Besides that, Drags please commit the fixed TileToMS (+the hooks) to the reflection SVN? I want to keep this topic hot, otherwise it will just fade to the background like every other time.


Yeah, I agree, I can't wait for TileToMs + Ref to be back up :D

shr != >> ?

JPHamlett

2010-05-11 15:55:41

From: mastaraymond
Unforeseen bottleneck is the fact that ">>" in java is not the same as "shr" in Pascal..

Besides that, Drags please commit the fixed TileToMS (+the hooks) to the reflection SVN? I want to keep this topic hot, otherwise it will just fade to the background like every other time.


can i ahve permission to commit to the svn im working on alot of reflectyion with trilez and drags lol

Drakan

2010-05-11 17:57:36

We have a new SVN for reflection, so just be patient :) A LOT of things need to be fixed inside the reflection include until it's usable again. Only a few more days i imagine. And Ray, when its all ready theres gonna be a new thread and it will be h0t :)

Method

2010-05-11 22:26:59

From: mastaraymond
Unforeseen bottleneck is the fact that ">>" in java is not the same as "shr" in Pascal..


As far as I know it is?? Are you talking about the unsigned right shift operator instead (>>>)?

Drakan

2010-05-11 22:32:06

Method, >> is the arithmetic shift whereas shr is a logical shift. http://en.wikipedia.org/wiki/Bitwise_operation#Arithmetic_shift
Something raymond pointed out to me. Don't quote me too much on that one, i might have it backwards.

Method

2010-05-12 00:19:51

Both have the same functionality except where the sign bit is concerned.

Oh well, I guess SCAR/Simba are just weird.

mastaraymond

2010-05-12 04:28:17

From: Method
Both have the same functionality except where the sign bit is concerned.

Oh well, I guess SCAR/Simba are just weird.

It's not SCAR/Simba it's Pascal.. Added sar to Simba which emulates an arithmetic shift.

Drakan

2010-05-12 06:20:24

From: Method
Both have the same functionality except where the sign bit is concerned.

Oh well, I guess SCAR/Simba are just weird.


well the problem was shr cant handle negative numbers.

mastaraymond

2010-05-12 07:53:35

From: drags111
well the problem was shr cant handle negative numbers.

It can handle them perfectly, it does exactly what it should do.. It's just a different operation from the arithmetic shift (>>). Because that shift does some magic with the sign-bit..