Cool Hashtable

Published
» Способ реализации: cJass
» Тип: Наработка
» Версия Warcraft: 1.26a
Hashtable 8000 | Cool Hashtable

Описание

В python есть цикл for k, v in dict.items(), который обходит все сохраненные пары ключ-значение. Несправедливо, что такого удобства нет в jass.
Область применения
Временное хранилище. Быстрый обход всех пар ключ-значение.
Характеристики
  • Количество элементов внутри одной таблицы не менее 8000 (для каждого отдельного интерфейса).
  • Количество таблиц не менее 8000.
  • Основано на Hashtable 8000.
API
  • Инициализация
Init_CoolHashtable(Name)
  • Разворачивание интерфейса
//! runtextmacro COOL_HASHTABLE("Name","type")
где Name - имя, type - тип (integer, real, unit...)
  • Методы
Name_create() -> int - создать хеш-таблицу;
Name_destroy(int h) - удалить(очистить);
Name_insert(h, int k, type v) - сохранить;
Name_find(h,k) -> type - получить;
Name_remove(int h, int k) - удалить;
Name_iskey(int h, int k) -> boolean - true, если элемент уже присутствует;
Name_count(h) -> int - количество элементов (0 - сохраненных нет);
Name_first(h) -> int q - получить первый специальный элемент (итератор);
Name__k(q) -> int - получить ключ;
Name__v(h,q) -> type - получить сохраненное значение;
Name__next(q) - двигаемся к следующей паре (k,v);
Name__drop(h,q) - удаляем и двигаемся;
Name__isdone(q) - true, если конец.
  • Цикл (обход всех сохраненных пар ключ-значение)
integer q = Name_first(h) // Получаем итератор
  loop
  exitwhen Name__isdone(q) // Пока не конец
    if (условие) then
      ...
      Name__next(q) // Переходим к следующему
    else
      ...
      Name__drop(h,q) // Удаляем и переходим к следующему
    endif
  endloop

Пример

Описание
  1. После применения способности у всех начинает подгорать.
  2. От присутствия кастера подгорать начинает еще сильнее.
  3. После отдаления нужно время, чтобы остыть.
Реализация
Для хранения данных будем использовать структуру {цель, счетчик, эффект}
  1. Сохраняем кастера и новую хеш-таблицу на таймер.
  2. Каждые r времени. Опрашиваем всех юнитов вокруг и проверяем, существуют ли они в нашей хеш-таблице. Добавляем или увеличиваем счетчик на 2.
  3. Уменьшаем счетчик всем сохраненным на 1. Делаем действия, если счетчик не обнулился, иначе удаляем.
Получилась своеобразная аура огня
Пример кода
// Разворачивание интерфейса хеш-таблицы
//! runtextmacro COOL_HASHTABLE("Fire","integer")

private function Igniter_action takes integer h, unit u returns nothing
  integer stt, q = Fire_first(h) // Получаем специальный элемент
  loop
  exitwhen Fire__isdone(q)
    stt = Fire__v(h,q) // Получаем сохраненный элемент - нашу структуру
    Cnt![stt] = Cnt![stt] - 1 // Уменьшаем счетчик на один
    
    if Cnt![stt] > 0 // Если счетчик не стал равен нулю
      UnitDamageTarget(u, U![stt], Damage*Cnt![stt], true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS)
      Fire__next(q) // Переходим к следующему
    else
      Igniter_destroy(stt) // Очищаем ненужную структуру
      Fire__drop(h,q) // Удаляем текущий элемент и переходим к следующему
    endif
    
  endloop
endfunction

Установка

Скопировать папки ProtoClass, HT8k, CoolHashtable.
CoolHashtable.w3x


Views: 675

PornoMishka #1 - 10 months ago -1
Голосов: +0 / -1
А почему в cJASS используется runtextmaro, а не define?
Hate #2 - 10 months ago 2
Голосов: +2 / -0
текстмакрос генерирует код по шаблону при сохранении карты, дефайн для других целей
Bergi_Bear #3 - 10 months ago 0
Голосов: +0 / -0
мне кажется, что это очень крутая штука, но я не понимаю что это и зачем
Vlod #4 - 10 months ago 2
Голосов: +2 / -0
PornoMishka:
А почему в cJASS используется runtextmaro, а не define?
Потому что тут с помощью textmacro генерируются defin-ы)

Bergi_Bear:
мне кажется, что это очень крутая штука, но я не понимаю что это и зачем
Спасибо, мне важно мнение каждого
Это аналог for key, val in pairs(t) do в lua для jass.
Спелл выше не только MUI, но и мультикастовый, то есть, при повторном использовании до перезарядки ничего не сломается, т.к. все данные сохраняются на каст.
Для проверки существования юнита в HT используется следующая конструкция:
k = GetHandleid(unit)
if Name_iskey(h,k) then
MaximBit #5 - 8 months ago 0
Голосов: +0 / -0
В чем смысл если есть table?