# HG changeset patch # User nemo # Date 1411784412 14400 # Node ID afd746a538ef109c0c17659c5db4e0c8cf547e8c # Parent ee4e6d392b31b65e87457c3a9252e42a005d9284 climb home training/multiplayer diff -r ee4e6d392b31 -r afd746a538ef share/hedgewars/Data/Maps/CMakeLists.txt --- a/share/hedgewars/Data/Maps/CMakeLists.txt Wed Sep 17 23:03:24 2014 -0400 +++ b/share/hedgewars/Data/Maps/CMakeLists.txt Fri Sep 26 22:20:12 2014 -0400 @@ -11,6 +11,7 @@ Castle Cave Cheese + ClimbHome Cogs Control CrazyMission diff -r ee4e6d392b31 -r afd746a538ef share/hedgewars/Data/Maps/ClimbHome/map.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/ClimbHome/map.cfg Fri Sep 26 22:20:12 2014 -0400 @@ -0,0 +1,4 @@ +EarthRise +48 +Timeless +Shoppa diff -r ee4e6d392b31 -r afd746a538ef share/hedgewars/Data/Maps/ClimbHome/map.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/ClimbHome/map.lua Fri Sep 26 22:20:12 2014 -0400 @@ -0,0 +1,290 @@ +HedgewarsScriptLoad("/Scripts/Locale.lua") +HedgewarsScriptLoad("/Scripts/Utils.lua") + +local hTag = nil +local hTagHeight = 33000 +local tTag = nil +local rTag = nil +local startTime = 0 +local MaxHeight = 32640 +local RecordHeight = 33000 +local Fire = {} +--local BoomFire = nil +local HH = {} +local MrMine -- in honour of sparkle's first arrival in the cabin +local YouWon = false +local WaterRise = nil +local Cake = nil +local CakeWasJustAdded = false +local CakeTries = 0 +local Stars = {} + +function onGameInit() + -- Ensure people get same map for same theme + TurnTime = 999999999 + CaseFreq = 0 + Explosives = 0 + MineDudPercent = 0 + DisableGameFlags(gfBottomBorder+gfBorder) + --This reduced startup time by only about 15% and looked ugly + --EnableGameFlags(gfDisableLandObjects) + -- force seed instead. Some themes will still be easier, but at least you won't luck out on the same theme + Seed = ClimbHome +end + +function onGearAdd(gear) + if GetGearType(gear) == gtHedgehog then + HH[gear] = 1 + end +end + +function onGearDelete(gear) + if gear == MrMine then + AddCaption("Once you set off the proximity trigger, Mr. Mine is not your friend",0xffffff,0) + MrMine = nil + elseif gear == Cake then + Cake = nil + end +end + +function onGameStart() + ShowMission(loc("Climb Home"), + loc("Rope to safety"), + loc("You are far from home, and the water is rising, climb up as high as you can!"), + -amRope, 0) + local x = 1818 + for h,i in pairs(HH) do + -- SetGearPosition(h,x,32549) + SetGearPosition(h,x,108) + SetHealth(h,1) + if x < 1978 then x = x+32 else x = 1818 end + SetState(h,bor(GetState(h),gstInvisible)) + end +-- 1925,263 - Mr. Mine position + MrMine = AddGear(1925,263,gtMine,0,0,0,0) +end +function onAmmoStoreInit() + SetAmmo(amRope, 9, 0, 0, 0) +end + +function onNewTurn() + startTime = GameTime + --disable to preserve highest over multiple turns + --will need to change water check too ofc + MaxHeight = 32640 + hTagHeight = 33000 + SetWaterLine(32768) + if CurrentHedgehog ~= nil then + SetGearPosition(CurrentHedgehog, 1951,32640) + AddVisualGear(19531,32640,vgtExplosion,0,false) + SetState(CurrentHedgehog,band(GetState(CurrentHedgehog),bnot(gstInvisible))) + end + for f,i in pairs(Fire) do + DeleteGear(f) + end + for s,i in pairs(Stars) do + DeleteVisualGear(s) + Stars[s] = nil + end + + for i = 0,12 do + flame = AddGear(2000+i*2,308, gtFlame, gsttmpFlag, 0, 0, 0) + SetTag(flame, 999999+i) + Fire[flame]=1 + end + if Cake ~= nil then DeleteGear(Cake) end + CakeTries = 0 +end + +--function onGearDelete(gear) +-- if gear == WaterRise and MaxHeight > 500 and CurrentHedgehog ~= nil and band(GetState(CurrentHedgehog),gstHHDriven) ~= 0 then +-- WaterRise = AddGear(0,0,gtWaterUp, 0, 0, 0, 0) +-- end +--end + +function FireBoom(x,y,d) -- going to add for rockets too + AddVisualGear(x,y,vgtExplosion,0,false) + -- going to approximate circle by removing corners + if BoomFire == nil then BoomFire = {} end + for i = 0,50 do + flame = AddGear(x+GetRandom(d),y+GetRandom(d), gtFlame, gsttmpFlag, 0, 0, 0) + SetTag(flame, 999999+i) + Fire[flame]=1 +-- BoomFire[flame]=1 + end +end + + +function onGameTick20() + if math.random(20) == 1 then + AddVisualGear(2012,56,vgtSmoke,0,false) + end + if CakeWasJustAdded then + FollowGear(CurrentHedgehog) + CakeWasJustAdded = false + end + --if BoomFire ~= nil then + -- for f,i in pairs(BoomFire) do + -- if band(GetState(f),gstCollision~=0) then DeleteGear(f) end + -- end + -- BoomFire = nil + --end + + for s,i in pairs(Stars) do + g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(s) + if g1 > WaterLine + 500 then + DeleteVisualGear(s) + Stars[s] = nil + end + --else wasn't really visible, pointless. + -- g5 = g5+1 + -- if g5 > 360 then g5 = 0 end + -- SetVisualGearValues(s, g1, g2, g3, g4, g5, g6, g7, g8, g9, g10) + --end + end + + if Cake ~= nil and CurrentHedgehog ~= nil then + local cx,cy = GetGearPosition(Cake) + local x,y = GetGearPosition(CurrentHedgehog) + if y < cy-1500 then + DeleteGear(Cake) + Cake = nil + end + if gearIsInCircle(CurrentHedgehog,cx,cy,450) then + FireBoom(cx,cy,350) -- todo animate + DeleteGear(Cake) + Cake = nil + end + end + + if CurrentHedgehog ~= nil and TurnTimeLeft > 0 and band(GetState(CurrentHedgehog),gstHHDriven) ~= 0 then + if MaxHeight < 32000 and MaxHeight > 286 and WaterLine > 286 then SetWaterLine(WaterLine-2) end + local x,y = GetGearPosition(CurrentHedgehog) + if y > 0 and y < 30000 and MaxHeight > 286 and math.random(y) < 500 then + local s = AddVisualGear(0, 0, vgtStraightShot, 0, true) + local c = div(250000,y) + if c > 255 then c = 255 end + c = c * 0x10000 + 0xFF0000FF + SetVisualGearValues(s, + math.random(2048), -5000, 0, -1-(1/y*1000), + math.random(360), + 0, + 999999999, -- frameticks + 171, -- star + 0, c) + --, 0xFFCC00FF) -- could be fun to make colour shift as you rise... + Stars[s] = 1 + end + end + + if CurrentHedgehog ~= nil and band(GetState(CurrentHedgehog),gstHHDriven) == 0 then + for f,i in pairs(Fire) do -- takes too long to fall otherwise + DeleteGear(f) + end + if Cake ~= nil then + DeleteGear(Cake) + Cake = nil + end + end + + if GameTime % 500 == 0 and CurrentHedgehog ~= nil and TurnTimeLeft > 0 then + --if isSinglePlayer and MaxHeight < 32000 and WaterRise == nil then + -- WaterRise = AddGear(0,0,gtWaterUp, 0, 0, 0, 0) + --end + if isSinglePlayer and not YouWon and gearIsInBox(CurrentHedgehog, 1920, 252, 50, 50) then + ShowMission(loc("Climb Home"), + loc("Made it!"), + string.format(loc("AHHh, home sweet home. Made it in %d seconds."),(GameTime-startTime)/1000), + -amRope, 0) + PlaySound(sndVictory,CurrentHedgehog) + EndGame() + YouWon = true + end + + local x,y = GetGearPosition(CurrentHedgehog) + if CakeTries < 10 and y < 32600 and y > 3000 and Cake == nil and band(GetState(CurrentHedgehog),gstHHDriven) ~= 0 then + -- doing this just after the start the first time to take advantage of randomness sources + -- there's a small chance it'll jiggle the camera though, so trying not to do it too often + -- Pick a clear y to start with + if y > 31000 then cy = 24585 elseif + y > 28000 then cy = 21500 elseif + y > 24000 then cy = 19000 elseif + y > 21500 then cy = 16000 elseif + y > 19000 then cy = 12265 elseif + y > 16000 then cy = 8800 elseif + y > 12000 then cy = 5700 else + cy = 400 end + Cake = AddGear(GetRandom(2048), cy, gtCake, 0, 0, 0, 0) + SetHealth(Cake,999999) + CakeWasJustAdded = true + CakeTries = CakeTries + 1 -- just try twice right now + end + if (y > 286) or (y < 286 and MaxHeight > 286) then + if y < MaxHeight and y > 286 then MaxHeight = y end + if y < 286 then MaxHeight = 286 end + if MaxHeight < hTagHeight then + hTagHeight = MaxHeight + if hTag ~= nil then DeleteVisualGear(hTag) end + hTag = AddVisualGear(0, 0, vgtHealthTag, 0, true) + local g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(hTag) + -- snagged from space invasion + SetVisualGearValues ( + hTag, --id + -(ScreenWidth/2) + 40, --xoffset + ScreenHeight - 60, --yoffset + 0, --dx + 0, --dy + 1.1, --zoom + 1, --~= 0 means align to screen + g7, --frameticks + -- 116px off bottom for lowest rock, 286 or so off top for position of chair + -- 32650 is "0" + 32640-hTagHeight, --value + 99999999999,--timer + GetClanColor(GetHogClan(CurrentHedgehog)) + ) + end + if MaxHeight < RecordHeight then + RecordHeight = MaxHeight + if rTag ~= nil then DeleteVisualGear(rTag) end + rTag = AddVisualGear(0, 0, vgtHealthTag, 0, true) + local g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(hTag) + -- snagged from space invasion + SetVisualGearValues ( + rTag, --id + -(ScreenWidth/2) + 100, --xoffset + ScreenHeight - 60, --yoffset + 0, --dx + 0, --dy + 1.1, --zoom + 1, --~= 0 means align to screen + g7, --frameticks + -- 116px off bottom for lowest rock, 286 or so off top for position of chair + -- 32650 is "0" + 32640-RecordHeight, --value + 99999999999,--timer + GetClanColor(GetHogClan(CurrentHedgehog)) + ) + end + end + if MaxHeight > 286 then + if tTag ~= nil then DeleteVisualGear(tTag) end + tTag = AddVisualGear(0, 0, vgtHealthTag, 0, true) + local g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tTag) + -- snagged from space invasion + SetVisualGearValues ( + tTag, --id + -(ScreenWidth/2) + 40, --xoffset + ScreenHeight - 100, --yoffset + 0, --dx + 0, --dy + 1.1, --zoom + 1, --~= 0 means align to screen + g7, --frameticks + (GameTime-startTime)/1000, --value + 99999999999,--timer + 0xffffffff + ) + end + end +end diff -r ee4e6d392b31 -r afd746a538ef share/hedgewars/Data/Maps/ClimbHome/mask.png Binary file share/hedgewars/Data/Maps/ClimbHome/mask.png has changed diff -r ee4e6d392b31 -r afd746a538ef share/hedgewars/Data/Maps/ClimbHome/preview.png Binary file share/hedgewars/Data/Maps/ClimbHome/preview.png has changed diff -r ee4e6d392b31 -r afd746a538ef share/hedgewars/Data/Missions/Training/ClimbHome.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Training/ClimbHome.lua Fri Sep 26 22:20:12 2014 -0400 @@ -0,0 +1,22 @@ +HedgewarsScriptLoad("/Scripts/Locale.lua") + +isSinglePlayer = true + +-- trying to allow random theme, but fixed theme objects... +-- Also skip some ugly themes, or ones where the sky is "meh" +--local themes = { "Art","Cake","City","EarthRise","Halloween","Olympics","Underwater","Bamboo","Castle","Compost","Eyes","Hell","Planes","Bath","Cave","CrazyMission","Freeway","Island","Sheep","Blox","Cheese","Deepspace","Fruit","Jungle","Snow","Brick","Christmas","Desert","Golf","Nature","Stage" } +local themes = {"Christmas","Hell","Bamboo","City","Island","Bath","Compost","Jungle","Desert","Nature","Olympics","Brick","EarthRise","Sheep","Cake","Freeway","Snow","Castle","Fruit","Stage","Cave","Golf","Cheese","Halloween"} + +function onGameInit() + -- Ensure people get same map for same theme + Theme = themes[GetRandom(#themes)+1] + Seed = ClimbHome + TurnTime = 999999999 + EnableGameFlags(gfOneClanMode) + DisableGameFlags(gfBottomBorder+gfBorder) + CaseFreq = 0 + Explosives = 0 + Map = "ClimbHome" + AddTeam(loc("Lonely Hog"), 14483456, "Simple", "Island", "Default") + player = AddHog(loc("Climber"), 0, 1, "NoHat") +end