Henek adds a flamethrower, updates some translations, and tweaks how fire works.
authornemo
Wed, 19 May 2010 02:10:28 +0000
changeset 3476 1ec68b8d3bd1
parent 3475 95345f98da19
child 3477 23e4064ff729
Henek adds a flamethrower, updates some translations, and tweaks how fire works.
QTfrontend/hwconsts.cpp.in
hedgewars/GSHandlers.inc
hedgewars/GearDrawing.inc
hedgewars/HHHandlers.inc
hedgewars/uAIAmmoTests.pas
hedgewars/uConsts.pas
hedgewars/uGears.pas
hedgewars/uLocale.pas
share/hedgewars/Data/Graphics/AmmoMenu/Ammos.png
share/hedgewars/Data/Graphics/AmmoMenu/Ammos_bw.png
share/hedgewars/Data/Graphics/Hedgehog/amFlamethrower.png
share/hedgewars/Data/Locale/en.txt
share/hedgewars/Data/Missions/Training/Bazooka.lua
share/hedgewars/Data/Missions/Training/Shotgun.lua
share/hedgewars/Data/Missions/Training/SniperRifle.lua
--- a/QTfrontend/hwconsts.cpp.in	Tue May 18 13:09:57 2010 +0000
+++ b/QTfrontend/hwconsts.cpp.in	Wed May 19 02:10:28 2010 +0000
@@ -31,10 +31,10 @@
 QStringList * mapList;
 
 QString * cDefaultAmmoStore = new QString(
-        "939192942219912103223511100120100000021119091"
-        "040504054160065554655446477657666666615550100"
-        "000000000000020550000004000700400000000020000"
-        "131111031211111112311411111111111111121110111"
+        "9391929422199121032235111001201000000211190911"
+        "0405040541600655546554464776576666666155501000"
+        "0000000000000205500000040007004000000000200000"
+        "1311110312111111123114111111111111111211101111"
 		);
 int cAmmoNumber = cDefaultAmmoStore->size() / 4;
 
@@ -42,30 +42,30 @@
 	QList< QPair<QString, QString> >()
 	<< qMakePair(QString("Default"), *cDefaultAmmoStore)
 	<< qMakePair(QString("Crazy"),     QString(
-        "999999999999999999299999999999999929999999999" // TODO: Remove Piano's unlimited uses!
-        "111111011111111111111111111111111111111111111"
-        "000000000000000000000000000000000000000000000"
-        "131111031211111112311411111111111111121111010"))
+        "9999999999999999992999999999999999299999999999" // TODO: Remove Piano's unlimited uses!
+        "1111110111111111111111111111111111111111111111"
+        "0000000000000000000000000000000000000000000000"
+        "1311110312111111123114111111111111111211110101"))
 	<< qMakePair(QString("Pro mode"),  QString(
-        "909000900000000000000900000000000000000000090"
-        "000000000000000000000000000000000000000000000"
-        "000000000000020550000004000700400000000020000"
-        "111111111111111111111111111111111111111110011"))
+        "9090009000000000000009000000000000000000000900"
+        "0000000000000000000000000000000000000000000000"
+        "0000000000000205500000040007004000000000200000"
+        "1111111111111111111111111111111111111111100111"))
 	<< qMakePair(QString("Shoppa"),    QString(
-        "000000990000000000000000000000000000000000000"
-        "444441004424440221011212122242200000000200040"
-        "000000000000000000000000000000000000000000000"
-        "111111111111111111111111111111111111111110111"))
+        "0000009900000000000000000000000000000000000000"
+        "4444410044244402210112121222422000000002000400"
+        "0000000000000000000000000000000000000000000000"
+        "1111111111111111111111111111111111111111101111"))
 	<< qMakePair(QString("Basketball"),QString(
-		"000000900000090000000000000000000000000000000"
-		"000000000000000000000000000000000000000000000"
-		"000000000000000550000004000700400000000020000"
-		"111111111111111111111111111111111111111111111"))
+		"0000009000000900000000000000000000000000000000"
+		"0000000000000000000000000000000000000000000000"
+		"0000000000000005500000040007004000000000200000"
+		"1111111111111111111111111111111111111111111111"))
 	<< qMakePair(QString("Minefield"), QString(
-		"000000990009000000030000000000000000000000000"
-		"000000000000000000000000000000000000000000000"
-		"000000000000020550000004000700400000000020000"
-		"111111111111111111111111111111111111111111111"))
+		"0000009900090000000300000000000000000000000000"
+		"0000000000000000000000000000000000000000000000"
+		"0000000000000205500000040007004000000000200000"
+		"1111111111111111111111111111111111111111111111"))
 	;
 
 QColor * color1 = new QColor(221,   0,   0);
