remove solana folder
This commit is contained in:
91
NFT/beasts/generate.js
Normal file
91
NFT/beasts/generate.js
Normal 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é !`);
|
||||
}
|
||||
})();
|
||||
Reference in New Issue
Block a user