merge
authornemo
Wed, 11 Jul 2018 18:36:21 -0400
changeset 13483 e1543ad2fac9
parent 13476 c265a3e6f6da (diff)
parent 13482 7f3289a239dd (current diff)
child 13485 c85b324c4c2d
merge
--- a/ChangeLog.txt	Mon Jul 09 20:59:08 2018 +0300
+++ b/ChangeLog.txt	Wed Jul 11 18:36:21 2018 -0400
@@ -2,6 +2,8 @@
 * bugfixes
 ====================== 0.9.25 ======================
 Game:
+ + Add new key to show mission panel (default: M)
+ + Add chat command “/help”, displays help for chat commands
  * Fix extreme amounts of droplets when shooting with minigun into ocean world edge
  * Fix hog being unable to walk after using sniper rifle without firing both shots
  * Fix teleport tooltip claiming it doesn't end turn in hog placing phase with inf. attack
@@ -26,19 +28,33 @@
  * Don't play “Missed” and “Laugh” taunt when those don't make sense
  * Fix retreat timer not turning red for some weapons
 
-Space Invation:
+Space Invasion:
  + Display round score in a separate row
  + Keep round score displayed after round ends, remove round score announcer message
  * Fix rare Lua error message spam at end of game
  * Fix round score and other info numbers messing up after screen resize
 
