Разработка UPS — градостроительного симулятора в жанре киберсовпанк двумя поехавшими школьниками

Или как я перестал бояться и полюбил движок Unity

Urban Planning Simulator MaxHunter & Hlebdalf
Urban Planning Simulator MaxHunter & Hlebdalf
Трейлер UPS

Предисловие

Не для славы —для забавы я пишу!

Александр Иванович Полежаев, Русский поэт

Привет. Для начала представлюсь я и своего коллегу комплектом (мы оба учимся в десятом классе):

Коля Егоров 
(я) поверхностный: 3D моделлер, программист, дизайнер
Максон Девятериков
(коллега) Программист олимпиадник, вебщик

Данная чрезмерно обширная простыня по сути является рефлексией и самоанализом. Это не гайд, и не подробная летопись. За период совместной работы двух заблудших душ было много интересного и поучительного, и здесь я хочу затронуть некоторые моменты.

Для кого это написано? В первую очередь, для нас самих. Поэтому это будет максимально длинно и сумбурно, так как хочется зафиксировать этот эпизод из жизни без стеснения угождением гипотетическому читателю. Но если я в итоге смогу заставить вас улыбнуться и довольно сказать «Жиза», или узнать что то новое, то я буду очень рад. И в обчем — вся статья подведет к одной максимально очевидной мысли, которая точно никому не поможет, ибо такие истины знает каждый, но следуют единицы. Итак, к делу.

Оглавление

Пролог

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

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

И всё было б не так интересно, если бы олимпиада не давала привилегии при поступлении в вузы. Делаете в интересной вам сфере практический проект и можете получить путевку в жизнь (конечно, если у олимпиады есть такой профиль). Возможно всё звучит как реклама, но к сожалению, не всё так гладко. Я наверное бы мог написать статью отдельно про НТИ, но всё же здесь хочется воздержаться от негатива и сосредоточится на главном — на разработке игры. Да, в ОНТИ есть профиль разработки игр, и вы действительно можете поступить в ВУЗ делая игры, правда не без оговорок.

И вот в начале года я решил участвовать. Тема профиля — умный город. Надо было разработать градостроительный симулятор. Ну что ж, тема любопытная! Я правда терпеть не могу разглагольствования о урбанистике, и тем паче не люблю градостроительные симуляторы, к тому же данный жанр почти мертв, ведь он сам по себе мало кому интересен, а такие проекты как Skylines радостно оккупировали те немногочисленные умы, что всё таки решили воссоздать свои населенные пункты на полях виртуального пространства.
А значит что? Правильно, надо участовать. Встал вопрос о выборе команды, там вообще рекомендовали 4 человека. К нам как раз в параллель перешёл один господин, о котором было весьма высокое мнение. Ну и толком не знакомясь, я решил его пригласить, к тому же, как мне сказали, он был программистом олимпиадником. Так зародился тандем, я — моделист и дизайнер, он программист и тупо черт. И понеслась!

Друзья, мне очень повезло с напарником, а ему со мной. НО заклинаю ВАС — НЕ рискуйте. Если вы планируете долго заниматься совместным проектом, то будьте уверены в коллеге. Вам может не повезти и потом вы будете жалеть о потраченном времени!

1: В начале был коммит!

Я знаю только то, что ничего не знаю

Сократ, А может и не он лол

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

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

Итак, первого ноября Максимом был создан роковой репозиторий на GitLab!

Тестовый дом. Впервые открываю Unity и осматриваюсь.
Тестовый дом. Впервые открываю Unity и осматриваюсь.

Следует отметить, что на момент начала работ мы не знали конкретных заданий, а посему мы делали скелет: основные механики вроде строительства дорог и домов.

2: Основные положения

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

Николай Васильевич Гоголь, Русский писатель

Концепция

Проект решено было обозвать UPS — Urban Planning Simulator (Unity Pekarev Simulator). Жанр — киберпанк. В чем причины выбора такого жанра? Во первых, я находился под огромным впечатлением от аниме сериала Ковбоя Бибопа — гребаного шедевра, ничего похожего сейчас не выпускают! И самой моей любимой локацией там был спутник Юпитера — Каллисто. Снежная, суровая планета, с явной остылкой не депрессивную Россию 90-ых годов. И я подумал, как же будет круто, сделать хоть что то отдаленно похожее. Я выложил идею Максиму и ему понравилось. Он начал развивать эту линию и придумал примешать сюда СССР, а также сдобрить всё самой нажористой клюквой, что можно себе представить. Итак, проект начал принимать черты: градостроительный симулятор в жанре киберпанк в советском сеттинге. На том и порешили — началась работа.

