Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
Tags
(6 edits)

Multi-layer interpretation solution

NES games have only one background layer. Therefore in games with multiple graphical layers object in the front layer will completly hide the one in the back layer or both objects apperance will be mixed in the same tiles. However we can interpolate the missing graphic of the back layer based on surround shapes to create the correct multi-layer representation. To do it we use a pair of script tagged "bg" and "bg1".  The surround shapes will be tagged "bg" and the target 3dShape will be tagged "bg1" and play the role of a "place holder". 

- "bg" script:  pattern parameters used in the script:

  • CData[1]: if the value is different than 0 then the shape texture will not be used as background  texture in case there is different shapws in the bg region/slot
  • CData[2] : the tolerance delta deternimes if a background shape belongs to a backgroun region/slot. If this value is -1 then the shape will be treated like the sole bg region in the current frame
function Start()
    bgSlot = {}
    MaxSlot = 10
    for i = 1, MaxSlot do
        bgSlot[i] = {}
    end
end
function End()
    bgSlot = nil
end
function Update()
    bgCount = 0
    bgOne = 0
end
function Connect(s, slot, delta)
    local r = s.Palette == slot.shape.Palette and s.tStart.x <= slot.ex + delta and slot.sx <= s.tEnd.x + delta and s.tStart.y <= slot.ey + delta and slot.sx <= s.tEnd.x + delta;
    return r;
end
function UpdateS()
    if bgOne == 1 then
        return
    end
    if shape.Bg then
        if shape.CData[2] == -1 then
            bgOne = 1
            bgCount = 1
            local slot = bgSlot[1]
            slot.sx = -1
            slot.sy = -1
            slot.ex = 33
            slot.ey = 31
            slot.delta = 0            
            slot.shape = shape
            return
        end
        for i = 1, bgCount do
            local slot = bgSlot[i]
            local delta = max(slot.delta, shape.CData[2])
            if Connect(shape2D, slot, delta) then
                slot.sx = min(slot.sx, shape2D.tStart.x)
                slot.sy = min(slot.sy, shape2D.tStart.y)
                slot.ex = max(slot.ex, shape2D.tEnd.x)
                slot.ey = max(slot.ey, shape2D.tEnd.y)
                slot.delta = delta
                if slot.shape.CData[1] ~= 0 then
                    slot.shape = shape
                    slot.delta = delta
                end
                return;
            end            
        end
        if bgCount < MaxSlot then
            bgCount = bgCount + 1;
            local slot = bgSlot[bgCount]
            slot.shape = shape
            slot.sx = shape2D.tStart.x
            slot.sy = shape2D.tStart.y
            slot.ex = shape2D.tEnd.x
            slot.ey = shape2D.tEnd.y
            slot.delta = shape.CData[2]
        end
    end
end
function min(a,b)
    if a < b then
        return a
    end
    return b
end
function max(a,b)
    if a > b then
        return a
    end
    return b
end

- "bg1" script: pattern parameters used in the script:

  • CDatap[0] : bg texture will have this offset while applying to this place holder
function In(shape2D, bgSlot)
    return shape2D.tStart.x + 1 >= bgSlot.sx and shape2D.tStart.y + 1 >= bgSlot.sy and shape2D.tEnd.x <= bgSlot.ex + 1  and shape2D.tEnd.y  <= bgSlot.ey + 1
end
function Start()
    bg1List = {}
    bg1Count = 0
end
function Update()
    for i = 1,bg1Count do
        bg1List[i] = nil
    end
    bg1Count = 0
end
function UpdateS()
    if shape.Bg then
        bg1Count = bg1Count + 1
        bg1List[bg1Count] = shape
    end
end
function LateUpdate()
    for j = 1,bg1Count do
        local select = nil
        local shape = bg1List[j]
        for i = 1, bgCount do
            local _bgSlot = bgSlot[i]
            if  shape.Shape2D ~= _bgSlot.shape.Shape2D and In(shape.Shape2D, _bgSlot) and (not select or (select.ey - select.sy > _bgSlot.ey - _bgSlot.sy)) then
                select = _bgSlot
            end            
        end
        if select then
            shape.Enable = true            
            local bgShape = select.shape            
            shape.customPalette = bgShape.Palette
            shape.Layer = bgShape.Layer
            shape.Offset.z = bgShape.Offset.z
            shape.CastShadow = bgShape.CastShadow
            shape.RecvShadow = bgShape.RecvShadow
            shape.slot = bgShape.slot
            shape.texOffset.x = shape.CData[0]
            shape.Scale.z = bgShape.Scale.z * bgShape.sizeZ / shape.sizeZ
            shape.Alpha = bgShape.Alpha
            shape.Pivot.z = 0    
        else 
            shape.Enable = false        
        end
    end
end