DramaticShapeVoxelMod archival mirror · read-only
tools/dump_shiny_palettes.lua

dump_shiny_palettes.lua

tools/dump_shiny_palettes.lua2.5 KB100644cf4c90f31b
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
-- Dump every species' ADVANCED palette and its shiny-shifted twin, as JSON.
--
--   luajit mods/DramaticShapeVoxelMod/tools/dump_shiny_palettes.lua > pals.json
--
-- Run from the PROJECT ROOT.
--
-- The game's battle pics are four-shade DMG grey (0/85/170/255) -- there is
-- no colour in the art at all. Under ADVANCED (`redpp`) the colour comes
-- entirely from a per-species palette applied over the top, which is why a
-- shiny SPRITE is a shifted palette rather than repainted art. This dumps
-- both halves so a comparison sheet can be built from them.
--
-- Reads the real generated data directly rather than going through
-- PaletteFX: the headless fixture dataset carries FIXMON placeholders, not
-- the 151, so a dump driven through it is of nothing.

local POK = dofile("data/generated/pokemon.lua")
local PACK = dofile("data/palettes_gbc.lua")

local V = { path = "mods/DramaticShapeVoxelMod" }
local loaded = {}
function V.require(name)
  if loaded[name] == nil then
    loaded[name] = assert(loadfile(V.path .. "/lib/" .. name .. ".lua"))(V)
  end
  return loaded[name]
end
V.mod = { log = { warn = function() end, info = function() end } }
local ShinyPalette = V.require("ShinyPalette")

local mons = POK.pokemon or POK
local rows = {}
for species, def in pairs(mons) do
  local dex = type(def) == "table" and def.dex
  if type(species) == "string" and dex and dex >= 1 and dex <= 151 then
    rows[#rows + 1] = { species = species, dex = dex,
                        name = def.name or species }
  end
end
table.sort(rows, function(a, b) return a.dex < b.dex end)

local function esc(s) return (tostring(s):gsub('"', '\\"')) end

io.write("[\n")
for i, r in ipairs(rows) do
  local palName = PACK.pokemon[r.species]
  local pal = palName and PACK.palettes[palName]
  if pal then
    local fn = ShinyPalette.paletteTransform(r.dex)
    local n, s = {}, {}
    for k = 1, 4 do
      local c = pal[k] or pal[#pal]
      local cr, cg, cb = c[1], c[2], c[3]
      n[k] = ("[%d,%d,%d]"):format(cr, cg, cb)
      if fn then
        local sr, sg, sb = fn(cr, cg, cb)
        s[k] = ("[%d,%d,%d]"):format(sr, sg, sb)
      else
        s[k] = n[k]
      end
    end
    io.write(('%s{"dex":%d,"species":"%s","name":"%s","pal":"%s",'
              .. '"normal":[%s],"shiny":[%s],"shifted":%s}')
      :format(i > 1 and ",\n" or "", r.dex, esc(r.species), esc(r.name),
              esc(palName), table.concat(n, ","), table.concat(s, ","),
              fn and "true" or "false"))
  end
end
io.write("\n]\n")