Идея была такая, есть 4 класса:

  • Пролетариат (низший класс) — самый многочисленный из классов и является важной единицей за которой надо следить. Больше всех падки на агитацию с пропагандой. Также становятся недовольными при слишком большом (в процентном соотношении) буржуев. Поэтому надо либо больше агитировать, улучшать инфраструктуру или урезать (бадум тс) кол-во буржуев. Живут в таких себе панельках и работают на заводах — производят продукцию.
  • Бюрократия (средний класс) — по сути мало отличаются от пролетариата, но они менее падки на агитацию с пропагандой, им больше нравятся Буржуи. Кароче более лояльные нашему руководству пчелики. Живут в панельных домах повышенной комфортности и работают в коммерции и услугах. Приносят валюту.
  • Интеллигенция (высший класс) — равнодушные до агитации, лояльные к буржуям. Проживают в небоскрёбах и работают в научных организациях — приносят очки науки.
  • Буржуазия — немногочисленный паразитический класс. Ничего не приносит, а только жируют на ваши деньги. Относительная польза только в том, что они всегда всем довольны и таким образом повышают среднюю преданность партии. Живут в коттеджах (игровая условность).

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

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

Основные игровые механики

  1. Генерация мира по семечку. Это была не наша идея, а часть требований к проекту. Забегая вперед скажу, что генерация стала самой лучшей стороной нашего итогового «продукта». Генерации будет посвящена отдельная глава
  2. Строительство. Ничего особенного нет, мы нажимаем на кнопку покупки здания, на карте появляется призрак, который мы можем поставить близко к дороге.
  3. Экономика. Если кратко: мы хотели сделать её сложной, с отсутствием правильного выбора. То есть любое действие игрока имеет как положительный, так и негативный эффект, и игрок должен постоянно лавировать и вертеться как уж на сковородке, чтобы извлечь максимальную выгоду из любого действия.

3: Суета вокруг движка

Амбиции — это мечта с двигателем Unity

Элвис Пресли, Да, именно так и сказал

В условиях олимпиады написано: «Требования: знание движка Unity». Как вы думаете, какой движок можно использовать? А любой. Жаль нам об это никто не сказал, так как я имел опыт работы с Unreal и считал его не иначе как промыслом божьим, то печали как моей, так и моего товарища не было конца. А всего лишь надо было спросить организаторов по этому поводу!

Сомневаешься спроси! Сэкономь время и себе и ближнему!

Unity — как много в этом звуке для сердца русского слилось! Как много в нем отозвалось! Одна только мысль о Unity вызывала у меня рвотные позывы. Куча хороров на мобилки и коммунити, которое стало предметом насмешек вообще всех подряд.

Да, вы уже поняли, что познания в си шарпе и Unity у меня были околонулевые. Хотя Максим тоже с опаской смотрел на шарп, все таки мы были оба плюсоводы. Опять же вспоминается Unreal…

Но, забегая вперед я скажу — Unity для меня оказался противоречивым. Краткая рецензия:

Unity держит тебя одновременно и за идиота и за гения. Действительно, написать рабочий код там может ребенок, все максимально для людей. Закинул объект на сцену и повесил на него скрипт — скрипт работает.
Делаешь переменную public и можешь закидывать значение из окна эдитора.
Префабы — очень душевная вещь, работает максимально по тупому и от того только радуешься. Собирать варианты, выстраивать наследования префабов, классная система лодов и так далее и так далее — всё почтенно. И главное быстро. В Unity в отличии от Unreal нет раздражающе огромного количества классов «Из коробки» и другой ненужной чуши. Да, только вот нормальный Render pipeline они тоже не кладут. То что идёт изначально — никуда не годится, только для самых убогих мобилок. Если хочешь сделать хоть пародию на приличную графику — будь добр, скачивай URP и перекомпилируй под него шейдеры. С URP тоже не всё однозначно — но он позволяет картинку приблизить к Unrealовской. Но тут каждому своё, коробочная графика Unreal настолько ядовитая, что тоже так себе. Тоесть то что Unity голый — вроде и хорошо, ибо излишнего мусора нет, но и плохо, что много важного нет.

