Показать сообщение отдельно
Старый 22.06.2018, 21:18
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 3  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Навряд ли тут вообще есть какие-то линейные решения. Если пойти линейно, то всякое живое существо должно наследоваться от сундука, так ведь? Ибо у любого существа, которое может быть убито, есть какой-то лут: мясо для готовки, ингридиенты для алхимии, компоненты для крафтинга (шкуры, рога, клыки, перья, чешуя и тп), а у человекоподобных вообще любые предметы (в Скайриме добавили "правдоподобности", и в хищниках можно найти мелкие неперевариваемые предметы — монетки, кольца, драгоценные камни))) Даже в самой "минимально навороченной" игре должна быть возможность что-то взять с трупа хотя-бы босса, оружие или квестовый предмет. Но при этом сам набор лута генерится только после смерти рандомно (в пределах возможного для данного вида предметов). То есть лут есть у Трупа, а у живого есть Поведение, которого нет у трупа. Должны ли это быть разные классы?
Нужна ли неписям система слотов для экипировки? Нужно ли нам разбираться (на уровне Модели, не Вью), что вот это надето на ноги, а это — на голову? Или достаточно списка вещей? Если неписи могут иметь дополнительное, то есть НЕ экипированное оружие, доспехи и амулеты, то нам нужно будет знать, какие предметы были экипированы и значит создавали активные эффекты, баффы и резисты. Кроме того, экипированные предметы не могут генериться после смерти непися. А дополнительные могут. Достаточно ли иметь список экипированного — для отображения персонажа и расчета эффектов, а после смерти генерить дополнительный список скрытого лута, и не иметь при этом менеджер слотов как у Героя, которого мы постоянно переодеваем и меняем оружие "вручную"? Ну, в Скае неписи иногда меняют оружие во время боя, лучники могут вытащить топор, а маги кинжал, если мана кончилась) А еще оружие можно выбить из рук.
Могут ли животные и монстры иметь эффекты и лечиться во время боя? А если это какой-нибудь волк-компаньон мага, или боевой конь — может маг на него накладывать резисты или баффы и лечить во время боя?
От таких нюансов может зависеть система наследования и архитектуры классов вообще.
Всегда можно попробовать вынести что-то из Персонажа в Досье о персонаже, то есть не хранить данные О персонаже непосредственно в нем самом, а брать из справочника по айди. Ежу понятно, что вся игра крутится вокруг Героя и все так или иначе замыкается на него. Но должно ли это "всё" именно храниться непосредственно в свойствах экземпляра Героя, или можно хранить это в "досье"? Название локации, координаты героя на локации, список квестов и их активные стадии, прогресс в умениях и прочие статистики — все ли нужно пихать в один объект? Ты и сам уже заметил, что вслед за данными подтягивается и их обработка: не успеешь глазом моргнуть, как экземпляр персонажа начнет у тебя проверять расстояние до стен в коридоре и траекторию полета стрелы, шанс попадания и время суток. Как только появляется нужда в обработке, следом приходит нужда в дополнительных данных из внешнего мира, и ты начинаешь ломать голову, как Герою запросить погоду или количество детей вот этого торговца... Данные должны (в идеале конечно) храниться там, где они обрабатываются. Если программа из совершенно разных мест постоянно лезет в один и тот же объект за данными, которые нужны ей только в ЭТОМ месте, значит что-то пошло не так. Пример: Менеджер квестов не должен дергать экземпляр Героя, чтобы узнать активную фазу текущего квеста. Он должен знать это САМ. Герой — один. Менеджер движения/локации не должен спрашивать у Героя его координаты — он должен хранить их САМ, они больше никому не нужны. Герой не должен хранить в себе специфические данные "для кого-то одного". Можно хранить данные, которые нужны многим и не должны быть рассинхронизированы так, что один менеджер считает что здоровье 100, а другой насчитал 15. Тогда есть смысл.
__________________
Reality.getBounds(this);


Последний раз редактировалось Wolsh; 22.06.2018 в 21:35.