------------------- ABOUT ---------------------- -- -- In this adventure hero gets the lost part with -- the help of the green bananas hogs. HedgewarsScriptLoad("/Scripts/Locale.lua") HedgewarsScriptLoad("/Scripts/Animate.lua") HedgewarsScriptLoad("/Missions/Campaign/A_Space_Adventure/global_functions.lua") ----------------- VARIABLES -------------------- -- globals local missionName = loc("Getting to the device") local inBattle = false local tookPartInBattle = false local previousHog = -1 local checkPointReached = 1 -- 1 is normal spawn -- dialogs local dialog01 = {} local dialog02 = {} local dialog03 = {} local dialog04 = {} -- mission objectives local goals = { [dialog01] = {missionName, loc("Exploring the tunnel"), loc("With the help of the other hogs search for the device").."|"..loc("Hog Solo has to reach the last crates"), 1, 4000}, [dialog02] = {missionName, loc("Exploring the tunnel"), loc("Explore the tunnel with the other hogs and search for the device").."|"..loc("Hog Solo has to reach the last crates"), 1, 4000}, [dialog03] = {missionName, loc("Return to the Surface"), loc("Go to the surface!").."|"..loc("Attack Captain Lime before he attacks back"), 1, 4000}, [dialog04] = {missionName, loc("Return to the Surface"), loc("Go to the surface!").."|"..loc("Attack the assasins before they attack back"), 1, 4000}, } -- crates local eagleCrate = {name = amDEagle, x = 1680, y = 1650} local girderCrate = {name = amGirder, x = 1680, y = 1160} local ropeCrate = {name = amRope, x = 1400, y = 1870} local weaponCrate = { x = 1360, y = 1870} -- hogs local hero = {} local green1 = {} local green2 = {} local green3 = {} -- teams local teamA = {} local teamB = {} local teamC = {} -- hedgehogs values hero.name = loc("Hog Solo") hero.x = 1200 hero.y = 820 hero.dead = false green1.name = loc("Captain Lime") green1.x = 1050 green1.y = 820 green1.dead = false green2.name = loc("Mister Pear") green2.x = 1350 green2.y = 820 green3.name = loc("Lady Mango") green3.x = 1450 green3.y = 820 local redHedgehogs = { { name = loc("Poisonous Apple") }, { name = loc("Dark Strawberry") }, { name = loc("Watermelon Heart") }, { name = loc("Deadly Grape") } } teamA.name = loc("Hog Solo and GB") teamA.color = tonumber("38D61C",16) -- green teamB.name = loc("Captain Lime") teamB.color = tonumber("38D61D",16) -- greenish teamC.name = loc("Fruit Assasins") teamC.color = tonumber("FF0000",16) -- red function onGameInit() GameFlags = gfDisableWind Seed = 1 TurnTime = 20000 CaseFreq = 0 MinesNum = 0 MinesTime = 1 Explosives = 0 Delay = 3 SuddenDeathTurns = 200 Map = "fruit02_map" Theme = "Fruit" -- load checkpoints, problem getting the campaign variable local health = 100 checkPointReached = initCheckpoint("fruit02") if checkPointReached ~= 1 then loadHogsPositions() health = tonumber(GetCampaignVar("HeroHealth")) end -- Hog Solo and Green Bananas AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy") hero.gear = AddHog(hero.name, 0, health, "war_desertgrenadier1") AnimSetGearPosition(hero.gear, hero.x, hero.y) HogTurnLeft(hero.gear, true) green2.gear = AddHog(green2.name, 0, 100, "war_britmedic") AnimSetGearPosition(green2.gear, green2.x, green2.y) HogTurnLeft(green2.gear, true) green3.gear = AddHog(green3.name, 0, 100, "hair_red") AnimSetGearPosition(green3.gear, green3.x, green3.y) HogTurnLeft(green3.gear, true) -- Captain Lime AddTeam(teamB.name, teamB.color, "Bone", "Island", "HillBilly", "cm_birdy") green1.human = AddHog(green1.name, 0, 100, "war_desertofficer") AnimSetGearPosition(green1.human, green1.x, green1.y) green1.bot = AddHog(green1.name, 1, 100, "war_desertofficer") AnimSetGearPosition(green1.bot, green1.x, green1.y) green1.gear = green1.human -- Fruit Assasins local assasinsHats = { "NinjaFull", "NinjaStraight", "NinjaTriangle" } AddTeam(teamC.name, teamC.color, "Bone", "Island", "HillBilly", "cm_birdy") for i=1,table.getn(redHedgehogs) do redHedgehogs[i].gear = AddHog(redHedgehogs[i].name, 1, 100, assasinsHats[math.random(1,3)]) AnimSetGearPosition(redHedgehogs[i].gear, 2010 + 50*i, 630) end AnimInit() AnimationSetup() end function onGameStart() AnimWait(hero.gear, 3000) FollowGear(hero.gear) if GetCampaignVar("Fruit01JoinedBattle") and GetCampaignVar("Fruit01JoinedBattle") == "true" then tookPartInBattle = true end AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0) AddEvent(onDeviceCrates, {hero.gear}, deviceCrates, {hero.gear}, 0) -- Hog Solo and GB weapons AddAmmo(hero.gear, amSwitch, 100) -- Captain Lime weapons AddAmmo(green1.bot, amBazooka, 6) AddAmmo(green1.bot, amGrenade, 6) AddAmmo(green1.bot, amDEagle, 2) HideHog(green1.bot) -- Assasins weapons AddAmmo(redHedgehogs[1].gear, amBazooka, 6) AddAmmo(redHedgehogs[1].gear, amGrenade, 6) AddAmmo(redHedgehogs[1].bot, amDEagle, 6) for i=1,table.getn(redHedgehogs) do HideHog(redHedgehogs[i].gear) end -- explosives -- I wanted to use FindPlace but doesn't accept height values... local x1 = 950 local x2 = 1306 local y1 = 1210 local y2 = 1620 while true do if y2 1 then PlaceGirder(1580, 875, 4) PlaceGirder(1800, 875, 4) end -- place crates if checkPointReached < 2 then SpawnAmmoCrate(girderCrate.x, girderCrate.y, girderCrate.name) end if checkPointReached < 5 then SpawnAmmoCrate(eagleCrate.x, eagleCrate.y, eagleCrate.name) end SpawnAmmoCrate(ropeCrate.x, ropeCrate.y, ropeCrate.name) if tookPartInBattle then SpawnAmmoCrate(weaponCrate.x, weaponCrate.y, amWatermelon) else SpawnAmmoCrate(weaponCrate.x, weaponCrate.y, amSniperRifle) end SendHealthStatsOff() end function onNewTurn() if not inBattle and CurrentHedgehog == green1.gear then TurnTimeLeft = 0 elseif CurrentHedgehog == green2.gear or CurrentHedgehog == green3.gear then TurnTimeLeft = 0 elseif inBattle then if CurrentHedgehog == green1.gear and previousHog ~= hero.gear then TurnTimeLeft = 0 return end for i=1,table.getn(redHedgehogs) do if CurrentHedgehog == redHedgehogs[i].gear and previousHog ~= hero.gear then TurnTimeLeft = 0 return end end TurnTimeLeft = 20000 wind() elseif not inBattle and CurrentHedgehog == hero.gear then TurnTimeLeft = -1 wind() else TurnTimeLeft = 0 end previousHog = CurrentHedgehog end function onGameTick() AnimUnWait() if ShowAnimation() == false then return end ExecuteAfterAnimations() CheckEvents() end function onGearDelete(gear) if gear == hero.gear then hero.dead = true elseif gear == green1.bot then green1.dead = true end end function onAmmoStoreInit() SetAmmo(amDEagle, 0, 0, 0, 6) SetAmmo(amGirder, 0, 0, 0, 2) SetAmmo(amRope, 0, 0, 0, 1) if tonumber(getBonus(2)) == 1 then SetAmmo(amWatermelon, 0, 0, 0, 2) SetAmmo(amSniperRifle, 0, 0, 0, 2) else SetAmmo(amWatermelon, 0, 0, 0, 1) SetAmmo(amSniperRifle, 0, 0, 0, 1) end end function onPrecise() if GameTime > 3000 then SetAnimSkip(true) end end -------------- EVENTS ------------------ function onHeroDeath(gear) if hero.dead then return true end return false end function onDeviceCrates(gear) if not hero.dead and GetY(hero.gear)>1850 and GetX(hero.gear)>1340 and GetX(hero.gear)<1640 then return true end return false end function onSurface(gear) if not hero.dead and GetY(hero.gear)<850 and StoppedGear(hero.gear) then return true end return false end function onGaptainLimeDeath(gear) if green1.dead then return true end return false end function onRedTeamDeath(gear) local redDead = true for i=1,table.getn(redHedgehogs) do if GetHealth(redHedgehogs[i].gear) then redDead = false break end end return redDead end function onCheckPoint1(gear) -- before barrel jump if not hero.dead and GetX(hero.gear) > 2850 and GetX(hero.gear) < 2945 and GetY(hero.gear) > 808 and GetY(hero.gear) < 852 and not isHeroAtWrongPlace() then return true end return false end function onCheckPoint2(gear) -- before barrel jump if ((GetHealth(green2.gear) and GetX(green2.gear) > 2850 and GetX(green2.gear) < 2945 and GetY(green2.gear) > 808 and GetY(green2.gear) < 852) or (GetHealth(green3.gear) and GetX(green3.gear) > 2850 and GetX(green3.gear) < 2945 and GetY(green3.gear) > 808 and GetY(green3.gear) < 852)) and not isHeroAtWrongPlace() then return true end return false end function onCheckPoint3(gear) -- after barrel jump if ((GetHealth(green2.gear) and GetY(green2.gear) > 1550 and GetX(green2.gear) < 3000 and StoppedGear(green2.gear)) or (GetHealth(green3.gear) and GetY(green3.gear) > 1550 and GetX(green3.gear) < 3000 and StoppedGear(green2.gear))) and not isHeroAtWrongPlace() then return true end return false end function onCheckPoint4(gear) -- hero at crates if not hero.dead and GetX(hero.gear) > 1288 and GetX(hero.gear) < 1420 and GetY(hero.gear) > 1840 and not isHeroAtWrongPlace() then return true end return false end -------------- ACTIONS ------------------ function heroDeath(gear) SendStat('siGameResult', loc("Hog Solo lost, try again!")) --1 SendStat('siCustomAchievement', loc("To win the game Hog Solo has to get the bottom crates and come back to the surface")) --11 SendStat('siCustomAchievement', loc("You can use the other 2 hogs to assist you")) --11 if tookPartInBattle then SendStat('siCustomAchievement', loc("You'll have to eliminate the Strawberry Assasins at the end")) --11 else SendStat('siCustomAchievement', loc("You'll have to eliminate Captain Lime at the end")) --11 end SendStat('siPlayerKills','0',teamA.name) EndGame() end function deviceCrates(gear) TurnTimeLeft = 0 if not tookPartInBattle then AddAnim(dialog03) else for i=1,table.getn(redHedgehogs) do RestoreHog(redHedgehogs[i].gear) end AddAnim(dialog04) end AddAmmo(hero.gear, amSwitch, 0) AddEvent(onSurface, {hero.gear}, surface, {hero.gear}, 0) end function surface(gear) previousHog = -1 if tookPartInBattle then if GetHealth(green1.gear) then HideHog(green1.gear) end AddEvent(onRedTeamDeath, {green1.gear}, redTeamDeath, {green1.gear}, 0) else DeleteGear(green1.human) RestoreHog(green1.bot) green1.gear = green1.bot AddEvent(onGaptainLimeDeath, {green1.gear}, captainLimeDeath, {green1.gear}, 0) end if GetHealth(green2.gear) then HideHog(green2.gear) end if GetHealth(green3.gear) then HideHog(green3.gear) end inBattle = true end function captainLimeDeath(gear) -- hero win in scenario of escape in 1st part saveCompletedStatus(3) SendStat('siGameResult', loc("Congratulations, you won!")) --1 SendStat('siCustomAchievement', loc("You retrieved the lost part")) --11 SendStat('siCustomAchievement', loc("You defended yourself against Captain Lime")) --11 SendStat('siPlayerKills','1',teamA.name) SendStat('siPlayerKills','0',teamB.name) EndGame() end function redTeamDeath(gear) -- hero win in battle scenario saveCompletedStatus(3) SendStat('siGameResult', loc("Congratulations, you won!")) --1 SendStat('siCustomAchievement', loc("You retrieved the lost part")) --11 SendStat('siCustomAchievement', loc("You defended yourself against Strawberry Assasins")) --11 SendStat('siPlayerKills','1',teamA.name) SendStat('siPlayerKills','0',teamC.name) EndGame() end function checkPoint1(gear) saveCheckPointLocal(2) end function checkPoint2(gear) saveCheckPointLocal(3) end function checkPoint3(gear) saveCheckPointLocal(4) end function checkPoint4(gear) saveCheckPointLocal(5) end -------------- ANIMATIONS ------------------ function Skipanim(anim) if goals[anim] ~= nil then ShowMission(unpack(goals[anim])) end TurnTimeLeft = 0 end function AnimationSetup() -- DIALOG 01 - Start, Captain Lime helps Hog Solo because he took part in the battle AddSkipFunction(dialog01, Skipanim, {dialog01}) table.insert(dialog01, {func = AnimWait, args = {hero.gear, 3000}}) table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Somewhere else in the planet of fruits Captain Lime helps Hog Solo..."), 5000}}) table.insert(dialog01, {func = AnimSay, args = {green1.gear, loc("You fought bravely and you helped us win this battle!"), SAY_SAY, 5000}}) table.insert(dialog01, {func = AnimSay, args = {green1.gear, loc("So, as promised I have brought you where I think that the device you are looking for is hidden."), SAY_SAY, 7000}}) table.insert(dialog01, {func = AnimSay, args = {green1.gear, loc("I know that your resources are low due to the battle but I'll send with you two of my best hogs to assist you."), SAY_SAY, 7000}}) table.insert(dialog01, {func = AnimSay, args = {green1.gear, loc("Good luck!"), SAY_SAY, 2000}}) table.insert(dialog01, {func = AnimWait, args = {hero.gear, 500}}) table.insert(dialog01, {func = AnimSwitchHog, args = {hero.gear}}) -- DIALOG02 - Start, Hog Solo escaped from the previous battle AddSkipFunction(dialog02, Skipanim, {dialog02}) table.insert(dialog02, {func = AnimWait, args = {hero.gear, 3000}}) table.insert(dialog02, {func = AnimCaption, args = {hero.gear, loc("Somewhere else in the planet of fruits Hog Solo gets closer to the device..."), 5000}}) table.insert(dialog02, {func = AnimSay, args = {green1.gear, loc("You are the one who fled! So, you are alive..."), SAY_SAY, 4000}}) table.insert(dialog02, {func = AnimSay, args = {green1.gear, loc("I'm still low on hogs. If you are not afraid I could use a set of extra hands"), SAY_SAY, 4000}}) table.insert(dialog02, {func = AnimWait, args = {hero.gear, 8000}}) table.insert(dialog02, {func = AnimSay, args = {hero.gear, loc("I am sorry but I was looking for a device that may be hidden somewhere around here"), SAY_SAY, 4500}}) table.insert(dialog02, {func = AnimWait, args = {green1.gear, 12500}}) table.insert(dialog02, {func = AnimSay, args = {green1.gear, loc("Many long forgotten things can be found in the same tunnels that we are about to explore!"), SAY_SAY, 7000}}) table.insert(dialog02, {func = AnimSay, args = {green1.gear, loc("If you help us you can keep the device if you find it but we'll keep everything else"), SAY_SAY, 7000}}) table.insert(dialog02, {func = AnimSay, args = {green1.gear, loc("What do you say? Are you in?"), SAY_SAY, 3000}}) table.insert(dialog02, {func = AnimWait, args = {hero.gear, 1800}}) table.insert(dialog02, {func = AnimSay, args = {hero.gear, loc("Ok then!"), SAY_SAY, 2000}}) table.insert(dialog02, {func = AnimSwitchHog, args = {hero.gear}}) -- DIALOG03 - At crates, hero learns that Captain Lime is bad AddSkipFunction(dialog03, Skipanim, {dialog03}) table.insert(dialog03, {func = AnimWait, args = {hero.gear, 4000}}) table.insert(dialog03, {func = FollowGear, args = {hero.gear}}) table.insert(dialog03, {func = AnimSay, args = {hero.gear, loc("Hoo Ray! I've found it, now I have to get back to Captain Lime!"), SAY_SAY, 4000}}) table.insert(dialog03, {func = AnimWait, args = {green1.gear, 4000}}) table.insert(dialog03, {func = AnimSay, args = {green1.gear, loc("This Hog Solo is so naive! I am gonna shoot him when he returns and keep his device for me!"), SAY_THINK, 4000}}) table.insert(dialog03, {func = goToThesurface, args = {hero.gear}}) -- DIALOG04 - At crates, hero learns about the assasins ambush AddSkipFunction(dialog04, Skipanim, {dialog04}) table.insert(dialog04, {func = AnimWait, args = {hero.gear, 4000}}) table.insert(dialog04, {func = FollowGear, args = {hero.gear}}) table.insert(dialog04, {func = AnimSay, args = {hero.gear, loc("Hoo Ray! I've found it, now I have to get back to Captain Lime!"), SAY_SAY, 4000}}) table.insert(dialog04, {func = AnimWait, args = {redHedgehogs[1].gear, 4000}}) table.insert(dialog04, {func = AnimSay, args = {redHedgehogs[1].gear, loc("We have spotted the enemy! We'll attack when the enemies start gathering!"), SAY_THINK, 4000}}) table.insert(dialog04, {func = goToThesurface, args = {hero.gear}}) end ------------- OTHER FUNCTIONS --------------- function goToThesurface() TurnTimeLeft = 0 end function wind() if GetY(CurrentHedgehog) > 1350 then SetWind(-40) else SetWind(math.random(-100,100)) end end function saveHogsPositions() local positions; positions = GetX(hero.gear)..","..GetY(hero.gear) if GetHealth(green2.gear) then positions = positions..","..GetX(green2.gear)..","..GetY(green2.gear) end if GetHealth(green3.gear) then positions = positions..","..GetX(green3.gear)..","..GetY(green3.gear) end SaveCampaignVar("HogsPosition", positions) end function loadHogsPositions() local positions; if GetCampaignVar("HogsPosition") then positions = GetCampaignVar("HogsPosition") else return end positions = split(positions,",") if positions[1] then hero.x = positions[1] hero.y = positions[2] end if positions[3] then green2.x = tonumber(positions[3]) green2.y = tonumber(positions[4]) end if positions[5] then green3.x = tonumber(positions[5]) green3.y = tonumber(positions[6]) end end function saveWeapons() -- firepunch - gilder - deagle - watermelon - sniper SaveCampaignVar("HeroAmmo", GetAmmoCount(hero.gear, amFirePunch)..GetAmmoCount(hero.gear, amGirder).. GetAmmoCount(hero.gear, amDEagle)..GetAmmoCount(hero.gear, amWatermelon)..GetAmmoCount(hero.gear, amSniperRifle)) end function loadWeapons() local ammo = GetCampaignVar("HeroAmmo") AddAmmo(hero.gear, amFirePunch, tonumber(ammo:sub(1,1))) AddAmmo(hero.gear, amGirder, tonumber(ammo:sub(2,2))) AddAmmo(hero.gear, amDEagle, tonumber(ammo:sub(3,3))) AddAmmo(hero.gear, amWatermelon, tonumber(ammo:sub(4,4))) AddAmmo(hero.gear, amSniperRifle, tonumber(ammo:sub(5,5))) end function isHeroAtWrongPlace() if GetX(hero.gear) > 1480 and GetX(hero.gear) < 1892 and GetY(hero.gear) > 1000 and GetY(hero.gear) < 1220 then return true end return false end -- splits number by delimiter function split(s, delimiter) local res = {} local first = "" for i=1,s:len() do if s:sub(1,1) == delimiter then table.insert(res, tonumber(first)) first = "" else first = first..s:sub(1,1) end s = s:sub(2) end if first:len() > 0 then table.insert(res, tonumber(first)) end return res end function saveCheckPointLocal(cpoint) AnimCaption(hero.gear, loc("Checkpoint reached!"), 3000) saveCheckpoint(cpoint) SaveCampaignVar("HeroHealth", GetHealth(hero.gear)) saveHogsPositions() saveWeapons() end