В общем плюсы по моему скромному разумению:

  • Феноменальная простота если не углубляться в дебри
  • Максимально логичное взаимодействие объектов и их компонентов (я это выделяю как плюс, потому что имхо, в Unreal с этим намудрено)
  • Движок легкий в плане места на жёстком диске
  • Имхо — лучше подходит для обучения чем unreal, так как заставляет лучше понять подкапотные процессы. Много коробочных методов из Unreal надо писать своими ручками

Минусы:

  • Чёртовы обновления, ещё хуже чем в винде. Прилетают каждую секунду, в итоге не делом занимаешься, а обновления устанавливаешь
  • При этом движок все равно не стабилен, постоянно что-то виснет и отваливается
  • Много поистине важных вещей нет из коробки
  • Просто ушлепанская система манипуляции в окне сцены и префабах
  • Очень странное русское коммунити (честно, может мне показалось, но я нигде больше не видел таких чсвшных скидывальщиков официальной документации, на забугорных форумах все куда бодрее, если не сказать добрее)
  • Многие важные вещи вводятся поздно, например IJobs система обладает довольно таки скудной базой информации на оф сайте. Но это поправимо со временем.

Это не сравнение с Unreal. Я бы вообще сказал, что Unity и Unreal для разных задач, команд и бюджетов.

4: Стилистические Припадки

Позвольте вас спросить как художник художника: Вы рисовать умеете?

Остап Бендер, Великий комбинатор

3D:

Ну что тут скажешь, да — у руля дизайна был я. И здесь я немного отойду от хронологии повествования и расскажу про свою область. Использовал я великолепный, умопомрачительный, потрясающий, всеобъемлющий, невероятный, удивительный, чудесный, прелестный, благой, святой Blender. Я каждый раз хохочу, когда адепты своих программных пакетов 3D начинают баталии в комментариях. По моему всем должно быть понятно, что качество итогового результата обратно пропорционален кривизне рук. Обратимся к графику:

По горизонтальной оси прямость рук, по вертикальной - качество
По горизонтальной оси прямость рук, по вертикальной - качество

То есть ваш 3D пакет — ваш вкус не более. Я выбираю Blender, так как он красив, оптимизирован, стабилен, у него гигантское добрейшее коммунити, избыточный для моих хотелок функционал и главное — опен сурс. В довесок к Blender я использовал GIMP. Да, я не очень люблю пиратить. Итак, к дизайну, кратко как получилось то, что получилось:

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

Также комплектом я разработал дизайн типового жилого дома (надпись Have you ever seen the rain ничего не значит, просто моя любимая песня CCR):

Любопытно выглядит

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

Кстати, я постоянно говорю МЫ, хотя за дизайн был ответственен только я. Наша с Максоном работа была максимально повязана, все совершалось с согласия другого. Мы вместе обсуждали дизайн, математическое обеспечение кода, сам код, интерфейс и тд и тп. Правда с началом активной работы в январе я стал всё меньше вникать в код Максима, так как его было уже слишком много, но по математике мы советовались до конца.

В итоге мы набрали референсов:

По хорошему рефы надо набирать перед работой над дизайном, но дурака учи — что мёртвого лечи. Поэтому я продолбал время, хотя первый комплект в формировании дизайна нам в итоге помог

И, спустя много много времени родился он:

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

Кстати, есть интересная история! Во втором отборочном этапе по моделированию было вот такое задание:

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

Следующий дом не заставил себя долго ждать, представляем — дом с балдой (или просто балда):

Мой любимый дом. Есть в нем что то, прям таки советское.

Дальше следовал вот такой домик в нашей классификации… Чтобы свериться смотрите ребус в конце карусели.

Данный дом изначально выглядел скучно, действительно — е*** е***ой,
но моё воспаленное сознание посетила гениальная мысль прицепить сверху красную звезду! Ух, хохотали мы долго, но решили оставить. Не то чтобы это был необходимый дизайн для пародии, но если начал собирать клюкву, становится трудно остановиться.

Далее следовал дом Флешка:

