Может кто-то уже задавался этим вопросом, как же все таки построена архитектуры таких масштабных проектов как Дота 2, LOL, etc..., в частности мне интересно послушать про организацию способностей, что они из себя представляют, как реализованы на уровне исходного кода. Если играли, то наверняка замечали, что их там великое множество, довольно четко прописаны правила их взаимодействия, все прямо скажем непросто.
ООП там точно нету (по крайней мере в качестве фундамента так сказать), может какой-то КОП улучшенный.
Сообщение отредактировал zisX - Вторник, 10 Апреля 2018, 02:09
Зайдите в редактор карт Warcraft 3 там же конкретно все объекты показаны, со всеми присущими им свойствами. Явными по крайней мере, а все неявные можно додумать
Разбираться в архитектуре подобных игр рекомендую все-таки на примере вова, а не доты По нему на порядки больше инфы: есть вовхед, есть официальное апи для аддонов которое открывает часть архитектуры, есть даже исходники эмуляторов серверов и т.д.
Ну как я понял, там все таки КОП покрайней мере так кажется, есть какой-то контейнер допустим Герой и у него есть компоненты в виде отдельных объектов (Спелл, Графика и так далее)
Спасибо, за наводку на редакторы WOW я об этом не подумал, на выхах на комп перейду более подробно изучу эту тему
Сообщение отредактировал zisX - Вторник, 10 Апреля 2018, 19:24
Не знаю даже, актуален этот вопрос сейчас для тебя или нет, но все-таки поделюсь. Если рассматривать на примере WoW, то там все устроено довольно муторно (а может и нет): есть клиент, ядро, dbc файлы (некие таблицы данных) и непосредственно сама база данных. В ядре в основном нет конкретного кода для конкретного заклинания или таланта (их там сотни, а то и тысячи - боже упаси все в ядре держать). Вместо этого созданы некие шаблоны действий. Т.к. в игре есть куча способностей, похожих друг на друга - изменяют кд, % регенерации маны и хп, ну и так далее, то нет смысла писать практически идентичный код для каждой способности. Поэтому созданы шаблоны под разные случаи. Коих тоже не мало. Ключевую роль играют dbc файлы - это таблицы, содержащие в себе кучу разной инфы для каждого заклинания. Например: spell.dbc - содержит в себе всю инфу о заклинаниях: название, школа урона (физ., тьма, свет и т.д.), сам урон (или лечение) и куча других разных атрибутов. К нему еще в добавку идет spelleffect.dbc, содержащий в себе информацию о разных эффектах: например понижение чего-то там на такое-то значение для такого-то заклинания такого-то ранга или держит в себе какие-то визуальные параметры. И ядро по общим шаблонам берет инфу оттуда. Еще есть БД, где в таблицах хранится разного рода информация: шанс срабатывания, условия срабатывания (нанесение урона в ближнем бою, к примеру) и многое другое. Так же это все может (и будет) переплетаться. Скажем у заклинания 1 в dbc описано, что он вызывает эффект 2 с таким-то параметром, в свою очередь эффект 2 повышает определенное значение с определенным шансом, который берется из таблицы в БД. Так же, у эффекта 2 в dbc сказано, что он может вызвать эффект 3 и т.д. по цепочке. Но как правило длинных и долгих заморочек нет. В основном обходятся 1-2, может 3мя эффектами (масштабными). Есть случаи, где их больше в разы, но они не отображаются, а нужны для чего-нибудь другого. Это так, если в кратце. На самом деле все еще сложнее. У одних только заклинаний 48 dbc файлов, которые содержат в себе ВООБЩЕ ВСЮ информацию. От А до Я. Таким способом реализованы почти все таланты, большинство простеньких способностей. В самом ядре не так много способностей напихано, есть небольшая кучка (штук 30) для друида, например и т.д. Это связано с тем, что они имеют особую механику, которую нельзя описать шаблонами. Опять же и в их реализации задействованы другие шаблоны.
Вот небольшой кусок кода заклинания друида:
Код
class spell_dru_eclipse_energize : public SpellScriptLoader { public: spell_dru_eclipse_energize() : SpellScriptLoader("spell_dru_eclipse_energize") { }
class spell_dru_eclipse_energize_SpellScript : public SpellScript { PrepareSpellScript(spell_dru_eclipse_energize_SpellScript);
int32 energizeAmount;
bool Load() override { if (GetCaster()->GetTypeId() != TYPEID_PLAYER) return false;
if (GetCaster()->ToPlayer()->getClass() != CLASS_DRUID) return false;
// No boomy, no deal. if (caster->GetPrimaryTalentTree(caster->GetActiveSpec()) != TALENT_TREE_DRUID_BALANCE) return;
switch (GetSpellInfo()->Id) { case SPELL_DRUID_STARSURGE: { // If we are set to fill the solar side or we've just logged in with 0 power (confirmed with sniffs) if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) || caster->GetPower(POWER_ECLIPSE) == 0) { energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 15 caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true);
// If the energize was due to 0 power, cast the eclipse marker aura if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) caster->CastSpell(caster, SPELL_DRUID_SOLAR_ECLIPSE_MARKER, true); } else if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) { energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -15 caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true); } // The energizing effect brought us out of the lunar eclipse, remove the aura if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE); // The energizing effect brought us out of the solar eclipse, remove the aura else if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) caster->RemoveAura(SPELL_DRUID_SOLAR_ECLIPSE); break; } } }
Указывает на шаблонный эффект. Таких эффектов сотни.
Ах да, еще в клиенте куча инфы. Там, конечно, в основном визуальные эффекты, но и сами dbc тоже присутствуют и в некоторых случаях приходится модифицировать клиент (подменять эти dbc), чтобы что-то изменить. Потому что клиент (а может ядро) сравнивает dbc клиента и сервера и в случае каких-то расхождений клиент крашится, либо работает, но не отображает изменения. Вообще так у них построено все взаимодействие. И вещи, и npc, и эффекты и многое, многое другое. я, конечно, не полностью во всем разобрался, но все выглядит примерно так.
Сообщение отредактировал Autotunage - Понедельник, 04 Июня 2018, 23:03