Added auto cropping to atlasing
authorWolfgang Steffens <WolfgangSteff@gmail.com>
Tue, 10 Jul 2012 11:08:35 +0200
changeset 7304 8b3575750cd2
parent 7301 bea42438a2ec
child 7374 514138949c76
Added auto cropping to atlasing Added splitting of animation sheets to frames and auto crop the frames. Fixed some atlas blitting issues. Vertex coords are still improper tho for auto cropped frames
hedgewars/hwengine.pas
hedgewars/uAtlas.pas
hedgewars/uGearsRender.pas
hedgewars/uRender.pas
hedgewars/uStore.pas
hedgewars/uTextures.pas
hedgewars/uTypes.pas
hedgewars/uVariables.pas
hedgewars/uWorld.pas
--- a/hedgewars/hwengine.pas	Mon Jun 25 16:22:03 2012 +0200
+++ b/hedgewars/hwengine.pas	Tue Jul 10 11:08:35 2012 +0200
@@ -31,7 +31,7 @@
 
 uses SDLh, uMisc, uConsole, uGame, uConsts, uLand, uAmmos, uVisualGears, uGears, uStore, uWorld, uInputHandler, uSound,
      uScript, uTeams, uStats, uIO, uLocale, uChat, uAI, uAIMisc, uRandom, uLandTexture, uCollisions,
-     SysUtils, uTypes, uVariables, uCommands, uUtils, uCaptions, uDebug, uCommandHandlers, uLandPainted
+     SysUtils, uTypes, uVariables, uCommands, uUtils, uCaptions, uDebug, uCommandHandlers, uLandPainted, uTextures
      {$IFDEF SDL13}, uTouch{$ENDIF}{$IFDEF ANDROID}, GLUnit{$ENDIF};
 
 {$IFDEF HWLIBRARY}
@@ -412,6 +412,7 @@
         //uLandGraphics does not need initialization
         //uLandObjects does not need initialization
         //uLandTemplates does not need initialization
+        uTextures.initModule;
         uLandTexture.initModule;
         //uLocale does not need initialization
         uRandom.initModule;
@@ -461,6 +462,7 @@
     uIO.freeModule;
     uLand.freeModule;
     uLandPainted.freeModule;
+    uTextures.freeModule;
 
     uCommandHandlers.freeModule;
     uCommands.freeModule;
--- a/hedgewars/uAtlas.pas	Mon Jun 25 16:22:03 2012 +0200
+++ b/hedgewars/uAtlas.pas	Tue Jul 10 11:08:35 2012 +0200
@@ -12,6 +12,7 @@
 function Surface2Tex_(surf: PSDL_Surface; enableClamp: boolean): PTexture;
 procedure FreeTexture_(sprite: PTexture);
 procedure DebugAtlas;
+procedure DumpInfo(tex: PTexture);
 
 implementation
 
@@ -28,6 +29,7 @@
         PackerInfo: Atlas;     // Rectangle packer context
         TextureInfo: TAtlas;   // OpenGL texture information
         Allocated: boolean;    // indicates if this atlas is in use
+        DumpID: Integer;
     end;
 
 var
@@ -37,6 +39,48 @@
 ////////////////////////////////////////////////////////////////////////////////
 // Debug routines
 
+procedure DumpInfo(tex: PTexture);
+var
+    frame: Integer;
+    i, atlasID: Integer;
+    aw, ah: Integer;
+begin
+    if tex = nil then
+        exit;
+
+    frame:= 0;
+    writeln(stdout, 'Texture: ' + IntToHex(Integer(tex), 8));
+
+    while tex <> nil do
+    begin
+        atlasID:= -1;
+        for i:= 0 to Pred(MaxAtlases) do
+            if tex^.atlas = @Info[i].TextureInfo then
+                atlasID:=i;
+
+        aw:= tex^.atlas^.w;
+        ah:= tex^.atlas^.h;   
+ 
+        writeln(stdout, 'Frame   : ' + IntToStr(frame));
+        writeln(stdout, 'Size    : ' + IntToStr(tex^.w) + 'x' + IntToStr(tex^.h));
+        writeln(stdout, 'Atlas   : ' + IntToStr(atlasID));
+        writeln(stdout, 'Location: ' + IntToStr(tex^.x) + 'x' + IntToStr(tex^.y));
+        writeln(stdout, 'TB      : ' + '(' + FloatToStrF(tex^.tb[0].X, ffFixed, 15, 4) + ',' + FloatToStrF(tex^.tb[0].Y, ffFixed, 15, 4) + ') '
+                                     + '(' + FloatToStrF(tex^.tb[1].X, ffFixed, 15, 4) + ',' + FloatToStrF(tex^.tb[1].Y, ffFixed, 15, 4) + ') '
+                                     + '(' + FloatToStrF(tex^.tb[2].X, ffFixed, 15, 4) + ',' + FloatToStrF(tex^.tb[2].Y, ffFixed, 15, 4) + ') '
+                                     + '(' + FloatToStrF(tex^.tb[3].X, ffFixed, 15, 4) + ',' + FloatToStrF(tex^.tb[3].Y, ffFixed, 15, 4) + ')');
+
+        writeln(stdout, 'TB.ABS  : ' + '(' + FloatToStrF(tex^.tb[0].X * aw, ffFixed, 15, 4) + ',' + FloatToStrF(tex^.tb[0].Y * ah, ffFixed, 15, 4) + ') '
+                                     + '(' + FloatToStrF(tex^.tb[1].X * aw, ffFixed, 15, 4) + ',' + FloatToStrF(tex^.tb[1].Y * ah, ffFixed, 15, 4) + ') '
+                                     + '(' + FloatToStrF(tex^.tb[2].X * aw, ffFixed, 15, 4) + ',' + FloatToStrF(tex^.tb[2].Y * ah, ffFixed, 15, 4) + ') '
+                                     + '(' + FloatToStrF(tex^.tb[3].X * aw, ffFixed, 15, 4) + ',' + FloatToStrF(tex^.tb[3].Y * ah, ffFixed, 15, 4) + ')');
+
+        inc(frame);
+        tex:= tex^.nextFrame;
+    end;
+    halt(0);
+end;
+
 procedure AssertCount(tex: PTexture; count: Integer);
 var
     i, j: Integer;
@@ -72,7 +116,6 @@
 end;
 
 var
-    DumpID: Integer;
     DumpFile: File of byte;
 
 const
@@ -106,12 +149,14 @@
    s:= IntToStr(i);
    if (i < 10) then s:='0' + s;
    if (i < 100) then s:='0' + s;
+   if (i < 1000) then s:='0' + s;
 
    IntToStrPad:=s;
 end;
 
 // GL1 ATLAS DEBUG ONLY CODE!
 procedure DebugAtlas;
+{$IFDEF DEBUG_ATLAS}
 var
     vp: array[0..3] of GLint;
     prog: GLint;
@@ -168,8 +213,12 @@
 {$ENDIF}
     end;
 end;
+{$ELSE}
+begin;
+end;
+{$ENDIF}
 
-procedure DumpAtlas(var info: AtlasInfo);
+procedure DumpAtlas(var dinfo: AtlasInfo);
 var
     png: png_structp;
     png_info: png_infop;
@@ -178,20 +227,26 @@
     rows: array of png_bytep;
     size: Integer;
     i, j: Integer;
+    idx: Integer;
     mem, p, pp: PByte;
 begin
-    filename:= '/home/wolfgangst/hedgewars/dump/atlas_' + IntToStrPad(DumpID) + '.png';
+    idx:= -1;
+    for i:= 0 to Pred(MaxAtlases) do
+        if @dinfo = @Info[i] then
+            idx:=i;
+
+    filename:= '/home/wolfgangst/hedgewars/dump/atlas_' + IntToStr(idx) + '_' + IntToStrPad(dinfo.DumpID) + '.png';
     Assign(DumpFile, filename);
-    inc(DumpID);
+    inc(dinfo.DumpID);
     Rewrite(DumpFile);
 
-    w:= info.TextureInfo.w;
-    h:= info.TextureInfo.h;
+    w:= dinfo.TextureInfo.w;
+    h:= dinfo.TextureInfo.h;
     size:= w * h * 4;
     SetLength(rows, h);
     GetMem(mem, size);
 
