share/hedgewars/Data/Scripts/Multiplayer/ShoppaMap.lua
author Wuzzy <Wuzzy2@mail.ru>
Mon, 12 Mar 2018 02:09:21 +0100
changeset 13169 6869d27a2f3f
parent 11482 b053f1fb631d
child 13278 7476c1a50738
permissions -rw-r--r--
ACF7: Add one pick hammer in crate Players often reported to screw up with the pick hammer, which is quite annoying. With one pick hammer more, this mission should be slightly less annoying.

HedgewarsScriptLoad("/Scripts/Params.lua")

local ObjectList = {}

-- Overall padding for roping freedom
local Padding = 430
local TeamRope = false

function onParameters()
    parseParams()
    if params["pad"] ~= nil then
        Padding = params["pad"]
    end
    if params["teamrope"] ~= nil then
        TeamRope = true
    end
end

function onGearAdd(gear)
    if GetGearType(gear) == gtRope and TeamRope then
        SetTag(gear,1)
        SetGearValues(gear,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,GetClanColor(GetHogClan(CurrentHedgehog)))
    end
end


-- This could probably use less points and more precision
-- 700x700 for object space
function DrawStar(x, y, d, f)
-- default scale is 700x700 or so
    local s = 700
    local i = 0
    local j = 0
    if not(d == 1) then s = div(s,d) end
    if NoOverlap(x,y,s,s) then
        AddCollision(x,y,s,s)
        if not(d == 1) then
            i = 6-d
            j = math.min(div(5,d),1)
            -- centre
            AddPoint(x,y,div(20,d))
            -- arms
            AddPoint(x-div(325,d),y-f*div(108,d),2)
            AddPoint(x+div(325,d),y-f*div(108,d))
            AddPoint(x-div(205,d),y+f*div(270,d))
            AddPoint(x,y-f*div(345,d))
            AddPoint(x+div(205,d),y+f*div(270,d))
            AddPoint(x-div(325,d),y-f*div(108,d))
            if d < 4 then
            -- fill in arm 1
            AddPoint(x-div(275,d),y-f*div(92,d),i)
            AddPoint(x-div(50,d),y-f*div(92,d))
            AddPoint(x-div(105,d),y+f*div(25,d))
            AddPoint(x-div(250,d),y-f*div(80,d))
            AddPoint(x-div(115,d),y-f*div(70,d))
            AddPoint(x-div(130,d),y-f*div(25,d))
            AddPoint(x-div(175,d),y-f*div(60,d))
            -- fill in arm 2
            AddPoint(x+div(275,d),y-f*div(92,d),i)
            AddPoint(x+div(50,d),y-f*div(92,d))
            AddPoint(x+div(105,d),y+f*div(25,d))
            AddPoint(x+div(250,d),y-f*div(80,d))
            AddPoint(x+div(115,d),y-f*div(70,d))
            AddPoint(x+div(130,d),y-f*div(25,d))
            AddPoint(x+div(175,d),y-f*div(60,d))
            -- fill in arm 3
            AddPoint(x-div(175,d),y+f*div(230,d),i)
            AddPoint(x-div(110,d),y+f*div(60,d))
            AddPoint(x,y+f*div(120,d))
            AddPoint(x-div(155,d),y+f*div(215,d))
            AddPoint(x-div(105,d),y+f*div(95,d))
            AddPoint(x-div(60,d),y+f*div(130,d))
            AddPoint(x-div(85,d),y+f*div(155,d),j)
            -- fill in arm 4
            AddPoint(x,y-f*div(300,d),3)
            AddPoint(x+div(50,d),y-f*div(125,d))
            AddPoint(x-div(50,d),y-f*div(125,d))
            AddPoint(x,y-f*div(270,d))
            AddPoint(x-div(40,d),y-f*div(160,d))
            AddPoint(x+div(40,d),y-f*div(160,d))
            AddPoint(x,y-f*div(195,d),j)
            -- fill in arm 5
            AddPoint(x+div(175,d),y+f*div(230,d),i)
            AddPoint(x+div(110,d),y+f*div(60,d))
            AddPoint(x,y+f*div(120,d))
            AddPoint(x+div(155,d),y+f*div(215,d))
            AddPoint(x+div(105,d),y+f*div(95,d))
            AddPoint(x+div(60,d),y+f*div(130,d))
            AddPoint(x+div(85,d),y+f*div(155,d),j)
            end
        else
            -- centre
            AddPoint(x,y,20)
            -- arms
            AddPoint(x-325,y-f*108,1)
            AddPoint(x+325,y-f*108)
            AddPoint(x-205,y+f*270)
            AddPoint(x,y-f*345)
            AddPoint(x+205,y+f*270)
            AddPoint(x-325,y-f*108)
            -- fill in arm 1
            AddPoint(x-275,y-f*92,4)
            AddPoint(x-50,y-f*92)
            AddPoint(x-105,y+f*25)
            AddPoint(x-250,y-f*80)
            AddPoint(x-115,y-f*70)
            AddPoint(x-130,y-f*25)
            AddPoint(x-175,y-f*60)
            -- fill in arm 2
            AddPoint(x+275,y-f*92,4)
            AddPoint(x+50,y-f*92)
            AddPoint(x+105,y+f*25)
            AddPoint(x+250,y-f*80)
            AddPoint(x+115,y-f*70)
            AddPoint(x+130,y-f*25)
            AddPoint(x+175,y-f*60)
            -- fill in arm 3
            AddPoint(x-175,y+f*230,4)
            AddPoint(x-110,y+f*60)
            AddPoint(x-10,y+f*120)
            AddPoint(x-155,y+f*215)
            AddPoint(x-105,y+f*95)
            AddPoint(x-60,y+f*130)
            AddPoint(x-85,y+f*155,5)
            -- fill in arm 4
            AddPoint(x,y-f*300,3)
            AddPoint(x+50,y-f*125)
            AddPoint(x-50,y-f*125)
            AddPoint(x,y-f*270)
            AddPoint(x-40,y-f*160)
            AddPoint(x+40,y-f*160)
            AddPoint(x,y-f*195,5)
            -- fill in arm 5
            AddPoint(x+175,y+f*230,4)
            AddPoint(x+110,y+f*60)
            AddPoint(x+10,y+f*120)
            AddPoint(x+155,y+f*215)
            AddPoint(x+105,y+f*95)
            AddPoint(x+60,y+f*130)
            AddPoint(x+85,y+f*155,5)
        end
        return true
    else
        return false
    end
