share/hedgewars/Data/Maps/ClimbHome/map.lua
changeset 10413 afd746a538ef
child 10580 17560eb73b4c
--- /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