--- a/hedgewars/GSHandlers.inc	Tue May 18 13:09:57 2010 +0000
+++ b/hedgewars/GSHandlers.inc	Wed May 19 02:10:28 2010 +0000
@@ -318,49 +318,49 @@
             gtAmmo_Bomb: doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound);
             gtBall: doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 40, EXPLAutoSound);
             gtClusterBomb: 
-        begin
-            x := hwRound(Gear^.X);
-            y := hwRound(Gear^.Y);
-            doMakeExplosion(x, y, 20, EXPLAutoSound);
-            for i:= 0 to 4 do
-            begin
-                dX := rndSign(GetRandom * _0_1);
-                dY := (GetRandom - _3) * _0_08;
-                AddGear(x, y, gtCluster, 0, dX, dY, 25);
-            end
+                begin
+                    x := hwRound(Gear^.X);
+                    y := hwRound(Gear^.Y);
+                    doMakeExplosion(x, y, 20, EXPLAutoSound);
+                    for i:= 0 to 4 do
+                        begin
+                        dX := rndSign(GetRandom * _0_1);
+                        dY := (GetRandom - _3) * _0_08;
+                        AddGear(x, y, gtCluster, 0, dX, dY, 25);
+                        end
+                end;
+            gtWatermelon: 
+                begin
+                x := hwRound(Gear^.X);
+                y := hwRound(Gear^.Y);
+                doMakeExplosion(x, y, 75, EXPLAutoSound);
+                for i:= 0 to 5 do
+                    begin
+                    dX := rndSign(GetRandom * _0_1);
+                    dY := (GetRandom - _1_5) * _0_3;
+                    AddGear(x, y, gtMelonPiece, 0, dX, dY, 75)^.DirAngle := i * 60;
+                    end
+                end;
+            gtHellishBomb: 
+                begin
+                x := hwRound(Gear^.X);
+                y := hwRound(Gear^.Y);
+                doMakeExplosion(x, y, 90, EXPLAutoSound);
+
+                for i:= 0 to 127 do
+                    begin
+                    dX := AngleCos(i * 16) * _0_5 * (GetRandom + _1);
+                    dY := AngleSin(i * 16) * _0_5 * (GetRandom + _1);
+                    Fire := AddGear(x, y, gtFlame, 0, dX, dY, 0);
+                    if i mod 2 = 0 then Fire^.State := Fire^.State or gsttmpFlag;
+                    Fire := AddGear(x, y, gtFlame, 0, dX, -dY, 0);
+                    if i mod 2 <> 0 then Fire^.State := Fire^.State or gsttmpFlag;
+                    end
+                end;
+            gtGasBomb: doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 20, EXPLAutoSound or EXPLPoisoned);
         end;
-        gtWatermelon: 
-    begin
-        x := hwRound(Gear^.X);
-        y := hwRound(Gear^.Y);
-        doMakeExplosion(x, y, 75, EXPLAutoSound);
-        for i:= 0 to 5 do
-        begin
-            dX := rndSign(GetRandom * _0_1);
-            dY := (GetRandom - _1_5) * _0_3;
-            AddGear(x, y, gtMelonPiece, 0, dX, dY, 75)^.DirAngle := i * 60;
-        end
-    end;
-    gtHellishBomb: 
-begin
-    x := hwRound(Gear^.X);
-    y := hwRound(Gear^.Y);
-    doMakeExplosion(x, y, 90, EXPLAutoSound);
-
-    for i:= 0 to 127 do
-    begin
-        dX := AngleCos(i * 16) * _0_5 * (GetRandom + _1);
-        dY := AngleSin(i * 16) * _0_5 * (GetRandom + _1);
-        Fire := AddGear(x, y, gtFlame, 0, dX, dY, 0);
-        if i mod 2 = 0 then Fire^.State := Fire^.State or gsttmpFlag;
-        Fire := AddGear(x, y, gtFlame, 0, dX, -dY, 0);
-        if i mod 2 <> 0 then Fire^.State := Fire^.State or gsttmpFlag;
-    end
-end;
-gtGasBomb: doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound or EXPLPoisoned, $FFFFC000);
-end;
-DeleteGear(Gear);
-exit
+    DeleteGear(Gear);
+    exit
 end;
 
 CalcRotationDirAngle(Gear);
