fonzeppelin: (Default)
[personal profile] fonzeppelin

Записано по байкам знакомого. Как человек, от программных материй далекий, не могу поручиться ни за правдивость, ни за точность, ни даже за правильность изложения. Но могу поручиться, что забавно)










Где-то в далеких 90-ых, группа энтузиастов-программистов делала игрушку — приключения героя в вампирском замке. Делали на достаточно примитивных возможностях, и в итоге так и не доделали, но работа шла довольно долго и даже с некоторой продуктивностью. И все бы было хорошо, но тут появилось оно.


Зеркало. 


Огромное такое зеркало во всю стену, которое висело в холле замка. Программисты недовольно ворчали – мол, зачем оно вампирам, они ж не отражаются – но, поворчав, все же согласились…



Поскольку это были 90-ые, то создавать зеркала в видеоиграх приходилось дедовским методом: неразрушимая прозрачная стена, по ту сторону которой точно такая же комната. Когда игрок входил в холл, по ту сторону зеркала немедленно генерировалась его точная копия, повторяющая все его движения. Тяжело, занудно, объемно, но работало. А в данной ситуации даже и хорошо: поскольку вампиры в зеркале отражаться не должны, то и можно было ограничиться одной лишь копией игрока. Выходило атмосферно и даже где-то изящно.


ЗАЗЕРКАЛЬНЫЙ ВОР


Как уже упоминалось выше, зазеркальное отражение было точной копией персонажа игрока. И воспроизводило его со всеми переменными. Благо, перменных-то было не очень много: несколько видов доспеха, отличавшихся в основном цветом, и оружие в руках. Поэтому при генерации зазеркальной копии, игра просто выдавала ей такое же оружие и снаряжение, что и игроку.


И тут возникла проблема.


Некоторое оружие и снаряжение в игре были уникальными, существующими в единственном экземпляре. Игра вела учет положению такого вот снаряжения, и если игрок терял или бросал его, оно оставалось на прежнем месте. 


Когда персонаж, несущий уникальное снаряжение, входил в зеркальный холл, игра, естественно, пыталась выдать такое же снаряжение его отражению. И тут возникало противоречие: уникальный объект в двух местах одновременно.


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


В худшем случае, игра вручала-таки зазеркальной копии уникальное оружие, затем проверяла его положение, и затирала старое. То есть отбирала уникальный предмет у игрока, и отдавала копии. И извлечь объект из зазеркалья не было уже никакой возможности.


После долгих мучений, проблему решили, создав копии каждого уникального предмета в игре, и всучив их зазеркальному двойнику. Теперь при генерации двойника, игра сначала проверяла наличие у игрока уникальных предметов, и вызывала их копии. Правда, периодически игра все равно путала где что находится, и у персонажа оказывалась копия (FLAMINGSWORDCOPY, например), но разработчики предусмотрительно сделали копии в точности соответствующими оригиналам.


АГРЕССИВНОЕ ЗАЗЕРКАЛЬЕ


Зазеркальный двойник игрока по сути своей был обычным монстром. Только уникальным, и с отключенной моделью поведения — ее заменили повторением действий игрока. 


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


Расследование необычной агрессивности доппельгрангера выявило следующее: движения монстра в игре не соответствовали полностью движениям управляемого игроком персонажа. Близко, но не совсем. Из-за этого зазеркальная копия иногда оказывалась в ситуации, когда она просто не в состоянии полностью повторить действия персонажа. Например, если игрок персонаж вставал слишком близко к столу, то его зазеркальная копия могла оказаться в положении, когда для этого ей потребовалось бы пройти внутрь стола. 


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


Неоднократые попытки решить проблему застревания в мебели ни к чему не привели. Переделывать модели персонажей и монстров было слишком затратно. Поэтому проблему решили, переведя двойника в категорию «нейтральных» существ, которые не трогали игрока, пока сами не будут атакованы. Например, какая-нибудь корова игрока не атакует до тех пор, пока игрок сам не атакует ее, или другую корову из того же стада (той же суб-категории)


И все стало еще хуже.


