Хотелось бы знать какие пути решения без использования отдельных массивов/хэштэйбла видит кто-либо для разрешения ситуации следующего характера:
Скилл поражает цели в выбранной зоне и оставляет даммика, находясь возле которого юниты, задетые заклинанием, получают урон. В один момент времени может существовать хоть с десяток таких даммиков, но они должны наносить повреждения лишь целям, задетыми заклинанием их создателя. Проверка на бафф не актуальна, поскольку два таких кастера будут перебивать баффы друг друга.
В данный момент под каждый каст скилла выделяется перерабатываемая группа на время жизни этого скилла, которая содержит юнитов, задетых этим конкретным кастом, а также группа, содержащие все цели, пораженные этими же заклинаниями кастера. Поскольку нельзя добавить в группу юнита, который уже содержится в ней, нерешенным остается вопрос о том, как же удалять юнита из второй группы, только когда он не содержится в первых группах. Сейчас на ум приходит только выделение, скажем, 64 перерабатываемых элементов параллельных массивов юнит+интегер, куда в интегер записывается число групп, в которых содержится юнит. Солюшн весьма хреновый, поскольку придется каждый раз искать этого юнита в 64 элементах массива...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
28
7 лет назад
Отредактирован nvc123
0
Кто-то из нас явно понимает другого не-правильно. Либо оба :> Но я вижу в твоем описании свое решение.
как ты можешь видеть своё решение если
полный бред которого у меня нету и который хз зачем нужен
зачем информация о числе задеваний таргета Т1 кастами кастера C1?
зачем ты ставишь 64 если оно всеравно преобразуется в 8192?
твоё решение содержит часть моего + кучу ненужного говна
по поводу твоих "потоков"
кривое дерьмо юзающее кучу триггеров и не имеющее никакого смысла
если будет не лень то завтра напишу этот спелл
0
20
7 лет назад
Отредактирован Diaboliko
0
зачем ты ставишь 64 если оно всеравно преобразуется в 8192?
Поиск по 64 меня устраивает. И 64 так и останется 64 в моем случае. Я выделяю это пространство для юнита в этих массивах:
кат
scope UnitGroupEmulation
    globals
        constant integer       UGEAllocatedAmountOfCells = 64//per unit
        constant integer       UGEOverflow = 63
        constant integer       UGEStartingSize = 512
        constant integer       UGEInitExit = 511
        constant integer       UGESizeOfSubArray = 8// 512/64 and round it up to 2^X
        constant integer       UGESizeOfSubArrayExit = 8
                 //integer array UGEAllocatedCells
                 integer array UGEIntegers[UGEStartingSize]
                 unit    array UGEUnits[UGEStartingSize]
                 integer       UGENext = 0//*UGEAllocatedAmountOfCells to get the variable with minimal ID of allocated part of array
                 integer array UGENextUnitOfThisSpace[UGESizeOfSubArray]
    endglobals
    
    function FillUGEArray takes nothing returns nothing
        local integer i = 0
            loop
                set  UGEIntegers[i] = 0
                set  UGEUnits[i] = null
                exitwhen i == UGEInitExit
                set  i = i + 1
            endloop
    endfunction
    
    #define UGEGetSpace( nothing ) = {
             UGENext
        set  UGENextUnitOfThisSpace[UGENext] = UGENext * UGEAllocatedAmountOfCells
        set  UGENext = UGENext + 1
    }
    
    #define UGESimplyAddUnitToSpace( whichUnit, whichSpace ) = {//Base local code upon this. Would be wrong to use it raw.
        set  UGEUnits[UGENextUnitOfThisSpace[whichSpace]] = whichUnit
        if ( UGENextUnitOfThisSpace[whichSpace] == ( whichSpace * UGEAllocatedAmountOfCells ) + UGEOverflow ) then
            set  UGENextUnitOfThisSpace[whichSpace] = whichSpace * UGEAllocatedAmountOfCells
        endif
    }
endscope
и перерабатываю его. Благо я могу делать это без проблем т.к. не пишу на вжассе (scope используется для доп. табуляции)
зачем информация о числе задеваний таргета Т1 кастами кастера C1?
У меня конец времени дебаффа отсчитывается одним из "потоков" таймера, работая аналогично твоему отсчету времени до конца дебаффа. Информация о числе задеваний нужна чтобы из группы всех юнитов, задетых кастом кастера не удалять юнита, если тот содержится еще в какой-то группе(иначе лжедебафф, по-сути, еще активен, но будет снят).
твоё решение содержит часть моего + кучу ненужного говна
На твой взгляд оно, может, и ненужное говно, а в рамках используемых мной систем выглядит весьма адекватным решением.
по поводу твоих "потоков"
кривое дерьмо юзающее кучу триггеров и не имеющее никакого смысла
если будет не лень то завтра напишу этот спелл
Ну почему-же. Решение не кривее использования хэштэйблов. Все переменные сохраняются в глобальных массивах. Мне норм.
2
24
7 лет назад
2
Diaboliko, в варкрафте все массивы 8192, то что ты указал 64 ничего не значит, варкрафт все равно выделит 8192
0
20
7 лет назад
0
Diaboliko, в варкрафте все массивы 8192, то что ты указал 64 ничего не значит, варкрафт все равно выделит 8192
А в моей памяти сидит что они сперва имеют какой-то минимальный сайз, выше которого по степени двойки делается realloc.
0
28
7 лет назад
0
Diaboliko, указания размера массивам это фича вджасса для создания массивов с размером больше 8192
так что твоё 64 при компиляции попросту исчезает
0
18
6 лет назад
0
Вместо массива-счётчика можно использовать userdata.
0
23
6 лет назад
0
а чем не угодил баф яд который стакает.... оптимальный без изобретении велосипеда
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.