2 Arrowdodger
Здесь все книги по сурсу
http://developer.valvesoftware.com/wiki/Books
Как можешь заметить, ни одной книги об программировании под сурс там нет, увы.
Разобраться во ВСЕМ движке - это дело непосильное. Модеры конкретно выделяют для себя те части, которые они решили модифицировать или внести что-то новое, и уже в этом направлении начинают копать.
Попробую обрисовать некую общую структуру:
1 «Где вы это видели в оригинале?» Начинать нужно именно с этого вопроса. Сумбурные фантазии на тему «телепатического воздействия через стены» стоит отложить на то время, когда будет побольше опыта и понимания логики движка. Сначала стоит сосредоточится именно на модификации уже существующих возможностей. Например, вам захотелось модифицировать AR2 так, чтобы вместо шаров он пускал гранаты. Где гранаты в игре пускаются? Правильно, в СМЖ.
2 «Вы нашли, где это было в игре? Теперь стоит найти, где это место в коде» Да, это очень важно. Если в конкретном случае с гранатами все просто (идем и смотрим в weapon_smg1.cpp), это еще не значит, что так будет всегда. Например, где искать код, отвечающий за конвульсивно дергающиеся от электричества рагдоллы? Здесь нужно идти на первый этап, заметить, что такие рагдоллы остаются от убиенных мегафизкананом, и идти в weapon_physcannon.cpp. Но конкретно там, вы ничего не найдете! Только тщательно отслеживая цепь вызовов можно отследить то место, где создается этот дергающийся рагдолл. Как вы уже заметили, ничего, кроме знания языка вам здесь не поможет. Нужно знать когда, что, в какой последовательности выполняется. От точки, в которую вас привел первый пункт нужно двигаться сразу в двух направлениях: вниз - в функции, которые вызываЕт данный метод, и вверх – в функции, которые вызываЮт данный метод. Это помогает лучше понять механику обработки конкретного события, и дает общее представление об обработке событий вообще.
3 «От частного к общему» Теперь, кода вы проследили всю цепь действий, сопутствующих тому или иному событию, необходимо найти точку общности. Поясню это на примере. Вы хотите изменить вспышку от выстрела из пистолета. Можно идти в код пистолета, и в событии, которое соответствует выстрелу добавить кода (там дымок, или спрайтики каки-небудь). Но это всего лишь частный случай. Общим решением есть модификация DoMuzzleFlash(), которая централизованно обрабатывает все вспышки из всех стволов. Модификация и создание централизованной обработки схожих событий – очень важная деталь грамотного программирования, ибо локализует код и заметно упрощает его отладку и модифицирование. Но это не значит, что всегда стоит стремится к построению обобщенного кода, иногда задачи настолько малы и незначительны, что их эффективнее решать частным подходом.
4 «Документируйте!!!» Абсолютно все изменения, которые вы внесли в движок просто необходимо каким-либо образом помечать, и комментировать. Во-первых, если что-то пойдет не так, как вам хочется, вы сможете всегда найти все места, в которых вы что-то меняли (желательно в тех местах оставлять оригинальный код, чтобы при необходимости его восстановить) . Во-вторых вы просто можете банально забыть, для чего это делали, и что эта модификация привносит в общую картину.
5 «Отладка» Это, на ряду с проектированием, центральнейшее понятие программирования. Ведь нужно не просто писать код, нужно чтобы он работал, а главное – работал правильно. Это слишком обширная тема, поэтому я здесь дам лишь один совет: старайтесь отслеживать поведение своих модификаций. Для этого очень удобно использовать системные сообщения, которые уже в игре будут вас оповещать об процессе выполнения кода.
И еще. Чтобы разобраться в сурсе, нужно под него писать. Никакая книга не заменит вам вашего личного опыта. И ежедневное чтение исходников дает такой же полезный эффект как чтение толкового словаря русского языка или какой-нибудь священной книги (Библия, Тора, Каран. Нужное подчеркнкть)