# HG changeset patch # User Periklis Ntanasis # Date 1372126213 -10800 # Node ID 5c760ed50b3dc288dbad33397f7934d5c66e281f # Parent fd16cfa267aada3d03dff03ef1e78b4e21eed0aa first commit, added cosmos(menu) map and lua script with some functionality diff -r fd16cfa267aa -r 5c760ed50b3d QTfrontend/hedgewars.qrc --- a/QTfrontend/hedgewars.qrc Mon Jun 24 10:51:43 2013 +0200 +++ b/QTfrontend/hedgewars.qrc Tue Jun 25 05:10:13 2013 +0300 @@ -38,6 +38,7 @@ res/campaign/A Classic Fairytale/queen.png res/campaign/A Classic Fairytale/enemy.png res/campaign/A Classic Fairytale/epil.png + res/campaign/A Space Adventure/cosmos.png res/bonus.png res/Hedgehog.png res/net.png diff -r fd16cfa267aa -r 5c760ed50b3d QTfrontend/res/campaign/A Space Adventure/cosmos.png Binary file QTfrontend/res/campaign/A Space Adventure/cosmos.png has changed diff -r fd16cfa267aa -r 5c760ed50b3d share/hedgewars/Data/Locale/campaigns_en.txt --- a/share/hedgewars/Data/Locale/campaigns_en.txt Mon Jun 24 10:51:43 2013 +0200 +++ b/share/hedgewars/Data/Locale/campaigns_en.txt Tue Jun 25 05:10:13 2013 +0300 @@ -17,3 +17,5 @@ A Classic Fairytale-enemy.desc="What a great twist! Leaks a lot has to fight side by side with the… “cannibals” against the common enemy. The evil cyborgs!" A Classic Fairytale-epil.desc="Congratulations! Leaks a lot can finally leave in peace and get praised by his new friends and his tribe. Be proud for what you succeed! You can play again previous missions and see the other possible endings." + +A Space Adventure-cosmos.desc="Hogera, the planet of hogs is about to be hit by a gigantic meteorite. In this race for survival you have to lead PAoTH's best pilot, Hog Solo, in a space trip around the neighbor planets to collect all the 4 pieces of the long lost anti gravity device!" diff -r fd16cfa267aa -r 5c760ed50b3d share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/first_blood.lua --- a/share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/first_blood.lua Mon Jun 24 10:51:43 2013 +0200 +++ b/share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/first_blood.lua Tue Jun 25 05:10:13 2013 +0300 @@ -77,6 +77,7 @@ } -----------------------------Animations-------------------------------- function Skipanim(anim) +WriteLnToConsole("SWITCH HOG") AnimSwitchHog(youngh) if goals[anim] ~= nil then ShowMission(unpack(goals[anim])) @@ -111,9 +112,11 @@ table.insert(elderDamagedAnim, {func = AnimWait, args = {elderh, 500}, skipFunc = Skipanim, skipArgs = elderDamagedAnim}) table.insert(elderDamagedAnim, {func = AnimSay, args = {elderh, loc("Violence is not the answer to your problems!"), SAY_SAY, 3000}}) table.insert(elderDamagedAnim, {func = AnimGearWait, args = {youngh, 500}}) - + WriteLnToConsole("START DIALOG") + WriteLnToConsole("END GAME START") AddSkipFunction(startDialogue, Skipanim, {startDialogue}) - table.insert(startDialogue, {func = AnimWait, args = {youngh, 3500}, skipFunc = Skipanim, skipArgs = startDialogue}) + --table.insert(startDialogue, {func = AnimWait, args = {youngh, 3500}, skipFunc = Skipanim, skipArgs = startDialogue}) + table.insert(startDialogue, {func = WriteLnToConsole, args = {"FIRST PRINT"}}) table.insert(startDialogue, {func = AnimCaption, args = {youngh, loc("Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."), 5000}}) table.insert(startDialogue, {func = AnimCaption, args = {youngh, loc("One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."), 5000}}) table.insert(startDialogue, {func = AnimCaption, args = {youngh, loc("The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."), 5000}}) @@ -125,7 +128,7 @@ table.insert(startDialogue, {func = AnimTurn, args = {princess, "Right"}}) table.insert(startDialogue, {func = AnimSwitchHog, args = {youngh}}) table.insert(startDialogue, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("First Steps"), loc("Press [Left] or [Right] to move around, [Enter] to jump"), 1, 4000}}) - +WriteLnToConsole("START DIALOG END") AddSkipFunction(onShroomAnim, SkipOnShroom, {onShroomAnim}) table.insert(onShroomAnim, {func = AnimSay, args = {elderh, loc("I can see you have been training diligently."), SAY_SAY, 4000}, skipFunc = Skipanim, skipArgs = onShroomAnim}) table.insert(onShroomAnim, {func = AnimSay, args = {elderh, loc("The wind whispers that you are ready to become familiar with tools, now..."), SAY_SAY, 4000}}) @@ -635,6 +638,7 @@ end function onGameStart() + progress = tonumber(GetCampaignVar("Progress")) TurnTimeLeft = -1 FollowGear(youngh) @@ -705,6 +709,7 @@ end function onNewTurn() +WriteLnToConsole("NEW TURN") if CurrentHedgehog == cannibal and cannibalVisible == false then SetState(cannibal, gstInvisible) end diff -r fd16cfa267aa -r 5c760ed50b3d share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/journey.lua --- a/share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/journey.lua Mon Jun 24 10:51:43 2013 +0200 +++ b/share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/journey.lua Tue Jun 25 05:10:13 2013 +0300 @@ -1041,13 +1041,17 @@ end function onNewTurn() +WriteLnToConsole("ON NEW TURN") if AnimInProgress() then +WriteLnToConsole("ON NEW TURN 1") TurnTimeLeft = -1 elseif stage == endStage and CurrentHedgehog ~= leaks then +WriteLnToConsole("ON NEW TURN 2") AnimSwitchHog(leaks) SetGearMessage(leaks, 0) TurnTimeLeft = -1 elseif GetHogTeamName(CurrentHedgehog) ~= loc("Natives") then +WriteLnToConsole("ON NEW TURN 3") for i = 1, 4 do if cannibalDead[i] ~= true then if GetX(cannibals[i]) < GetX(leaks) then @@ -1060,6 +1064,7 @@ SetInputMask(band(0xFFFFFFFF, bnot(gmLeft + gmRight + gmLJump + gmHJump))) TurnTimeLeft = 20000 else +WriteLnToConsole("ON NEW TURN 4") SetInputMask(0xFFFFFFFF) TurnsLeft = TurnsLeft - 1 end diff -r fd16cfa267aa -r 5c760ed50b3d share/hedgewars/Data/Missions/Campaign/A Space Adventure/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Campaign/A Space Adventure/CMakeLists.txt Tue Jun 25 05:10:13 2013 +0300 @@ -0,0 +1,9 @@ +file(GLOB Config *.ini) +file(GLOB Missions *.lua) +file(GLOB Packs *.hwp) + +install(FILES + ${Config} + ${Missions} + ${Packs} + DESTINATION "${SHAREPATH}Data/Missions/Campaign/A Space Adventure") diff -r fd16cfa267aa -r 5c760ed50b3d share/hedgewars/Data/Missions/Campaign/A Space Adventure/campaign.ini --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Campaign/A Space Adventure/campaign.ini Tue Jun 25 05:10:13 2013 +0300 @@ -0,0 +1,6 @@ +MissionNum=1 +ResetRetry=1 + +[Mission 1] +Name=The Spacetrip +Script=cosmos.lua diff -r fd16cfa267aa -r 5c760ed50b3d share/hedgewars/Data/Missions/Campaign/A Space Adventure/cosmos.hwp Binary file share/hedgewars/Data/Missions/Campaign/A Space Adventure/cosmos.hwp has changed diff -r fd16cfa267aa -r 5c760ed50b3d share/hedgewars/Data/Missions/Campaign/A Space Adventure/cosmos.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Campaign/A Space Adventure/cosmos.lua Tue Jun 25 05:10:13 2013 +0300 @@ -0,0 +1,291 @@ +------------------- ABOUT ---------------------- +-- +-- This map works as a menu for the hero hog to +-- navigate through planets. It portrays the hogs +-- planet and above the planets that he'll later +-- visit. + +-- TODO +-- Save and Load All Check Points +-- Save hero health +-- Decide and implement if hero will use gas bombs... + +HedgewarsScriptLoad("/Scripts/Locale.lua") +HedgewarsScriptLoad("/Scripts/Animate.lua") + +----------------- VARIABLES -------------------- +-- globals +local campaignName = loc("A Space Adventure") +local missionName = loc("Cosmos") +local timeForGuard1ToTurn = 1000 * 5 -- 5 sec +local timeForGuard1ToTurnLeft = timeForGuard1ToTurn +local saucerAcquired = false +local checkPointReached = 1 -- 1 is start of the game +-- dialogs +local dialog01 = {} +local dialog02 = {} +local dialog03 = {} +local dialog04 = {} +-- mission objectives +local goals = { + [dialog01] = {missionName, loc("Getting ready"), loc("Go and collect the crate on top of the column").."|"..loc("Use the sleep gas bomb if the guards spot you!"), 1, 4500}, + [dialog02] = {missionName, loc("The adventure begins!"), loc("Use the saucer and fly to the moon").."|"..loc("Drive carefully as your fuels are limited"), 1, 4500}, + [dialog03] = {missionName, loc("An unexpected event!"), loc("Use the saucer and fly away or use the gas bomb to neutralize the guards").."|"..loc("Beware, any damage taken will stay until you take some medicine or visit moon"), 1, 7000} +} +-- crates +local saucerX = 3270 +local saucerY = 1500 +-- hogs +local hero = {} +local director = {} +local doctor = {} +local guard1 = {} +local guard2 = {} +-- teams +local teamA = {} +local teamB = {} +local teamC = {} +-- hedgehogs values +hero.name = loc("Hog Solo") +hero.x = 1450 +hero.y = 1550 +director.name = loc("H") +director.x = 1350 +director.y = 1550 +doctor.name = loc("Dr.Cornelius") +doctor.x = 1300 +doctor.y = 1550 +guard1.name = loc("Bob") +guard1.x = 3350 +guard1.y = 1800 +guard1.turn = false +guard1.keepTurning = true +guard2.name = loc("Sam") +guard2.x = 3400 +guard2.y = 1800 +teamA.name = loc("PAoTH") +teamA.color = tonumber("FF0000",16) -- red +teamB.name = loc("Guards") +teamB.color = tonumber("0033FF",16) -- blue +teamC.name = loc("Hog Solo") +teamC.color = tonumber("38D61C",16) -- green + +-------------- LuaAPI EVENT HANDLERS ------------------ +function onGameInit() + Seed = 35 + GameFlags = gfSolidLand + gfDisableWind + TurnTime = 40000 + CaseFreq = 0 + MinesNum = 0 + Explosives = 0 + Delay = 5 + Map = "cosmos_map" -- custom map included in file + Theme = "Nature" + -- I had originally hero in PAoTH team and changed it, may reconsider though + -- PAoTH + AddTeam(teamC.name, teamC.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) + AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy") + director.gear = AddHog(director.name, 0, 100, "hair_yellow") + AnimSetGearPosition(director.gear, director.x, director.y) + doctor.gear = AddHog(doctor.name, 0, 100, "Glasses") + AnimSetGearPosition(doctor.gear, doctor.x, doctor.y) + -- Guards + AddTeam(teamB.name, teamB.color, "Bone", "Island", "HillBilly", "cm_birdy") + guard1.gear = AddHog(guard1.name, 1, 100, "policecap") + AnimSetGearPosition(guard1.gear, guard1.x, guard1.y) + guard2.gear = AddHog(guard2.name, 1, 100, "policecap") + AnimSetGearPosition(guard2.gear, guard2.x, guard2.y) + + -- get the check point + if tonumber(GetCampaignVar("CosmosCheckPoint")) then + checkPointReached = tonumber(GetCampaignVar("CosmosCheckPoint")) + end + -- do checkpoint stuff needed before game starts + if checkPointReached == 1 then + -- do nothing + elseif checkPointReached == 2 then + AnimSetGearPosition(hero.gear, saucerX, saucerY) + end + + AnimInit() + AnimationSetup() +end + +function onGameStart() + -- wait for the first turn to start + AnimWait(hero.gear, 3000) + + FollowGear(hero.gear) + ShowMission(loc("A Space Adventure"), loc("Cosmos"), loc("Help Hog Solo to find all the parts of the anti-gravity device.").. + "|"..loc("Travel to all the neighbor planets and collect all the pieces"), -amSkip, 0) + + -- do checkpoint stuff needed after game starts + if checkPointReached == 1 then + AddAnim(dialog01) + AddAmmo(hero.gear, amGasBomb, 5) + AddAmmo(hero.gear, amRope, 2) + -- Added for dev/debug purposes, remove before release + AddAmmo(hero.gear, amJetpack, 2) + AddAmmo(guard1.gear, amDEagle, 2) + AddAmmo(guard2.gear, amDEagle, 2) + SpawnAmmoCrate(saucerX, saucerY, amJetpack) + -- EVENT HANDLERS + AddEvent(onHeroBeforeTreePosition, {hero.gear}, heroBeforeTreePosition, {hero.gear}, 0) + AddEvent(onHeroAtSaucerPosition, {hero.gear}, heroAtSaucerPosition, {hero.gear}, 0) + AddEvent(onHeroOutOfGuardSight, {hero.gear}, heroOutOfGuardSight, {hero.gear}, 0) + elseif checkPointReached == 2 then + AddAmmo(hero.gear, amJetpack, 1) + AddAnim(dialog02) + end +end + +function onGameTick() + -- maybe alert this to avoid timeForGuard1ToTurnLeft overflow + if timeForGuard1ToTurnLeft == 0 and guard1.keepTurning then + guard1.turn = not guard1.turn + HogTurnLeft(guard1.gear, guard1.turn) + timeForGuard1ToTurnLeft = timeForGuard1ToTurn + end + timeForGuard1ToTurnLeft = timeForGuard1ToTurnLeft - 1 + AnimUnWait() + if ShowAnimation() == false then + return + end + ExecuteAfterAnimations() + CheckEvents() +end + +function onPrecise() + if GameTime > 3000 then + SetAnimSkip(true) + end +end + +function onAmmoStoreInit() + SetAmmo(amJetpack, 0, 0, 0, 1) +end + +function onNewTurn() + if CurrentHedgehog == director.gear or CurrentHedgehog == doctor.gear then + TurnTimeLeft = 0 + end + if guard1.keepTurning then + AnimSwitchHog(hero.gear) + TurnTimeLeft = -1 + end +end + +-------------- EVENTS ------------------ + +function onHeroBeforeTreePosition(gear) + if GetX(gear) > 2444 then + return true + end + return false +end + +function onHeroAtSaucerPosition(gear) + if GetX(gear) >= saucerX-32 and GetX(gear) <= saucerX+32 and GetY(gear) >= saucerY-32 and GetY(gear) <= saucerY+32 then + saucerAcquired = true + end + if saucerAcquired and StoppedGear(gear) then + return true + end + return false +end + +function onHeroOutOfGuardSight(gear) + if GetX(gear) < 3100 and GetY(gear) > saucerY-25 and StoppedGear(gear) and not guard1.keepTurning then + return true + end + return false +end + +-------------- OUTCOMES ------------------ + +function heroBeforeTreePosition(gear) + AnimSay(gear,loc("Now I have to climb the trees"), SAY_SAY, 4000) + AnimCaption(hero.gear, loc("Use the rope to get to the crate"), 4000) +end + +function heroAtSaucerPosition(gear) + TurnTimeLeft = 0 + -- save check point + SaveCampaignVar("CosmosCheckPoint", "2") + AddAnim(dialog02) + -- check if he was spotted by the guard + if guard1.turn then + guard1.keepTurning = false + AddAnim(dialog03) + end +end + +function heroOutOfGuardSight(gear) + guard1.keepTurning = true + AddAnim(dialog04) +end + +-------------- ANIMATIONS ------------------ + +function Skipanim(anim) + if goals[anim] ~= nil then + ShowMission(unpack(goals[anim])) + end + if CurrentHedgehog ~= hero.gear and anim ~= dialog03 then + AnimSwitchHog(hero.gear) + elseif anim == dialog03 then + startCombat() + end +end + +function AnimationSetup() + -- DIALOG 01 - Start + AddSkipFunction(dialog01, Skipanim, {dialog01}) + table.insert(dialog01, {func = AnimWait, args = {doctor.gear, 3000}}) + --table.insert(dialog01, {func = AnimWait, args = {hero.gear, 2500}, skipFunc = Skipanim, skipArgs = dialog01}) + table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Near secret base 17 of PAoTH in the rural Hogland..."), 4000}}) + table.insert(dialog01, {func = AnimSay, args = {director.gear, loc("So Hog Solo, here we are..."), SAY_SAY, 2000}}) + table.insert(dialog01, {func = AnimSay, args = {director.gear, loc("Behind these trees on the East there is secret base 17"), SAY_SAY, 4000}}) + table.insert(dialog01, {func = AnimSay, args = {director.gear, loc("You have to continue alone from now on."), SAY_SAY, 3000}}) + table.insert(dialog01, {func = AnimSay, args = {director.gear, loc("Be careful, the future of Hogera is in your hands!"), SAY_SAY, 7200}}) + table.insert(dialog01, {func = AnimSay, args = {doctor.gear, loc("We'll use our communicators to contact you"), SAY_SAY, 2600}}) + table.insert(dialog01, {func = AnimSay, args = {doctor.gear, loc("In am also entrusting you with a rope and a sleep gas bomb"), SAY_SAY, 5000}}) + table.insert(dialog01, {func = AnimSay, args = {doctor.gear, loc("You may find them handy"), SAY_SAY, 2300}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("Thank you Dr.Cornelius"), SAY_SAY, 1600}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("I'll make good use of them"), SAY_SAY, 4500}}) + table.insert(dialog01, {func = AnimSay, args = {director.gear, loc("It would be wiser to steal the space ship while PAoTH guards are taking a brake!"), SAY_SAY, 7000}}) + table.insert(dialog01, {func = AnimSay, args = {director.gear, loc("Remember! Many will seek the anti-gravity device! Now go, hurry up!"), SAY_SAY, 4000}}) + table.insert(dialog01, {func = AnimSwitchHog, args = {hero.gear}}) + -- DIALOG 02 - Hero got the saucer + AddSkipFunction(dialog02, Skipanim, {dialog02}) + table.insert(dialog02, {func = AnimWait, args = {hero.gear, 500}}) + table.insert(dialog02, {func = AnimCaption, args = {hero.gear, loc("CheckPoint reached!"), 4000}}) + table.insert(dialog02, {func = AnimSay, args = {hero.gear, loc("Got the saucer!"), SAY_SHOUT, 2000}}) + table.insert(dialog02, {func = AnimSay, args = {director.gear, loc("Nice!"), SAY_SHOUT, 1000}}) + table.insert(dialog02, {func = AnimSay, args = {director.gear, loc("Now use it and go to the moon PAoTH station to get more fuels!"), SAY_SHOUT, 5000}}) + table.insert(dialog02, {func = AnimGearWait, args = {hero.gear, 500}}) + -- DIALOG 03 - Hero got spotted by guard + AddSkipFunction(dialog03, Skipanim, {dialog03}) + table.insert(dialog03, {func = AnimWait, args = {guard1.gear, 4000}}) + table.insert(dialog03, {func = AnimCaption, args = {guard1.gear, loc("Prepare to battle or flee!"), 4000}}) + table.insert(dialog03, {func = AnimSay, args = {guard1.gear, loc("Hey").." "..guard2.name.."! "..loc("Look, someone is stealing the saucer!"), SAY_SHOUT, 4000}}) + table.insert(dialog03, {func = AnimSay, args = {guard2.gear, loc("I'll get him!"), SAY_SAY, 4000}}) + table.insert(dialog03, {func = startCombat, args = {guard1.gear}}) + -- DIALOG 04 - Hero out of sight + AddSkipFunction(dialog04, Skipanim, {dialog04}) + table.insert(dialog04, {func = AnimCaption, args = {guard1.gear, loc("You are out of danger, time to go to the moon!"), 4000}}) + table.insert(dialog04, {func = AnimSay, args = {guard1.gear, loc("I guess we lost him!"), SAY_SAY, 3000}}) + table.insert(dialog04, {func = AnimSay, args = {guard2.gear, loc("We should better report this and continue our watch!"), SAY_SAY, 5000}}) + table.insert(dialog04, {func = AnimSwitchHog, args = {hero.gear}}) +end + +------------------- custom animation functions -------------------------- + +function startCombat() + -- use this so guard2 will gain control + AnimSwitchHog(hero.gear) + TurnTimeLeft = 0 +end diff -r fd16cfa267aa -r 5c760ed50b3d share/hedgewars/Data/Missions/Campaign/CMakeLists.txt --- a/share/hedgewars/Data/Missions/Campaign/CMakeLists.txt Mon Jun 24 10:51:43 2013 +0200 +++ b/share/hedgewars/Data/Missions/Campaign/CMakeLists.txt Tue Jun 25 05:10:13 2013 +0300 @@ -1,4 +1,5 @@ add_subdirectory("A Classic Fairytale") +add_subdirectory("A Space Adventure") file(GLOB Scripts *.lua)