------------------- 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 battleStarted = false 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 = { ["init"] = {missionName, loc("Challenge objectives"), challengeObjectives, 1, 35000}, } -- hogs local hero = { name = loc("Hog Solo"), x = 1100, y = 560 } local heroTurns = 0 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 = -6 } local teamB = { -- Red Strawberries 1 name = loc("RS1"), color = -1 } local teamC = { -- Red Strawberries 2 name = loc("RS2"), color = -1 } -------------- 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, "Simple", "Island", "Default", "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, "bp2", "Island", "Default", "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, "bp2", "Island", "Default", "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() end function onGameStart() FollowGear(hero.gear) ShowMission(unpack(goals["init"])) 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) AddAmmo(hero.gear, amSkip, 100) timeLeft = 0 --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) turnHogs() SendHealthStatsOff() end function onNewTurn() if CurrentHedgehog == hero.gear then if firstTurn then -- Unique game rule in this mission: First turn has more time TurnTimeLeft = 25000 -- Generous ready time on first turn to give more time to read ReadyTimeLeft = 35000 battleStarted = true firstTurn = false end if lastWeaponUsed == amSkip then TurnTimeLeft = TurnTime + timeLeft end timeLeft = 0 heroTurns = heroTurns + 1 end 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 -- Display ammo icon above gear. i = offset (start at 1) local function displayAmmoIcon(gear, ammoType, i) if not GetHealth(gear) then return end local x = GetX(gear) + 2 local y = GetY(gear) + 32 * i local vgear = AddVisualGear(x, y, vgtAmmo, 0, true) if vgear ~= nil then local vgtX,vgtY,vgtdX,vgtdY,vgtAngle,vgtFrame,vgtFrameTicks,vgtState,vgtTimer,vgtTint = GetVisualGearValues(vgear) local vgtFrame = ammoType SetVisualGearValues(vgear,vgtX,vgtY,vgtdX,vgtdY,vgtAngle,vgtFrame,vgtFrameTicks,vgtState,vgtTimer,vgtTint) end end function onGearDelete(gear) if (isEnemyHog(gear) and GetHealth(hero.gear)) then local availableTeleports = GetAmmoCount(hero.gear,amTeleport) local availableSniper = GetAmmoCount(hero.gear,amSniperRifle) local ammolist = "" local tele = false if availableTeleports < 2 then AddAmmo(hero.gear, amTeleport, availableTeleports + 1 ) displayAmmoIcon(hero.gear, amTeleport, 1) tele = true ammolist = ammolist .. string.format(loc("%s (+1)"), GetAmmoName(amTeleport)) end if availableSniper < 4 then AddAmmo(hero.gear, amSniperRifle, availableSniper + 1 ) displayAmmoIcon(hero.gear, amSniperRifle, 2) if tele then ammolist = ammolist .. " • " end ammolist = ammolist .. string.format(loc("%s (+1)"), GetAmmoName(amSniperRifle)) end -- Show collected ammo if ammolist ~= "" then PlaySound(sndShotgunReload) AddCaption(ammolist, GetClanColor(GetHogClan(hero.gear)), capgrpAmmoinfo) end end end -- Hide mission panel when player does anything function hideMissionOnAction() if battleStarted then HideMission() end end onSlot = hideMissionOnAction onSetWeapon = hideMissionOnAction onAttack = hideMissionOnAction function onHogAttack(ammoType) hideMissionOnAction() if CurrentHedgehog == hero.gear then lastWeaponUsed = ammoType 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.")) sendSimpleTeamRankings({teamB.name, teamC.name, 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."), heroTurns)) local record = tonumber(GetCampaignVar("FastestPreciseShooting")) if record ~= nil and heroTurns >= record then SendStat(siCustomAchievement, string.format(loc("Your fastest victory so far: %d rounds"), record)) end if record == nil or heroTurns < record then SaveCampaignVar("FastestPreciseShooting", tostring(heroTurns)) 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.")) sendSimpleTeamRankings({teamA.name, teamB.name, teamC.name}) SaveCampaignVar("Mission10Won", "true") checkAllMissionsCompleted() EndGame() 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 isEnemyHog(gear) for i=1, table.getn(enemiesOdd) do if gear == enemiesOdd[i].gear then return true end end for i=1, table.getn(enemiesEven) do if gear == enemiesEven then return true end end return false end