Я некоторое время назад снова вернулся к этой идее и в свободное время пилил механику, с помощью которой модульные стволы можно пилить и пилить независимо друг от друга.
Теперь немного о механике:
Каждый ствол состоит из модулей, каждый из которых выполняет ту функцию для которой создан изолированно от других модулей. Единственное взаимодействие между модулями, это то какой модуль к какому прикреплен и какие модули можно прикреплять к этому модулю.
ПРИЧИНА зачем я сделал проверку на возможность прикреплять модули, это модульные спрайты, которые могут крепится друг к другу по точкам соединений.
Модуль:
Механика модуля и его функция в процессе стрельбы, выражена с помощью компонент, которые выполняют свои функции.
Самый первый модуль в цепочке, который активировал выстрел, создает специальный датум, который является процессом стрельбы и он используется на протяжении всего выстрела из оружия.
Компонента:
Все компоненты получают первым параметром модуль, чтобы иметь возможность взаимодействовать с ним.
Компоненты бывают самых разных видов и они не ограничены этими типами:
data - информационная компонента, когда до нее доходит очередь в цепочке, то при своей активации вносит данные в кеш стрельбы, если же такая же компонента уже помещала свои данные в кеш, то вызывается функция на изменение данных этой компоненты, передавая новую компоненту в качестве аргумента. Внутри функции же данные преобразуются (по стандарту старое значение просто заменяется новым, но для всяких модификаторов оно прибавляет значение или его отнимает, зависит от контекста и это довольно гибко)
Дальнейшие компоненты, могут брать данные из кеша для проверок или функций. Кеш находится в датуме процесса стрельбы.
check - проверочная компонента, принимает в себя компоненту успеха и компоненту провала (могут быть null). При активации производит проверку внутри себя, где при успехе, следующей компонентой внедряется компонента успеха, а при провале компонента провала (при null ничего не внедряется)
proc - функциональная компонента, которая выполняет какую нибудь функцию. Там может быть все что угодно и как и любой компонент так же может внедрять новые компоненты в цепочку. Особенности у этого прока нет кроме того что это синтаксический сахар чтобы разделить проки от других компонент
awaiter - ожидающая компонента, принимает в себя ожидающую компоненту, которая будет внедрена в цепочку сразу после выполнения условия, проверяющая компонента (которая может быть совершенно любой, проком, информацией, но лучшее что можно запихнуть это все таки check), список сигналов которые может отправить проверяющая компонента и при получении которых ожидающая компонента внедряется в цепочку, и таймаут компонент который добавляется в цепочку когда вся цепочка прошла, все компоненты кончились, а условие не было выполнено. Ожидающая компонента после активации вызывается после каждой активации компоненты из цепочки и делает проверку, при успехе помещает следующим компонентом компоненту при успехе.
В качестве примера работы цепочки из 4-х модулей (рукоять, патронник, магазин и ствол) предоставлю эту картинку, где расписан порядок активаций:
Успешный выстрел:
Выстрел где магазин не вернул патрон:
Так вот для чего была создана темка, во первых мне нужно знать нужно ли это продолжать делать и нужно ли это.
- Да
- Нет
0 голосов
Во вторых я бы хотел послушать идеи модулей или паниши за несовместимые модули или еще что то, пофантазируйте и распишите, мне будет интересно почитать и реализовать это.
Особенность механики, это абсолютная мобильность и возможность изменения логики прямо на ходу работы оружия в зависимости от компонент, поэтому тут все очень гибко.