@@ -1670,11 +1670,11 @@
         if Gear^.dX.QWordValue > _0_01.QWordValue then
             Gear^.dX := Gear^.dX * _0_995;
         Gear^.dY := Gear^.dY + cGravity;
-        if (Gear^.State and gsttmpFlag) <> 0 then Gear^.dY := Gear^.dY + cGravity;
+        {if (Gear^.State and gsttmpFlag) <> 0 then Gear^.dY := Gear^.dY + cGravity;}
         if Gear^.dY.QWordValue > _0_2.QWordValue then Gear^.dY := Gear^.dY * _0_995;
 
-        if (Gear^.State and gsttmpFlag) <> 0 then Gear^.X := Gear^.X + Gear^.dX
-        else
+        {if (Gear^.State and gsttmpFlag) <> 0 then Gear^.X := Gear^.X + Gear^.dX
+        else}
             Gear^.X := Gear^.X + Gear^.dX + cWindSpeed * 640;
         Gear^.Y := Gear^.Y + Gear^.dY;
 
@@ -3624,3 +3624,52 @@
 
     Gear^.doStep := @doStepSineGunShotWork; 
 end;
+
+////////////////////////////////////////////////////////////////////////////////
+procedure doStepFlamethrowerWork(Gear: PGear);
+var 
+    HHGear: PGear;
+    rx, ry: hwFloat;
+    gX, gY: LongInt;
+    Fire: PGear;
+begin
+    AllInactive := false;
+    dec(Gear^.Timer);
+    HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
+    HedgehogChAngle(HHGear);
+    gX := hwRound(Gear^.X);
+    gY := hwRound(Gear^.Y);
+    if (Gear^.Timer mod 100) = 0 then
+    begin
+        rx := rndSign(getRandom * _0_1);
+        ry := rndSign(getRandom * _0_1);
+
+        Fire := AddGear(gx, gy, gtFlame, 0,
+                    SignAs(AngleSin(HHGear^.Angle) * _0_8, HHGear^.dX) + rx,
+            AngleCos(HHGear^.Angle) * ( - _0_8) + ry, 0);
+        Fire^.State := Fire^.State or gsttmpFlag;
+        
+        if (Gear^.Timer mod 200) = 0 then 
+            Fire := AddGear(gx, gy, gtFlame, 0,
+                        SignAs(AngleSin(HHGear^.Angle) * _0_8, HHGear^.dX) + rx,
+                AngleCos(HHGear^.Angle) * ( - _0_8) + ry, 0);
+    end;
+
+    if (Gear^.Timer = 0) or (HHGear^.Damage <> 0) then
+    begin
+        DeleteGear(Gear);
+        AfterAttack
+    end
+end;
+
+procedure doStepFlamethrower(Gear: PGear);
+var 
+    HHGear: PGear;
+begin
+    HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
+    HHGear^.Message := HHGear^.Message and not (gm_Up or gm_Down);
+    HHGear^.State := HHGear^.State or gstNotKickable;
+    Gear^.doStep := @doStepFlamethrowerWork
+end;
+
+
--- a/hedgewars/GearDrawing.inc	Tue May 18 13:09:57 2010 +0000
+++ b/hedgewars/GearDrawing.inc	Wed May 19 02:10:28 2010 +0000
@@ -291,6 +291,7 @@
                     end;
                 defaultPos:= false
                 end;
+            gtFlamethrower: DrawRotated(sprHandFlamethrower, hx, hy, hwSign(Gear^.dX), aangle);
         end;
 
         case CurAmmoGear^.Kind of
