|
|
|
|
[статья] как облегчить жизнь системам своих наработок
|
|
Rehan | Дата: Воскресенье, 16 Января 2011, 16:21:30 | Сообщение # 1 |
6 уровень
Группа: Проверенные
Сообщений: 247
Награды: 0
Репутация: 79
Блокировки:
| Добрый день форумчане. Не будем лукавить, что - «уважаемые форумчане», далеко не все вы уважаемые, хотя среди вас и есть такие. Для большинства из вас и мы далеко не уважаемые, но дело не в этом. Статью мы писали не в надежде, что её прочтут лишь уважаемые для нас форумчане, иначе получилось бы, что мы пишем её для единиц.. для тех единиц, навыки которых итак соответствуют или превосходят предоставленную в статье информацию. Перед открытием основной темы статьи мы бы хотели воспользоваться случаем и раскрыть некоторые хитрости манипулирования кодом, которые открылись нам намедни. Наверняка большинство из вас сталкивалось с проблемой, что в хэш-таблицу невозможно занести тип боевой единицы. Один наш знакомый, а именно Мурадор, подсказал нам способ, которым можно обойти эту проблему: занести в данные строку, преобразованную от типа юнита, который нужно сохранить, а при извлечении данных для получения типа юнита преобразовать сохранённую к хэше строку в тип юнита. К сожалению, мы забыли спросить Мурадора, является ли это его идеей или он сам откуда-то это узнал, но это и не так важно. В последнее время мы шагаем в сторону теории, что люди получают данные с единого информационного поля, дело лишь в том, на сколько человек этому полю открыт. Так что неважно, каким образом он получил информацию, она является общей, хоть и не всегда люди находят в себе силы и желания её открывать. Но рано или поздно эти знания посредством информационного поля, откуда они были изъяты, всё равно станут доступными и другим людям. Те же типы переменных, которые нельзя преобразовать в текст, можно поместить в массив, а при необходимости сохранить информацию в ячейке хэша, содержащую ссылку на информацию массивной переменной. К примеру, необходимо, чтобы для каждого торговца была своя хэш-таблица, содержащая информацию о предметах, которые есть у торговца на выбор. Информацию о типе предмета нельзя хранить в хэше, а потому мы создаём массив переменной типа «тип предмета», в ячейках которого будут сохраненны все предметы, которые только могут быть у торговцев. В хэш торговца 0:0 мы сохраняем количество предоставленных предметов на выбор, в N:0 целочисленное значение, которое является индексом для массива списка предметов, в N:1 текстовое значение, предназначеное для отображения названия предмета с приставкой речи покупки аля «меня интересует огненный меч», в N:2 целочисленное значение, определяющее стоимость предмета. Каким образом эти данные заполняются — неважно, будь-то на то функция, регистрирующая торговцев и добавляющая для них предметы, ручное заполнение значений в хэш-таблицах и переменных или же некая генерация. Главное, что теперь эти данные есть, и их можно использовать в иных наработках как необходимую информацию. Таким образом, в хэше можно сохранять и другие значения (а точнее индекс на них), которые в нём сохранять нельзя. В завершение мы приоткроем ещё одну маленькую, но приятную хитрость, конечно с такими вещами трудно разрушать единение, в полном смысле слова, но ревность к знаниям является приятной болезнью, от которой лучше лечиться, это один из способов сделать мир лучше. Конечно, если речь не идёт о секрете изготовления оружия массового поражения (именно по этим причинам мы не разглашаем секрет, как можно триггером убить игрока, сидящего перед монитором -)). Ну шутки в сторону, дело в том, что эта ревность к знаниям засела в нас до самых глубин сердца, до самых оснований костей, и мы надеемся, что мы сможем избавиться от ноши этой болезни и стать более открытыми миру, если постепенно, начиная с раскрытия маленьких знаний мы сможем избавиться от этой черни.. да, для нас это чернь. Но вам может показаться, что мы слишком разговорились для статьи, особенно вам может так показаться, если мы для вас глубоко неуважаемые форумчане, но мы не заставляем вас это читать, и изначально мы не тащили вас за уши, чтобы вы начали это читать, так что претензии к этому можете оставить на себя (не «при себе» а «на себя»), точно так же, как на себя вы оставили желание начать это читать и не прекращать это делать в первые моменты, когда вам перестало это нравиться. Цель этой маленькой хитрости состоит в том, чтобы заставить всевозможные наработки, связанные с системой классификации предметов облегчить себе жизнь. Не знаем, какую логику вы им задавали для такой ситуации, но мы бедную наработку долгое время заставляли при каждом случае подбора предмета прочёсывать все данные о предметах, пока она не найдёт совпадение проверяемого типа предмета с типом подбираемого предмета и после этого, узнав индекс предмета в базе, извлекать данные подобранного предмета для дальнейших манипуляций наработкой. Но когда количество предметов переваливает за полторы сотни, на слабых машинах могут возникать маленькие такие «лажки». Чтобы облегчить работу подобных наработок, перед именем любого предмета (или юнита) можно вставлять неотображаемую строку |c00000001|r, точнее вместо последних чисел не 1, а номер предмета: |c00000001|r, |c00000002|r, … , |c00000010|r и т. д. В триггер регистрации предметов укажите все регистрируемые предметы, содержащие в начале названия эту строку, затем запускайте триггер автоматической регистрации, прочёсывающий все регистрируемые предметы и заставляйте его регистрировать предметы в массивах с индексом, соответствующим преобразованному в числовое значение преобразованное в текстовое значение название предмета с подстрокой от символа 3 до символа 10. Таким образом все ненужные нули при преобразовании строки автоматически отбросятся, и останется лишь необходимое число, будь то 1, 10, 1001 или 32000. Эти числа помогут наработке узнать индекс подобранного предмета, избежав поиск индекса методом чередования. По поводу наработок, связанных с юнитами, большинство из вас знает — просто даруйте юниту личное число, которое будет являться его личным индексом в массивах, а чтобы узнать, в каких системах юнит участвует, а в каких нет — даруйте ему способности, неотображаемые на игровой панели способностей. К примеру, способность «возрождаемый юнит» означает, что юнит принимает участие в системе возрождения после смерти, а способность «классифицированный инвентарь» означает, что он принимает участие в наработке, непозволяющей ему носить несколько мечей в одной руке (способность переносить множество оружий понадобится юнитам, не использующим предметы, к примеру, сундукам или мулам, а неспособность возрождаться после смерти может понадобиться босам или ключевым NPC). P.S. Трудно открывать знания, которые дают преимущества перед другими.
Требуются тестеры, обращайтесь.
Сообщение отредактировал Rehan - Воскресенье, 16 Января 2011, 16:26:57 |
|
|
|
SirNikolas | Дата: Воскресенье, 16 Января 2011, 18:18:40 | Сообщение # 2 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (Rehan) в хэш-таблицу невозможно занести тип боевой единицы. Тип объекта - это integer. Разве при сохранении/загрузке типов как целочисленных появляются какие-то баги? А в остальном благодарим уважаемых Rehan за предоставленную информацию. Она действительно крайне полезная.
|
|
|
|
Ajaccio | Дата: Воскресенье, 16 Января 2011, 18:43:02 | Сообщение # 3 |
7 уровень
Группа: Проверенные
Сообщений: 299
Награды: 1
Репутация: 239
Блокировки:
| Хм, честно тоже не понял смысла таких манипуляций. Тип объекта - integer в системе ACSII, как я помню. И спокойно сохраняется соответствующими функциями. Поправьте конечно, если ошибаюсь.
XOR EAX, EAX MOV EAX, 00H ;; NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
|
|
|
|
rixt7956 | Дата: Вторник, 18 Января 2011, 15:42:04 | Сообщение # 4 |
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
| Quote (Rehan) в хэш-таблицу невозможно занести тип боевой единицы. что? O_o Quote (SirNikolas) Она действительно крайне полезная. Чем?O_o Ведь Quote (SirNikolas) Тип объекта - это integer.
|
|
|
|
Rehan | Дата: Вторник, 18 Января 2011, 16:40:51 | Сообщение # 5 |
6 уровень
Группа: Проверенные
Сообщений: 247
Награды: 0
Репутация: 79
Блокировки:
| Тебе моргало выковырили?Quote (rixt7956) Тип объекта - это integer. Мы это уже поняли, очевидно статья мелочью не кончается.
Требуются тестеры, обращайтесь.
|
|
|
|
EdiTTORR | Дата: Пятница, 21 Января 2011, 21:32:07 | Сообщение # 6 |
8 уровень
Группа: Проверенные
Сообщений: 585
Награды: 0
Репутация: 147
Блокировки:
| Rehan, искренне благодарю вас за статью, она очень интересная, познавательная и полезная.
Местами здесь.
|
|
|
|
FkoFF | Дата: Пятница, 21 Января 2011, 22:20:07 | Сообщение # 7 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| Quote (Rehan) . К примеру, способность «возрождаемый юнит» означает, что юнит принимает участие в системе возрождения после смерти, проще по ID хэндла приписать в нужную строку единичку. Quote (Rehan) непозволяющей ему носить несколько мечей в одной руке (способность переносить множество оружий понадобится юнитам, не использующим предметы, к примеру, сундукам или мулам, а неспособность возрождаться после смерти может понадобиться босам или ключевым NPC). та же история что и с предыдущей идеей. Quote (Rehan) P.S. Трудно открывать знания, которые дают преимущества перед другими. *без малейшего ехидства улыбнулся* Адресованные мне слова я конечно впитал, и негативом, двоемордиями и прочим покамест кидаться не буду. Что до статьи, сделав скидку на оффтоп и прочее, оцениваем информационную ценность. Первое - ваше изобретение велосипеда из-за незнания мат.части. Как уже сказали выше, UnitTypeId \ ItemTypeId == integer, соответственно, сохраняются они через функцию SaveInteger(hashtable, childhashtable, index, value), и не надо ничего и никуда преобразовавыть. Второй абзац - повествует о трудностях создания рандомизатора; вообще когда сталкиваешься впервые с ДГУИ\ФСГУИ подобные наработки начинаются с создания массива и его классического перебора. Особо одаренные пользователи используют динамические базы данных которые снижают "лагучесть" работы с базами данных. Плюс ко всему - на самом деле правильней использовать индекс предмета в массиве и сравнивать индекс с индексом а не тип предмета с типом предмета; понятное дело что и то, и то = перебор целых чисел, однако, классика в данном случае - GetItemTypeId(GetManipulatedItem), что уже не просто сравнение целых чисел, а постоянный (многократный) вызов функции. По этому делаем проще, во избежание "лажков": local integer IT = GetItemTypeId(GetManipulatedItem) loop exitwhen seeking for comparison endloop
|
|
|
|
Rehan | Дата: Воскресенье, 23 Января 2011, 01:28:35 | Сообщение # 8 |
6 уровень
Группа: Проверенные
Сообщений: 247
Награды: 0
Репутация: 79
Блокировки:
| Quote (FkoFF) двоемордиями и прочим покамест кидаться не буду. придурь, ты уже это сделалДобавлено (23-01-2011, 01:28) --------------------------------------------- ну а остальное тобой сказанное, вроде, несёт полезную информацию
Требуются тестеры, обращайтесь.
|
|
|
|
SirNikolas | Дата: Воскресенье, 23 Января 2011, 07:20:14 | Сообщение # 9 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| FkoFF, но не будешь же ты отрицать, что лучше один раз вызвать SubString, чем 150 сравнивать пусть даже целые числа?
|
|
|
|
FkoFF | Дата: Воскресенье, 23 Января 2011, 10:57:26 | Сообщение # 10 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| SirNikolas, причем здесь субстринг? )
|
|
|
|
SirNikolas | Дата: Воскресенье, 23 Января 2011, 13:35:44 | Сообщение # 11 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (Rehan) название предмета с подстрокой от символа 3 до символа 10.
|
|
|
|
Rehan | Дата: Вторник, 25 Января 2011, 18:13:53 | Сообщение # 12 |
6 уровень
Группа: Проверенные
Сообщений: 247
Награды: 0
Репутация: 79
Блокировки:
| Quote (SirNikolas) FkoFF, но не будешь же ты отрицать, что лучше один раз вызвать SubString, чем 150 сравнивать пусть даже целые числа? нам казалось что FkoFF говорит о том, что можно узнать ID значение каждого предмета, или мы не так поняли?Добавлено (25-01-2011, 01:25) --------------------------------------------- А раз есть функция, возвращающая ID значение элемента (может такой и нет, мы дальше GUI в WarCraft эдиторе не шли, и нам не знать) значит нет нужды в том, чтобы маскировать ID в невидимой части названия. НО это если мы правильно поняли FkoFF Добавлено (25-01-2011, 18:12) ---------------------------------------------
Quote (FkoFF) Первое - ваше изобретение велосипеда из-за незнания мат.части. ты дурак? только дурак будет приравнивать знание языка к знанию мат. частиДобавлено (25-01-2011, 18:13) --------------------------------------------- PS это мы решили более внимательно перечитать пост этого выпендрёжника, выставляющего выпендрёжниками нас
Требуются тестеры, обращайтесь.
|
|
|
|
EdiTTORR | Дата: Вторник, 25 Января 2011, 21:34:36 | Сообщение # 13 |
8 уровень
Группа: Проверенные
Сообщений: 585
Награды: 0
Репутация: 147
Блокировки:
| Quote (Rehan) знание языка к знанию мат. части Quote (FkoFF) UnitTypeId \ ItemTypeId == integer Вынужден не не согласится, это как раз-таки незнание мат.части, т.к. даже на гуи это integer.
Местами здесь.
|
|
|
|
FkoFF | Дата: Вторник, 25 Января 2011, 22:07:26 | Сообщение # 14 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| Rehan, есть функция у хэш-таблиц (Handle ID) или как то так называется. Там выбирается игровой объект к ID которого надо присобачить какие либо данные. И да, я не пытаюсь вас выставить выпендрежниками, с этим вы сами справляетесь на ура. Я пытаюсь донести до вас мысль что вы слишком плохо разбираетесь в картострое что бы "делиться священным знанием". Правда же, на ГУИ ничему сверхъестественному, при всем желании, не научиться.
Сообщение отредактировал FkoFF - Среда, 26 Января 2011, 01:17:49 |
|
|
|
|
|
|
|
|
|
|