end

-- well. this was easy
function DrawCircle(x, y, w)
    if NoOverlap(x,y,w*10+6,w*10+6) then
        AddCollision(x,y,w*10+6,w*10+6)
        AddPoint(x,y,w)
        return true
    else
        return false
    end
end

function DrawCrescent(x, y, w, s)
    local b = div(w*(GetRandom(4)+1)*10+6,6)
    
    if NoOverlap(x,y,w*10+6,w*10+6) then
        AddCollision(x,y,w*10+6,w*10+6)
        AddPoint(x,y,w)
        if s then -- side
            if GetRandom(1) == 0 then
                b = b*-1
            end
            AddPoint(x-b,y,w,true)
        else -- top
            AddPoint(x,y-b,w,true)
        end
        return true
    else
        return false
    end
end

function DrawCones(x,w,h,c)
    local i = 0
    local y = 2048-h
    local hw = div(w,2)
    if NoOverlap(x+div(w*c,2),y+div(h,2),w*c,h) then
        AddCollision(x+div(w*c,2),y+div(h,2),w*c,h)
        x = x + hw
        for i = 1,c do -- I'm guessing outlining is slightly more efficient than fanning at 16px brush
            AddPoint(x,y,1)
            AddPoint(x-hw+8,2048)
            AddPoint(x+hw-8,2048)
            AddPoint(x,y)
            for j = x-hw+25,x+hw,34 do
                AddPoint(x,y+30,3)
                AddPoint(j,2048)
            end
            if GetRandom(2)==0 then
                AddPoint(x,y-20,8)
            end
            x = x + w
        end
    else
        return false
    end
    
end