У внимательного читателя мог возникнуть вопрос, вот я показываю Low poly и High poly модели, но они почти ничем по качеству не отличаются, и по полигональной стоимости тоже, в чем тогда смысел? А смысел вот в чём — я планировал на high poly модели нацепить кучу мелких дополнительных объектов: антенн, кондиционеров, пожарных лестниц и проч. И этих дорогих моделек в сумме набегает столько, что лучше не лениться — делать каскады лодов. В итоге до всей этой мелочи руки не дошли, а вот кое какую оптимизацию я в итоге сделал.

Далее были смоделированы вот такие дома. Вот они, слева направо: Денискин Дом (первые два фото), Толчок, Куб и Прямоугольник.

Здесь я бы хотел попросить читателя прощения за то, что скрины из блендера вдруг поменялись на скрины из самой игры. Связано это с тем, что я поздно осознал, что показывать скрины из блендера нечестно, так как там более продвинутый движок рендеринга eevee — и он более дорогой. А в игре всё выглядит в итоге на порядок прискорбней, так как я не смог повторить качество eevee в Unity. Переделывать блендеровские скрины тоже не хотелось, так как исходников этих домов у меня нет (комп с ними накрылся, царствие небесное), и для каждого дома надо провести много рутинных неприятных процедур. В обчем первая половина — блендер, вторая — итоговый результат. Если вы заинтересуетесь — можете повертеть все дома в итоговом проекте, еще раз прошу прощения

С толчком вышла интересная история, я по классике сидел очень поздно и почти засыпал, но при этом отчаянно пытался выдавить из себя некий советский конструктивизм. Хотелось сделать коттедж на подобии тех, что можно встретить на берегах бывшей Грузинской ССР. В итоге я просидел до утра и родил это! После продолжительного сна я не смотря на модель зашёл в дискорд на традиционный созвон. Максим попросил посмотреть, я включил стрим и открыл этот чудесный дом. Повисло молчание, после чего прозвучал вопрос: «Это толчок?» Я и сам был немного поражён увиденным, но Максиму дом понравился, да и он вправду выглядит колоритно, олицетворяет наш проект так сказатб.

По автомобилям — предлагаем читателю определить что за модель из советского автопрома имелась в виду в каждом из приведённых случаев:

UI:

По юаю как и везде хотелось определенной уникальности в стилистике. Достигается это уникалность благодаря фирменному налёту неуклюжести и непрофессионализма, но при большом учстии души. В итоге я решил оформить элементы UI как советские аналоговые приборы и бумажные отсчёты:

Вы наверное ужаснулись и заинтриговались вторым скриншотом, мы к нему еще вернемся!

Но некоторые элементы UI остались из старых версий (прям как у microsoft), вот например круговое меню строительства:

Разработка UPS — градостроительного симулятора в жанре киберсовпанк двумя поехавшими школьниками

Итог по дизайну:

Дизайн получился именно таким, какой он должен получится у человека, который в проекте и кодит, и моделлит, и рисует, и со светом работает. Множество производственных косяков, постоянное переделывание одного в другое, разные принципы и паттерны для разных объектов, чего по сути быть не должно. В итоге один дом сделан на текстурах, другой на материалах, один имеет три каскада лодов, другой два, третий не имеет, и так далее. Конечно сразу надо делать правильно, проблема в том что пока в процессе создания игры, ты не знаешь как будет правильно, как будет эффективно. Имеет ли смысл статический батчинг с маленьким количеством draw call, или лучше оставить всё на откуп spr батчера и при этом сэкономить память? Cтоит ли вообще делать LOD system или лучше опять же экономить память? Стоит ли использовать одни и те же материалы стен, металла, асфальта для каждой модели, или лучше запечь весь комплекс в одну текстуру? Сейчас ты делаешь так, потом требуется другое, а в купе с постоянной торопёжкой и непрофессионализмом создаёт инфернальную смесь.

НО! Мне лично нравится как UPS в итоге выглядит, это ни на что не похоже и имеет свою какую то уникальную душу, хоть и немного, простите за это слово, всратую.

Выводы