-    glBindTexture(GL_TEXTURE_2D, info.TextureInfo.id);
+    glBindTexture(GL_TEXTURE_2D, dinfo.TextureInfo.id);
 
     glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, mem);
 
@@ -374,7 +429,7 @@
     scanline: PByte;
     r: TSDL_Rect;
 begin
-    writeln('Uploading sprite to ', sprite.x, ',', sprite.y, ',', sprite.width, ',', sprite.height);
+    //writeln('Uploading sprite to ', sprite.x, ',', sprite.y, ',', sprite.width, ',', sprite.height);
     sp:= PTexture(sprite.UserData);
     sp^.x:= sprite.x;
     sp^.y:= sprite.y;
@@ -560,6 +615,7 @@
     sprite^.isRotated:= false;
     sprite^.surface:= surf;
     sprite^.shared:= true;
+    sprite^.nextFrame:= nil;
 
     sz:= SizeForSprite(sprite);
 
@@ -698,9 +754,11 @@
 var
     i: Integer;
 begin
-    DumpID:=0;
     for i:= 0 to pred(MaxAtlases) do
+    begin
         Info[i].Allocated:= false;
+        Info[i].DumpID:=0;
+    end;
 end;
 
 end.
--- a/hedgewars/uGearsRender.pas	Mon Jun 25 16:22:03 2012 +0200
+++ b/hedgewars/uGearsRender.pas	Tue Jul 10 11:08:35 2012 +0200
@@ -1034,7 +1034,7 @@
                     else
                         DrawSpriteRotatedF(sprExplosivesRoll, x, y + 4, 1, 0, Gear^.DirAngle);
                     end;
-        gtDynamite: DrawSprite(sprDynamite, x - 16, y - 25, Gear^.Tag and 1, Gear^.Tag shr 1);
+        gtDynamite: begin writeln(stdout, 'FIXME'); halt(-3); end; //DrawSprite(sprDynamite, x - 16, y - 25, Gear^.Tag and 1, Gear^.Tag shr 1);
      gtClusterBomb: DrawSpriteRotated(sprClusterBomb, x, y, 0, Gear^.DirAngle);
          gtCluster: DrawSprite(sprClusterParticle, x - 8, y - 8, 0);
            gtFlame: if Gear^.Tag and 1 = 0 then
--- a/hedgewars/uRender.pas	Mon Jun 25 16:22:03 2012 +0200
+++ b/hedgewars/uRender.pas	Tue Jul 10 11:08:35 2012 +0200
@@ -25,7 +25,6 @@
 uses SDLh, uTypes, GLunit, uConsts, uTextures, math;
 
 procedure DrawSprite            (Sprite: TSprite; X, Y, Frame: LongInt);
-procedure DrawSprite            (Sprite: TSprite; X, Y, FrameX, FrameY: LongInt);
 procedure DrawSpriteFromRect    (Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt);
 procedure DrawSpriteClipped     (Sprite: TSprite; X, Y, TopY, RightX, BottomY, LeftX: LongInt);
 procedure DrawSpriteRotated     (Sprite: TSprite; X, Y, Dir: LongInt; Angle: real);
@@ -134,39 +133,48 @@
 end;
 
 procedure DrawTextureFromRect(X, Y, W, H: LongInt; r: PSDL_Rect; SourceTexture: PTexture);
-var rr: TSDL_Rect;
+var 
+    rr: TSDL_Rect;
     VertexBuffer, TextureBuffer: TVertexRect;
+    _l, _r, _t, _b: GLfloat;
 begin
-if (SourceTexture^.h = 0) or (SourceTexture^.w = 0) then
-    exit;
+    if (SourceTexture^.h = 0) or (SourceTexture^.w = 0) then
+        exit;
 
-// do not draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs)
-if (abs(X) > W) and ((abs(X + W / 2) - W / 2) > cScreenWidth / cScaleFactor) then
-    exit;
-if (abs(Y) > H) and ((abs(Y + H / 2 - (0.5 * cScreenHeight)) - H / 2) > cScreenHeight / cScaleFactor) then
-    exit;
+    // do not draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs)
+    if (abs(X) > W) and ((abs(X + W / 2) - W / 2) > cScreenWidth / cScaleFactor) then
+        exit;
+    if (abs(Y) > H) and ((abs(Y + H / 2 - (0.5 * cScreenHeight)) - H / 2) > cScreenHeight / cScaleFactor) then
+        exit;
 
-rr.x:= X;
-rr.y:= Y;
-rr.w:= W;
-rr.h:= H;
+    rr.x:= X;
+    rr.y:= Y;
+    rr.w:= W;
+    rr.h:= H;
+
+    glBindTexture(GL_TEXTURE_2D, SourceTexture^.atlas^.id);
 
-glBindTexture(GL_TEXTURE_2D, SourceTexture^.atlas^.id);
+    ComputeTexcoords(SourceTexture, r, @TextureBuffer);
 
-ComputeTexcoords(SourceTexture, r, @TextureBuffer);
+    _l:= X + SourceTexture^.cropInfo.l;
+    _r:= X + rr.w - SourceTexture^.cropInfo.l - SourceTexture^.cropInfo.r;
+    _t:= Y + SourceTexture^.cropInfo.t;
+    _b:= Y + rr.h - SourceTexture^.cropInfo.t - SourceTexture^.cropInfo.b;
+
 
-VertexBuffer[0].X:= X;
-VertexBuffer[0].Y:= Y;
-VertexBuffer[1].X:= rr.w + X;
-VertexBuffer[1].Y:= Y;
-VertexBuffer[2].X:= rr.w + X;
-VertexBuffer[2].Y:= rr.h + Y;
-VertexBuffer[3].X:= X;
-VertexBuffer[3].Y:= rr.h + Y;
+    VertexBuffer[0].X:= _l;
+    VertexBuffer[0].Y:= _t;
+    VertexBuffer[1].X:= _r;
+    VertexBuffer[1].Y:= _t;
+    VertexBuffer[2].X:= _r;
+    VertexBuffer[2].Y:= _b;
+    VertexBuffer[3].X:= _l;
+    VertexBuffer[3].Y:= _b;
 
-SetVertexPointer(@VertexBuffer[0]);
-SetTexCoordPointer(@TextureBuffer[0]);
-glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
+    SetVertexPointer(@VertexBuffer[0]);
+    //SetTexCoordPointer(@TextureBuffer[0]);
+    SetTexCoordPointer(@SourceTexture^.tb[0]);
+    glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
 end;
 
 procedure DrawTexture(X, Y: LongInt; Texture: PTexture); inline;
@@ -198,7 +206,18 @@
 var hw, nx, ny: LongInt;
     r: TSDL_Rect;
     VertexBuffer, TextureBuffer: array [0..3] of TVertex2f;
+    _l, _r, _t, _b: GLfloat;
 begin
+
+    while (Frame > 0) and (Texture <> nil) do
+    begin
+        Texture:= Texture^.nextFrame;
+        dec(Frame);
+    end;
+
+    if Texture = nil then
+        exit;
+
 // do not draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs)
 if (abs(X) > W) and ((abs(X + dir * OffsetX) - W / 2) * cScaleFactor > cScreenWidth) then
     exit;
@@ -218,28 +237,31 @@
 
 hw:= w div (2 div Dir);
 
-nx:= round(Texture^.w / w); // number of horizontal frames
-ny:= round(Texture^.h / h); // number of vertical frames
-
-r.y:=(Frame mod ny) * h;
-r.x:=(Frame div ny) * w;
+r.y:=0;
+r.x:=0;
 r.w:=w;
 r.h:=h;
 ComputeTexcoords(Texture, @r, @TextureBuffer);
 
 glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id);
 
-VertexBuffer[0].X:= -hw;
-VertexBuffer[0].Y:= w / -2;
-VertexBuffer[1].X:= hw;
-VertexBuffer[1].Y:= w / -2;
-VertexBuffer[2].X:= hw;
-VertexBuffer[2].Y:= w / 2;
-VertexBuffer[3].X:= -hw;
-VertexBuffer[3].Y:= w / 2;
+_l:= -hw + Texture^.cropInfo.l;
+_t:= w/-2 + Texture^.cropInfo.t;
+_r:= hw - Texture^.cropInfo.l - Texture^.cropInfo.r;
+_b:= w/2 - Texture^.cropInfo.t - Texture^.cropInfo.b;
+
+VertexBuffer[0].X:= _l;
+VertexBuffer[0].Y:= _t;
+VertexBuffer[1].X:= _r;
+VertexBuffer[1].Y:= _t;
+VertexBuffer[2].X:= _r;
+VertexBuffer[2].Y:= _b;
+VertexBuffer[3].X:= _l;
+VertexBuffer[3].Y:= _b;
 
 SetVertexPointer(@VertexBuffer[0]);
