DioD
offline
Опыт:
45,134Активность: |
Решил на днях запилить систему которая позволит носить спеллы с карты на карту...
Сабж прост, очень прост, указатели на то, что делает спелл, хранятся в самом спелле, вообще такие системы уже были (5 или 6 раз), просто решил написать с нуля, никуда не подглядывая, а потом запостить на форуме.
Постить на форуме не цель, так что качество кода не супир, асци арта и табличек не будет. Нормально эта система реализуется через хеш таблицу, но мне так не понравилось, хотелось хардкора, там из методов будет ясно как реализовать напрямую.
Представленный ниже метод выявляет айдишник переданного ему чара, ничего сложного и внезапного, такие методы есть в любой системе сейва через коды.
Данный метод считает хеш строки, используя хеш таблицу это можно сделать вызовом StringHash в одну строку, производительность нативки существенно выше.
Основа метода кусок линейного генератора случайных чисел, это позволило добится иллюзии нормального распределения выходных значений. (на самом деле это не так и значения взяты с потолка) Алгоритм рассчитан на 15 коллизий на каждый хеш, колиззии будут.
Это уже код самой системы, резолюция колиззий крайне проста, недописал из за того что лень, нулевой индекс это счётчик, каждый раз при хеш колизии мы его увеличиваем и записываем наши данные в получившийся слот, ограничение 15 колизий.
При доступе к хешу мы сверяем значения учитывая данные из raw_id и находим именно то что нам надо. Между прочим именно так сделано в ванильной реализации хеш таблиц на яве, да и в принципе сделать иначе невозможно.
Основная логика, это единственный триггер который реагирует на выполнение способностей, логика кода крайне проста, если абилка помечена грязной мы не делаем ничего, если метки нет, проверяем есть ли на такую абилку регистрация.
"Нормальный" код на основе хеш таблицы и без развлекухи с реализацией того что уже есть будет чуточку позже.
Дискас. DioD добавил:
А теперь тотжесамый код написанный на базе встроенной хеш таблицы:
|
28.08.2013, 16:59 | #1
+2/−4
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Черт, я конечно понимаю, что это - пример, но даже его смысл я не понял. Если первый код - показательно саркастический, примером чего является второй? Изобретения велосипеда?
Если я правильно понял цель системы (надеюсь), то в cJass я добавлял фишку:
У меня кстати вопрос, может немного не по теме. Была такая карта - myDota. Ее делала одна не безызвестная личность. Потом была другая личность, Орлята, которая использовала наработки (именуемые движком) из первой карте в своей карте. Я тогда был маленьким, и кроме оскорбительного обращения в начале кода обеих карт мало что понял. Хотя речь шла о "крутости", "движке" и "препроцессоре".
Известно-ли что-то ДиоДу об этом всем? Интересуют технические подробности. |
28.08.2013, 20:43 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Bornikkeny
Silenced by Bornikkeny
offline
Опыт:
24,410Активность: |
ADOLF, мне вот тоже стало очень интересно, но боюсь, что из-за крайне малого количества серого вещества в моей черепной коробке мне не суждено понять смысл темы :-[ |
28.08.2013, 21:29 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Anufis
offline
Опыт:
6,290Активность: |
Цитата:
Цитата:
Цитата:
|
|||
28.08.2013, 21:52 | #4
+0/−2
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
заметь, айдишник для определения того, что будет выполнено, не используется, это позволяет просто скопировать код и абилку и она будет работать, какой бы айдишник у неё ни был, в этом и есть смысл.
|
29.08.2013, 07:30 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Я не вижу сложности в правке равкода, если он удобно вынесен в константы например. Другой вопрос, что как минимум надо исправить данные о уроне, уровнях и т. д. - если мы говорим о реальном переносе в другую карту. И более того, есть много вещей, которые также должны быть учтены: а именно коллизии с другими способностями и системами. Например снятие негативных бафов. Или банальное движение юнита (если, например его двигают одновременно две способности). Когда я писал cJass я задумывался об этих проблемах и видел выход в отдельной библиотеке, входящей в стандартную поставку. Но реализовано это не было. |
29.08.2013, 10:01 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
если так думать, то вообще жизнь бессмысленна, вы хоть в лепёшку расшибитесь, если в карте конфликтующие системы или взаимоисключающие механизмы, просто так скопировать будет нельзя.
я же предлагаю систему которая полностью позволяет отказатся от правки кода, все данные можно прописывать в саму способность, намёк на мудоту и гейм верный, РС делает именно так, достаточно удобно выходит, не требуется вносить никаких изменений в код, всё работает через РО. |
30.08.2013, 09:05 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Я, что-бы так не соврать - году в 2008 или 2009 для морлоков делал так:
В таком случае - можно действительно использовать только OE и копирование кода.
А увидеть это где-то реально? |
30.08.2013, 10:52 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
к сожалению нет, если демонстрацию, то без особых проблем, я запилю простенький пример (он будет не простенький на самом деле) на днях сделаю, та идёт в это поле абилки строка в которой шифруются все параметры спелла, в сам спелл идёт битмаск который расшифровывает поле.
редактирование свойств идёт в отдельной проге которая представляет данные в понятном человеку виде, после эта програ пишет в поля СЛК таблиц эти данные, проги нет на руках, если только написать с нуля, но это долго. |
30.08.2013, 11:58 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Мне скорее просто интересно, как это все работало и было ли это настолько круто, как преподавалась тогда. Практического смысла это не имеет.
Я, к слову, сразу подумал, что в системе в первом посте вполне можно было-бы писать название функции, что бы по ней сразу делать Execute. Избавились бы от необходимости регистрировать способность, хотя в целом такой подход неверен.
К слову, мой подход был немного другим. Когда я проектировал cJass, на позднем этапе была идея дать возможность генерировать объекты из кода, что-бы в коде можно было описать способность, а также все дополнительные способности, юниты, может даже импорт. В таком случае, при копировании кода все-бы создавалось автоматически, вкупе с общей библиотекой со многими "корректными" функциями это действительно давало бы простоту переноса способности с карту на карту. К сожалению реализовано это было не полностью.
Примерно так это должно было выглядеть. |
30.08.2013, 13:12 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
это есть в дефолтном vjass только не очень хорошо документировано...
|
30.08.2013, 15:43 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Да, кажется есть. Беда в том, что там весьма убогие макросы, да и не уверен я, что их можно скомбинировать с этим средством создания объектов.
К слову, я считаю не совсем правильным шифровать данные о способностях в чудо-строке редактора объектов. Использование констант, которые как правило описывают характеристики спелла в начале вполне годный и удобный вариант, который легко правиться и не дает каких-либо ограничений. |
30.08.2013, 15:50 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|