------------------- 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") ----------------- VARIABLES -------------------- -- globals local campaignName = loc("A Space Adventure") local missionName = loc("Fruit planet, Searching 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("Getting the Device"), 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("Getting the Device"), 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 crates = { {name = amDEagle, x = 1680, y = 1650}, {name = amGirder, x = 1680, y = 1160}, {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 = "Hog Solo" hero.x = 1200 hero.y = 820 hero.dead = false green1.name = "Captain Lime" green1.x = 1050 green1.y = 820 green1.dead = false green2.name = "Mister Pear" green2.x = 1350 green2.y = 820 green3.name = "Lady Mango" green3.x = 1450 green3.y = 820 local redHedgehogs = { { name = "Poisonous Apple" }, { name = "Dark Strawberry" }, { name = "Watermelon Heart" }, { name = "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" WriteLnToConsole("CHECKPOINT IS "..checkPointReached) -- load checkpoints, problem getting the campaign variable --local h = GetCampaignVar("Desert01CheckPoint") --WriteLnToCosnole("HERE "..GetCampaignVar("Fruit02CheckPoint")) if tonumber(GetCampaignVar("Fruit02CheckPoint")) then WriteLnToConsole("**TRUE**") checkPointReached = tonumber(GetCampaignVar("Fruit02CheckPoint")) if checkPointReached == 2 or checkPointReached == 3 then WriteLnToConsole("++++++++++++++HEEEEEEEREEEEEEEEEEEEE") loadHogsPositions() end end WriteLnToConsole("CHECKPOINT IS "..checkPointReached) -- Hog Solo and Green Bananas AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy") hero.gear = AddHog(hero.name, 0, 100, "war_desertgrenadier1") AnimSetGearPosition(hero.gear, hero.x, hero.y) HogTurnLeft(hero.gear, true) green2.gear = AddHog(green2.name, 0, 100, "war_desertgrenadier1") AnimSetGearPosition(green2.gear, green2.x, green2.y) HogTurnLeft(green2.gear, true) green3.gear = AddHog(green3.name, 0, 100, "war_desertgrenadier1") 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_desertgrenadier1") AnimSetGearPosition(green1.human, green1.x, green1.y) green1.bot = AddHog(green1.name, 1, 100, "war_desertgrenadier1") AnimSetGearPosition(green1.bot, green1.x, green1.y) green1.gear = green1.human -- Fruit Assasins 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, "war_desertgrenadier1") 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) AddAmmo(hero.gear, amTeleport, 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 -- place crates for i=1,table.getn(crates) do SpawnAmmoCrate(crates[i].x, crates[i].y, crates[i].name) end if tookPartInBattle then SpawnAmmoCrate(weaponCrate.x, weaponCrate.y, amWatermelon) else SpawnAmmoCrate(weaponCrate.x, weaponCrate.y, amSniperRifle) 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 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 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 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 ((GetX(green2.gear) > 2850 and GetX(green2.gear) < 2945 and GetY(green2.gear) > 808 and GetY(green2.gear) < 852) or (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 -------------- 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 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 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) AnimCaption(hero.gear, loc("Checkpoint reached!"), 3000) SaveCampaignVar("Fruit02CheckPoint", 2) saveHogsPositions() saveWeapons() end function checkPoint2(gear) AnimCaption(hero.gear, loc("Checkpoint reached!"), 3000) SaveCampaignVar("Fruit02CheckPoint", 3) saveHogsPositions() saveWeapons() 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 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 search!"), 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() WriteLnToConsole("load hogs positions") local positions; if GetCampaignVar("HogsPosition") then positions = GetCampaignVar("HogsPosition") else return end WriteLnToConsole("positions : "..positions) positions = split(positions,",") WriteLnToConsole("--------------- "..hero.x) 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 WriteLnToConsole("SAVE WEAPONS TRIGGERED: "..GetAmmoCount(hero.gear, amFirePunch)..GetAmmoCount(hero.gear, amGilder).. GetAmmoCount(hero.gear, amDEagle)..GetAmmoCount(hero.gear, amWatermelon)..GetAmmoCount(hero.gear, amSniperRifle)) SaveCampaignVar("HeroAmmo", GetAmmoCount(hero.gear, amFirePunch)..GetAmmoCount(hero.gear, amGilder).. GetAmmoCount(hero.gear, amDEagle)..GetAmmoCount(hero.gear, amWatermelon)..GetAmmoCount(hero.gear, amSniperRifle)) end function loadWeapons() local ammo = GetCampaignVar("HeroAmmo") WriteLnToConsole("LOAD WEAPONS "..ammo) WriteLnToConsole("LOAD WEAPONS "..ammo:sub(1,1)) AddAmmo(hero.gear, amFirePunch, tonumber(ammo:sub(1,1))) AddAmmo(hero.gear, amGilder, 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 return res end