-SetTexCoordPointer(@TextureBuffer[0]);
+//SetTexCoordPointer(@TextureBuffer[0]);
+SetTexCoordPointer(@Texture^.tb[0]);
 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
 
 ResetModelview;
@@ -271,6 +293,7 @@
 
 procedure DrawTextureRotated(Texture: PTexture; hw, hh, X, Y, Dir: LongInt; Angle: real);
 var VertexBuffer: array [0..3] of TVertex2f;
+    _l, _r, _t, _b: GLfloat;
 begin
 // do not draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs)
 if (abs(X) > 2 * hw) and ((abs(X) - hw) > cScreenWidth / cScaleFactor) then
@@ -291,14 +314,19 @@
 
 glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id);
 
-VertexBuffer[0].X:= -hw;
-VertexBuffer[0].Y:= -hh;
-VertexBuffer[1].X:= hw;
-VertexBuffer[1].Y:= -hh;
-VertexBuffer[2].X:= hw;
-VertexBuffer[2].Y:= hh;
-VertexBuffer[3].X:= -hw;
-VertexBuffer[3].Y:= hh;
+_l:= -hw + Texture^.cropInfo.l;
+_t:= -hh + Texture^.cropInfo.t;
+_r:= hw - Texture^.cropInfo.l - Texture^.cropInfo.r;
+_b:= hh - Texture^.cropInfo.t - Texture^.cropInfo.b;
+
+VertexBuffer[0].X:= _l;
+VertexBuffer[0].Y:= _t;
+VertexBuffer[1].X:= _r;
+VertexBuffer[1].Y:= _t;
+VertexBuffer[2].X:= _r;
+VertexBuffer[2].Y:= _b;
+VertexBuffer[3].X:= _l;
+VertexBuffer[3].Y:= _b;
 
 SetVertexPointer(@VertexBuffer[0]);
 SetTexCoordPointer(@Texture^.tb);
@@ -308,24 +336,29 @@
 end;
 
 procedure DrawSprite(Sprite: TSprite; X, Y, Frame: LongInt);
-var row, col, numFramesFirstCol: LongInt;
+var 
+    r: TSDL_Rect;
+    tex: PTexture;
 begin
     if SpritesData[Sprite].imageHeight = 0 then
         exit;
-    numFramesFirstCol:= SpritesData[Sprite].imageHeight div SpritesData[Sprite].Height;
-    row:= Frame mod numFramesFirstCol;
-    col:= Frame div numFramesFirstCol;
-    DrawSprite(Sprite, X, Y, col, row);
-end;
+
+    tex:= SpritesData[Sprite].Texture;
+
+    while (Frame > 0) and (tex <> nil) do
+    begin
+        tex:= tex^.nextFrame;
+        dec(Frame);
+    end;
 
-procedure DrawSprite(Sprite: TSprite; X, Y, FrameX, FrameY: LongInt);
-var r: TSDL_Rect;
-begin
-    r.x:= FrameX * SpritesData[Sprite].Width;
+    if (tex = nil) or (tex^.w = 0) or (tex^.h = 0) then
+        exit;
+
+    r.x:= 0;
     r.w:= SpritesData[Sprite].Width;
-    r.y:= FrameY * SpritesData[Sprite].Height;
+    r.y:= 0;
     r.h:= SpritesData[Sprite].Height;
-    DrawTextureFromRect(X, Y, @r, SpritesData[Sprite].Texture)
+    DrawTextureFromRect(X, Y, @r, tex)
 end;
 
 procedure DrawSpriteClipped(Sprite: TSprite; X, Y, TopY, RightX, BottomY, LeftX: LongInt);
--- a/hedgewars/uStore.pas	Mon Jun 25 16:22:03 2012 +0200
+++ b/hedgewars/uStore.pas	Tue Jul 10 11:08:35 2012 +0200
@@ -59,7 +59,7 @@
 
 implementation
 uses uMisc, uConsole, uMobile, uVariables, uUtils, uTextures, uRender, uRenderUtils, uCommands,
-     uDebug{$IFDEF USE_CONTEXT_RESTORE}, uWorld{$ENDIF}, uMatrix;
+     uDebug{$IFDEF USE_CONTEXT_RESTORE}, uWorld{$ENDIF}, uMatrix, uAtlas;
 
 //type TGPUVendor = (gvUnknown, gvNVIDIA, gvATI, gvIntel, gvApple);
 
@@ -295,7 +295,7 @@
                 texsurf:= LoadImage(UserPathz[ptGraves] + '/Statue', ifTransparent);
             if texsurf = nil then
                 texsurf:= LoadImage(Pathz[ptGraves] + '/Statue', ifCritical or ifTransparent);
-            GraveTex:= Surface2Atlas(texsurf, false);
+            GraveTex:= SurfaceSheet2Atlas(texsurf, 32, 32);
             end
 end;
 
@@ -306,6 +306,7 @@
     ai: TAmmoType;
     tmpsurf: PSDL_Surface;
     i: LongInt;
+    sw, sh: LongInt;
 begin
 AddFileLog('StoreLoad()');
 
@@ -397,7 +398,24 @@
                     end
                 else
                     begin
-                    Texture:= Surface2Atlas(tmpsurf, false);
+                    sw:=Trunc(Width*scale);
+                    sh:=Trunc(Height*scale);
+                    if (sw > imageWidth) or (sh > imageHeight) then
+                    begin
+                        if not (ii in [sprPHammer, sprBalls, sprSnow]) then
+                        begin
+                            writeln(stdout, 'Dimension error in ' + FileName + ' [' + IntToStr(Integer(ii)) + ']');
+                            halt(-1);
+                        end;
+                    end;
+ 
+                    if (imageWidth > sw) or (imageHeight > sh) then
+                    begin
+                        writeln(stdout, 'Animation sheet?: ' + FileName + ' : ' + IntToStr(Round(imageWidth/sw)) + 'x' + IntToStr(Round(imageHeight/sh)));
+                        Texture:= SurfaceSheet2Atlas(tmpsurf, Width, Height);
+                    end
+                    else Texture:= Surface2Atlas(tmpsurf, false);
+
                     // HACK: We should include some sprite attribute to define the texture wrap directions
                     if ((ii = sprWater) or (ii = sprSDWater)) and ((cReducedQuality and (rq2DWater or rqClampLess)) = 0) then
                         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
@@ -427,7 +445,7 @@
 if tmpsurf = nil then
     tmpsurf:= LoadImage(Pathz[ptGraphics] + '/' + cHHFileName, ifAlpha or ifCritical or ifTransparent);
     
-HHTexture:= Surface2Atlas(tmpsurf, false);
+HHTexture:= SurfaceSheet2Atlas(tmpsurf, 32, 32);
 
 InitHealth;
 
@@ -468,16 +486,14 @@
 var ii: TSprite;
     ai: TAmmoType;
     i, t: LongInt;
+    nf: ^PTexture;
 begin
 for ii:= Low(TSprite) to High(TSprite) do
     begin
+    nf:= @SpritesData[ii].Texture;
+    writeln(stdout, 'Releasing ' + IntToStr(Integer(ii)) + ' tex: ' + IntToHex(Integer(nf), 8));
     FreeTexture(SpritesData[ii].Texture);
     SpritesData[ii].Texture:= nil;
-    if (SpritesData[ii].Surface <> nil) and (not reload) then
-        begin
-        //SDL_FreeSurface(SpritesData[ii].Surface); released by FreeTexture
-        SpritesData[ii].Surface:= nil
-        end
     end;
 SDL_FreeSurface(MissionIcons);
 
@@ -608,7 +624,7 @@
         FreeTexture(HHGear^.Hedgehog^.HatTex);
 
         // assign new hat to hedgehog
-        HHGear^.Hedgehog^.HatTex:= Surface2Atlas(texsurf, true);
+        HHGear^.Hedgehog^.HatTex:= SurfaceSheet2Atlas(texsurf, 32, 32)
         end;
 end;
 
