------------------- ABOUT ----------------------
--
-- Hero has get into an Red Strawberries ambush
-- He has to eliminate the enemies by using limited
-- ammo of sniper rifle and watermelon
HedgewarsScriptLoad("/Scripts/Locale.lua")
HedgewarsScriptLoad("/Scripts/Animate.lua")
HedgewarsScriptLoad("/Missions/Campaign/A_Space_Adventure/global_functions.lua")
----------------- VARIABLES --------------------
-- globals
local missionName = loc("Precise shooting")
local timeLeft = 0
local lastWeaponUsed = amNothing
local firstTurn = true
local challengeObjectives = loc("Use your available weapons in order to eliminate the enemies.").."|"..
loc("You can only use the sniper rifle or the watermelon bomb.").."|"..
loc("You'll have only 2 watermelon bombs during the game.").."|"..
loc("You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles.").."|"..
loc("You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports.").."|"..
loc("The first turn will last 25 sec and every other turn 15 sec.").."|"..
loc("If you skip a turn then the turn time left will be added to your next turn.").."|"..
loc("Some parts of the land are indestructible.")
-- dialogs
local dialog01 = {}
-- mission objectives
local goals = {
[dialog01] = {missionName, loc("Challenge objectives"), challengeObjectives, 1, 4500},
}
-- hogs
local hero = {
name = loc("Hog Solo"),
x = 1100,
y = 560
}
local enemiesOdd = {
{name = loc("Hog 1"), x = 2000 , y = 175},
{name = loc("Hog III"), x = 1950 , y = 1110},
{name = loc("Hog 100"), x = 1270 , y = 1480},
{name = loc("Hog Saturn"), x = 240 , y = 790},
{name = loc("Hog nueve"), x = 620 , y = 1950},
{name = loc("Hog onze"), x = 720 , y = 1950},
{name = loc("Hog dertien"), x = 1620 , y = 1950},
{name = loc("Hog 3x5"), x = 1720 , y = 1950},
}
local enemiesEven = {
{name = loc("Hog two"), x = 660, y = 140},
{name = loc("Hog D"), x = 1120, y = 1250},
{name = loc("Hog exi"), x = 1290, y = 1250},
{name = loc("Hog octo"), x = 820, y = 1950},
{name = loc("Hog decar"), x = 920, y = 1950},
{name = loc("Hog Hephaestus"), x = 1820, y = 1950},
{name = loc("Hog 7+7"), x = 1920, y = 1950},
{name = loc("Hog EOF"), x = 1200, y = 560},
}
-- teams
local teamA = {
name = loc("Hog Solo"),
color = tonumber("38D61C",16) -- green
}
local teamB = {
name = loc("RS1"),
color = tonumber("FF0000",16) -- red
}
local teamC = {
name = loc("RS2"),
color = tonumber("FF0000",16) -- red
}
-------------- LuaAPI EVENT HANDLERS ------------------
function onGameInit()
GameFlags = gfDisableWind + gfInfAttack
Seed = 1
TurnTime = 15000
CaseFreq = 0
MinesNum = 0
MinesTime = 1
Explosives = 0
Map = "fruit03_map"
Theme = "Fruit"
-- Disable Sudden Death
WaterRise = 0
HealthDecrease = 0
-- Hog Solo
AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "hedgewars")
hero.gear = AddHog(hero.name, 0, 100, "war_desertgrenadier1")
AnimSetGearPosition(hero.gear, hero.x, hero.y)
-- enemies
local hats = { "Bandit", "fr_apple", "fr_banana", "fr_lemon", "fr_orange",
"fr_pumpkin", "Gasmask", "NinjaFull", "NinjaStraight", "NinjaTriangle" }
AddTeam(teamC.name, teamC.color, "Bone", "Island", "HillBilly", "cm_bars")
for i=1,table.getn(enemiesEven) do
enemiesEven[i].gear = AddHog(enemiesEven[i].name, 1, 100, hats[GetRandom(table.getn(hats))+1])
AnimSetGearPosition(enemiesEven[i].gear, enemiesEven[i].x, enemiesEven[i].y)
end
AddTeam(teamB.name, teamB.color, "Bone", "Island", "HillBilly", "cm_bars")
for i=1,table.getn(enemiesOdd) do
enemiesOdd[i].gear = AddHog(enemiesOdd[i].name, 1, 100, hats[GetRandom(table.getn(hats))+1])
AnimSetGearPosition(enemiesOdd[i].gear, enemiesOdd[i].x, enemiesOdd[i].y)
end
initCheckpoint("fruit03")
AnimInit(true)
AnimationSetup()
end
function onGameStart()
AnimWait(hero.gear, 3000)
FollowGear(hero.gear)
ShowMission(missionName, loc("Challenge objectives"), challengeObjectives, -amSkip, 0)
AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0)
AddEvent(onHeroWin, {hero.gear}, heroWin, {hero.gear}, 0)
--hero ammo
AddAmmo(hero.gear, amTeleport, 2)
AddAmmo(hero.gear, amSniperRifle, 2)
AddAmmo(hero.gear, amWatermelon, 2)
--enemies ammo
AddAmmo(enemiesOdd[1].gear, amDEagle, 100)
AddAmmo(enemiesOdd[1].gear, amSniperRifle, 100)
AddAmmo(enemiesOdd[1].gear, amWatermelon, 1)
AddAmmo(enemiesOdd[1].gear, amGrenade, 5)
AddAmmo(enemiesEven[1].gear, amDEagle, 100)
AddAmmo(enemiesEven[1].gear, amSniperRifle, 100)
AddAmmo(enemiesEven[1].gear, amWatermelon, 1)
AddAmmo(enemiesEven[1].gear, amGrenade, 5)
SendHealthStatsOff()
AddAnim(dialog01)
end
function onNewTurn()
if CurrentHedgehog == hero.gear then
if firstTurn then
TurnTimeLeft = 25000
end
if lastWeaponUsed == amSkip then
TurnTimeLeft = TurnTime + timeLeft
end
timeLeft = 0
end
turnHogs()
end
function onGameTick()
AnimUnWait()
if ShowAnimation() == false then
return
end
ExecuteAfterAnimations()
CheckEvents()
end
function onGameTick20()
if CurrentHedgehog == hero.gear and TurnTimeLeft ~= 0 then
timeLeft = TurnTimeLeft
end
end
function onGearDelete(gear)
if (isHog(gear)) then
local availableTeleports = GetAmmoCount(hero.gear,amTeleport)
local availableSniper = GetAmmoCount(hero.gear,amSniperRifle)
if availableTeleports < 2 then
AddAmmo(hero.gear, amTeleport, availableTeleports + 1 )
end
if availableSniper < 4 then
AddAmmo(hero.gear, amSniperRifle, availableSniper + 1 )
end
end
end
function onPrecise()
if GameTime > 3000 then
SetAnimSkip(true)
end
end
-------------- EVENTS ------------------
function onHeroDeath(gear)
if not GetHealth(hero.gear) then
return true
end
return false
end
function onHeroWin(gear)
local enemies = enemiesOdd
for i=1,table.getn(enemiesEven) do
table.insert(enemies, enemiesEven[i])
end
local allDead = true
for i=1,table.getn(enemies) do
if GetHealth(enemies[i].gear) then
allDead = false
break
end
end
return allDead
end
-------------- ACTIONS ------------------
function heroDeath(gear)
SendStat(siGameResult, loc("Hog Solo lost, try again!"))
SendStat(siCustomAchievement, loc("You have to eliminate all the enemies."))
SendStat(siCustomAchievement, loc("Read the challenge objectives from within the mission for more details."))
SendStat(siPlayerKills,'1',teamB.name)
SendStat(siPlayerKills,'0',teamA.name)
EndGame()
end
function heroWin(gear)
saveBonus(2, 1)
SendStat(siGameResult, loc("Congratulations, you won!"))
SendStat(siCustomAchievement, string.format(loc("You completed the mission in %d rounds."), TotalRounds))
local record = tonumber(GetCampaignVar("FastestPreciseShooting"))
if record ~= nil and TotalRounds >= record then
SendStat(siCustomAchievement, string.format(loc("Your fastest victory so far: %d rounds"), record))
end
if record == nil or TotalRounds < record then
SaveCampaignVar("FastestPreciseShooting", tostring(TotalRounds))
if record ~= nil then
SendStat(siCustomAchievement, loc("This is a new personal best, congratulations!"))
end
end
SendStat(siCustomAchievement, loc("You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission."))
SendStat(siPlayerKills,'1',teamA.name)
SaveCampaignVar("Mission10Won", "true")
checkAllMissionsCompleted()
EndGame()
end
-------------- ANIMATIONS ------------------
function Skipanim(anim)
if goals[anim] ~= nil then
ShowMission(unpack(goals[anim]))
end
startBattle()
end
function AnimationSetup()
-- DIALOG 01 - Start, game instructions
AddSkipFunction(dialog01, Skipanim, {dialog01})
table.insert(dialog01, {func = AnimWait, args = {hero.gear, 3000}})
table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Somewhere in the Fruit Planet Hog Solo got lost ..."), 5000}})
table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("... and got ambushed by the Red Strawberries"), 5000}})
table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Use your available weapons in order to eliminate the enemies"), 5000}})
table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("You can only use the sniper rifle or the watermelon bomb"), 5000}})
table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("You'll have only 2 watermelon bombs during the game"), 5000}})
table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles"), 5000}})
table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports"), 5000}})
table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("The first turn will last 25 sec and every other turn 15 sec"), 5000}})
table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("If you skip the game your time left will be added to your next turn"), 5000}})
table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Some parts of the land are indestructible"), 5000}})
table.insert(dialog01, {func = AnimWait, args = {hero.gear, 500}})
table.insert(dialog01, {func = startBattle, args = {hero.gear}})
end
------------------ Other Functions -------------------
function turnHogs()
if GetHealth(hero.gear) then
for i=1,table.getn(enemiesEven) do
if GetHealth(enemiesEven[i].gear) then
if GetX(enemiesEven[i].gear) < GetX(hero.gear) then
HogTurnLeft(enemiesEven[i].gear, false)
elseif GetX(enemiesEven[i].gear) > GetX(hero.gear) then
HogTurnLeft(enemiesEven[i].gear, true)
end
end
end
for i=1,table.getn(enemiesOdd) do
if GetHealth(enemiesOdd[i].gear) then
if GetX(enemiesOdd[i].gear) < GetX(hero.gear) then
HogTurnLeft(enemiesOdd[i].gear, false)
elseif GetX(enemiesOdd[i].gear) > GetX(hero.gear) then
HogTurnLeft(enemiesOdd[i].gear, true)
end
end
end
end
end
function startBattle()
AnimSwitchHog(enemiesOdd[table.getn(enemiesOdd)].gear)
EndTurn(true)
-- these 2 are needed in order hero has 10 sec more in the first turn
timeLeft = 0
AddAmmo(hero.gear, amSkip, 100)
end
function isHog(gear)
local hog = false
for i=1,table.getn(enemiesOdd) do
if gear == enemiesOdd[i].gear then
hog = true
break
end
end
if not hog then
for i=1,table.getn(enemiesEven) do
if gear == enemiesEven then
hog = true
break
end
end
end
return hog
end