@@ -403,6 +404,7 @@
                                   LongInt(leftX)+WorldDx)
                 end;
             amBee: DrawRotatedF(sprHandBee, hx, hy, (RealTicks div 125) mod 4, hwSign(Gear^.dX), aangle);
+            amFlamethrower: DrawRotated(sprHandFlamethrower, hx, hy, hwSign(Gear^.dX), aangle);
         end;
 
         case amt of
@@ -645,7 +647,7 @@
     case Gear^.Kind of
        gtAmmo_Bomb: DrawRotated(sprBomb, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, Gear^.DirAngle);
        gtGasBomb: DrawRotated(sprCheese, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, Gear^.DirAngle);
-    gtMolotov: DrawRotated(sprMolotov, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, Gear^.DirAngle);
+       gtMolotov: DrawRotated(sprMolotov, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, Gear^.DirAngle);
 
        gtRCPlane: begin
                   if (Gear^.Tag = -1) then
--- a/hedgewars/HHHandlers.inc	Tue May 18 13:09:57 2010 +0000
+++ b/hedgewars/HHHandlers.inc	Wed May 19 02:10:28 2010 +0000
@@ -220,6 +220,7 @@
                                FollowGear:= AddGear(TargetPoint.X, 0, gtPiano, 0, _0, _0, 0);
                                PauseMusic
                                end;
+                      amFlamethrower: CurAmmoGear:= AddGear(hwRound(X), hwRound(Y), gtFlamethrower,  0, xx * _0_5, yy * _0_5, 0);
                   end;
 
         uStats.AmmoUsed(Ammo^[CurSlot, CurAmmo].AmmoType);
--- a/hedgewars/uAIAmmoTests.pas	Tue May 18 13:09:57 2010 +0000
+++ b/hedgewars/uAIAmmoTests.pas	Wed May 19 02:10:28 2010 +0000
@@ -96,7 +96,8 @@
             (proc: nil;              flags: 0), // amPortalGun
             (proc: nil;              flags: 0), // amPiano
             (proc: @TestGrenade;     flags: 0), // amGasBomb
-            (proc: @TestShotgun;     flags: 0)  // amSineGun
+            (proc: @TestShotgun;     flags: 0), // amSineGun
+            (proc: nil;              flags: 0)  // amFlamethrower
             );
 
 const BadTurn = Low(LongInt) div 4;
--- a/hedgewars/uConsts.pas	Tue May 18 13:09:57 2010 +0000
+++ b/hedgewars/uConsts.pas	Wed May 19 02:10:28 2010 +0000
@@ -73,7 +73,7 @@
             sprHandDynamite, sprHandHellish, sprHandMine, sprHandSeduction, sprHandVamp,
             sprBigExplosion, sprSmokeRing, sprBeeTrace, sprEgg, sprTargetBee, sprHandBee, 
             sprFeather, sprPiano, sprHandSineGun, sprPortalGun, sprPortal,
-            sprCheese, sprHandCheese
+            sprCheese, sprHandCheese, sprHandFlamethrower
             );
     
     // Gears that interact with other Gears and/or Land
@@ -86,7 +86,7 @@
             gtWhip, gtKamikaze, gtCake, gtSeduction, gtWatermelon, gtMelonPiece, // 34
             gtHellishBomb, gtWaterUp, gtDrill, gtBallGun, gtBall, gtRCPlane, // 40
             gtSniperRifleShot, gtJetpack, gtMolotov, gtExplosives, gtBirdy, // 45
-            gtEgg, gtPortal, gtPiano, gtGasBomb, gtSineGunShot); // 50
+            gtEgg, gtPortal, gtPiano, gtGasBomb, gtSineGunShot, gtFlamethrower); // 51
 
     // Gears that are _only_ of visual nature (e.g. background stuff, visual effects, speechbubbles, etc.)
     TVisualGearType = (vgtFlake, vgtCloud, vgtExplPart, vgtExplPart2, vgtFire,
@@ -127,7 +127,7 @@
             amSeduction, amWatermelon, amHellishBomb, amNapalm, amDrill, amBallgun,
             amRCPlane, amLowGravity, amExtraDamage, amInvulnerable, amExtraTime,
             amLaserSight, amVampiric, amSniperRifle, amJetpack, amMolotov, amBirdy, amPortalGun,
-            amPiano, amGasBomb, amSineGun);
+            amPiano, amGasBomb, amSineGun, amFlamethrower);
 
     THWFont = (fnt16, fntBig, fntSmall, CJKfnt16, CJKfntBig, CJKfntSmall);
 
