ФлеймФорумРазработка игр

Когда же у нас появится нормальный freeware open-source конструктор 3D RPG ? (5 стр)

Страницы: 1 2 3 4 5 6 7 Следующая »
#60
16:03, 29 янв 2011

NPC смогут делать примерно то, что они могут делать в the guild 2  и mount&blade.
Про Гильдию неплохо описано вот тут -  http://www.ag.ru/reviews/europa_1400_the_guild
http://www.lki.ru/text.php?id=2250. Но оценить весь потенциал "живого мира", который там создан можно только поиграв в неё самому.

Но поскольку NPC как в daggerfall-е  не менее 50 000 , то  просчет этого всего будет идти так :
- в некоторой окружности от игрока -  100% детализация действий  NPC  -  т.е. по честным  алгоритмам 
- в той местности (городе) , где находится игрок - 5%    детализация  т.е. по  упрощенным алгоритмам;
-  по остальному игровому миру - 0,1%  детализация  т.е. по  очень-очень упрощенным алгоритмам.

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


@!!ex
> Сделай отдельно NPC движок.
> У тебя с руками его оторвут, если ты реализуешь то, о чем здесь пишешь. Да я
> сам лицензирую для использования в своих проектах.
> Хотя, какова вероятность, что ты не аналог nano?

Сделать отдельный достаточно универсальный модуль на С++, который отвечает за "живых NPC", а потом прикручивать его к RPG - проектам - это правильная идея. Поскольку (несмотря на массу стёба) желающие иметь в своем RPG такой "живой мир"
объявились  - то я попробую найти время и  силы, чтобы это хоть в каком-то виде сделать.  Но когда это будет по срокам сказать не могу. Наше семейство на прошлой неделе решило строить новый дачный дом :) + еще масса проблем. 

Описание функциональный возможностей и подходы к реализации я могу набросать более- менее быстро. А запрограммировать этот модуль, который на прототипе какой-нибудь простенькой RPG сможет хотя бы базовую часть этой красоты исполнять - это  будет не быстро в любом случае.  Думаю,  не раньше, чем через год.
Этот модуль в теории можно будет встроить в любую RPG, в том числе я надеюсь его возьмут ребята из dungeonhack.
Думаю, что я  создам отдельную тему в проектах, посвященную модулю  "живых NPC".

#61
16:05, 29 янв 2011

Iskander
> Давайте лучше сразу код писать по чуть-чуть.

Мой скромный вклад:

#ifndef PACMAN_CHARACTER_ACTOR_H
#define PACMAN_CHARACTER_ACTOR_H

#include "base_actor.h"

namespace pegas
{
  namespace pacman
  {
    using namespace pegas::utility;
    using namespace pegas::dream3d;

    enum eCharacterDirection
    {
      k_characterDirectionRight = 0,
      k_characterDirectionUp,
      k_characterDirectionLeft,
      k_characterDirectionDown,
      k_characterDirectionCount
    };

    enum eCharacterState
    {
      k_characterStateLocked = 0,
      k_characterStateWait,
      k_characterStateMoving
    };

    typedef eCharacterState CharacterState;
    typedef size_t CharacterDirection;
    typedef float CharacterVelocity;

    extern Vector3 g_characterDirections[k_characterDirectionCount];

    struct CharacterCommonConstants: public ActorDataComponent
    {
      CharacterCommonConstants(): _isCommon(true), _isViewedInEditor(true) {}

      virtual ComponentType getType() const { return k_actorCommonConstants; }
      virtual void load(const ISerializer& serializer);
      virtual void save(const ISerializer& serializer);

      float _advance; //упреждение, константа влияющая на то как близко может подойти
              //персонаж к препятствию, прежде чем остановиться перед ним.
              //кроме того, константа используеться при расчетах может ли персонаж повернуть
              //в данную сторону (например при движении вдоль стены)
              //подробное обьяснение и использование смотрите в определении метода
              //turn
    };

    struct CharacterInstanceConstants: public ActorDataComponent
    {
      CharacterInstanceConstants(): _isCommon(false), _isViewedInEditor(true) {}

      virtual ComponentType getType() const { return k_actorInstanceConstants; }
      virtual void load(const ISerializer& serializer);
      virtual void save(const ISerializer& serializer);

      String _spawnPoint;
    };

    struct CharacterSavedState: public ActorDataComponent
    {
      CharacterSavedState(): _isCommon(false), _isViewedInEditor(false) {}

      virtual ComponentType getType() const { return k_actorSavedState; }
      virtual void load(const ISerializer& serializer) {}
      virtual void save(const ISerializer& serializer) {}

      CharacterState     _currentState;
      CharacterDirection _currentDirection;
      CharacterVelocity  _currentVelocity;
    };

    class CharacterActor: public BasePacmanActor
    {
    public:
      CharacterActor();

      virtual bool isTickable() const { return true; }

      virtual void subsrcibeOnEvents();
      virtual void handleEvent(EventPtr evt);