+A Classic Fairytale:
+ * Fix clan membership of princess in some missions
+ * Mission 5: Tribe was not in same clan as Natives, screwing up stats a bit
+
+A Space Adventure:
+ * Fix clan membership of PAotH in main Death Planet mission
+
+Content:
+ + New Sudden Death water texture for CrazyMission theme
+ + Add dust flakes for Cheese and CrazyMission themes
+
 Lua API:
  + New call: Retreat(time [, respectGetAwayTimeFactor): Force current turn into retreating mode
  + New call: GetAmmoTimer(gearUid, ammoType): Returns current set timer for given ammoType and hog gear in ms. Returns nil for non-timerable ammo
  + New call: EnableSwitchHog(): Enable hog switching
  + New call: GetAmmo(ammoType): Returns ammo configuration (corresponds to SetAmmo)
  + New parameter: SetAmmoTexts: 5th param. showExtra: Set to false to hide texts like “Not yet available”
+ + New parameter: ShowMission: 6th param. forceDisplay: Set to true to prevent this particular mission panel to be hidden manually by player
+ * Changed global: lfCurrentHog becomes lfCurHogCrate
  * Fixed variable: TotalRounds was -1 (instead of 0) in first real round after hog placement phase
+ * AI sometimes intentionally shot hedgehogs with aihDoesntMatter set
 
 ====================== 0.9.24.1 ====================
  * Fix crash when portable portal device is fired at reduced graphics quality
--- a/QTfrontend/binds.cpp	Mon Jul 09 20:59:08 2018 +0300
+++ b/QTfrontend/binds.cpp	Wed Jul 11 18:36:21 2018 -0400
@@ -67,8 +67,9 @@
     {"fullscr",   "f12",        QT_TRANSLATE_NOOP("binds", "change mode"),     NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Toggle fullscreen mode:")},
     {"capture",   "c",          QT_TRANSLATE_NOOP("binds", "capture"),         NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Take a screenshot:")},
     {"+speedup",  "s",          QT_TRANSLATE_NOOP("binds", "speed up replay"),         NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Demo replay:")},
+    {"+mission",  "m",          QT_TRANSLATE_NOOP("binds", "show mission information"), NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Heads-up display:")},
     //: This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen
-    {"rotmask",   "delete",     QT_TRANSLATE_NOOP("binds", "toggle team bars"), NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Heads-up display:")},
+    {"rotmask",   "delete",     QT_TRANSLATE_NOOP("binds", "toggle team bars"), NULL, NULL},
     {"rottags",   "home",       QT_TRANSLATE_NOOP("binds", "toggle hedgehog tags"), NULL, NULL},
 #ifdef VIDEOREC
     {"record",    "r",          QT_TRANSLATE_NOOP("binds", "record"),          NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Record video:")}
--- a/QTfrontend/binds.h	Mon Jul 09 20:59:08 2018 +0300
+++ b/QTfrontend/binds.h	Wed Jul 11 18:36:21 2018 -0400
@@ -22,9 +22,9 @@
 #include <QString>
 
 #ifdef VIDEOREC
-#define BINDS_NUMBER 49
+#define BINDS_NUMBER 50
 #else
-#define BINDS_NUMBER 48
+#define BINDS_NUMBER 49
 #endif
 
 struct BindAction
--- a/README.md	Mon Jul 09 20:59:08 2018 +0300
+++ b/README.md	Wed Jul 11 18:36:21 2018 -0400
@@ -63,8 +63,9 @@
 * Tab: Switch hedgehog (after activating the utility)
 * 1-5: Set weapon timer
 * F1-F10: Weapon shortcuts
+* M: Mission panel / game mode information. Hold pressed to display, release to hide
 * P: Pause, when playing offline, toggle automatic turn skipping when online
-* Esc: Quit with prompt (also shows mission panel)
+* Esc: Quit with prompt
 * T: Chat
 * U: Team chat
 
--- a/hedgewars/uAIAmmoTests.pas	Mon Jul 09 20:59:08 2018 +0300
+++ b/hedgewars/uAIAmmoTests.pas	Wed Jul 11 18:36:21 2018 -0400
@@ -1209,20 +1209,23 @@
             end;
 until fexit or (Y > cWaterLine);
 
-for i:= 0 to 5 do inc(valueResult, dmg[i]);
+for i:= 0 to 5 do
+    if dmg[i] <> BadTurn then
+        inc(valueResult, dmg[i]);
 t:= valueResult;
 ap.AttackPutX:= Targ.Point.X - 60;
 
 for i:= 0 to 3 do
-    begin
-    dec(t, dmg[i]);
-    inc(t, dmg[i + 6]);
-    if t > valueResult then
+    if dmg[i] <> BadTurn then
         begin
-        valueResult:= t;
-        ap.AttackPutX:= Targ.Point.X - 30 - cShift + i * 30
-        end
-    end;
+        dec(t, dmg[i]);
+        inc(t, dmg[i + 6]);
+        if t > valueResult then
+            begin
+            valueResult:= t;
+            ap.AttackPutX:= Targ.Point.X - 30 - cShift + i * 30
+            end
+        end;
 
 if valueResult <= 0 then
     valueResult:= BadTurn;
@@ -1309,7 +1312,7 @@
 
     //FillChar(cake, sizeof(cake), 0);
     cake.Radius:= 7;
-    cake.CollisionMask:= lfNotCurrentMask;
+    cake.CollisionMask:= lfNotCurHogCrate;
     cake.Hedgehog:= Me^.Hedgehog;
 
     // check left direction
--- a/hedgewars/uAIMisc.pas	Mon Jul 09 20:59:08 2018 +0300
+++ b/hedgewars/uAIMisc.pas	Wed Jul 11 18:36:21 2018 -0400
@@ -372,10 +372,10 @@
     if not CheckBounds(x, y, r) then
         exit(false);
 
-    if (Land[y-r, x-r] and lfNotCurrentMask <> 0) or
-       (Land[y+r, x-r] and lfNotCurrentMask <> 0) or
-       (Land[y+r, x-r] and lfNotCurrentMask <> 0) or
-       (Land[y+r, x+r] and lfNotCurrentMask <> 0) then
+    if (Land[y-r, x-r] and lfNotCurHogCrate <> 0) or
+       (Land[y+r, x-r] and lfNotCurHogCrate <> 0) or
+       (Land[y+r, x-r] and lfNotCurHogCrate <> 0) or
+       (Land[y+r, x+r] and lfNotCurHogCrate <> 0) then
        exit(true);
 
     TestColl:= false;
@@ -615,20 +615,22 @@
                 end
             end;
 
-if hadSkips and (rate = 0) then
+if hadSkips and (rate <= 0) then
     RealRateExplosion:= BadTurn
-    else
+else
     RealRateExplosion:= rate;
 end;
 
 function RateShove(Me: PGear; x, y, r, power, kick: LongInt; gdX, gdY: real; Flags: LongWord): LongInt;
 var i, fallDmg, dmg, rate, subrate: LongInt;
     dX, dY, pX, pY: real;
+    hadSkips: boolean;
 begin
 fallDmg:= 0;
 dX:= gdX * 0.01 * kick;
 dY:= gdY * 0.01 * kick;
 rate:= 0;
+hadSkips:= false;
 for i:= 0 to Pred(Targets.Count) do
     with Targets.ar[i] do
         if skip then
@@ -695,8 +697,14 @@
                     if abs(subrate) > 2000 then inc(Rate,subrate div 1024);
                     end
                 end
-            end;
-RateShove:= rate * 1024;
+            end
+        else
+            hadSkips:= true;
+
+if hadSkips and (rate <= 0) then
+    RateShove:= BadTurn
+else
+    RateShove:= rate * 1024;
 ResetTargets
 end;
 
@@ -799,25 +807,28 @@
                 end
             end;
 
-if hadSkips and (rate = 0) then
+if hadSkips and (rate <= 0) then
     RateShotgun:= BadTurn
-    else
+else
     RateShotgun:= rate * 1024;
-    ResetTargets;
+ResetTargets;
 end;
 
 function RateHammer(Me: PGear): LongInt;
 var x, y, i, r, rate: LongInt;
+    hadSkips: boolean;
 begin
 // hammer hit shift against attecker hog is 10
 x:= hwRound(Me^.X) + hwSign(Me^.dX) * 10;
 y:= hwRound(Me^.Y);
 rate:= 0;
-
+hadSkips:= false;
 for i:= 0 to Pred(Targets.Count) do
     with Targets.ar[i] do
          // hammer hit radius is 8, shift is 10
-      if matters and (Kind = gtHedgehog) and (abs(Point.x - x) + abs(Point.y - y) < 18) then
+      if (not matters) then
+          hadSkips:= true
+      else if matters and (Kind = gtHedgehog) and (abs(Point.x - x) + abs(Point.y - y) < 18) then
             begin
             r:= trunc(sqrt(sqr(Point.x - x)+sqr(Point.y - y)));
 
@@ -827,7 +838,11 @@
                 else
                     inc(rate, Score div 3 * friendlyfactor div 100)
             end;
-RateHammer:= rate * 1024;
+
+if hadSkips and (rate <= 0) then
+    RateHammer:= BadTurn
+else
+    RateHammer:= rate * 1024;
 end;
 
 function HHJump(Gear: PGear; JumpType: TJumpType; var GoInfo: TGoInfo): boolean;
@@ -927,7 +942,7 @@
 var pX, pY, tY: LongInt;
 begin
 HHGo:= false;
-Gear^.CollisionMask:= lfNotCurrentMask;
+Gear^.CollisionMask:= lfNotCurHogCrate;
 AltGear^:= Gear^;
 
 GoInfo.Ticks:= 0;
--- a/hedgewars/uChat.pas	Mon Jul 09 20:59:08 2018 +0300
+++ b/hedgewars/uChat.pas	Wed Jul 11 18:36:21 2018 -0400
@@ -512,6 +512,7 @@
 
     // debugging commands
     if (copy(s, 2, 7) = 'debugvl') then
+        // This command intentionally not documented in /help
         begin
         cViewLimitsDebug:= (not cViewLimitsDebug);
         UpdateViewLimits();
@@ -527,15 +528,59 @@
             if liveLua then
                 begin
                 AddFileLog('[Lua] chat input string parsing enabled');
-                AddChatString(#3 + 'Lua parsing: ON');
+                AddChatString(#3 + trmsg[sidLuaParsingOn]);
                 end
             else
                 begin
                 AddFileLog('[Lua] chat input string parsing disabled');
-                AddChatString(#3 + 'Lua parsing: OFF');
+                AddChatString(#3 + trmsg[sidLuaParsingOff]);
                 end;
             UpdateInputLinePrefix();
-            end;
+            end
+        else
+            AddChatString(#5 + trmsg[sidLuaParsingDenied]);
+        exit
+        end;
+
+    // Help commands
+    if (copy(s, 2, 11) = 'help taunts') then
+        begin
+        AddChatString(#3 + trcmd[sidCmdHeaderTaunts]);
+        AddChatString(#3 + trcmd[sidCmdSpeech]);
+        AddChatString(#3 + trcmd[sidCmdThink]);
+        AddChatString(#3 + trcmd[sidCmdYell]);
+        AddChatString(#3 + trcmd[sidCmdSpeechNumberHint]);
+        AddChatString(#3 + trcmd[sidCmdHsa]);
+        AddChatString(#3 + trcmd[sidCmdHta]);
+        AddChatString(#3 + trcmd[sidCmdHya]);
+        AddChatString(#3 + trcmd[sidCmdHurrah]);
+        AddChatString(#3 + trcmd[sidCmdIlovelotsoflemonade]);
+        AddChatString(#3 + trcmd[sidCmdJuggle]);
+        AddChatString(#3 + trcmd[sidCmdRollup]);
+        AddChatString(#3 + trcmd[sidCmdShrug]);
+        AddChatString(#3 + trcmd[sidCmdWave]);
+        exit
+        end;
+
+    if (copy(s, 2, 4) = 'help') then
+        begin
+        AddChatString(#3 + trcmd[sidCmdHeaderBasic]);
+        if gameType = gmtNet then
+            AddChatString(#3 + trcmd[sidCmdPauseNet])
+        else
+            AddChatString(#3 + trcmd[sidCmdPause]);
+        AddChatString(#3 + trcmd[sidCmdFullscreen]);
+        AddChatString(#3 + trcmd[sidCmdQuit]);
+        if gameType <> gmtNet then
+            AddChatString(#3 + trcmd[sidLua]);
+        // history and help commands needs to be close to the end because they are always visible
+        // with a short chat history length.
+        AddChatString(#3 + trcmd[sidCmdTeam]);
+        AddChatString(#3 + trcmd[sidCmdMe]);
+        AddChatString(#3 + trcmd[sidCmdTogglechat]);
+        AddChatString(#3 + trcmd[sidCmdHistory]);
+        AddChatString(#3 + trcmd[sidCmdHelp]);
+        AddChatString(#3 + trcmd[sidCmdHelpTaunts]);
         exit
         end;
 
--- a/hedgewars/uCollisions.pas	Mon Jul 09 20:59:08 2018 +0300
+++ b/hedgewars/uCollisions.pas	Wed Jul 11 18:36:21 2018 -0400
@@ -341,10 +341,10 @@
 var x, y, i: LongInt;
 begin
 // Special case to emulate the old intersect gear clearing, but with a bit of slop for pixel overlap
-if (Gear^.CollisionMask = lfNotCurrentMask) and (Gear^.Kind <> gtHedgehog) and (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) and
+if (Gear^.CollisionMask = lfNotCurHogCrate) and (Gear^.Kind <> gtHedgehog) and (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) and
     ((hwRound(Gear^.Hedgehog^.Gear^.X) + Gear^.Hedgehog^.Gear^.Radius + 16 < hwRound(Gear^.X) - Gear^.Radius) or
      (hwRound(Gear^.Hedgehog^.Gear^.X) - Gear^.Hedgehog^.Gear^.Radius - 16 > hwRound(Gear^.X) + Gear^.Radius)) then
-    Gear^.CollisionMask:= $FFFF;
+    Gear^.CollisionMask:= lfAll;
 
 x:= hwRound(Gear^.X);
 if Dir < 0 then
@@ -370,10 +370,10 @@
 var x, y, i: LongInt;
 begin
 // Special case to emulate the old intersect gear clearing, but with a bit of slop for pixel overlap
-if (Gear^.CollisionMask = lfNotCurrentMask) and (Gear^.Kind <> gtHedgehog) and (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) and
+if (Gear^.CollisionMask = lfNotCurHogCrate) and (Gear^.Kind <> gtHedgehog) and (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) and
     ((hwRound(Gear^.Hedgehog^.Gear^.Y) + Gear^.Hedgehog^.Gear^.Radius + 16 < hwRound(Gear^.Y) - Gear^.Radius) or
      (hwRound(Gear^.Hedgehog^.Gear^.Y) - Gear^.Hedgehog^.Gear^.Radius - 16 > hwRound(Gear^.Y) + Gear^.Radius)) then
-    Gear^.CollisionMask:= $FFFF;
+    Gear^.CollisionMask:= lfAll;
 
 y:= hwRound(Gear^.Y);
 if Dir < 0 then
@@ -417,7 +417,7 @@
             begin
             if Land[y, x] and Gear^.CollisionMask <> 0 then
                 begin
-                if Land[y, x] and Gear^.CollisionMask > 255 then
+                if ((Land[y, x] and Gear^.CollisionMask) and lfNotObjMask) <> 0 then
                     exit(Land[y, x] and Gear^.CollisionMask)
                 else
                     pixel:= Land[y, x] and Gear^.CollisionMask;
@@ -483,7 +483,7 @@
     if (x and LAND_WIDTH_MASK) = 0 then
         if Land[y, x] > 0 then
             begin
-            if Land[y, x] and Gear^.CollisionMask > 255 then
+            if ((Land[y, x] and Gear^.CollisionMask) and lfNotObjMask) <> 0 then
                 exit(Land[y, x] and Gear^.CollisionMask)
             else // if Land[y, x] <> 0 then
                 pixel:= Land[y, x] and Gear^.CollisionMask;
@@ -558,7 +558,7 @@
     i:= y + Gear^.Radius * 2 - 2;
     repeat
         if (y and LAND_HEIGHT_MASK) = 0 then
-            if Land[y, x] and Gear^.CollisionMask > 255 then
+            if ((Land[y, x] and Gear^.CollisionMask) and lfNotObjMask) <> 0 then
                 exit(Land[y, x] and Gear^.CollisionMask);
     inc(y)
     until (y > i);
@@ -581,7 +581,7 @@
     i:= x + Gear^.Radius * 2 - 2;
     repeat
         if (x and LAND_WIDTH_MASK) = 0 then
-            if Land[y, x] and Gear^.CollisionMask > 255 then
+            if ((Land[y, x] and Gear^.CollisionMask) and lfNotObjMask) <> 0 then
                 exit(Land[y, x] and Gear^.CollisionMask);
     inc(x)
     until (x > i);
@@ -897,7 +897,7 @@
     i:= x + Gear^.Radius * 2 - 2;
     repeat
     if (x and LAND_WIDTH_MASK) = 0 then
-        if Land[y, x] > 255 then
+        if (Land[y, x] and lfNotObjMask) <> 0 then
             if (not isColl) or (abs(x-gx) < abs(collX-gx)) then
                 begin
                 isColl:= true;
--- a/hedgewars/uCommandHandlers.pas	Mon Jul 09 20:59:08 2018 +0300
+++ b/hedgewars/uCommandHandlers.pas	Wed Jul 11 18:36:21 2018 -0400
@@ -834,6 +834,20 @@
   cAdvancedMapGenMode:= true;
 end;
 
+procedure chShowMission_p(var s: shortstring);
+begin
+  s:= s; // avoid compiler hint
+  isShowMission:= true;
+end;
+
+procedure chShowMission_m(var s: shortstring);
+begin
+  s:= s; // avoid compiler hint
+  isShowMission:= false;
+  if (not isForceMission) then
+    HideMission();
+end;
+
 procedure initModule;
 begin
 //////// Begin top sorted by freq analysis not including chatmsg
@@ -922,6 +936,8 @@
     RegisterVariable('record'  , @chRecord       , true );
     RegisterVariable('worldedge',@chWorldEdge    , false);
     RegisterVariable('advmapgen',@chAdvancedMapGenMode, false);
+    RegisterVariable('+mission', @chShowMission_p, true);
+    RegisterVariable('-mission', @chShowMission_m, true);
 end;
 
 procedure freeModule;
--- a/hedgewars/uConsts.pas	Mon Jul 09 20:59:08 2018 +0300
+++ b/hedgewars/uConsts.pas	Wed Jul 11 18:36:21 2018 -0400
@@ -120,8 +120,8 @@
     lfBouncy         = $0400;  // green
     lfLandMask       = $FF00;  // upper byte is used for terrain, not objects.
 
-    lfCurrentHog     = $0080;  // CurrentHog.  It is also used to flag crates, for convenience of AI.  Since an active hog would instantly collect the crate, this does not impact play
-    lfNotCurrentMask = $FF7F;  // inverse of above. frequently used
+    lfCurHogCrate    = $0080;  // CurrentHedgehog, and crates, for convenience of AI.  Since an active hog would instantly collect the crate, this does not impact playj
+    lfNotCurHogCrate = $FF7F;  // inverse of above. frequently used
     lfObjMask        = $007F;  // lower 7 bits used for hogs and explosives and mines 
     lfNotObjMask     = $FF80;  // inverse of above.
 
@@ -136,7 +136,9 @@
 
     // lower byte is for objects.
     // consists of 0-127 counted for object checkins and $80 as a bit flag for current hog.
-    lfAllObjMask     = $00FF;  // lfCurrentHog or lfObjMask
+    lfAllObjMask     = $00FF;  // lfCurHogCrate or lfObjMask
+
+    lfAll            = $FFFF;  // everything
 
 
 
--- a/hedgewars/uGearsHandlersMess.pas	Mon Jul 09 20:59:08 2018 +0300
+++ b/hedgewars/uGearsHandlersMess.pas	Wed Jul 11 18:36:21 2018 -0400
@@ -3635,7 +3635,7 @@
 begin
     AllInactive := false;
 
-    Gear^.CollisionMask:= lfNotCurrentMask;
+    Gear^.CollisionMask:= lfNotCurHogCrate;
 
     Gear^.dY:= cMaxWindSpeed * 100;
 
@@ -3832,7 +3832,7 @@
     end;
 
     tempColl:= Gear^.CollisionMask;
-    Gear^.CollisionMask:= $007F;
+    Gear^.CollisionMask:= lfObjMask;
     if (TestCollisionYWithGear(Gear, hwSign(Gear^.dY)) <> 0) or (TestCollisionXWithGear(Gear, hwSign(Gear^.dX)) <> 0) or (GameTicks > Gear^.FlightTime) then
         t := CheckGearsCollision(Gear)
     else t := nil;
@@ -3956,7 +3956,7 @@
         ry := rndSign(getRandomf * _0_1);
 
         ball:= AddGear(gx, gy, gtBall, 0, SignAs(AngleSin(HHGear^.Angle) * _0_8, HHGear^.dX) + rx, AngleCos(HHGear^.Angle) * ( - _0_8) + ry, 0);
-        ball^.CollisionMask:= lfNotCurrentMask;
+        ball^.CollisionMask:= lfNotCurHogCrate;
 
         PlaySound(sndGun);
         end;
@@ -5442,7 +5442,7 @@
             flame:= AddGear(gx, gy, gtFlame, gstTmpFlag,
                     SignAs(AngleSin(HHGear^.Angle) * speed, HHGear^.dX) + rx,
                     AngleCos(HHGear^.Angle) * ( - speed) + ry, 0);
-            flame^.CollisionMask:= lfNotCurrentMask;
+            flame^.CollisionMask:= lfNotCurHogCrate;
             //flame^.FlightTime:= 500;  use the default huge value to avoid sticky flame suddenly being damaging as opposed to other flames
 
             if (Gear^.Health mod 30) = 0 then
@@ -5450,7 +5450,7 @@
                 flame:= AddGear(gx, gy, gtFlame, 0,
                         SignAs(AngleSin(HHGear^.Angle) * speed, HHGear^.dX) + rx,
                         AngleCos(HHGear^.Angle) * ( - speed) + ry, 0);
-                flame^.CollisionMask:= lfNotCurrentMask;
+                flame^.CollisionMask:= lfNotCurHogCrate;
 		//flame^.FlightTime:= 500;
                 end
             end;
@@ -5534,7 +5534,7 @@
         land:= AddGear(gx, gy, gtFlake, gstTmpFlag,
                 SignAs(AngleSin(HHGear^.Angle) * speed, HHGear^.dX) + rx,
                 AngleCos(HHGear^.Angle) * ( - speed) + ry, 0);
-        land^.CollisionMask:= lfNotCurrentMask;
+        land^.CollisionMask:= lfNotCurHogCrate;
 
         Gear^.Timer:= Gear^.Tag
         end;
@@ -6588,7 +6588,7 @@
 var   a: real;
 begin
     // Gear is shrunk so it can actually escape the hog without carving into the terrain
-    if (Gear^.Radius = 4) and (Gear^.CollisionMask = $FFFF) then Gear^.Radius:= 7;
+    if (Gear^.Radius = 4) and (Gear^.CollisionMask = lfAll) then Gear^.Radius:= 7;
     if Gear^.Damage > 100 then Gear^.CollisionMask:= 0
     else if Gear^.Damage > 30 then
         if GetRandom(max(4,18-Gear^.Damage div 10)) < 3 then Gear^.CollisionMask:= 0;
@@ -6851,7 +6851,7 @@
         ry := rndSign(getRandomf * _0_2);
 
         bullet:= AddGear(gx, gy, gtMinigunBullet, 0, SignAs(AngleSin(HHGear^.Angle) * _0_8, HHGear^.dX) + rx, AngleCos(HHGear^.Angle) * ( - _0_8) + ry, 0);
-        bullet^.CollisionMask:= lfNotCurrentMask;
+        bullet^.CollisionMask:= lfNotCurHogCrate;
         bullet^.WDTimer := Gear^.WDTimer;
         Inc(Gear^.WDTimer);
 
--- a/hedgewars/uGearsHandlersRope.pas	Mon Jul 09 20:59:08 2018 +0300
+++ b/hedgewars/uGearsHandlersRope.pas	Wed Jul 11 18:36:21 2018 -0400
@@ -497,7 +497,7 @@
         end;
 
     if Gear^.Elasticity < _20 then Gear^.CollisionMask:= lfLandMask
-    else Gear^.CollisionMask:= lfNotCurrentMask; //lfNotObjMask or lfNotHHObjMask;
+    else Gear^.CollisionMask:= lfNotCurHogCrate; //lfNotObjMask or lfNotHHObjMask;
     CheckCollision(Gear);
 
     if (Gear^.State and gstCollision) <> 0 then
--- a/hedgewars/uGearsHedgehog.pas	Mon Jul 09 20:59:08 2018 +0300
+++ b/hedgewars/uGearsHedgehog.pas	Wed Jul 11 18:36:21 2018 -0400
@@ -493,7 +493,7 @@
                 newGear^.Target.X:= TargetPoint.X;
                 newGear^.Target.Y:= TargetPoint.Y
                 end;
-            if (newGear <> nil) and (newGear^.CollisionMask and lfCurrentHog <> 0) then newGear^.CollisionMask:= newGear^.CollisionMask and (not lfCurrentHog);
+            if (newGear <> nil) and (newGear^.CollisionMask and lfCurHogCrate <> 0) then newGear^.CollisionMask:= newGear^.CollisionMask and (not lfCurHogCrate);
 
             // Clear FollowGear if using on a rope/parachute/saucer etc so focus stays with the hog's movement
             if altUse then
--- a/hedgewars/uGearsList.pas	Mon Jul 09 20:59:08 2018 +0300
+++ b/hedgewars/uGearsList.pas	Wed Jul 11 18:36:21 2018 -0400
@@ -204,7 +204,7 @@
 gear^.Density:= _1;
 // Define ammo association, if any.
 gear^.AmmoType:= GearKindAmmoTypeMap[Kind];
-gear^.CollisionMask:= $FFFF;
+gear^.CollisionMask:= lfAll;
 gear^.Tint:= $FFFFFFFF;
 gear^.Data:= nil;
 
@@ -212,7 +212,7 @@
     begin
     gear^.Hedgehog:= CurrentHedgehog;
     if (CurrentHedgehog^.Gear <> nil) and (hwRound(CurrentHedgehog^.Gear^.X) = X) and (hwRound(CurrentHedgehog^.Gear^.Y) = Y) then
-        gear^.CollisionMask:= lfNotCurrentMask
+        gear^.CollisionMask:= lfNotCurHogCrate
     end;
 
 if (Ammoz[Gear^.AmmoType].Ammo.Propz and ammoprop_NeedTarget <> 0) then
@@ -414,7 +414,7 @@
                 RopePoints.Count:= 0;
                 gear^.Tint:= $D8D8D8FF;
                 gear^.Tag:= 0; // normal rope render
-                gear^.CollisionMask:= lfNotCurrentMask //lfNotObjMask or lfNotHHObjMask;
+                gear^.CollisionMask:= lfNotCurHogCrate //lfNotObjMask or lfNotHHObjMask;
                 end;
         gtMine: begin
                 gear^.ImpactSound:= sndMineImpact;
--- a/hedgewars/uInputHandler.pas	Mon Jul 09 20:59:08 2018 +0300
+++ b/hedgewars/uInputHandler.pas	Wed Jul 11 18:36:21 2018 -0400
@@ -357,6 +357,7 @@
     RegisterBind(DefaultBinds, _S'`', 'history');
     RegisterBind(DefaultBinds, 'delete', 'rotmask');
     RegisterBind(DefaultBinds, 'home', 'rottags');
+    RegisterBind(DefaultBinds, 'm', '+mission');
 
     //numpad
     //DefaultBinds[265]:= '+volup';
--- a/hedgewars/uLandGraphics.pas	Mon Jul 09 20:59:08 2018 +0300
+++ b/hedgewars/uLandGraphics.pas	Wed Jul 11 18:36:21 2018 -0400
@@ -236,12 +236,12 @@
     setCurrentHog:
         for i:= fromPix to toPix do
             begin
-            Land[y, i]:= Land[y, i] or lfCurrentHog
+            Land[y, i]:= Land[y, i] or lfCurHogCrate
             end;
     removeCurrentHog:
         for i:= fromPix to toPix do
             begin
-            Land[y, i]:= Land[y, i] and lfNotCurrentMask;
+            Land[y, i]:= Land[y, i] and lfNotCurHogCrate;
             end;
     end;
 end;
--- a/hedgewars/uLocale.pas	Mon Jul 09 20:59:08 2018 +0300
+++ b/hedgewars/uLocale.pas	Wed Jul 11 18:36:21 2018 -0400
@@ -102,6 +102,8 @@
                 trammod[TAmmoStrId(b)]:= s;
             5: if (b >=0) and (b <= ord(High(TGoalStrId))) then
                 trgoal[TGoalStrId(b)]:= s;
+            6: if (b >=0) and (b <= ord(High(TCmdHelpStrId))) then
+                trcmd[TCmdHelpStrId(b)]:= s;
            end;
        end;
    pfsClose(f);
--- a/hedgewars/uScript.pas	Mon Jul 09 20:59:08 2018 +0300
+++ b/hedgewars/uScript.pas	Wed Jul 11 18:36:21 2018 -0400
@@ -544,9 +544,13 @@
 end;
 
 function lc_showmission(L : Plua_State) : LongInt; Cdecl;
+var n: LongInt;
 begin
-    if CheckLuaParamCount(L, 5, 'ShowMission', 'caption, subcaption, text, icon, time') then
-        ShowMission(lua_tostringA(L, 1), lua_tostringA(L, 2), lua_tostringA(L, 3), Trunc(lua_tonumber(L, 4)), Trunc(lua_tonumber(L, 5)));
+    if CheckAndFetchParamCount(L, 5, 6, 'ShowMission', 'caption, subcaption, text, icon, time [, forceDisplay]', n) then
+        if n = 5 then
+            ShowMission(lua_tostringA(L, 1), lua_tostringA(L, 2), lua_tostringA(L, 3), Trunc(lua_tonumber(L, 4)), Trunc(lua_tonumber(L, 5)))
+        else
+            ShowMission(lua_tostringA(L, 1), lua_tostringA(L, 2), lua_tostringA(L, 3), Trunc(lua_tonumber(L, 4)), Trunc(lua_tonumber(L, 5)), lua_toboolean(L, 6));
     lc_showmission:= 0;
 end;
 
@@ -3922,7 +3926,7 @@
 ScriptSetInteger('lfBouncy'        , lfBouncy);
 
 ScriptSetInteger('lfLandMask'      , lfLandMask);
-ScriptSetInteger('lfCurrentHog'    , lfCurrentHog);
+ScriptSetInteger('lfCurHogCrate'   , lfCurHogCrate);
 ScriptSetInteger('lfHHMask'        , lfHHMask);
 ScriptSetInteger('lfNotHHObjMask'  , lfNotHHObjMask);
 ScriptSetInteger('lfAllObjMask'    , lfAllObjMask);
--- a/hedgewars/uTeams.pas	Mon Jul 09 20:59:08 2018 +0300
+++ b/hedgewars/uTeams.pas	Wed Jul 11 18:36:21 2018 -0400
@@ -290,7 +290,10 @@
         ResetWeapons;
         inc(TotalRounds)
         end
-    end;
+    end
+else
+    if TotalRounds <= -1 then
+        TotalRounds:= 0;
 
 inc(CurrentTeam^.Clan^.TurnNumber);
 with CurrentTeam^.Clan^ do
--- a/hedgewars/uTypes.pas	Mon Jul 09 20:59:08 2018 +0300
+++ b/hedgewars/uTypes.pas	Wed Jul 11 18:36:21 2018 -0400
@@ -479,7 +479,17 @@
             sidNotAvailableInSD, sidHealthGain, sidEmptyCrate, sidUnknownKey,
             sidWinner2, sidWinner3, sidWinner4, sidWinner5, sidWinner6,
             sidWinner7, sidWinnerAll, sidTeamGone, sidTeamBack, sidAutoSkip,
-            sidFPS);
+            sidFPS, sidLuaParsingOff, sidLuaParsingOn, sidLuaParsingDenied);
+
+    TCmdHelpStrId = (
+            sidCmdHeaderBasic, sidCmdTogglechat, sidCmdTeam, sidCmdMe,
+            sidCmdPause, sidCmdPauseNet, sidCmdFullscreen, sidCmdQuit,
+            sidCmdHelp, sidCmdHelpTaunts, sidCmdHistory, sidLua,
+
+            sidCmdHeaderTaunts, sidCmdSpeech, sidCmdThink, sidCmdYell,
+            sidCmdSpeechNumberHint, sidCmdHsa, sidCmdHta, sidCmdHya,
+            sidCmdHurrah, sidCmdIlovelotsoflemonade, sidCmdJuggle,
+            sidCmdRollup, sidCmdShrug, sidCmdWave);
 
     // Events that are important for the course of the game or at least interesting for other reasons
     TEventId = (eidDied, eidDrowned, eidRoundStart, eidRoundWin, eidRoundDraw,
--- a/hedgewars/uVariables.pas	Mon Jul 09 20:59:08 2018 +0300
+++ b/hedgewars/uVariables.pas	Wed Jul 11 18:36:21 2018 -0400
@@ -78,6 +78,8 @@
     isInMultiShoot  : boolean;
     isSpeed         : boolean;
     isAFK           : boolean;
+    isShowMission   : boolean;
+    isForceMission  : boolean;
     SpeedStart      : LongWord;
 
     fastUntilLag    : boolean;
@@ -2584,6 +2586,7 @@
     trluaammoe: array[TAmmoStrId] of boolean;   // whether to render extra text (Lua overwrite)
     trmsg:   array[TMsgStrId]  of ansistring;   // message of the event
     trgoal:  array[TGoalStrId] of ansistring;   // message of the goal
+    trcmd:   array[TCmdHelpStrId] of ansistring; // chat command help
     cTestLua : Boolean;
 
 procedure preInitModule;
@@ -2842,6 +2845,8 @@
     isInMultiShoot  := false;
     isSpeed         := false;
     isAFK           := false;
+    isShowMission   := false;
+    isForceMission  := false;
     SpeedStart      := 0;
     fastUntilLag    := false;
     fastScrolling   := false;
--- a/hedgewars/uWorld.pas	Mon Jul 09 20:59:08 2018 +0300
+++ b/hedgewars/uWorld.pas	Wed Jul 11 18:36:21 2018 -0400
@@ -31,6 +31,7 @@
 procedure DrawWorld(Lag: LongInt);
 procedure DrawWorldStereo(Lag: LongInt; RM: TRenderMode);
 procedure ShowMission(caption, subcaption, text: ansistring; icon, time : LongInt);
+procedure ShowMission(caption, subcaption, text: ansistring; icon, time : LongInt; forceDisplay : boolean);
 procedure HideMission;
 procedure SetAmmoTexts(ammoType: TAmmoType; name: ansistring; caption: ansistring; description: ansistring; autoLabels: boolean);
 procedure ShakeCamera(amount: LongInt);
@@ -1597,7 +1598,7 @@
     DrawTextureCentered(0, (cScreenHeight shr 1), PauseTexture);
 if isAFK then
     DrawTextureCentered(0, (cScreenHeight shr 1), AFKTexture);
-if not isFirstFrame and (missionTimer <> 0) or isPaused or fastUntilLag or (GameState = gsConfirm) then
+if not isFirstFrame and (missionTimer <> 0) or isShowMission or isPaused or fastUntilLag or (GameState = gsConfirm) then
     begin
     if (ReadyTimeLeft = 0) and (missionTimer > 0) then
         dec(missionTimer, Lag);
@@ -1606,6 +1607,8 @@
     if missionTex <> nil then
         DrawTextureCentered(0, Min((cScreenHeight shr 1) + 100, cScreenHeight - 48 - missionTex^.h), missionTex);
     end;
+if missionTimer = 0 then
+    isForceMission := false;
 
 // fps
 {$IFDEF USE_TOUCH_INTERFACE}
@@ -1941,6 +1944,11 @@
 end;
 
 procedure ShowMission(caption, subcaption, text: ansistring; icon, time : LongInt);
+begin
+    ShowMission(caption, subcaption, text, icon, time, false);
+end;
+
+procedure ShowMission(caption, subcaption, text: ansistring; icon, time : LongInt; forceDisplay : boolean);
 var r: TSDL_Rect;
 begin
 if cOnlyStats then exit;
@@ -1948,6 +1956,10 @@
 r.w:= 32;
 r.h:= 32;
 
+// If true, then mission panel cannot be hidden by releasing the mission panel key.
+// Is in effect until timer runs out, is hidden with HideMission or ShowMission is called with forceDisplay=false.
+isForceMission := forceDisplay;
+
 if time = 0 then
     time:= 5000;
 missionTimer:= time;
@@ -1970,6 +1982,7 @@
 procedure HideMission;
 begin
     missionTimer:= 0;
+    isForceMission:= false;
 end;
 
 procedure SetAmmoTexts(ammoType: TAmmoType; name: ansistring; caption: ansistring; description: ansistring; autoLabels: boolean);
--- a/share/hedgewars/Data/Locale/de.txt	Mon Jul 09 20:59:08 2018 +0300
+++ b/share/hedgewars/Data/Locale/de.txt	Wed Jul 11 18:36:21 2018 -0400
@@ -106,6 +106,9 @@
 01:38=%1 ist zurück.
 01:39=%1 hat den Zug automatisch übersprungen.
 01:40=%1 fps
+01:41=Lua-Parsing: AUS
+01:42=Lua-Parsing: AN
+01:43=Lua-Parsing ist in Online-Spielen nicht erlaubt!
 
 ; Event messages
 ; Hog (%1) died
@@ -1394,3 +1397,31 @@
 05:20=Igelwaffen: Igel teilen Waffen nicht untereinander
 05:21=Staffellauf: Teams gleicher Farbe kommen nacheinander dran|Gemeinsame Zeit: Teams gleicher Farbe teilen sich ihre Zugzeit
 05:22=Starker Wind: Wind beeinflusst fast alles
+
+; Chat command help
+06:00=Liste der grundlegenden Client-Chatbefehle:
+06:01=/togglechat: Chatanzeige umschalten
+06:02=/team <Nachricht>: Nachricht nur an Klanmitglieder schicken
+06:03=/me <Nachricht>: Chataktion, z.B. wird „/me isst Pizza“ zu „* Spieler isst Pizza“
+06:04=/pause: Pause umschalten
+06:05=/pause: Automatisches Überspringen umschalten
+06:06=/fullscreen: Vollbild umschalten
+06:07=/quit [Nachricht]: Hedgewars verlassen, mit optionaler Nachricht
+06:08=/help: Grundlegende Client-Chatbefehle auflisten
+06:09=/help taunts: Spott-Chatbefehle auflisten
+06:10=/history: Langes Chatprotokoll umschalten
+06:11=/lua: Lua-Parsing umschalten (für Entwickler)
+06:12=Liste der Spott-Chatbefehle:
+06:13="Text": Text in Sprechblase anzeigen
+06:14='Text': Text in Denkblase anzeigen
+06:15=-Text-: Text in Brüllblase anzeigen
+06:16=Füg eine Nummer am Textanfang bei den obigen Befehlen hinzu, um einen Igel auszuwählen.
+06:17=/hsa <Text>: Text in Sprechblase beim nächsten Angriff anzeigen
+06:18=/hta <Text>: Text in Denkblase beim nächsten Angriff anzeigen
+06:19=/hya <Text>: Text in Brüllblase beim nächsten Angriff anzeigen
+06:20=/hurrah: Igel grinsen lassen
+06:21=/ilovelotsoflemonade: Igel pinkeln lassen
+06:22=/juggle: Igel jonglieren lassen
+06:23=/rollup: Igel sich einigeln lassen
+06:24=/shrug: Igel mit den Achseln zucken lassen
+06:25=/wave: Igel winken lassen
--- a/share/hedgewars/Data/Locale/en.txt	Mon Jul 09 20:59:08 2018 +0300
+++ b/share/hedgewars/Data/Locale/en.txt	Wed Jul 11 18:36:21 2018 -0400
@@ -105,6 +105,9 @@
 01:38=%1 is back.
 01:39=%1 automatically skipped turn.
 01:40=%1 fps
+01:41=Lua parsing: OFF
+01:42=Lua parsing: ON
+01:43=Lua parsing is not allowed in online games!
 
 ; Event messages
 ; Normal hog (%1) died (0 health)
@@ -1295,3 +1298,31 @@
 05:20=Per-hog Ammo: Weapons are not shared between hogs
 05:21=Tag Team: Teams in a clan takes successive turns|Shared Time: Teams within a clan share turn time
 05:22=Heavy Wind: Wind affects almost everything
+
+; Chat command help
+06:00=List of basic client chat commands:
+06:01=/togglechat: Toggle chat display
+06:02=/team <message>: Send message to clan members only
+06:03=/me <message>: Chat action, e.g. “/me eats pizza” becomes “* Player eats pizza”
+06:04=/pause: Toggle pause
+06:05=/pause: Toggle auto skip
+06:06=/fullscreen: Toggle fullscreen
+06:07=/quit [message]: Quit Hedgewars with optional message
+06:08=/help: List basic client chat commands
+06:09=/help taunts: List taunt chat commands
+06:10=/history: Toggle long chat history display
+06:11=/lua: Toggle Lua parsing (for developers)
+06:12=List of taunt chat commands:
+06:13="text": Put text in speech bubble
+06:14='text': Put text in thinking bubble
+06:15=-text-: Put text in yelling bubble
+06:16=For above commands, put a number at start of text to select a hog.
+06:17=/hsa <text>: Put text in speech bubble on next attack
+06:18=/hta <text>: Put text in thinking bubble on next attack
+06:19=/hya <text>: Put text in yelling bubble on next attack
+06:20=/hurrah: Make hedgehog grin
+06:21=/ilovelotsoflemonade: Make hedgehog pee
+06:22=/juggle: Make hedgehog juggle
+06:23=/rollup: Make hedgehog roll up
+06:24=/shrug: Make hedgehog shrug
+06:25=/wave: Make hedgehog wave its hand
--- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/backstab.lua	Mon Jul 09 20:59:08 2018 +0300
+++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/backstab.lua	Wed Jul 11 18:36:21 2018 -0400
@@ -960,29 +960,28 @@
 end
 
 function AddHogs()
-	AddTeam(loc("Natives"), 29439, "Bone", "Island", "HillBilly", "cm_birdy")
+  AddTeam(loc("Tribe"), 0x0072FF, "Bone", "Island", "HillBilly", "cm_birdy")
+  for i = 8, 9 do
+    natives[i] = AddHog(nativeNames[i], 0, 100, nativeHats[i])
+  end
+
+  AddTeam(loc("Natives"), 0x0072FF, "Bone", "Island", "HillBilly", "cm_birdy")
   for i = 1, 7 do
     natives[i] = AddHog(nativeNames[i], 0, 100, nativeHats[i])
   end
   nativesNum = 7
 
-  AddTeam(loc("Tribe"), 29438, "Bone", "Island", "HillBilly", "cm_birdy")
-  for i = 8, 9 do
-    natives[i] = AddHog(nativeNames[i], 0, 100, nativeHats[i])
-  end
-
-
-  AddTeam(loc("Assault Team"), 14483456, "skull", "Island", "Pirate", "cm_vampire")
+  AddTeam(loc("Assault Team"), 0xDD0000, "skull", "Island", "Pirate", "cm_vampire")
   for i = 1, 6 do
     cannibals[i] = AddHog(cannibalNames[i], 3, 50, "vampirichog")
   end
 
-  AddTeam(loc("Reinforcements"), 14483456, "skull", "Island", "Pirate", "cm_vampire")
+  AddTeam(loc("Reinforcements"), 0xDD0000, "skull", "Island", "Pirate", "cm_vampire")
   for i = 7, 9 do
     cannibals[i] = AddHog(cannibalNames[i], 2, 50, "vampirichog")
   end
 
-  AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_binary")
+  AddTeam(loc("011101001"), 0xDD0000, "ring", "UFO", "Robot", "cm_binary")
   cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1")
 
   for i = 1, 9 do
@@ -1013,7 +1012,8 @@
 
 function onGameInit()
 	Seed = 2
-	GameFlags = gfSolidLand
+	-- gfTagTeam makes it easier to skip the Tribe team
+	GameFlags = gfSolidLand + gfTagTeam
 	TurnTime = 60000 
 	CaseFreq = 0
 	MinesNum = 0
--- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/family.lua	Mon Jul 09 20:59:08 2018 +0300
+++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/family.lua	Wed Jul 11 18:36:21 2018 -0400
@@ -436,7 +436,7 @@
     RemoveEventFunc(CheckPrincessFreed)
     AddCaption(loc("So the princess was never heard of again ..."))
     DismissTeam(loc("Natives"))
-    DismissTeam(loc("011101001"))
+    DismissTeam(loc("Princess"))
     EndTurn(true)
   end
 end
@@ -519,17 +519,20 @@
 end
 
 function AddHogs()
-	AddTeam(loc("Natives"), 29439, "Bone", "Island", "HillBilly", "cm_birdy")
+  AddTeam(loc("Princess"), 0x0072FF, "Bone", "Island", "HillBilly", "cm_birdy")
+  princess = AddHog(loc("Fell From Heaven"), 0, 333, "tiara")
+  SetGearAIHints(princess, aihDoesntMatter)
+  gearDead[princess] = false
+
+  AddTeam(loc("Natives"), 0x0072FF, "Bone", "Island", "HillBilly", "cm_birdy")
   for i = 7, 9 do
     natives[i-6] = AddHog(nativeNames[i], 0, 100, nativeHats[i])
     gearDead[natives[i-6]] = false
   end
 
-  AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_binary")
+  AddTeam(loc("011101001"), 0xDD0000, "ring", "UFO", "Robot", "cm_binary")
   cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1")
-  princess = AddHog(loc("Fell From Heaven"), 0, 333, "tiara")
   gearDead[cyborg] = false
-  gearDead[princess] = false
 
   AddTeam(loc("Biomechanic Team"), 14483456, "ring", "UFO", "Robot", "cm_cyborg")
   for i = 1, cyborgsNum do
@@ -570,7 +573,8 @@
 
 function onGameInit()
 	Seed = 0
-	GameFlags = gfSolidLand + gfDisableLandObjects + gfDisableGirders
+	-- Using gfTagTeam makes it far easier to skip the Princess team
+	GameFlags = gfSolidLand + gfDisableLandObjects + gfDisableGirders + gfTagTeam
 	TurnTime = 60000 
 	CaseFreq = 0
 	MinesNum = 0
@@ -635,7 +639,7 @@
     TurnTimeLeft = -1
     return
   end
-  if GetHogTeamName(CurrentHedgehog) == loc("011101001") then
+  if CurrentHedgehog == cyborg then
     if CheckCyborgsDead() ~= true then
       for i = 1, 3 do
         if gearDead[natives[i]] ~= true then
@@ -644,6 +648,9 @@
       end
     end
     EndTurn(true)
+  elseif CurrentHedgehog == princess then
+    -- Princess is passive
+    EndTurn(true)
   else
     for i = 1, 3 do
       if gearDead[natives[i]] ~= true then
--- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/first_blood.lua	Mon Jul 09 20:59:08 2018 +0300
+++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/first_blood.lua	Wed Jul 11 18:36:21 2018 -0400
@@ -152,7 +152,7 @@
 
 goals = {
   [startDialogue] = {loc("First Blood"), loc("First Steps"), loc("Press [Left] or [Right] to move around, [Enter] to jump"), 1, 4000},
-  [onShroomAnim] = {loc("First Blood"), loc("A leap in a leap"), loc("Go on top of the flower") .. "|" .. loc("Hint: Press [Esc] to review the mission texts."), 1, 7000},
+  [onShroomAnim] = {loc("First Blood"), loc("A leap in a leap"), loc("Go on top of the flower") .. "|" .. loc("Hint: Hold down [M] to review the mission texts."), 1, 7000},
   [onFlowerAnim] = {loc("First Blood"), loc("Hightime"), loc("Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"), 1, 7000},
   [tookParaAnim] = {loc("First Blood"), loc("Omnivore"), loc("Get on the head of the mole"), 1, 4000},
   [onMoleHeadAnim] = {loc("First Blood"), loc("The Leap of Faith"), loc("Use the parachute ([Space] while in air) to get the next crate"), 1, 4000},
@@ -674,7 +674,7 @@
     loc("Press [Left] and [Right] to change the difficulty.") .. "| |" ..
     dstr .. "| |" ..
     loc("Press [Attack] to begin."),
-    0, 9999000)
+    0, 9999000, true)
 end
 
 function SetChoice()
--- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/journey.lua	Mon Jul 09 20:59:08 2018 +0300
+++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/journey.lua	Wed Jul 11 18:36:21 2018 -0400
@@ -179,6 +179,7 @@
 --/////////////////////////Animation Functions///////////////////////
 function AfterMidFailAnim()
   DismissTeam(loc("Natives"))
+  DismissTeam(loc("Princess"))
   EndTurn(true)
 end
 
@@ -207,7 +208,7 @@
   RestoreHedge(cyborg)
   RestoreHedge(princess)
   AnimSetGearPosition(cyborg, 437, 1700)
-  AnimSetGearPosition(princess, 519, 1722)
+  AnimSetGearPosition(princess, 519, 1726)
 end
 
 function SkipEndAnimDuo()
@@ -218,7 +219,7 @@
     princessHidden = false
   end
   AnimSetGearPosition(cyborg, 437, 1700)
-  AnimSetGearPosition(princess, 519, 1722)
+  AnimSetGearPosition(princess, 519, 1726)
   AnimSetGearPosition(leaks, 763, 1760)
   AnimSetGearPosition(dense, 835, 1519)
   HogTurnLeft(leaks, true)
@@ -539,7 +540,7 @@
   table.insert(failAnimAD, {func = AnimSwitchHog, args = {princess}})
   AddSkipFunction(failAnimAD, SkipFailAnimAlone, {})
 
-  table.insert(endAnimAD, {func = AnimCustomFunction, swh = false, args = {leaks, RestoreCyborg, {437, 1700, 519, 1722}}})
+  table.insert(endAnimAD, {func = AnimCustomFunction, swh = false, args = {leaks, RestoreCyborg, {437, 1700, 519, 1726}}})
   table.insert(endAnimAD, {func = AnimTurn, swh = false, args = {cyborg, "Right"}})
   table.insert(endAnimAD, {func = AnimTurn, swh = false, args = {princess, "Right"}})
   table.insert(endAnimAD, {func = AnimSay, args = {princess, loc("Help me, Leaks!"), SAY_SHOUT, 3000}})
@@ -598,7 +599,7 @@
   table.insert(outPitAnimAL, {func = AnimCustomFunction, swh = false, args = {cyborg, HideCyborgOnly, {}}})
   AddSkipFunction(outPitAnimAL, SkipOutPitAnim, {})
 
-  table.insert(endAnim, {func = AnimCustomFunction, swh = false, args = {leaks, RestoreCyborg, {437, 1700, 519, 1722}}})
+  table.insert(endAnim, {func = AnimCustomFunction, swh = false, args = {leaks, RestoreCyborg, {437, 1700, 519, 1726}}})
   table.insert(endAnim, {func = AnimTeleportGear, args = {leaks, 763, 1760}})
   table.insert(endAnim, {func = AnimTeleportGear, args = {dense, 835, 1519}})
   table.insert(endAnim, {func = AnimTurn, swh = false, args = {leaks, "Left"}})
@@ -661,7 +662,7 @@
   table.insert(outPitAnimRL, {func = AnimCustomFunction, swh = false, args = {cyborg, HideCyborgOnly, {}}})
   AddSkipFunction(outPitAnimRL, SkipOutPitAnim, {})
 
-  table.insert(endAnim, {func = AnimCustomFunction, args = {leaks, RestoreCyborg, {437, 1700, 519, 1722}}})
+  table.insert(endAnim, {func = AnimCustomFunction, args = {leaks, RestoreCyborg, {437, 1700, 519, 1726}}})
   table.insert(endAnim, {func = AnimTeleportGear, args = {leaks, 763, 1760}})
   table.insert(endAnim, {func = AnimTeleportGear, args = {dense, 835, 1519}})
   table.insert(endAnim, {func = AnimTurn, swh = false, args = {leaks, "Left"}})
@@ -913,6 +914,7 @@
     EndTurn(true)
     AddCaption(loc("The village, unprepared, was destroyed by the cyborgs..."))
     DismissTeam(loc("Natives"))
+    DismissTeam(loc("Princess"))
   end
 end
 
@@ -925,6 +927,7 @@
     EndTurn(true)
     AddCaption(loc("The village, unprepared, was destroyed by the cyborgs..."))
     DismissTeam(loc("Natives"))
+    DismissTeam(loc("Princess"))
   end
 end
 
@@ -1009,8 +1012,11 @@
   if not cyborgDead then
     SwitchHog(cyborg)
   end
-  AddAnim(endFailAnim)
+  if not (leaksDead or denseDead) then
+    AddAnim(endFailAnim)
+  end
   AddFunction({func = DismissTeam, args = {loc("Natives")}})
+  AddFunction({func = DismissTeam, args = {loc("Princess")}})
   AddFunction({func = EndTurn, args = {true}})
 end
 
@@ -1082,11 +1088,14 @@
     HealthDecrease = 0
     WaterRise = 0
 
-	AddTeam(loc("Natives"), 29439, "Bone", "Island", "HillBilly", "cm_birdy")
-	leaks = AddHog(loc("Leaks A Lot"), 0, 100, "Rambo")
+  AddTeam(loc("Natives"), 0x0072FF, "Bone", "Island", "HillBilly", "cm_birdy")
+  leaks = AddHog(loc("Leaks A Lot"), 0, 100, "Rambo")
   dense = AddHog(loc("Dense Cloud"), 0, 100, "RobinHood")
 
-  AddTeam(loc("Cannibal Sentry"), 14483456, "skull", "Island", "Pirate","cm_vampire")
+  AddTeam(loc("Princess"), 0x0072FF, "Bone", "Island", "HillBilly", "cm_birdy")
+  princess = AddHog(loc("Fell From Heaven"), 0, 200, "tiara")
+
+  AddTeam(loc("Cannibal Sentry"), 0xDD0000, "skull", "Island", "Pirate","cm_vampire")
   cannibals = {}
   for i = 1, 4 do
     cannibals[i] = AddHog(cannibalNames[i], 3, 40, "Zombi")
@@ -1100,9 +1109,8 @@
     SetEffect(cannibals[i], heArtillery, 1)
   end
 
-  AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_binary")
+  AddTeam(loc("011101001"), 0xDD0000, "ring", "UFO", "Robot", "cm_binary")
   cyborg = AddHog(loc("Y3K1337"), 0, 200, "cyborg1")
-  princess = AddHog(loc("Fell From Heaven"), 0, 200, "tiara")
 
   AnimSetGearPosition(dense, 0, 0)
   AnimSetGearPosition(leaks, 0, 0)
--- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/death01.lua	Mon Jul 09 20:59:08 2018 +0300
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/death01.lua	Wed Jul 11 18:36:21 2018 -0400
@@ -81,8 +81,7 @@
 teamA.name = loc("Hog Solo")
 teamA.color = 0x38D61C -- green
 teamB.name = loc("PAotH")
--- FIXME: PAotH should share color with Hog Solo
-teamB.color = 0x0072FF -- blue because otherwise enemies attack them
+teamB.color = teamA.color
 teamC.name = loc("Professor")
 teamC.color = 0x0072FF -- blue
 
@@ -97,6 +96,8 @@
 	Explosives = 2
 	Delay = 3
 	HealthCaseAmount = 50
+	-- gfTagTeam makes it easier to skip the PAotH team
+	GameFlags = gfTagTeam
 	-- Disable Sudden Death
 	HealthDecrease = 0
 	WaterRise = 0
@@ -107,19 +108,19 @@
 	AddTeam(teamA.name, teamA.color, "Simple", "Island", "Default", "hedgewars")
 	hero.gear = AddHog(hero.name, 0, 100, "war_desertgrenadier1")
 	AnimSetGearPosition(hero.gear, hero.x, hero.y)
+
 	-- PAotH
 	AddTeam(teamB.name, teamB.color, "Earth", "Island", "Default", "cm_galaxy")
 	paoth1.gear = AddHog(paoth1.name, 0, 100, "hair_yellow")
 	AnimSetGearPosition(paoth1.gear, paoth1.x, paoth1.y)
 	HogTurnLeft(paoth1.gear, true)
+	SetGearAIHints(paoth1.gear, aihDoesntMatter)
 	paoth2.gear = AddHog(paoth2.name, 0, 100, "Glasses")
 	AnimSetGearPosition(paoth2.gear, paoth2.x, paoth2.y)
 	HogTurnLeft(paoth2.gear, true)
+	SetGearAIHints(paoth2.gear, aihDoesntMatter)
+
 	-- Professor and Thugs
-	AddTeam(teamC.name, teamC.color, "star", "Island", "Default", "cm_sine")
-	professor.human = AddHog(professor.name, 0, 300, "tophats")
-	AnimSetGearPosition(professor.human, hero.x + 70, hero.y)
-	HogTurnLeft(professor.human, true)
 	AddTeam(teamC.name, teamC.color, "eyecross", "Island", "Default", "cm_sine")
 	professor.bot = AddHog(professor.name, 1, 300, "tophats")
 	AnimSetGearPosition(professor.bot, paoth1.x - 100, paoth1.y)
@@ -131,6 +132,11 @@
 		HogTurnLeft(thugs[i].gear, not thugs[i].turnLeft)
 	end
 
+	AddTeam(teamC.name, teamC.color, "star", "Island", "Default", "cm_sine")
+	professor.human = AddHog(professor.name, 0, 300, "tophats")
+	AnimSetGearPosition(professor.human, hero.x + 70, hero.y)
+	HogTurnLeft(professor.human, true)
+
 	initCheckpoint("death01")
 
 	AnimInit(true)
@@ -201,8 +207,8 @@
 end
 
 function onNewTurn()
+	-- Team PAotH is passive and does not play
 	if CurrentHedgehog == paoth1.gear or CurrentHedgehog == paoth2.gear then
-		AnimSwitchHog(hero.gear)
 		EndTurn(true)
 	end
 end
@@ -269,7 +275,7 @@
 function heroDeath(gear)
 	SendStat(siGameResult, loc("Hog Solo lost, try again!"))
 	SendStat(siCustomAchievement, loc("To win the game you have to eliminate all your enemies."))
-	sendSimpleTeamRankings({teamC.name, teamA.name})
+	sendSimpleTeamRankings({teamC.name, teamA.name, teamB.name})
 	EndGame()
 end
 
@@ -280,7 +286,7 @@
 	SendStat(siCustomAchievement, loc("You have rescued H and Dr. Cornelius."))
 	SendStat(siCustomAchievement, loc("You have acquired the last device part."))
 	SendStat(siCustomAchievement, loc("Now go and play the menu mission to complete the campaign."))
-	sendSimpleTeamRankings({teamA.name, teamC.name})
+	sendSimpleTeamRankings({teamA.name, teamB.name, teamC.name})
 	EndGame()
 end
 
--- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/fruit01.lua	Mon Jul 09 20:59:08 2018 +0300
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/fruit01.lua	Wed Jul 11 18:36:21 2018 -0400
@@ -38,7 +38,7 @@
 		loc("Captain Lime offered his help if you assist him in battle.").."|"..
 		loc("What do you want to do?").."| |"..
 		loc("Fight: Press [Attack]").."|"..
-		loc("Flee: Press [Jump]"), 1, 9999000},
+		loc("Flee: Press [Jump]"), 1, 9999000, true},
 	[dialog02] = {missionName, loc("Battle Starts Now!"), loc("You have chosen to fight!").."|"..loc("Lead the Green Bananas to battle and eliminate all the enemies!"), 1, 5000},
 	[dialog03] = {missionName, loc("Time to run!"), loc("You have chosen to flee.").."|"..loc("You have to reach the left-most place on the map."), 1, 5000},
 	["fight"] = {missionName, loc("Ready for Battle?"), loc("You have chosen to fight!"), 1, 2000},
--- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Movement.lua	Mon Jul 09 20:59:08 2018 +0300
+++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Movement.lua	Wed Jul 11 18:36:21 2018 -0400
@@ -374,12 +374,13 @@
 	loc("This is the mission panel.").."|"..
 	loc("Here you will find the current mission instructions.").."|"..
 	loc("Normally, the mission panel disappears after a few seconds.").."|"..
-	loc("IMPORTANT: To see the mission panel again, use the quit or pause key.").."| |"..
+	loc("IMPORTANT: To see the mission panel again, hold the mission panel key.").."| |"..
 	loc("Note: This basic training assumes default controls.").."|"..
+        loc("Mission panel: [M]").."|"..
 	loc("Quit: [Esc]").."|"..
 	loc("Pause: [P]").."| |"..
 	loc("To begin with the training, hit the attack key!").."|"..
-	loc("Attack: [Space]"), 2, 900000)
+	loc("Attack: [Space]"), 2, 900000, true)
 
 	-- TODO: This and other training missions are currently hardcoding control names.
 	-- This should be fixed eventually.
--- a/share/hedgewars/Data/Scripts/Multiplayer/HedgeEditor.lua	Mon Jul 09 20:59:08 2018 +0300
+++ b/share/hedgewars/Data/Scripts/Multiplayer/HedgeEditor.lua	Wed Jul 11 18:36:21 2018 -0400
@@ -2535,7 +2535,7 @@
 				" " .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", -amGirder, 60000
+				"", -amGirder, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 
@@ -2553,7 +2553,7 @@
 				" " .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", -amRubber, 60000
+				"", -amRubber, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 
@@ -2568,7 +2568,7 @@
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", 8, 60000
+				"", 8, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 
@@ -2582,7 +2582,7 @@
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", -amKnife, 60000
+				"", -amKnife, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 
@@ -2596,7 +2596,7 @@
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", 1, 60000
+				"", 1, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 
@@ -2611,7 +2611,7 @@
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", -amCMGearPlacementTool, 60000
+				"", -amCMGearPlacementTool, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 
@@ -2626,7 +2626,7 @@
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", -amMine, 60000
+				"", -amMine, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 
@@ -2641,7 +2641,7 @@
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", 9, 60000
+				"", 9, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 
@@ -2656,7 +2656,7 @@
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", -amSMine, 60000
+				"", -amSMine, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 
@@ -2671,7 +2671,7 @@
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", -amAirMine, 60000
+				"", -amAirMine, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 
@@ -2686,7 +2686,7 @@
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", 7, 60000
+				"", 7, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 
@@ -2701,7 +2701,7 @@
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", 5, 60000
+				"", 5, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 
@@ -2716,7 +2716,7 @@
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", 6, 60000
+				"", 6, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 
@@ -2731,7 +2731,7 @@
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", -amCMGearPlacementTool, 60000
+				"", -amCMGearPlacementTool, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 
@@ -2752,7 +2752,7 @@
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", 2, 60000
+				"", 2, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 
@@ -2773,7 +2773,7 @@
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", -amCMGearPlacementTool, 60000
+				"", -amCMGearPlacementTool, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 
@@ -2788,7 +2788,7 @@
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", 0, 60000
+				"", 0, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 	elseif cat[cIndex] == loc("Hog Identity Mode") then
@@ -2802,7 +2802,7 @@
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", 3, 60000
+				"", 3, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 
@@ -2817,7 +2817,7 @@
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", 3, 60000
+				"", 3, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 
@@ -2832,7 +2832,7 @@
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
 				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
-				"", 2, 60000
+				"", 2, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
 
--- a/share/hedgewars/Data/Scripts/Multiplayer/WxW.lua	Mon Jul 09 20:59:08 2018 +0300
+++ b/share/hedgewars/Data/Scripts/Multiplayer/WxW.lua	Wed Jul 11 18:36:21 2018 -0400
@@ -1550,7 +1550,7 @@
 				preMenuCfg..
 				missionComment ..
 				postMenuCfg ..
-				"", 2, 9999000
+				"", 2, 9999000, true
 				)
 
 	menu[menuIndex].line = temp
Binary file share/hedgewars/Data/Themes/Cheese/Flake.png has changed
--- a/share/hedgewars/Data/Themes/Cheese/theme.cfg	Mon Jul 09 20:59:08 2018 +0300
+++ b/share/hedgewars/Data/Themes/Cheese/theme.cfg	Wed Jul 11 18:36:21 2018 -0400
@@ -7,3 +7,5 @@
 object = mouseleft, 3, 60, 162, 63, 20, 1, 6, 6, 200, 140
 object = knife, 3, 90, 130, 50, 20, 1, 140, 0, 160, 110
 object = fork, 3, 240, 130, 10, 30, 1, 0, 0, 170, 120
+; TODO: Replace "dust" flakes with cheese flakes
+flakes = 50, 1, 0, 50, 50
Binary file share/hedgewars/Data/Themes/CrazyMission/Flake.png has changed
Binary file share/hedgewars/Data/Themes/CrazyMission/SDDroplet.png has changed
Binary file share/hedgewars/Data/Themes/CrazyMission/SDSplash.png has changed
Binary file share/hedgewars/Data/Themes/CrazyMission/SDWater.png has changed
--- a/share/hedgewars/Data/Themes/CrazyMission/theme.cfg	Mon Jul 09 20:59:08 2018 +0300
+++ b/share/hedgewars/Data/Themes/CrazyMission/theme.cfg	Wed Jul 11 18:36:21 2018 -0400
@@ -4,6 +4,11 @@
 water-top = 21, 57, 76
 water-bottom = 21, 57, 76
 water-opacity = $80
+sd-water-top = $ac, $7f, $af
+sd-water-bottom = $ac, $7f, $af
+sd-water-opacity = $80
+flakes = 25, 1, 0, 10, 50
+sd-flakes = 30, 4, 0, 15, 250
 music = snow.ogg
 clouds = 4
 sd-tint = $9a, $72, $72, $ff