@@ -749,11 +749,13 @@
             (FileName:  'amPortalGun'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
             Width: 128; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false), // sprPortalGun
             (FileName:  'Portal'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false),// sprPortal
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false), // sprPortal
             (FileName:  'cheese'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false),// sprCheese
+            Width:  16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false), // sprCheese
             (FileName:  'amCheese'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false) // sprHandCheese
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false), // sprHandCheese
+            (FileName:  'amFlamethrower'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false)  // sprHandFlamethrower
             );
 
     Wavez: array [TWave] of record
@@ -1905,7 +1907,7 @@
                 Pos: 0;
                 AmmoType: amPortalGun;
                 AttackVoice: sndNone);
-            Slot: 2;
+            Slot: 6;
             TimeAfterTurn: 0;
             minAngle: 0;
             maxAngle: 0;
@@ -1982,6 +1984,28 @@
             isDamaging: true;
             SkipTurns: 0;
             PosCount: 1;
+            PosSprite: sprWater),
+
+// Flamethrower
+            (NameId: sidFlamethrower;
+            NameTex: nil;
+            Probability: 20;
+            NumberInCase: 1;
+            Ammo: (Propz:  ammoprop_ForwMsgs or ammoprop_DontHold;
+                Count: 1;
+                InitialCount: 1;
+                NumPerTurn: 0;
+                Timer: 5001;
+                Pos: 0;
+                AmmoType: amFlamethrower;
+                AttackVoice: sndNone);
+            Slot: 2;
+            TimeAfterTurn: 0;
+            minAngle: 0;
+            maxAngle: 0;
+            isDamaging: true;
+            SkipTurns: 0;
+            PosCount: 1;
             PosSprite: sprWater)
             );
 
--- a/hedgewars/uGears.pas	Tue May 18 13:09:57 2010 +0000
+++ b/hedgewars/uGears.pas	Wed May 19 02:10:28 2010 +0000
@@ -182,7 +182,8 @@
             @doStepPortalShot,
             @doStepPiano,
             @doStepBomb,
-            @doStepSineGunShot
+            @doStepSineGunShot,
+            @doStepFlamethrower
             );
 
 procedure InsertGearToList(Gear: PGear);
@@ -483,6 +484,9 @@
                 gear^.Radius:= 5;
                 gear^.Health:= 6000;
                 end;
+gtFlamethrower: begin
+                gear^.Timer:= 5001;
+                end;
      end;
 InsertGearToList(gear);
 AddGear:= gear;
--- a/hedgewars/uLocale.pas	Tue May 18 13:09:57 2010 +0000
+++ b/hedgewars/uLocale.pas	Wed May 19 02:10:28 2010 +0000
@@ -29,7 +29,7 @@
             sidHellishBomb, sidDrill, sidBallgun, sidNapalm, sidRCPlane,
             sidLowGravity, sidExtraDamage, sidInvulnerable, sidExtraTime,
             sidLaserSight, sidVampiric, sidSniperRifle, sidJetpack,