      virtual void onCreate();
      virtual void onTick(MILLISECONDS deltaTime);
    protected:
      virtual bool resetPosition();
      virtual bool startMoving();
      virtual bool stopMoving();
      virtual bool turn(CharacterDirection direction);
      virtual bool lockControl();
      virtual bool unlockControl();

      virtual bool intersectsWithObstacles(const Matrix4x4& position, PhysicsActorsList* actors = 0);
      virtual float computeBoundingRadius();

      CharacterCommonConstants* m_characterCommonConstants;
      CharacterInstanceConstants* m_characterInstanceConstants;
      CharacterSavedState* m_characterSavedState;

    private:
      CharacterCommonConstants* getCommonConstants();
      CharacterInstanceConstants* getInstanceConstants();
      CharacterSavedState* getSavedState();

      CharacterDirection m_prevCheckedDirection;
      Matrix4x4 m_prevCheckedPosition;
      float m_boundingRadius;

      CharacterActor(const CharacterActor& src);
      CharacterActor& operator=(const CharacterActor& rhs);
    };

    
  }//namespace pacman
}//namespace pegas

#endif //PACMAN_CHARACTER_ACTORS_H
#62
16:09, 29 янв 2011

PolariusBear
> Наше семейство на прошлой неделе решило строить новый дачный дом :)
Кто-то на этом форуме сказал давно, уже не помню кто, про разработку энтузиастов. "Если люди хотят делать игру - они ее делают. Если хотят чтобы сделали за них - то они рассказывают друг-другу о том как они хотели бы делать игру, но вот совершенно неожиданно начался ремонт, сгорел комп, умер любимый хомячок и т.д.".

#63
16:14, 29 янв 2011

Merelalkar
Какой крутой код. Совмещая полученный код (типа повторное использование и базарная разработка) получаем

#include "pacman_character_actor.h"

