first commit, added cosmos(menu) map and lua script with some functionality spacecampaign
authorPeriklis Ntanasis <pntanasis@gmail.com>
Tue, 25 Jun 2013 05:10:13 +0300
branchspacecampaign
changeset 9258 5c760ed50b3d
parent 9255 fd16cfa267aa
child 9263 5069877daa09
first commit, added cosmos(menu) map and lua script with some functionality
QTfrontend/hedgewars.qrc
QTfrontend/res/campaign/A Space Adventure/cosmos.png
share/hedgewars/Data/Locale/campaigns_en.txt
share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/first_blood.lua
share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/journey.lua
share/hedgewars/Data/Missions/Campaign/A Space Adventure/CMakeLists.txt
share/hedgewars/Data/Missions/Campaign/A Space Adventure/campaign.ini
share/hedgewars/Data/Missions/Campaign/A Space Adventure/cosmos.hwp
share/hedgewars/Data/Missions/Campaign/A Space Adventure/cosmos.lua
share/hedgewars/Data/Missions/Campaign/CMakeLists.txt
--- 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 @@
         <file>res/campaign/A Classic Fairytale/queen.png</file>
         <file>res/campaign/A Classic Fairytale/enemy.png</file>
         <file>res/campaign/A Classic Fairytale/epil.png</file>
+        <file>res/campaign/A Space Adventure/cosmos.png</file>
         <file>res/bonus.png</file>
         <file>res/Hedgehog.png</file>
         <file>res/net.png</file>
Binary file QTfrontend/res/campaign/A Space Adventure/cosmos.png has changed
--- 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!"
--- 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
--- 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
--- /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")
--- /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
Binary file share/hedgewars/Data/Missions/Campaign/A Space Adventure/cosmos.hwp has changed
--- /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
--- 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)