Герой с активным спеллом.
Если он добивает юнита этим спеллом, то весь урон, наносимый героем, становится сильнее.
Усиление урона я триггерно сделаю, это не проблема.
Вопрос в другом, как посоветуете реализовать то, от чего отсчитывать?
Можно дать юниту маркерную абилу-пустышку на 1000 уровней (прелоадить маркер где-нибудь на карте) и при убиении этим юнитом тем самым спеллом врага повышать ему лвл этого маркера. Это изи, но тупо, т. к. долго грузится в РО и будет понижать скорость загрузки карты. Ну и плюс лимит 999 повышений, хотя его и хватит в 95% случаев.
Есть другие идеи?

Принятый ответ

avuremybe, это каким ты боком не получишь индекс от юнита
проще некуда
чтобы получить нужный индекс просто перечисляем весь массив и ищем нужного юнита типо так
globals
int Count
int array SpellUP
unit array UN
endglobals
int i = 0
while(i <= Count){
if UN[i] == Нужный юнит {
SpellUP[i]++
наши действие
}
i++
}
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
28
7 лет назад
Отредактирован nvc123
2
что вы тут за херню несёте
перебор массива циклом нафига?
способов атача существует дофига и все они сделаны до вас
берёте любой и юзаете
индекс юнита можно получить либо через хэндл либо через юзердату
avuremybe:
и ты думаешь, если ты через надстройки пишешь просто название, то оно компилируется без udg_ ?
да
оно компилируется без udg_
udg_ это приставка только для редактора переменных
читай статьи ну или открой карту mpq архиватором и вытащи j файл если не веришь
вот вам простой пример атача
struct Data{
	int dmg; // число которое надо хранить у юнита, в данном случае урон
	private static int bHandle=0x100000;
	
	// этот метод получает объект по юниту
	static thistype load(unit u){
		thistype this=GetHandleId(u)-bHandle;
	}
}

// при создании юнита или инициализации карты
unit newUnit; // юнит которому нужно будет сохранять значение
Data d=Data.load(newUnit); // загружаем информацию по юниту
d.dmg=0; // устанавливаем значение в 0

// пример использования
unit a // юнит которому надо изменить число
Data d=Data.load(a); // загружаем информацию по юниту
BJD(I2S(d.dmg)); // выводим текущее значение числа на экран
d.dmg+=10; // увеличиваем значение числа на 10
этой теме посвящено более половины статей по триггерам
0
13
7 лет назад
0
nvc123 чем объекты лучше перебора циклом? По сути, с циклом код читабельнее.
0
28
7 лет назад
0
NekoriDes, тем что цикл делает кучу итераций
в то время как мой код делает лишь 1
это совершенно разные подходы же
и чем это он блин читабельнее?
своей тупостью?
вообще за поиск индекса перебором расстреливать надо
0
13
7 лет назад
0
nvc123, я не представляю себе случая, в реальном мире, когда такой цикл может как-то навредить. Поэтому зачем новичку париться с объектами, если можно воспользоваться простейшим вариантом. Читабельнее как раз для новичка. Два года назад именно этим способом я бы и воспользовался.
Штука просто в том, что конкретные вещи мы начинаем применять, когда уровень компитенции становится выше, а выше он становится тогда, когда мы пытаемся добиться конкретных целей, в данном случае оптимизации. Если вот именно сейчас у меня нет потребности в жесткой оптимизации и я не дрочу на каждый байт, то вполне могу использовать то, что мне известно и то, что мне удобно. Ваш Капитан Очевидность
Но это всё оффтоп конечно, лол. Сорри.
0
28
7 лет назад
Отредактирован nvc123
0
NekoriDes, перебор циклом сильно вредит производительности и делать его долго, как следствие он нафиг не нужен
объекты в данном примере лишь для обеспечения простоты использования и расширяемости (если надо хранить не 1 число а несколько)
короче инкапсуляция
так то это всё можно сделать в 1 строчку
myInt[GetHandleId(a)-0x100000]++;
только это тупо т.к. приходится везде прописывать этот не очевидный код
и в случае расширения хранимых данных придётся переписывать код во всех местах где эта конструкция используется
а с циклами я вообще не понимаю
их писать дольше чем атач
+ с ними дофига проблем потом
и эта логика "когда будет плохо тогда перепишу"
нафига с самого начала делать неправильно?
+ придётся лазить повсюду в поисках этих циклов
или вы хардкорные мазохисты?
так может лучше найдёте себе девушку садистку?
хоть какой то толк от вашего мазохизма будет
0
30
7 лет назад
0
nvc123, а теперь приведи пример поиска даты юнита без цикла, юзердаты и хештейбла, пожалуйста.
0
13
7 лет назад
Отредактирован NekoriDes
0
Я говорил о том, что определенные средства нужно применять в определенном случае. Если автор не программист и никак с этим не связан, то трахать свой мозг бесполезной инфой ему вовсе не обязательно.
А если ему захочется полезть дальше, то я думаю он сам придет к разным способам решения своей задачи.
Clamp, if (myInt[GetHandleId(GetTriggerUnit())-0x100000])?
Изменил этот коммент раз 15.
0
30
7 лет назад
0
NekoriDes, как вариант вполне сойдёт, да. А если вообще не пользоваться хэндлами?
0
20
7 лет назад
0
NecoriDes, это из серии "инди девелоперы в большинстве своём транжиры, а не разработчики. Нафига им забивать себе голову матчастью и выпускать безбажное, нелагающее творение? Только время потеряют. "
0
13
7 лет назад
Отредактирован NekoriDes
0
Diaboliko, это из серии модмейкеры — совсем необязательно программисты. Особенно, если мы говорим о варкрафте.
0
28
7 лет назад
Отредактирован nvc123
0
Если автор не программист и никак с этим не связан, то трахать свой мозг бесполезной инфой ему вовсе не обязательно.
и это одна из причин существования инкапсуляции
которая позволяет использовать уже готовые решения ничего не зная о их реализации
и то что автор не программист не спасёт его от необходимости переписывать кучу кода при каждом изменении
Clamp, мой пример вверху
их там целых 2 штуки
и чем тебе хештейблы и юзердата не нравятся?
2
30
7 лет назад
2
Мой поинт состоит в следующем:
Даже если предположить, что каждый герой на карте применяет способность ежесекундно, то каждую секунду будет происходить [количество героев на карте] операций поиска героя в массиве, сложность каждой из которых составит O(n) в худшем случае и O(1) в лучшем. Для 300 героев (что значительно больше адекватного количества героев на карте) это выльется в ~~1.27% загрузки одноядерного процессора с тактовой частотой в 1 ГГц.
Так что метод, конечно, далеко не самый оптимальный, но реального смысла искать "более производительное решение" здесь нет.
Этот комментарий удален
0
30
7 лет назад
0

