# HG changeset patch # User nemo # Date 1531348581 14400 # Node ID e1543ad2fac9bb8da8b68fc85ddd70497f569da9 # Parent c265a3e6f6da20853c46d1410aa26c56095df8fa# Parent 7f3289a239dd7c28d63ea8df1f048deb163fa517 merge diff -r 7f3289a239dd -r e1543ad2fac9 ChangeLog.txt --- 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 diff -r 7f3289a239dd -r e1543ad2fac9 QTfrontend/binds.cpp --- 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:")} diff -r 7f3289a239dd -r e1543ad2fac9 QTfrontend/binds.h --- 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 #ifdef VIDEOREC -#define BINDS_NUMBER 49 +#define BINDS_NUMBER 50 #else -#define BINDS_NUMBER 48 +#define BINDS_NUMBER 49 #endif struct BindAction diff -r 7f3289a239dd -r e1543ad2fac9 README.md --- 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 diff -r 7f3289a239dd -r e1543ad2fac9 hedgewars/uAIAmmoTests.pas --- 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 diff -r 7f3289a239dd -r e1543ad2fac9 hedgewars/uAIMisc.pas --- 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; diff -r 7f3289a239dd -r e1543ad2fac9 hedgewars/uChat.pas --- 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; diff -r 7f3289a239dd -r e1543ad2fac9 hedgewars/uCollisions.pas --- 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; diff -r 7f3289a239dd -r e1543ad2fac9 hedgewars/uCommandHandlers.pas --- 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; diff -r 7f3289a239dd -r e1543ad2fac9 hedgewars/uConsts.pas --- 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 diff -r 7f3289a239dd -r e1543ad2fac9 hedgewars/uGearsHandlersMess.pas --- 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); diff -r 7f3289a239dd -r e1543ad2fac9 hedgewars/uGearsHandlersRope.pas --- 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 diff -r 7f3289a239dd -r e1543ad2fac9 hedgewars/uGearsHedgehog.pas --- 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 diff -r 7f3289a239dd -r e1543ad2fac9 hedgewars/uGearsList.pas --- 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; diff -r 7f3289a239dd -r e1543ad2fac9 hedgewars/uInputHandler.pas --- 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'; diff -r 7f3289a239dd -r e1543ad2fac9 hedgewars/uLandGraphics.pas --- 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; diff -r 7f3289a239dd -r e1543ad2fac9 hedgewars/uLocale.pas --- 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); diff -r 7f3289a239dd -r e1543ad2fac9 hedgewars/uScript.pas --- 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); diff -r 7f3289a239dd -r e1543ad2fac9 hedgewars/uTeams.pas --- 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 diff -r 7f3289a239dd -r e1543ad2fac9 hedgewars/uTypes.pas --- 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, diff -r 7f3289a239dd -r e1543ad2fac9 hedgewars/uVariables.pas --- 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; diff -r 7f3289a239dd -r e1543ad2fac9 hedgewars/uWorld.pas --- 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); diff -r 7f3289a239dd -r e1543ad2fac9 share/hedgewars/Data/Locale/de.txt --- 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 nur an Klanmitglieder schicken +06:03=/me : 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 in Sprechblase beim nächsten Angriff anzeigen +06:18=/hta : Text in Denkblase beim nächsten Angriff anzeigen +06:19=/hya : 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 diff -r 7f3289a239dd -r e1543ad2fac9 share/hedgewars/Data/Locale/en.txt --- 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 : Send message to clan members only +06:03=/me : 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 : Put text in speech bubble on next attack +06:18=/hta : Put text in thinking bubble on next attack +06:19=/hya : 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 diff -r 7f3289a239dd -r e1543ad2fac9 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/backstab.lua --- 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 diff -r 7f3289a239dd -r e1543ad2fac9 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/family.lua --- 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 diff -r 7f3289a239dd -r e1543ad2fac9 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/first_blood.lua --- 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() diff -r 7f3289a239dd -r e1543ad2fac9 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/journey.lua --- 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) diff -r 7f3289a239dd -r e1543ad2fac9 share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/death01.lua --- 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 diff -r 7f3289a239dd -r e1543ad2fac9 share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/fruit01.lua --- 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}, diff -r 7f3289a239dd -r e1543ad2fac9 share/hedgewars/Data/Missions/Training/Basic_Training_-_Movement.lua --- 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. diff -r 7f3289a239dd -r e1543ad2fac9 share/hedgewars/Data/Scripts/Multiplayer/HedgeEditor.lua --- 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 diff -r 7f3289a239dd -r e1543ad2fac9 share/hedgewars/Data/Scripts/Multiplayer/WxW.lua --- 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 diff -r 7f3289a239dd -r e1543ad2fac9 share/hedgewars/Data/Themes/Cheese/Flake.png Binary file share/hedgewars/Data/Themes/Cheese/Flake.png has changed diff -r 7f3289a239dd -r e1543ad2fac9 share/hedgewars/Data/Themes/Cheese/theme.cfg --- 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 diff -r 7f3289a239dd -r e1543ad2fac9 share/hedgewars/Data/Themes/CrazyMission/Flake.png Binary file share/hedgewars/Data/Themes/CrazyMission/Flake.png has changed diff -r 7f3289a239dd -r e1543ad2fac9 share/hedgewars/Data/Themes/CrazyMission/SDDroplet.png Binary file share/hedgewars/Data/Themes/CrazyMission/SDDroplet.png has changed diff -r 7f3289a239dd -r e1543ad2fac9 share/hedgewars/Data/Themes/CrazyMission/SDSplash.png Binary file share/hedgewars/Data/Themes/CrazyMission/SDSplash.png has changed diff -r 7f3289a239dd -r e1543ad2fac9 share/hedgewars/Data/Themes/CrazyMission/SDWater.png Binary file share/hedgewars/Data/Themes/CrazyMission/SDWater.png has changed diff -r 7f3289a239dd -r e1543ad2fac9 share/hedgewars/Data/Themes/CrazyMission/theme.cfg --- 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