@@ -1041,11 +1057,11 @@
         if texsurf = nil then
             texsurf:= LoadImage(Pathz[ptGraphics] + '/Progress', ifCritical or ifTransparent);
 
-        ProgrTex:= Surface2Atlas(texsurf, false);
-
         squaresize:= texsurf^.w shr 1;
         numsquares:= texsurf^.h div squaresize;
 
+        ProgrTex:= Surface2Atlas(texsurf, false);
+
         uMobile.GameLoading();
         end;
 
--- a/hedgewars/uTextures.pas	Mon Jun 25 16:22:03 2012 +0200
+++ b/hedgewars/uTextures.pas	Tue Jul 10 11:08:35 2012 +0200
@@ -24,6 +24,7 @@
 
 function  NewTexture(width, height: Longword; buf: Pointer): PTexture;
 procedure Surface2GrayScale(surf: PSDL_Surface);
+function SurfaceSheet2Atlas(surf: PSDL_Surface; spriteWidth: Integer; spriteHeight: Integer): PTexture;
 function  Surface2Atlas(surf: PSDL_Surface; enableClamp: boolean): PTexture;
 procedure FreeTexture(tex: PTexture);
 procedure ComputeTexcoords(texture: PTexture; r: PSDL_Rect; tb: PVertexRect);
@@ -32,10 +33,164 @@
 procedure freeModule;
 
 implementation
-uses GLunit, uUtils, uVariables, uConsts, uDebug, uConsole, uAtlas;
+uses GLunit, uUtils, uVariables, uConsts, uDebug, uConsole, uAtlas, SysUtils;
+
+var
+  logFile: TextFile;
+
+function CropSurface(source: PSDL_Surface; rect: PSDL_Rect): PSDL_Surface;
+var
+    fmt: PSDL_PixelFormat;
+    srcP, dstP: PByte;
+    copySize: Integer;
+    i: Integer;
+const
+    pixelSize = 4;
+begin
+    //writeln(stdout, 'Cropping from ' + IntToStr(source^.w) + 'x' + IntToStr(source^.h) + ' -> ' + IntToStr(rect^.w) + 'x' + IntToStr(rect^.h));
+
+    fmt:= source^.format;
+
+    CropSurface:= SDL_CreateRGBSurface(source^.flags, rect^.w, rect^.h, 
+        fmt^.BitsPerPixel, fmt^.Rmask, fmt^.Gmask, fmt^.Bmask, fmt^.Amask);
+
+    if SDL_MustLock(source) then
+        SDLTry(SDL_LockSurface(source) >= 0, true);
+    if SDL_MustLock(CropSurface) then
+        SDLTry(SDL_LockSurface(CropSurface) >= 0, true);
+
+    srcP:= source^.pixels;
+    dstP:= CropSurface^.pixels;
+
+    inc(srcP, pixelSize * rect^.x);
+    inc(srcP, source^.pitch * rect^.y);
+    copySize:= rect^.w * pixelSize;
+    for i:= 0 to Pred(rect^.h) do
+    begin
+        Move(srcP^, dstP^, copySize);
+        inc(srcP, source^.pitch);
+        inc(dstP, CropSurface^.pitch);
+    end;
+
+    if SDL_MustLock(source) then
+        SDL_UnlockSurface(source);
+    if SDL_MustLock(CropSurface) then
+        SDL_UnlockSurface(CropSurface);
+end;
+
+function TransparentLine(p: PByte; stride: Integer; length: Integer): boolean;
+var
+    i: Integer;
+begin
+    TransparentLine:= false;
+    for i:=0 to pred(length) do
+    begin
+        if p^ <> 0 then
+            exit;
+        inc(p, stride);
+    end;
+    TransparentLine:= true;
+end;
+
+function AutoCrop(source: PSDL_Surface; var cropinfo: TCropInformation): PSDL_Surface;
+var
+    l,r,t,b, i: Integer;
+    pixels, p: PByte;
+    scanlineSize: Integer;
+    rect: TSDL_Rect;
+const
+    pixelSize = 4;
+begin
+    l:= source^.w; 
+    r:= 0; 
+    t:= source^.h;
+    b:= 0;
+
+    if SDL_MustLock(source) then
+        SDLTry(SDL_LockSurface(source) >= 0, true);
+
+    pixels:= source^.pixels;
+    scanlineSize:= source^.pitch;
 
-var TextureList: PTexture;
+    inc(pixels, 3); // advance to alpha value
+
+    // check top
+    p:= pixels;
+    for i:= 0 to Pred(source^.h) do
+    begin
+        if not TransparentLine(p, pixelSize, source^.w) then
+        begin
+            t:= i;
+            break;
+        end;
+        inc(p, scanlineSize);
+    end;
+
+
+    // check bottom
+    p:= pixels;
+    inc(p, scanlineSize * source^.h);
+    for i:= 0 to Pred(source^.h - t) do
+    begin
+        dec(p, scanlineSize);
+        if not TransparentLine(p, pixelSize, source^.w) then
+        begin
+            b:= i;
+            break;
+        end;
+    end;
+
+    // check left
+    p:= pixels;
+    for i:= 0 to Pred(source^.w) do
+    begin
+        if not TransparentLine(p, scanlineSize, source^.h) then
+        begin
+            l:= i;
+            break;
+        end;
+        inc(p, pixelSize);
+    end;
 
+    // check right
+    p:= pixels;
+    inc(p, scanlineSize);
+    for i:= 0 to Pred(source^.w - l) do
+    begin
+        dec(p, pixelSize);
+        if not TransparentLine(p, scanlineSize, source^.h) then
+        begin
+            r:= i;
+            break;
+        end;
+    end;
+
+    if SDL_MustLock(source) then
+        SDL_UnlockSurface(source);
+
+    rect.x:= l;
+    rect.y:= t;
+
+    rect.w:= source^.w - r - l;    
+    rect.h:= source^.h - b - t;
+
+    cropInfo.l:= l;
+    cropInfo.r:= r;
+    cropInfo.t:= t;
+    cropInfo.b:= b;
+    cropInfo.x:= Trunc(source^.w / 2 - l + r);
+    cropInfo.y:= Trunc(source^.h / 2 - t + b);
+
+    if (l = source^.w) or (t = source^.h) then
+    begin
+        result:= nil;
+        exit;
+    end;
+
+    if (l <> 0) or (r <> 0) or (t <> 0) or (b <> 0) then
+        result:= CropSurface(source, @rect)
+    else result:= source;
+end;
 
 procedure SetTextureParameters(enableClamp: Boolean);
 begin
@@ -49,87 +204,80 @@
 end;
 
 procedure ComputeTexcoords(texture: PTexture; r: PSDL_Rect; tb: PVertexRect);
-var x0, y0, x1, y1, tmp: Real;
+var 
+    x0, y0, x1, y1, tmp: Real;
     w, h, aw, ah: LongInt;
-const texelOffset = 0.0;
+    p: PChar;
+const 
+    texelOffset = 0.0;
 begin
-aw:=texture^.atlas^.w;
-ah:=texture^.atlas^.h;
+    aw:=texture^.atlas^.w;
+    ah:=texture^.atlas^.h;
 
-if texture^.isRotated then
+    if texture^.isRotated then
     begin
-    w:=r^.h;
-    h:=r^.w;
-    end 
-else
+        w:=r^.h;
+        h:=r^.w;
+    end else
     begin
-    w:=r^.w;
-    h:=r^.h;        
+        w:=r^.w;
+        h:=r^.h;        
     end;
 
-x0:= (texture^.x + r^.x +     texelOffset)/aw;
-x1:= (texture^.x + r^.x + w - texelOffset)/aw;
-y0:= (texture^.y + r^.y +     texelOffset)/ah;
-y1:= (texture^.y + r^.y + h - texelOffset)/ah;
+    x0:= (texture^.x + {r^.x} +     texelOffset)/aw;
+    x1:= (texture^.x + {r^.x} + w - texelOffset)/aw;
+    y0:= (texture^.y + {r^.y} +     texelOffset)/ah;
+    y1:= (texture^.y + {r^.y} + h - texelOffset)/ah;
 