А отвязка от хеша ведёт к полной независимости работоспособности кода от версии игры, но это скорее просто моя блажь, нежели реальная необходимость.
1
28
7 лет назад
1
Clamp, тут дело не столько в потраченных микросекундах сколько в удобстве использования и дальнейшей модификации
ты вообще читал что тут писали раньше?
или решил "о еда, пойду поем"
0
30
7 лет назад
0
1.27% загрузки одноядерного процессора с тактовой частотой в 1 ГГц.
Другими словами, на прокручивание массива на таком процессоре уйдёт 0.0127 секунды, это относительно немного.
nvc123, и давно я тут троллингом занимаюсь, по-твоему?
1
28
7 лет назад
1
и давно я тут троллингом занимаюсь, по-твоему?
твой первый варн за троллинг датируется 2010 годом так что дольше меня
0
30
7 лет назад
0
удобстве использования и дальнейшей модификации
define <implement AccessList>(SIZE) = {
    private static thistype list[SIZE];
    private static int listIdMax = 0;

    private void addToList() {
        thistype.listIdMax++;
        if (thistype.listIdMax <= SIZE) {
            thistype.list[thistype.listIdMax] = this;
        }
    }

    private void removeFromList() {
        int tempId = thistype.listIdMax + 1;
        while (--tempId != 0 && thistype.list[tempId] != this) {}
        thistype.list[tempId] = thistype.list[thistype.listIdMax];
        thistype.list[thistype.listIdMax] = 0;
        thistype.listIdMax--;
    }
}

define <implement AccessListOfUnit>(SAVED_UNIT_NAME) = {
    public static thistype ofUnit(unit who) {
        int tempId = thistype.listIdMax + 1;
        while (--tempId != 0 && thistype.list[tempId].SAVED_UNIT_NAME != who) {}
        return thistype.list[tempId];
    }
}

define <implement AccessListUpdate>(WHICH_EVENT_FUNC) = {
    private static void listUpdate() {
        int tempId = thistype.listIdMax + 1;
        while (--tempId != 0) {
            thistype.list[tempId].update();
        }
    }

    public static void initUpdate() {
        WHICH_EVENT_FUNC(function thistype.listUpdate);
    }
}

Непостижимо сложная в использовании и невероятно тяжёлая в модификации имплементация, правда?

nvc123, я ещё даже не задумался о том, чтобы начать развлекаться, а ты уже успел перейти к argumentum ad hominem, что с тобой не так?
Этот комментарий удален
0
30
7 лет назад
Отредактирован Clamp
0
так то это всё можно сделать в 1 строчку
myInt[GetHandleId(a)-0x100000]++;
только это тупо т.к. приходится везде прописывать этот не очевидный код
Вообще-то всего в двух местах: один раз при сохранении и один раз при чтении, всё.

Кстати, GetHandleId(a)-0x100000 легко может оказаться > 8191, что ведёт ко вполне очевидным проблемам.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.