Javascript-форум (https://javascript.ru/forum/)
-   Работа (https://javascript.ru/forum/job/)
-   -   Переделать скрипт дайсов (https://javascript.ru/forum/job/85647-peredelat-skript-dajjsov.html)

Canis Major 02.12.2023 01:04

Переделать скрипт дайсов
 
Привет!
Есть запрос на скрипт дайсов на платформу rusff.

Проблема: переделать скрипт нужно до 03.12 13:00 мск.
Компенсация проблемы: цену устанавливает исполнитель. Возможна частичная предоплата.

Ключи от форума с предустановленной «жертвой» грядущей переделки выдам в личку.

Собственно, исходник.

Код:

<!-- Dice (c) Spiritus Tergi, ч1 в хтмл-верх -->
<script type="text/javascript" src="https://forumstatic.ru/files/000f/3e/d5/42785.js" charset="UTF-8"></script>

Код:

<!-- Dice Roller BEGIN (c) Spiritus Tergi, ч2 в хтмл-низ -->
<template id="dice-box-template">
        <div class="dice-box">
    <p>
            <span class="roll-dice"></span>
            <span class="roll-value"></span>
    </p>
    <p class="roll-reason"></p>
    <p class="roll-result"></p>
        </div>
</template>

<script src="//cdnjs.cloudflare.com/ajax/libs/seedrandom/2.4.4/seedrandom.min.js"></script>
<script>
        diceResults = [
    {'max' : 16,    'result' : 'неудача, тяжелые травмы.'},
    {'max' : 29,    'result' : 'неудача, персонаж зарабатывает легкие ушибы.'},
    {'max' : 49,    'result' : 'неудача, но без увечий и травм.'},
    {'max' : 60,    'result' : 'удача с большим трудом и возможными тяжелыми увечьями.'},
    {'max' : 90,    'result' : 'удача, с легкими ранениями.'},
    {'max' : 1000,    'result' : 'удача  без единой травмы или увечья.'}
        ]

        isTagged = (document.querySelector('#pun').innerHTML.indexOf('[dice]') >= 0)


        if (isTagged) {
    diceRoller = new DiceRoller(diceResults)
    diceRoller.initDiceBoxes()
        }
</script>
<!-- Dice Roller END -->

<!-- Dice Roller Form BEGIN -->
<form id="dice-form" class="hidden" autocomplete="off">
        <div>
    <label><span>#Кубиков</span>        <input type="text" name="count" maxlength="3" value="1"></label>
    <label><span>#Граней</span>    <input type="text" name="sides" maxlength="3" value="100"></label>
    <label><span>Бонус</span>    <input type="text" name="bonus" maxlength="3" value="0"></label>
        </div>
        <div>
    <label><span>Действие</span>    <textarea name="reason" cols="10" rows="5"></textarea></label>
        </div>
        <button type="submit">Вставить</button>
</form>

<script>
        replyForm = document.getElementById('post')
        diceForm = document.getElementById('dice-form')
        diceButtonString = '<td id="button-dice" title="Форма Кубиков" class="hidden"><img src="/i/blank.gif"></td>'

        function handleDiceFormSubmit(event) {
    event.preventDefault()
    let tagArguments = []

    for(let control of event.target.elements)
            if (control.tagName != 'BUTTON')
        tagArguments.push(control.name + ' = ' + control.value)

    replyForm['main-reply'].value += '\n[dice]' + tagArguments.join(' | ') + '[/dice]'
        }

        function handleDiceButtonClick(event) {
    diceForm.classList.toggle('hidden')
        }


        if (replyForm != null) {
    replyForm.querySelector('.fs-box.hashelp').insertAdjacentElement('beforeend', diceForm)
    diceForm.addEventListener('submit', handleDiceFormSubmit)

    let row = replyForm.querySelector('#form-buttons tr')
            row.innerHTML += diceButtonString

    let diceButton = document.getElementById('button-dice')
            diceButton.classList.remove('hidden')
            diceButton.addEventListener('click', handleDiceButtonClick)
        }
</script>
<!-- Dice Roller Form END --></div>

Код:

/* Оформление к Dice Roller (c) Spiritus Tergi, ч3 */

.hidden {
        display: none !important;
}

#button-dice {
        background: url("/files/000f/3e/d5/81483.png") center;
}

form#dice-form {
        width: 340px;
        padding: 18px;
        text-align: right;
        position: absolute;
        top: 40px;
        right: -12px;
        background: rgb(188, 165, 138);
        border: 1px solid;
        border-radius: 2px;
}

form#dice-form input {
        width: 22px;
}

#dice-form label {
        display: block;
        margin: 3px;
        vertical-align: top;
}


#dice-form span {
        font-weight: bold;
        width: 100px;
        text-align: right;
        display: inline-block;
        vertical-align: top;
}

#dice-form label > span::after {
        content: ":"
}

#dice-form textarea {
        width: 130px !important;
        height: 69px !important;
}

#dice-form > div {
width: 160px;
        display: inline-block;
        vertical-align: top;
}

#dice-form > label {
        display: inline-block;
}

#dice-form > div:nth-child(2) {
        margin-top: -18px;
}

.roll-dice::before, .roll-value::before, .roll-reason::before, .roll-result::before {
  font-weight: bold;
}

.roll-dice::before {
    content: "Бросок: ";
}

.roll-dice::after {
  content: " (бонус)";
  margin-right: -5px;
}

.roll-value::before {
    content: " , с результатом: ";
}

.roll-reason::before {
  content: "Действие: "
}

.roll-result::before {
  content: "Итог: "
}

#pun .roll-result {
  padding-bottom: 0px;
}

Что должен уметь новый скрипт.

1. Должна быть возможность бросить от 1d2 до как минимум 10d50, всё что выше не принципиально. По умолчанию в форме для заполнения подставлять 1d10.
2. Нужна возможность вводить в форму до 4 бонусов и до 4 штрафов на один бросок. По умолчанию подставляем по нулям. Сейчас в скрипте реализован учёт только 1 бонуса. Да, после вычета штрафов итог может быть отрицательным. Это ок, здесь ничего дополнительно учитывать не надо.
3. Минималистичный вывод конечной информации.
Конфигурация броска: результат броска + баф1 + баф2 .... - дебаф2 - дебаф 4 = итог. Например ↓
Цитата:

Бросок 2d10: 8 + 3 + 1 + 0 + 0 - 1 - 2 - 0 - 0 = 9
Отдельный вывод результата до применения модификаторов принципиально важен. Вывод нулей не обязателен — как проще, так и окей.
4. Поле для комментария к броску (на что бросаем) не обязательно, но если будет, то в случае незаполнения поля не должно выводиться вообще ничего.
5. Пояснение последствий броска совсем не нужно.
6. Необязательный вариант логики оформления интерфейса.


Часовой пояс GMT +3, время: 02:53.