С нововведением, агрессивность двойника возросла многократно. Немедленно после генерации, он бросался к зеркалу, и начинал яростно стрелять по персонажу. Все попытки выяснить причину такой предубежденности проваливались раз за разом. Код двойника перебрали буквально по букве, никакой ошибки не нашли, и уже готовились впасть в отчаяние, когда, наконец (совершенно случайно) правда не всплыла на свет.


Оказалось, что все дело было в суб-категориях, деливших нейтралы на группы. В своей субкатегории, двойник должен был быть одним-единственным. Но из-за небольшой ошибки, его «напарниками» по субкатегории оказались... разрушаемые чучела-мишени на стрельбище в начале игры. Атаки на мишени в начале игры настраивали против игрока всю суб-категорию, и к моменту появления зазеркального двойника, тот уже пылал мстительной яростью и мечтал поквитаться за невинно погубленных соломенных братьев. А поскольку ошибка была в мишенях, то, естественно, никакое исследование кода двойника ее не выявляло...


Эту ошибку удалось исправить легко, но вскоре нашлась еще одна: некоторые виды атак (проклятия и т.д.) действовали на всех в пределах видимости, и задевали и двойника. Который после этого терял свой «нейтралитет» и рьяно выступал против обидчика из-за прозрачной стены. Но так как проклятия были в игре вещью редкой, то программисты просто махнули на это рукой, и решили выдать баг за фичу: каждый раз, когда нейтральность двойника нарушалась, игра выводила сообщение «ПОХОЖЕ, ЭТО НЕ ПРОСТО ЗЕРКАЛО...»


ЗАЗЕРКАЛЬНАЯ ГЕОМЕТРИЯ


Как уже упоминалось ранее, зеркало в игру ввели не сразу, а уже на достаточно продвинутой стадии разработки. Естественно, это означало, что зазеркальный холл пришлось впихивать в уже частично готовый этаж замка. И, естественно, вышло это не больно-то удачно — попробуйте-ка в средневековом замке изыскать место под еще один зал, при этом не убирая других комнат!


В результате впихиваний и ужиманий, этаж замка разбух и растолстел, и весьма слабо соотносился с тем, как замок смотрится снаружи. Но это было еще мелочью. Настоящей проблемой оказалось то, что зазеркальный холл не везде удалось упихать правильно, и в некоторых местах он пересекался с другими комнатами. Пересечения, впрочем, были мелкие, провалиться сквозь них в зазеркалье было невозможно, и разработчики сочли, что особых проблем они не создадут.


К сожалению, координатную систему они об этом предупредить забыли.


В результате, в помещениях вокруг зазеркального зала, начали твориться странные (даже по меркам вампирского замка) дела. Торчащие (и невидимые) углы зазеркалья приводили к тому, что одни координаты накладывались на другие. И из-за этого геометрия замка перестала быть евклидовой, а его обитатели массово спятили с ума.


В деталях, все это выглядело примерно так: монстр-вампир видел персонажа, и начинал двигаться к нему. Программа приступала к просчету оптимального — кратчайшего - пути вампира, и в какой-то точке натыкалась на двойные, накладывающиеся координаты, согласно которым вампир должен был оказаться в комнате на другом конце замка. Такой путь явно не был оптимальным, программа пыталась изыскать новый, но поскольку вампир уже довольно слабо понимал, где он находится, результаты... как правило удручали. А то и пугали.


Некоторые вампиры начинали, забыв про персонажа, бешено бегать кругами, уставившись в одну точку. Другие, видя персонажа в двух шагах, разворачивались и выбегали из комнаты, оббегали по кругу весь этаж (пытаясь обогнуть зазеркальный зал в центре)  и вбегали с противоположной стороны. Некоторые вообще решали, что находятся в зазеркалье, и пытались двигаться, строя маршрут по зазеркальному залу — бегать по несуществующим лестницам, огибать несуществующую мебель. Стрельба персонажа по вампирам выглядела не лучше — пули и стрелы выписывали странные траектории, кружились в воздухе, вылетали из комнаты.


В отчаянной попытке решить проблему, программисты не нашли ничего лучшего, как «заткнуть» точки пересечения координат различными непроходимыми препятствиями. Комнаты и коридоры вампирского замка заполонились стоящими в произвольных местах колоннами, шкафами, вазами с цветами и фонтанами. Такое решение хоть и не устранило проблему вампирского сумасшествия, но свело ее к допустимому минимуму...

