Pull to refresh
Comments 114
Напомнила Ruby Warrior [веб|консоль] — похожая для рубистов. О, эти игры в которых нельзя в тупую клацать — побольше бы таких.
а есть еще такие по руби?
затяунло, но она кривовата — курсор в сафари там криво встает не по положению букв и выделение криво работает, после 4-го уровня сложные конструкции уже очень напрягает писать.
Какая отличная штука! Кстати, не совсем по теме, но очень советую игровой момент с Руби и rubykoans.com
Гораздо удобнее получается делать это в консоли, используя любимый редактор кода. А еще там есть продолжение приключений воина, в двух измерениях.
Про 11 уровень (Робот и красный ключ)-
Много нас таких извращенцев?
if(Math.random()>0.15){
me.move('right');} else {me.move('down');}

Я извратился по другому — сторону, в которую идти, робот определял в зависимости от положения игрока относительно стартовой точки игрока.
Тоже так поступил. Получился аналог пульта управления :)
Скрытый текст
if (player.atLocation(0, map.getHeight() — 1)) {
me.move(«down»);
} else if (player.atLocation(0, map.getHeight() — 2)) {
me.move(«up»);
} else if (player.atLocation(1, map.getHeight() — 1)) {
me.move(«right»);
}
Для 11го делал проще:
Решение
if(me.canMove('down'))
   me.move('down');
else if(me.canMove('right'))
   me.move('right');



А на 12 добавил счетчик :)

Решение
map.i = map.i || 0

if(map.i < 5)
    me.move('down');
else if(map.i < 30)
    me.move('right');
else if(map.i < 35)
    me.move('up');
else {
    if (me.canMove('right'))
        me.move('right');
    else
        me.move('down');	
}
map.i++;



А на 13ом уже сделал аналогичное решение с ручным управлением
Я просто определял направление перемещения в зависимости от цвета игрока…
чит
переопределив функцию валидации структуры уровня, можно поставить в удобное место дополнительный «выход» и воспользоваться им.

this ['v' + 'alidateLevel'] = function() { return true; } 
map.placeObject(1, 1, 'exit'); 
 

Скриншот напомнил игру KLAD, в которую я играл ещё на ПК «Корвет».
UFO landed and left these words here
То что можно создавать второй выход это баг или так должно быть?
Игра классная =)

Еще немного читов
Автор игры поставил кучу валидаций введенного кода на всякие разные плохие слова типа eval, на использование символа подчеркивания (с него начинаются запрещенные игроку методы map) и т.д., но забыл запретить итерацию по объекту. В итоге можно вытащить в паблик всякие прикольные методы типа removeItemFromMap. Например так:

    var allmembers = "";
    var underscore = null;
    
    for (var n in map)
    {
        if (!underscore) // первый метод приватный
            underscore = n.slice(0, 1);
        allmembers += n + "; ";
    }
    
    for (var n in map)
    {
        if (n.slice(0, 1) == underscore)
        	map[n.slice(1)] = map[n];
    }


Еще автор хотел заблокировать eval, setTimeout и т.п., но почему-то отдает window в качестве this. В итоге делаем, что хотим:


this ['docu' + 'ment'].GlobalMapReference = map;
var st = this ['set' + 'Timeout'];
st ("alert(docu" + "ment.GlobalMapReference.getPlayer);", 1000);


Так ведь это не его фейл, это интересное прохождение! Побольше бы таких.

Кстати, API для конечных уровней довольно аккуратное, правда?
В целом да, но с такими читами все становится очень просто. Исключение — уровни, где редактировать можно только одну константу.
Волшебный ластик
(new Function('map',
    'map.erase = map[String.from'+'CharCode(95)+\'removeItemFromMap\'];'))(map);
map.erase(x,y,'wall')