Выводы к которым я пришёл занимаясь дизайном и моделлингом, что мне показалось максимально оптимальным, но на таковую по настоящему не претендующие

  1. 3 + 1 каскада лодов для зданий: HighPoly, MidPoly, LowPoly и пустышка.
  2. Вместо покраски по вершинам использовать один единый материал на весь дом, разрешение текстур albedo и normal — UHD, остальное HD
  3. Используем Universal Render Pipeline
  4. Вместо Static combine utility использовать SPR Batcher
  5. Динамический Батчинг тоже помогает, особенно если у вас в сцене достаточно много машин и человечков
  6. Немного постобработки всегда в тему: блюма и виньетты, поставляемых с URP достаточно

5. Генерация

В начале было Слово, и Слово было у Бога, и Слово было Бог.

Евангелие от Иоанна

Здесь описана работа генерации, которую пришлось взять из документации (и немного видоизменить), которую Максим писал по заданию на втором этапе. Хочется отметить, что кому скучно такое описание могут его пролистнуть, но нашим знакомым из программистов, которые видели генерацию всегда после просмотра был интересен алгоритм

Зерно

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

PI * Sqrt(seed) * (seed% 1e9 + 1)

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

Генерация дорог (первая генерация)

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

  1. Создаётся начальная дорога и добавляется в СД
  2. Запускается цикл, который работает до тех пор, пока не наберёт нужное кол-во дорог, либо не превысит ограничение по времени задаваемое пользователем
  3. В цикле:
    -Из СД забирается точка Выбирается угол и длина (по зерну)
    -Находится вторая точка новой дороги
    -Проверяются коллизии новой дороги (с помощью проверки пересечения прямых)
    Если коллизи не обнаружены, то дорога создается и её вторая точка добавляется в СД (также крайние точки дороги добавляются в двумерный массив поля)

Также в цикле находятся minX, minY, maxX, maxY для поиска центра города:

centerX = (maxX + minX) / 2centerY = (maxY + minY) / 2

Генерация кварталов (вторая генерация)

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

  1. Ставит в центр индекс квартала (выбирается по зерну) и добавляет точку в очередь
  2. Заполняет начальные положения кварталов: Всего 8 начальных клеток, из которых заполняется 4 клетки (кол-во кварталов), выбранные с помощью зерна. Каждая выбранная клетка добавляется в очередь
  3. Запускается цикл, который работает до тех пор, пока не заполнит весь массив кварталами и очередь не станет пуста
  4. В цикле:
    -Из очереди забирается точка
    -Проверяются все свободные места вокруг
    -В свободные места ставятся индексы того же квартала
    -Новые точки, которые мы заполнили, добавляются в очередь
Схема генерации кварталов Макс Девятериков
Схема генерации кварталов Макс Девятериков

Генерация парковок (третья генерация)

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

  1. Запускается цикл, который перебирает все дороги:
    -Вычисляется прямая дороги, её длина и угол
    -Запускается цикл, который перебирает все целочисленные длины от 1 до длины дороги (итератор len):
    -Находится точка на расстоянии len от начала дороги
    -Находятся точки по обе стороны дороги
    -Эти точки добавляются в СД с приоритетами, выбираемыми по зерну (раздельно)
  2. Запускается цикл, который работает до тех пор, пока не наберёт нужное кол-во парковок:
    -Из СД забирается точка
    -Проверяется кол-во парковок в квартале
    -Если оно не превышает заданного максимума, тело цикла -продолжается
    -Если кол-во точек в СД меньше либо равно кол-ву парковок, которые нужно достроить, то тело выполняется в любом случае, независимо от предыдущего условия
    -Для парковки в этой точке проверяются коллизии (с помощью пересечений прямоугольников с прямыми)
    -Если коллизии не найдены, то ставится парковка, в этой точке и прибавляется счётчик парковок в квартале (также она добавляется в двумерный массив поля)

Генерация коммерции (четвёртая генерация)

Данный алгоритм работает абсолютно также, как и генерация парковок, кроме проверки коллизий. Тут они проверяются ещё и с помощью пересечений прямоугольников с прямоугольниками

Генерация домов (пятая генерация)

Данный алгоритм заполняет весь оставшийся город домами на основе кварталов и зерна.
Алгоритм:

