<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>KCS TOOLS GTA San Andreas</title>
    <style>
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            margin: 0;
            padding: 0;
            background-color: #000;
            color: #00ff00;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: space-between;
            min-height: 100vh;
            text-align: center;
            overflow: hidden;
            opacity: 0;
            animation: fadeIn 2s ease-in-out forwards;
        }
        h1 {
            font-size: 3rem;
            margin-top: 20px;
            color: #fff;
            text-shadow: 0 0 10px rgba(255, 255, 255, 0.7);
            opacity: 0;
            animation: fadeIn 2s ease-in-out forwards 1s;
        }
        .container {
            display: flex;
            flex-direction: column;
            gap: 30px;
            align-items: center;
            flex-grow: 1;
            justify-content: center;
            opacity: 0;
            animation: fadeIn 2s ease-in-out forwards 1.5s;
        }
        .tool-card {
            background-color: #1a1a1a;
            border: 2px solid #444;
            border-radius: 16px;
            padding: 2em;
            cursor: pointer;
            transition: transform 0.3s, box-shadow 0.3s;
            width: 360px;
            max-width: 90%;
            text-align: left;
            opacity: 0;
            animation: fadeIn 2s ease-in-out forwards 2s;
        }
        .tool-card:hover {
            transform: translateY(-5px);
            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.8);
        }
        .tool-card h3 {
            color: #00ff00;
            font-weight: bold;
            margin-bottom: 1em;
            font-size: 1.8rem;
        }
        .tool-card p {
            color: #fff;
            font-size: 1.1rem;
            font-weight: bold;
        }
        footer {
            display: flex;
            justify-content: center;
            align-items: center;
            padding: 10px;
            background-color: #121212;
            color: #ffffff;
            border-top: 1px solid #555;
            margin-top: 20px;
            box-shadow: 0 -2px 6px rgba(0, 0, 0, 0.5);
            flex-wrap: wrap;
            gap: 10px;
            font-weight: bold;
        }
        .footer a {
            color: #ffffff;
            text-decoration: none;
            display: flex;
            align-items: center;
            font-size: 1.2rem;
            font-weight: bold;
        }
        .footer a img {
            margin-right: 8px;
        }
        @keyframes fadeIn {
            from { opacity: 0; }
            to { opacity: 1; }
        }
        @media (max-width: 768px) {
            h1 {
                font-size: 2.5rem;
            }
            .tool-card {
                width: 320px;
                padding: 1.5em;
            }
            .tool-card h3 {
                font-size: 1.6rem;
            }
            .tool-card p {
                font-size: 1rem;
            }
            footer {
                padding: 15px 10px;
            }
            .footer a {
                font-size: 1.3rem;
            }
            .footer a img {
                width: 40px;
                height: 40px;
            }
        }
        @media (max-width: 480px) {
            h1 {
                font-size: 2rem;
            }
            .tool-card {
                width: 280px;
                padding: 1.2em;
            }
            .tool-card h3 {
                font-size: 1.4rem;
            }
            .tool-card p {
                font-size: 0.9rem;
            }
            footer {
                padding: 10px 5px;
            }
            .footer a {
                font-size: 1.2rem;
            }
            .footer a img {
                width: 32px;
                height: 32px;
            }
        }
    </style>
</head>
<body>
    <h1>KCS TOOLS GTA San Andreas</h1>
    <div class="container">
        <div class="tool-card" onclick="window.location.href='weapon-dat-editor.html'">
            <h3>Weapon Dat Editor</h3>
            <p>Edit weapon data to enhance your game experience.</p>
        </div>
        <div class="tool-card" onclick="window.location.href='handling-cfg-editor.html'">
            <h3>Handling Cfg Editor</h3>
            <p>Modify vehicle handling with ease and precision.</p>
        </div>
        <div class="tool-card">
            <h3>Coming Soon</h3>
            <p>New tools and features are on the way. Stay tuned!</p>
        </div>
    </div>
    <footer class="footer">
        <a href="https://discord.gg/YhY7jtFn62" target="_blank">
            <img src="https://cdn-icons-png.flaticon.com/512/2111/2111370.png" alt="Discord Logo" width="24" height="24">
            Join Our Discord Community
        </a>
    </footer>
    <script>
        const fileInput = document.getElementById('fileInput');
        const weaponSelect = document.getElementById('weaponSelect');
        const saveButton = document.getElementById('saveButton');
        const editor = document.getElementById('editor');

        let weaponData = [];
        let fileLines = [];
        let fileName = 'Weapon.dat';
        let currentWeaponIndex = null;
        let editedWeapons = new Set();

        fileInput.addEventListener('change', handleFileUpload);
        weaponSelect.addEventListener('change', handleWeaponSelect);
        saveButton.addEventListener('click', saveChanges);

        const meleeIdentifier = '�';
        const gunIdentifier = '$';

        function handleFileUpload(event) {
            const file = event.target.files[0];
            if (file && (file.name.toLowerCase() === 'weapon.dat')) {
                fileName = file.name;
                const reader = new FileReader();
                reader.onload = e => {
                    parseWeaponData(e.target.result);
                    weaponSelect.style.display = 'block';
                    saveButton.style.display = 'block';
                    saveButton.disabled = false;
                };
                reader.readAsText(file);
            } else {
                alert('Please upload a valid weapon.dat file.');
            }
        }

        function parseWeaponData(content) {
            fileLines = content.split('\n');
            weaponData = fileLines.map((line, lineIndex) => {
                const values = line.split(/\s+/);
                if (values.length > 1) {
                    const type = values[0];
                    let weapon = { lineIndex, identifier: values[0], rawData: line };
                    if (type === meleeIdentifier) {
                        weapon.type = 'Close Combat';
                        weapon.weaponType = values[1];
                        weapon.fireType = values[2];
                        weapon.targetRange = values[3];
                        weapon.weaponRange = values[4];
                        weapon.modelId1 = values[5];
                        weapon.modelId2 = values[6];
                        weapon.weaponSlot = values[7];
                        weapon.baseCombo = values[8] || "";
                        weapon.numCombos = values[9] || "0";
                        weapon.flags = values[10] || "";
                        weapon.stealthAnimGroup = values[11] || "";
                    } else if (type === gunIdentifier) {
                        weapon.type = 'Ranged';
                        weapon.weaponType = values[1];
                        weapon.fireType = values[2];
                        weapon.targetRange = values[3];
                        weapon.weaponRange = values[4];
                        weapon.modelId1 = values[5];
                        weapon.modelId2 = values[6];
                        weapon.weaponSlot = values[7];
                        weapon.animGroup = values[8] || "";
                        weapon.clipAmmo = values[9] || "";
                        weapon.damage = values[10] || "";
                        weapon.fireOffsetX = values[11] || "";
                        weapon.fireOffsetY = values[12] || "";
                        weapon.fireOffsetZ = values[13] || "";
                        weapon.skillLevel = values[14] || "";
                        weapon.reqStatLevel = values[15] || "";
                        weapon.accuracy = values[16] || "";
                        weapon.moveSpeed = values[17] || "";
                        weapon.animLoop1Start = values[18] || "";
                        weapon.animLoop1End = values[19] || "";
                        weapon.animLoop1Fire = values[20] || "";
                        weapon.animLoop2Start = values[21] || "";
                        weapon.animLoop2End = values[22] || "";
                        weapon.animLoop2Fire = values[23] || "";
                        weapon.breakoutTime = values[24] || "";
                        weapon.flags = values[25] || "";
                    }
                    return weapon;
                }
                return null;
            }).filter(Boolean);
            populateWeaponSelect();
        }

        function populateWeaponSelect() {
            weaponSelect.innerHTML = '<option value="" disabled selected>Select a Weapon</option>';
            weaponData.forEach((weapon, index) => {
                if (weapon.type && weapon.weaponType) {
                    const option = document.createElement('option');
                    option.value = index;
                    option.innerHTML = `${weapon.type} - ${weapon.weaponType}`;
                    weaponSelect.appendChild(option);
                }
            });
        }

        function handleWeaponSelect(event) {
            if (currentWeaponIndex !== null) {
                saveTemporaryChanges(currentWeaponIndex);
            }
            currentWeaponIndex = event.target.value;
            if (currentWeaponIndex !== "") {
                editor.style.display = 'block';
                renderEditor(weaponData[currentWeaponIndex], currentWeaponIndex);
                editedWeapons.add(parseInt(currentWeaponIndex));
            }
        }

        function renderEditor(weapon, index) {
            editor.innerHTML = '';
            const table = document.createElement('table');
            const tbody = document.createElement('tbody');

            Object.keys(weapon).forEach(key => {
                if (key !== 'lineIndex' && key !== 'type' && key !== 'identifier' && key !== 'rawData') {
                    const row = document.createElement('tr');
                    const cellKey = document.createElement('td');
                    cellKey.innerHTML = `${key.charAt(0).toUpperCase() + key.slice(1).replace(/([A-Z])/g, ' $1')}`;
                    row.appendChild(cellKey);

                    const cellValue = document.createElement('td');
                    if (key === 'fireType') {
                        const select = document.createElement('select');
                        select.dataset.rowIndex = index;
                        select.dataset.key = key;
                        ['MELEE', 'PROJECTILE', 'INSTANT_HIT', 'USE', 'AFFECT_AREA', 'CAMERA'].forEach(type => {
                            const option = document.createElement('option');
                            option.value = type;
                            option.innerHTML = type;
                            if (weapon[key] === type) {
                                option.selected = true;
                            }
                            select.appendChild(option);
                        });
                        select.addEventListener('change', handleInputChange);
                        cellValue.appendChild(select);
                    } else if (key === 'animGroup') {
                        const select = document.createElement('select');
                        select.dataset.rowIndex = index;
                        select.dataset.key = key;
                        ['grenade', 'null', 'colt45', 'colt45pro', 'colt_cop', 'silenced', 'pythonbad', 
                        'python', 'shotgunbad', 'shotgun', 'sawnoff', 'sawnoffpro', 'buddy', 'uzibad', 
                        'uzi', 'riflebad', 'rifle', 'sniper', 'rocket', 'flame', 'spraycan', 'goggles'].forEach(group => {
                            const option = document.createElement('option');
                            option.value = group;
                            option.innerHTML = group;
                            if (weapon[key] === group) {
                                option.selected = true;
                            }
                            select.appendChild(option);
                        });
                        select.addEventListener('change', handleInputChange);
                        cellValue.appendChild(select);
                    } else if (key === 'baseCombo') {
                        const select = document.createElement('select');
                        select.dataset.rowIndex = index;
                        select.dataset.key = key;
                        ['UNARMED', 'BBALLBAT', 'KNIFE', 'SWORD', 'SKATEBOARD', 'CHAINSAW', 'DILDO', 'FLOWERS'].forEach(combo => {
                            const option = document.createElement('option');
                            option.value = combo;
                            option.innerHTML = combo;
                            if (weapon[key] === combo) {
                                option.selected = true;
                            }
                            select.appendChild(option);
                        });
                        select.addEventListener('change', handleInputChange);
                        cellValue.appendChild(select);
                    } else {
                        const input = document.createElement('input');
                        input.type = 'text';
                        input.value = weapon[key];
                        input.dataset.rowIndex = index;
                        input.dataset.key = key;
                        input.addEventListener('input', handleInputChange);
                        cellValue.appendChild(input);
                    }
                    row.appendChild(cellValue);
                    tbody.appendChild(row);
                }
            });

            table.appendChild(tbody);
            editor.appendChild(table);
        }

        function handleInputChange(event) {
            const input = event.target;
            const rowIndex = input.dataset.rowIndex;
            const key = input.dataset.key;
            weaponData[rowIndex][key] = input.value;
            editedWeapons.add(parseInt(rowIndex));
        }

        function saveTemporaryChanges(index) {
            const rows = editor.querySelectorAll('tr');
            rows.forEach(row => {
                const cells = row.querySelectorAll('td');
                const key = cells[0].textContent.toLowerCase().replace(/ /g, '');
                const input = cells[1].querySelector('input, select');
                if (input) {
                    weaponData[index][key] = input.value;
                }
            });
        }

        function saveChanges() {
            if (currentWeaponIndex !== null) {
                saveTemporaryChanges(currentWeaponIndex);
            }

            const updatedLines = fileLines.map((line, index) => {
                if (editedWeapons.has(index)) {
                    const weapon = weaponData.find(w => w.lineIndex === index);
                    if (weapon && weapon.lineIndex === index) {
                        const updatedLine = weapon.rawData.split(/\s+/).map((value, i) => {
                            switch (i) {
                                case 1: return weapon.weaponType;
                                case 2: return weapon.fireType;
                                case 3: return weapon.targetRange;
                                case 4: return weapon.weaponRange;
                                case 5: return weapon.modelId1;
                                case 6: return weapon.modelId2;
                                case 7: return weapon.weaponSlot;
                                case 8: return weapon.animGroup || weapon.baseCombo;
                                case 9: return weapon.clipAmmo || weapon.numCombos;
                                case 10: return weapon.damage || weapon.flags;
                                case 11: return weapon.fireOffsetX || weapon.stealthAnimGroup;
                                case 12: return weapon.fireOffsetY;
                                case 13: return weapon.fireOffsetZ;
                                case 14: return weapon.skillLevel;
                                case 15: return weapon.reqStatLevel;
                                case 16: return weapon.accuracy;
                                case 17: return weapon.moveSpeed;
                                case 18: return weapon.animLoop1Start;
                                case 19: return weapon.animLoop1End;
                                case 20: return weapon.animLoop1Fire;
                                case 21: return weapon.animLoop2Start;
                                case 22: return weapon.animLoop2End;
                                case 23: return weapon.animLoop2Fire;
                                case 24: return weapon.breakoutTime;
                                case 25: return weapon.flags;
                                default: return value;
                            }
                        }).join(' ');
                        return updatedLine;
                    }
                }
                return line;
            });

            const blob = new Blob([updatedLines.join('\n')], { type: 'text/plain' });
            const url = URL.createObjectURL(blob);
            const a = document.createElement('a');
            a.href = url;
            a.download = fileName;
            a.click();
            URL.revokeObjectURL(url);
        }
    </script>
</body>
</html>