-            sidMolotov, sidBirdy, sidPortalGun, sidPiano, sidGasBomb, sidSineGun);
+            sidMolotov, sidBirdy, sidPortalGun, sidPiano, sidGasBomb, sidSineGun, sidFlamethrower);
 
     TMsgStrId = (sidStartFight, sidDraw, sidWinner, sidVolume, sidPaused,
             sidConfirm, sidSuddenDeath, sidRemaining, sidFuel, sidSync,
Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos.png has changed
Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos_bw.png has changed
Binary file share/hedgewars/Data/Graphics/Hedgehog/amFlamethrower.png has changed
--- a/share/hedgewars/Data/Locale/en.txt	Tue May 18 13:09:57 2010 +0000
+++ b/share/hedgewars/Data/Locale/en.txt	Wed May 19 02:10:28 2010 +0000
@@ -46,6 +46,7 @@
 00:43=Piano Strike
 00:44=Old Limburger
 00:45=Sine Gun
+00:46=Flamethrower
 
 01:00=Let's fight!
 01:01=Round draw
--- a/share/hedgewars/Data/Missions/Training/Bazooka.lua	Tue May 18 13:09:57 2010 +0000
+++ b/share/hedgewars/Data/Missions/Training/Bazooka.lua	Wed May 19 02:10:28 2010 +0000
@@ -21,7 +21,8 @@
 	["es"] = "Entrenamiento con bazuca",
 	["pl"] = "Trening bazooki",
 	["pt_PT"] = "Treino com Bazuca",
-	["pt_BR"] = "Treino com a Bazuca"
+	["pt_BR"] = "Treino com a Bazuca",
+	["sv"] = "Bazookaträning"
 	-- To add other languages, just add lines similar to the
 	-- existing ones - don't forget the trailing ","!
 	}
@@ -32,7 +33,8 @@
 	["es"] = "Practica tu puntería",
 	["pl"] = "Potrenuj celność",
 	["pt_PT"] = "Pratica a tua pontaria",
-	["pt_BR"] = "Pratique a sua pontaria"
+	["pt_BR"] = "Pratique a sua pontaria",
+	["sv"] = "Siktesövning"
 	}
 
 local goal = {
@@ -41,7 +43,8 @@
 	["es"] = "Destruye todos los objetivos antes de que se agote el tiempo.|La munición en esta misión es ilimitada.",
 	["pl"] = "Zniszcz wszystkie cele zanim upłynie czas.|W tej misji masz nieskończoną ilość amunicji.",
 	["pt_PT"] = "Destrói todos os alvos antes do tempo terminar.|Tens munições infinitas para esta missão.",
-	["pt_BR"] = "Destrua todos os alvos antes que o tempo acabe.|Você tem munição infinita para esta missão."
+	["pt_BR"] = "Destrua todos os alvos antes que o tempo acabe.|Você tem munição infinita para esta missão.",
+	["sv"] = "Förstör alla målen innan din tid tar slut.|Du har obegränsad ammunition för deta uppdrag"
 	}
 
 local timeout = {
@@ -50,7 +53,8 @@
 	["es"] = "¡Oh, no, se te acabó el tiempo! ¿Por qué no lo intentas de nuevo?",
 	["pl"] = "Ajajaj! Koniec czasu! Spróbuj jeszcze raz.",
 	["pt_PT"] = "Oh não! Acabou o tempo! Tenta novamente.",
-	["pt_BR"] = "Oh não! O tempo acabou! Tente novamente."
+	["pt_BR"] = "Oh não! O tempo acabou! Tente novamente.",
+	["sv"] = "Åh nej! Tiden är ute! Pröva igen."
 	}
 
 local success = {
@@ -59,7 +63,8 @@
 	["es"] = "¡Felicidades! Has destruido todos los objectivos|dentro del tiempo establecido.",
 	["pl"] = "Gratulacje! Zniszczyłeś wszystkie cele przed upłynięciem czasu.",
 	["pt_PT"] = "Parabéns! Eliminaste todos os alvos|dentro do tempo limite.",
-	["pt_BR"] = "Parabéns! Você eliminou todos os alvos|dentro do tempo limite."
+	["pt_BR"] = "Parabéns! Você eliminou todos os alvos|dentro do tempo limite.",
+	["sv"] = "Grattis! Du har förstört alla målen inom den|tillåtna tidsramen."
 	}
 
 local teamname = {
@@ -68,7 +73,8 @@
 	["es"] = "Bazuqueros",
 	["pl"] = "Bazookinierzy",
 	["pt_PT"] = "Bazuqueiros",
-	["pt_BR"] = "Bazuqueiros"
+	["pt_BR"] = "Bazuqueiros",
+	["sv"] = "Bazookalaget"
 	}
 
 local hogname = {
@@ -77,7 +83,8 @@
 	["es"] = "Artillero",
 	["pl"] = "Strzelec",
 	["pt_PT"] = "Comando",
-	["pt_BR"] = "Artilheiro"
+	["pt_BR"] = "Artilheiro",
+	["sv"] = "Jägare"
 	}
 
 -- To handle missing texts we define a small wrapper function that