-if (texture^.isRotated) then
-begin
-  tb^[0].X:= x0;
-  tb^[0].Y:= y0;
-  tb^[3].X:= x1;
-  tb^[3].Y:= y0;
-  tb^[2].X:= x1;
-  tb^[2].Y:= y1;
-  tb^[1].X:= x0;
-  tb^[1].Y:= y1
-end else
-begin
-  tb^[0].X:= x0;
-  tb^[0].Y:= y0;
-  tb^[1].X:= x1;
-  tb^[1].Y:= y0;
-  tb^[2].X:= x1;
-  tb^[2].Y:= y1;
-  tb^[3].X:= x0;
-  tb^[3].Y:= y1;
-end;
+    if (texture^.isRotated) then
+    begin
+        tb^[0].X:= x0;
+        tb^[0].Y:= y0;
+        tb^[3].X:= x1;
+        tb^[3].Y:= y0;
+        tb^[2].X:= x1;
+        tb^[2].Y:= y1;
+        tb^[1].X:= x0;
+        tb^[1].Y:= y1
+    end else
+    begin
+        tb^[0].X:= x0;
+        tb^[0].Y:= y0;
+        tb^[1].X:= x1;
+        tb^[1].Y:= y0;
+        tb^[2].X:= x1;
+        tb^[2].Y:= y1;
+        tb^[3].X:= x0;
+        tb^[3].Y:= y1;
+    end;
 end;
 
 procedure ResetVertexArrays(texture: PTexture);
 var r: TSDL_Rect;
 begin
-with texture^ do
-begin
-    vb[0].X:= 0;
-    vb[0].Y:= 0;
-    vb[1].X:= w;
-    vb[1].Y:= 0;
-    vb[2].X:= w;
-    vb[2].Y:= h;
-    vb[3].X:= 0;
-    vb[3].Y:= h;
-end;
+    with texture^ do
+    begin
+        vb[0].X:= texture^.cropInfo.l;
+        vb[0].Y:= texture^.cropInfo.t;
+        vb[1].X:= texture^.cropInfo.l + w;
+        vb[1].Y:= texture^.cropInfo.t;
+        vb[2].X:= texture^.cropInfo.l + w;
+        vb[2].Y:= texture^.cropInfo.t + h;
+        vb[3].X:= texture^.cropInfo.l;
+        vb[3].Y:= texture^.cropInfo.t + h;
+    end;
 
-r.x:= 0;
-r.y:= 0;
-r.w:= texture^.w;
-r.h:= texture^.h;
-ComputeTexcoords(texture, @r, @texture^.tb);
+    r.x:= 0;
+    r.y:= 0;
+    r.w:= texture^.w;
+    r.h:= texture^.h;
+    ComputeTexcoords(texture, @r, @texture^.tb);
 end;
 
 function NewTexture(width, height: Longword; buf: Pointer): PTexture;
 begin
 new(NewTexture);
-NewTexture^.PrevTexture:= nil;
-NewTexture^.NextTexture:= nil;
 NewTexture^.Scale:= 1;
-if TextureList <> nil then
-    begin
-    TextureList^.PrevTexture:= NewTexture;
-    NewTexture^.NextTexture:= TextureList
-    end;
-TextureList:= NewTexture;
-
 
 // Atlas allocation happens here later on. For now we just allocate one exclusive atlas per sprite
 new(NewTexture^.atlas);
@@ -142,6 +290,14 @@
 NewTexture^.isRotated:=false;
 NewTexture^.shared:=false;
 NewTexture^.surface:=nil;
+NewTexture^.nextFrame:=nil;
+NewTexture^.cropInfo.l:= 0;
+NewTexture^.cropInfo.r:= 0;
+NewTexture^.cropInfo.t:= 0;
+NewTexture^.cropInfo.b:= 0;
+NewTexture^.cropInfo.x:= width div 2;
+NewTexture^.cropInfo.y:= height div 2;
+
 
 ResetVertexArrays(NewTexture);
 
@@ -175,26 +331,86 @@
 end;
 
 
+function SurfaceSheet2Atlas(surf: PSDL_Surface; spriteWidth: Integer; spriteHeight: Integer): PTexture;
+var
+    subSurface: PSDL_Surface;
+    framesX, framesY: Integer;
+    last, current: PTexture;
+    r: TSDL_Rect;
+    x, y: Integer;
+begin
+    SurfaceSheet2Atlas:= nil;
+    r.x:= 0;
+    r.y:= 0;
+    r.w:= spriteWidth;
+    r.h:= spriteHeight;
+    last:= nil;
+
+    framesX:= surf^.w div spriteWidth;
+    framesY:= surf^.h div spriteHeight;
+
+    for x:=0 to Pred(framesX) do
+    begin
+        r.y:= 0;
+        for y:=0 to Pred(framesY) do
+        begin
+            subSurface:= CropSurface(surf, @r);
+            current:= Surface2Atlas(subSurface, false);
+
+            if last = nil then
+            begin
+                SurfaceSheet2Atlas:= current;
+                last:= current;
+            end else
+            begin
+                last^.nextFrame:= current;
+                last:= current;
+            end;
+            inc(r.y, spriteHeight);
+        end;
+        inc(r.x, spriteWidth);
+    end;
+
+    SDL_FreeSurface(surf);
+end;
+
 function Surface2Atlas(surf: PSDL_Surface; enableClamp: boolean): PTexture;
 var tw, th, x, y: Longword;
     tmpp: pointer;
+    cropped: PSDL_Surface;
     fromP4, toP4: PLongWordArray;
+    cropInfo: TCropInformation;
 begin
-    if (surf^.w <= 256) and (surf^.h <= 256) then
+    cropped:= AutoCrop(surf, cropInfo);
+    if cropped <> surf then
+    begin
+        SDL_FreeSurface(surf);
+        surf:= cropped;
+    end;
+
+    if surf = nil then
+    begin
+        new(Surface2Atlas);
+        Surface2Atlas^.w:= 0;
+        Surface2Atlas^.h:= 0;
+        Surface2Atlas^.x:=0 ;
+        Surface2Atlas^.y:=0 ;
+        Surface2Atlas^.isRotated:= false;
+        Surface2Atlas^.surface:= nil;
+        Surface2Atlas^.shared:= false;
+        Surface2Atlas^.nextFrame:= nil;
+        Surface2Atlas^.cropInfo:= cropInfo;
+        exit;
+    end;
+
+    if (surf^.w <= 512) and (surf^.h <= 512) then
     begin
         Surface2Atlas:= Surface2Tex_(surf, enableClamp); // run the atlas side by side for debugging
+        Surface2Atlas^.cropInfo:= cropInfo;
         ResetVertexArrays(Surface2Atlas);
         exit;
     end;
 new(Surface2Atlas);
-Surface2Atlas^.PrevTexture:= nil;
-Surface2Atlas^.NextTexture:= nil;
-if TextureList <> nil then
-    begin
-    TextureList^.PrevTexture:= Surface2Atlas;
-    Surface2Atlas^.NextTexture:= TextureList
-    end;
-TextureList:= Surface2Atlas;
 
 // Atlas allocation happens here later on. For now we just allocate one exclusive atlas per sprite
 new(Surface2Atlas^.atlas);
@@ -206,13 +422,15 @@
 Surface2Atlas^.isRotated:=false;
 Surface2Atlas^.surface:= surf;
 Surface2Atlas^.shared:= false;
+Surface2Atlas^.nextFrame:= nil;
+Surface2Atlas^.cropInfo:= cropInfo;
 
 
 if (surf^.format^.BytesPerPixel <> 4) then
     begin
     TryDo(false, 'Surface2Tex failed, expecting 32 bit surface', true);
     Surface2Atlas^.atlas^.id:= 0;
-    exit
+    exit;
     end;
 
 
@@ -281,26 +499,27 @@
 // if nil is passed nothing is done
 procedure FreeTexture(tex: PTexture);
 begin
-if tex <> nil then
+    if tex <> nil then
     begin
+        FreeTexture(tex^.nextFrame); // free all frames linked to this animation
+
+        if tex^.surface = nil then
+        begin
+            Dispose(tex);
+            exit;
+        end;
+
         if tex^.shared then
         begin
+            SDL_FreeSurface(tex^.surface);
             FreeTexture_(tex); // run atlas side by side for debugging
-            SDL_FreeSurface(tex^.surface);
             exit;
         end;
 
     // Atlas cleanup happens here later on. For now we just free as each sprite has one atlas