int main (int argc, char **argv){
CharacterActor * NPCs = new CharacterActor[50000];
 bool finished = false;
  while (!finished){
       for(int i=0;i<50000;i++){
           // вот здесь надо поставить свич из действий, предложенных slatazan'ом.
       }
  }

Дело двигается, чо.

#64
16:52, 29 янв 2011

PolariusBear
> Но поскольку NPC как в daggerfall-е не менее 50 000 , то просчет этого всего
> будет идти так :
> - в некоторой окружности от игрока - 100% детализация действий NPC - т.е.
> по честным алгоритмам
> - в той местности (городе) , где находится игрок - 5% детализация т.е. по
> упрощенным алгоритмам;
> - по остальному игровому миру - 0,1% детализация т.е. по очень-очень
> упрощенным алгоритмам.
>
> Похожая схема уменьшения детализации расчетов будет применяться в зависимости
> от
> - внимания игрока к жизни конкретного NPC
> - от принадлежности NPC к определенному типу
> - от прямого или косвенного участия NPC в событиях, связанных с квестами.


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

К каждому персонажу можно прицепить скрипт (в игре заскриптованы далеко не все персонажи), который выполняеться в каждой итерации игрового цикла. При этом:
-если игрок находиться в закрытой локации (внутреняя), то выполняються все скрипты для обьектов в этой локации.
-если игрок находиться на открытой местности, выполняються все скрипты для обьектов в ячейке, в которой находиться игрок и во всех смежных ячейках.
Таким образом скрипты могут изрядно сказаться на производительности. Этим злоупотреблять нельзя.

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

#65
17:06, 29 янв 2011

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

Алекс адресно-восклицательный предлагает дело..
case: Персонаж пытается искать счастье, пока этого страдальца не прикончат.
Тоже сложный пакет, потому-что само счастье трудно формализовать для юнита.
Может-быть убийство игрока будет доставлять юнитам счастье, но для этого
нужно внедрять правила ММОРПГ, когда игрок постояно  возрождается и бежит мстить.

#66
17:13, 29 янв 2011

Далее.

Насколько я помню в Балморе по улице гуляют около 15 персонажей. Все остальные жители города  - в зданиях. Еще наверное 10 существ из местного бестиария гуляют в ячейках, прилегающих к городу. Сама Балмора располагаеться на четырех ячейках.

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

Кажеться в одном интервью, разработчики Обливиона оправдывались что их RadianAI, которым они на Е3 хвастались, на самом делале способен симулировать жизнь NPC. Просто они не успели сделать необходимые наборы анимаций.

#67
17:29, 29 янв 2011

*зевает*
А в готиках все скриптами было сделано. И выглядит лучше, чем в этих ваших морровиндах.

#68
17:31, 29 янв 2011

PolariusBear
УДД - это Уровень детализации действий;
камера - это Фото-камера-игрового-кадра;
фрустум - это пирамидка - это попадание в фото-кадр.

//  просчет будет идти так :
- фрустум камер (в том числе камера от игрока) - 100% УДД (полный чеснок).
- в дву-мерных квадратах рядом с важными героями игры - 50% УДД (чеснок без визуализации).
- в локациях , где находятся важные герои - 10%  УДД (урезаный чеснок).
- в наборе глобальных участников игры (спец-юниты, скрипты, переменки) - 1% УДД (обман и тасовка заготовок).

Потребуются, как-минимум, три библиотеки, которые будут влиять на нашу библу "Жизнь замечательных юнитов"..
1. Навигация на рпг-местности (версия поиска пути).
2. Построение квэстов для честных юнитов (шаблоны с гарантиями малой баговости исполнения и зачёта квэстов).
3. Реализатор диалогов (подобие бредо-генератора - честные юниты всегда готовы излить свою бредо-душу).

#69
18:03, 29 янв 2011

Dan Diamond
Потому что скрипт-язык в морровинде довольно примитивный - раз. И ограничения движка на количество народу в ячейке - два.

Мне чтобы срежессировать массовую драку в Балморе пришлось прописывать в скрипте поведение каждого жителя города. Потому что комбат-ИИ NPC без направляющий руки в игре убог. Монстра можно натравить на персонажа, при этом он будет отбиваться, а все кто рядом (включая стражников) будут ходить мимо как ни в чем не бывало.
Нельзя к примеру прописать в скрипте:

var victimID = getNearestCharacter();
startCombat(victimID);

Потому что функции (дать ИД ближайшего персонажа) в скрипт-языке нет. А параметр startCombat должен быть непременно константой.
Если в кадре дереться больше десяти персонажей, через пару минут игра вылетает в windows даже на современных компах.


Я так понимаю участники проекта openmw, уже расшибли лоб об эти ограничения и решили написать свою игровую машину. Среди прочего они хотят сделать питон в качестве альтернативного скрипт-языка и расширить набор команд.

#70
18:09, 29 янв 2011

Merelalkar
// прогулка, нападение, преследование.
Можно попытаться усилить фазы поведения..
1. холостая прогулка.
2. рельсовое движение. (наткнулся на рельс и решил по нему пройтись)
3. агресия (желание напасть или испытать ново-изученые комбо-удары).
4. участие в бою.
5. мольба в бою (врезка попытки обмануть или добиться дружеского соглашения).
6. бегство (не желание вступать в бой или попытка выйти из боя).
7. отшельничество (избегание общения - боязнь гриппа, либо лидер залечивает раны и боится показать слабину).
8. преследование неких меток, включая позицию героя, которым управляет игрок. (смысл преследования разный).

Холостая прогулка..
Юнит назначает себе квадрат, где он будет случайно шляться и, при каждом удобном случае, назначать
себе "время передыха", в которое он будет стоять и выбирать "холостые анимации" (зевать, оглядываться).
Направление для движения избирается , учитывая процент УДД.

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

50% - можно тупо выбрать случайное направление и длительность топания по нему - во-время шагов, можно
подрулить или сменить фазу поведения.

10% - холостяки не ходят, а лиш перебирают иногда "на что могут натолкнуться, если-бы шлялись".

1% - холостяков не просчитывают вообще - если что-то угарное произошло у соседних юнитов, то
холостяков могут сразу поставить в гараж (его домик, подвал или укромное место) или убить-стереть.

// ---
Часто, юниты имеют фазу поведения и некие дополнительные ихние свойства плавно пытаются
сменить фазу. Также могут быть свойства, которые явно держат Смысл текущей фазы - как-только
юнит теряет этот смысл, то и фаза подвергается пере-выбору (придётся найти следущую фазу).

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

#71
18:16, 29 янв 2011

PolariusBear
> несмотря на массу стёба
Масса стебя относится к вам и вашему предложению "хочу игру, сделайте"
А к самой идеи никаких претензий нет.

#72
18:27, 29 янв 2011

Подтянулись еще люди, которые в теме - это очень хорошо :))
Merelalkar, спасибо за описание технологии поведения NPC в Morrowind. В принципе, я догадывался исходя из анализа функций скриптового языка TESCS, что там всё примерно  так и есть.

В Morrowind и  Oblivion расчет только "честный" (хоть и не очень много видов активности NPC).Поэтому там можно просчитать не более 100  NPС и только на данной территории.

Я могу поднять форум под названием "живой RPG  мир", на котором все желающие смогут участвовать в разработке общего диздока по "живому миру". Там я могу сделать много разделов по конкретным техническим и функциональным вопросам. Идея интересна ?

А когда общими усилиями сделаем диздок - можно будет уже начинать чего-то программировать.

#73
18:44, 29 янв 2011

PolariusBear
> Я могу поднять форум под названием "живой RPG  мир", на котором все желающие
> смогут участвовать в разработке общего диздока по "живому миру". Там я могу
> сделать много разделов по конкретным техническим и функциональным вопросам.
> Идея интересна ?
На отдельном форуме тема загнется.
Если хочешь что-то делать - делай здесь.
Только тебе самому много придется делать, иначе даже здесь с тысячами посетителей тема загнется, если ее не развивать.

#74
18:50, 29 янв 2011

В одной теме всё будет скомкано, как в куче.  К тому же, модерация всё-таки нужна.
Можно сделать свой форум,а  новые идеи оттуда выкладывать в тему на gamedev.

Страницы: 1 2 3 4 5 6 7 Следующая »
ФлеймФорумРазработка игр

Тема в архиве.