Date: 2021-11-27 05:29 pm (UTC)
From: [identity profile] congregatio.livejournal.com
Мне тут видится та самая картинка с совещанием, где сотрудника выбрасывают из окна, и вопросом "А может, зеркало убрать?" :)

Date: 2021-11-27 05:32 pm (UTC)
From: [identity profile] fonzeppelin.livejournal.com
АААААААААААА, как я до этого не додумался?!

Date: 2021-11-27 05:51 pm (UTC)
From: [identity profile] prostak-1982.livejournal.com
Зачем им устранять все эти дыры? Наоборот, получалось бы еще более психоделично. Один только самостоятельный зеркальный двойник чего стоит. А если бы при каждом вхождении в комнату старый оставался и появлялся новый и они друг с другом дрались...

Date: 2021-11-27 06:00 pm (UTC)
From: [identity profile] fonzeppelin.livejournal.com
Я так понимаю, что некоторые из этих сбоев вешали игру, другие приводили к невозможности завершения уровня (как "уничтожить всех врагов" если последний враг сидит за зеркалом?), плюс нехило напрягали аппаратные возможности...

(no subject)

From: [identity profile] prostak-1982.livejournal.com - Date: 2021-11-27 06:03 pm (UTC) - Expand

(no subject)

From: [identity profile] sam-newberry.livejournal.com - Date: 2021-11-27 06:11 pm (UTC) - Expand

(no subject)

From: [identity profile] fonzeppelin.livejournal.com - Date: 2021-11-27 06:14 pm (UTC) - Expand

Date: 2021-11-27 06:09 pm (UTC)
From: [identity profile] ivan-bub.livejournal.com
"Настало время охуительных историй"

"За что купил за то и продаю"

"Ну ты и душный! Чуток приврать нельзя что ли?"

Date: 2021-11-27 06:13 pm (UTC)
From: [identity profile] sam-newberry.livejournal.com
Как человек, имеющий отношение к геймдеву, могу сказать, что звучит байка вполне правдоподобно. Может, где-то для пущей увлекательности малость приукрасили, ну так это особенность жанра "копипаста".

Date: 2024-07-13 02:51 pm (UTC)
From: [identity profile] vladicusmagnus.livejournal.com

Скажем так, слишком наворочено для того, что бы быть враньем. Хотя метод воссоздания зеркала — прикольный. Можно юзать.

(no subject)

From: [identity profile] sam-newberry.livejournal.com - Date: 2024-07-13 04:11 pm (UTC) - Expand

(no subject)

From: [identity profile] vladicusmagnus.livejournal.com - Date: 2024-07-13 04:26 pm (UTC) - Expand

(no subject)

From: [identity profile] sam-newberry.livejournal.com - Date: 2024-07-13 05:23 pm (UTC) - Expand

(no subject)

From: [identity profile] vladicusmagnus.livejournal.com - Date: 2024-07-15 07:58 pm (UTC) - Expand

Date: 2021-11-27 06:30 pm (UTC)
From: [identity profile] agordian.livejournal.com
Какая-то реальная история за этой байкой стоит. Во всяком случае это норма, когда простецкий заказчик или родной, но недалекий менеджмент дабы "тоже поучаствовать" вносит какое-нибудь гениальное предложение, типа, а давайте оно у нас еще кофе приносить будет. Или как здесь — а давайте зеркало нарисуем! Результат сильно зависит от тим-лида (руководителя разработки). Должен оценить масштаб катастрофы и любыми способами убедить, что лучше он сам кофе в постель будет носить, чем вы сломаете результаты годичной работы. Если ошибется или прогнется, то в лучшем случае такие вот забавные костыли выйдут. В худшем: опять эти тупые программисты все сломали. Даже зеркало нарисовать не умеют! Да я сам в пайнте за 15 минут...

Программировать и управлять государством, как известно, все умеют. Кроме программистов.
Edited Date: 2021-11-27 06:31 pm (UTC)

