HedgewarsScriptLoad("/Scripts/Locale.lua")
local playerHog
local playerTeamName = loc("Pro Killers")
local enemyTeamName = loc("Galaxy Guardians")
local enemyTeam1 = {
{name=loc("Rocket"), x=796, y=1184},
{name=loc("Star"), x=733, y=1525},
{name=loc("Asteroid"), x=738, y=1855},
{name=loc("Comet"), x=937, y=1318},
{name=loc("Sunflame"), x=3424, y=1536},
{name=loc("Eclipse"), x=3417, y=1081},
{name=loc("Jetpack"), x=2256, y=1246},
{name=loc("Void"), x=1587, y=1231},
}
local gameStarted = false
local turnNo = 0
local toleranceTimer = nil
local enemyHogsLeft = #enemyTeam1
local pendingDeaths = {}
local enemyHogs = {}
local gameEnded = false
local waitGears = 0
local hasAttacked = false
local minePlaced = false
local delayGear = nil
function onGameInit()
Seed = "{7e34a56b-ee7b-4fe1-8f30-352a998f3f6a}"
GameFlags = gfDisableWind + gfDisableLandObjects
TurnTime= 45000
CaseFreq = 0
MinesNum = 0
Explosives = 0
Theme = "EarthRise"
MapGen = mgRandom
MapFeatureSize = 12
-- Disable Sudden Death
WaterRise = 0
HealthDecrease = 0
AddTeam(playerTeamName, 0xFF0000, "Bone", "Island", "Classic", "cm_scout")
playerHog = AddHog(loc("Ultrasoldier"), 0, 100, "Terminator_Glasses")
SetGearPosition(playerHog, 543, 1167)
AddTeam(enemyTeamName, 0xF5F808, "Earth", "Island", "Classic", "cm_galaxy")
for i=1,8 do
local hogID = AddHog(enemyTeam1[i].name, 0, 100, "NoHat")
table.insert(enemyHogs, hogID)
SetGearPosition(hogID, enemyTeam1[i].x, enemyTeam1[i].y)
end
end
function onAmmoStoreInit()
SetAmmo(amGrenade, 9, 0, 0, 1)
SetAmmo(amClusterBomb, 9, 0, 0, 1)
SetAmmo(amBazooka, 9, 0, 0, 1)
SetAmmo(amBee, 9, 0, 0, 1)
SetAmmo(amShotgun, 9, 0, 0, 1)
SetAmmo(amPickHammer, 9, 0, 0, 1)
SetAmmo(amSkip, 9, 0, 0, 1)
SetAmmo(amRope, 9, 0, 0, 1)
SetAmmo(amMine, 9, 0, 0, 1)
SetAmmo(amDEagle, 9, 0, 0, 1)
SetAmmo(amDynamite, 9, 0, 0, 1)
SetAmmo(amFirePunch, 9, 0, 0, 1)
SetAmmo(amWhip, 9, 0, 0, 1)
SetAmmo(amBaseballBat, 9, 0, 0, 1)
SetAmmo(amParachute, 9, 0, 0, 1)
SetAmmo(amAirAttack, 9, 0, 0, 1)
SetAmmo(amMineStrike, 9, 0, 0, 1)
SetAmmo(amBlowTorch, 9, 0, 0, 1)
SetAmmo(amGirder, 9, 0, 0, 1)
SetAmmo(amTeleport, 9, 0, 0, 1)
SetAmmo(amSwitch, 9, 0, 0, 1)
SetAmmo(amMortar, 9, 0, 0, 1)
SetAmmo(amKamikaze, 9, 0, 0, 1)
SetAmmo(amCake, 9, 0, 0, 1)
SetAmmo(amSeduction, 9, 0, 0, 1)
SetAmmo(amWatermelon, 9, 0, 0, 1)
SetAmmo(amHellishBomb, 9, 0, 0, 1)
SetAmmo(amNapalm, 9, 0, 0, 1)
SetAmmo(amDrill, 9, 0, 0, 1)
SetAmmo(amBallgun, 9, 0, 0, 1)
SetAmmo(amRCPlane, 9, 0, 0, 1)
SetAmmo(amLowGravity, 9, 0, 0, 1)
SetAmmo(amExtraDamage, 9, 0, 0, 1)
SetAmmo(amInvulnerable, 9, 0, 0, 1)
SetAmmo(amLaserSight, 9, 0, 0, 1)
SetAmmo(amVampiric, 9, 0, 0, 1)
SetAmmo(amSniperRifle, 9, 0, 0, 1)
SetAmmo(amJetpack, 9, 0, 0, 1)
SetAmmo(amMolotov, 9, 0, 0, 1)
SetAmmo(amBirdy, 9, 0, 0, 1)
SetAmmo(amPortalGun, 9, 0, 0, 1)
SetAmmo(amPiano, 9, 0, 0, 1)
SetAmmo(amGasBomb, 9, 0, 0, 1)
SetAmmo(amSineGun, 9, 0, 0, 1)
SetAmmo(amFlamethrower, 9, 0, 0, 1)
SetAmmo(amSMine, 9, 0, 0, 1)
SetAmmo(amHammer, 9, 0, 0, 1)
SetAmmo(amResurrector, 9, 0, 0, 1)
SetAmmo(amDrillStrike, 9, 0, 0, 1)
SetAmmo(amSnowball, 9, 0, 0, 1)
SetAmmo(amTardis, 9, 0, 0, 1)
SetAmmo(amLandGun, 9, 0, 0, 1)
SetAmmo(amIceGun, 9, 0, 0, 1)
SetAmmo(amKnife, 9, 0, 0, 1)
SetAmmo(amRubber, 9, 0, 0, 1)
SetAmmo(amAirMine, 9, 0, 0, 1)
SetAmmo(amDuck, 9, 0, 0, 1)
SetAmmo(amExtraTime, 2, 0, 0, 0)
end
function onGameStart()
SendHealthStatsOff()
ShowMission(loc("Big Armory"), loc("Scenario"), loc("Kill all enemy hedgehogs in a single turn."), -amBazooka, 0)
SetWind(15)
end
function onGameTick20()
if not gameStarted and turnNo == 1 and TurnTimeLeft < TurnTime then
gameStarted = true
elseif gameStarted and not gameEnded then
if isPlayerAlive() then
if enemyHogsLeft - countPending() <= 0 then
TurnTimeLeft = 0
if delayGear then
DeleteGear(delayGear)
end
return
elseif (enemyHogsLeft > 0) and TurnTimeLeft < 40 then
if not toleranceTimer and waitGears <= 0 then
SetInputMask(0)
SetGearMessage(playerHog, 0)
if not minePlaced then
TurnTimeLeft = 10000000
end
if hasAttacked then
if minePlaced then
toleranceTimer = 12000
else
toleranceTimer = 7500
end
else
PlaySound(sndBoring, playerHog)
toleranceTimer = 5020
end
return
end
end
if toleranceTimer ~= nil then
if toleranceTimer % 1000 == 0 and toleranceTimer > 0 and toleranceTimer <= 5000 then
AddCaption(string.format(loc("Mission failure in %d s"), div(toleranceTimer, 1000)), 0xFFFFFFFF, capgrpGameState)
end
if toleranceTimer == 4000 then
PlaySound(sndCountdown4)
elseif toleranceTimer == 3000 then
PlaySound(sndCountdown3)
elseif toleranceTimer == 2000 then
PlaySound(sndCountdown2)
elseif toleranceTimer == 1000 then
PlaySound(sndCountdown1)
end
if waitGears <= 0 then
if toleranceTimer <= 0 then
lose()
return
end
toleranceTimer = toleranceTimer - 20
end
return
end
end
end
end
function onGearAdd(gear)
local gt = GetGearType(gear)
if gt == gtIceGun or gt == gtPickHammer or gt == gtSineGunShot or gt == gtCake
or gt == gtTeleport or gt == gtFlamethrower or gt == gtBallGun or gt == gtSeduction
or gt == gtAirAttack or gt == gtMine or gt == gtSMine or gt == gtAirMine
or (isWaitGear(gear) and gt ~= gtFlame) then
--[[ This is a hack to prevent the turn from instantly ending
after using a weapon with a retreat time of 0. For some reason, there would be
are also problems with the hellish-hand grenade without this hack.
It spawns an invisible grenade with disabled gravity at (0,0) with a
high timer, which will delay the end of the turn. ]]
if delayGear == nil then
delayGear = AddGear(0, 0, gtGrenade, gstNoGravity + gstInvisible, 0, 0, 2147483647)
end
end
if gt == gtMine or gt == gtSMine or gt == gtAirMine then
minePlaced = true
end
if isWaitGear(gear) then
waitGears = waitGears + 1
end
if gt == gtAirAttack then
hasAttacked = true
end
end
function onGearDelete(gear)
if isWaitGear(gear) then
waitGears = waitGears - 1
end
if GetGearType(gear) == gtHedgehog then
if GetHogTeamName(gear) == enemyTeamName then
enemyHogsLeft = enemyHogsLeft - 1
pendingDeaths[gear] = nil
if enemyHogsLeft <= 0 then
win()
end
end
end
end
function countPending()
local p = 0
for h, v in pairs(pendingDeaths) do
if v then
p = p + 1
end
end
return p
end
function isPlayerAlive()
if GetGearType(playerHog) == gtHedgehog then
if GetHealth(playerHog) == 0 then
return false
else
local _, gearDamage
_, _, _, _, _, _, _, _, _, _, _, gearDamage = GetGearValues(playerHog)
return (GetHealth(playerHog) - gearDamage) > 0
end
else
return false
end
end
function onGearDamage(gear, damage)
if GetGearType(gear) == gtHedgehog then
if GetHogTeamName(gear) == enemyTeamName then
local _, gearDamage
_, _, _, _, _, _, _, _, _, _, _, gearDamage = GetGearValues(gear)
if (GetHealth(gear) - gearDamage) <= 0 then
pendingDeaths[gear] = true
end
end
end
end
function isWaitGear(gear)
local gt = GetGearType(gear)
return gt == gtBall or gt == gtHellishBomb or gt == gtWatermelon or gt == gtMelonPiece
or (gt == gtFlame and band(GetState(gear), gsttmpFlag) == 0)
or gt == gtDrill or gt == gtAirAttack or gt == gtAirBomb or gt == gtCluster
or gt == gtEgg or gt == gtHammerHit or gt == gtNapalmBomb or gt == gtPoisonCloud
or gt == gtGasBomb
end
function onNewTurn()
turnNo = turnNo + 1
if turnNo > 1 then
PlaySound(sndBoring, playerHog)
lose()
end
end
function onHogAttack(ammoType)
-- Set hasAttacked if hog attacked NOT with a non-turn ending weapon
if ammoType ~= amNothing and ammoType ~= amSkip and ammoType ~= amJetpack and ammoType ~= amGirder and ammoType ~= amRubber
and ammoType ~= amLandGun and ammoType ~= amParachute and ammoType ~= amResurrector and ammoType ~= amRope and ammoType ~= amSwitcher
and ammoType ~= amExtraDamage and ammoType ~= amExtraTime and ammoType ~= amLowGravity and ammoType ~= amInvulnerable
and ammoType ~= amLaserSight and ammoType ~= amVampiric and ammoType ~= amPortalGun and ammoType ~= amSnowball then
hasAttacked = true
end
if ammoType == amSkip and enemyHogsLeft > 0 then
PlaySound(sndCoward, playerHog)
lose()
return
end
end
function lose()
if not gameEnded then
PlaySound(sndStupid, playerHog)
local mission, achievement
mission = loc("You failed to kill all enemies in this turn.")
achievement = loc("You failed to kill all enemies in a single turn.")
AddCaption(loc("Mission failed!"), 0xFFFFFFFF, capgrpGameState)
ShowMission(loc("Big Armory"), loc("Scenario"), mission, -amBazooka, 5000)
SendStat(siGameResult, loc("You lose!"))
SendStat(siCustomAchievement, achievement)
SendStat(siPlayerKills, tostring(0), enemyTeamName)
SendStat(siPlayerKills, tostring(8-enemyHogsLeft), playerTeamName)
gameEnded = true
EndGame()
end
end
function win()
if not gameEnded then
AddCaption(loc("Victory!"), 0xFFFFFFFF, capgrpGameState)
ShowMission(loc("Big Armory"), loc("Scenario"), loc("Congratulations! You win."), 4, 5000)
PlaySound(sndVictory, playerHog)
SendStat(siGameResult, loc("You win!"))
SendStat(siCustomAchievement, loc("You have killed all enemies."))
SendStat(siPlayerKills, tostring(8-enemyHogsLeft), playerTeamName)
SendStat(siPlayerKills, tostring(0), enemyTeamName)
gameEnded = true
EndGame()
end
end