function DrawPlateau(x,y,l,t,b)
    local bo = 0
    local to = 0
    local bSucc = false
    local tSucc = false
    if NoOverlapXY(x-28,y-28,x+l+28,y+l+28) then
        AddPoint(x,y,5)
        AddPoint(x+l,y)

        to = GetRandom(6)
        if not(to==0) then
            if GetRandom(2)==0 then
                to = div(l,to)
            else
                to = l-div(l,to)
            end
        end
        if t>0 and NoOverlapXY(x+to-28,y-t-28,x+to+28,y+28) then
            AddPoint(x+to,y-t,5)
            AddPoint(x+to,y)
            if GetRandom(2)==0 then
                AddPoint(x+to,y-t+75,20)
            else -- square off
                AddPoint(x+to-20,y-t,1)
                AddPoint(x+to-20,y-t-20)
                AddPoint(x+to+20,y-t-20)
                AddPoint(x+to+20,y-t)
            end
            tSucc = true
        end

        if to > 120 and GetRandom(2)==0 then -- left bumper
            AddPoint(x+15,y-20,9)
        else -- square off
            --AddPoint(x-50,y,2)
            AddPoint(x,y+20,1)
            AddPoint(x-20,y+20)
            AddPoint(x-20,y-20)
            AddPoint(x,y-20)
        end
        if to < (l-120) and GetRandom(2)==0 then -- right bumper
            AddPoint(x+l-15,y-20,9)
        else -- square off
            --AddPoint(x+l+50,y,2)
            AddPoint(x+l,y+20,1)
            AddPoint(x+l+20,y+20)
            AddPoint(x+l+20,y-20)
            AddPoint(x+l,y-20)
        end
        bo = GetRandom(6)
        if not(bo == 0) then
            if GetRandom(2)==0 then
                bo = div(l,bo)
            else
                bo = l-div(l,bo)
            end
        end
        -- still consider a success even if we can't place this one.  Might need to return more than true/false
        if b>0 and NoOverlapXY(x+bo-28,y-28,x+bo+28,y+b+28) then
            AddPoint(x+bo,y,5)
            AddPoint(x+bo,y+b)
            if GetRandom(2)==0 then
                AddPoint(x+bo,y+b-75,20)
            else -- square off
                AddPoint(x+bo-20,y+b,1)
                AddPoint(x+bo-20,y+b+20)
                AddPoint(x+bo+20,y+b+20)
                AddPoint(x+bo+20,y+b)
            end
            bSucc = true
        end
        if bSucc then AddCollisionXY(x+bo-28,y-28,x+bo+28,y+b+28) end
        if tSucc then AddCollisionXY(x+to-28,y-t-28,x+to+28,y+28) end
        AddCollisionXY(x-28,y-28,x+l+28,y+28) 
        return true
    else
        return false
    end
end

function AddCollision(x,y,w,h)
    table.insert(ObjectList,{x-div(w+Padding,2),
                             y-div(h+Padding,2),
                             x+div(w+Padding,2),
                             y+div(h+Padding,2)})
end

function AddCollisionXY(x,y,x2,y2)
    table.insert(ObjectList,{x-div(Padding,2),
                             y-div(Padding,2),
                             x2+div(Padding,2),
                             y2+div(Padding,2)})
end

-- bounding box check
function NoOverlap(x,y,w,h)
    w = w
    h = h
    x = x-div(w,2)
    y = y-div(h,2)
    return NoOverlapXY(x,y,x+w,y+h)
end
function NoOverlapXY(x,y,x2,y2)
    local i = 1
    local l = table.getn(ObjectList)
    local ox = 0
    local oy = 0
    local ox2 = 0
    local oy2 = 0
    while i<=l do
        ox = ObjectList[i][1]
        oy = ObjectList[i][2]
        ox2 = ObjectList[i][3]
        oy2 = ObjectList[i][4]
         --   WriteLnToConsole(ox..' '..oy..' '..ox2..' '..oy2..' - '..x..' '..y..' '..x2..' '..y2)
        --if (math.abs(ox + ox2 -x - x2) <= (ox2 - ox + x2 - x)) and (math.abs(oy + oy2 - y - y2) <= (oy - oy2 + y - y2)) then
        if x < ox2 and ox < x2 and y < oy2 and oy < y2 then
            return false
        end
        i=i+1
    end
    return true
end

function dbg()
    local i = 1
    local l = table.getn(ObjectList)
    local ox = 0
    local oy = 0
    local ox2 = 0
    local oy2 = 0
    while i<=l do
        ox = ObjectList[i][1]
        oy = ObjectList[i][2]
        ox2 = ObjectList[i][3]
        oy2 = ObjectList[i][4]
        AddPoint(ox,oy,1)
        AddPoint(ox2,oy)
        AddPoint(ox2,oy2)
        AddPoint(ox,oy2)
        AddPoint(ox,oy)
        AddPoint(ox2,oy2)
        i=i+1
    end
end

function onPreviewInit()
onGameInit()
end

function onGameInit()
    MapGen = mgDrawn
    TemplateFilter = 0
    local TotGen = 0
    local Tries = 0
    local i = 0
    local l = 0
    local x = 0
    local y = 0
    local w = 0
    local h = 0 
    if GetGameFlag(gfSolidLand) then EnableGameFlags(gfShoppaBorder) end
    if not GetGameFlag(gfBottomBorder) and GetRandom(2) == 0 then
        AddPoint(-50,2010,7)
        AddPoint(4150,2010)
        for i = 0,GetRandom(3) do
            x = GetRandom(4096)
            w = GetRandom(40)+10
            AddPoint(x,2200,w,true)
            AddPoint(x,1900)
            table.insert(ObjectList,{x-div(w*9,2),
                                     2010-div(100,2),
                                     x+div(w*9,2),
                                     2010+div(100,2)})
        end
    end
        
    if GetRandom(2) == 0 then
        l = GetRandom(3)+1
        w = GetRandom(200)+200
        h = GetRandom(350)+200
        x = GetRandom(4096-w*l)
        DrawCones(x,w,h,l)
        --if DrawCones(x,w,h,l) then TotGen = TotGen+1
    end
    if GetRandom(2) == 0 then
        for i = 1,GetRandom(5)+1 do
            w = GetRandom(35)+15
            x = GetRandom(4096-w*12)+w
	    if GetRandom(2)==0 then
		y = 2048-GetRandom(w*10+6)
	    else
	    	y = 2048
	    end
           -- if AddPoint(x,y,w) then TotGetn = TotGen+1
           DrawCircle(x,y,w)
        end
    end
    if GetRandom(2)==0 then
        x = GetRandom(3300)+382
        y = GetRandom(1300)+382
        if DrawStar(x,y, 1, 1+GetRandom(2)*-2) then
            TotGen = TotGen+1
        end
    end

    while (TotGen < 6) and (Tries < 100) do
        l = GetRandom(1000-Tries*10)+300
        x = GetRandom(3900-l)+100
        y = GetRandom(1900)+100
        if GetRandom(2)==0 then b = GetRandom(800)+300
        else b = 0 end
        if GetRandom(2)==0 then t = GetRandom(800)+300
        else t = 0 end
        if y-t < 50 then t = y - 50 end
        if t < 200 then t = 0 end
        if DrawPlateau(x,y,l,t,b) then
            TotGen = TotGen+1
        end
        Tries = Tries + 1
    end
    Tries = 0
    while (TotGen < 17) and (Tries < 1000) do
        if Tries < 500 and GetRandom(2)==0 then
            x = GetRandom(3300)+350
            y = GetRandom(1300)+350
            if DrawStar(x,y, 1, 1+GetRandom(2)*-2) then
                TotGen = TotGen+1
            end
        else
            if Tries > 500 then d = GetRandom(2)+3
            else d = GetRandom(3)+2 end
            x = GetRandom(4000-div(764,d))+div(764,d*2)
            y = GetRandom(1300-div(764,d))+div(764,d*2)
            if DrawStar(x,y, d, 1+GetRandom(2)*-2) then
                TotGen = TotGen+1
            end
        end
        w = GetRandom(35-div(Tries,29))+15
        x = GetRandom(4050-w*20)+w*10
        y = GetRandom(2000-w*20)+w*10
        if DrawCircle(x,y,w) then
            TotGen = TotGen+1
        end
        w = GetRandom(35-div(Tries,29))+5
        x = GetRandom(4050-w*20)+w*10
        y = GetRandom(2000-w*20)+w*10
        if DrawCrescent(x,y,w,GetRandom(2)==0) then
            TotGen = TotGen+1
        end
        Tries = Tries + 1
    end
--    Padding = div(Padding,2)
--    Tries = 0
--    while (TotGen < 21) and (Tries < 10000) do
--        r = GetRandom(20-div(Tries,223))+5
--        x = GetRandom(4050-r*20)+r*10
--        y = GetRandom(2000-r*20)+r*10
--        if DrawCircle(x,y,r) then
--            TotGen = TotGen+1
--        end
--        Tries = Tries + 1
--    end
    --dbg()
    FlushPoints()
end