Date: 2021-11-28 06:13 am (UTC)
From: [identity profile] notvolodyuka.livejournal.com
проблема этой байки в том, что зеркало как раз накодить даже на старых, как говно мамонта, движках, не такая уж и проблема...

(no subject)

From: [identity profile] agordian.livejournal.com - Date: 2021-11-28 09:29 am (UTC) - Expand

(no subject)

From: [identity profile] notvolodyuka.livejournal.com - Date: 2021-11-28 10:52 am (UTC) - Expand

Date: 2021-11-27 06:32 pm (UTC)
From: [personal profile] alll
> Когда игрок входил в холл, по ту сторону зеркала немедленно генерировалась его точная копия, повторяющая все его движения.

А потом гг подходит к зеркалу и например поднимает правую руку, ага.

Напоминает анекдот про то, как гопников позвали резать кабанчика.

Date: 2021-11-27 06:41 pm (UTC)
From: [identity profile] serokoy.livejournal.com
Зеркало, помнится, ещё в Дюк Нюкем 3Д было. :) Интересно, как работало.

Date: 2021-11-27 06:56 pm (UTC)
From: [identity profile] fonzeppelin.livejournal.com
Точно также — копия комнаты за прозрачной стеной.

(no subject)

From: [identity profile] papon-ra.livejournal.com - Date: 2021-11-27 07:41 pm (UTC) - Expand

Date: 2021-11-27 06:46 pm (UTC)
From: [identity profile] midzenis.livejournal.com
>> Как человек, от программных материй далекий
Ой вей, дать человеку поиграться с конфигом RAID 10.

Date: 2021-11-27 08:27 pm (UTC)
From: [identity profile] fonzeppelin.livejournal.com
Не пугайте страшными словами.

(no subject)

From: [identity profile] midzenis.livejournal.com - Date: 2021-11-27 09:19 pm (UTC) - Expand

Date: 2021-11-27 07:06 pm (UTC)
From: [identity profile] van-wylen.livejournal.com
Заказчик потребовал добавить стада кенгуру как деталь ландшафта........(Ц)

Date: 2021-11-27 07:51 pm (UTC)
From: [identity profile] papon-ra.livejournal.com
Будучи студентом, подрабатывал посменно в одной конторе. Как раз вышел Doom II, который требовал Pentium 4, а в офисе такой комп был всего один. Короче, я не высыпался.
И вот однажды под утро, набегавшись и настрелявшись, я внезапно испытал... чувство иступленного поклонения перед изображением во всю стену: это было что-то рогатое, типа головы Минотавра. Чуть на колени не рухнул со стула. Опомнившись, решил что хватит, хорошего помаленьку.
Edited Date: 2021-11-27 07:52 pm (UTC)

Date: 2021-11-27 10:17 pm (UTC)
From: [identity profile] theholm.livejournal.com
С чем то путаете. Doom 2 шел на 386DX.

(no subject)

From: [identity profile] papon-ra.livejournal.com - Date: 2021-11-28 12:50 am (UTC) - Expand

Date: 2021-11-27 08:05 pm (UTC)
From: [identity profile] sigmund-rod.livejournal.com

Ой, что-то это мне напоминает … 😳 ну конечно же, Windows 95! Ну или Vista! Привет Билл Гейтсу и новым виндоусным фичам!!! И как это знакомо - попытка исправить изначально кривую идею, делают всю систему ещё хуже!

Date: 2021-11-27 08:18 pm (UTC)
From: [identity profile] alexeyrakin.livejournal.com

Зеркало очень вредный предмет, был ты красавчик, а вот уже нет. В Метавселенной не должно быть зеркал и проблема уникальности объектов перестанет угрожать её существованию.

Edited Date: 2021-11-27 08:19 pm (UTC)

Date: 2021-11-27 08:40 pm (UTC)
From: [identity profile] alejorojas.livejournal.com
...испацтала! )))

Date: 2021-11-27 09:54 pm (UTC)
From: [identity profile] karpion.livejournal.com
Мне кажется, можно было сделать трассировку лучей с учётом зеркал. Хотя тогда будет сложность с неотрзимостью вампиров.
Ну или надо было делать отражение не монстром с поведением, а чисто марионеткой, которая просто повторяет движения персонажа и игнорирует при этом все возможные препятствия.