Интересно, а сохраниться можно? А то сегодня пройти не успел, а потом с нуля писать не интересно будет. (
UFO landed and left these words here
Спавн был честный? Или через setInterval?

Телефоном же ж можно спавнить)
;)
Скрытый текст
Один блок дополнительный можно поставить посреди карты
Кстати, из этого получается отличное нестандартное решение 18го уровня :3
Пфф. Переопределите Math.random и босс не будет стрелять )
А я один...
… создавал новый тип блока (главное, не динамический), построил себе «козырек» и добежал до телефона. Там уже создаем что хотим.
Хе-хе
А еще на уровне нет проверки на количество item-ов...
Можно было не создавать свои блоки, а использовать деревья.
Можно переопределить кнопку (например, left) и спавнить сколько угодно
Я, каюсь, вообще не парился и спавнил пули в углу по таймеру. Получалась хорошая такая очередь в 5 рядов. Оставалось только проверку поставить, чтобы оно не пуляло, когда боссы кончатся.
Там же нельзя ставить таймер честным способом :)
А я не говорил, что я честный =)
Скрытый текст
var st = this ['set' + 'Interval'];
st(myFunction, 100);

А я добавил к самонаводящимся ракетам еще и разделяющиеся боеголовки :)
Вот так:
WTF?! Разве осколки не должны самоуничтожаться при контакте с боссом?..
Никто не запрещает создавать объекты в onDestroy ;)
Хех. А я уже добился очень похожего эффекта при помощи
target = me.findNearest('boss');
if ( target ) {
    /*лететь в сторону таргета*/
    if ( Math.abs(target['x']-me.getX()) + Math.abs(target['y']-me.getY()) == 1 )
        map.placeObject(target['x'],target['y'],'rocket');
} else {
    me.move('down');
}

В результате в босса врезается две ракеты, одна из которых уничтожается, а вторая — занимает его клетку, чтобы на следующем шаге сокрушить следующего босса и так далее.
Аналогично, но я поступил более нечестно по отношению к боссу. А зачем вообще тут телефон? =)
Принцип
Рядом с собой делаю невидимую линию с триггером на прохождение через нее. Триггер спавнит 2 линии по 12 ракет летящих от x = 0 вправо по линиям где летают боссы. Босс сдыхает с 1 пайки.
gist.github.com/anonymous/10977969
В первый раз убил его так же, но потом захотелось придумать что-нибудь пооригинальнее =)
Вот что вышло


Кто придумает что-нибудь более интересное?

PS. Читы не использовал
хехе, еще на 11-м уровне сделал зеркалирование робота относительно положения игрока в нижней части. Как знал что пригодилось без изменений для 12 и 13-го уровня :)

код
var player = map.getPlayer();
            
var dir = 'none';
            var y = player.getY();
            y = map.getHeight() - y;
            var x = player.getX();
            if (me.getX() != x)
            {
            	if (me.getX() > x)
                {
                	dir = 'left';
                }
                else
                {
                	dir = 'right';
                }
            }
            else if (me.getY() != y)
            {
            	if (me.getY() > y)
                {
                	dir = 'up';
                }
                else
                {
                	dir = 'down';
                }
            }
            me.move(dir);
Отличная идея. А я изучал алгоритмы поиска пути и потом час с лишним это отлаживал. Зато хоть что-то новое узнал… Простое решение всегда ближе, чем кажется :)
Сложно как-то =) Просто указываем текущий дирекшн.

me.d||player.setPhoneCallback(function(){me.d = me.d==4?1:me.d+1;});
me.d = me.d||1;
switch(me.d){
case 1:me.move('up');break;
case 2:me.move('down');break;
case 3:me.move('right');break;
case 4:me.move('left');break;
}
Сделал точно так же. Только еще игрока красил, чтобы видеть текущее направление.
ну и зачем было перед сном такое вылаживать? ты не прав. это надо было хотя бы в пятницу…
Вот и вышел 4й сезон «Обмани меня, если сможешь». Сидишь и придумываешь читы…
Характерными особенностями roguelike являются генерируемые случайным образом уровни
(с) Википедия про рогалики

Я так понимаю, тут только 20 уровней?
Я так понимаю, тут только 20 уровней?

По крайней мере 21.
Я бы сказал, что тут скорее реверанс в сторону rogue-like (text-mode, @ и проч)… Но уж точно не -like.
Великолепно! Жаль на английском, я бы может сына на такие игры подсадил…
прошел без читов
Игра понравилась, а 21 уровень вообще проходим или он просто оставлен как заглушка?
Да, правда. Хитро. Случайно нашёл, изучая интерфейс игры.
Только после 21-ого у меня перешло не на 22-й, а на конец игры )
Еще бы топ самых красивых решений для каждого уровня сделал кто-нибудь. После некоторых уровней очень хотелось увидеть, как их проходят нормальные люди (без «читов»).

