CREATE TABLE IF NOT EXISTS cosmetics ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL UNIQUE, type VARCHAR(20) NOT NULL CHECK (type IN ('outfit','hat','accessory')), unlock_level INTEGER NOT NULL, css_data JSONB NOT NULL DEFAULT '{}' ); CREATE TABLE IF NOT EXISTS player_cosmetics ( id SERIAL PRIMARY KEY, cosmetic_id INTEGER NOT NULL REFERENCES cosmetics(id) ON DELETE CASCADE UNIQUE, equipped BOOLEAN NOT NULL DEFAULT FALSE, unlocked_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() ); -- Seeds aligned with sprite-data.json themes (keys = sprite color slots) INSERT INTO cosmetics (name, type, unlock_level, css_data) VALUES ('Tripulante Iniciante', 'outfit', 1, '{"sprite_id":"lv01-tripulante","h":"#5a3a1d","w":"#5a3a1d","c":"#0ea5e9","C":"#075985","p":"#a16207","P":"#7c4a08","b":"#1e293b"}'), ('Boné Verolme', 'outfit', 3, '{"sprite_id":"lv03-bone-verolme","h":"#1e40af","w":"#fde68a","c":"#0ea5e9","C":"#075985","p":"#a16207","P":"#7c4a08","b":"#1e293b"}'), ('Camiseta Wingspan', 'outfit', 5, '{"sprite_id":"lv05-wingspan","h":"#ffd84d","w":"#fde68a","c":"#10b981","C":"#065f46","p":"#3a1f6e","P":"#2d1857","b":"#0f172a"}'), ('Chapéu de Sol', 'outfit', 7, '{"sprite_id":"lv07-chapeu-sol","h":"#ffd84d","w":"#fde68a","c":"#00f0ff","C":"#0369a1","p":"#3a1f6e","P":"#2d1857","b":"#0f172a"}'), ('Casaco Anti-Vento', 'outfit', 10, '{"sprite_id":"lv10-anti-vento","h":"#1e40af","w":"#fde68a","c":"#a855f7","C":"#581c87","p":"#1e293b","P":"#0f172a","b":"#0f172a"}'), ('Trajado de Capitão', 'outfit', 15, '{"sprite_id":"lv15-capitao","h":"#ffd84d","w":"#dc2626","c":"#dc2626","C":"#7a0e0e","p":"#1c1917","P":"#0c0a09","b":"#0c0a09"}') ON CONFLICT (name) DO NOTHING; INSERT INTO schema_migrations (version) VALUES (8) ON CONFLICT DO NOTHING;