Date: 2021-11-28 02:44 am (UTC)
From: [identity profile] aikr.livejournal.com
Мне кажется, можно было сделать трассировку лучей с учётом зеркал. Хотя тогда будет сложность с неотрзимостью вампиров.

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

Ну или надо было делать отражение не монстром с поведением, а чисто марионеткой, которая просто повторяет движения персонажа

Так они именно это и задумывали. Но разрабатывать такую марионетку с нуля опять же долго. Поэтому взяли модель персонажа и заменили готовое поведение на повтор действий игрока. Вот только что-то не учли / где-то ошиблись, и заменили не до конца. А код большой, сложный и запутанный, поди разбери, где там ошибка...

Date: 2021-11-27 10:42 pm (UTC)
From: [identity profile] disco-parrot.livejournal.com
Когда-то, лет 15 назад, была такая ММОРПГ российского производства "Сфера".
И довелось читать на форуме игры пост, где девушка жаловалась на несправедливость.
В игре существовал какой-то баг, который позволял делать дубль шмотки, но использовать этот баг умели не только лишь не все, да и крутой шмот был не у всех. И девушке этой, значит, предложили переспать за крутой шмот, на что она и согласилась, не подозревая о подвохе.
А разрабы, зная о баге, но не умея с ним справиться, периодически уничтожали эти дубли шмота, с чем чуть позже и столкнулась героиня.
Она писала в поддержку, жаловалась в форум, но всё безуспешно. Честно заработанный шмот ей так и не вернули.

Date: 2021-11-28 08:23 am (UTC)
From: [identity profile] mechnik.livejournal.com
Вроде, "Сфера", до сих пор, жива...

(no subject)

From: [identity profile] disco-parrot.livejournal.com - Date: 2021-11-28 09:40 am (UTC) - Expand

(no subject)

From: [identity profile] mechnik.livejournal.com - Date: 2021-11-28 09:53 am (UTC) - Expand

(no subject)

From: [identity profile] Саша Пахомов - Date: 2021-11-29 03:28 pm (UTC) - Expand

Date: 2021-11-27 11:35 pm (UTC)
From: [identity profile] mechnik.livejournal.com
Жесть... От души посмеялся.

Date: 2021-11-28 02:48 am (UTC)
From: [identity profile] aikr.livejournal.com
Как человек, к программным материям (относительно) близкий — ВЕРЮ!

Ещё одна история в копилку:

Ошибка: робот погибает при попадании в него гранаты (именно от попадания, а не от взрыва) Д - дизайнер, П - программист.
Д: программисты всё сломали! почему так получается?!
П: естественно так получается! потому, что у гранаты масса 100 кг! зачем вы это сделали?
Д: да?! а чтобы граната в воде тонула!
П: а почему она с нормальной массой не тонет?
Д: а потому что у воды плотность большая! (прим.: больше, чем у ртути)
П: а почему плотность такая большая?!
Д: а чтобы ящики деревянные плавали!
П: а почему они иначе не плавают?!
Д: а потому что у них масса 50 кг!
П: а зачем такая масса?!
Д: а иначе они некрасиво разваливаются!

Date: 2024-07-13 03:03 pm (UTC)
From: [identity profile] vladicusmagnus.livejournal.com

