Flat MMO Recipe Item Names

Add item names underneath pictures in recipe materials

// ==UserScript==
// @name         Flat MMO Recipe Item Names
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Add item names underneath pictures in recipe materials
// @author       Carlos
// @match        https://flatmmo.com/db/makeitems.php
// @grant        none
// @license      none
// ==/UserScript==

(function() {
    'use strict';

    // Item name mapping based on image filenames
    const itemNames = {
        // Materials & Resources
        'logs.png': 'Logs',
        'willow_logs.png': 'Willow Logs',
        'oak_logs.png': 'Oak Logs',
        'maple_logs.png': 'Maple Logs',
        'mangrove_logs.png': 'Mangrove Logs',
        'haunted_logs.png': 'Haunted Logs',

        // Mushrooms
        'red_mushroom.png': 'Red Mushroom',
        'green_mushroom.png': 'Green Mushroom',
        'blue_mushroom.png': 'Blue Mushroom',
        'rockshroom.png': 'Rockshroom',
        'moldshroom.png': 'Moldshroom',
        'seashroom.png': 'Seashroom',
        'fireshroom.png': 'Fireshroom',

        // Leaves
        'dotted_green_leaf.png': 'Dotted Green Leaf',
        'green_leaf.png': 'Green Leaf',

        // Containers & Tools
        'vial.png': 'Vial',
        'bucket.png': 'Bucket',
        'water_bucket.png': 'Water Bucket',
        'milk_bucket.png': 'Milk Bucket',

        // Food Items
        'wheat.png': 'Wheat',
        'sugarcane.png': 'Sugarcane',
        'chicken_egg.png': 'Chicken Egg',
        'banana.png': 'Banana',

        // Crafting Materials
        'string.png': 'String',
        'purple_string.png': 'Purple String',
        'feathers.png': 'Feathers',
        'glass.png': 'Glass',
        'sand.png': 'Sand',
        'bones.png': 'Bones',
        'giant_bones.png': 'Giant Bones',
        'bonemeal.png': 'Bonemeal',
        'barbed_wire.png': 'Barbed Wire',

        // Animal Hides & Furs
        'snakeskin.png': 'Snakeskin',
        'bear_fur.png': 'Bear Fur',
        'tiger_fur.png': 'Tiger Fur',
        'crocodile_hides.png': 'Crocodile Hides',

        // Ores & Metals
        'copper.png': 'Copper',
        'iron.png': 'Iron',
        'silver.png': 'Silver',
        'gold.png': 'Gold',
        'promethium.png': 'Promethium',
        'coal.png': 'Coal',
        'charcoal.png': 'Charcoal',

        // Bars
        'bronze_bar.png': 'Bronze Bar',
        'iron_bar.png': 'Iron Bar',
        'silver_bar.png': 'Silver Bar',
        'gold_bar.png': 'Gold Bar',
        'promethium_bar.png': 'Promethium Bar',

        // Gems
        'sapphire.png': 'Sapphire',
        'emerald.png': 'Emerald',
        'ruby.png': 'Ruby',
        'diamond.png': 'Diamond',
        'cut_sapphire.png': 'Cut Sapphire',
        'cut_emerald.png': 'Cut Emerald',
        'cut_ruby.png': 'Cut Ruby',
        'cut_diamond.png': 'Cut Diamond',
        'enchanted_sapphire.png': 'Enchanted Sapphire',
        'enchanted_emerald.png': 'Enchanted Emerald',
        'enchanted_ruby.png': 'Enchanted Ruby',
        'enchanted_diamond.png': 'Enchanted Diamond',

        // Enchanting Materials
        'stardust.png': 'Stardust',
        'blue_mage_silk.png': 'Blue Mage Silk',
        'red_mage_silk.png': 'Red Mage Silk',
        'unpowered_orb.png': 'Unpowered Orb',

        // Arrow Components
        'arrow_shafts.png': 'Arrow Shafts',
        'bronze_arrow_heads.png': 'Bronze Arrow Heads',
        'iron_arrow_heads.png': 'Iron Arrow Heads',
        'silver_arrow_heads.png': 'Silver Arrow Heads',
        'gold_arrow_heads.png': 'Gold Arrow Heads',
        'promethium_arrow_heads.png': 'Promethium Arrow Heads',

        // Crafted Items (for upgrade recipes)
        'fishing_net.png': 'Fishing Net',
        'uncooked_cake.png': 'Uncooked Cake',
        'bread_dough.png': 'Bread Dough',
        'blue_mage_boots.png': 'Blue Mage Boots',
        'blue_mage_gloves.png': 'Blue Mage Gloves',
        'blue_mage_hat.png': 'Blue Mage Hat',
        'blue_mage_top.png': 'Blue Mage Top',
        'blue_mage_skirt.png': 'Blue Mage Skirt',
        'maple_plank.png': 'Maple Plank',
        'nails.png': 'Nails'
    };

    function getItemNameFromSrc(src) {
        // Extract filename from the src path
        const filename = src.split('/').pop();
        return itemNames[filename] || filename.replace('.png', '').replace(/_/g, ' ');
    }

    function addItemNames() {
        // Find all material cells (5th column in the table)
        const materialCells = document.querySelectorAll('.dynamic-table td:nth-child(5)');

        materialCells.forEach(cell => {
            // Find all images in this cell
            const images = cell.querySelectorAll('img.w30');

            images.forEach(img => {
                // Check if we already added a name for this image
                if (img.nextElementSibling && img.nextElementSibling.classList.contains('item-name')) {
                    return;
                }

                const itemName = getItemNameFromSrc(img.src);

                // Create a span element for the item name
                const nameSpan = document.createElement('span');
                nameSpan.textContent = itemName;
                nameSpan.className = 'item-name';
                nameSpan.style.cssText = `
                    display: block;
                    font-size: 10px;
                    color: #333;
                    text-align: center;
                    margin-top: 2px;
                    font-weight: bold;
                    text-shadow: 1px 1px 1px rgba(255,255,255,0.8);
                `;

                // Insert the name after the image
                img.parentNode.insertBefore(nameSpan, img.nextSibling);
            });
        });
    }

    // Run when page loads
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', addItemNames);
    } else {
        addItemNames();
    }

    // Also run when filter changes (since the script uses display:none/block)
    const filterInputs = document.querySelectorAll('input[name="filter"]');
    filterInputs.forEach(input => {
        input.addEventListener('change', () => {
            // Small delay to let the filter apply first
            setTimeout(addItemNames, 100);
        });
    });

})();