Запускается цикл, который перебирает все дороги (Дома ставятся пока не закончится место):
-Вычисляется прямая дороги, её длина и угол
-Запускается цикл, который перебирает все целочисленные длины от 1 до длины дороги (итератор len):
-Находится точка на расстоянии len от начала дороги
-Находятся точки по обе стороны дороги
-Выбирается дом для каждой точки (на основе квартала в точке и зерна)
-Проверяются коллизии для этих домов (с помощью пересечений прямоугольников с прямоугольниками и пересечений прямоугольников с прямыми)
-Если у дома нет коллизий, то он ставится

Генерация графа (шестая генерация)

Данный алгоритм заполняет список смежностей (для хранения графа) и два словаря: для перевода объекта в индекс в графе и для перевода индекса в графе в объект. С помощью словарей мы сможем получать быстрый переход между индексом и объектом
Граф в нашей системе нужен для прокладывания маршрутов машин и людей
Алгоритм:

1) Заполнение словарей: Четыре цикла по массивам, построившихся объектов (дома, паркинги, коммерция, перекрёстки) Один из циклов на псевдокоде для лучшего понимания: for (int i = 0; i < Количество домов; ++i) { словарь из объекта в индекс.Add(i-ый элемент массива домов, количество элементов в данном словаре); словарь из индекса в объект.Add(количество элементов в данном словаре, i-ый элемент массива домов); } 2) Заполнение графа: Запускается цикл, который перебирает все пары (ключ, значение) в словаре из объекта в индес: В цикле есть два варианта развития событий: 1) Если это какая-то постройка Запускается цикл, итерирующийся по дорогам, присоединённым к постройке: Запускается цикл, итерируещийся по перекрёсткам, принадлежащим этой дороге: Рассчитывается длина между перекрёстком и постройкой Создаётся ребро с точками в постройке и перекрёстке и данной длиной 2) Если это перекрёсток Запускается цикл, итерирующийся по дорогам, присоединённым к перекрёстку: Запускается цикл, итерирующийся по перекрёсткам, принадлежащим этой дороге: Если ребра между нашим перекрёстком и перекрёстком в цикле нет, то вычисляется длина и создаётся ребро с точками в этих перекрёстках и длиной и данной длиной

Главный файл генерации

В данном файле включаются все функции генерации по очереди. Также в нём изменяется зерно и рассчитывается время.

Разработка UPS — градостроительного симулятора в жанре киберсовпанк двумя поехавшими школьниками

Вывод по генерации

Я считаю, что генерация — пожалуй самое лучшее в этом проекте.

6. Экономика

Законы в основе своей сформированы на беспринципности и безнравственности, что отражает сущность государственности, символизируя возглас дьявола.

Карл Маркс, Немецкий философ и экономист

Еще раз тот скриншот:

Разработка UPS — градостроительного симулятора в жанре киберсовпанк двумя поехавшими школьниками

ЧТО ЭТО ТАКОЕ? — спросите вы. Не знаем — ответим мы.

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

Итак, у игрока есть:

  • Четыре социальных класса
  • Очки науки, деньги, продукция и преданность партии
  • Работы трёх типов: производство, коммерция, наука. В производстве устроены пролетарии, в коммерции бюрократы, в науке интеллигенция. Буржуи не работают — буржуи довольны

Про очки:

  • Деньги нужны на постройку домов, агитационных плакатов и на их обслуживание
  • Агитационные плакаты нужны для повышения преданности партии
  • Преданность партии нужна для повышения прироста новых жителей, так же на прирост жителей влияют коэффициенты свободного жилья и рабочих мест в городе
  • Очки науки нужны для покупки постоянных улучшений, например «Реформа образования: + 0.5% к получаемой науке» за 999 очков науки повысит выработку науки во всём городе на 0.5%. Также можно покупать улучшения для зданий, которые будут давать бафф только этому зданию.
  • Продукция нужна для продажи на бирже. цены там постоянно скачут, и продажа накопившейся продукции в нужный момент может
  • Чем больше зданий и дорог — тем дороже обслуживание
  • и так далее

Почему «И так далее»? А потому что по сути описывать наши мечты бесполезно, я просто показал то, на что мы замахнулись. Всё что мы в итоге реализовали умещено в скриншоте приборной панели сверху, и я вам так скажу, оно совсем непонятно как работает!