Классика работы со всякими ОДЕ, НФЕ и иже. Постоянно приходилось на лету менять свойства предметов. Игрока лечге — потому что будучи тяжелым, стремился провалится сквозь землю. Обстановку — тяжелее (для уменьшения самокатания по карте и красоты разваливания (нет, это не шутка ниразу). Ну и так далее и тому подобное. Главное было не запутаться как выше, потому как нездравое поведение вещей было в норме вещей (сорри).


А уж какие баги бывали... Оружие выпавшее из рук убитого врага, застревало между предметами обстановки, и тут его, оружие начинало колбасить, механизм не успел проставить флаг "в покое". После чего, через так пару тысяч итераций, набрав некислую скорость эта хрень вылетала, и по несчастию ровно в игрока. Шанс на такое составлял порядка 8%. После чего, игрок улетал кхерам за границу карты (опенворлд).


Знаем, плавали, плакали. Не понравилось.

Date: 2021-11-28 03:01 am (UTC)
From: [identity profile] john-jack.livejournal.com
Вековым традициям верны: в не таком уж давнем скуриме магазинными манекенами работают обездвиженные, но не лишённые чутья стражники.

Date: 2021-11-28 04:39 am (UTC)
From: [identity profile] racepilot.livejournal.com
Ну из времен работы в геймдеве у меня хватает подобных историй.

Например — в одной довольно известной игре, главное меню было как раз нейтральным монстром. И при определенных условиях оно раздражалось на происходящее вокруг и просто уходило на глазах изумленного пользователя (гоняться за другим монстром, на самом деле).

Date: 2021-11-28 06:09 am (UTC)
From: [identity profile] notvolodyuka.livejournal.com
>движения монстра в игре не соответствовали полностью движениям управляемого игроком персонажа.

вот отсюда видно, что байка, ибо гораздо проще зазеркаленной копии отдать зеркальный ввод команд движения/действия с клавиатуры, вплоть до поворотов бошки (ну для движков и времён в которых уже появилась мышка...)

>попробуйте-ка в средневековом замке изыскать место под еще один зал, при этом не убирая других комнат!

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

но байка забавная, да.

а, алсо: всякие приколы, типа двойника набигавшего на игрока, в старые времена бы попытались превратить в фичу, тогда такое любили. но опять же, этого бы не случилось просто потому, что моделька отражения бы буквально не имела никаких "мозгов" и привязки к группам крипов.
Edited Date: 2021-11-28 06:17 am (UTC)

Date: 2021-11-28 06:44 am (UTC)
From: [identity profile] 3450123.livejournal.com
такие байки имеются в достаточных количествах в любом виде деятельности. помнится про проектировщиков ракетного оружия, которым пришлось делать костыль в виде 500 кг груза (саму проблему не помню, за давностью лет) иначе не летела ракетка.

Date: 2021-11-28 07:35 am (UTC)
From: [identity profile] petr ivanov (from livejournal.com)
Траектории и система управления были посчитаны на старую массу.

Date: 2021-11-28 11:17 am (UTC)
From: [identity profile] coyoteodin.livejournal.com
"игра выводила сообщение «ПОХОЖЕ, ЭТО НЕ ПРОСТО ЗЕРКАЛО...»" — между прочим — шикарное решение проблемы!

Date: 2021-11-30 04:06 pm (UTC)
From: [identity profile] antonkachinskiy.livejournal.com
Прям как рассказ о Бета-тестерах из Лки.....

Date: 2021-11-30 04:43 pm (UTC)
From: [identity profile] fonzeppelin.livejournal.com
О, помню-помню этот цикл! Эх, были времена...

(no subject)

From: [identity profile] antonkachinskiy.livejournal.com - Date: 2021-11-30 04:48 pm (UTC) - Expand

Date: 2021-12-01 07:21 pm (UTC)
From: [identity profile] godmutter.livejournal.com
А если на плоскость зеркала накладывать картинку из камеры, смотрящей из зазеркалья? Какие-то странные у них там программисты.
Edited Date: 2021-12-01 09:04 pm (UTC)

Date: 2021-12-02 03:05 pm (UTC)
From: [identity profile] kobyz.livejournal.com
Это ВДВОЕ поднимало бы нагрузку от просчета. т.е. сначала надо просчитать изображение из камеры а потом изображение для экрана.
При том что в тот момент движки просчитывали ТОЛЬКО те пиксели которые отображаются на экране. На тот момент графика была критична...
Серьезно, наличие второй комнаты совершенно не напрягало движок. Простое и удобное решение. Так и Дюк Нюкеме делали и позже тоже... Никаких сложных фишек, все решается геометрией уровня и парочкой простых скриптов.

Profile

fonzeppelin: (Default)
fonzeppelin

January 2026

S M T W T F S
     12 3
4 56 78910
1112131415 1617
18192021222324
25262728293031

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 19th, 2026 01:29 am
Powered by Dreamwidth Studios