Расширяем функционал Monopoly City Streets

    Разработчиками в MCS, к сожалению, не предусмотрена возможность застройки улицы большим количеством зданий за пару кликов мышкой. Но ведь игра написана на JS, так что ничего нам не мешает написать небольшой букмарклет, который и позволит нам добавить требуемый функционал.

    Весь код MCS находится в файле monopoly.1255614067.js. Если посмотреть firebug'ом, что происходит в процессе покупки здания — мы увидим, что используются 2 функции — MCS.BUILD.showLocations() [для отображения маркеров доступных мест] и MCS.BUILD.buyBuilding() [для, собственно, покупки здания]. После размышлений у меня получился следующий код:
    if (typeof MCS == "undefined") {
        alert('Букмарклет нужно вызывать только на странице монополии');
        throw '';
    }   
    var buildingType = null;
    var player = MCS.getPlayerData();
    if (player == null) {
        alert('Перед вызовом необходимо авторизоваться');
        throw '';
    }
    var streetId = MCS.STREET.getStreetData().id;
    var streetData = MCS.STREET.getStreetData().data;
    if (streetId == null) {
        alert('Перед вызовом необходимо выбрать улицу');
        throw '';
    } else if (streetData.o != player.nickname) {
        alert('Перед вызовом необходимо выбрать свою улицу');
        throw '';
    }
    var locations = new Array();
    var builtCnt = 0;
    var buildLimit = 0;
    function buy() {
        if (builtCnt < buildLimit) {
            buyBuilding(locations[0]);
            MCS.STATUSBAR.redraw();
            getLocations();
            setTimeout(buy, 250);
        } else {
            done();
        }
    }
    function done()
    {
        MCS.STREET.show(streetId, null, false, false);
        MCS.LOADING.hide();
        alert('Построено зданий: ' + builtCnt + 'шт.');
    }
    function getLocations()
    {
        locations = new Array();
        $.ajax({
            url: "/build/getlocations",
            cache: false,
            data: {
                id: streetId,
                type: buildingType
            },
            dataType: "json",
            async: false,
            success: function (data, status) {
                $.each(data, function (foo, point) {
                    if (point) {
                        locations.push(foo);
                    }
                });
            }
        });
    }
    function buyBuilding(location)
    {
        $.ajax({
            url: "/negotiate/buybuilding",
            type: "post",
            data: {
                nickname: player.nickname,
                hash: player.hash,
                id: streetId,
                type: buildingType,
                loc: location
            },
            dataType: "json",
            async: false,
            success: function (data, status) {
                player.balance -= MCS.buildings[buildingType].price;
                builtCnt++;
            }
        });
        MCS.TRACK.view({
            page: "build",
            section: "build",
            street: streetData.n,
            country: streetData.cy,
            region: streetData.re,
            building_type: buildingType,
            activity: "build property",
            value: MCS.buildings[buildingType].price
        });
    }
    buildingType = prompt('Введите идентификатор здания. Список доступных типов можно узнать введя "?"', '?');
    if (buildingType != null) {
        if (buildingType == '?') {
            var string = '';
            for (in MCS.buildings) {
                if (!isNaN(MCS.buildings[i].effect)) {
                    string = string + "Идентификатор: " + i + ", наименование: " + MCS.LANG.building["building"+i] + ", стоимость: " + MCS.buildings[i].price*1000 + "\n";
                }
            }
            alert(string);
        } else if (typeof MCS.buildings[buildingType] == "undefined" || isNaN(MCS.buildings[buildingType].effect)) {
            alert("Указан некорректный идентификатор");
        } else {
            var count = Math.floor(player.balance / MCS.buildings[buildingType].price);
            if (count > 0) {
                getLocations();
                var minCnt = Math.min(count, locations.length);
                if (minCnt == 0) {
                    alert('На улице нет места под здания такого типа');
                } else {
                    buildLimit = minCnt;
                    if (!confirm('Сейчас попытаемся понастроить домов в количестве ' + minCnt + 'шт. Если хотите изменить предел (только в меньшую сторону) - нажмите "отмена"')) {
                        buildLimit = prompt('Сколько зданий пытаться строить?', minCnt);
                        if (buildLimit == null) {
                            throw '';
                        }
                        if (isNaN(buildLimit) || buildLimit > minCnt || buildLimit < 0) {
                            alert('Некорректное значение');
                            throw '';
                        }
                    }
                    MCS.LOADING.show();
                    setTimeout(buy, 250);
                }
            } else {
                alert('У вас недостаточно средств для строительства этого здания');
            }
        }
    }
    подсветка кода: highlight.hohli.com

    Перед началом работы скрипт проводит несколько проверок: наличие класса MCS (в противном случае мы точно не на сайте игры), наличие авторизации у пользователя, а так же проверяется текущая выделенная улица. Далее выдаётся запрос для выяснения типа здания — список последних берётся из кода игры. Проверяется наличие денег у игрока и наличие свободных мест на улице. Затем выясняем количество домов для постройки и приступаем к этому увлекательному занятию. Чтобы пользователь не скучал — не забываем отобразить «песочные часы» в верхней панели. И, наконец, выводится количество построенных домов.

    Чтобы преобразовать этот скрипт в 1 строку — используем javascriptcompressor.com, в результате у нас почти есть букмарклет — остаётся только добавить 'javascript:' в начало полученной строки.

    Готовый текст букмарклета на пастебине: pastebin.mozilla.org/678433

    P.S. В качестве бонуса — букмарклет для отображения стоимости текущей улицы без зданий: javascript:if(typeof MCS != "undefined"&&MCS.STREET.getStreetData().data)alert(MCS.STREET.getStreetData().data.p*1000);

    UPD Букмарклет для пакетного удаления зданий:
    if (typeof MCS == "undefined") {
        alert('Букмарклет нужно вызывать только на странице монополии');
        throw '';
    }   
    var buildingType = null;
    var player = MCS.getPlayerData();
    if (player == null) {
        alert('Перед вызовом необходимо авторизоваться');
        throw '';
    }
    var streetId = MCS.STREET.getStreetData().id;
    var streetData = MCS.STREET.getStreetData().data;
    if (streetId == null) {
        alert('Перед вызовом необходимо выбрать улицу');
        throw '';
    } else if (streetData.o != player.nickname) {
        alert('Перед вызовом необходимо выбрать свою улицу');
        throw '';
    }
    function demolish() {
        if (removedCnt < removeCnt && buildingList.length) {
            $.ajax({
                url: "/negotiate/demolishbuilding",
                type: "post",
                data: {
                    nickname: player.nickname,
                    hash: player.hash,
                    id: streetId,
                    bid: buildingList.shift()
                },
                dataType: "json",
                async: false,
                success: function () {
                    MCS.getPlayerData().balance += parseInt(MCS.buildings[removeMe].price / 2);
                }
            });
            removedCnt++;
            setTimeout(demolish, 500);
        } else {
            done();
        }
    }
    function done()
    {
        MCS.STREET.show(streetId, null, false, false);
        MCS.LOADING.hide();
    }
    var buildingTypes = new Array();
    var str = '';
    var i;
    for (in streetData.b) {
        if (!isNaN(MCS.buildings[streetData.b[i].t].effect)) {
            if (typeof buildingTypes[streetData.b[i].t] == "undefined") {
                buildingTypes[streetData.b[i].t] = new Array();
                buildingTypes[streetData.b[i].t]['name'] = MCS.LANG.building["building"+streetData.b[i].t];
                buildingTypes[streetData.b[i].t]['count'] = 1;
            } else {
                buildingTypes[streetData.b[i].t]['count']++;
            }
        }
    }
    if (buildingTypes.length == 0) {
        alert('На выбранной улице нет доступных для сноса зданий');
        throw '';
    }
    for (in buildingTypes) {
        str = str + "Идентификатор: " + i + ", наименование: " + buildingTypes[i]['name'] + ", количество: " + buildingTypes[i]['count'] + "шт." + "\n";
    }
    var removeMe = prompt("Введите идентификатор здания для сноса. Список зданий на улице:\n" + str);
    var buildingList = new Array();
    if (removeMe != null) {
        if (typeof buildingTypes[removeMe] == 'undefined') {
            alert('Указан некорректный тип зданий');
            throw '';
        }
        var removeCnt = buildingTypes[removeMe]['count'];
        var removedCnt = 0;
        if (!confirm('Будет предпринята попытка сноса зданий в количестве ' + removeCnt + 'шт. Если хотите изменить количество (только в меньшую сторону) - нажмите "отмена"')) {
            removeCnt = prompt('Введите количество домов для сноса');
            if (removeCnt == null) {
                throw '';
            }
            if (isNaN(removeCnt) || removeCnt > buildingTypes[removeMe]['count'] || removeCnt < 0) {
                alert('Некорректное значение');
                throw '';
            }
        }
        MCS.LOADING.show();
        for (in streetData.b) {
            if (streetData.b[i].t == removeMe && removedCnt < removeCnt) {
                buildingList.push(i);
            }
        }
        setTimeout(demolish, 250);
    }

    pastebin.mozilla.org/678730
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 23

      0
      Сделал такое на php на CURL. Пакетная застройка, продажа и скан карты на свободные дорогие улицы. Теперь на поиграться уходит не более 5 минут.
        0
        Каким образом ищете свободные улицы? Тупо перебором координат?
          0
          Да. Получается не быстро — но других решений пока не вижу.
            0
            а в скрипте предусмотрена реакция на шанс-карты? как я понимаю, даже если не предусмотрена, то штрафные шанс-карты таки делают свое дело все равно — деньги списываются?
              0
              При шанс карте скрипт останавливается. Чтобы реализовать шанс нужно перелогиниться к сожалению.
        +1
        А мне уже который день запрещено строить здания. Не понимаю почему. Просто не дают.
        Ни скриптами, ничем либо другим не пользовался. Деньги все копятся и копятся.
          0
          С каким сообщением запрещает строить?
            0
            It looks like someone had beaten you to do this. <.blockquote>

            Вроде так.
              0
              Эм. Извините
                +1
                1. источник:
                «It looks like someone else has beaten you to this, please try again when their done.»
                Is code for «database inset failed», which can mean simply that someone else has put something on your street, but more likely the server is overloaded (as usual).

                2. источник:
                Are you getting error messages like:
                “oops sorry, some weird error occurred, please try again”
                “it looks like someone else has beaten you to do this…”
                Maybe you’re in the monopoly city streets dead zone.
                  0
                  Эм. Несколько дней назад все было окей: строил на этих улицах в этих же точках. А сейчас не получается. Там нет объяснений и решений?
                    0
                    Та же беда, с сервера приходит сообщение conflict request 409 если в файрбаге посмотреть. Писал в поддержку два раз, не отвечают. И не только строить, вообще всё запрещают.
                      0
                      На работе заработало.
                        0
                        У меня так было, не мог строить здания или продавать улицы. А вот покупать новые и строить на них мог. В итоге написал в саппорт, через 2 дня всё починили.
                0
                дополни, пожалуйста, функцией продажи зданий.
                  0
                  сделал другой букмарклет
                    0
                    спасибо. но при нажатии на «Отмена» или крестик окна происходит неприятная вещь.
                      0
                      хм… в каком вопросе «неприятная вещь» происходит? какой браузер?
                        0
                        в Chrome и Firefox выкидывает на белый лист со словами «Идентификатор: 6, наименование: Green House, количество: 4шт. Идентификатор: 7, наименование: City Centre Cottage, количество: 1шт. Идентификатор: 9, наименование: The Sentinel, количество: 5шт. Идентификатор: 10, наименование: High Reach Place, количество: 4шт. Идентификатор: 12, наименование: Polyhedron Plaza, количество: 25шт. Идентификатор: 19, наименование: Cubic Quarters, количество: 15шт. Идентификатор: 22, наименование: Spear End Summit, количество: 2шт.»
                          0
                          pastebin.mozilla.org/678729 — эта версия в случае отмены страницу не затирает, но перемещает карту в начальную точку. Причину такого поведения я пока не понял.
                +1
                  0
                  ага, сегодня нашёл :)

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое