init repo

This commit is contained in:
2026-01-20 13:15:20 +01:00
parent aed10c3c3e
commit ebec07f6dd
26 changed files with 790 additions and 0 deletions

View File

@@ -0,0 +1,91 @@
const { createCanvas, loadImage } = require('canvas');
const fs = require('fs');
const width = 1000;
const height = 1000;
const canvas = createCanvas(width, height);
const ctx = canvas.getContext('2d');
// Configuration des calques et de la rareté (poids)
const layers = [
{
name: "Background",
elements: [
{ name: "Island", file: "Island.png", weight: 20 },
{ name: "Jungle", file: "Jungle.png", weight: 35 },
{ name: "Mountain", file: "Mountain.png", weight: 15 },
{ name: "Plain", file: "Plain.png", weight: 25 },
{ name: "Jurrasic", file: "Jurrasic.png", weight: 5 }
]
},
{
name: "beasts",
elements: [
{ name: "Flicko", file: "Flicko.png", weight: 20 },
{ name: "Darm", file: "Darm.png", weight: 15 },
{ name: "Shiny Darm", file: "Shiny Darm.png", weight: 5 },
{ name: "Marven", file: "Marven.png", weight: 20 },
{ name: "Jii", file: "Jii.png", weight: 20 },
{ name: "Tiro", file: "Tiro.png", weight: 15 },
{ name: "Shiny Tiro", file: "Shiny Tiro.png", weight: 5 },
]
},
{
name: "hat",
elements: [
{ name: "No hat", file: "No hat.png", weight: 35 },
{ name: "Cap", file: "Cap.png", weight: 25 },
{ name: "Fish", file: "Fish.png", weight: 10 },
{ name: "Magic", file: "Magic.png", weight: 30 },
{ name: "Pirate", file: "Pirate.png", weight: 20 }
]
}
];
// Fonction pour choisir un élément selon son poids (Rareté)
function pickElement(layer) {
let totalWeight = layer.elements.reduce((acc, el) => acc + el.weight, 0);
let random = Math.random() * totalWeight;
for (let el of layer.elements) {
if (random < el.weight) return el;
random -= el.weight;
}
}
async function createNFT(editionId) {
let attributes = [];
ctx.clearRect(0, 0, width, height);
// 1. Sélectionner et dessiner chaque calque
for (const layer of layers) {
const element = pickElement(layer);
const image = await loadImage(`./layers/${layer.name}/${element.file}`);
ctx.drawImage(image, 0, 0, width, height);
attributes.push({ trait_type: layer.name, value: element.name });
}
// 2. Sauvegarder l'image finale
const buffer = canvas.toBuffer('image/png');
fs.writeFileSync(`./output/${editionId}.png`, buffer);
// 3. Créer le fichier JSON Metadata (Standard Solana/Metaplex)
const metadata = {
name: `Beast #${editionId}`,
symbol: "BSTS",
image: `${editionId}.png`, // Sera remplacé par l'URL IPFS plus tard
attributes: attributes,
properties: {
files: [{ uri: `${editionId}.png`, type: "image/png" }]
}
};
fs.writeFileSync(`./output/${editionId}.json`, JSON.stringify(metadata, null, 2));
}
// Générer 10 NFTs
(async () => {
for (let i = 1; i <= 20; i++) {
await createNFT(i);
console.log(`NFT ${i} généré !`);
}
})();