>> | No.49463 >>49399
Пока что там смотреть не на что особо.
Как-то запилил репозиторий на гитхабе, но потом удалил его, очень сырой код у меня пока что, плюс комментарии к тестам на русском, английский подтягиваю, но медленно.
ТТХ: язык Руби. Решил уйти от системы текстовых конфигов/анально огороженных плагинов в пользу расширения прямо из кода (Руби позволяет оформлять очень классные ДСЛи, жалко, что эта тварь не умеет сериализовать контексты). Т.е. есть идея -- пишешь код.
Руби, помимо БОЖЕСТВЕННОЙ работы с различными коллекциями/ООПшными няшными штуками/абстракциями и лакончиности самого кода, дает еще один бонус -- кроссплатформенность. Это значит, что и виндопользователи не будут обижены.
Основные идеи были следующие:
1) Движок, максимально независимый от мира, т.е. возможность запилить как средневековье с эльфийками и лютнями, так и хай-тек мир с бластерами и инопланетянками. Идея эпичная, но все достаточно реально, ибо:
--> Побольше "физики": были введены две базовых сущностей и несколько дополнительных, на базе которых (простите за тавтологию) строился весь мир. К примеру, все делится на
а) объекты/существа -- неодушевленные предметы (дверь из дерева, гранитная скала, кирпичная стена) или одушевленные (от растений до главгероя) И
б) воздействия -- что-то вроде градиента или поля (прости анон), с дискретизацией до уровня клеток (газ, вода, свет, звук).
Например, в некой среде, воздействие "свет" будет распространятся от источника света с клетки с интенсивностью, допустим, 100 (размерности пока не важны) до соседних клеткок и, в зависимости от среды, интенсивность будет убывать.
Скажем, ГГ роняет ключ, от падения он издает звук интенсивностью 10. Рассмотрим ряд клеток по прямой на восток от ГГ:
[@][ ][ ][#][ ]
В первой клетке стоит ГГ, дальше пустота (допустим, воздух), воздух, стена, воздух
В первый ход, звук будет распространятся с такой характеристикой (от балды взял параметры, для наглядности)
[10][0][0][0][0]
Второй ход (звук начинает затухать вроде, но "поле" порожденное воздействием еще увеличивает "охват" клеток (закон распространения тоже от балды):
[9][8][7][2][0] (не забываем, что тут стена, глушащая звук на какую-то величину)
И т.д., до затухания в ноль.
Если "поле" звука или света пропадет без источника достаточно быстро, то "поле" запаха или воды, например, нет.
Т.е. такой полход во-первых позволяет легко смоделировать различные воздействия, как то: тепло, звук, лужу какой-то жидкости (при этом манипулируя различыми параметрами, от текучести до яркости и стойкости к какой-то среде!) и т.д. не прибегая к ресурсоемким расчетам из физики. Во-вторых, позволяет единообразно работать как со светом, отбрасываемым факелами, заклинаниями и бластерами, так и с туманом, волшебными облаками и т.д.
--> Инкапсуляция: доверие объектам и существам самим решать, как реагировать на воздействия. Т.е. объект стена, допустим решает сам, при каком уровне физического урона (интенсивности воздействия "физический урон") что ему делать. К примеру, развалиться на составляющие материалы (кирпичи, для кирпичной стены, бревна для сруба), т.е. породить новые объекты и уничтожить себя; произвести какое-то воздействие в свою очередь (звук, к примеру); отразить воздействие назад и т.д.
К примеру, летящая стрела (объект) из дерева (материал), двигаясь через ячейку А1 генерирует звук (воздействие), врезается в орка, нанося ему физический урон (воздействие), при этом, в грубой трактовке деда Ньютона, стрела сама получает такое же воздействие от удара о броню. Объект орка, проверяет свои характеристики и сам решает, что произошло, попала ли стрела ему в пузо или отрикошетила от кирасы. (утрировано, он может, скажем, увернуться)
--> Система каркасов и подписка на события: наличие большого количества независимых (или относительно независимых) объектов предполагает какую-то модель взаимодействия: материалистическую(каркасы) или идейную(события). Например, при развале ствола гиганского одуванчика, его верхушка должна как-то об этом узнать. Или, снеся все опоры вышки, она сама должна упасть, допустим. При ударе по столу, все предметы, лежащие на нем, как-то должны прореагировать на это. При смерти друга гоблина, гоблин как-то должен прореагировать.
2) Простая, но в месте с тем, гибкая ролевая система. По системе писать много не буду, не оттестил до конца. Знакомства с несколькими самопальными системами, GURPS, AD&D (2, 3 и шапочно с 4кой) и chain reaction сделали свое дело. Основные идеи были:
а) Малое количество уровней. Не люблю всякие jrpg с 100500 lvl, хотелось получить систему, где ГГ давит не уровнем, а мастерством игры с одной стороны, и с примерной оценкой возможностей противников, с прикидкой на их уровень. Разницу между 201 и 212 уровнем заметить как-то сложновато. Каждый лвлап должен быть как праздник. Остановился на системе с 16 уровнями. Уровни идут четверками, в конце четверки еще немного плюшек. 4лвл -- примерно уровень лавочника или студента вуза, 4-8 лвл -- зрелый опытный человек, мастер своего дела, 8-12 -- мегаопытный ветеран, который и коня на скаку и в избу и квантовую физику знает и орков шинкует на раз. 12-16 -- полубожество.
б) Серьезное влияние первичных параметров. Бесят системы вроде недавнего драгонэйджа, где укачивать силу можно было до посинений. Рефлекс: лвл ап, сила +3, ловкость+2, клик-клик, побежали дальше. Такого быть не должно, тепло вспоминаю БГ2, когда часами перекидывались кости, что бы получить на единичку чего-то больше. При потолке в 25 единиц для силы, кольцо +2 к силе очень кстати, и зелья подьема силы тоже имеют тактическую ценность. Т.е. ламповость каждой единички и нервные рассуждения, что с ней сделать. В итоге получилось всего два параметра: телесная характеристика и ментальная. Докинуть куда-то единичку можно только раз в четыре уровня. Да, все так страшно.
в) На скелет этой системы накладывается целый лес деревьев профессий и умений. Который оттачивается как лвлапами, так и чисто квестовыми действиями. Т.е. при изначально скудной ролевой системе (16 лвл, из которых высшая четверка почти недостижима, 2 основные характеристики) получаем огромное количество путей развития и РОЛЕВОЙ отыгрыш. Не буду тут подробно останавливаться, а то и так написал целую поэму.
г) Немаловажная идея: независимость всех объектов. Т.е. существо персонажа -- вор 4го уровня не имеет отличий от такого же существа ИИ, только потому, что он ГГ. Существо расы орк получит больше "здоровья" при рождении, чем существо расы "человек", и с большей вероятностью исход их рукопашной голышом будет не в пользу человека, вне зависимости от того, кто им управляет, игрок или ИИ.
3) Несколько важных архитектурных принципов:
- состояние мира сериализуется (сохраняется слепки кода и данных из памяти на диск). Т.е. решается проблема с точными сохранениями сложной системы с кучей связей, проблема с обновленем кода решается чуть сложнее, но все равно динамизм руби сильно спасает.
- разделение сервера, клиента и протокола друг от друга: не должно быть такой лажи, когда поверх ascii-рогалика натягивают тайловую графику, где буква O и колонна, бочка, унитаз, пробабушка ГГ, ОЗЕРО СКОРБИ, аспиринка и след медведя-гомосексуалиста должны каким-то чудом быть представлены одним графическим тайлом. Есть протокол, значит клиентов можно написать на свой вкус, от хардкорного монохромного ascii-терминала 20 строк на 30 столбцов, с вводом с перфокарт, до браузерного клиента или ламповой изометрии. Протокол четко определяет, что тут у нас стена, тут раковина, тут решетка на полу, их материал т.д.
- Код движка должен быть полностью открыт и готов к изменениям (это значит, быть написаным максимально просто и без хаков). Т.е., если кто-то хочет добавить расу голубых медведей, ему достаточно отнаследоваться от базового класса, реализовать несколько интерфейсов, набросать какой-то ИИ на базе существующих и запускать код на исполнение. Никаких километровых конфигов, плясок с бубном, дизассемблера и тому подобной нечисти. Все под тотальным контролем.
Доброчан, прости за tl;dr, если есть вопросы -- задавай. |