--- 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