Неплохой доклад про бекенд EVE Online с GDC. Больше про то, как меняли подход к сервисам и культуру в команде.
Несколько моментов отметил в Твиттере:
- 7k C++ файлов, 12к SQL файлов, 20k на Питоне и...260к+ файлов и 50+ миллионов строк YAML'а 🤯
- Начинали с кучи сервисов, которые, по сути, меш организовывали. Из-за этого сложно вводить/выводить новые подсистемы. Одна жирная БД. Для выкатки обновлений нужна вся команда, Монолит.
- Потом сделали xml поверх http апишку с агрессивным кешированием.
- Переехали на k8s (когда он ещё был в превью).
- Взаимодействие сверисов сделали через message bus, что позволило кучу технического долга сбросить. Начали с Google pub/sub, потом пересели на Rabbit.
- Ранее гоняли json'чики, потом переехали на протобаф, который органически помог выделить домейны и структурировать данные, т. к. с json'ами такой надобности не было, а тут прям протокол, по сути, форсит это делать.
Ещё одна причина выбора протобафа — работа с gRPC. На базе моделей генерили C++ и Питоновский код. И...питоновский код использовал маршалинг в сишечку, что ещё и ускорило всё.
- 30% времени уходило на 3 вещи: сериализация, передача данных, мультиплекс (например, когда игрок стреляет, то это сообщение нужно прокинуть сотням других игроков). И третье практически бесплатно получается с message bus. А вот с сериализацией и передачей проблемки.
Даже не смотря на быструю сериализацию, всё равно нужно ждать глобального лока, который ждёт результата от C++ кода. Тут я не совсем понял, что он имел ввиду, но, судя по всему, они ВСЁ связанное с gRPC вынесли из Питона в C++ часть и там в отдельных тредах обрабатывали 🤔
Новые технологии не особо сложны, большая проблема в команде была именно в культурном плане. Когда столько лет работаешь с легаси и монолитом, то мыслишь определённым образом. Николас говорит, что именно этот аспект работы и культуры было тяжелей всего переломить и изменить.
Из забавного. В команде в первые годы был принцип: если ты не можешь загуглить это, то не используй 😅
https://www.youtube.com/watch?v=RR0YTEEMLFg
P. S. держите в уме, что в первые годы разработки игры не было ни gRPC, ни Кубера, ни многих ныне популярных подходов.
#eve #GDC
Несколько моментов отметил в Твиттере:
- 7k C++ файлов, 12к SQL файлов, 20k на Питоне и...260к+ файлов и 50+ миллионов строк YAML'а 🤯
- Начинали с кучи сервисов, которые, по сути, меш организовывали. Из-за этого сложно вводить/выводить новые подсистемы. Одна жирная БД. Для выкатки обновлений нужна вся команда, Монолит.
- Потом сделали xml поверх http апишку с агрессивным кешированием.
- Переехали на k8s (когда он ещё был в превью).
- Взаимодействие сверисов сделали через message bus, что позволило кучу технического долга сбросить. Начали с Google pub/sub, потом пересели на Rabbit.
- Ранее гоняли json'чики, потом переехали на протобаф, который органически помог выделить домейны и структурировать данные, т. к. с json'ами такой надобности не было, а тут прям протокол, по сути, форсит это делать.
Ещё одна причина выбора протобафа — работа с gRPC. На базе моделей генерили C++ и Питоновский код. И...питоновский код использовал маршалинг в сишечку, что ещё и ускорило всё.
- 30% времени уходило на 3 вещи: сериализация, передача данных, мультиплекс (например, когда игрок стреляет, то это сообщение нужно прокинуть сотням других игроков). И третье практически бесплатно получается с message bus. А вот с сериализацией и передачей проблемки.
Даже не смотря на быструю сериализацию, всё равно нужно ждать глобального лока, который ждёт результата от C++ кода. Тут я не совсем понял, что он имел ввиду, но, судя по всему, они ВСЁ связанное с gRPC вынесли из Питона в C++ часть и там в отдельных тредах обрабатывали 🤔
Новые технологии не особо сложны, большая проблема в команде была именно в культурном плане. Когда столько лет работаешь с легаси и монолитом, то мыслишь определённым образом. Николас говорит, что именно этот аспект работы и культуры было тяжелей всего переломить и изменить.
Из забавного. В команде в первые годы был принцип: если ты не можешь загуглить это, то не используй 😅
https://www.youtube.com/watch?v=RR0YTEEMLFg
P. S. держите в уме, что в первые годы разработки игры не было ни gRPC, ни Кубера, ни многих ныне популярных подходов.
#eve #GDC
YouTube
Quasar, Brightest in the Galaxy: Expanding 'EVE Online's' Server Potential with gRPC
In this 2022 Online Game Technology Summit session, CCP Games’ Nicholas Herring explores why CCP is using gRPC as a solution to enhance EVE Online's massive player battles, how gRPC works within EVE's server architecture, and the opportunities this independent…
👍16
А, между тем, на Хабре вышел занимательный пост про создание графического бота для EVE Online на C# в WinForm.
https://habr.com/ru/post/685798/
#eve
https://habr.com/ru/post/685798/
#eve
🔥5🤯2👍1
Совместная статья сотрудников Unity со специалистами из Arm про перенос встроенных шейдеров в Universal Render Pipeline.
Разработчики из Arm недавно перенесли проект с Built-in Render Pipeline на Universal Render Pipeline (URP) и решили поделиться своим опытом с сообществом.
https://blog.unity.com/technology/migrating-built-in-shaders-to-the-universal-render-pipeline
#unity #arm
Разработчики из Arm недавно перенесли проект с Built-in Render Pipeline на Universal Render Pipeline (URP) и решили поделиться своим опытом с сообществом.
https://blog.unity.com/technology/migrating-built-in-shaders-to-the-universal-render-pipeline
#unity #arm
Unity
Unity Blog
👍8
This media is not supported in your browser
VIEW IN TELEGRAM
Очередная милая анимация, сделанная в Blender.
https://twitter.com/gensho_yasuda/status/1565897378523070464
#Blender
https://twitter.com/gensho_yasuda/status/1565897378523070464
#Blender
❤19🔥5
This media is not supported in your browser
VIEW IN TELEGRAM
Художник сделал более 125 лоуполи-моделей зданий, которые вы можете использовать в любом из своих проектов.
Всё по лицензии CC0 1.0 Universal.
https://www.reddit.com/r/gamedev/comments/x4135m/ive_made_125_fantasy_building_models_you_can_use/
Скачать с Гугл Драйва: https://drive.google.com/drive/folders/1h7sztlZyavWla-JDk3jp6KiWDdMh08yd
Поддержать можно на Патреоне: https://www.patreon.com/quaternius
#халява
Всё по лицензии CC0 1.0 Universal.
https://www.reddit.com/r/gamedev/comments/x4135m/ive_made_125_fantasy_building_models_you_can_use/
Скачать с Гугл Драйва: https://drive.google.com/drive/folders/1h7sztlZyavWla-JDk3jp6KiWDdMh08yd
Поддержать можно на Патреоне: https://www.patreon.com/quaternius
#халява
🔥35
Недельный геймдев: #85 — 4 сентября, 2022
📜 Обновления/релизы/новости
- Создатели Crypt of the NecroDancer начнут издавать игры других инди-разработчиков
- Sony купила Savage Game Studios
- Google добавила сторонние способы оплаты в Play Store для ряда стран
- Дебютный трейлер RPG Maker Unite
- Wicked Engine теперь в Steam
- Defold 1.3.5
- Пабло Добарро показал CozyBlanket 2.0
🆓 Халява/раздачи/бандлы/курсы
- Художник сделал более 125 лоуполи-моделей зданий, которые вы можете использовать в любом из своих проектов
- Unity Tools Humble Bundle
📝 Интересные статьи/видео
- «Если ты не можешь загуглить это, то не используй»: про разработку EVE Online
- Порт Another World под Linux на R
- Документалка о том, как Disco Elysium переводили на русский язык
- Какие технологии, процессы и решения используют в Allods Team при разработке на Unreal Engine 4
- Разработка выживастика по мотивам Чернобыля на Unreal Engine
- Создание графического бота для EVE Online на C# в WinForm
- Совместная статья сотрудников Unity со специалистами из Arm про перенос встроенных шейдеров в Universal Render Pipeline
- VFX в Returnal: можем ли мы сделать это с помощью частиц
- Архитектура в видеоиграх: как здания влияют на левел-дизайн
- Использование Exoscript для приручения «нарративного осьминога» из I Was a Teenage Exocolonist
- Внеочередной урок по Godot 4.0: пиксели и RPG
- Dreamscaper: убийственная боёвка с инди-бюджетом
- 3 урока сторителлинга от Inscryption
- Настройка эффекта объёмного тумана в Unity
- Flutter Flame: ускоряем в 32 раза работу со столкновениями
- Скрытое давление PowerWash Simulator
- Как создать звук диалогов как в Celeste и Animal Crossing, используя Unity
- Переосмысление демоверсии 10-летней давности на UE4 в Unreal Engine 5
- Переоценка пределов: работа со светом в Ratchet and Clank: Rift Apart
- Зачем идти к студиям портирования: интервью с сооснователем компании Samustai
- Создание аутлайна в качестве постобработки в Unity
- «Kickstarter был нашим самым ценным маркетинговым инструментом»: опят разработчика Backpack Hero
- Создание игр для CD-i в 2022 году
- Простой способ моделирования одежды в Blender
- Первые шаги в Unity с OpenXR
- Автоматическое тестирование и проверка смены лодов посредством контролируемого обучения
- Путешествие в Nanite Брайана Кэриса из Epic Games
📙 Разное
- Реалистичная версия LoFi Girl, созданная в Blender и UE5
- Очередная милая анимация, сделанная в Blender
- Дождь, созданный в Blender с помощью геометрических нод
- Вышла финальная часть документального фильма про «Аркейн»
- Занятные боевые анимации в игре в анимешном стиле
#gamedevnews #дайджест
📜 Обновления/релизы/новости
- Создатели Crypt of the NecroDancer начнут издавать игры других инди-разработчиков
- Sony купила Savage Game Studios
- Google добавила сторонние способы оплаты в Play Store для ряда стран
- Дебютный трейлер RPG Maker Unite
- Wicked Engine теперь в Steam
- Defold 1.3.5
- Пабло Добарро показал CozyBlanket 2.0
🆓 Халява/раздачи/бандлы/курсы
- Художник сделал более 125 лоуполи-моделей зданий, которые вы можете использовать в любом из своих проектов
- Unity Tools Humble Bundle
📝 Интересные статьи/видео
- «Если ты не можешь загуглить это, то не используй»: про разработку EVE Online
- Порт Another World под Linux на R
- Документалка о том, как Disco Elysium переводили на русский язык
- Какие технологии, процессы и решения используют в Allods Team при разработке на Unreal Engine 4
- Разработка выживастика по мотивам Чернобыля на Unreal Engine
- Создание графического бота для EVE Online на C# в WinForm
- Совместная статья сотрудников Unity со специалистами из Arm про перенос встроенных шейдеров в Universal Render Pipeline
- VFX в Returnal: можем ли мы сделать это с помощью частиц
- Архитектура в видеоиграх: как здания влияют на левел-дизайн
- Использование Exoscript для приручения «нарративного осьминога» из I Was a Teenage Exocolonist
- Внеочередной урок по Godot 4.0: пиксели и RPG
- Dreamscaper: убийственная боёвка с инди-бюджетом
- 3 урока сторителлинга от Inscryption
- Настройка эффекта объёмного тумана в Unity
- Flutter Flame: ускоряем в 32 раза работу со столкновениями
- Скрытое давление PowerWash Simulator
- Как создать звук диалогов как в Celeste и Animal Crossing, используя Unity
- Переосмысление демоверсии 10-летней давности на UE4 в Unreal Engine 5
- Переоценка пределов: работа со светом в Ratchet and Clank: Rift Apart
- Зачем идти к студиям портирования: интервью с сооснователем компании Samustai
- Создание аутлайна в качестве постобработки в Unity
- «Kickstarter был нашим самым ценным маркетинговым инструментом»: опят разработчика Backpack Hero
- Создание игр для CD-i в 2022 году
- Простой способ моделирования одежды в Blender
- Первые шаги в Unity с OpenXR
- Автоматическое тестирование и проверка смены лодов посредством контролируемого обучения
- Путешествие в Nanite Брайана Кэриса из Epic Games
📙 Разное
- Реалистичная версия LoFi Girl, созданная в Blender и UE5
- Очередная милая анимация, сделанная в Blender
- Дождь, созданный в Blender с помощью геометрических нод
- Вышла финальная часть документального фильма про «Аркейн»
- Занятные боевые анимации в игре в анимешном стиле
#gamedevnews #дайджест
Suvitruf's Blog :: Gamedev suffering
Недельный геймдев: #85 — 4 сентября, 2022 | Gamedev suffering
Из новостей: создатели Crypt of the NecroDancer начнут издавать игры других инди-разработчиков, Sony купила Savage Game Studios, Google добавила сторонние способы оплаты в Play Store для ряда стран. Из интересностей: «Если ты не можешь загуглить это, то не…
👍6🔥5
This media is not supported in your browser
VIEW IN TELEGRAM
Разработчик поделился гифкой того, как его ситибилдер менялся в течение 2-х лет.
Такие снапшоты полезно и для себя делать, чтоб оценить прогресс 😎
https://www.reddit.com/r/Unity3D/comments/x0ksvw/2_years_of_work_on_my_city_builder_in_one_gif/
Такие снапшоты полезно и для себя делать, чтоб оценить прогресс 😎
https://www.reddit.com/r/Unity3D/comments/x0ksvw/2_years_of_work_on_my_city_builder_in_one_gif/
🔥14❤2
Очередная крутая документалочка от NoClip. В этот раз про разработку Rogue Legacy 2 и, в том числе, про их приключения в раннем доступе.
https://www.youtube.com/watch?v=p3aFy8F0aRw
#NoClip #RogueLegacy2
https://www.youtube.com/watch?v=p3aFy8F0aRw
#NoClip #RogueLegacy2
YouTube
The Making of Rogue Legacy 2 | Noclip Documentary
Support us on Patreon ► https://www.patreon.com/noclip
or Join Noclip on YouTube (similar perks!) ► https://bit.ly/3nH3FUf
SUBSCRIBE for More Free Game Docs ► http://bit.ly/noclipsubscribe
We talk to Cellar Door games about their challenging journey to…
or Join Noclip on YouTube (similar perks!) ► https://bit.ly/3nH3FUf
SUBSCRIBE for More Free Game Docs ► http://bit.ly/noclipsubscribe
We talk to Cellar Door games about their challenging journey to…
👍3🔥3
Вышел Blender 3.3 LTS. Из ключевого:
- Совершенно новая система по работе с волосами с использованием нового типа объекта Curves, который поддерживает режим Sculpt и гибкость геометрических нод. Система на основе частиц по-прежнему доступна, можно преобразовать между этими двумя системами.
- Обновления конвейеров анимации, моделирования и риггинга.
- Улучшения рабочих процессов Grease Pencil.
- Усовершенствования Cycles, в том числе, добавлена поддержка карт AMD Vega и Intel Arc.
https://www.blender.org/press/blender-3-3-lts-release/
#blender
- Совершенно новая система по работе с волосами с использованием нового типа объекта Curves, который поддерживает режим Sculpt и гибкость геометрических нод. Система на основе частиц по-прежнему доступна, можно преобразовать между этими двумя системами.
- Обновления конвейеров анимации, моделирования и риггинга.
- Улучшения рабочих процессов Grease Pencil.
- Усовершенствования Cycles, в том числе, добавлена поддержка карт AMD Vega и Intel Arc.
https://www.blender.org/press/blender-3-3-lts-release/
#blender
blender.org
Blender 3.3 LTS Release — blender.org
The first long-term release of the 3.x series is here, Blender 3.3 LTS!
👍6🔥5
Порт Quake 1 на Apple Watch 🤔
Исходники по лицензии GPL-2.0.
https://github.com/MyOwnClone/quake_watch
#Quake
Исходники по лицензии GPL-2.0.
https://github.com/MyOwnClone/quake_watch
#Quake
👍10🔥6💩1
База данных клонов/ремейков старых игр с открытым исходным кодом.
https://osgameclones.com/
#opensource
https://osgameclones.com/
#opensource
👍15❤4🔥3
Unity выложила пример проекта по работе с UI Toolkit в Asset Store.
Сам ассет: https://assetstore.unity.com/packages/essentials/tutorial-projects/ui-toolkit-sample-dragon-crashers-231178
В ближайшее время ещё выйдет книга по работе с UI в Unity: https://create.unity.com/user-interface-design-implementation-in-unity
#unity
Сам ассет: https://assetstore.unity.com/packages/essentials/tutorial-projects/ui-toolkit-sample-dragon-crashers-231178
В ближайшее время ещё выйдет книга по работе с UI в Unity: https://create.unity.com/user-interface-design-implementation-in-unity
#unity
🔥10👍3
This media is not supported in your browser
VIEW IN TELEGRAM
Как подобрать скорость анимации в зависимости от размера существа.
https://tore-knabe.com/game-development-how-much-to-slow-animation-down-for-giant-creatures/
https://tore-knabe.com/game-development-how-much-to-slow-animation-down-for-giant-creatures/
👍11🔥1
Весьма занятный тред на Реддите с заголовком «Кому-нибудь ещё кажется, что вы никогда не понимали основ программирования, но всё равно продолжаете этим заниматься».
Множество людей поделилось своим опытом.
Как говорится, Fake it till you make it 😅
https://www.reddit.com/r/gamedev/comments/x3liv6/anyone_else_feel_like_you_never_understand_the/
Множество людей поделилось своим опытом.
Как говорится, Fake it till you make it 😅
https://www.reddit.com/r/gamedev/comments/x3liv6/anyone_else_feel_like_you_never_understand_the/
Reddit
From the gamedev community on Reddit
Explore this post and more from the gamedev community
😁10🔥3😱2
Недельный геймдев: #86 — 11 сентября, 2022
📜 Обновления/релизы/новости
- Вышел Blender 3.3 LTS
- Quake 1 портирован на Apple Watch
- База данных клонов/ремейков старых игр с открытым исходным кодом
- Unity выложила пример проекта по работе с UI Toolkit в Asset Store
- Вышел Flax Engine 1.4
- Zibra Liquids получила экспериментальную поддержку Android
- AMD выпустила FSR 2.1
🆓 Халява/раздачи/бандлы/курсы
- Unity Art Humble Bundle
- Бесплатный контент в Unreal Engine Marketplace за сентябрь 2022
- Геометрические ноды для создания морских анемонов
📝 Интересные статьи/видео
- Очередная крутая документалочка от NoClip про Rogue Legacy 2
- Как милая эстетика Cult of the Lamb позволила разработчикам исследовать более мрачные темы
- Как подобрать скорость анимации в зависимости от размера существа
- 10 принципов хорошего левел-дизайна
- Небольшой туториал по созданию оружия в ZBrush
- Создание концептов для стилизованной анимации Airborn в UE5
- Энтропийное декодирование в Oodle Data: x86-64 3-потоковые декодеры Хаффмана
- От абстрактной идеи к готовой механике: как гейм-дизайнеру составить ТЗ для программиста
- Кто самый топовый инфлюинсер на YouTube в плане поиска инди-игр
- Эксперименты с Vertex Animation Textures из Houdini в UE5
- CoreGrafx и SuperGrafx — История консолей NEC. Часть 2
- Телепортация игрока в Unity с OpenXR
- Создание средиземноморского города в 3ds Max, Unreal Engine 5 и Substance 3D
- Как привлечь первых пользователей в свою игру или приложение
- Как разработчик Runescape работает с игроками, чтобы помочь MMO адаптироваться и процветать
- Как отправлять письма (маленьким) ютуберам
- Производство креативов для мобильной игры с нуля
- Чего игроки на самом деле хотят от новых игр
- Анализ сессий пользователей — важный инструмент построения активации
- Подробное руководство по системе нод Rain.Water
- Почему идейный наследник Paragon перешёл на Unreal Engine 5
- Кому-нибудь ещё кажется, что вы никогда не понимали основ программирования, но всё равно продолжаете этим заниматься
- Создание мира The Ascent
- Как создать собственный кодстайл для C#
- Что происходит с российской игровой индустрией
- Создание диорамы заброшенного паба в ZBrush, Maya и Substance 3D
- Ключевые момент от Unity на SIGGRAPH 2022
- Ray marching и создание трёхмерных миров с помощью математики
- Культура и процесс найма в Kwalee
📙 Разное
- Разработчик поделился гифкой того, как его ситибилдер менялся в течение 2-х лет
- Занимательные города в дарк-фентези стиле в…Minecraft
- Трансформация человеческого лица с помощью Stable Diffusion и EbSynth
- Удаление видеокарты в игре
- Воссоздание способы анимирования света из Quake
#дайджест #gamedevnews
📜 Обновления/релизы/новости
- Вышел Blender 3.3 LTS
- Quake 1 портирован на Apple Watch
- База данных клонов/ремейков старых игр с открытым исходным кодом
- Unity выложила пример проекта по работе с UI Toolkit в Asset Store
- Вышел Flax Engine 1.4
- Zibra Liquids получила экспериментальную поддержку Android
- AMD выпустила FSR 2.1
🆓 Халява/раздачи/бандлы/курсы
- Unity Art Humble Bundle
- Бесплатный контент в Unreal Engine Marketplace за сентябрь 2022
- Геометрические ноды для создания морских анемонов
📝 Интересные статьи/видео
- Очередная крутая документалочка от NoClip про Rogue Legacy 2
- Как милая эстетика Cult of the Lamb позволила разработчикам исследовать более мрачные темы
- Как подобрать скорость анимации в зависимости от размера существа
- 10 принципов хорошего левел-дизайна
- Небольшой туториал по созданию оружия в ZBrush
- Создание концептов для стилизованной анимации Airborn в UE5
- Энтропийное декодирование в Oodle Data: x86-64 3-потоковые декодеры Хаффмана
- От абстрактной идеи к готовой механике: как гейм-дизайнеру составить ТЗ для программиста
- Кто самый топовый инфлюинсер на YouTube в плане поиска инди-игр
- Эксперименты с Vertex Animation Textures из Houdini в UE5
- CoreGrafx и SuperGrafx — История консолей NEC. Часть 2
- Телепортация игрока в Unity с OpenXR
- Создание средиземноморского города в 3ds Max, Unreal Engine 5 и Substance 3D
- Как привлечь первых пользователей в свою игру или приложение
- Как разработчик Runescape работает с игроками, чтобы помочь MMO адаптироваться и процветать
- Как отправлять письма (маленьким) ютуберам
- Производство креативов для мобильной игры с нуля
- Чего игроки на самом деле хотят от новых игр
- Анализ сессий пользователей — важный инструмент построения активации
- Подробное руководство по системе нод Rain.Water
- Почему идейный наследник Paragon перешёл на Unreal Engine 5
- Кому-нибудь ещё кажется, что вы никогда не понимали основ программирования, но всё равно продолжаете этим заниматься
- Создание мира The Ascent
- Как создать собственный кодстайл для C#
- Что происходит с российской игровой индустрией
- Создание диорамы заброшенного паба в ZBrush, Maya и Substance 3D
- Ключевые момент от Unity на SIGGRAPH 2022
- Ray marching и создание трёхмерных миров с помощью математики
- Культура и процесс найма в Kwalee
📙 Разное
- Разработчик поделился гифкой того, как его ситибилдер менялся в течение 2-х лет
- Занимательные города в дарк-фентези стиле в…Minecraft
- Трансформация человеческого лица с помощью Stable Diffusion и EbSynth
- Удаление видеокарты в игре
- Воссоздание способы анимирования света из Quake
#дайджест #gamedevnews
Suvitruf's Blog :: Gamedev suffering
Недельный геймдев: #86 — 11 сентября, 2022 | Gamedev suffering
Из новостей: вышли Blender 3.3 LTS и Flax Engine 1.4, Quake 1 портирован на Apple Watch, Zibra Liquids получила экспериментальную поддержку Android, AMD выпустила FSR 2.1. Из интересностей: база данных клонов/ремейков старых игр с открытым исходным кодом…
👍15
В честь дня программиста на Fanatical можно урвать бесплатно 4 книги:
- Creating Games with Unity, Substance Painter and Maya
- Game Audio with FMOD and Unity
- 2D Game Development with Unity
- Punk Playthings
https://www.fanatical.com/en/bundle/international-day-of-the-programmer-free-giveaway
#книги
- Creating Games with Unity, Substance Painter and Maya
- Game Audio with FMOD and Unity
- 2D Game Development with Unity
- Punk Playthings
https://www.fanatical.com/en/bundle/international-day-of-the-programmer-free-giveaway
#книги
Fanatical
All Bundles
Looking to try awesome new games at prices you won’t believe? Fanatical’s bundles offer the deals for you! Featuring the...
❤15
2D Game Development with Unity 9780429328664_webpdf.pdf
48.8 MB
Для тех, кто не может скачать книги с Fanatical.
❤43👍9