+    glDeleteTextures(1, @tex^.atlas^.id);
     Dispose(tex^.atlas);
 
-    if tex^.NextTexture <> nil then
-        tex^.NextTexture^.PrevTexture:= tex^.PrevTexture;
-    if tex^.PrevTexture <> nil then
-        tex^.PrevTexture^.NextTexture:= tex^.NextTexture
-    else
-        TextureList:= tex^.NextTexture;
-    glDeleteTextures(1, @tex^.atlas^.id);
-
     if (tex^.surface <> nil) then
         SDL_FreeSurface(tex^.surface);
     Dispose(tex);
@@ -309,19 +528,14 @@
 
 procedure initModule;
 begin
+assign(logFile, 'out.log');
+rewrite(logFile);
 uAtlas.initModule;
-TextureList:= nil;
 end;
 
 procedure freeModule;
 begin
-if TextureList <> nil then
-    WriteToConsole('FIXME FIXME FIXME. App shutdown without full cleanup of texture list; read game0.log and please report this problem');
-    while TextureList <> nil do 
-        begin
-        AddFileLog('Sprite not freed: width='+inttostr(LongInt(TextureList^.w))+' height='+inttostr(LongInt(TextureList^.h))+' priority='+inttostr(round(TextureList^.atlas^.priority*1000)));
-        FreeTexture(TextureList);
-        end
+close(logFile);
 end;
 
 end.
--- a/hedgewars/uTypes.pas	Mon Jun 25 16:22:03 2012 +0200
+++ b/hedgewars/uTypes.pas	Tue Jul 10 11:08:35 2012 +0200
@@ -213,12 +213,19 @@
 
     PVertexRect = ^TVertexRect;
     TVertexRect = array[0..3] of TVertex2f;
+
+    TCropInformation = record
+        l, r, t, b: Integer; // cropped pixels for each side
+        x, y: Integer;       // pivot (center) of the sprite in the cropped image
+    end;
     
     TTexture = record
             atlas: PAtlas;
             w, h, scale: LongInt;
 
             x, y: LongInt; // Offset in the texture atlas
+            cropInfo: TCropInformation;
+
             isRotated: boolean; // if true sprite is flipped in the atlas taking w pixels along the y and h pixels along the x axis
 
             shared: boolean; // true if in an atlas, false if atlas points to a dedicated texture for this sprite
@@ -228,7 +235,7 @@
             // Cached values for texel coordinates and vertex coordinates            
             vb, tb: TVertexRect;
 
-            PrevTexture, NextTexture: PTexture;
+            nextFrame: PTexture;
             end;
 
     THogEffect = (heInvulnerable, heResurrectable, hePoisoned, heResurrected, heFrozen);
--- a/hedgewars/uVariables.pas	Mon Jun 25 16:22:03 2012 +0200
+++ b/hedgewars/uVariables.pas	Tue Jul 10 11:08:35 2012 +0200
@@ -266,383 +266,384 @@
             Texture: PTexture;
             Surface: PSDL_Surface;
             Width, Height, imageWidth, imageHeight: LongInt;
