# HG changeset patch # User sheepluva # Date 1493502579 -7200 # Node ID 1adc078355d1f890dbe6f52bfe485f2e9fbfc992 # Parent e3d9abcc427a465dd63072855a2322893d9563a6# Parent 95fc84a9837ead00e91555339b08e0e29a00ca76 merge diff -r e3d9abcc427a -r 1adc078355d1 ChangeLog.txt --- a/ChangeLog.txt Sat Apr 29 23:45:14 2017 +0200 +++ b/ChangeLog.txt Sat Apr 29 23:49:39 2017 +0200 @@ -57,6 +57,7 @@ * Fix invalid girder placement costing energy * Special tools like structure placer now have their own proper descriptions (instead of Air Attack description, etc.) * Costs for weapon and utility crates were all equal + * Remove airplane cursor * Many other fixes and tweaks Racer and TechRacer: @@ -67,6 +68,8 @@ + waypointradius: Size of waypoints + maxwaypoints: Maximum allowed number of waypoints + Show correct ranking and times in stats screen of Racer and TechRacer + * Fix description and icon of waypoint placement tool in Racer + * Remove airplane cursor in Racer * Fixed waypoint message in TechRacer and Racer overwriting current weapon selection message * Fixed TechRacer not recording finish if time was >= 100s @@ -158,6 +161,7 @@ * Fix error when trying to set ShoppaBalance rank without anything selected * Don't show misleading circle when placing girder/rubber * Disable timer keys 2-4 in rubber placement mode + * Fix incorrect weapon crate preview of air attack, drill strike and napalm Other Game Styles: + Capture The Flag supports setting number of captures with script parameter “capture=” @@ -166,23 +170,45 @@ * Mutant script shows now appropriate ranking and graph in stats screen * Disable Sudden Death for good in Shoppa game scheme, some game styles and mission maps -Missions and Campaigns: +A Classic Fairytale: + + Mission 3: Improved mission panel texts to clarify the goals at all time + + Mission 4: Add infinite skip + + Mission 6: Add alternate dialogues when killing cyborgs before collecting the crates + + All missions: Clarify mine timers + * Mission 2: Fix crash when trying to open ammo menu in opening sequence + * Mission 3: Fix various Lua errors when playing with 2 hogs and one of them dies + * Mission 3: Fix broken end sequence after killing cyborg or princess + * Mission 5: Fix crash when skipping animation while the cyborg talks before the 3rd wave of cannibals starts + * Mission 6: Block off left cave entrance to stop player to just rope all the way around + * Mission 6: Remove some misleading mission panel texts + * Mission 8: Fix Lua error message at the beginning + * Mission 10: Fix mission becoming unplayable when all hogs except the traitor died + * All missions: Add missing texts for translation + * Fix swapped mission preview images of missions 2 and 3 + +A Space Adventure: + + A few campaign missions now save your personal best successes (e.g. fastest finish in Hard Flying) which get shown after you finish them agin + + Add skip to a few missions where it doesn't hurt + + Menu: Show 2 flowers over fully completed planets (with side missions) + * Hard Flying: Fix ending in a Lua error + * The First Stop: Fix stats screen showing teams twice + * Killing The Specialists: Fix killing hog with Deagle gave you chance to use another weapon in same turn + * Fix weird behaviour when walking right before the first animation in most missions + * Fix a coupe of texts being untranslatable + * Fix typos + +Missions: + New scenario: Teamwork 2 + New scenario: Big Armory + New training: Basic Flying Saucer Training + Rope-Knocking Challenge was improved (now awards score based on kills and time; taunts for knocking out hedgehogs) - + A Classic Fairytale, mission 6: Add alternate dialogues when killing cyborgs before collecting the crates - + A few campaign missions now save your personal best successes (e.g. fastest finish in Hard Flying) which get shown after you finish them agin - + A Space Adventure shows 2 flowers over fully completed planets (with side missions) + Rewrote some help texts in basic rope training + Graphical effect (black bars) while in cut scenes - * Fix weird behaviour when walking right before the first animation in A Space Adventure missions + + Change description and icon for baseball bat in Knockball mission map * Portal Mind Challenge was cleaned up and reworked (especially less awful wording) * Fixed Target Practice missions getting stuck when a target dropped into water * Fixed mistakes and bad wording of strings in several missions, scripts and campaigns - * Fixed Lua error message in A Classic Fairytale mission 8 * Fixed Lua error messages and broken stats screen in Climb Home singleplayer mission - * Fixed Killing the Specialists giving you another free turn after killing Desert Eagle with a desert eagle with shot #1-3 Frontend: + Campaign screen shows which campaigns and missions you've completed so far @@ -211,6 +237,7 @@ + Themes can now have mirrored clouds and flakes: CloudsL.png, SDCloudsL.png, FlakeL.png, SDFlakeL.png + Water in themes supports custom animation and flow speed with water-animation and sd-water-animation in theme.cfg + Simplified hat format for unanimated hats; a single 32×32 image is enough. For clan hats, use size 64×32, with the color overlay at the right + + Ammos.png and Ammos_bw.png in HWPs are now overlayed over the base images; use transparent icons to keep them unchanged from the original * Default water color was black instead of blue Translations: @@ -232,6 +259,9 @@ + New call: SetAmmoDescriptionAppendix(ammoType, descAppend) -- Append a custom text to the description of an ammo type without overwriting it + New call: GetHogFort(gearUid) -- Returns the name of the fort of the hog's team + New call: PlaceRubber(x, y, frameIdx) -- Places a rubber + + New call: SendGameResultOff() -- Disable the game automatically setting a game result in the stats screen + + New call: SendRankingStatsOff() -- Disable the game automatically filling the team rankings in the stats screen + + New call: SendAchievementsStatsOff() -- Disable the game automatically populating the bullet point list in the “Details” section on the stats screen + New call: EndTurn([noTaunts]) -- Ends the current turn + New hook: onVisualGearAdd(vgUid) -- called when a visual gear is added + New hook: onVisualGearDelete(vgUid) -- called when a visual gear is deleted @@ -241,6 +271,8 @@ + New variable: AmmoTypeMax -- Maximum ammo type ID (useful to iterate through all ammo types, starting by 0) + Locale library: loc_noop -- Mark string for translation but don't translate it + Animate library: AnimInit([startAnimating]) -- New parameter startAnimating: if true, will start game in cinematic mode with most controls disabled. Must play an animation after that + * Fixed call: HideHog(gear) -- Fix crash when gear is invalid. Returns true on success or false otherwise + * Fixed call: SwitchHog(gear) -- Fix new hog being unable to open ammo menu * Removed call: SetAmmoStore -- Old undocumented function of questional use, has never been used 0.9.21 -> 0.9.22 diff -r e3d9abcc427a -r 1adc078355d1 QTfrontend/ui/page/pagegamestats.cpp --- a/QTfrontend/ui/page/pagegamestats.cpp Sat Apr 29 23:45:14 2017 +0200 +++ b/QTfrontend/ui/page/pagegamestats.cpp Sat Apr 29 23:49:39 2017 +0200 @@ -148,6 +148,7 @@ labelGameStats->setText(""); healthPoints.clear(); labelGameRank->setText(""); + labelGameWin->setText(""); playerPosition = 0; lastColor = 0; } diff -r e3d9abcc427a -r 1adc078355d1 hedgewars/uGearsHandlersMess.pas --- a/hedgewars/uGearsHandlersMess.pas Sat Apr 29 23:45:14 2017 +0200 +++ b/hedgewars/uGearsHandlersMess.pas Sat Apr 29 23:49:39 2017 +0200 @@ -47,7 +47,7 @@ procedure doStepBee(Gear: PGear); procedure doStepShotIdle(Gear: PGear); procedure doStepShotgunShot(Gear: PGear); -procedure spawnBulletTrail(Bullet: PGear); +procedure spawnBulletTrail(Bullet: PGear; bulletX, bulletY: hwFloat); procedure doStepBulletWork(Gear: PGear); procedure doStepDEagleShot(Gear: PGear); procedure doStepSniperRifleShot(Gear: PGear); @@ -1190,7 +1190,7 @@ end; //////////////////////////////////////////////////////////////////////////////// -procedure spawnBulletTrail(Bullet: PGear); +procedure spawnBulletTrail(Bullet: PGear; bulletX, bulletY: hwFloat); var oX, oY: hwFloat; VGear: PVisualGear; begin @@ -1212,14 +1212,14 @@ begin VGear^.X:= hwFloat2Float(ox); VGear^.Y:= hwFloat2Float(oy); - VGear^.dX:= hwFloat2Float(Bullet^.X); - VGear^.dY:= hwFloat2Float(Bullet^.Y); + VGear^.dX:= hwFloat2Float(bulletX); + VGear^.dY:= hwFloat2Float(bulletY); // reached edge of land. assume infinite beam. Extend it way out past camera - if (hwRound(Bullet^.X) and LAND_WIDTH_MASK <> 0) - or (hwRound(Bullet^.Y) and LAND_HEIGHT_MASK <> 0) then + if (hwRound(bulletX) and LAND_WIDTH_MASK <> 0) + or (hwRound(bulletY) and LAND_HEIGHT_MASK <> 0) then // only extend if not under water - if not CheckCoordInWater(hwRound(Bullet^.X), hwRound(Bullet^.Y)) then + if not CheckCoordInWater(hwRound(bulletX), hwRound(bulletY)) then begin VGear^.dX := VGear^.dX + max(LAND_WIDTH,4096) * (VGear^.dX - VGear^.X); VGear^.dY := VGear^.dY + max(LAND_WIDTH,4096) * (VGear^.dY - VGear^.Y); @@ -1231,13 +1231,14 @@ procedure doStepBulletWork(Gear: PGear); var - i, x, y: LongWord; - oX, oY, tX, tY, cX, cY: hwFloat; + i, x, y, iInit: LongWord; + oX, oY, tX, tY, tDx, tDy: hwFloat; VGear: PVisualGear; begin AllInactive := false; inc(Gear^.Timer); - i := 80; + iInit := 80; + i := iInit; oX := Gear^.X; oY := Gear^.Y; repeat @@ -1245,19 +1246,19 @@ Gear^.Y := Gear^.Y + Gear^.dY; tX:= Gear^.X; tY:= Gear^.Y; + tDx:= Gear^.dX; + tDy:= Gear^.dY; if (Gear^.PortalCounter < 30) and WorldWrap(Gear) then begin - cX:= Gear^.X; - cY:= Gear^.Y; - Gear^.X:= tX; - Gear^.Y:= tY; - SpawnBulletTrail(Gear); - Gear^.X:= cX; - Gear^.Y:= cY; + DrawTunnel(oX, oY, tDx, tDy, iInit + 2 - i, 1); + SpawnBulletTrail(Gear, tX, tY); + iInit:= i; + oX:= Gear^.X; + oY:= Gear^.Y; inc(Gear^.PortalCounter); Gear^.Elasticity:= Gear^.X; Gear^.Friction:= Gear^.Y; - SpawnBulletTrail(Gear); + SpawnBulletTrail(Gear, Gear^.X, Gear^.Y); end; x := hwRound(Gear^.X); y := hwRound(Gear^.Y); @@ -1290,7 +1291,7 @@ if Gear^.Damage > 0 then begin - DrawTunnel(oX, oY, Gear^.dX, Gear^.dY, 82 - i, 1); + DrawTunnel(oX, oY, Gear^.dX, Gear^.dY, iInit + 2 - i, 1); dec(Gear^.Health, Gear^.Damage); Gear^.Damage := 0 end; @@ -1331,7 +1332,7 @@ end; end; - spawnBulletTrail(Gear); + spawnBulletTrail(Gear, Gear^.X, Gear^.Y); Gear^.doStep := @doStepShotIdle end; end; @@ -4430,7 +4431,7 @@ if (iterator^.Kind = gtDEagleShot) or (iterator^.Kind = gtSniperRifleShot) then begin // draw bullet trail - spawnBulletTrail(iterator); + spawnBulletTrail(iterator, iterator^.X, iterator^.Y); // the bullet can now hurt the hog that fired it iterator^.Data:= nil; end; diff -r e3d9abcc427a -r 1adc078355d1 hedgewars/uGearsRender.pas --- a/hedgewars/uGearsRender.pas Sat Apr 29 23:45:14 2017 +0200 +++ b/hedgewars/uGearsRender.pas Sat Apr 29 23:49:39 2017 +0200 @@ -820,11 +820,15 @@ 0, sign, 0); - amBaseballBat: DrawHedgehog(sx, sy, + amBaseballBat: + begin + HatVisible:= true; + DrawHedgehog(sx, sy, sign, 0, 5, 0); + end else DrawHedgehog(sx, sy, sign, @@ -1028,7 +1032,19 @@ amJetpack: DrawSprite(sprJetpack, sx-32, sy-32, 0); end end; *) - if CurAmmoGear <> nil then + if (CurAmmoGear = nil) then + begin + if ((Gear^.State and (gstAttacked or gstAnimation or gstHHJumping)) = 0) + and (Gear^.Message and (gmLeft or gmRight) = 0) then + begin + amt:= CurrentHedgehog^.CurAmmoType; + case amt of + amBaseballBat: DrawSpritePivotedF(sprHandBaseball, + sx + 9 * sign, sy + 2, 0, sign, -8, 1, aangle); + end; + end; + end + else begin aangle:= Gear^.Angle * 180 / cMaxAngle - 90; case CurAmmoGear^.Kind of diff -r e3d9abcc427a -r 1adc078355d1 hedgewars/uGearsUtils.pas --- a/hedgewars/uGearsUtils.pas Sat Apr 29 23:45:14 2017 +0200 +++ b/hedgewars/uGearsUtils.pas Sat Apr 29 23:49:39 2017 +0200 @@ -777,7 +777,6 @@ PlaySound(sndWarp); RenderHealth(gear^.Hedgehog^); s:= ansistring(gear^.Hedgehog^.Name); - AddCaption(FormatA(GetEventString(eidResurrected), s), cWhiteColor, capgrpMessage); ScriptCall('onGearResurrect', gear^.uid); gear^.State := gstWait; end; diff -r e3d9abcc427a -r 1adc078355d1 hedgewars/uScript.pas --- a/hedgewars/uScript.pas Sat Apr 29 23:45:14 2017 +0200 +++ b/hedgewars/uScript.pas Sat Apr 29 23:49:39 2017 +0200 @@ -1638,8 +1638,14 @@ end; SwitchCurrentHedgehog(gear^.Hedgehog); + AmmoMenuInvalidated:= true; CurrentTeam:= CurrentHedgehog^.Team; + repeat + CurrentTeam^.CurrHedgehog := (CurrentTeam^.CurrHedgehog + 1) mod CurrentTeam^.HedgehogsNumber + until + CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear = CurrentHedgehog^.Gear; + gear^.State:= gear^.State or gstHHDriven; gear^.Active := true; gear^.Z := cCurrHHZ; @@ -1937,6 +1943,27 @@ lc_sendstat:= 0 end; +function lc_sendgameresultoff(L : Plua_State) : LongInt; Cdecl; +begin + L:= L; // avoid compiler hint + uStats.SendGameResultOn := false; + lc_sendgameresultoff:= 0 +end; + +function lc_sendrankingstatsoff(L : Plua_State) : LongInt; Cdecl; +begin + L:= L; // avoid compiler hint + uStats.SendRankingStatsOn := false; + lc_sendrankingstatsoff:= 0 +end; + +function lc_sendachievementsstatsoff(L : Plua_State) : LongInt; Cdecl; +begin + L:= L; // avoid compiler hint + uStats.SendAchievementsStatsOn := false; + lc_sendachievementsstatsoff:= 0 +end; + function lc_sendhealthstatsoff(L : Plua_State) : LongInt; Cdecl; begin L:= L; // avoid compiler hint @@ -2520,9 +2547,15 @@ if CheckLuaParamCount(L, 1, 'HideHog', 'gearUid') then begin gear:= GearByUID(Trunc(lua_tonumber(L, 1))); - HideHog(gear^.hedgehog) + if (gear <> nil) and (gear^.hedgehog <> nil) then + begin + HideHog(gear^.hedgehog); + lua_pushboolean(L, true); + end + else + lua_pushboolean(L, false); end; - lc_hidehog := 0; + lc_hidehog := 1; end; function lc_restorehog(L: Plua_State): LongInt; Cdecl; @@ -3409,6 +3442,9 @@ lua_register(luaState, _P'EndGame', @lc_endgame); lua_register(luaState, _P'EndTurn', @lc_endturn); lua_register(luaState, _P'SendStat', @lc_sendstat); +lua_register(luaState, _P'SendGameResultOff', @lc_sendgameresultoff); +lua_register(luaState, _P'SendRankingStatsOff', @lc_sendrankingstatsoff); +lua_register(luaState, _P'SendAchievementsStatsOff', @lc_sendachievementsstatsoff); lua_register(luaState, _P'SendHealthStatsOff', @lc_sendhealthstatsoff); lua_register(luaState, _P'FindPlace', @lc_findplace); lua_register(luaState, _P'SetGearPosition', @lc_setgearposition); diff -r e3d9abcc427a -r 1adc078355d1 hedgewars/uStats.pas --- a/hedgewars/uStats.pas Sat Apr 29 23:45:14 2017 +0200 +++ b/hedgewars/uStats.pas Sat Apr 29 23:49:39 2017 +0200 @@ -24,6 +24,9 @@ var TotalRounds: LongInt; FinishedTurnsTotal: LongInt; + SendGameResultOn : boolean = true; + SendRankingStatsOn : boolean = true; + SendAchievementsStatsOn : boolean = true; SendHealthStatsOn : boolean = true; procedure initModule; @@ -98,6 +101,7 @@ if killed then begin + Gear^.Hedgehog^.stats.StepDied:= true; inc(Attacker^.stats.StepKills); inc(Kills); inc(KillsTotal); @@ -146,7 +150,7 @@ AddVoice(sndFirstBlood, CurrentTeam^.voicepack) // Hog hurts, poisons or kills itself (except sacrifice) - else if (CurrentHedgehog^.stats.Sacrificed = false) and ((CurrentHedgehog^.stats.StepDamageRecv > 0) or (CurrentHedgehog^.stats.StepPoisoned) or (CurrentHedgehog^.Gear = nil)) then + else if (CurrentHedgehog^.stats.Sacrificed = false) and ((CurrentHedgehog^.stats.StepDamageRecv > 0) or (CurrentHedgehog^.stats.StepPoisoned) or (CurrentHedgehog^.stats.StepDied)) then begin AddVoice(sndStupid, PreviousTeam^.voicepack); // Message for hurting itself only (not drowning) @@ -215,6 +219,7 @@ StepDamageRecv:= 0; StepDamageGiven:= 0; StepPoisoned:= false; + StepDied:= false; end; if SendHealthStatsOn then @@ -276,7 +281,7 @@ for t:= 0 to Pred(TeamsCount) do with TeamsArray[t]^ do begin - if not ExtDriven then + if (not ExtDriven) and SendRankingStatsOn then SendStat(siTeamStats, GetTeamStatString(TeamsArray[t])); for i:= 0 to cMaxHHIndex do begin @@ -300,8 +305,9 @@ if Clan^.ClanHealth > 0 then begin winnersClan:= Clan; - SendStat(siPlayerKills, IntToStr(Clan^.Color) + ' ' + - IntToStr(stats.Kills) + ' ' + TeamName); + if SendRankingStatsOn then + SendStat(siPlayerKills, IntToStr(Clan^.Color) + ' ' + + IntToStr(stats.Kills) + ' ' + TeamName); end; { determine maximum values of TeamKills, TurnSkips, TeamDamage } @@ -324,32 +330,37 @@ end; { now send player stats for loser teams } - for t:= 0 to Pred(TeamsCount) do - begin - with TeamsArray[t]^ do + if SendRankingStatsOn then + for t:= 0 to Pred(TeamsCount) do begin - if Clan^.ClanHealth = 0 then + with TeamsArray[t]^ do begin - SendStat(siPlayerKills, IntToStr(Clan^.Color) + ' ' + - IntToStr(stats.Kills) + ' ' + TeamName); + if Clan^.ClanHealth = 0 then + begin + SendStat(siPlayerKills, IntToStr(Clan^.Color) + ' ' + + IntToStr(stats.Kills) + ' ' + TeamName); + end; end; end; - end; - if msdhh <> nil then - SendStat(siMaxStepDamage, IntToStr(msd) + ' ' + msdhh^.Name + ' (' + msdhh^.Team^.TeamName + ')'); - if mskcnt = 1 then - SendStat(siMaxStepKills, IntToStr(msk) + ' ' + mskhh^.Name + ' (' + mskhh^.Team^.TeamName + ')'); + // “Achievements” / Details part of stats screen + if SendAchievementsStatsOn then + begin + if msdhh <> nil then + SendStat(siMaxStepDamage, IntToStr(msd) + ' ' + msdhh^.Name + ' (' + msdhh^.Team^.TeamName + ')'); + if mskcnt = 1 then + SendStat(siMaxStepKills, IntToStr(msk) + ' ' + mskhh^.Name + ' (' + mskhh^.Team^.TeamName + ')'); - if maxTeamKills > 1 then - SendStat(siMaxTeamKills, IntToStr(maxTeamKills) + ' ' + maxTeamKillsName); - if maxTurnSkips > 2 then - SendStat(siMaxTurnSkips, IntToStr(maxTurnSkips) + ' ' + maxTurnSkipsName); - if maxTeamDamage > 30 then - SendStat(siMaxTeamDamage, IntToStr(maxTeamDamage) + ' ' + maxTeamDamageName); + if maxTeamKills > 1 then + SendStat(siMaxTeamKills, IntToStr(maxTeamKills) + ' ' + maxTeamKillsName); + if maxTurnSkips > 2 then + SendStat(siMaxTurnSkips, IntToStr(maxTurnSkips) + ' ' + maxTurnSkipsName); + if maxTeamDamage > 30 then + SendStat(siMaxTeamDamage, IntToStr(maxTeamDamage) + ' ' + maxTeamDamageName); - if KilledHHs > 0 then - SendStat(siKilledHHs, IntToStr(KilledHHs)); + if KilledHHs > 0 then + SendStat(siKilledHHs, IntToStr(KilledHHs)); + end; // now to console if winnersClan <> nil then diff -r e3d9abcc427a -r 1adc078355d1 hedgewars/uTeams.pas --- a/hedgewars/uTeams.pas Sat Apr 29 23:45:14 2017 +0200 +++ b/hedgewars/uTeams.pas Sat Apr 29 23:49:39 2017 +0200 @@ -82,7 +82,8 @@ if AliveCount = 0 then begin // draw AddCaption(GetEventString(eidRoundDraw), cWhiteColor, capgrpGameState); - SendStat(siGameResult, shortstring(trmsg[sidDraw])); + if SendGameResultOn then + SendStat(siGameResult, shortstring(trmsg[sidDraw])); AddGear(0, 0, gtATFinishGame, 0, _0, _0, 3000); end else // win @@ -113,7 +114,8 @@ AddVoice(sndVictory, Teams[0]^.voicepack); AddCaption(cap, cWhiteColor, capgrpGameState); - SendStat(siGameResult, shortstring(s)); + if SendGameResultOn then + SendStat(siGameResult, shortstring(s)); AddGear(0, 0, gtATFinishGame, 0, _0, _0, 3000) end; SendStats; diff -r e3d9abcc427a -r 1adc078355d1 hedgewars/uTypes.pas --- a/hedgewars/uTypes.pas Sat Apr 29 23:45:14 2017 +0200 +++ b/hedgewars/uTypes.pas Sat Apr 29 23:49:39 2017 +0200 @@ -330,6 +330,7 @@ StepDamageGiven, StepKills: Longword; StepPoisoned, + StepDied, Sacrificed: boolean; MaxStepDamageRecv, MaxStepDamageGiven, diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Graphics/missions.png Binary file share/hedgewars/Data/Graphics/missions.png has changed diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Locale/en.txt --- a/share/hedgewars/Data/Locale/en.txt Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Locale/en.txt Sat Apr 29 23:49:39 2017 +0200 @@ -259,7 +259,7 @@ 02:02=Losing is not an option 02:02=Cry havoc! Let loose the hogs of war! 02:02=Hedgewars, brought to you by Hedgewars.org -02:02=GL HF +02:02=Good luck, and have fun! 02:02=Just count yourself lucky you're not up against Tiyuri 02:02=Just count yourself lucky you're not up against unC0Rr 02:02=Just count yourself lucky you're not up against Nemo @@ -618,7 +618,7 @@ 02:12=%1 feels the poison 02:12=%1 feels weaker and weaker -; Hog (%1) was resurrected. Remember that hogs can also be resurrected by the game style (e.g. AI Survival) +; Hog (%1) was resurrected by the Resurrector utility 02:13=%1 has been resurrected 02:13=%1 has been brought back TO hell 02:13=%1 gets a second chance diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Maps/Knockball/CMakeLists.txt --- a/share/hedgewars/Data/Maps/Knockball/CMakeLists.txt Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Maps/Knockball/CMakeLists.txt Sat Apr 29 23:49:39 2017 +0200 @@ -1,6 +1,7 @@ install(FILES map.png map.cfg + map.hwp map.lua preview.png desc.txt diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Maps/Knockball/map.hwp Binary file share/hedgewars/Data/Maps/Knockball/map.hwp has changed diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/backstab.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/backstab.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/backstab.lua Sat Apr 29 23:49:39 2017 +0200 @@ -70,6 +70,9 @@ spyHog = nil deployedHog = nil deployedDead = false +nativesTeleported = false +nativesIsolated = false +hogDeployed = false cyborgHidden = false needToAct = 0 @@ -395,28 +398,31 @@ end function IsolateNatives() - PlaceGirder(710, 299, 6) - PlaceGirder(690, 299, 6) - PlaceGirder(761, 209, 4) - PlaceGirder(921, 209, 4) - PlaceGirder(1081, 209, 4) - PlaceGirder(761, 189, 4) - PlaceGirder(921, 189, 4) - PlaceGirder(1081, 189, 4) - PlaceGirder(761, 169, 4) - PlaceGirder(921, 169, 4) - PlaceGirder(1081, 169, 4) - PlaceGirder(761, 149, 4) - PlaceGirder(921, 149, 4) - PlaceGirder(1081, 149, 4) - PlaceGirder(761, 129, 4) - PlaceGirder(921, 129, 4) - PlaceGirder(1081, 129, 4) - PlaceGirder(1120, 261, 2) - PlaceGirder(1140, 261, 2) - PlaceGirder(1160, 261, 2) - AddAmmo(deployedHog, amDEagle, 0) - AddAmmo(deployedHog, amFirePunch, 0) + if not nativesIsolated then + PlaceGirder(710, 299, 6) + PlaceGirder(690, 299, 6) + PlaceGirder(761, 209, 4) + PlaceGirder(921, 209, 4) + PlaceGirder(1081, 209, 4) + PlaceGirder(761, 189, 4) + PlaceGirder(921, 189, 4) + PlaceGirder(1081, 189, 4) + PlaceGirder(761, 169, 4) + PlaceGirder(921, 169, 4) + PlaceGirder(1081, 169, 4) + PlaceGirder(761, 149, 4) + PlaceGirder(921, 149, 4) + PlaceGirder(1081, 149, 4) + PlaceGirder(761, 129, 4) + PlaceGirder(921, 129, 4) + PlaceGirder(1081, 129, 4) + PlaceGirder(1120, 261, 2) + PlaceGirder(1140, 261, 2) + PlaceGirder(1160, 261, 2) + AddAmmo(deployedHog, amDEagle, 0) + AddAmmo(deployedHog, amFirePunch, 0) + nativesIsolated = true + end end function PutCGI() @@ -443,11 +449,14 @@ end function TeleportNatives() - nativePos[waterNum] = {1100, 288} - for i = 1, 7 do - if nativeDead[i] ~= true then - AnimTeleportGear(natives[i], unpack(nativePos[i])) - end + if not nativesTeleported then + nativePos[waterNum] = {1100, 288} + for i = 1, 7 do + if nativeDead[i] ~= true then + AnimTeleportGear(natives[i], unpack(nativePos[i])) + end + end + nativesTeleported = true end end @@ -464,10 +473,13 @@ end function DeployHog() - AnimSwitchHog(deployedHog) - AnimTeleportGear(deployedHog, unpack(deployedPos)) - if deployedHog ~= natives[wiseNum] then - AnimSay(deployedHog, loc("Why me?!"), SAY_THINK, 2000) + if not hogDeployed then + AnimSwitchHog(deployedHog) + AnimTeleportGear(deployedHog, unpack(deployedPos)) + if deployedHog ~= natives[wiseNum] then + AnimSay(deployedHog, loc("Why me?!"), SAY_THINK, 2000) + end + hogDeployed = true end end @@ -546,10 +558,10 @@ function SkipWave2DeadAnim() TeleportNatives() - IsolateNatives() + PutCircles() DeployHog() + IsolateNatives() HideCyborg() - PutCircles() end function SpawnPlatformCrates() @@ -569,7 +581,7 @@ AddEvent(CheckTurnsOver, {}, DoTurnsOver, {3}, 0) AddEvent(CheckWaveDead, {3}, DoWaveDead, {3}, 0) AddEvent(CheckDeployedDead, {}, DoDeployedDead, {}, 0) - TurnTimeLeft = 0 + EndTurn(true) ShowMission(loc("Backstab"), loc("Drills"), loc("You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines..."), 1, 12000) end @@ -598,7 +610,7 @@ function AfterStartAnim() AnimSwitchHog(natives[leaksNum]) - TurnTimeLeft = 0 + EndTurn(true) stage = spyKillStage AddEvent(CheckChoice, {}, DoChoice, {}, 0) AddEvent(CheckKilledOther, {}, DoKilledOther, {}, 0) @@ -620,7 +632,7 @@ DismissTeam(loc("Natives")) DismissTeam(loc("Tribe")) DismissTeam(loc("011101001")) - TurnTimeLeft = 0 + EndTurn(true) end function CheckChoice() @@ -664,7 +676,7 @@ ShowMission(loc("Backstab"), loc("Brutus"), loc("You have killed an innocent hedgehog!"), 0, 6000) DismissTeam(loc("Natives")) DismissTeam(loc("Tribe")) - TurnTimeLeft = 0 + EndTurn(true) end function CheckWaveDead(index) @@ -677,7 +689,7 @@ end function DoWaveDead(index) - TurnTimeLeft = 0 + EndTurn(true) needToAct = index end @@ -774,7 +786,7 @@ DismissTeam(loc("Assault Team")) DismissTeam(loc("Reinforcements")) DismissTeam(loc("011101001")) - TurnTimeLeft = 0 + EndTurn(true) end -----------------------------Misc-------------------------------------- @@ -842,8 +854,7 @@ function SetupPlace() startNativesNum = nativesNum - HideHog(cyborg) - cyborgHidden = true + HideCyborg() for i = 1, 9 do HideHog(cannibals[i]) cannibalHidden[i] = true @@ -1048,7 +1059,7 @@ end if GetHogTeamName(CurrentHedgehog) == loc("Tribe") then - TurnTimeLeft = 0 + EndTurn(true) return end TurnsLeft = TurnsLeft - 1 @@ -1059,7 +1070,7 @@ if stage == spyKillStage then if CurrentHedgehog == spyHog or GetHogTeamName(CurrentHedgehog) ~= loc("Natives") then - TurnTimeLeft = 0 + EndTurn(true) else SetGearMessage(CurrentHedgehog, 0) --AnimSwitchHog(natives[leaksNum]) diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/enemy.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/enemy.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/enemy.lua Sat Apr 29 23:49:39 2017 +0200 @@ -286,7 +286,7 @@ ShowMission(loc("The Enemy Of My Enemy"), loc("The Union"), loc("Defeat the cyborgs!"), 1, 0) PutWeaponCrates() PutHealthCrates() - TurnTimeLeft = 0 + EndTurn(true) end function PutHealthCrates() @@ -331,12 +331,12 @@ function DoNativesDead() nativesDeadFresh = true - TurnTimeLeft = 0 + EndTurn(true) end function DoCannibalsDead() cannibalsDeadFresh = true - TurnTimeLeft = 0 + EndTurn(true) end function DoPlayersDead() @@ -344,14 +344,14 @@ RemoveEventFunc(CheckCannibalsDead) RemoveEventFunc(CheckCyborgsDead) playersDeadFresh = true - TurnTimeLeft = 0 + EndTurn(true) end function DoCyborgsDead() -- RemoveEventFunc(CheckNativesDead) -- RemoveEventFunc(CheckCannibalsDead) cyborgsDeadFresh= true - TurnTimeLeft = 0 + EndTurn(true) end function CheckGearsDead(gearList) @@ -388,7 +388,7 @@ DismissTeam(loc("Natives")) DismissTeam(loc("Cannibals")) DismissTeam(loc("011101001")) - TurnTimeLeft = 0 + EndTurn(true) end function WonMission() @@ -404,7 +404,7 @@ SaveCampaignVar("Progress", "9") end DismissTeam(loc("011101001")) - TurnTimeLeft = 0 + EndTurn(true) end -----------------------------Misc-------------------------------------- function HideHedge(hedge) diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/epil.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/epil.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/epil.lua Sat Apr 29 23:49:39 2017 +0200 @@ -71,6 +71,7 @@ startAnim = {} gearDead = {} +hogDead = {} --------------------------Anim skip functions-------------------------- function SkipStartAnim() SetGearMessage(CurrentHedgehog, 0) @@ -81,7 +82,7 @@ crate = SpawnHealthCrate(0, 0) SetGearMessage(CurrentHedgehog, 0) AddNewEvent(CheckCrateTaken, {}, DoCrateTaken, {}, 1) - TurnTimeLeft = 0 + EndTurn(true) ShowMission(loc("Epilogue"), loc("That's all, folks!"), loc("You have successfully finished the campaign!").."|".. loc("If you wish to replay, there are other possible endings, too!").."|".. @@ -380,8 +381,17 @@ CheckEvents() end +function onGearAdd(gear) + if GetGearType(gear) == gtHedgehog then + hogDead[gear] = false + end +end + function onGearDelete(gear) gearDead[gear] = true + if GetGearType(gear) == gtHedgehog then + hogDead[gear] = true + end end function onAmmoStoreInit() @@ -421,13 +431,23 @@ SetAmmo(amWhip, 9, 0, 0, 0) end +function IsEveryoneExceptTraitorDead() + for id, isDead in pairs(hogDead) do + if id ~= traitor and not isDead then + return false + end + end + return true +end + function onNewTurn() if AnimInProgress() then TurnTimeLeft = -1 return end - if CurrentHedgehog == traitor then - TurnTimeLeft = 0 + -- Don't allow player to play with traitor, except when it is the final hog left + if CurrentHedgehog == traitor and not IsEveryoneExceptTraitorDead() then + EndTurn(true) else TurnTimeLeft = -1 end diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/family.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/family.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/family.lua Sat Apr 29 23:49:39 2017 +0200 @@ -100,6 +100,8 @@ freshDead = nil crates = {} cratesNum = 0 + +princessFreed = false -----------------------------Animations-------------------------------- function EmitDenseClouds(dir) local dif @@ -185,7 +187,7 @@ SetupPlace3() SetGearMessage(natives[1], 0) AddNewEvent(CheckPrincessFreed, {}, DoPrincessFreed, {}, 0) - TurnTimeLeft = 0 + EndTurn(true) ShowMission(loc("Family Reunion"), loc("Salvation"), loc("Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"), 1, 7000) vCirc = AddVisualGear(0,0,vgtCircle,0,true) SetVisualGearValues(vCirc, 2625, 1500, 100, 255, 1, 10, 0, 120, 3, 0xff00ffff) @@ -287,8 +289,9 @@ if progress and progress<7 then SaveCampaignVar("Progress", "7") end + princessFreed = true DismissTeam(loc("011101001")) - TurnTimeLeft = 0 + EndTurn(true) end function CheckCyborgsDead() @@ -337,11 +340,13 @@ end function EndMission() - RemoveEventFunc(CheckPrincessFreed) - AddCaption(loc("So the princess was never heard of again ...")) - DismissTeam(loc("Natives")) - DismissTeam(loc("011101001")) - TurnTimeLeft = 0 + if not princessFreed then + RemoveEventFunc(CheckPrincessFreed) + AddCaption(loc("So the princess was never heard of again ...")) + DismissTeam(loc("Natives")) + DismissTeam(loc("011101001")) + EndTurn(true) + end end function CheckOutOfCluster() @@ -546,7 +551,7 @@ end end end - TurnTimeLeft = 0 + EndTurn(true) else for i = 1, 3 do if gearDead[natives[i]] ~= true then diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/journey.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/journey.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/journey.lua Sat Apr 29 23:49:39 2017 +0200 @@ -32,8 +32,6 @@ TurnsLeft = 0 stage = 0 ---cyborgHidden = false ---princessHidden = false blowTaken = false fireTaken = false gravityTaken = false @@ -45,6 +43,7 @@ denseDead = false princessDead = false cyborgDead = false +victory = false cannibalDead = {} hedgeHidden = {} @@ -73,7 +72,6 @@ endAnimRL = {} endFailAnim = {} -endFailAnimAD = {} winAnim = {} winAnimAD = {} @@ -81,7 +79,7 @@ --/////////////////////////Animation Functions/////////////////////// function AfterMidFailAnim() DismissTeam(loc("Natives")) - TurnTimeLeft = 0 + EndTurn(true) end function AfterMidAnimAlone() @@ -100,9 +98,10 @@ SetGearMessage(leaks, 0) TurnsLeft = 12 TurnTimeLeft = TurnTime - ShowMission(loc("The Journey Back"), loc("Collateral Damage"), loc("Save the princess by collecting the crate in under 12 turns!"), 0, 6000) + ShowMission(loc("The Journey Back"), loc("Collateral Damage"), + loc("Save the princess by collecting the crate in under 12 turns!") .. "|" .. + loc("Mines time: 3 seconds"), 0, 6000) -----------------------///////////////------------ - --AnimSetGearPosition(leaks, 417, 1800) end function SkipEndAnimAlone() @@ -185,33 +184,33 @@ end function PlaceMinesDuo() - SetTimer(AddGear(2920, 1448, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2985, 1338, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(3005, 1302, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(3030, 1270, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(3046, 1257, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2954, 1400, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2967, 1385, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2849, 1449, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2811, 1436, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2773, 1411, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2732, 1390, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2700, 1362, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2642, 1321, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2172, 1417, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2190, 1363, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2219, 1332, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1201, 1207, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1247, 1205, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1295, 1212, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1356, 1209, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1416, 1201, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1466, 1201, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1678, 1198, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1738, 1198, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1796, 1198, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1637, 1217, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1519, 1213, gtMine, 0, 0, 0, 0), 5000) + AddGear(2920, 1448, gtMine, 0, 0, 0, 0) + AddGear(2985, 1338, gtMine, 0, 0, 0, 0) + AddGear(3005, 1302, gtMine, 0, 0, 0, 0) + AddGear(3030, 1270, gtMine, 0, 0, 0, 0) + AddGear(3046, 1257, gtMine, 0, 0, 0, 0) + AddGear(2954, 1400, gtMine, 0, 0, 0, 0) + AddGear(2967, 1385, gtMine, 0, 0, 0, 0) + AddGear(2849, 1449, gtMine, 0, 0, 0, 0) + AddGear(2811, 1436, gtMine, 0, 0, 0, 0) + AddGear(2773, 1411, gtMine, 0, 0, 0, 0) + AddGear(2732, 1390, gtMine, 0, 0, 0, 0) + AddGear(2700, 1362, gtMine, 0, 0, 0, 0) + AddGear(2642, 1321, gtMine, 0, 0, 0, 0) + AddGear(2172, 1417, gtMine, 0, 0, 0, 0) + AddGear(2190, 1363, gtMine, 0, 0, 0, 0) + AddGear(2219, 1332, gtMine, 0, 0, 0, 0) + AddGear(1201, 1207, gtMine, 0, 0, 0, 0) + AddGear(1247, 1205, gtMine, 0, 0, 0, 0) + AddGear(1295, 1212, gtMine, 0, 0, 0, 0) + AddGear(1356, 1209, gtMine, 0, 0, 0, 0) + AddGear(1416, 1201, gtMine, 0, 0, 0, 0) + AddGear(1466, 1201, gtMine, 0, 0, 0, 0) + AddGear(1678, 1198, gtMine, 0, 0, 0, 0) + AddGear(1738, 1198, gtMine, 0, 0, 0, 0) + AddGear(1796, 1198, gtMine, 0, 0, 0, 0) + AddGear(1637, 1217, gtMine, 0, 0, 0, 0) + AddGear(1519, 1213, gtMine, 0, 0, 0, 0) end function AfterPastFlowerAnim() @@ -221,8 +220,11 @@ AddEvent(CheckTookGirder2, {}, DoTookGirder2, {}, 0) SetGearMessage(leaks, 0) SetGearMessage(dense, 0) - TurnTimeLeft = 0 - ShowMission(loc("The Journey Back"), loc("The Savior"), loc("Get Dense Cloud out of the pit!"), 1, 5000) + EndTurn(0) + ShowMission(loc("The Journey Back"), loc("The Savior"), + loc("Get Dense Cloud out of the pit!") .. "|" .. + loc("Your hogs must survive!") .. "|" .. + loc("Beware of mines: They explode after 5 seconds."), 1, 5000) end function SkipPastFlowerAnim() @@ -240,8 +242,12 @@ AddEvent(CheckTookFire, {}, DoTookFire, {}, 0) SetGearMessage(leaks, 0) SetGearMessage(dense, 0) - TurnTimeLeft = 0 - ShowMission(loc("The Journey Back"), loc("They never learn"), loc("Free Dense Cloud and continue the mission!"), 1, 5000) + EndTurn(true) + ShowMission(loc("The Journey Back"), loc("They never learn"), + loc("Free Dense Cloud and continue the mission!") .. "|" .. + loc("Collect the weapon crate at the left coast!") .. "|" .. + loc("Your hogs must survive!") .. "|" .. + loc("Mines time: 5 seconds"), 1, 5000) end function SkipOutPitAnim() @@ -313,40 +319,40 @@ end function DumpMines() - SetTimer(AddGear(2261, 1835, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2280, 1831, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2272, 1809, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2290, 1815, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2278, 1815, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2307, 1811, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2286, 1820, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2309, 1813, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2303, 1822, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2317, 1827, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2312, 1816, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2316, 1812, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2307, 1802, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2276, 1818, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2284, 1816, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2292, 1811, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2295, 1814, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2306, 1811, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2292, 1815, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2314, 1815, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2286, 1813, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2275, 1813, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2269, 1814, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2273, 1812, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2300, 1808, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2322, 1812, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2323, 1813, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2311, 1811, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2303, 1809, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2287, 1808, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2282, 1808, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2277, 1809, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2296, 1809, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2314, 1818, gtMine, 0, 0, 0, 0), 5000) + AddGear(2261, 1835, gtMine, 0, 0, 0, 0) + AddGear(2280, 1831, gtMine, 0, 0, 0, 0) + AddGear(2272, 1809, gtMine, 0, 0, 0, 0) + AddGear(2290, 1815, gtMine, 0, 0, 0, 0) + AddGear(2278, 1815, gtMine, 0, 0, 0, 0) + AddGear(2307, 1811, gtMine, 0, 0, 0, 0) + AddGear(2286, 1820, gtMine, 0, 0, 0, 0) + AddGear(2309, 1813, gtMine, 0, 0, 0, 0) + AddGear(2303, 1822, gtMine, 0, 0, 0, 0) + AddGear(2317, 1827, gtMine, 0, 0, 0, 0) + AddGear(2312, 1816, gtMine, 0, 0, 0, 0) + AddGear(2316, 1812, gtMine, 0, 0, 0, 0) + AddGear(2307, 1802, gtMine, 0, 0, 0, 0) + AddGear(2276, 1818, gtMine, 0, 0, 0, 0) + AddGear(2284, 1816, gtMine, 0, 0, 0, 0) + AddGear(2292, 1811, gtMine, 0, 0, 0, 0) + AddGear(2295, 1814, gtMine, 0, 0, 0, 0) + AddGear(2306, 1811, gtMine, 0, 0, 0, 0) + AddGear(2292, 1815, gtMine, 0, 0, 0, 0) + AddGear(2314, 1815, gtMine, 0, 0, 0, 0) + AddGear(2286, 1813, gtMine, 0, 0, 0, 0) + AddGear(2275, 1813, gtMine, 0, 0, 0, 0) + AddGear(2269, 1814, gtMine, 0, 0, 0, 0) + AddGear(2273, 1812, gtMine, 0, 0, 0, 0) + AddGear(2300, 1808, gtMine, 0, 0, 0, 0) + AddGear(2322, 1812, gtMine, 0, 0, 0, 0) + AddGear(2323, 1813, gtMine, 0, 0, 0, 0) + AddGear(2311, 1811, gtMine, 0, 0, 0, 0) + AddGear(2303, 1809, gtMine, 0, 0, 0, 0) + AddGear(2287, 1808, gtMine, 0, 0, 0, 0) + AddGear(2282, 1808, gtMine, 0, 0, 0, 0) + AddGear(2277, 1809, gtMine, 0, 0, 0, 0) + AddGear(2296, 1809, gtMine, 0, 0, 0, 0) + AddGear(2314, 1818, gtMine, 0, 0, 0, 0) end function SetupAnimRefusedDied() @@ -439,7 +445,6 @@ midAnim = midAnimAD failAnim = failAnimAD endAnim = endAnimAD - endFailAnim = endFailAnimAD winAnim = winAnimAD end @@ -569,7 +574,7 @@ function KillPrincess() DismissTeam(loc("Cannibal Sentry")) - TurnTimeLeft = 0 + EndTurn(true) end --/////////////////////////////Misc Functions//////////////////////// @@ -600,7 +605,6 @@ function SetupPlaceAlone() ------ AMMO CRATE LIST ------ - --SpawnAmmoCrate(3122, 994, amShotgun) SpawnAmmoCrate(3124, 952, amBaseballBat) SpawnAmmoCrate(2508, 1110, amFirePunch) ------ UTILITY CRATE LIST ------ @@ -610,23 +614,22 @@ SpawnUtilityCrate(3113, 911, amParachute) sniperCrate = SpawnAmmoCrate(784, 1715, amSniperRifle) ------ MINE LIST ------ - SetTimer(AddGear(3328, 1399, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(3028, 1262, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2994, 1274, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2956, 1277, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2925, 1282, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2838, 1276, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2822, 1278, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2786, 1283, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2766, 1270, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2749, 1231, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2717, 1354, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2167, 1330, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2201, 1321, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2239, 1295, gtMine, 0, 0, 0, 0), 3000) + AddGear(3328, 1399, gtMine, 0, 0, 0, 0) + AddGear(3028, 1262, gtMine, 0, 0, 0, 0) + AddGear(2994, 1274, gtMine, 0, 0, 0, 0) + AddGear(2956, 1277, gtMine, 0, 0, 0, 0) + AddGear(2925, 1282, gtMine, 0, 0, 0, 0) + AddGear(2838, 1276, gtMine, 0, 0, 0, 0) + AddGear(2822, 1278, gtMine, 0, 0, 0, 0) + AddGear(2786, 1283, gtMine, 0, 0, 0, 0) + AddGear(2766, 1270, gtMine, 0, 0, 0, 0) + AddGear(2749, 1231, gtMine, 0, 0, 0, 0) + AddGear(2717, 1354, gtMine, 0, 0, 0, 0) + AddGear(2167, 1330, gtMine, 0, 0, 0, 0) + AddGear(2201, 1321, gtMine, 0, 0, 0, 0) + AddGear(2239, 1295, gtMine, 0, 0, 0, 0) AnimSetGearPosition(leaks, 3781, 1583) - --AnimSetGearPosition(leaks, 1650, 1583) AddAmmo(cannibals[1], amShotgun, 100) AddAmmo(leaks, amSwitch, 0) end @@ -730,17 +733,17 @@ end function PlaceCourseMines() - SetTimer(AddGear(1215, 1193, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1259, 1199, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1310, 1198, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1346, 1196, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1383, 1192, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1436, 1196, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1487, 1199, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1651, 1209, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1708, 1209, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1759, 1190, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1815, 1184, gtMine, 0, 0, 0, 0), 5000) + AddGear(1215, 1193, gtMine, 0, 0, 0, 0) + AddGear(1259, 1199, gtMine, 0, 0, 0, 0) + AddGear(1310, 1198, gtMine, 0, 0, 0, 0) + AddGear(1346, 1196, gtMine, 0, 0, 0, 0) + AddGear(1383, 1192, gtMine, 0, 0, 0, 0) + AddGear(1436, 1196, gtMine, 0, 0, 0, 0) + AddGear(1487, 1199, gtMine, 0, 0, 0, 0) + AddGear(1651, 1209, gtMine, 0, 0, 0, 0) + AddGear(1708, 1209, gtMine, 0, 0, 0, 0) + AddGear(1759, 1190, gtMine, 0, 0, 0, 0) + AddGear(1815, 1184, gtMine, 0, 0, 0, 0) end @@ -770,11 +773,15 @@ end function CheckDensePit() - return GetY(dense) < 1250 and StoppedGear(dense) + if GetHealth(dense) ~= nil then + return GetY(dense) < 1250 and StoppedGear(dense) + else + return false + end end function DoDensePit() - TurnTimeLeft = 0 + EndTurn(0) RestoreHedge(cyborg) AnimWait(cyborg, 1) AddFunction({func = AddAnim, args = {outPitAnim}}) @@ -790,7 +797,7 @@ end function DoPastFlower() - TurnTimeLeft = 0 + EndTurn(true) RestoreHedge(cyborg) AnimWait(cyborg, 1) AddFunction({func = AddAnim, args = {pastFlowerAnim}}) @@ -803,8 +810,11 @@ end function DoLeaksDead() - AddCaption(loc("The village, unprepared, was destroyed by the cyborgs...")) - DismissTeam(loc("Natives")) + if not princessDead then + EndTurn(true) + AddCaption(loc("The village, unprepared, was destroyed by the cyborgs...")) + DismissTeam(loc("Natives")) + end end function CheckDenseDead() @@ -812,8 +822,11 @@ end function DoDenseDead() - AddCaption(loc("The village, unprepared, was destroyed by the cyborgs...")) - DismissTeam(loc("Natives")) + if not princessDead then + EndTurn(true) + AddCaption(loc("The village, unprepared, was destroyed by the cyborgs...")) + DismissTeam(loc("Natives")) + end end function CheckTookBlowTorch() @@ -821,7 +834,10 @@ end function DoTookBlowTorch() - ShowMission(loc("The Journey Back"), loc("The Tunnel Maker"), loc("Hint: Select the blowtorch, aim and press [Fire]. Press [Fire] again to stop.").."|"..loc("Don't blow up the crate."), 0, 6000) + ShowMission(loc("The Journey Back"), loc("The Tunnel Maker"), + loc("Get past the flower.").."|".. + loc("Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop.").."|".. + loc("Don't blow up the crate."), 0, 6000) end function CheckTookLowGravity() @@ -829,7 +845,10 @@ end function DoTookLowGravity() - ShowMission(loc("The Journey Back"), loc("The Moonwalk"), loc("Hint: Select the low gravity and press [Fire]."), 0, 6000) + ShowMission(loc("The Journey Back"), loc("The Moonwalk"), + loc("Hop on top of the next flower and advance to the left coast.").."|".. + loc("Hint: Select the low gravity and press [Fire].") .. "|" .. + loc("Beware of mines: They explode after 3 seconds."), 0, 6000) end function CheckOnBridge() @@ -837,7 +856,7 @@ end function DoOnBridge() - TurnTimeLeft = 0 + EndTurn(true) RestoreHedge(cyborg) RestoreHedge(princess) AnimWait(cyborg, 1) @@ -860,7 +879,9 @@ function DoOnFirstGirder() PlaceCourseMines() - ShowMission(loc("The Journey Back"), loc("Slippery"), loc("You'd better watch your steps..."), 0, 4000) + ShowMission(loc("The Journey Back"), loc("Slippery"), + loc("Collect the weapon crate at the left coast!") .. "|" .. + loc("You'd better watch your steps..."), 0, 4000) end function CheckTookSniper() @@ -868,7 +889,7 @@ end function DoTookSniper() - TurnTimeLeft = 0 + EndTurn(true) RestoreHedge(cyborg) RestoreHedge(princess) AnimWait(cyborg, 1) @@ -881,7 +902,7 @@ end function DoTookSniper2() - TurnTimeLeft = 0 + EndTurn(true) RestoreHedge(cyborg) RestoreHedge(princess) AnimWait(cyborg, 1) @@ -894,8 +915,12 @@ end function DoLost() + if not cyborgDead then + SwitchHog(cyborg) + end AddAnim(endFailAnim) - AddFunction({func = DismissTeam, args = {loc('Natives')}}) + AddFunction({func = DismissTeam, args = {loc("Natives")}}) + AddFunction({func = EndTurn, args = {true}}) end function CheckWon() @@ -903,6 +928,7 @@ end function DoWon() + victory = true if progress and progress<3 then SaveCampaignVar("Progress", "3") end @@ -914,7 +940,7 @@ SwitchHog(leaks) DismissTeam(loc("Cannibal Sentry")) DismissTeam(loc("011101001")) - TurnTimeLeft = 0 + EndTurn(true) end function CheckFailedCourse() @@ -922,7 +948,7 @@ end function DoFailedCourse() - TurnTimeLeft = 0 + EndTurn(true) RestoreHedge(cyborg) RestoreHedge(princess) AnimWait(cyborg, 1) @@ -933,12 +959,23 @@ --////////////////////////////Main Functions///////////////////////// function onGameInit() + progress = tonumber(GetCampaignVar("Progress")) + m2Choice = tonumber(GetCampaignVar("M2Choice")) + m2DenseDead = tonumber(GetCampaignVar("M2DenseDead")) + m2RamonDead = tonumber(GetCampaignVar("M2RamonDead")) + m2SpikyDead = tonumber(GetCampaignVar("M2SpikyDead")) + Seed = 0 GameFlags = gfSolidLand + gfDisableWind TurnTime = 40000 CaseFreq = 0 MinesNum = 0 - MinesTime = 3000 + + if m2DenseDead == 1 then + MinesTime = 3000 + else + MinesTime = 5000 + end Explosives = 0 Delay = 5 Map = "A_Classic_Fairytale_journey" @@ -977,11 +1014,6 @@ end function onGameStart() - progress = tonumber(GetCampaignVar("Progress")) - m2Choice = tonumber(GetCampaignVar("M2Choice")) - m2DenseDead = tonumber(GetCampaignVar("M2DenseDead")) - m2RamonDead = tonumber(GetCampaignVar("M2RamonDead")) - m2SpikyDead = tonumber(GetCampaignVar("M2SpikyDead")) StartMission() end @@ -1001,13 +1033,13 @@ fireTaken = true elseif gear == gravityCrate then gravityTaken = true - elseif gear == leaks then + elseif gear == leaks and not victory then leaksDead = true - elseif gear == dense then + elseif gear == dense and not victory then denseDead = true elseif gear == cyborg then cyborgDead = true - elseif gear == princess then + elseif gear == princess and not victory then princessDead = true elseif gear == girderCrate then girderTaken = true @@ -1045,13 +1077,15 @@ function onNewTurn() if AnimInProgress() then TurnTimeLeft = -1 + elseif victory then + EndTurn(true) elseif stage == endStage and CurrentHedgehog ~= leaks then AnimSwitchHog(leaks) SetGearMessage(leaks, 0) TurnTimeLeft = -1 elseif GetHogTeamName(CurrentHedgehog) ~= loc("Natives") then for i = 1, 4 do - if cannibalDead[i] ~= true then + if cannibalDead[i] ~= true and leaksDead ~= true then if GetX(cannibals[i]) < GetX(leaks) then HogTurnLeft(cannibals[i], false) else @@ -1072,8 +1106,5 @@ SetAnimSkip(true) return end --- AddAmmo(leaks, amRope, 100) --- RemoveEventFunc(CheckPastFlower) --- DeleteGear(sniperCrate) end diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/queen.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/queen.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/queen.lua Sat Apr 29 23:49:39 2017 +0200 @@ -488,7 +488,7 @@ SetHealth(SpawnHealthCrate(2087, 50), 25) SetHealth(SpawnHealthCrate(2143, 54), 25) SetHealth(SpawnHealthCrate(70, 1308), 25) - ShowMission(loc("Long Live The Queen"), loc("Bullseye"), lob("Good job! Defeat the rest of the aliens!"), 1, 0) + ShowMission(loc("Long Live The Queen"), loc("Bullseye"), loc("Good job! Defeat the rest of the aliens!"), 1, 0) TurnTimeLeft = 0 end -----------------------------Events------------------------------------ diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/united.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/united.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/united.lua Sat Apr 29 23:49:39 2017 +0200 @@ -490,7 +490,7 @@ SetAmmo(amGirder, 4, 0, 0, 2) SetAmmo(amParachute, 4, 0, 0, 2) SetAmmo(amSwitch, 8, 0, 0, 2) - SetAmmo(amSkip, 8, 0, 0, 0) + SetAmmo(amSkip, 9, 0, 0, 0) SetAmmo(amRope, 5, 0, 0, 3) SetAmmo(amBlowTorch, 3, 0, 0, 3) SetAmmo(amPickHammer, 0, 0, 0, 3) diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Challenge/Basic_Training_-_Sniper_Rifle.lua --- a/share/hedgewars/Data/Missions/Challenge/Basic_Training_-_Sniper_Rifle.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Challenge/Basic_Training_-_Sniper_Rifle.lua Sat Apr 29 23:49:39 2017 +0200 @@ -361,6 +361,6 @@ SendStat(siCustomAchievement, string.format(loc("You have made %d shots."), shots)) end_score_overall = end_score_targets end + SendStat(siPointType, loc("points")) SendStat(siPlayerKills, tostring(end_score_overall), loc("Sniperz")) - SendStat(siPointType, loc("points")) end diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Challenge/User_Mission_-_RCPlane_Challenge.lua --- a/share/hedgewars/Data/Missions/Challenge/User_Mission_-_RCPlane_Challenge.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Challenge/User_Mission_-_RCPlane_Challenge.lua Sat Apr 29 23:49:39 2017 +0200 @@ -466,7 +466,7 @@ end if(planesUsed == 1) then SendStat(siCustomAchievement, loc("Congratulations! You have truly mastered this challenge! Don't forget to save the demo.")) - SendStat(siCustomAchievement, string.format(loc("You have gained an achievement: %s"), loc("Prestigious Pilot"))) + SendStat(siCustomAchievement, string.format(loc("Achievement gotten: %s"), loc("Prestigious Pilot"))) end ShowMission ( diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Challenge/User_Mission_-_That_Sinking_Feeling.lua --- a/share/hedgewars/Data/Missions/Challenge/User_Mission_-_That_Sinking_Feeling.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Challenge/User_Mission_-_That_Sinking_Feeling.lua Sat Apr 29 23:49:39 2017 +0200 @@ -226,8 +226,8 @@ GameOver = true AddCaption(loc("The flood has stopped! Challenge over.")) SendStat(siGameResult, loc("Challenge completed!")) + SendStat(siPointType, loc("rescues")) SendStat(siPlayerKills, tostring(hhCount), loc("Nameless Heroes")) - SendStat(siPointType, loc("rescues")) -- Do not count drowning hedgehogs local hhLeft = hhCount @@ -241,7 +241,7 @@ SendStat(siCustomAchievement, string.format(loc("You saved %d of 8 Hapless Hogs."), hhLeft)) if hhLeft == 8 then - AddCaption(loc("Achievement obtained: Lively Lifeguard"),0xffba00ff,capgrpMessage2) + AddCaption(string.format(loc("Achievement gotten: %s"), loc("Lively Lifeguard")) ,0xffba00ff,capgrpMessage2) SendStat(siCustomAchievement, loc("You have obtained an achievement: Lively Lifeguard")) end EndGame() @@ -290,8 +290,8 @@ else SendStat(siCustomAchievement, loc("You haven't rescued anyone.")) end + SendStat(siPointType, loc("points")) SendStat(siPlayerKills, "0", loc("Nameless Heroes")) - SendStat(siPointType, loc("points")) SendStat(siGameResult, loc("Disqualified!")) GameOver = true diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Scenario/User_Mission_-_Bamboo_Thicket.lua --- a/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Bamboo_Thicket.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Bamboo_Thicket.lua Sat Apr 29 23:49:39 2017 +0200 @@ -25,7 +25,7 @@ AddTeam(loc("Pathetic Resistance"), 14483456, "Simple", "Island", "Default", "cm_yinyang") player = AddHog(loc("Ikeda"), 0, 10, "StrawHat") - AddTeam(loc("Cybernetic Empire"), 1175851, "Simple", "Island", "Default", "cm_cyborg") + AddTeam(loc("Cybernetic Empire"), 1175851, "Simple", "Island", "Robot", "cm_cyborg") enemy = AddHog(loc("Unit 835"), 1, 10, "cyborg1") SetGearPosition(player,142,656) @@ -80,7 +80,7 @@ ShowMission(loc("Bamboo Thicket"), loc("MISSION SUCCESSFUL"), loc("Congratulations!"), 0, 0) if (turnNumber < 6) and (firedShell == false) then - AddCaption(loc("Achievement Unlocked") .. ": " .. loc("Energetic Engineer"),0xffba00ff,capgrpMessage2) + AddCaption(string.format(loc("Achievement gotten: %s"), loc("Energetic Engineer")),0xffba00ff,capgrpMessage2) end elseif gear == player then diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Scenario/User_Mission_-_Dangerous_Ducklings.lua --- a/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Dangerous_Ducklings.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Dangerous_Ducklings.lua Sat Apr 29 23:49:39 2017 +0200 @@ -136,7 +136,7 @@ elseif (gear == instructor) and (GetY(gear) > WaterLine) then HogSay(player, loc("See ya!"), SAY_THINK) TurnTimeLeft = 3000 - AddCaption(loc("Achievement Unlocked") .. ": " .. loc("Naughty Ninja"),0xffba00ff,capgrpMessage2) + AddCaption(string.format(loc("Achievement gotten: %s"), loc("Naughty Ninja")) ,0xffba00ff,capgrpMessage2) DismissTeam(loc("Blue Team")) gameWon = true elseif gear == enemy then diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Scenario/User_Mission_-_Diver.lua --- a/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Diver.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Diver.lua Sat Apr 29 23:49:39 2017 +0200 @@ -47,7 +47,10 @@ AddGear(579, 296, gtMine, 0, 0, 0, 0) - ShowMission(loc("Operation Diver"), loc("Scenario"), loc("Eliminate the enemy before the time runs out.") .. "|" .. loc("Mines time: 1 second"), -amFirePunch, 0); + ShowMission(loc("Diver"), loc("Scenario"), + loc("Eliminate the enemy before the time runs out.") .. "|" .. + loc("Unlimited Attacks: Attacks don't end your turn") .. "|" .. + loc("Mines time: 1 second"), -amFirePunch, 0); --SetTag(AddGear(0, 0, gtATSmoothWindCh, 0, 0, 0, 1), -70) SetWind(-100) @@ -91,9 +94,9 @@ function onGearDelete(gear) if (gear == enemy) and (GameOver == false) then - ShowMission(loc("Operation Diver"), loc("MISSION SUCCESSFUL"), loc("Congratulations!"), 0, 0) + ShowMission(loc("Diver"), loc("MISSION SUCCESSFUL"), loc("Congratulations!"), 0, 0) elseif gear == player then - ShowMission(loc("Operation Diver"), loc("MISSION FAILED"), loc("Oh no! Just try again!"), -amSkip, 0) + ShowMission(loc("Diver"), loc("MISSION FAILED"), loc("Oh no! Just try again!"), -amSkip, 0) GameOver = true end diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Scenario/User_Mission_-_Newton_and_the_Hammock.lua --- a/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Newton_and_the_Hammock.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Newton_and_the_Hammock.lua Sat Apr 29 23:49:39 2017 +0200 @@ -26,7 +26,7 @@ AddTeam(loc("Pathetic Resistance"), 14483456, "Simple", "Island", "Default", "cm_duckhead") player = AddHog(loc("Ikeda"), 0, 48, "StrawHat") - AddTeam(loc("Cybernetic Empire"), 1175851, "Simple", "Island", "Default", "cm_cyborg") + AddTeam(loc("Cybernetic Empire"), 1175851, "Simple", "Island", "Robot", "cm_cyborg") enemy = AddHog(loc("Unit") .. " 811", 1, 100, "cyborg1") SetGearPosition(player,430,1540) diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Scenario/User_Mission_-_Nobody_Laugh.lua --- a/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Nobody_Laugh.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Nobody_Laugh.lua Sat Apr 29 23:49:39 2017 +0200 @@ -54,7 +54,9 @@ ShowMission( loc("Nobody Laugh"), loc("Scenario"), - loc("Eliminate the enemy.") + loc("Eliminate the enemy.") .. "|" .. + loc("Unlimited Attacks: Attacks don't end your turn") .. "|".. + loc("Per-hog Ammo: Weapons are not shared between hogs") , 0, 0 ) diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Scenario/User_Mission_-_Spooky_Tree.lua --- a/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Spooky_Tree.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Spooky_Tree.lua Sat Apr 29 23:49:39 2017 +0200 @@ -82,7 +82,10 @@ GirderCrate = SpawnAmmoCrate(1789,514,amShotgun) -- final shotgun SpawnAmmoCrate(1181,419,amBee) - ShowMission(loc("Spooky Tree"), loc("Scenario"), loc("Eliminate the enemy before the time runs out.") .. "|" .. loc("Mines time: 0 seconds"), -amBee, 0) + ShowMission(loc("Spooky Tree"), loc("Scenario"), + loc("Eliminate the enemy before the time runs out.") .. "|" .. + loc("Unlimited Attacks: Attacks don't end your turn") .. "|" .. + loc("Mines time: 0 seconds"), -amBee, 0) SetWind(-75) diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Scenario/User_Mission_-_Teamwork.lua --- a/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Teamwork.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Teamwork.lua Sat Apr 29 23:49:39 2017 +0200 @@ -107,11 +107,8 @@ if GetGearType(gear) == gtCase then TurnTimeLeft = TurnTimeLeft + 5000 end - - if (gear == enemy) and (GameOver == false) then - ShowMission(loc("Teamwork"), loc("MISSION SUCCESSFUL"), loc("Congratulations!"), 0, 0) - GameOver = true - elseif ( ((gear == player) or (gear == p2)) and (GameOver == false)) then + -- Note: The victory sequence is done automatically by Hedgewars + if ( ((gear == player) or (gear == p2)) and (GameOver == false)) then ShowMission(loc("Teamwork"), loc("MISSION FAILED"), loc("Oh no! Just try again!"), -amSkip, 0) GameOver = true SetHealth(p2,0) diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Scenario/User_Mission_-_Teamwork_2.lua --- a/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Teamwork_2.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Teamwork_2.lua Sat Apr 29 23:49:39 2017 +0200 @@ -9,7 +9,6 @@ local Pack = nil local help = false local GameOver = false -local skipTime = 0 function onGameInit() Seed = 0 @@ -70,6 +69,13 @@ AddGear(1668, 842, gtExplosives, 0, 0, 0, 0) AddGear(1713, 969, gtExplosives, 0, 0, 0, 0) SetWind(90) + + -- The enemy has no weapons and can only skip + for i=0, AmmoTypeMax do + if i ~= amNothing and i ~= amSkip then + AddAmmo(enemy, i, 0) + end + end end function onGearAdd(gear) @@ -89,28 +95,12 @@ SetAmmo(amDynamite, 0, 0, 0, 1) end ---[[ This is some hackery to make the enemy hedgehog skip ]] -function onNewTurn() - if CurrentHedgehog == enemy then - skipTime = GameTime + 1 - end -end - -function onGameTick20() - if CurrentHedgehog == enemy and skipTime ~= 0 and skipTime < GameTime then - ParseCommand("/skip") - skipTime = 0 - end -end - function onGearDelete(gear) if gear == Pack then HogSay(CurrentHedgehog, loc("This will certianly come in handy."), SAY_THINK) end - if (gear == enemy) and (GameOver == false) then - ShowMission(loc("Teamwork 2"), loc("MISSION SUCCESSFUL"), loc("Congratulations!"), 0, 0) - GameOver = true - elseif ( ((gear == player) or (gear == hlayer)) and (GameOver == false)) then + -- Note: The victory sequence is done automatically by Hedgewars + if ( ((gear == player) or (gear == hlayer)) and (GameOver == false)) then ShowMission(loc("Teamwork 2"), loc("MISSION FAILED"), loc("Oh no! Just try again!"), -amSkip, 0) GameOver = true SetHealth(hlayer, 0) diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Scenario/User_Mission_-_The_Great_Escape.lua --- a/share/hedgewars/Data/Missions/Scenario/User_Mission_-_The_Great_Escape.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_The_Great_Escape.lua Sat Apr 29 23:49:39 2017 +0200 @@ -80,13 +80,13 @@ SetHealth(player, 1) SetHealth(enemy, 1) ------ AMMO CRATE LIST ------ -SpawnAmmoCrate(1632,943,5) -SpawnAmmoCrate(1723,888,12) -SpawnAmmoCrate(1915,599,1) +SpawnAmmoCrate(1632,943,amShotgun) +SpawnAmmoCrate(1723,888,amFirePunch) +SpawnAmmoCrate(1915,599,amGrenade) +SpawnAmmoCrate(1416,913,amBlowTorch) +SpawnAmmoCrate(1227,640,amPickHammer) ------ UTILITY CRATE LIST ------ -SpawnUtilityCrate(1519,945,15) -SpawnUtilityCrate(1227,640,6) -SpawnUtilityCrate(1416,913,18) +SpawnUtilityCrate(1519,945,amParachute) ------ END LOADING DATA ------ end diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Scenario/portal.lua --- a/share/hedgewars/Data/Missions/Scenario/portal.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Scenario/portal.lua Sat Apr 29 23:49:39 2017 +0200 @@ -128,19 +128,13 @@ --UTILITY CRATE-- parachute = SpawnUtilityCrate(1670, 1165, amParachute) girder = SpawnUtilityCrate(2101, 1297, amGirder) - SpawnUtilityCrate(3965, 625, amBlowTorch) - SpawnUtilityCrate(2249, 93, amBlowTorch) - SpawnUtilityCrate(2181, 829, amBlowTorch) - SpawnUtilityCrate(1820, 567, amBlowTorch) SpawnUtilityCrate(1375, 900, amTeleport) - SpawnUtilityCrate(130, 600, amPickHammer) SpawnUtilityCrate(1660,1820, amLaserSight) SpawnUtilityCrate(4070,1840, amLaserSight) - + portalgun = SpawnUtilityCrate(505, 1943, amPortalGun, 1000) + extratime = SpawnUtilityCrate(4020, 785, amExtraTime, 2) --AMMO CRATE-- - portalgun = SpawnAmmoCrate(505, 1943, amPortalGun, 1000) - extratime = SpawnAmmoCrate(4020, 785, amExtraTime, 2) SpawnAmmoCrate(425, 613, amSnowball) SpawnAmmoCrate(861, 633, amHellishBomb) SpawnAmmoCrate(2510, 623, amSnowball) @@ -150,6 +144,11 @@ SpawnAmmoCrate(3000, 100, amDEagle) SpawnAmmoCrate(2900, 1400, amRope) SpawnAmmoCrate(4025, 1117, amFirePunch) + SpawnAmmoCrate(3965, 625, amBlowTorch) + SpawnAmmoCrate(2249, 93, amBlowTorch) + SpawnAmmoCrate(2181, 829, amBlowTorch) + SpawnAmmoCrate(1820, 567, amBlowTorch) + SpawnAmmoCrate(130, 600, amPickHammer) --HEALTH CRATE-- SpawnHealthCrate(2000, 780) diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Training/Basic_Training_-_Bazooka.lua --- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Bazooka.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Bazooka.lua Sat Apr 29 23:49:39 2017 +0200 @@ -66,7 +66,7 @@ -- The base number for the random number generator Seed = 1 -- Game settings and rules - EnableGameFlags(gfMultiWeapon, gfOneClanMode, gfSolidLand) + EnableGameFlags(gfMultiWeapon, gfOneClanMode, gfSolidLand, gfDisableWind) -- Uncommenting this wouldn't do anything --EnableGameFlags(gfMultiWeapon, gfOneClanMode, gfSolidLand) -- Neither this @@ -108,6 +108,7 @@ SendHealthStatsOff() -- Spawn the first target. spawnTarget() + SetWind(-20) -- Show some nice mission goals. -- Parameters are: caption, sub caption, description, diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Missions/Training/Basic_Training_-_Rope.lua --- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Rope.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Rope.lua Sat Apr 29 23:49:39 2017 +0200 @@ -39,7 +39,7 @@ AddCaption( loc( "Victory!" )) if TurnTimeLeft >= 250000 then -- If you very fast, unlock the ahievement "Rope Master!" RopeMaster = true - AddCaption( loc( "Achievement obtained: Rope Master!" ),0xffba00ff,capgrpAmmoinfo ) + AddCaption( string.format(loc( "Achievement gotten: %s"), loc("Rope Master") ),0xffba00ff,capgrpAmmoinfo ) PlaySound( sndHomerun ) end Objective = true diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.hwp Binary file share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.hwp has changed diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua Sat Apr 29 23:49:39 2017 +0200 @@ -1628,6 +1628,8 @@ loc("|Cursor: Place crate")) SetAmmoTexts(amDrillStrike, loc("Object Placer"), loc("Construction Mode tool"), loc("This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object")) + SetAmmoDescriptionAppendix(amTeleport, loc("It only works in teleportation nodes of your own clan.")) + sCirc = AddVisualGear(0,0,vgtCircle,0,true) SetVisualGearValues(sCirc, 0, 0, 100, 255, 1, 10, 0, 40, 3, 0x00000000) diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Scripts/Multiplayer/Frenzy.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Frenzy.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Frenzy.lua Sat Apr 29 23:49:39 2017 +0200 @@ -4,37 +4,36 @@ ------------------------------------------- HedgewarsScriptLoad("/Scripts/Locale.lua") -HedgewarsScriptLoad("/Scripts/Tracker.lua") local cTimer = 0 local cn = 0 -function initialSetup(gear) - SetHealth(gear, 75) -- official is 80, but that assumes bazookas/grenades that do 50 damage -end +local frenzyAmmos = { + amBazooka, + amGrenade, + amMolotov, + amShotgun, + amFirePunch, + amMine, + amJetpack, + amBlowTorch, + amTeleport, + amLowGravity +} function showStartingInfo() ruleSet = "" .. - loc("RULES") .. ": " .. "|" .. + loc("RULES:") .. " |" .. loc("Each turn is only ONE SECOND!") .. "|" .. loc("Use your ready time to think.") .. "|" .. - loc("Slot keys save time! (F1-F10 by default)") .. "|" .. - " |" .. - loc("SLOTS") .. ": " .. "|" .. - loc("Slot") .. " 1 - " .. loc("Bazooka") .. "|" .. - loc("Slot") .. " 2 - " .. loc("Grenade") .. "|" .. - loc("Slot") .. " 3 - " .. loc("Shotgun") .. "|" .. - loc("Slot") .. " 4 - " .. loc("Shoryuken") .. "|" .. - loc("Slot") .. " 5 - " .. loc("Mine") .. "|" .. - loc("Slot") .. " 6 - " .. loc("Teleport") .. "|" .. - loc("Slot") .. " 7 - " .. loc("Blowtorch") .. "|" .. - loc("Slot") .. " 8 - " .. loc("Flying Saucer") .. "|" .. - loc("Slot") .. " 9 - " .. loc("Molotov") .. "|" .. - loc("Slot") .. " 10 - " .. loc("Low Gravity") + loc("Slot keys save time! (F1-F10 by default)") .. "| |" + for i=1, #frenzyAmmos do + ruleSet = ruleSet .. string.format(loc("Slot %d: %s"), i, GetAmmoName(frenzyAmmos[i])) .. "|" + end ShowMission(loc("FRENZY"), - loc("a frenetic Hedgewars mini-game"), + loc("A frenetic Hedgewars mini-game"), ruleSet, 0, 4000) end @@ -68,7 +67,6 @@ function onGameStart() showStartingInfo() - runOnHogs(initialSetup) end function onSlot(sln) @@ -87,56 +85,19 @@ end end +-- Keyboard slot shortcuts function ChangeWep(s) - if s == 0 then - SetWeapon(amBazooka) - elseif s == 1 then - SetWeapon(amGrenade) - elseif s == 2 then - SetWeapon(amShotgun) - elseif s == 3 then - SetWeapon(amFirePunch) - elseif s == 4 then - SetWeapon(amMine) - elseif s == 5 then - SetWeapon(amTeleport) - elseif s == 6 then - SetWeapon(amBlowTorch) - elseif s == 7 then - SetWeapon(amJetpack) - elseif s == 8 then - SetWeapon(amMolotov) - elseif s == 9 then - SetWeapon(amLowGravity) + if s >= 0 and s <= 9 then + SetWeapon(frenzyAmmos[s+1]) end end -function onGearAdd(gear) - if GetGearType(gear) == gtHedgehog then - trackGear(gear) +function onAmmoStoreInit() + -- Add frenzy ammos + for i=1, #frenzyAmmos do + SetAmmo(frenzyAmmos[i], 9, 0, 0, 0) end -end - -function onGearDelete(gear) - if GetGearType(gear) == gtHedgehog then - trackDeletion(gear) - end + SetAmmo(amSkip, 9, 0, 0, 0) end - -function onAmmoStoreInit() - SetAmmo(amBazooka, 9, 0, 0, 0) - SetAmmo(amGrenade, 9, 0, 0, 0) - SetAmmo(amMolotov, 9, 0, 0, 0) - SetAmmo(amShotgun, 9, 0, 0, 0) - --SetAmmo(amFlamethrower, 9, 0, 0, 0) -- this was suggested on hw.org but it's not present on base - SetAmmo(amFirePunch, 9, 0, 0, 0) - SetAmmo(amMine, 9, 0, 0, 0) - --SetAmmo(amCake, 1, 0, 2, 0) -- maybe it's beefcake? - SetAmmo(amJetpack, 9, 0, 0, 0) - SetAmmo(amBlowTorch, 9, 0, 0, 0) - SetAmmo(amTeleport, 9, 0, 0, 0) - SetAmmo(amLowGravity, 9, 0, 0, 0) - --SetAmmo(amSkipGo, 9, 0, 0, 0) -- not needed with 1s turn time -end diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Scripts/Multiplayer/HedgeEditor.hwp Binary file share/hedgewars/Data/Scripts/Multiplayer/HedgeEditor.hwp has changed diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Scripts/Multiplayer/HedgeEditor.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/HedgeEditor.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/HedgeEditor.lua Sat Apr 29 23:49:39 2017 +0200 @@ -276,6 +276,9 @@ -- experimental crap --local destroyMap = false +-- Special frames in Ammos.png/Ammos_bw.png +local ammoFrameAirAttack = 63 + ----------------------------------------- -- tracking vars for save/load purposes ----------------------------------------- @@ -320,79 +323,78 @@ local atkArray = { - {amBazooka, "amBazooka", 2}, - {amBee, "amBee", 3}, - {amMortar, "amMortar", 21}, - {amDrill, "amDrill", 28}, - {amSnowball, "amSnowball", 50}, - - {amGrenade, "amGrenade", 0}, - {amClusterBomb, "amClusterBomb", 1}, - {amWatermelon, "amWatermelon", 25}, - {amHellishBomb, "amHellishBomb", 26}, - {amMolotov, "amMolotov", 39}, - {amGasBomb, "amGasBomb", 43}, - - {amShotgun, "amShotgun", 4}, - {amDEagle, "amDEagle", 9}, - {amSniperRifle, "amSniperRifle", 37}, - {amSineGun, "amSineGun", 44}, - {amFlamethrower,"amFlamethrower", 45}, - {amIceGun, "amIceGun", 53}, - - {amFirePunch, "amFirePunch", 11}, - {amWhip, "amWhip", 12}, - {amBaseballBat, "amBaseballBat", 13}, - {amKamikaze, "amKamikaze", 22}, - {amSeduction, "amSeduction", 24}, - {amHammer, "amHammer", 47}, - - {amMine, "amMine", 8}, - {amDynamite, "amDynamite", 10}, - {amCake, "amCake", 23}, - {amBallgun, "amBallgun", 29}, - {amRCPlane, "amRCPlane", 30}, - {amSMine, "amSMine", 46}, - - {amAirAttack, "amAirAttack", 15}, - {amMineStrike, "amMineStrike", 16}, - {amNapalm, "amNapalm", 27}, - {amPiano, "amPiano", 42}, - {amDrillStrike, "amDrillStrike", 49}, - {amAirMine, "amAirMine", 56}, - - {amKnife, "amKnife", 54}, - - {amBirdy, "amBirdy", 40}, - {amDuck, "amDuck", 57}, + {amBazooka, "amBazooka"}, + {amBee, "amBee"}, + {amMortar, "amMortar"}, + {amDrill, "amDrill"}, + {amSnowball, "amSnowball"}, + + {amGrenade, "amGrenade"}, + {amClusterBomb, "amClusterBomb"}, + {amWatermelon, "amWatermelon"}, + {amHellishBomb, "amHellishBomb"}, + {amMolotov, "amMolotov"}, + {amGasBomb, "amGasBomb"}, + + {amShotgun, "amShotgun"}, + {amDEagle, "amDEagle"}, + {amSniperRifle, "amSniperRifle"}, + {amSineGun, "amSineGun"}, + {amFlamethrower,"amFlamethrower"}, + {amIceGun, "amIceGun"}, + + {amFirePunch, "amFirePunch"}, + {amWhip, "amWhip"}, + {amBaseballBat, "amBaseballBat"}, + {amKamikaze, "amKamikaze"}, + {amSeduction, "amSeduction"}, + {amHammer, "amHammer"}, + + {amMine, "amMine"}, + {amDynamite, "amDynamite"}, + {amCake, "amCake"}, + {amBallgun, "amBallgun"}, + {amRCPlane, "amRCPlane"}, + {amSMine, "amSMine"}, + + {amAirAttack, "amAirAttack", ammoFrameAirAttack}, -- overwritten icon in Ammos.png + {amMineStrike, "amMineStrike"}, + {amNapalm, "amNapalm"}, + {amPiano, "amPiano"}, + {amDrillStrike, "amDrillStrike"}, + {amAirMine, "amAirMine"}, + + {amPickHammer, "amPickHammer"}, + {amBlowTorch, "amBlowTorch"}, + {amKnife, "amKnife"}, + + {amBirdy, "amBirdy"}, + {amDuck, "amDuck"}, } local utilArray = { - - {amPickHammer, "amPickHammer", 5}, - {amBlowTorch, "amBlowTorch", 17}, - {amGirder, "amGirder", 18}, - {amLandGun, "amLandGun", 52}, - {amRubber, "amRubber", 55}, - - {amRope, "amRope", 7}, - {amParachute, "amParachute", 14}, - {amTeleport, "amTeleport", 19}, - {amJetpack, "amJetpack", 38}, - {amPortalGun, "amPortalGun", 41}, - - {amInvulnerable,"amInvulnerable", 33}, - {amLaserSight, "amLaserSight", 35}, - {amVampiric, "amVampiric", 36}, - {amResurrector, "amResurrector", 48}, - {amTardis, "amTardis", 51}, - - {amSwitch, "amSwitch", 20}, - {amLowGravity, "amLowGravity", 31}, - {amExtraDamage, "amExtraDamage", 32}, - {amExtraTime, "amExtraTime", 34}, + {amGirder, "amGirder"}, + {amLandGun, "amLandGun"}, + {amRubber, "amRubber"}, + + {amRope, "amRope"}, + {amParachute, "amParachute"}, + {amTeleport, "amTeleport"}, + {amJetpack, "amJetpack"}, + {amPortalGun, "amPortalGun"}, + + {amInvulnerable,"amInvulnerable"}, + {amLaserSight, "amLaserSight"}, + {amVampiric, "amVampiric"}, + {amResurrector, "amResurrector"}, + {amTardis, "amTardis"}, + + {amSwitch, "amSwitch"}, + {amLowGravity, "amLowGravity"}, + {amExtraDamage, "amExtraDamage"}, + {amExtraTime, "amExtraTime"}, } @@ -572,7 +574,7 @@ } local reducedSpriteIDArray = { - sprAmRubber, sprAmGirder, sprTargetBee, sprIceTexture, sprHHTelepMask, + sprTargetBee, sprAmGirder, sprAmRubber, sprIceTexture, sprHHTelepMask, sprAMAmmos, sprAMAmmosBW, sprAMSlot, sprAMCorners, sprTurnsLeft, sprBotlevels, sprSpeechCorner, sprSpeechEdge, sprSpeechTail, sprThoughtCorner, sprThoughtEdge, sprThoughtTail, sprShoutCorner, sprShoutEdge, sprShoutTail, sprCustom1, sprCustom2, } @@ -581,7 +583,7 @@ local reducedSpriteIDArrayFrames local reducedSpriteTextArray = { - "sprAmRubber", "sprAmGirder", "sprTargetBee", "sprIceTexture", "sprHHTelepMask", + "sprTargetBee", "sprAmGirder", "sprAmRubber", "sprIceTexture", "sprHHTelepMask", "sprAMAmmos", "sprAMAmmosBW", "sprAMSlot", "sprAMCorners", "sprTurnsLeft", "sprBotlevels", "sprSpeechCorner", "sprSpeechEdge", "sprSpeechTail", "sprThoughtCorner", "sprThoughtEdge", "sprThoughtTail", "sprShoutCorner", "sprShoutEdge", "sprShoutTail", "sprCustom1", "sprCustom2", } @@ -764,14 +766,12 @@ -- Weapon Crates elseif (specialPointsFlag[i] >= 20) and (specialPointsFlag[i] < (#atkArray+20)) then tempG = SpawnAmmoCrate(specialPointsX[i],specialPointsY[i],atkArray[specialPointsFlag[i]-19][1]) - setGearValue(tempG,"caseType","ammo") setGearValue(tempG,"contents",atkArray[specialPointsFlag[i]-19][2]) -- Utility Crates elseif (specialPointsFlag[i] >= (#atkArray+20)) and (specialPointsFlag[i] < (#atkArray+20+#utilArray)) then tempG = SpawnUtilityCrate(specialPointsX[i],specialPointsY[i],utilArray[specialPointsFlag[i]-19-#atkArray][1]) - setGearValue(tempG,"caseType","util") setGearValue(tempG,"contents",utilArray[specialPointsFlag[i]-19-#atkArray][2]) --79-82 (reserved for future wep crates) @@ -988,7 +988,13 @@ placedTint[pID] = 255 + (255*0x100) + (255*0x10000) + (255*0x1000000) -- A BGR end - return PlaceSprite(placedX[pID], placedY[pID], placedSprite[pID], placedFrame[pID], + -- Special case: Placing amAirAttack of the ammos sprite (since this one is overwritten) + local actualDisplayedImage = placedFrame[pID] + if (placedSprite[pID] == sprAMAmmos or placedSprite[pID] == sprAMAmmosBW) and (actualDisplayedImage == (amAirAttack - 1)) then + actualDisplayedImage = ammoFrameAirAttack + end + + return PlaceSprite(placedX[pID], placedY[pID], placedSprite[pID], actualDisplayedImage, placedTint[pID], nil, -- overrite existing land nil, nil, -- this stuff specifies flipping @@ -1157,16 +1163,13 @@ elseif cat[cIndex] == loc("Health Crate Placement Mode") then gear = SpawnHealthCrate(x,y) SetHealth(gear, pMode[pIndex]) - setGearValue(gear,"caseType","med") elseif cat[cIndex] == loc("Weapon Crate Placement Mode") then gear = SpawnAmmoCrate(x, y, atkArray[pIndex][1]) placedSpec[placedCount] = atkArray[pIndex][2] - setGearValue(gear,"caseType","ammo") setGearValue(gear,"contents",atkArray[pIndex][2]) elseif cat[cIndex] == loc("Utility Crate Placement Mode") then gear = SpawnUtilityCrate(x, y, utilArray[pIndex][1]) placedSpec[placedCount] = utilArray[pIndex][2] - setGearValue(gear,"caseType","util") setGearValue(gear,"contents",utilArray[pIndex][2]) elseif cat[cIndex] == loc("Barrel Placement Mode") then gear = AddGear(x, y, gtExplosives, 0, 0, 0, 0) @@ -1732,7 +1735,8 @@ table.insert(previewDataList, " PreviewPlacedGear(" .. GetX(gear) ..", " .. GetY(gear) .. ")") - if (GetHealth(gear) ~= nil) then + -- Health crate + if band(GetGearPos(gear), 0x2) ~= 0 then temp = " tempG = SpawnHealthCrate(" .. GetX(gear) ..", " .. @@ -1749,7 +1753,8 @@ elseif GetHealth(gear) == 100 then specialFlag = 12 end - elseif getGearValue(gear,"caseType") == "ammo" then + -- Ammo crate + elseif band(GetGearPos(gear), 0x1) ~= 0 then arrayList = wepCrateList temp = " tempG = SpawnAmmoCrate(" .. @@ -1766,12 +1771,11 @@ end end - --dammit, we probably need two more entries if we want to allow editing of existing maps - table.insert(wepCrateList, " setGearValue(tempG, \"caseType\", \"" .. getGearValue(gear,"caseType") .. "\")") + --dammit, we probably need more entries if we want to allow editing of existing maps table.insert(wepCrateList, " setGearValue(tempG, \"contents\", \"" .. getGearValue(gear,"contents") .. "\")") - - elseif getGearValue(gear,"caseType") == "util" then + -- Utility crate + elseif band(GetGearPos(gear), 0x4) ~= 0 then arrayList = utilCrateList temp = " tempG = SpawnUtilityCrate(" .. @@ -1788,8 +1792,7 @@ end end - --dammit, we probably need two more entries if we want to allow editing of existing maps - table.insert(utilCrateList, " setGearValue(tempG, \"caseType\", \"" .. getGearValue(gear,"caseType") .. "\")") + --dammit, we probably need more entries if we want to allow editing of existing maps table.insert(utilCrateList, " setGearValue(tempG, \"contents\", \"" .. getGearValue(gear,"contents") .. "\")") end @@ -1953,21 +1956,6 @@ WriteLnToConsole("local hhs = {}") WriteLnToConsole("") - WriteLnToConsole("local wepArray = {") - WriteLnToConsole(" amBazooka, amBee, amMortar, amDrill, amSnowball,") - WriteLnToConsole(" amGrenade, amClusterBomb, amMolotov, amWatermelon, amHellishBomb, amGasBomb,") - WriteLnToConsole(" amShotgun, amDEagle, amSniperRifle, amSineGun, amLandGun, amIceGun,") - WriteLnToConsole(" amFirePunch, amWhip, amBaseballBat, amKamikaze, amSeduction, amHammer,") - WriteLnToConsole(" amMine, amDynamite, amCake, amBallgun, amRCPlane, amSMine, amAirMine,") - WriteLnToConsole(" amAirAttack, amMineStrike, amDrillStrike, amNapalm, amPiano, amBirdy,") - WriteLnToConsole(" amBlowTorch, amPickHammer, amGirder, amRubber, amPortalGun,") - WriteLnToConsole(" amRope, amParachute, amTeleport, amJetpack,") - WriteLnToConsole(" amInvulnerable, amLaserSight, amVampiric,") - WriteLnToConsole(" amLowGravity, amExtraDamage, amExtraTime, amResurrector, amTardis, amSwitch") - WriteLnToConsole(" }") - WriteLnToConsole("") - - SaveConfigData() @@ -2024,13 +2012,17 @@ for i = 0, (placedCount-1) do if placedType[i] == loc("Waypoint Editing Mode") then + --[[ TODO/FIXME: Somehow incorporate the waypoints in an actual useful manner. + The functions AddWayPoint and PreviewWayPoint do not exist and will thus be commented-out + in the output code. They are added anyway so the user sees the coordinates + ]] table.insert(waypointList, - " AddWayPoint(" .. + "-- AddWayPoint(" .. placedX[i] ..", " .. placedY[i] ..")" ) table.insert(hFlagList, " " .. placedX[i] .. " " .. placedY[i] .. " " .. "0") - table.insert(previewDataList, " PreviewWayPoint(" .. placedX[i] ..", " .. placedY[i] .. ")") + table.insert(previewDataList, "-- PreviewWayPoint(" .. placedX[i] ..", " .. placedY[i] .. ")") end end @@ -2329,8 +2321,10 @@ WriteLnToConsole("function onAmmoStoreInit()") WriteLnToConsole("") - WriteLnToConsole(" for i = 1, #wepArray do") - WriteLnToConsole(" SetAmmo(wepArray[i], 0, 0, 0, 1)") + WriteLnToConsole(" for i = 0, AmmoTypeMax do") + WriteLnToConsole(" if i ~= amNothing then") + WriteLnToConsole(" SetAmmo(i, 0, 0, 0, 1)") + WriteLnToConsole(" end") WriteLnToConsole(" end") WriteLnToConsole("") WriteLnToConsole(" SetAmmo(amSkip, 9, 0, 0, 0)") @@ -2592,7 +2586,7 @@ loc("Change Placement Mode: [Up], [Down]") .. "|" .. loc("Toggle Help: [Precise]+[1]") .. "|" .. loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. - "", -amMine, 60000 + "", 9, 60000 ) hedgeEditorMissionPanelShown = false @@ -2830,9 +2824,8 @@ dSprite = sprBotlevels--sprMineOff dFrame = 1 elseif (cat[cIndex] == loc("Dud Mine Placement Mode")) then - -- TODO: Use dud mine sprite instead of sprite of normal mine - dSprite = sprBotlevels--sprMineOff - dFrame = 1 + dSprite = sprBotlevels--sprMineDead + dFrame = 3 elseif (cat[cIndex] == loc("Sticky Mine Placement Mode")) then dSprite = sprBotlevels--sprSMineOff dFrame = 2 @@ -2854,6 +2847,10 @@ elseif (cat[cIndex] == loc("Sprite Placement Mode")) then dSprite = reducedSpriteIDArray[pIndex] dFrame = sFrame + if ((dSprite == sprAMAmmos) or (dSprite == sprAMAmmosBW)) and (dFrame == (amAirAttack - 1)) then + -- Special case: Air attack icon of ammos sprite needs to be fixed (since this icon is overwritten) + dFrame = ammoFrameAirAttack + end else dCol = 0xFFFFFF00 dSprite = sprArrow @@ -2882,8 +2879,14 @@ end tSprCol = 0xFFFFFFFF - tempFrame = tArr[pIndex][3] - + -- Get ammo icon + if tArr[pIndex][3] then + -- Overwritten ammo icon + tempFrame = tArr[pIndex][3] + else + -- Use default ammo icon + tempFrame = tArr[pIndex][1] - 1 + end end else @@ -2893,10 +2896,10 @@ end SetVisualGearValues(crateSprite, CursorX+xDisplacement, CursorY+yDisplacement, 0, 0, dAngle, tempFrame, 1000, sprAMAmmos, 1000, tSprCol) - SetVisualGearValues(tSpr[1], CursorX+xDisplacement-2, CursorY+yDisplacement-2, 0, 0, dAngle, 10, 1000, sprTarget, 1000, tSprCol) - SetVisualGearValues(tSpr[2], CursorX+xDisplacement-2, CursorY+yDisplacement+2, 0, 0, dAngle, 10, 1000, sprTarget, 1000, tSprCol) - SetVisualGearValues(tSpr[3], CursorX+xDisplacement+2, CursorY+yDisplacement-2, 0, 0, dAngle, 10, 1000, sprTarget, 1000, tSprCol) - SetVisualGearValues(tSpr[4], CursorX+xDisplacement+2, CursorY+yDisplacement+2, 0, 0, dAngle, 10, 1000, sprTarget, 1000, tSprCol) + SetVisualGearValues(tSpr[1], CursorX+xDisplacement-2, CursorY+yDisplacement-2, 0, 0, dAngle, 1, 1000, sprTarget, 1000, tSprCol) + SetVisualGearValues(tSpr[2], CursorX+xDisplacement-2, CursorY+yDisplacement+2, 0, 0, dAngle, 1, 1000, sprTarget, 1000, tSprCol) + SetVisualGearValues(tSpr[3], CursorX+xDisplacement+2, CursorY+yDisplacement-2, 0, 0, dAngle, 1, 1000, sprTarget, 1000, tSprCol) + SetVisualGearValues(tSpr[4], CursorX+xDisplacement+2, CursorY+yDisplacement+2, 0, 0, dAngle, 1, 1000, sprTarget, 1000, tSprCol) if genTimer >= 100 then @@ -3364,7 +3367,7 @@ end reducedSpriteIDArrayFrames = { - 4, 8, 1, 1, 1, + 1, 8, 4, 1, 1, AmmoTypeMax, AmmoTypeMax, 3, 4, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Scripts/Multiplayer/Highlander.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Highlander.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Highlander.lua Sat Apr 29 23:49:39 2017 +0200 @@ -261,8 +261,8 @@ end end - PlaySound(sndShotgunReload); if dspl and ammolist ~= '' then + PlaySound(sndShotgunReload); AddCaption(ammolist, color, capgrpAmmoinfo) end end diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua Sat Apr 29 23:49:39 2017 +0200 @@ -152,6 +152,8 @@ function onGameStart() SendHealthStatsOff() + SendRankingStatsOff() + SendAchievementsStatsOff() trackTeams() teamScan() runOnHogs(saveStuff) @@ -321,7 +323,7 @@ SetHealth(mutant,0) mt_hurt= false setGearValue(mutant,"SelfDestruct",true) - TurnTimeLeft = 0 + EndTurn() end end end @@ -409,7 +411,7 @@ if gameOver then SendStat(siGraphTitle, loc("Score graph")) - TurnTimeLeft = 0 + EndTurn(true) teamsSorted = {} @@ -465,9 +467,6 @@ SendStat(siPlayerKills, getTeamValue(teamsSorted[i], "Score"), teamsSorted[i]) end - AddCaption(string.format(loc("%s wins!"), winTeam), 0xFFFFFFFF, capgrpGameState ) - SendStat(siGameResult, string.format("%s wins!", winTeam)) - ShowMission( loc("Mutant"), loc("Final result"), string.format(loc("Winner: %s"), winTeam) .. "| |" .. loc("Scores:") .. " |" .. @@ -540,7 +539,7 @@ AddCaption(string.format(loc("%s has mutated! +2 points"), getGearValue(gear, "Name")), GetClanColor(GetHogClan(gear)), capgrpMessage) - TurnTimeLeft=0 + EndTurn(true) AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false) AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false) @@ -751,11 +750,6 @@ end AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) trackDeletion(gear) - - -- End game properly when only the winner remains - if gameOver and numhhs == 1 then - EndGame() - end elseif GetGearType(gear) == gtCase then -- Check if a crate has been collected if band(GetGearMessage(gear), gmDestroy) ~= 0 and CurrentHedgehog ~= nil then diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Scripts/Multiplayer/Racer.hwp Binary file share/hedgewars/Data/Scripts/Multiplayer/Racer.hwp has changed diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Scripts/Multiplayer/Racer.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Racer.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Racer.lua Sat Apr 29 23:49:39 2017 +0200 @@ -434,9 +434,6 @@ -- end game if its at round limit if roundNumber >= roundLimit then - gameOver = true - TurnTimeLeft = 10000000 - -- Sort the scores for the ranking list local unfinishedArray = {} local sortedTeams = {} @@ -473,8 +470,17 @@ SendStat(siCustomAchievement, loc("Maybe you should try easier waypoints next time.")) end - -- Game over - EndGame() + -- Kill all the losers + for i = 0, (numhhs-1) do + if GetHogClan(hhs[i]) ~= bestClan then + SetEffect(hhs[i], heResurrectable, 0) + SetHealth(hhs[i],0) + end + end + + gameOver = true + EndTurn(true) + end end @@ -548,7 +554,10 @@ function onGameStart() + SendGameResultOff() + SendRankingStatsOff() SendHealthStatsOff() + SendAchievementsStatsOff() roundN = 0 lastRound = TotalRounds diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.lua Sat Apr 29 23:49:39 2017 +0200 @@ -740,20 +740,21 @@ statusText = loc("Status Update") scoreText = loc("Team scores:") end + local displayTime + if roundNumber >= roundLimit then + displayTime = 20000 + else + displayTime = 1 + end ShowMission( loc("Space Invasion"), statusText, string.format(loc("Rounds complete: %d/%d"), roundNumber, roundLimit) .. "| " .. "|" .. - scoreText .. " |" ..entireC, 4, 1) + scoreText .. " |" ..entireC, 4, displayTime) if roundNumber >= roundLimit then local winnerTeam = teamStats[1].name - local victorySoundPlayed = false for i = 0, (numhhs-1) do if GetHogTeamName(hhs[i]) == winnerTeam then - if not victorySoundPlayer then - PlaySound(sndVictory, hhs[i]) - victorySoundPlayed = true - end SetState(hhs[i], bor(GetState(hhs[i]), gstWinner)) end end @@ -898,11 +899,19 @@ end end + -- Kill off all the losers + for i = 0, (numhhs-1) do + if GetHogClan(hhs[i]) ~= bestClan then + SetEffect(hhs[i], heResurrectable, 0) + SetHealth(hhs[i],0) + end + end + + -- Game over gameOver = true EndTurn(true) TimeLeft = 0 SendStat(siGraphTitle, "Score graph") - EndGame() end end @@ -1228,6 +1237,9 @@ end function onGameStart() + SendGameResultOff() + SendRankingStatsOff() + SendAchievementsStatsOff() SendHealthStatsOff() ShowMission ( diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Scripts/Multiplayer/TechRacer.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/TechRacer.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/TechRacer.lua Sat Apr 29 23:49:39 2017 +0200 @@ -460,9 +460,6 @@ -- end game if its at round limit if roundNumber >= roundLimit then - gameOver = true - TurnTimeLeft = 10000000 - -- Sort the scores for the ranking list local unfinishedArray = {} local sortedTeams = {} @@ -498,8 +495,16 @@ SendStat(siCustomAchievement, loc("Maybe you should try an easier TechRacer map.")) end - -- Game over - EndGame() + -- Kill all the losers + for i = 0, (numhhs-1) do + if GetHogClan(hhs[i]) ~= bestClan then + SetEffect(hhs[i], heResurrectable, 0) + SetHealth(hhs[i],0) + end + end + + gameOver = true + EndTurn(true) end end @@ -956,6 +961,9 @@ end function onGameStart() + SendGameResultOff() + SendRankingStatsOff() + SendAchievementsStatsOff() SendHealthStatsOff() trackTeams() diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua Sat Apr 29 23:49:39 2017 +0200 @@ -97,6 +97,7 @@ SetAmmo(amSeduction, 9, 0, 0, 0) SetAmmo(amResurrector, 1, 0, 0, 0) SetAmmo(amInvulnerable, 1, 0, 0, 0) + SetAmmo(amLowGravity, 1, 0, 0, 0) elseif hogIndex == 6 then SetAmmo(amFlamethrower, 1, 0, 0, 0) SetAmmo(amMolotov, 1, 0, 0, 0) diff -r e3d9abcc427a -r 1adc078355d1 share/hedgewars/Data/Scripts/Multiplayer/Tumbler.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Tumbler.lua Sat Apr 29 23:45:14 2017 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Tumbler.lua Sat Apr 29 23:49:39 2017 +0200 @@ -356,7 +356,7 @@ barrelsEaten = barrelsEaten + 1 if barrelsEaten == 5 then - AddCaption(loc("Achievement obtained: Barrel Eater!"),0xffba00ff,capgrpMessage2) + AddCaption(string.format(loc("Achievement gotten: %s"), loc("Barrel Eater")),0xffba00ff,capgrpMessage2) end elseif (GetGearType(gear) == gtMine) then @@ -368,7 +368,7 @@ minesEaten = minesEaten + 1 if minesEaten == 5 then - AddCaption(loc("Achievement obtained: Mine Eater!"),0xffba00ff,capgrpMessage2) + AddCaption(string.format(loc("Achievement gotten: %s"), loc("Mine Eater")),0xffba00ff,capgrpMessage2) end end