Вам знакомо такое чувство, вы впервые заходите в игру с выбором, например Ведьмак 3. Там вам в самом начале говорят, что наш выбор в игре будет влиять на жизни всей вселенной и тд и тп. И ты веришь, искренне. И когда играешь даже не замечаешь, что по сути все выборы фиктивны (вставьте вашу шутку про актуальную политику РФ), и что если ты с Цири выпьешь вместо игры в снежки — получишь самую плохую концовку. Можешь хоть всю игру быть белым рыцарем, буквально ангелом, честным и справедливым, но пара выборов в конце и влияют на всю концовку. Такое конечно убивает

Так причем тут наш UPS? А тут тоже самое. Много циферок. Если покрутить ручки на налоговом эквалайзере какие то циферки поменяются. Если построить дом что то поползёт вверх, а что то вниз. Ты даже можешь на миг подумать, что это случается по твоей воле, но это совсем не так дружище. Вот ты играешь, видишь что что-то происходит и в принципе доволен. Но потом начинаешь вникать и оказывается, что если поставить ЦНИИ РТК в квартале буржуев недовольство резко возрастёт, обслуживание дорог вырастет, цены на бирже обвалятся, люди начнут покидать кварталы. И тут приходит медленное осознание — контролировать это тупо невозможно! Это не ты играешь в игру, а игра играет в тебя. Слишком много взаимосвязей, приправленных косячной логикой. Даже мы с Максимом с трудом можем понять то, что в экономике происходит. Вот такая она, матмодель!

7. Производственный ад

Два товарища решили сделать невозможное. Один перспективный дизайнер, другой опытный программист олимпиадник. Вместе, несмотря на все риски берутся за невыполнимое, они работают в поте лица без сна, преодолевают все препятствия на своём пути и создают шедевр, взорвавший рынок!

Разработка UPS — градостроительного симулятора в жанре киберсовпанк двумя поехавшими школьниками

Мда, к сожалению такое бывает только в кейсах (ненавижу это слово) всяких инфоцыган.

Начнём с того, что на момент начала работы мы с Максимом были едва знакомы, и слава Богу за то, что в плане совместной работы у нас сложилось великолепно. Были недовольства друг другом, непонимания, но в целом в это плане всё прошло относительно гладко.

Другое дело что проект мы делали около трёх месяцев. Один из этих месяцев представлял из себя самый настоящий кранч. Да, мы вставали, завтракали, заходили в дискорд, включали Лэйлу Клэптона и работали по 12 — 14 часов в день, постоянно совещаясь, решая какие то — проблемы. Мы даже взяли отгул из нашего лицея на две недели, чтобы успеть сдать проект в срок. Мы должны были победить. Чем больше мы работали, тем больше понимали, что не выйти в финал нам просто непозволительно, так как слишком много уже потеряно. Получалась такая парабола кранча, когда каждый раз делаешь больше, ведь тебя подгоняет чувство возможного фолла.

Те времена я вспоминаю с благоговением и почтенным ужасом. Я впервые в своей жизни был настолько погружён в любимое дело, каждая поставленная задача, каждый баг, каждый потерянный кадр и лишний полигон, ничего не существует кроме компьютера и угорающего в дс Максона. Тогда я действительно был счастлив, хоть и осунулся ещё сильней. Но мы сделали проект. Сдали его в срок, и хоть нас было двоё, из 10 команд по очкам мы были на втором месте. Заслуженный финал был в наших руках. Это был триумф. Но мы приближаемся к концу нашей истории, и обещанному посылу

Итог

А в итоге финал я слил. Небольшой ликбез, в финале кроме защиты проекта вас ждёт олимпиада по физике и информатике. Я делал ставку на физику, Максим понятное дело на информатику. В итоге организаторы поленились сделать отдельные задания по физике и нашему профилю дали задания для профиля Водная робототехника, где все задачи были на гидравлику. И физику хорошо на нашем профиле не написал никто. Максим же инфу написал очень даже хорошо и благодаря этому таки пролез в призёры. Там еще была мутная история со склеившимися баллами, когда у нас тупо стояли нули за целый блок в проекте, и нам объяснили, что они склеились. Это тема отдельного разговора, как баллы в exсel склеились, и нам на полном серьезе толпа организаторов пыталась впарить, что это нормально. Но это всё пустое нытьё, которым можно заниматься вечно. Факт остаётся фактом, мой товарищ прошёл, а я оказался за бортом, и по сути год подготовки к ЕГЭ был слит в выгребную яму.

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