-            saveSurf: boolean;
+            scale: Integer;
+            saveSurf : boolean;
             priority: GLfloat;
             getDimensions, getImageDimensions: boolean;
             end = (
             (FileName:  'BlueWater'; Path: ptCurrTheme;AltPath: ptGraphics; Texture: nil; Surface: nil;
-            Width:   0; Height:  0; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: true; getImageDimensions: true),// sprWater
+            Width:   0; Height:  0; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: true; getImageDimensions: true),// sprWater
             (FileName:     'Clouds'; Path: ptCurrTheme;AltPath: ptGraphics; Texture: nil; Surface: nil;
-            Width: 256; Height:128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprCloud
+            Width: 256; Height:128; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprCloud
             (FileName:       'Bomb'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:   8; Height:  8; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBomb
+            Width:   8; Height:  8; imageWidth: 0; imageHeight: 0; scale: 4; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBomb
             (FileName:  'BigDigits'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBigDigit
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBigDigit
             (FileName:      'Frame'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:   4; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprFrame
+            Width:   4; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprFrame
             (FileName:        'Lag'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  65; Height: 65; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprLag
+            Width:  65; Height: 65; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprLag
             (FileName:      'Arrow'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprCursor
+            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprCursor
             (FileName:'BazookaShell'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBazookaShell
+            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; scale: 4; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBazookaShell
             (FileName:    'Targetp'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTargetP
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTargetP
             (FileName:        'Bee'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBee
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBee
             (FileName: 'SmokeTrace'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSmokeTrace
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSmokeTrace
             (FileName:   'RopeHook'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprRopeHook
+            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; scale: 4; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprRopeHook
             (FileName:     'Expl50'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplosion50
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplosion50
             (FileName:    'MineOff'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:   8; Height:  8; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMineOff
+            Width:   8; Height:  8; imageWidth: 0; imageHeight: 0; scale: 4; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMineOff
             (FileName:     'MineOn'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:   8; Height:  8; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMineOn
+            Width:   8; Height:  8; imageWidth: 0; imageHeight: 0; scale: 4; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMineOn
             (FileName:     'MineDead'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:   8; Height:  8; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMineDead
+            Width:   8; Height:  8; imageWidth: 0; imageHeight: 0; scale: 4; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMineDead
             (FileName:       'Case'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprCase
+            Width:  48; Height: 48; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprCase
             (FileName:   'FirstAid'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprFAid
+            Width:  48; Height: 48; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprFAid
             (FileName:   'dynamite'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprDynamite
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprDynamite
             (FileName:      'Power'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprPower
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprPower
             (FileName:     'ClBomb'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprClusterBomb
+            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprClusterBomb
             (FileName: 'ClParticle'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprClusterParticle
+            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprClusterParticle
             (FileName:      'Flame'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprFlame
+            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprFlame
             (FileName:   'horizont'; Path: ptCurrTheme;AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:   0; Height:  0; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprHorizont
+            Width:   0; Height:  0; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprHorizont
             (FileName:  'horizontL'; Path: ptCurrTheme;AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:   0; Height:  0; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprHorizont
+            Width:   0; Height:  0; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprHorizont
             (FileName:  'horizontR'; Path: ptCurrTheme;AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:   0; Height:  0; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprHorizont
+            Width:   0; Height:  0; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprHorizont
             (FileName:        'Sky'; Path: ptCurrTheme;AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:   0; Height:  0; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprSky
+            Width:   0; Height:  0; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprSky
             (FileName:       'SkyL'; Path: ptCurrTheme;AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:   0; Height:  0; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprSky
+            Width:   0; Height:  0; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprSky
             (FileName:       'SkyR'; Path: ptCurrTheme;AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:   0; Height:  0; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprSky
+            Width:   0; Height:  0; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprSky
             (FileName:   'Slot'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAMSlot
+            Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAMSlot
             (FileName:      'Ammos'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAMAmmos
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAMAmmos
             (FileName:   'Ammos_bw'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprAMAmmosBW
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: true; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprAMAmmosBW
             (FileName:   'SlotKeys'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAMSlotKeys
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAMSlotKeys
             (FileName:  'Corners'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  2; Height: 2; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAMCorners
+            Width:  2; Height: 2; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAMCorners
             (FileName:     'Finger'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprFinger
+            Width:  32; Height: 48; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprFinger
             (FileName:    'AirBomb'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAirBomb
+            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; scale: 4; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAirBomb
             (FileName:   'Airplane'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 256; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAirplane
+            Width: 256; Height: 128; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAirplane
             (FileName: 'amAirplane'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAmAirplane
+            Width:  64; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAmAirplane
             (FileName:   'amGirder'; Path: ptCurrTheme; AltPath: ptGraphics; Texture: nil; Surface: nil;
-            Width: 160; Height:160; imageWidth: 0; imageHeight: 0; saveSurf:  true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAmGirder
+            Width: 160; Height:160; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf:  true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAmGirder
             (FileName:     'hhMask'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf:  true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHHTelepMask
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf:  true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHHTelepMask
             (FileName:     'Switch'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSwitch
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSwitch
             (FileName:  'Parachute'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprParachute
+            Width:  48; Height: 48; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprParachute
             (FileName:     'Target'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTarget
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTarget
             (FileName:   'RopeNode'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:   6; Height:  6; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprRopeNode
+            Width:   6; Height:  6; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprRopeNode
             (FileName:   'thinking'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprQuestion
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprQuestion
             (FileName:   'PowerBar'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 256; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPowerBar
+            Width: 256; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPowerBar
             (FileName:    'WindBar'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 151; Height: 17; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWindBar
+            Width: 151; Height: 17; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWindBar
             (FileName:      'WindL'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  80; Height: 13; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWindL
+            Width:  80; Height: 13; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWindL
             (FileName:      'WindR'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  80; Height: 13; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWindR
+            Width:  80; Height: 13; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWindR
 {$IFDEF USE_TOUCH_INTERFACE}
             (FileName: 'firebutton'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprFireButton
+            Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprFireButton
             (FileName: 'arrowUp'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowUp
+            Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowUp
             (FileName: 'arrowDown'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowDown
+            Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowDown
             (FileName: 'arrowLeft'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowLeft
+            Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowLeft
             (FileName: 'arrowRight'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowRight
+            Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowRight
             (FileName: 'forwardjump'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprAMWidget
+            Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprAMWidget
             (FileName: 'backjump'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprJumpWidget
+            Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprJumpWidget
             (FileName: 'pause'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 120; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprPauseButton
+            Width: 120; Height: 100; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprPauseButton
             (FileName: 'pause'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;//TODO correct image
-            Width: 120; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprTimerButton
+            Width: 120; Height: 128; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprTimerButton
             (FileName: 'forwardjump'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;//TODO correct image
-            Width: 120; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprTargetButton
+            Width: 120; Height: 128; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprTargetButton
 {$ENDIF}
             (FileName:      'Flake'; Path:ptCurrTheme; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprFlake
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprFlake
             (FileName:     'amRope'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandRope
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandRope
             (FileName:  'amBazooka'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBazooka
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBazooka
             (FileName:  'amShotgun'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandShotgun
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandShotgun
             (FileName:   'amDEagle'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandDEagle
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandDEagle
             (FileName:'amAirAttack'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandAirAttack
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandAirAttack
             (FileName: 'amBaseball'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBaseball
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBaseball
             (FileName:     'Hammer'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPHammer
+            Width:  32; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPHammer
             (FileName: 'amBTorch_i'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBlowTorch
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBlowTorch
             (FileName: 'amBTorch_w'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBlowTorch
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBlowTorch
             (FileName:   'Teleport'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTeleport
+            Width:  64; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTeleport
             (FileName:    'HHDeath'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprHHDeath
+            Width:  32; Height: 64; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprHHDeath
             (FileName:'amShotgun_w'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprShotgun
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprShotgun
             (FileName: 'amDEagle_w'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprDEagle
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprDEagle
             (FileName:       'Idle'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprHHIdle
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprHHIdle
             (FileName:     'Mortar'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMortar
+            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; scale: 4; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMortar
             (FileName:  'TurnsLeft'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTurnsLeft
+            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTurnsLeft
             (FileName: 'amKamikaze'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 128; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprKamikaze
+            Width: 128; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprKamikaze
             (FileName:     'amWhip'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 128; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWhip
+            Width: 128; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWhip
             (FileName:     'Kowtow'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprKowtow
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprKowtow
             (FileName:        'Sad'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprSad
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprSad
             (FileName:       'Wave'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprWave
+            Width:  64; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprWave
             (FileName:     'Hurrah'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprHurrah
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprHurrah
             (FileName:'ILoveLemonade';Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 128; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprLemonade
+            Width: 128; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprLemonade
             (FileName:      'Shrug'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 32;  Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprShrug
+            Width: 32;  Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprShrug
             (FileName:     'Juggle'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 32;  Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprJuggle
+            Width: 32;  Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprJuggle
             (FileName:   'ExplPart'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplPart
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplPart
             (FileName:  'ExplPart2'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplPart2
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplPart2
             (FileName:  'Cake_walk'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprCakeWalk
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprCakeWalk
             (FileName:  'Cake_down'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprCakeDown
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprCakeDown
             (FileName: 'Watermelon'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWatermelon
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWatermelon
             (FileName:  'EvilTrace'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprEvilTrace
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprEvilTrace
             (FileName:'HellishBomb'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHellishBomb
+            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHellishBomb
             (FileName:  'Seduction'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSeduction
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSeduction
             (FileName:    'HHDress'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprDress
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprDress
             (FileName:   'Censored'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprCensored
+            Width:  64; Height: 16; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprCensored
             (FileName:      'Drill'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprDrill
+            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; scale: 4; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprDrill
             (FileName:    'amDrill'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandDrill
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandDrill
             (FileName:  'amBallgun'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBallgun
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBallgun
             (FileName:      'Balls'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 20; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprBalls
+            Width:  32; Height: 20; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprBalls
             (FileName:    'RCPlane'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPlane
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPlane
             (FileName:  'amRCPlane'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandPlane
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandPlane
             (FileName:    'Utility'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprUtility
+            Width:  48; Height: 48; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprUtility
             (FileName:'Invulnerable';Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprInvulnerable
+            Width:  48; Height: 48; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprInvulnerable
             (FileName:   'Vampiric'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprVampiric
+            Width:  48; Height: 48; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprVampiric
             (FileName:   'amGirder'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 512; Height:512; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprGirder
+            Width: 512; Height:512; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprGirder
             (FileName:'SpeechCorner';Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  12; Height: 9; imageWidth: 0; imageHeight: 0; saveSurf:  true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprSpeechCorner
+            Width:  12; Height: 9; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf:  true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprSpeechCorner
             (FileName: 'SpeechEdge'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  25; Height: 9; imageWidth: 0; imageHeight: 0; saveSurf:  true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprSpeechEdge
+            Width:  25; Height: 9; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf:  true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprSpeechEdge
             (FileName: 'SpeechTail'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  25; Height: 26; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprSpeechTail
+            Width:  25; Height: 26; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprSpeechTail
             (FileName:'ThoughtCorner';Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  49; Height: 37; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprThoughtCorner
+            Width:  49; Height: 37; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprThoughtCorner
             (FileName:'ThoughtEdge'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  23; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprThoughtEdge
+            Width:  23; Height: 16; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprThoughtEdge
             (FileName:'ThoughtTail'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  45; Height: 65; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprThoughtTail
+            Width:  45; Height: 65; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprThoughtTail
             (FileName:'ShoutCorner'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  34; Height: 23; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprShoutCorner
+            Width:  34; Height: 23; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprShoutCorner
             (FileName:  'ShoutEdge'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  30; Height: 20; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprShoutEdge
+            Width:  30; Height: 20; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprShoutEdge
             (FileName:  'ShoutTail'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  30; Height: 37; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprShoutTail
+            Width:  30; Height: 37; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprShoutTail
             (FileName:'amSniperRifle';Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 128; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSniperRifle
+            Width: 128; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSniperRifle
             (FileName:    'Bubbles'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprBubbles
+            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprBubbles
             (FileName:  'amJetpack'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprJetpack
+            Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprJetpack
             (FileName:  'Health'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprHealth
+            Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprHealth
             (FileName:  'amMolotov'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),//sprHandMolotov
+            Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),//sprHandMolotov
             (FileName:  'Molotov'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMolotov
+            Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMolotov
             (FileName: 'Smoke'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  22; Height: 22; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSmoke
+            Width:  22; Height: 22; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSmoke
             (FileName: 'SmokeWhite'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  22; Height: 22; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSmokeWhite
+            Width:  22; Height: 22; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSmokeWhite
             (FileName: 'Shells'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  8; Height: 8; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLow; getDimensions: false; getImageDimensions: true),// sprShell
+            Width:  8; Height: 8; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpLow; getDimensions: false; getImageDimensions: true),// sprShell
             (FileName: 'Dust'; Path: ptCurrTheme; AltPath: ptGraphics; Texture: nil; Surface: nil;
-            Width:  22; Height: 22; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprDust
+            Width:  22; Height: 22; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprDust
             (FileName: 'SnowDust'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  22; Height: 22; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSnowDust
+            Width:  22; Height: 22; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSnowDust
             (FileName: 'Explosives'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplosives
+            Width:  48; Height: 48; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplosives
             (FileName: 'ExplosivesRoll'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplosivesRoll
+            Width:  48; Height: 48; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplosivesRoll
             (FileName: 'amTeleport'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAmTeleport
+            Width:  64; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAmTeleport
             (FileName: 'Splash'; Path: ptCurrTheme; AltPath: ptGraphics; Texture: nil; Surface: nil;
-            Width:  80; Height: 50; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSplash
+            Width:  80; Height: 50; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSplash
             (FileName: 'Droplet'; Path: ptCurrTheme; AltPath: ptGraphics; Texture: nil; Surface: nil;
-            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprDroplet
+            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprDroplet
             (FileName: 'Birdy'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  75; Height: 75; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBirdy
+            Width:  75; Height: 75; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBirdy
             (FileName:  'amCake'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandCake
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandCake
             (FileName:  'amConstruction'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandConstruction
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandConstruction
             (FileName:  'amGrenade'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandGrenade
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandGrenade
             (FileName:  'amMelon'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandMelon
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandMelon
             (FileName:  'amMortar'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandMortar
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandMortar
             (FileName:  'amSkip'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSkip
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSkip
             (FileName:  'amCluster'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandCluster
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandCluster
             (FileName:  'amDynamite'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandDynamite
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandDynamite
             (FileName:  'amHellish'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandHellish
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandHellish
             (FileName:  'amMine'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandMine
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandMine
             (FileName:  'amSeduction'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSeduction
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSeduction
             (FileName:  'amVamp'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandVamp
+            Width:  128; Height: 128; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandVamp
             (FileName:  'BigExplosion'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  385; Height: 385; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBigExplosion
+            Width:  385; Height: 385; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBigExplosion
             (FileName:  'SmokeRing'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  200; Height: 200; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSmokeRing
+            Width:  200; Height: 200; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSmokeRing
             (FileName:  'BeeTrace'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprBeeTrace
+            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprBeeTrace
             (FileName:  'Egg'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprEgg
+            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprEgg
             (FileName:  'TargetBee'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTargetBee
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTargetBee
             (FileName:  'amBee'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBee
+            Width:  128; Height: 128; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBee
             (FileName:  'Feather'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  15; Height: 25; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprFeather
+            Width:  15; Height: 25; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprFeather
             (FileName:  'Piano'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPiano
+            Width:  128; Height: 128; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPiano
             (FileName:  'amSineGun'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  128; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSineGun
+            Width:  128; Height: 64; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSineGun
             (FileName:  'amPortalGun'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 128; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPortalGun
+            Width: 128; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPortalGun
             (FileName:  'Portal'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPortal
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPortal
             (FileName:  'cheese'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprCheese
+            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprCheese
             (FileName:  'amCheese'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandCheese
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandCheese
             (FileName:  'amFlamethrower'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandFlamethrower
+            Width:  128; Height: 128; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandFlamethrower
             (FileName:  'Chunk'; Path: ptCurrTheme; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprChunk
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprChunk
             (FileName:  'Note'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprNote
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprNote
             (FileName:   'SMineOff'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:   8; Height:  8; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSMineOff
+            Width:   8; Height:  8; imageWidth: 0; imageHeight: 0; scale: 4; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSMineOff
             (FileName:    'SMineOn'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:   8; Height:  8; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSMineOn
+            Width:   8; Height:  8; imageWidth: 0; imageHeight: 0; scale: 4; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSMineOn
             (FileName:   'amSMine'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSMine
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSMine
             (FileName:  'amHammer'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 128; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true), // sprHammer
+            Width: 128; Height: 64; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true), // sprHammer
             (FileName: 'amResurrector'; Path: ptHedgehog; AltPath: ptNone;
                 Texture: nil; Surface: nil; Width: 32; Height: 32;
-                imageWidth: 0; imageHeight: 0; saveSurf: false; priority:
+                imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority:
                 tpMedium; getDimensions: false; getImageDimensions: true),
             //sprHandResurrector
             (FileName: 'Cross'; Path: ptGraphics; AltPath: ptNone;
                 Texture: nil; Surface: nil; Width: 108; Height: 138;
-                imageWidth: 0; imageHeight: 0; saveSurf: false; priority:
+                imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority:
                 tpMedium; getDimensions: false; getImageDimensions: true),
             //sprCross
             (FileName:  'AirDrill'; Path: ptGraphics; AltPath: ptNone;
                 Texture: nil; Surface: nil; Width:  16; Height: 16;
-                imageWidth: 0; imageHeight: 0; saveSurf: false; priority:
+                imageWidth: 0; imageHeight: 0; scale: 4; saveSurf: false; priority:
                 tpMedium; getDimensions: false; getImageDimensions: true),
             // sprAirDrill
             (FileName:  'NapalmBomb'; Path: ptGraphics; AltPath: ptNone;
                 Texture: nil; Surface: nil; Width:  16; Height: 16;
-                imageWidth: 0; imageHeight: 0; saveSurf: false; priority:
+                imageWidth: 0; imageHeight: 0; scale: 4; saveSurf: false; priority:
                 tpMedium; getDimensions: false; getImageDimensions: true),
             // sprNapalmBomb
             (FileName:  'BulletHit'; Path: ptGraphics; AltPath: ptNone;
                 Texture: nil; Surface: nil; Width:  32; Height: 32;
-                imageWidth: 0; imageHeight: 0; saveSurf: false; priority:
+                imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority:
                 tpMedium; getDimensions: false; getImageDimensions: true),
             // sprNapalmBomb
             (FileName:  'Snowball'; Path: ptCurrTheme; AltPath: ptGraphics; Texture: nil; Surface: nil;
-            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSnowball
+            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSnowball
             (FileName:  'amSnowball'; Path: ptCurrTheme; AltPath: ptHedgehog; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSnowball
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSnowball
             (FileName:  'Snow'; Path: ptCurrTheme; AltPath: ptGraphics; Texture: nil; Surface: nil;
-            Width:  4; Height: 4; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSnow
+            Width:  4; Height: 4; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSnow
             (FileName:    'SDFlake'; Path: ptCurrTheme; AltPath: ptSuddenDeath; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSDFlake
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; scale: 2; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSDFlake
             (FileName:    'SDWater'; Path: ptCurrTheme; AltPath: ptSuddenDeath; Texture: nil; Surface: nil;
-            Width:   0; Height:  0; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: true; getImageDimensions: true),// sprSDWater
+            Width:   0; Height:  0; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: true; getImageDimensions: true),// sprSDWater
             (FileName:   'SDClouds'; Path: ptCurrTheme; AltPath: ptSuddenDeath; Texture: nil; Surface: nil;
-            Width: 256; Height:128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprSDCloud
+            Width: 256; Height:128; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprSDCloud
             (FileName:   'SDSplash'; Path: ptCurrTheme; AltPath: ptSuddenDeath; Texture: nil; Surface: nil;
-            Width:  80; Height: 50; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSDSplash
+            Width:  80; Height: 50; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSDSplash
             (FileName:  'SDDroplet'; Path: ptCurrTheme; AltPath: ptSuddenDeath; Texture: nil; Surface: nil;
-            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSDDroplet
+            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSDDroplet
             (FileName:  'TARDIS'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  48; Height: 79; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprTardis
+            Width:  48; Height: 79; imageWidth: 0; imageHeight: 0; scale: 1; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprTardis
             (FileName:  'slider'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 3; Height: 17; imageWidth: 3; imageHeight: 17; saveSurf: false; priority: tpLow; getDimensions: false; getImageDimensions: false) // sprSlider
+            Width: 3; Height: 17; imageWidth: 3; imageHeight: 17; scale: 1; saveSurf: false; priority: tpLow; getDimensions: false; getImageDimensions: false) // sprSlider
             );
 
 const
--- a/hedgewars/uWorld.pas	Mon Jun 25 16:22:03 2012 +0200
+++ b/hedgewars/uWorld.pas	Tue Jul 10 11:08:35 2012 +0200
@@ -817,7 +817,7 @@
     lw, waves: GLfloat;
     sprite: TSprite;
     r: TSDL_Rect;
-begin
+begin{
 if SuddenDeathDmg then
     sprite:= sprSDWater
 else
@@ -869,7 +869,7 @@
     DrawSprite(sprWater,
         i * cWaveWidth + ((WorldDx + (RealTicks shr 6) * Dir + dX) mod cWaveWidth) - (cScreenWidth div 2),
         cWaterLine + WorldDy + dY,
-        0)}
+        0)}}
 end;
 
 procedure DrawRepeated(spr, sprL, sprR: TSprite; Shift, OffsetY: LongInt);