hedgewars/uLandPainted.pas
changeset 4458 7351e6f1ee28
parent 4457 ffb766e85150
child 4490 f6840f7e2f60
--- a/hedgewars/uLandPainted.pas	Sat Dec 04 22:33:14 2010 +0300
+++ b/hedgewars/uLandPainted.pas	Sat Dec 04 23:29:59 2010 +0300
@@ -25,18 +25,83 @@
 procedure LoadFromFile(fileName: shortstring);
 
 implementation
+uses uLandGraphics, uConsts, uUtils, SDLh;
 
 type PointRec = packed record
-    x, y: ShortInt;
+    X, Y: SmallInt;
     flags: byte;
     end;
 
+procedure DrawLineOnLand(X1, Y1, X2, Y2: LongInt);
+var  eX, eY, dX, dY: LongInt;
+    i, sX, sY, x, y, d: LongInt;
+    b: boolean;
+    len: LongWord;
+begin
+    len:= 0;
+    if (X1 = X2) and (Y1 = Y2) then
+        begin
+        exit
+        end;
+    eX:= 0;
+    eY:= 0;
+    dX:= X2 - X1;
+    dY:= Y2 - Y1;
+
+    if (dX > 0) then sX:= 1
+    else
+    if (dX < 0) then
+        begin
+        sX:= -1;
+        dX:= -dX
+        end else sX:= dX;
+
+    if (dY > 0) then sY:= 1
+    else
+    if (dY < 0) then
+        begin
+        sY:= -1;
+        dY:= -dY
+        end else sY:= dY;
+
+        if (dX > dY) then d:= dX
+                    else d:= dY;
+
+        x:= X1;
+        y:= Y1;
+
+        for i:= 0 to d do
+            begin
+            inc(eX, dX);
+            inc(eY, dY);
+            b:= false;
+            if (eX > d) then
+                begin
+                dec(eX, d);
+                inc(x, sX);
+                b:= true
+                end;
+            if (eY > d) then
+                begin
+                dec(eY, d);
+                inc(y, sY);
+                b:= true
+                end;
+            if b then
+                begin
+                inc(len);
+                if (len mod 4) = 0 then FillRoundInLand(X, Y, 34, lfBasic)
+                end
+        end
+end;
+
+
 procedure LoadFromFile(fileName: shortstring);
 var
     f: file of PointRec;
-    rec: PointRec;
+    rec, prevRec: PointRec;
 begin
-    fileMode = foReadOnly;
+    fileMode:= 0;
 
     assignFile(f, fileName);
     reset(f);
@@ -44,6 +109,15 @@
     while not eof(f) do
         begin
         read(f, rec);
+        rec.X:= SDLNet_Read16(@rec.X);
+        rec.Y:= SDLNet_Read16(@rec.Y);
+
+        // FIXME: handle single point
+        if eof(f) or (rec.flags and $80 <> 0) then
+            else
+            DrawLineOnLand(prevRec.X, prevRec.Y, rec.X, rec.Y);
+
+        prevRec:= rec;
         end;
 
     closeFile(f);