MediaWiki:CharacterBuilder.js: Difference between revisions

From EQOA Sandstorm Wiki
Jump to navigationJump to search
No edit summary
No edit summary
Line 1: Line 1:
mw.hook('wikipage.content').add(function () {
mw.hook('wikipage.content').add(function () {


     var app = document.getElementById('character-builder-app');
     function waitForBuilderData(attemptsLeft) {
    if (!app) return;
        if (window.EQOA_BUILDER_DATA) {
            initCharacterBuilder();
            return;
        }


    if (!window.EQOA_BUILDER_DATA) {
        if (attemptsLeft <= 0) {
        app.innerHTML = '<div style="color:red;">EQOA_BUILDER_DATA failed to load.</div>';
            var app = document.getElementById('character-builder-app');
         return;
            if (app) {
                app.innerHTML = '<div style="color:red;">EQOA_BUILDER_DATA failed to load.</div>';
            }
            return;
        }
 
         setTimeout(function () {
            waitForBuilderData(attemptsLeft - 1);
        }, 100);
     }
     }


     var data = window.EQOA_BUILDER_DATA;
     waitForBuilderData(30);
 
    function initCharacterBuilder() {
        var app = document.getElementById('character-builder-app');
        if (!app) return;


    var gearSlots = [
        var data = window.EQOA_BUILDER_DATA;
    "Head",
    "Chest",
    "Hands",
    "Legs",
    "Feet",
    "Forearm",
    "Bracelet1",
    "Bracelet2",
    "Waist",
    "Neck",
    "Ear1",
    "Ear2",
    "Ring1",
    "Ring2",
    "Primary",
    "Secondary",
    "Shield",
    "Held1",
    "Held2",
    "Robe",
    "Range"
];


    app.innerHTML = `
        var gearSlots = [
        <div class="character-builder-box">
            "Head",
             <div class="character-builder-title">EQOA Character Builder</div>
            "Chest",
            "Hands",
            "Legs",
            "Feet",
            "Forearm",
            "Bracelet1",
            "Bracelet2",
            "Waist",
            "Neck",
            "Ear1",
            "Ear2",
            "Ring1",
            "Ring2",
            "Primary",
            "Secondary",
            "Shield",
            "Held1",
            "Held2",
            "Robe",
             "Range"
        ];


             <div class="character-builder-controls">
        app.innerHTML = `
                 <label>Race</label>
             <div class="character-builder-box">
                <select id="cb-race"></select>
                 <div class="character-builder-title">EQOA Character Builder</div>


                 <label>Class</label>
                 <div class="character-builder-controls">
                <select id="cb-class"></select>
                    <label>Race</label>
            </div>
                    <select id="cb-race"></select>


            <div class="character-builder-section-title">Base Stats</div>
                    <label>Class</label>
                    <select id="cb-class"></select>
                </div>


            <table class="character-builder-stat-table">
                <div class="character-builder-section-title">Base Stats</div>
                <tr>
                    <th>STR</th>
                    <th>STA</th>
                    <th>AGI</th>
                    <th>DEX</th>
                    <th>WIS</th>
                    <th>INT</th>
                    <th>CHA</th>
                </tr>
                <tr>
                    <td id="cb-str">0</td>
                    <td id="cb-sta">0</td>
                    <td id="cb-agi">0</td>
                    <td id="cb-dex">0</td>
                    <td id="cb-wis">0</td>
                    <td id="cb-int">0</td>
                    <td id="cb-cha">0</td>
                </tr>
            </table>


            <div class="character-builder-section-title" style="margin-top:18px;">Equipment</div>
                <table class="character-builder-stat-table">
                    <tr>
                        <th>STR</th>
                        <th>STA</th>
                        <th>AGI</th>
                        <th>DEX</th>
                        <th>WIS</th>
                        <th>INT</th>
                        <th>CHA</th>
                    </tr>
                    <tr>
                        <td id="cb-str">0</td>
                        <td id="cb-sta">0</td>
                        <td id="cb-agi">0</td>
                        <td id="cb-dex">0</td>
                        <td id="cb-wis">0</td>
                        <td id="cb-int">0</td>
                        <td id="cb-cha">0</td>
                    </tr>
                </table>


            <div id="cb-gear-grid" class="character-builder-gear-grid"></div>
                <div class="character-builder-section-title" style="margin-top:18px;">Equipment</div>
        </div>
    `;


    var raceSelect = document.getElementById('cb-race');
                <div id="cb-gear-grid" class="character-builder-gear-grid"></div>
    var classSelect = document.getElementById('cb-class');
            </div>
    var gearGrid = document.getElementById('cb-gear-grid');
        `;


    function addOption(select, value, label) {
         var raceSelect = document.getElementById('cb-race');
         var option = document.createElement('option');
         var classSelect = document.getElementById('cb-class');
         option.value = value;
         var gearGrid = document.getElementById('cb-gear-grid');
         option.textContent = label;
        select.appendChild(option);
    }


    Object.keys(data.baseStats).forEach(function(race) {
        function addOption(select, value, label) {
        addOption(raceSelect, race, race);
            var option = document.createElement('option');
    });
            option.value = value;
            option.textContent = label;
            select.appendChild(option);
        }


    function loadClasses() {
        Object.keys(data.baseStats).forEach(function (race) {
         classSelect.innerHTML = '';
            addOption(raceSelect, race, race);
         });


         var race = raceSelect.value;
         function loadClasses() {
            classSelect.innerHTML = '';


        Object.keys(data.baseStats[race]).forEach(function(classCode) {
            var race = raceSelect.value;
            var className = data.classes[classCode] || classCode;
 
            addOption(classSelect, classCode, classCode + ' - ' + className);
            Object.keys(data.baseStats[race]).forEach(function (classCode) {
        });
                var className = data.classes[classCode] || classCode;
                addOption(classSelect, classCode, classCode + ' - ' + className);
            });


        updateStats();
            updateStats();
    }
        }


    function updateStats() {
        function updateStats() {
        var race = raceSelect.value;
            var race = raceSelect.value;
        var classCode = classSelect.value;
            var classCode = classSelect.value;


        var stats = data.baseStats[race][classCode];
            var stats = data.baseStats[race][classCode];


        document.getElementById('cb-str').textContent = stats.str || 0;
            document.getElementById('cb-str').textContent = stats.str || 0;
        document.getElementById('cb-sta').textContent = stats.sta || 0;
            document.getElementById('cb-sta').textContent = stats.sta || 0;
        document.getElementById('cb-agi').textContent = stats.agi || 0;
            document.getElementById('cb-agi').textContent = stats.agi || 0;
        document.getElementById('cb-dex').textContent = stats.dex || 0;
            document.getElementById('cb-dex').textContent = stats.dex || 0;
        document.getElementById('cb-wis').textContent = stats.wis || 0;
            document.getElementById('cb-wis').textContent = stats.wis || 0;
        document.getElementById('cb-int').textContent = stats.int || 0;
            document.getElementById('cb-int').textContent = stats.int || 0;
        document.getElementById('cb-cha').textContent = stats.cha || 0;
            document.getElementById('cb-cha').textContent = stats.cha || 0;
    }
        }


    function buildGearSlots() {
        function buildGearSlots() {
        gearGrid.innerHTML = '';
            gearGrid.innerHTML = '';


        gearSlots.forEach(function(slot) {
            gearSlots.forEach(function (slot) {
            var slotBox = document.createElement('div');
                var slotBox = document.createElement('div');
            slotBox.className = 'character-builder-slot';
                slotBox.className = 'character-builder-slot';


            slotBox.innerHTML =
                slotBox.innerHTML =
                '<label>' + slot + '</label>' +
                    '<label>' + slot + '</label>' +
                '<select id="cb-slot-' + slot.toLowerCase() + '">' +
                    '<select id="cb-slot-' + slot.toLowerCase() + '">' +
                    '<option value="">-- None --</option>' +
                        '<option value="">-- None --</option>' +
                '</select>';
                    '</select>';


            gearGrid.appendChild(slotBox);
                gearGrid.appendChild(slotBox);
        });
            });
    }
        }


    raceSelect.addEventListener('change', loadClasses);
        raceSelect.addEventListener('change', loadClasses);
    classSelect.addEventListener('change', updateStats);
        classSelect.addEventListener('change', updateStats);


    loadClasses();
        loadClasses();
    buildGearSlots();
        buildGearSlots();
    }


});
});

