Comments
114
map.placeObject(7, 5, 'block');
чёрт, я жив!
а есть еще такие по руби?
затяунло, но она кривовата — курсор в сафари там криво встает не по положению букв и выделение криво работает, после 4-го уровня сложные конструкции уже очень напрягает писать.
затяунло, но она кривовата — курсор в сафари там криво встает не по положению букв и выделение криво работает, после 4-го уровня сложные конструкции уже очень напрягает писать.
Какая отличная штука! Кстати, не совсем по теме, но очень советую игровой момент с Руби и rubykoans.com
Гораздо удобнее получается делать это в консоли, используя любимый редактор кода. А еще там есть продолжение приключений воина, в двух измерениях.
Ну все, пипец работе…
Про 11 уровень (Робот и красный ключ)-
Много нас таких извращенцев?
if(Math.random()>0.15){
me.move('right');} else {me.move('down');}
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»);
}
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го делал проще:
А на 12 добавил счетчик :)
А на 13ом уже сделал аналогичное решение с ручным управлением
Решение
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, в которую я играл ещё на ПК «Корвет».
То что можно создавать второй выход это баг или так должно быть?
Так должно быть.
Местами.
Игра классная =)
Еще немного читов
Автор игры поставил кучу валидаций введенного кода на всякие разные плохие слова типа eval, на использование символа подчеркивания (с него начинаются запрещенные игроку методы map) и т.д., но забыл запретить итерацию по объекту. В итоге можно вытащить в паблик всякие прикольные методы типа removeItemFromMap. Например так:
Еще автор хотел заблокировать eval, setTimeout и т.п., но почему-то отдает window в качестве this. В итоге делаем, что хотим:
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 для конечных уровней довольно аккуратное, правда?
Кстати, API для конечных уровней довольно аккуратное, правда?
В целом да, но с такими читами все становится очень просто. Исключение — уровни, где редактировать можно только одну константу.
Волшебный ластик
(new Function('map',
'map.erase = map[String.from'+'CharCode(95)+\'removeItemFromMap\'];'))(map);
map.erase(x,y,'wall')
Медалька «Нео» почётно заслужена! :)
Интересно, а сохраниться можно? А то сегодня пройти не успел, а потом с нуля писать не интересно будет. (
Вроде она сохраняется в localstorage сама.
Хохотал, убивая босса самонаводящимися ракетами :-)
Спавн был честный? Или через setInterval?
Спавн был честный? Или через setInterval?
Телефоном же ж можно спавнить)
До телефона еще добежать надо =)
;)
Скрытый текст
Один блок дополнительный можно поставить посреди карты
Или
можно много деревьев насадить
Кстати, из этого получается отличное нестандартное решение 18го уровня :3
Пфф. Переопределите Math.random и босс не будет стрелять )
А я один...
… создавал новый тип блока (главное, не динамический), построил себе «козырек» и добежал до телефона. Там уже создаем что хотим.
Хе-хе
А еще на уровне нет проверки на количество item-ов...
Можно было не создавать свои блоки, а использовать деревья.
Можно переопределить кнопку (например, left) и спавнить сколько угодно
Я, каюсь, вообще не парился и спавнил пули в углу по таймеру. Получалась хорошая такая очередь в 5 рядов. Оставалось только проверку поставить, чтобы оно не пуляло, когда боссы кончатся.
Там же нельзя ставить таймер честным способом :)
А я не говорил, что я честный =)
Скрытый текст
var st = this ['set' + 'Interval'];
st(myFunction, 100);
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
gist.github.com/anonymous/10977969
В первый раз убил его так же, но потом захотелось придумать что-нибудь пооригинальнее =)
Кто придумает что-нибудь более интересное?
PS. Читы не использовал
Вот что вышло
Кто придумает что-нибудь более интересное?
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.
Вспомнилась эта codecombat.com
Великолепно! Жаль на английском, я бы может сына на такие игры подсадил…
прошел без читов
прошел без читов
Форкаете и переводите :)
Игра понравилась, а 21 уровень вообще проходим или он просто оставлен как заглушка?
А, уже сам всё понял, перешёл на 22.
Правда?)
Да, правда. Хитро. Случайно нашёл, изучая интерфейс игры.
Только после 21-ого у меня перешло не на 22-й, а на конец игры )
Только после 21-ого у меня перешло не на 22-й, а на конец игры )
Вообще офигительная игра!..
Еще бы топ самых красивых решений для каждого уровня сделал кто-нибудь. После некоторых уровней очень хотелось увидеть, как их проходят нормальные люди (без «читов»).
Например, lvl15 как по-умному проходить? Там, где можно править только параметры player.killedBy(). Я включал режим Иисуса через попытку клонирования:
валидатор не позволял мне утонуть. Но, на мой взгляд, это костыль, и должно же быть что-то еще.
Например, 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, добавив его ещё раз.
Но я решал тоже через exception, так проще.
Как-то так
'onCollision': function (player) {
player.killedBy('whatever');},'onCollision': function (){ ('whatever');
}
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);
}
});
А вот про эксепшены я почему-то не подумал, несмотря на название.
Самое простое решение
player.killedBy(none);
Кстати, босса можно убить без использования телефона. Вообще, это можно сделать одной кнопкой. И без переопределения чего-то существующего. Кто еще догадается?
Я рисовал линию в точке старта, триггер коллизии с линией спавнил пули и тупо закидывал босса ими
Скрытый текст
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
gist.github.com/anonymous/efe382b17347dc4bde55
не зря же в заголовке написано exceptional =)
Как-то так
function () {throw 'Режим Иисуса!'}
Мне понравилось все: задумка, дизайн, интерфейс, музыка. Вот бы побольше таких игр.
Кстати, кто как 9 уровень прошел?
Кстати, кто как 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», без хитростей, а потом пошёл по такому пути:


Скрытый текст
Я «отдавал» block.
В точности моё решение!
А можно смешнее (коллега сделал так):
А можно смешнее (коллега сделал так):
Скрытый текст
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 уровень я даже осознать не успел. Поклацал куда-то и оказался на следующем уровне.
Аналогично, просто все время жал вверх, пытаясь понять, что происходит, и неожиданно прошел. Потом уже почитал код — кажется надо совместить две собаки.
А на 21 ( endOfTheLine.js ) что делать?
Не стану портить удовольствие, поэтому лишь подскажу, что копать надо в сторону меню (^0). После осознания обнаруженного лично я пожалел, что не видел этого в процессе прохождения, появилось даже желание пройти заново.
Помнится, в интервью с Сидом Мейером было такое понятие, как переигрываемость. Как ни странно, у Untrusted этот показатель куда выше, чем у большинства современных игровых поделок.
Помнится, в интервью с Сидом Мейером было такое понятие, как переигрываемость. Как ни странно, у Untrusted этот показатель куда выше, чем у большинства современных игровых поделок.
Ой, упустил! Спасибо, буду копать дальше!
И ещё раз спасибо, однозначно минимальность подсказки оставила место для удовольствия! Если б мог, плюсанул везде! Пойду переигрывать!
А я тоже пожалел и проверил. При игре с чистого листа этой возможности нет до самого конца.
Видимо в этом суть обладания алгоритмом.
Можно просто перепроходить уровни, не сбрасывая игру.
Или выйти на другой масштаб и работать с форком, снаружи «матрицы».
Или выйти на другой масштаб и работать с форком, снаружи «матрицы».
Большое спасибо за ссылку на сию замечательную игру! Надеюсь проект будет развиваться и в один прекрасный день мы увидим там нелинейность, побочные миссии, красивый сюжет и конечно-же больше уровней!
Спойлер
[missing]
Игра действительно прекрасна! Спасибо за два часа чудного времяпрепровождения.
Давненько хотел сделать нечто похожее (в плане игровой процесс = программирование), но почему то прицепился к десктопному приложению с мини интерпретатором. А ведь, оказывается, можно велосипедов не изобретать и использовать JS… надо это хорошенько обдумать.
Только вот босс слабоват :(
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.
Приключенческая игра, в которую играют путем изменения её Javascript-кода