Например, lvl15 как по-умному проходить? Там, где можно править только параметры player.killedBy(). Я включал режим Иисуса через попытку клонирования:
player.killedBy(map.placePlayer(3, 3));//);

валидатор не позволял мне утонуть. Но, на мой взгляд, это костыль, и должно же быть что-то еще.
Не знаю, как по-умному, но я туда просто написал несуществующую переменную exit (player.killedBy(exit);). Таким образом, он просто матюгается на неизвестный тип, и ты не тонешь
Ну, аналогичное решение по сути. Интересно наличие чего-то принципиально иного.
    map.defineObject('water', {
        'symbol': '░',
        'color': '#44f',
        'onCollision': function (player) {
            player.killedBy();},'onCollision':function(){//);
        }
    });



а, ниже уже написали этот вариант
Вообще говоря в четвертом уровне написана подсказка, которая пригодилась только в этом. Ищите :)
Ну почему же, на самом четвёртом уровне эта подсказка очень помогает.
По моему, на четвертом уровне другое решение и придумать то сложно. Это самое очевидное.
Возможно; просто мне решение в голову пришло как раз-таки сразу после прочтения названия уровня.)
Дык, там вроде бы в том и задумка, чтоб exception выкинуть в процессе убиения себя. И комментарий как раз есть про выбор способа умереть.
Принципиально другое решение — переопределить onCollision, добавив его ещё раз.
Как-то так
'onCollision': function (player) {
player.killedBy('whatever');},'onCollision': function (){ ('whatever');
}


Но я решал тоже через exception, так проще.
Думаю, этот вариант тоже подходит под определение «принципиально иное». =)
Получается смешно
map.defineObject('water', {
    'symbol': '░',
    'color': '#44f',
    'onCollision': function (player) {
        player.killedBy('');},type:'item'});(function(){if(1){void(0);
    }
});


А вот про эксепшены я почему-то не подумал, несмотря на название.
Кстати, босса можно убить без использования телефона. Вообще, это можно сделать одной кнопкой. И без переопределения чего-то существующего. Кто еще догадается?
Я рисовал линию в точке старта, триггер коллизии с линией спавнил пули и тупо закидывал босса ими
Скрытый текст
    map.defineObject('arrow', {
        'type': 'dynamic',
        'symbol': '^',
        'color': 'green',
        'interval': 100,
        'projectile': true,
        'behavior': function (me) {
            me.move('up');
        }
    });

    function testFunc() {
      map.placeObject( 31, 21, 'arrow' );
    }

    //press UP/Down at start location to FIRE
    map.createLine([10, 0], [10, 2000], function(){
      testFunc();
    });


Да, как много решений узнаешь. Про линии я не подумал, т.к. не запомнил их из-за того, что квесты с ними были
слишком легкими
Например, в уровне с лазерами достаточно переопределить функцию
function getRandomInt() {return 0;}


Но вобще я имел ввиду
породить рядом с собой элемент инвенторя, при подборе которого спавнить ракетный удар:
gist.github.com/anonymous/efe382b17347dc4bde55
не зря же в заголовке написано exceptional =)
Как-то так
function () {throw 'Режим Иисуса!'}

Мне понравилось все: задумка, дизайн, интерфейс, музыка. Вот бы побольше таких игр.
Кстати, кто как 9 уровень прошел?
Мое решение кажется мне немного читерским
т.к. я тупо проложила мост.
map.defineObject('bridge', {
        'type': 'dynamic',
        'symbol': '▓',
        'color': '#420',
        'transport': true, 
    });
for (var i = 5; i < 15; i++) 
   map.placeObject(20, i, 'bridge');

На 9 уровне можно...
… телефон заюзать. Встаёшь на плот — и направляешь в обратную сторону.
По-моему, это референсное решение. Так неинтересно :)
Забавное решение, но до него нужно ещё додуматься!
Получив телефон (а с ним и колбэки), сразу начинаешь думать, куда бы их применить.

