Нет описания правки
Нет описания правки
 
(не показаны 2 промежуточные версии этого же участника)
Строка 1: Строка 1:
<includeonly>
<includeonly>
<!-- Уникальный ID для каждого вызова виджета, чтобы не было конфликтов -->
<!-- Уникальный контейнер -->
<div id="gang-calc-<!--{$id|default:'1'}-->" style="background:#f8f9fa; border:1px solid #ccc; padding:15px; border-radius:5px; max-width:400px; font-family:sans-serif;">
<div id="gang-calc-<!--{$id|default:'1'}-->" class="gang-calc-widget" style="background:#f8f9fa; border:1px solid #ccc; padding:15px; border-radius:5px; max-width:400px; font-family:sans-serif; margin-bottom: 20px;">
     <h3 style="margin-top:0;">Очки банды</h3>
     <h3 style="margin-top:0;">Очки банды</h3>
      
      
Строка 14: Строка 14:
     </div>
     </div>


     <button class="gc-btn" style="background:#36c; color:white; border:none; padding:8px 15px; cursor:pointer; font-weight:bold; border-radius:3px;">Рассчитать</button>
     <button type="button" class="gc-btn" style="background:#36c; color:white; border:none; padding:8px 15px; cursor:pointer; font-weight:bold; border-radius:3px;">Рассчитать</button>


     <div class="gc-error" style="color:red; margin-top:10px; display:none; font-size:0.9em;"></div>
     <div class="gc-error" style="color:red; margin-top:10px; display:none; font-size:0.9em;"></div>


     <div class="gc-result" style="margin-top:15px; border-top:1px solid #ddd; padding-top:10px; display:none;">
     <div class="gc-result" style="margin-top:15px; border-top:1px solid #ddd; padding-top:10px; display:none;">
         <div style="margin-bottom:5px;">Покупатель: <b class="res-buyer" style="color:green; font-size:1.2em;">0</b></div>
         <div style="margin-bottom:5px;">Покупатель: <b class="res-buyer" style="color:green; font-size:1.2em;">0</b> очков банды</div>
         <div style="margin-bottom:5px;">Остальные (каждый): <b class="res-others" style="color:green; font-size:1.2em;">0</b></div>
         <div style="margin-bottom:5px;">Остальные (каждый): <b class="res-others" style="color:green; font-size:1.2em;">0</b> очков банды</div>
         <div style="font-size:0.8em; color:#666;">Процент возврата: <span class="res-percent"></span></div>
         <div style="font-size:0.8em; color:#666;">Процент возврата: <span class="res-percent"></span></div>
     </div>
     </div>
Строка 26: Строка 26:


<script>
<script>
mw.loader.using('jquery', function() {
(function() {
     // Находим конкретный блок по ID
     // Функция инициализации, которая сработает, когда страница будет готова
     var containerId = 'gang-calc-<!--{$id|default:'1'}-->';
     var initWidget = function() {
    var $container = $('#' + containerId);
        var containerId = "gang-calc-<!--{$id|default:'1'}-->";
   
        var container = document.getElementById(containerId);
    $container.find('.gc-btn').click(function() {
 
         var $btn = $(this);
        // Если контейнера нет (например, скрипт сработал раньше времени или ID неверен), выходим
         var coins = parseInt($container.find('.gc-coins').val());
        if (!container) return;
         var players = parseInt($container.find('.gc-players').val());
 
         var $error = $container.find('.gc-error');
        // Находим элементы внутри контейнера без jQuery
         var $result = $container.find('.gc-result');
        var btn = container.querySelector('.gc-btn');
          
        var inputCoins = container.querySelector('.gc-coins');
         $error.hide();
         var inputPlayers = container.querySelector('.gc-players');
         $result.hide();
         var divError = container.querySelector('.gc-error');
         var divResult = container.querySelector('.gc-result');
        var spanBuyer = container.querySelector('.res-buyer');
         var spanOthers = container.querySelector('.res-others');
         var spanPercent = container.querySelector('.res-percent');
 
         // Защита от дублирования событий (если скрипт запустится дважды)
         if (btn.getAttribute('data-bound') === 'true') return;
        btn.setAttribute('data-bound', 'true');
 
         btn.addEventListener('click', function() {
            var coins = parseInt(inputCoins.value);
            var players = parseInt(inputPlayers.value);
           
            // Сброс отображения
            divError.style.display = 'none';
            divResult.style.display = 'none';
 
            // Валидация
            if (isNaN(coins) || coins < 0) {
                divError.innerText = 'Введите корректную сумму монет.';
                divError.style.display = 'block';
                return;
            }
            if (isNaN(players) || players < 2 || players > 10) {
                divError.innerText = 'Игроков должно быть от 2 до 10.';
                divError.style.display = 'block';
                return;
            }


        // Проверка ошибок
            // Логика
        if (isNaN(coins) || coins < 0) {
            var percent = 0;
             $error.text('Пожалуйста, введите корректную сумму монет.').fadeIn();
             if (players >= 2 && players <= 5) percent = 0.10;
             return;
             else if (players >= 6 && players <= 9) percent = 0.20;
        }
             else if (players === 10) percent = 0.30;
        if (isNaN(players) || players < 2 || players > 10) {
             $error.text('Количество игроков должно быть от 2 до 10 (согласно правилам).').fadeIn();
            return;
        }


        // Логика процентов из вашей таблицы
            var buyerPoints = Math.round(coins * percent);
        var percent = 0;
             var othersPoints = Math.round((coins * percent) / (players - 1));
        if (players >= 2 && players <= 5) {
             percent = 0.10; // 10%
        } else if (players >= 6 && players <= 9) {
            percent = 0.20; // 20%
        } else if (players === 10) {
            percent = 0.30; // 30%
        }


        // Расчет по формулам
            // Вывод
        // 1. Покупатель получает X% от суммы
            spanBuyer.innerText = buyerPoints;
        var buyerPoints = Math.round(coins * percent);
            spanOthers.innerText = othersPoints;
       
            spanPercent.innerText = (percent * 100) + '%';
        // 2. Остальные: (Сумма * X%) / (Игроков - 1)
           
         // Вычитаем 1, так как покупатель не входит в число "остальных"
            divResult.style.display = 'block';
        var othersPoints = Math.round((coins * percent) / (players - 1));
         });
    };


        // Вывод на экран
    // Запускаем скрипт только после полной загрузки DOM
        $container.find('.res-buyer').text(buyerPoints);
    if (document.readyState === 'loading') {
        $container.find('.res-others').text(othersPoints);
         document.addEventListener('DOMContentLoaded', initWidget);
         $container.find('.res-percent').text((percent * 100) + '%');
    } else {
       
         initWidget();
         $result.fadeIn();
     }
     });
})();
});
</script>
</script>
</includeonly>
</includeonly>

Текущая версия от 19:50, 26 ноября 2025