-- Search for enemies with nonzero pal.
-- foreachmap module.

local build = require("build")
local D = build.readdefs("../../names.h") or error("Need ../../names.h")

local assert = assert
local print = print
local string = require("string")

local io = require("io")

local function printf(fmt, ...)
    print(string.format(fmt, ...))
end


module(...)


local ENEMY_NAME = {
--[[
    [D.BOSS1] = "BOSS1",
    [D.BOSS1STAYPUT] = "BOSS1STAYPUT",
--]]
    [D.BOSS2] = "BOSS2",
    [D.BOSS3] = "BOSS3",
    [D.BOSS4] = "BOSS4",
    [D.BOSS4STAYPUT] = "BOSS4STAYPUT",
    [D.COMMANDER] = "COMMANDER",
    [D.COMMANDERSTAYPUT] = "COMMANDERSTAYPUT",
    [D.DRONE] = "DRONE",
    [D.GREENSLIME] = "GREENSLIME",
    [D.LIZMAN] = "LIZMAN",
    [D.LIZMANFEEDING] = "LIZMANFEEDING",
    [D.LIZMANJUMP] = "LIZMANJUMP",
    [D.LIZMANSPITTING] = "LIZMANSPITTING",
    [D.LIZMANSTAYPUT] = "LIZMANSTAYPUT",
    [D.LIZTROOP] = "LIZTROOP",
    [D.LIZTROOPDUCKING] = "LIZTROOPDUCKING",
    [D.LIZTROOPJETPACK] = "LIZTROOPJETPACK",
    [D.LIZTROOPJUSTSIT] = "LIZTROOPJUSTSIT",
    [D.LIZTROOPONTOILET] = "LIZTROOPONTOILET",
    [D.LIZTROOPRUNNING] = "LIZTROOPRUNNING",
    [D.LIZTROOPSHOOT] = "LIZTROOPSHOOT",
    [D.LIZTROOPSTAYPUT] = "LIZTROOPSTAYPUT",
    [D.OCTABRAIN] = "OCTABRAIN",
    [D.OCTABRAINSTAYPUT] = "OCTABRAINSTAYPUT",
    [D.ORGANTIC] = "ORGANTIC",
    [D.PIGCOP] = "PIGCOP",
    [D.PIGCOPDIVE] = "PIGCOPDIVE",
    [D.PIGCOPSTAYPUT] = "PIGCOPSTAYPUT",
    [D.RAT] = "RAT",
    [D.ROTATEGUN] = "ROTATEGUN",
    [D.SHARK] = "SHARK",
}

local uniq = false

function init(args)
    if (#args == 1) then
        local wr = function(s) io.stderr:write(s) end
        wr("Usage: "..args[0].." "..args[1].." [-u] *.map ...\n")
        wr("  -u: print only one pal-x-tilenum combination\n")
    end

    if (args[2]:sub(1,1)=="-") then
        assert(args[2]=="-u", "Unknown option "..args[2])
        uniq = true
        return 3
    end
end

function success(map, fn)
    -- Have one at all?
    local haveone = false

    -- Have pal-x-tile combination?
    -- [tile*256 + pal] = true
    local havept = {}

    for i=0,map.numsprites-1 do
        local spr = map.sprite[i]
        local picnum, pal = spr.picnum, spr.pal
        local name = ENEMY_NAME[picnum]

        if (name and pal~=0) then
            if (not (name:match("^LIZTROOP") and pal==21)) then  -- those are handled by CON
                if (not uniq or not havept[picnum*256 + pal]) then
                    if (not haveone) then
                        printf("%s:", fn)
                        haveone = true
                    end
                    printf("%5d %3d %s", i, pal, name)
                    havept[picnum*256 + pal] = true
                end
            end
        end
    end
    if (haveone) then
        print("")
    end
end