А решение-то вот, на поверхности…
Точно так же, но я не парился с вычислением координат, а замостил всю реку :)
А что насчет 14го, кто как прошел? Я отдал-таки зеленый ключ в итоге, но может есть более интересное решение?

Решение
'greenKey');}else {return false;} if(0) {//
Скрытый текст
Заменил на «blueKey», без хитростей, а потом пошёл по такому пути:

В точности моё решение!

А можно смешнее (коллега сделал так):
Скрытый текст
player.removeItem('greenKey');map.placeObject(24,12,'greenKey');
А вот это неожиданный ход, даже не думал о таком!
Отдавать можно любой предмет, известный игре, при этом не важно, есть ли он у игрока. Я отдавал theAlgorithm.
А вот мне интересно, каким образом вообще была сделана возможность запрещать редактировать часть текста? Ведь это контрол браузера, как я понимаю. Конечно, редактор CodeMirror что-то на него навесил, но ведь не мог же он создать редактор целиком! Он явно нативный. Кроме того, это все работает кроссбраузерно! Кто-нибудь может объяснить, как делается эта магия?
Откройте раздел меню «scripts», там весь код. В самом начале файла codeEditor.js:
'begin_line':'#BEGIN_EDITABLE#', 'end_line':'#END_EDITABLE#',
Это-то понятно, что где-то есть разметка, что можно редактировать, а что нельзя. Меня интересует, как вообще такое возможно? API контролов редактирования текста не позволяет такое делать даже на декстопе, что уж говорить о вебе? Как CodeMirror этого добился? Есть что почитать по теме (кроме кода CodeMirror)?
Например, когда изменяешь текст (удаляешь букву) — ставить эту букву на место и контрол в предыдущю позицию.
Прошел игру. Влюбился. Просто офигенно. Ребята, а есть еще подобное?
Ну, например, если «программировать» паяльником, то есть конструктор. Вообще, от этих ребят есть много занятных игр.
19 уровень я даже осознать не успел. Поклацал куда-то и оказался на следующем уровне.
Аналогично, просто все время жал вверх, пытаясь понять, что происходит, и неожиданно прошел. Потом уже почитал код — кажется надо совместить две собаки.
Не стану портить удовольствие, поэтому лишь подскажу, что копать надо в сторону меню (^0). После осознания обнаруженного лично я пожалел, что не видел этого в процессе прохождения, появилось даже желание пройти заново.

Помнится, в интервью с Сидом Мейером было такое понятие, как переигрываемость. Как ни странно, у Untrusted этот показатель куда выше, чем у большинства современных игровых поделок.
И ещё раз спасибо, однозначно минимальность подсказки оставила место для удовольствия! Если б мог, плюсанул везде! Пойду переигрывать!
А я тоже пожалел и проверил. При игре с чистого листа этой возможности нет до самого конца.
Можно просто перепроходить уровни, не сбрасывая игру.

Или выйти на другой масштаб и работать с форком, снаружи «матрицы».
Большое спасибо за ссылку на сию замечательную игру! Надеюсь проект будет развиваться и в один прекрасный день мы увидим там нелинейность, побочные миссии, красивый сюжет и конечно-же больше уровней!
Спойлер
Игра действительно прекрасна! Спасибо за два часа чудного времяпрепровождения.

Только вот босс слабоват :(
map.defineObject
(
    'rocket', 
    {
        'type': 'dynamic',
        'symbol': '>',
        'color': '#bfbf00',
        'interval': 100,
        'projectile': true,
        'behavior': function(me) 
        {
            me.move('right');
        },
        'onDestroy': function(me) 
        {
            var x = me.getX();
            var y = me.getY();
                
            if(x < map.getWidth())
                map.placeObject(x + 1, y, 'rocket');	
        }
    }
);
    
map.placeObject(0, 5, 'rocket');
map.placeObject(0, 6, 'rocket');

this ['v' + 'alidateLevel'] = function(){return true}; 



Давненько хотел сделать нечто похожее (в плане игровой процесс = программирование), но почему то прицепился к десктопному приложению с мини интерпретатором. А ведь, оказывается, можно велосипедов не изобретать и использовать JS… надо это хорошенько обдумать.
Only those users with full accounts are able to leave comments. Log in, please.