Revision as of 02:41, 14 May 2026

mw.hook('wikipage.content').add(function () {

    function waitForBuilderData(attemptsLeft) {
        if (window.EQOA_BUILDER_DATA) {
            initCharacterBuilder();
            return;
        }

        if (attemptsLeft <= 0) {
            var app = document.getElementById('character-builder-app');
            if (app) {
                app.innerHTML = '<div style="color:red;">EQOA_BUILDER_DATA failed to load.</div>';
            }
            return;
        }

        setTimeout(function () {
            waitForBuilderData(attemptsLeft - 1);
        }, 100);
    }

    waitForBuilderData(30);

    function initCharacterBuilder() {
        var app = document.getElementById('character-builder-app');
        if (!app) return;

        var data = window.EQOA_BUILDER_DATA;

        var gearSlots = [
            "Head",
            "Chest",
            "Hands",
            "Legs",
            "Feet",
            "Forearm",
            "Bracelet1",
            "Bracelet2",
            "Waist",
            "Neck",
            "Ear1",
            "Ear2",
            "Ring1",
            "Ring2",
            "Primary",
            "Secondary",
            "Shield",
            "Held1",
            "Held2",
            "Robe",
            "Range"
        ];

        app.innerHTML = `
            <div class="character-builder-box">
                <div class="character-builder-title">EQOA Character Builder</div>

                <div class="character-builder-controls">
                    <label>Race</label>
                    <select id="cb-race"></select>

                    <label>Class</label>
                    <select id="cb-class"></select>
                </div>

                <div class="character-builder-section-title">Base Stats</div>

                <table class="character-builder-stat-table">
                    <tr>
                        <th>STR</th>
                        <th>STA</th>
                        <th>AGI</th>
                        <th>DEX</th>
                        <th>WIS</th>
                        <th>INT</th>
                        <th>CHA</th>
                    </tr>
                    <tr>
                        <td id="cb-str">0</td>
                        <td id="cb-sta">0</td>
                        <td id="cb-agi">0</td>
                        <td id="cb-dex">0</td>
                        <td id="cb-wis">0</td>
                        <td id="cb-int">0</td>
                        <td id="cb-cha">0</td>
                    </tr>
                </table>

                <div class="character-builder-section-title" style="margin-top:18px;">Equipment</div>

                <div id="cb-gear-grid" class="character-builder-gear-grid"></div>
            </div>
        `;

        var raceSelect = document.getElementById('cb-race');
        var classSelect = document.getElementById('cb-class');
        var gearGrid = document.getElementById('cb-gear-grid');

        function addOption(select, value, label) {
            var option = document.createElement('option');
            option.value = value;
            option.textContent = label;
            select.appendChild(option);
        }

        Object.keys(data.baseStats).forEach(function (race) {
            addOption(raceSelect, race, race);
        });

        function loadClasses() {
            classSelect.innerHTML = '';

            var race = raceSelect.value;

            Object.keys(data.baseStats[race]).forEach(function (classCode) {
                var className = data.classes[classCode] || classCode;
                addOption(classSelect, classCode, classCode + ' - ' + className);
            });

            updateStats();
        }

        function updateStats() {
            var race = raceSelect.value;
            var classCode = classSelect.value;

            var stats = data.baseStats[race][classCode];

            document.getElementById('cb-str').textContent = stats.str || 0;
            document.getElementById('cb-sta').textContent = stats.sta || 0;
            document.getElementById('cb-agi').textContent = stats.agi || 0;
            document.getElementById('cb-dex').textContent = stats.dex || 0;
            document.getElementById('cb-wis').textContent = stats.wis || 0;
            document.getElementById('cb-int').textContent = stats.int || 0;
            document.getElementById('cb-cha').textContent = stats.cha || 0;
        }

        function buildGearSlots() {
            gearGrid.innerHTML = '';

            gearSlots.forEach(function (slot) {
                var slotBox = document.createElement('div');
                slotBox.className = 'character-builder-slot';

                slotBox.innerHTML =
                    '<label>' + slot + '</label>' +
                    '<select id="cb-slot-' + slot.toLowerCase() + '">' +
                        '<option value="">-- None --</option>' +
                    '</select>';

                gearGrid.appendChild(slotBox);
            });
        }

        raceSelect.addEventListener('change', loadClasses);
        classSelect.addEventListener('change', updateStats);

        loadClasses();
        buildGearSlots();
    }

});