Калькулятор возврата

Тема в разделе "Рабочие одобренные скрипты", создана пользователем PiratRoger, 21. фев 2016.

Поделиться этой страницей

  1. PiratRoger

    PiratRoger Копейщик

    Сообщения:
    27
    Симпатии:
    3
    Описание:
    Скрипт показывает по времени прибытия и координатам время отправки, возврата и расстояние для каждого юнита.
    Время прибытия понимает дату типа "вчера/сегодня/завтра в [время]", например: "сегодня в 10:00:00".
    На страницах отчета и конкретного приказа координаты и время прибытия будут взяты со страницы и поставлены в соответствующие поля автоматически.

    Как использовать:
    1. кликать на скрипт.
    2. вставить в поля данные (координаты и время прибытия)
    3. кликать на кнопку "Show"

    Место использования:
    Любая страница

    Код:
    javascript:
    var win = window;
    win.location.contains = function(search_value) {
        return win.document.URL.search(search_value) != -1;
    };
    
    var BT = {
    
        utils: {
    
            translator: {
                month: {
                    en: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
                },
                day: {
                    en: ['yesterday at', 'today at', 'tomorrow at'],
                    ru: ['вчера в', 'сегодня в', 'завтра в'],
                    es: ['ayer a las', 'hoy a las', 'mañana a las'],
                    ro: ['ieri la ora', 'astăzi la ora', 'mâine la ora']
                },
                translate_month: function(text) {
                    var en = this.month.en;
                    var months = Format.month_names;
                    for (var i = 0; i < en.length; i++) {
                        text = text.replace(months[i].toLowerCase(), en[i].toLowerCase());
                    }
                    text = text.replace(/\./g, ',').replace(/(\d+),(\d+)/, '$2,$1');
                    return text;
                },
                translate_day: function(text) {
                    var self = this;
                    $.each(self.day, function(lang, days) {
                        for (var i = 0; i < days.length; i++) {
                            text = text.replace(days[i].toLowerCase(), self.day.en[i].toLowerCase());
                        }
                    });
                    return text;
                },
                validate_date: function(text, server) {
                    text = text.replace(' :', ':');
                    for (var i = 0; i < this.day.en.length; i++) {
                        var j = i - 1;
                        var date = new Date(server);
                        date.setDate(date.getDate() + j);
                        text = text.replace(this.day.en[i].toLowerCase(), (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear());
                    }
                    return text;
                }
            },
    
            get_origin_coord: function() {
                var array = $('#bt_attacker').val().trim().split('|');
                return { x: parseInt(array[0]), y: parseInt(array[1]) };
            },
            get_target_coord: function() {
                var array = $('#bt_defender').val().trim().split('|');
                return { x: parseInt(array[0]), y: parseInt(array[1]) };
            },
            get_server_time: function() {
                var serverTime = $('#serverTime').text().split(':');
                var serverDate = $('#serverDate').text().split('/');
                return new Date(serverDate[2], serverDate[1] - 1, serverDate[0], serverTime[0], serverTime[1], serverTime[2]);
            },
            get_arrival_time: function() {
                var string = $('#bt_arrival_time').val().trim().toLowerCase();
                string = this.translator.translate_month(string);
                string = this.translator.translate_day(string);
                string = this.translator.validate_date(string, this.get_server_time());
                return new Date(string);
            },
            get_fields: function(origin, target) {
                var x = origin.x - target.x;
                var y = origin.y - target.y;
                return Math.sqrt((x * x) + (y * y));
            },
            get_duration: function(fields, speed) {
                var total_seconds = Math.round(fields / speed);
                var hours = parseInt(total_seconds / 3600);
                var minutes = parseInt( total_seconds / 60 ) % 60;
                var seconds = total_seconds % 60;
                hours = hours > 9 ? hours : '0' + hours;
                minutes = minutes > 9 ? minutes : '0' + minutes;
                seconds = seconds > 9 ? seconds : '0' + seconds;
                return {
                    total_seconds: total_seconds,
                    formatted_string: hours + ':' + minutes + ':' + seconds
                }
            }
        },
    
        data : {
            from_report: function() {
                var time  = $('td.nopad table.vis:eq(1) tr:eq(1) td:eq(1)').text().replace(/\t*\n*/g, '').replace(/ :/, ':');
                var att = $('#attack_info_att').find('tr:eq(1) td:last').text().replace(/([\S\s]*(\d{3}\|\d{3})[\S\s]*)/, "$2");
                var def = $('#attack_info_def').find('tr:eq(1) td:last').text().replace(/([\S\s]*(\d{3}\|\d{3})[\S\s]*)/, "$2");
                return { arrival: time, attacker: att, defender: def };
            },
            from_info_command: function() {
                var time = $('span[class^=smal]').parent().text();
                var att = $('span[class^=village_anchor]:first').text().replace(/([\S\s]*(\d{3}\|\d{3})[\S\s]*)/, "$2");
                var def = $('span[class^=village_anchor]:last').text().replace(/([\S\s]*(\d{3}\|\d{3})[\S\s]*)/, "$2");
                return { arrival: time, attacker: att, defender: def };
            },
            default: function() {
                return { arrival: '', attacker: '', defender: game_data.village.coord };
            },
    
    
            init: function () {
                var data;
                var url = window.document.URL;
                if(win.location.contains(/screen=report/) && win.location.contains(/view=/)){
                    data = this.from_report();
                } else if(win.location.contains(/screen=info_command/) && win.location.contains(/id=/)) {
                    data = this.from_info_command();
                } else {
                    data = this.default();
                }
                $('#bt_arrival_time').val(data.arrival);
                $('#bt_attacker').val(data.attacker);
                $('#bt_defender').val(data.defender);
            }
        },
    
        init: function() {
            var $main = $('#bt_main');
            if($main.attr('id') != undefined) {
                return;
            }
            $main = $('<div id="bt_main" class="vis" style="z-index: 99999; min-width:500px; display:inline-block; position: absolute; top: 112px; box-shadow: rgba(0, 0, 0, 0.701961) 4px 4px 10px; left: 43px; background: rgb(227, 213, 179);"></div>')
                .draggable( { handle: "h4" } );
            $(win.document.body).append($main);
    
            var $container = $('<div id="bt_container" style="padding:10px;"></div>')
                .append($('<table class="vis" width="100%"></table>')
                    .append($('<tbody></tbody>')
                        .append($('<tr></tr>')
                            .append('<td>Attacker: </td>')
                            .append('<td><input id="bt_attacker" type="text" size="30" placeholder="xxx|yyy"></td>')
                            .append('<td rowspan="3" style="text-align: center;"><input id="bt_calculate" type="button" class="btn" value="Show"></td>'))
                        .append($('<tr></tr>')
                            .append('<td>Defender: </td>')
                            .append('<td><input id="bt_defender" type="text" size="30" placeholder="xxx|yyy"></td>'))
                        .append($('<tr></tr>')
                            .append('<td>Arrival time: </td>')
                            .append('<td><input id="bt_arrival_time" type="text" size="30"></td>'))));
    
            $main
                .append('<h4>BackTime calculator</h4>')
                .append($container)
                .append('<div id="bt_result"></div>');
    
            $('#bt_calculate').on('click', this.calculate);
            this.data.init();
        },
    
        calculate: function() {
    
            var $table = $('<table style="border-spacing:2px;border-collapse:separate;width:100%"></table>');
            var $tbody = $('<tbody><tr><th style="min-width: 25px"></th><th>Sent time</th><th>Duration</th><th>Back time</th></tr></tbody>');
            $table.append($tbody);
    
            var origin = BT.utils.get_origin_coord();
            var target = BT.utils.get_target_coord();
            var fields = BT.utils.get_fields(origin, target);
            var arrival = BT.utils.get_arrival_time();
    
            var date_format = {
                day: 'numeric',
                month: 'numeric',
                year: 'numeric',
                hour: 'numeric',
                minute: 'numeric',
                second: 'numeric'
            };
    
            $.each(UnitPopup.unit_data, function(name, unit) {
                if(name != 'militia') {
                    var duration = BT.utils.get_duration(fields, unit.speed);
                    var sentTime = new Date(arrival);
                    var backTime = new Date(arrival);
    
                    sentTime.setSeconds(sentTime.getSeconds() - duration.total_seconds);
                    backTime.setSeconds(backTime.getSeconds() + duration.total_seconds);
    
    
                    var $tr = $('<tr></tr>')
                        .append('<td style="text-align:center"><img src="https://dsts.innogamescdn.com/8.38/27307/graphic/unit/unit_' + name + '.png"></td>')
                        .append('<td style="text-align:center">' + sentTime.toLocaleString('ru', date_format) + '</td>')
                        .append('<td style="text-align:center">' + duration.formatted_string + '</td>')
                        .append('<td style="text-align:center">' + backTime.toLocaleString('ru', date_format) + '</td>');
                    $tbody.append($tr);
                }
            });
    
            $('#bt_result').html($table);
        }
    };
    
    BT.init();
    


    Код:
    javascript:yepnope({ load: 'https://drive.google.com/uc?export=download&id=0BzqXGTX17n1DejJWY2VucUZQTzA' });
    

    - - - - - Добавлено чуть позже - - - - -

    Кто нибудь из модераторов допишите название темы "Калькулятор возврата" :D
     
    Последнее редактирование модератором: 28. мар 2017
  2. max00vas

    max00vas Конный лучник

    Сообщения:
    742
    Симпатии:
    104
    Спасибо, а можно попросить еще скрины делать, чтобы нагляднее понимать как это работает?
     
  3. PiratRoger

    PiratRoger Копейщик

    Сообщения:
    27
    Симпатии:
    3
    [​IMG]
    [​IMG]
     
  4. max00vas

    max00vas Конный лучник

    Сообщения:
    742
    Симпатии:
    104
    Ухты, круто-круто!
    Параметры сохранятся нажатием на Show чтоле? И потом кликая на скрипт просто грузится это окошко с бэктаймом?
    Тогда бы я Show переименовал в Save или Keep или Update, ибо лексическое значение слова Show никак не предполагает, что нажатие этой кнопки еще чего-то в локальные переменные запишет, не?
     
  5. PiratRoger

    PiratRoger Копейщик

    Сообщения:
    27
    Симпатии:
    3
    Скрипт не использует локальное хранилище.
    Клик на скрипт: вызывается скрипт и строится это окошко, только без таблицы с юнитами, если скрипт был вызван на страницах отчета или приказа, данные спарсятся со страницы, если на других страницах, их нужно вводить вручную.
    Клик на show: вычисляется расстояние между координатами, дальше для каждого юнита вычисляется время пути, отправки и возврата и выводится (показывается) таблица с этими данными, а дальше уже сам из списка смотришь данные какого юнита подходят.

    Если путаницу вызвало два скрипта "скрипт" и "постоянная ссылка", это один и тот же скрипт, просто второй вызывает его из гугл диска, которую я могу обновить в любой момент.

    PS: с локальным хранилищем я так и не понял для чего ты подумал что это кнопка чтобы сохранить что то в локальное хранилище и для чего обратно его оттуда доставать, если есть идея чем то [осуществимым] дополнить пиши в скайп hooliganyoo.
     
  6. VSxoD

    VSxoD Элитный кавалерист

    Сообщения:
    1.335
    Симпатии:
    464
    скрипт классный и очень любимый, но уже приличное время как перестал работать (открывается, но не даёт таблицу с временем и юнитами)
     
    kwattZ нравится это.
  7. JsMaker

    JsMaker Новичок

    Сообщения:
    4
    Симпатии:
    5
    Есть один игровой js объект UnitPopup.unit_data, для хранения характеристик юнитов (скорость передвижения, сила атаки, защиты и т.д.). Так вот после обновлений игры, не знаю после какого обновления, разработчики сделали этот объект пустым, пока игрок нажмет на иконку какого-нить юнита (отправляется запрос на сервер, сервер отправляет характеристики и они записываются в этот объект).
    Следовательно чтоб скрипт заработал, перед тем как кликнуть на скрипт, нужно кликнуть на иконку какого-нить юнита (затем закрыть всплывающее окошко).
     
    max00vas и VSxoD нравится это.
  8. Рулич

    Рулич Новичок

    Сообщения:
    3
    Симпатии:
    2
    Добрый день! Не получается скрипт запустить. Открываю окошко с юнитом, нажимаю скрипт,
    выдает
    http://prntscr.com/iot4iz
    Не подгружает полностью данные и дальше SHOW не нажимается
     
  9. AkKeLa

    AkKeLa Кавалерист Команда ВП Модератор

    Сообщения:
    434
    Симпатии:
    22
    Милисекунды лишние, только что проверил, кроме картинок всё в порядке.
     
  10. Олегсич

    Олегсич Копейщик

    Сообщения:
    10
    Симпатии:
    0
    дата , завтра не понимает, по крайней мере ничего не высвечивается.