Не складывай яйца в одну корзину!

Я слишком понадеялся на такого себе престижа олимпиаду, посчитал это лёгким путём. Вложил все силы, все ресурсы «Чтоб уж точно». Много не ходил в лицей, домашнюю работу не делал. Всё для проекта, всё для победы. Еще учитывая, что я много болел. В итоге что, а ничего, дыра в знаниях, маленькая намётанность, полное отсутствие мотивации к дальнейшим действиям. В итоге то оказалось, что мы с Максимом вообще могли работать раз в 5 слабее. Но ради точного успеха мы бились на всю катушку.

Так что я проиграл, проиграл сокрушительно. Что называется разбит на голову. Можно говорить много про эфемерные вещи типа полученного опыта, социальных капиталов и прочего бреда. Но этому всему грош цена, будем честны. В ВУЗы поступают не по опыту, а по дипломам олимпиад.

Так что леди и джентльмены, прежде чем рискнуть и броситься вперёд подумайте, а точно ли у вас есть путь отхода. Проработайте его для начала, если нет. А то даже если вы уверены в победе, всегда могут баллы «склеиться». Всегда может быть несправедливость и всегда вы сами можете не докрутить. Работайте, рискуйте, но всегда помните, куда в случае поражения вы будете бежать

Апдейт

Статья начала писаться 21 мая 21 года, спустя два месяца после финала, но выкладывается только сейчас, так как мне долго не хотелось её публиковать по различным причинам. Буквально четыре дня назад я справился почти со всеми своими кризисами и это один из последних. UPS Точно стал частью нашей с Максимом истории, и слава богу не самой позорной! К чёрту, пусть всё останется в 21 году! 😄
#опыт #арт #геймдизайн #личныйопыт #UPS #Лонгрид

193193
37 комментариев

Друзья, я смотрю пост таки кто то прочитал. Сразу прошу прощения у всех, честно не ожидал что куда то залетит! Писанина то трудно читаемая, причем совсем неполная и скомканная. Надо было лучше писать

21
Ответить

Писанина то конечно неполная и скомканная, но довольно интересно читается, видно что написано с душой, хоть и всратой;)

21
Ответить

Трудностей не увидел, лёгкий до прочтения текст

1
Ответить

Чувак. Если вкратце, то ты:

1. Поставил себе цель (олимпиада)
2. Собрал команду (пусть из двух человек)
3. Совместно с командой сгенерировал идею (как будем достигать цели)
4. Организовал работу
5. Довел проект до конца

Это очень круто. Мало кто из взрослых так может.

24
Ответить

Автор, вы - молодцы! Законченный проект в юности очень, очень многого стоит. По сути, ты уже сейчас хлебнул настоящего рабочего процесса, стал невеликим, но для своего возраста впечатляющим специалистом. Ты уже очень сильно обогнал своих будущих однокурсников на пути софт-скиллов и опыта.
Вложенные сейчас усилия вернутся к тебе в жизни с десятикратной отдачей. Удачи тебе с дальнейшим обучением!
P.S. Посылай проект на ВСЕ КОНФЕРЕНЦИИ, это даст тебе баллы к ЕГЭ. Попробуй в Бауманку на "Шаг в будущее", например - там адекватные люди сидят. Напиши в ЛС, если интересно - подскажу пару лайфхаков.

11
Ответить

Читаю дтф давно, прочитав пост решил зарегаться чтобы оставить коммент. Универ, поступление это конечно правильно, но потом поймешь что это не главное. Вы сейчас на одной планке с умными ребятами, тебе, возможно, кажется: "сделал ставку не на ту лошадь"... Дальше, после универа (да, ты туда поступишь, если не сейчас, через час - пофиг), получив больше жизненного опыта, будешь смотреть вокруг себя другими глазами. И ты поймешь сколько бездарей и откровенно тупых баранов вокруг тебя. И то что ты сделал сейчас это что то из разряда космоса для огромной массы человеков у которых в "блендере" только два цвета белый и желтый (скидка на ценнике в пятерке). Главное не перебирай с чсв и иди к цели. Удачи.

10
Ответить

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

Главное не переживать, у каждого свой путь, у кого-то он длиннее, у кого-то короче, главное продолжать двигаться. Жизнь это не спринт, а марафон.

8
Ответить