Indeed, it's a very difficult structure to convert, yet I tried to do it. I'm very unsure about the speed and correctness of this code, but I thought you should take a look.
[pascal]
type
//: Only for tests!
U16 = Integer;
U8 = Integer;
tObjMode = Boolean;
tObjColMode = Boolean;
tObjColShape = Double;
tObjShape = Boolean;
tObjSize = Single;
tObjPriority = Byte;
uint16 = LongInt;

{ .: StructA :. }
StructA = record
case Integer of
0: (A: u8);
1: (isHidden: Boolean);
2: (B: u8);
end;

{ .: StructB :. }
StructB = record
case Integer of
0: (isRotoscale: Boolean);
1: (rsDouble: Boolean);
2: (objMode: tObjMode);
3: (isMosaic: Boolean);
4: (colMode: tObjColMode);
5: (objShape: tObjColShape);
end;

{ .: StructC :. }
StructC = record
posX: u16;
A: u8;
end;

{ .: StructD :. }
StructD = record
A: u8;
hFlip: Boolean;
vFlip: Boolean;
B: u8;
end;

{ .: StructE :. }
StructE = record
A: u8;
rsMatrixIdx: u8;
objSize: tObjSize;
end;

{ .: StructF :. }
StructF = record
tileIdx: u16;
objPriority: tObjPriority;
objPal: u8;
end;

{ .: StructG :. }
StructG = record
attribute: array[0..2] of uint16;
filler: uint16;
end;

{ .: UnionA :. }
UnionA = record
posY: u16;
case Integer of
0: (A: StructA);
1: (B: StructB);
end;

{ .: UnionB :. }
UnionB = record
A: u8;
case Integer of
0: (B: StructD);
1: (C: StructE);
end;

{ .: UnionC :. }
UnionC = record
A: StructC;
B: UnionB;
end;

{ .: SpriteEntry :. }
pSpriteEntry = ^SpriteEntry;
SpriteEntry = record
attribute3: u16;
U1: UnionA;
U2: UnionB;
A: StructF;
B: StructG;
end;
[/pascal]

Hope that helps.