HedgewarsScriptLoad("/Scripts/Locale.lua") HedgewarsScriptLoad("/Scripts/Achievements.lua") local player = nil local RCGear = nil local planesUsed = 0 local planeTimer = 0 local planeUhOh = false local cratesLeft = 0 local crateStreak = 0 local longestCrateStreak = 0 local commentTimer = 0 local missiles = 0 local totalMissiles = 0 local missileScanTimer = 0 local nextComment = sndNone function onGameInit() Seed = 1 GameFlags = gfInfAttack + gfInvulnerable + gfOneClanMode + gfSolidLand -- Basically unlimited turn time TurnTime = cMaxTurnTime Map = "Ropes" Theme = "Eyes" -- Disable Sudden Death WaterRise = 0 HealthDecrease = 0 CaseFreq = 0 MinesNum = 0 Explosives = 0 AddTeam(loc("Wannabe Flyboys"), -1, "Simple", "Island", "Default", "cm_scout") player = AddHog(loc("Ace"), 0, 80, "Gasmask") SetGearPosition(player, 1380, 1500) end function onGameStart() SendHealthStatsOff() ShowMission ( loc("RC Plane Challenge"), loc("Challenge"), loc("Collect or destroy all the health crates.") .. "|" .. loc("Compete to use as few planes as possible!") .. "|" .. "", -amRCPlane, 4000 ) SetTeamLabel(loc("Wannabe Flyboys"), "0") PlaceGirder(2192, 508, 6) PlaceGirder(2192, 670, 6) PlaceGirder(2193, 792, 2) PlaceGirder(2100, 825, 4) PlaceGirder(2009, 899, 6) PlaceGirder(2084, 992, 4) PlaceGirder(2145, 1087, 6) PlaceGirder(2199, 1235, 5) PlaceGirder(2308, 1296, 0) PlaceGirder(2424, 1234, 7) PlaceGirder(2473, 1129, 2) PlaceGirder(2437, 1046, 1) PlaceGirder(2409, 927, 6) PlaceGirder(2408, 763, 6) PlaceGirder(2404, 540, 6) PlaceGirder(2426, 423, 3) PlaceGirder(2550, 400, 4) PlaceGirder(2668, 425, 1) PlaceGirder(2707, 541, 6) PlaceGirder(2706, 703, 6) PlaceGirder(2705, 867, 6) PlaceGirder(2779, 962, 4) PlaceGirder(2894, 924, 3) PlaceGirder(2908, 802, 6) PlaceGirder(2907, 639, 6) PlaceGirder(3052, 566, 4) PlaceGirder(2971, 394, 4) PlaceGirder(3103, 448, 7) PlaceGirder(3047, 654, 0) PlaceGirder(3043, 746, 6) PlaceGirder(3265, 1583, 6) PlaceGirder(3256, 1491, 4) PlaceGirder(3187, 1401, 6) PlaceGirder(3326, 1400, 6) PlaceGirder(774, 530, 5) PlaceGirder(922, 595, 4) PlaceGirder(1079, 533, 7) PlaceGirder(1139, 386, 6) PlaceGirder(1074, 237, 5) PlaceGirder(723, 381, 6) PlaceGirder(781, 229, 7) PlaceGirder(927, 746, 6) PlaceGirder(874, 736, 0) PlaceGirder(982, 737, 0) PlaceGirder(2430, 1730, 4) PlaceGirder(1613, 1104, 7) PlaceGirder(1564, 1256, 6) PlaceGirder(1643, 1341, 5) PlaceGirder(1780, 1372, 4) PlaceGirder(1869, 1296, 7) PlaceGirder(1858, 1163, 5) PlaceGirder(1739, 1044, 5) PlaceGirder(1621, 926, 5) PlaceGirder(1597, 985, 5) PlaceGirder(1449, 939, 4) PlaceGirder(1473, 874, 4) PlaceGirder(2092, 1352, 7) PlaceGirder(2145, 1444, 7) PlaceGirder(2004, 1443, 3) PlaceGirder(1978, 1523, 2) PlaceGirder(2021, 1596, 1) PlaceGirder(2103, 1625, 0) PlaceGirder(2208, 1551, 7) PlaceGirder(2327, 1431, 7) PlaceGirder(2395, 1478, 6) PlaceGirder(2396, 1600, 2) PlaceGirder(2495, 1285, 6) PlaceGirder(2494, 1408, 2) PlaceGirder(2547, 530, 0) PlaceGirder(2451, 1551, 0) PlaceGirder(2551, 706, 6) PlaceGirder(2551, 869, 6) PlaceGirder(2623, 1016, 5) PlaceGirder(2773, 1083, 4) PlaceGirder(2924, 1019, 7) PlaceGirder(2568, 1491, 7) PlaceGirder(2618, 1346, 6) PlaceGirder(2674, 1195, 7) PlaceGirder(2822, 1142, 4) PlaceGirder(2963, 1069, 7) PlaceGirder(3067, 938, 5) PlaceGirder(2803, 1373, 2) PlaceGirder(2811, 1559, 2) SpawnFakeHealthCrate(930, 557, false, false) SpawnFakeHealthCrate(979, 692, false, false) SpawnFakeHealthCrate(876, 703, false, false) SpawnFakeHealthCrate(2309, 1260, false, false) SpawnFakeHealthCrate(1733, 1127, false, false) SpawnFakeHealthCrate(1738, 1320, false, false) SpawnFakeHealthCrate(3249, 1460, false, false) SpawnFakeHealthCrate(3051, 617, false, false) SpawnFakeHealthCrate(2972, 353, false, false) SpawnFakeHealthCrate(2548, 358, false, false) SpawnFakeHealthCrate(2090, 1580, false, false) SpawnFakeHealthCrate(1752, 1753, false, false) SpawnFakeHealthCrate(1865, 1758, false, false) SpawnFakeHealthCrate(1985, 1760, false, false) SpawnFakeHealthCrate(2429, 1760, false, false) SpawnFakeHealthCrate(2810, 1480, false, false) SpawnFakeHealthCrate(2800, 1277, false, false) SpawnFakeHealthCrate(2806, 1107, false, false) PlaceGirder(1897, 903, 6) PlaceGirder(1916, 784, 3) PlaceGirder(2010, 732, 4) PlaceGirder(2082, 639, 6) PlaceGirder(2081, 516, 2) PlaceGirder(1985, 487, 4) PlaceGirder(1862, 407, 5) PlaceGirder(1855, 224, 7) PlaceGirder(2006, 163, 4) PlaceGirder(2128, 187, 1) PlaceGirder(2251, 213, 4) PlaceGirder(2413, 213, 4) PlaceGirder(1952, 618, 0) PlaceGirder(957, 1068, 4) PlaceGirder(794, 1069, 4) PlaceGirder(728, 1163, 6) PlaceGirder(728, 1287, 2) PlaceGirder(802, 1342, 4) PlaceGirder(966, 1342, 4) PlaceGirder(674, 1032, 1) PlaceGirder(554, 1011, 4) PlaceGirder(445, 1056, 3) PlaceGirder(422, 1174, 6) PlaceGirder(369, 1341, 5) PlaceGirder(495, 1313, 5) PlaceGirder(568, 1379, 3) PlaceGirder(577, 1202, 2) PlaceGirder(744, 1490, 5) PlaceGirder(760, 1617, 7) PlaceGirder(622, 1693, 4) PlaceGirder(476, 1623, 5) PlaceGirder(376, 1697, 1) PlaceGirder(955, 1746, 2) PlaceGirder(1025, 1746, 2) PlaceGirder(1090, 1745, 2) PlaceGirder(1156, 1746, 2) PlaceGirder(3806, 1530, 2) PlaceGirder(3880, 1464, 2) PlaceGirder(3738, 1458, 2) PlaceGirder(3806, 1390, 2) PlaceGirder(3805, 1588, 0) PlaceGirder(3676, 1609, 3) PlaceGirder(3930, 1615, 1) PlaceGirder(3719, 1295, 0) PlaceGirder(3888, 1294, 0) PlaceGirder(3661, 1385, 2) PlaceGirder(3955, 1377, 2) PlaceGirder(3982, 1518, 0) PlaceGirder(3378, 440, 2) PlaceGirder(3447, 492, 4) PlaceGirder(3564, 529, 1) PlaceGirder(3596, 647, 6) PlaceGirder(3521, 740, 4) PlaceGirder(3524, 838, 4) PlaceGirder(3644, 819, 3) PlaceGirder(3691, 708, 6) PlaceGirder(3690, 545, 6) PlaceGirder(3612, 433, 5) PlaceGirder(3463, 383, 4) PlaceGirder(2815, 122, 7) PlaceGirder(2960, 72, 4) PlaceGirder(3032, 123, 2) PlaceGirder(3063, 174, 0) PlaceGirder(3095, 124, 2) PlaceGirder(3169, 71, 4) PlaceGirder(3320, 124, 5) PlaceGirder(3210, 179, 2) PlaceGirder(2932, 181, 2) SpawnFakeHealthCrate(3804, 1461, false, false) SpawnFakeHealthCrate(3269, 1742, false, false) SpawnFakeHealthCrate(3066, 121, false, false) SpawnFakeHealthCrate(3207, 104, false, false) SpawnFakeHealthCrate(2928, 103, false, false) SpawnFakeHealthCrate(1997, 202, false, false) SpawnFakeHealthCrate(2253, 159, false, false) SpawnFakeHealthCrate(2132, 774, false, false) SpawnFakeHealthCrate(2549, 490, false, false) SpawnFakeHealthCrate(3527, 694, false, false) SpawnFakeHealthCrate(3777, 78, false, false) SpawnFakeHealthCrate(1124, 1746, false, false) SpawnFakeHealthCrate(1056, 1740, false, false) SpawnFakeHealthCrate(993, 1742, false, false) SpawnFakeHealthCrate(799, 1298, false, false) SpawnFakeHealthCrate(577, 1126, false, false) SpawnFakeHealthCrate(596, 1463, false, false) SpawnFakeHealthCrate(3854, 1043, false, false) SpawnFakeHealthCrate(1944, 567, false, false) SpawnFakeHealthCrate(338, 1748, false, false) end function onGameTick20() if RCGear ~= nil then if(GetTimer(RCGear) < 3000 and planeUhOh == false) then PlaySound(sndUhOh, player) planeUhOh = true end planeTimer = planeTimer + 20 end if commentTimer > 0 then commentTimer = commentTimer - 20 elseif(nextComment ~= sndNone) then PlaySound(nextComment, player) nextComment = sndNone end if missileScanTimer > 0 then missileScanTimer = missileScanTimer - 20 else if crateStreak == 0 and missiles == 3 then PlaySound(sndMissed, player) missiles = 4 end end end function onNewTurn() SetTurnTimeLeft(cMaxTurnTime) end function onGearAdd(gear) if GetGearType(gear) == gtRCPlane then RCGear = gear planesUsed = planesUsed + 1 SetTeamLabel(loc("Wannabe Flyboys"), tostring(planesUsed)) planeTimer = 0 missiles = 0 end if GetGearType(gear) == gtCase then cratesLeft = cratesLeft + 1 end if GetGearType(gear) == gtAirBomb then totalMissiles = totalMissiles + 1 end end function onGearDelete(gear) if GetGearType(gear) == gtRCPlane then RCGear = nil planeUhOh = false missiles = 0 if(planeTimer < 2000 and crateStreak == 0) then nextComment = sndStupid commentTimer = math.min(2000-planeTimer, 800) elseif(planeTimer < 5000 and crateStreak == 0) then PlaySound(sndOops, player) elseif(planesUsed == 72) then PlaySound(sndStupid, player) elseif(planesUsed == 50) then PlaySound(sndNutter, player) elseif(planesUsed == 30) then PlaySound(sndOops, player) end crateStreak = 0 elseif GetGearType(gear) == gtAirBomb then missiles = missiles + 1 missileScanTimer = 500 elseif GetGearType(gear) == gtCase then cratesLeft = cratesLeft - 1 crateStreak = crateStreak + 1 if(crateStreak > longestCrateStreak) then longestCrateStreak = crateStreak end if band(GetGearMessage(gear), gmDestroy) ~= 0 then -- Crate collection sound PlaySound(sndShotgunReload) end AddCaption(string.format(loc("Crates left: %d"), cratesLeft)) if cratesLeft == 0 then local rank = "unknown" local color = capcolDefault local sound = sndVictory if planesUsed >= 156 then rank = loc("Destroyer of planes") color = 0xD06700FF sound = sndLaugh elseif planesUsed >= 98 then rank = loc("Hopeless case") color = 0xFF0000FF elseif planesUsed >= 72 then rank = loc("Drunk greenhorn") color = 0xFF0040FF elseif planesUsed >= 50 then rank = loc("Greenhorn") -- a.k.a. "absolute beginner" color = 0xFF0080FF elseif planesUsed >= 39 then rank = loc("Beginner") color = 0xFF00BFFF elseif planesUsed >= 30 then rank = loc("Experienced beginner") color = 0xFF00CCFF elseif planesUsed >= 21 then rank = loc("Below-average pilot") color = 0xFF00FFFF elseif planesUsed >= 17 then rank = loc("Average pilot") color = 0xBF00FFFF elseif planesUsed >= 13 then rank = loc("Above-average pilot") color = 0x8000FFFF elseif planesUsed >= 8 then rank = loc("Professional pilot") color = 0x4000FFFF elseif planesUsed >= 5 then rank = loc("Professional stunt pilot") color = 0x0000FFFF elseif planesUsed >= 3 then rank = loc("Elite pilot") color = 0x0040FFFF elseif planesUsed == 2 then rank = loc("Upper-class elite pilot") color = 0x0080FFFF elseif planesUsed == 1 then rank = loc("Top-class elite pilot") color = 0x00FFFFFF sound = sndFlawless else rank = loc("Cheater") color = 0xFF0000FF sound = sndCoward end AddCaption(string.format(loc("Rank: %s"), rank), color, capgrpMessage2) SendStat(siCustomAchievement, string.format(loc("Your rank: %s"), rank)) if planesUsed == 1 then AddCaption(loc("Flawless victory!")) SendStat(siGameResult, loc("You have perfectly beaten the challenge!")) SendStat(siCustomAchievement, loc("You have used only 1 RC plane. Outstanding!")) else AddCaption(loc("Victory!")) SendStat(siGameResult, loc("You have finished the challenge!")) SendStat(siCustomAchievement, string.format(loc("You have used %d RC planes."), planesUsed)) end if(totalMissiles > 1) then SendStat(siCustomAchievement, string.format(loc("You have dropped %d missiles."), totalMissiles)) end if(longestCrateStreak > 5) then if(planesUsed == 1) then SendStat(siCustomAchievement, string.format(loc("In your best (and only) flight you took out %d crates with one RC plane!"), longestCrateStreak)) else SendStat(siCustomAchievement, string.format(loc("In your best flight you took out %d crates with one RC plane."), longestCrateStreak)) end end if(planesUsed == 2) then SendStat(siCustomAchievement, loc("This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?")) end if(planesUsed == 1) then SendStat(siCustomAchievement, loc("Congratulations! You have truly mastered this challenge! Don't forget to save the demo.")) awardAchievement(loc("Prestigious Pilot"), nil, false) end ShowMission ( loc("CHALLENGE COMPLETE"), loc("Congratulations!"), string.format(loc("Planes used: %d"), planesUsed) .. "|" .. "", 0, 0 ) SetState(player, gstWinner) PlaySound(sound, player) DismissTeam(loc("Wannabe Flyboys")) EndGame() end if RCGear ~= nil then SetTimer(RCGear, GetTimer(RCGear) + 10000) end end end function onAmmoStoreInit() SetAmmo(amRCPlane, 9, 0, 0, 0) end function onNewTurn() SetWeapon(amRCPlane) end