--- a/share/hedgewars/Data/Missions/Training/Shotgun.lua	Tue May 18 13:09:57 2010 +0000
+++ b/share/hedgewars/Data/Missions/Training/Shotgun.lua	Wed May 19 02:10:28 2010 +0000
@@ -21,7 +21,8 @@
 	["es"] = "Entrenamiento con escopeta",
 	["pl"] = "Trening strzelecki",
 	["pt_PT"] = "Treino com Caçadeira",
-	["pt_BR"] = "Treino com a Escopeta"
+	["pt_BR"] = "Treino com a Escopeta",
+	["sv"] = "Hagelgevärsträning"
 	-- To add other languages, just add lines similar to the
 	-- existing ones - don't forget the trailing ","!
 	}
@@ -32,7 +33,8 @@
 	["es"] = "Practica tu puntería",
 	["pl"] = "Potrenuj celność",
 	["pt_PT"] = "Pratica a tua pontaria",
-	["pt_BR"] = "Pratique a sua pontaria"
+	["pt_BR"] = "Pratique a sua pontaria",
+	["sv"] = "Siktesövning"
 	}
 
 local goal = {
@@ -41,7 +43,8 @@
 	["es"] = "Destruye todos los objetivos antes de que se agote el tiempo.|La munición en esta misión es ilimitada.",
 	["pl"] = "Zniszcz wszystkie cele zanim upłynie czas.|W tej misji masz nieskończoną ilość amunicji.",
 	["pt_PT"] = "Destrói todos os alvos antes do tempo terminar.|Tens munições infinitas para esta missão.",
-	["pt_BR"] = "Destrua todos os alvos antes que o tempo acabe.|Você tem munição infinita para esta missão."
+	["pt_BR"] = "Destrua todos os alvos antes que o tempo acabe.|Você tem munição infinita para esta missão.",
+	["sv"] = "Förstör alla målen innan din tid tar slut.|Du har obegränsad ammunition för deta uppdrag"
 	}
 
 local timeout = {
@@ -50,7 +53,8 @@
 	["es"] = "¡Oh, no, se te acabó el tiempo! ¿Por qué no lo intentas de nuevo?",
 	["pl"] = "Ajajaj! Koniec czasu! Spróbuj jeszcze raz.",
 	["pt_PT"] = "Oh não! Acabou o tempo! Tenta novamente.",
-	["pt_BR"] = "Oh não! O tempo acabou! Tente novamente."
+	["pt_BR"] = "Oh não! O tempo acabou! Tente novamente.",
+	["sv"] = "Åh nej! Tiden är ute! Pröva igen."
 	}
 
 local success = {
@@ -59,7 +63,8 @@
 	["es"] = "¡Felicidades! Has destruido todos los objectivos|dentro del tiempo establecido.",
 	["pl"] = "Gratulacje! Zniszczyłeś wszystkie cele przed upłynięciem czasu.",
 	["pt_PT"] = "Parabéns! Eliminaste todos os alvos|dentro do tempo limite.",
-	["pt_BR"] = "Parabéns! Você eliminou todos os alvos|dentro do tempo limite."
+	["pt_BR"] = "Parabéns! Você eliminou todos os alvos|dentro do tempo limite.",
+	["sv"] = "Grattis! Du har förstört alla målen inom den|tillåtna tidsramen."
 	}
 
 local teamname = {
@@ -68,7 +73,8 @@
 	["es"] = "Escopeteros",
 	["pl"] = "Shotgun Team",
 	["pt_PT"] = "Caçadores",
-	["pt_PT"] = "Carabineiros"
+	["pt_PT"] = "Carabineiros",
+	["sv"] = "Hagelgevärslaget"
 	}
 
 local hogname = {
@@ -78,6 +84,7 @@
 	["pl"] = "Strzelec",
 	["pt_PT"] = "Comando",
 	["pt_BR"] = "Caçador",
+	["sv"] = "Jägare"
 	}
 
 -- To handle missing texts we define a small wrapper function that
