В программировании есть такое понятие, как паттерны. Суть этого явления в том, чтобы свернуть типовые распространенные в программировании структуры, проблемы, события или последовательности действий до одного-двух слов. Так, программист, общаясь с коллегой, может просто сказать "у меня есть фабрика, генерирующая адаптеры" и это заменит собой долгие и пространные объяснения архитектуры, о которой он говорит.
Мне нравится брать информацию из самых разных источников и к сфере геймдизайна ее применять. В частности, на этот раз я хотел бы поговорить о паттерне "Одиночка" (Singleton), который в мире программирования весьма распространен.
Суть его в том, что вопреки самой сути понятия "класса" (пусть будет: деревья) и "экземпляров" - конкретных его представителей (в нашем случае какие-нибудь "береза" или "дуб"), паттерн "Одиночка" подразумевает, что экземпляр может быть только один, аналогов ему в данном контексте или вообще в природе нет.
Так, например, одно-единственное дерево в центре села, стоящего посреди пустыни, будет по сути из себя этот паттерн и представлять. "Дерево" - вроде как имя нарицательное, деревьев в мире много, но когда в таком селе будут говорить "дерево" в контексте "встретимся у дерева" или "а дерево тогда еще было куда меньше, чем сейчас" - все будут очень хорошо понимать о каком дереве сейчас идет речь.
Конечно, первое, что приходит на ум - это чисто сюжетная интерпретация этого шаблона, весьма распространенная, надо сказать. Все эти крутые парни, слишком крутые, чтобы с кем-нибудь союзничать или дружить. Приходят в город из ниоткуда, уходят в никуда. Понятно откуда романтический образ подобного персонажа: человек - существо социальное, никому не нравится быть самому по себе, а уж путешествовать в одиночестве по каким-нибудь пустошам, в которых людей отродясь не бывало, и при этом, найдя оазис других людских существ, бежать от общения с ними и грубить вместо того, чтобы рассказывать какого размера ты видел однажды осу - все это свидетельства внутреннего стержня, уверенности, силы; такой образ не может зрителя не прельщать.
Но такая фигура, на мой взгляд, сильно избита, да и грубить, чтобы вслед за этим сразу же драться, противопоставляя себя целой толпе живущих общиной людей, - слишком пластмассовый сюжет получается.
В цикле "Города красной ночи" Уильям Берроуз рассказывает о том, что часто в произведениях бармены встают на сторону одиноких путников якобы - такие вот они хорошие парни, эти бармены - но это, говорит автор, заблуждение. "Бармены всегда будут стоять на стороне местных, они же деньги на них делают," - утверждает в моей вольной трактовке его слов Уильям Берроуз.
Об "уникальности" нашего альтер эго или ключевых персонажей в той или иной игре говорить не хочется - это все понятно и так - все эти истории про Избранного, о котором мы сперва в книгах читаем или от старейшин в начале игре слышим, чтобы потом самим же этими Избранными и стать. Хочется же поговорить об уникальности и единственно-в-своем-родности на примере совсем других вещей: существ, событий и обстоятельств.
Вот, например, лошадь в Ведьмаке - Искорка вроде или Искра, я не силен в этой франшизе. Чуть ли не полноценный персонаж и все же - всего лишь инструмент под седоком, который и есть наш альтер эго. Я плохо представляю себе умеет ли она прибегать туда, где нам нужна, но - насколько помню - в Red Dead Redemption есть твоя лошадь и ты можешь в любой момент вызвать ее свистом туда, где в данный момент стоишь, но при этом можешь и сменить эту лошадь на какую-то другую, чтобы прибегала теперь уже та. На мой взгляд, это куда удобнее, чем в GTA постоянно ловить попутку.
Чего-то подобного мне, честно говоря, и не хватает в играх со свободным миром. Ну не можешь ты прийти и, не заплатив, лечь в чужую кровать. Не можешь рыться в ящиках не своего стола, если тебя кто-нибудь видит. Не можешь садиться в первую попавшуюся тачку, выбив ей окно, и при этом разъезжать, никем не пойманый. Всегда есть люди, у которых своих дел нет, которым до тебя еще как есть дело, которые будут смотреть, может быть попытаются вмешаться, как минимум копам позвонят, увидев, что ты с разбитым окном едешь. А уж копы постараются отреагировать на звонок - они же деньги на местных делают
Я помню как играя в GTA 3 с ее исчезающими машинами, припаркованными возле дома, и постоянной потребностью "ловить мотор", чтобы вытащить оттуда водителя и место его занять, я через пару циклов "сохраниться, домой - на миссию" почувствовал, въезжая во двор своего дома, тепло. Это был ничем не примечательная голая бетонная коробка с гаражом. Но само то, что это было чем-то "моим", чем-то личным, ассоциирующимся у меня со мной, с моим альтер эго, я испытал прилив окситоцина (как будто бы дом меня обнимал). Именно этого ощущения, что "я поменял тачку" и не хватает мне в той же самой GTA, где всегда можно безнаказанно поймать на улице автомобиль получше, бросив посреди улицы свой.
Но не всякий клинок, не всякая лазерная винтовка, получившая собственное имя или уникальную модификацию, по-особому раскрашенная или побывавшая в максимальном количество боев в наших руках, автоматически в одиночку превращается.
Закрыв глаза на те ассоциации, которые вызывает во мне само название шаблонного решения, я бы хотел какими характеристиками обуславливается этот паттерн программирования сказать, из чего он состоит. Их две:
1. Экземпляр может быть только один, он создается в самом начале или в момент первого обращения и дальше кто бы не спрашивал, всегда отдается по запросу именно он, а не другой какой-нибудь.
2. Класс является по сути "единой точкой входа", то есть "все дороги ведут в Рим".
Я не знаю, честно говоря, как переложить это на более жизненную ситуацию. Что-то вроде дворецкого, который направляет к своему хозяину, если тот уже дома есть. А если нет, то... поднимает его с постели? вызывает по телепортации его?
На языке программирования с этой ситуацией и правда приходится сталкиваться чаще, чем можно себе представить. В самом начале у нас нету того, что нам нужно, но к тому моменту как у нас впервые попросят - все необходимое уже наверняка должно быть и тогда-то мы и создаем это самое что-то, которое в будущем будем отдавать по запросу снова и снова, алгоритм пишется как-то так:
- нет никого? -> создать
- вернуть,
(независимо от того, что там до этого про "нет никого?" было)
Думаю, перед нами ситуация про джинна в лампе, который от первого потирания его жилища появляется и представляется, называя правила и рассказывая кто он есть, старается успеть до того, как ему начнут задавать вопросы. Но дальше, потом, от каждого потирания лампы просто из нее вылазит, уже не представляясь и правила не объясняя. Обычно нам показывают и аргументируют это фразой "о, как долго я спал!" при первом появлении магического исполнителя желаний, а дальше джинн ведет себя так, что отныне у него новый хозяин и пришло время быть готовым всегда, не спать.
Точка респавна, на мой взгляд, максимально близка к понятию синглтона. Где бы и при каких бы обстоятельствах ты ни умер, в какой бы момент у тебя не отключили свет или ты сам не выключил бы игру, ты всегда вернешься в определенную, единственную точку и оттуда начнешь. Начало уровня для игр более или менее казуальных тоже, получается, вполне себе синглтон.
Надо отметить, что термин одиночка неразрывно связан с самим понятием уникальности - об этом можно будет еще отдельно потом поговорить. О параметрах и структурах, методах генерации и тому что это вообще такое - быть непохожим ни на что.
А вот "единственная точка доступа" - это интересно: что-то вроде воронки, чтобы жидкость всегда попадала в узкий канал. Что-то вроде невидимых стен, которые не позволят тебе выйти за пределы тех обстоятельств, в которые тебя поместили. Закрытые наглухо двери, нарисованные, которые даже за ручку подергать нельзя, непробиваемые стены, хотя рядом запрограммированные на это стены можно выстрелом из базуки пробить.
Это все заставляет задуматься о принуждениях в играх. О том, чтобы отнять управление у игрока и показать ему что произошло дальше в формате "просто сиди и смотри". О том, чтобы дать свободу, но свободу ограниченную - ты можешь выбрать оружие, из которого стрелять будешь, но никто не позволит тебе врагам своим мировую предложить.
Ограничение, кстати, распространяется не только на игрока, на нашего с вами альтер эго, свобода игровых персонажей, управляемых компьютером, и вовсе порой чудовищна по своей сути - ее просто нет. Я отлично помню то чувство унылости и искусственности, которое испытал, когда встретил в World of Warcraft'е крестьянина посреди леса, на берегу моря, он сказал мне, что ждет корабли, что скоро здесь будет поселение. Мне стало грустно от ясности того, что он здесь так и будет всегда стоять, заткнув топор за пояс, исполняя текстовый приказ создавших его людей, не имея возможности поспать или поесть, почесаться, пошутить, полюбоваться лесом вокруг него и побережьем, стремящимся к горизонту вдаль.
Думаю, если кому и удалось создать паттерн одиночка таким, каким я себе его вижу, то это - создателям мультика "Рик и Морти" - в третьей серии второго сезона, где целая планета захвачена одним-единственным разумом - Unity - и диалоги, происходящие между главными героями и ней, воплощенной сразу всеми жителями одного из городов, перетекают с одного из них, на другого, к кому-то еще - от старенькой бабушки к почтальону, продолжаясь новыми и новыми обращающимися к ним голосами, пока герои по улице куда-то идут.
Понятное дело, что отсылка эта - к мастерам игр D&D, к тому, что если мастер шепелявый, то шепелявыми окажутся и все персонажи его, ничего уж не попишешь. А если кто-нибудь расстроил планы мастера где-нибудь в пещере, за тысячи шагов от того места, где происходит сейчас действие для игроков, то и от торговца, ничего не ведающего о замысле автора игры, вряд ли стоит ждать добродушного поведения и хороших скидок за удачную шутку того или иного игрока.
Когда задумываешься о подобных вещах в нашей, текущей реальности, приходится признать, что, возможно, "коллективное бессознательное" - это не выдумки, не сборище архетипов, которые впитываются нами вместе с культурой в процессе воспитания и познания мира, а самый что ни на есть живой организм, который общается с нами посредством других людей, разделяющий с ними их волю внутри них, но способный брать на себя управление обстоятельствами, складывающимися из поведения всех остальных вокруг него людей.
Господи, помилуй