--- a/share/hedgewars/Data/Missions/Training/SniperRifle.lua	Tue May 18 13:09:57 2010 +0000
+++ b/share/hedgewars/Data/Missions/Training/SniperRifle.lua	Wed May 19 02:10:28 2010 +0000
@@ -21,7 +21,8 @@
 	["es"] = "Entrenamiento con rifle francotirador",
 	["pl"] = "Trening Snajperski",
 	["pt_PT"] = "Treino com Sniper",
-	["pt_BR"] = "Treino com o Rifle Sniper"
+	["pt_BR"] = "Treino com o Rifle Sniper",
+	["sv"] = "Prickskyttesträning"
 	-- To add other languages, just add lines similar to the
 	-- existing ones - don't forget the trailing ","!
 	}
@@ -32,7 +33,8 @@
 	["es"] = "Practica tu puntería",
 	["pl"] = "Potrenuj celność",
 	["pt_PT"] = "Pratica a tua pontaria",
-	["pt_BR"] = "Pratique a sua pontaria"
+	["pt_BR"] = "Pratique a sua pontaria",
+	["sv"] = "Siktesövning"
 	}
 
 local goal = {
@@ -41,7 +43,8 @@
 	["es"] = "Destruye todos los objetivos antes de que se agote el tiempo.|La munición en esta misión es ilimitada.",
 	["pl"] = "Zniszcz wszystkie cele zanim upłynie czas.|W tej misji masz nieskończoną ilość amunicji.",
 	["pt_PT"] = "Destrói todos os alvos antes do tempo terminar.|Tens munições infinitas para esta missão.",
-	["pt_BR"] = "Destrua todos os alvos antes que o tempo acabe.|Você tem munição infinita para esta missão."
+	["pt_BR"] = "Destrua todos os alvos antes que o tempo acabe.|Você tem munição infinita para esta missão.",
+	["sv"] = "Förstör alla målen innan din tid tar slut.|Du har obegränsad ammunition för deta uppdrag"
 	}
 
 local timeout = {
@@ -50,7 +53,8 @@
 	["es"] = "¡Oh, no, se te acabó el tiempo! ¿Por qué no lo intentas de nuevo?",
 	["pl"] = "Ajajaj! Koniec czasu! Spróbuj jeszcze raz.",
 	["pt_PT"] = "Oh não! Acabou o tempo! Tenta novamente.",
-	["pt_BR"] = "Oh não! O tempo acabou! Tente novamente."
+	["pt_BR"] = "Oh não! O tempo acabou! Tente novamente.",
+	["sv"] = "Åh nej! Tiden är ute! Pröva igen."
 	}
 
 local success = {
@@ -59,7 +63,8 @@
 	["es"] = "¡Felicidades! Has destruido todos los objectivos|dentro del tiempo establecido.",
 	["pl"] = "Gratulacje! Zniszczyłeś wszystkie cele przed upłynięciem czasu.",
 	["pt_PT"] = "Parabéns! Eliminaste todos os alvos|dentro do tempo limite.",
-	["pt_BR"] = "Parabéns! Você eliminou todos os alvos|dentro do tempo limite."
+	["pt_BR"] = "Parabéns! Você eliminou todos os alvos|dentro do tempo limite.",
+	["sv"] = "Grattis! Du har förstört alla målen inom den|tillåtna tidsramen."
 	}
 
 local teamname = {
@@ -67,7 +72,8 @@
 	["de"] = "Heckenschützen",
 	["es"] = "Fusileros",
 	["pl"] = "Snajperzy",
-	["pt_BR"] = "Franco-Atiradores"
+	["pt_BR"] = "Franco-Atiradores",
+	["sv"] = "Prickskyttarna"
 	}
 
 local hogname = {
@@ -76,7 +82,8 @@
 	["es"] = "Francotirador",
 	["pl"] = "Strzelec",
 	["pt_PT"] = "Comando",
-	["pt_BR"] = "Caçador"
+	["pt_BR"] = "Caçador",
+	["sv"] = "Jägare"
 	}
 
 -- To handle missing texts we define a small wrapper function that