ledoed, моё мнение таково, что если использование структур vJass не необходимо, то стоит писать не структурами. ООП в Jass нет, существует только кривая эмуляция.
Кроме того, такое написание явным образом демонстрирует логику работы алгоритма, что в качестве ответа несколько актуальнее. Всё-таки почитай про отступы и стандарты оформления кода и комментариев в нём
Кастомная система оглушения без использования способностей на глобальном таймере, с комментариями, говорящими названиями переменных и с адекватным форматированием. Без структур, так как они здесь излишни.
По такому же принципу можно реализовать всё, что угодно, лепится на единый таймер. Примерно по такому принципу работают все существующие игры (серверные/клиентские тики), только хранение данных по-другому реализовано (здесь параллельные массивы).
Код
library StunUnit // initializer Init
{
private timer periodicTimer = CreateTimer() // Can be replaced with main map timer
private unit unitsStack[]
private effect effectsStack[] // Stun effect storage
private float timeRemaining[] // Time of stun left
private int stackCounter = 0
#define private TICK_PERIOD = 0.05
#define private STACK_LIMIT = 8190
#define private STUN_EFFECT = "Abilities\\Spells\\Human\\Thunderclap\\ThunderclapTarget.mdl"
#define private ORDERID_STOP = 0xD0004
// Looking for id of specified unit in stack
private int StackSearch(unit givenUnit) {
int i = -1;
while(i++ < stackCounter) {
if (givenUnit == unitsStack[i]) {
return i;
}
}
return -1;
}
// Add unit to stack with overflow check
private void StackPush(unit givenUnit, float duration) {
if(stackCounter < STACK_LIMIT) {
unitsStack [stackCounter] = givenUnit;
effectsStack [stackCounter] = AddSpecialEffectTarget(STUN_EFFECT, givenUnit, "overhead");
timeRemaining[stackCounter] = duration;
stackCounter++;
} else {
BJDebugMsg("Stunned units stack overflow!");
}
}
// Remove unit from stack
private void StackPop(int id) {
DestroyEffect(effectsStack[id]);
stackCounter--;
unitsStack [id] = unitsStack [stackCounter];
effectsStack [id] = effectsStack [stackCounter];
timeRemaining[id] = timeRemaining[stackCounter];
unitsStack [stackCounter] = null;
effectsStack [stackCounter] = null;
timeRemaining[stackCounter] = 0.0;
}
void StunUnit(unit givenUnit, float duration) {
int stackedUnitId = StackSearch(givenUnit);
if (stackedUnitId == -1) {
StackPush(givenUnit, duration);
} elseif (timeRemaining[stackedUnitId] < duration) {
timeRemaining[stackedUnitId] = duration;
}
}
private void TimerCallback() {
int i = -1;
while(i++ < stackCounter) {
timeRemaining[i] -= TICK_PERIOD;
IssueImmediateOrderById(unitsStack[i], ORDERID_STOP);
if (timeRemaining[i] <= 0.0) {
StackPop(i);
}
}
}
private void Init() {
TimerStart(periodicTimer, TICK_PERIOD, true, function TimerCallback);
}
}
ledoed, за такое форматирование просто руки отрывать надо и пожизненно лишать доступа к любым IDE.
Если бы автор вопроса изволил посетить предложенную ему в прошлом топике ссылку на систему отлова урона, то в ходе ознакомления с содержанием этой системы всенепременно обнаружил бы там ответ на свой вопрос.
Там как бы косяк в системе рейтинга, игроки весьма быстро получают свои ранги и почти никаких шансов выйти с них не имеют, что, разумеется, не способствует ретеншну. А причина простая: если копипирдишь систему рейтингов из другой игры, то стоит обратить внимание на то, командная это игра, или же индивидуальная.
Luxorix, я бы предложил просто всегда держать на них обводку, которая сейчас появляется только при приближении. Даже несколько обескураживало, что она исчезает, если отойти.
Если смотреть на игру в целом, то я бы не торопился запихивать игрока в самое пекло, а знакомил бы с механиками по очереди: сначала просто сбор лута, потом пара лёгких сражений в пустых комнатах, потом разрушаемые объекты...
Такой подход позволил бы весьма легко выстроить Learning Curve, и при этом практически не затронуть техническую часть игры.
Даже в такой помойке как код в8, это делается достаточно просто. Не сам фикс, а нахождение бага. Баг локализовать просто, сложно пофиксить в некоторых случаях из-за отвратной не структурированной архитектуры.
Все сложно поддерживать если нету четкой и структурированной архитектуры. Можно заделать кучу микросервисов, но толку, если они будут не правильно структурированы. Проблема в текущем решении ХГМ - это использование его как песочницы. Потому что большинство фич которые прикручивались - это лишь способ попробовать что-то новое из технологий или в программировании. Отсюда и появляется функционал которым пользуется 1 или 2 пользователя, который ничего не дает, в нем куча багов, структура кривая и непонятное, потому что автор просто хотел поиграться с новой технологией.
Увы, пока только текстовый и довольно скромный, но зато в любой момент можно поставить игру на паузу и тут же увидеть все управление.
Очень печально. Лут визуально не отделён от разрушаемого окружения, та же форма, та же гамма, никакой подсветки. Вообще во время игры в демку всё ощущалось дикой кашей, и стрелял по сути "на шару куда-то в сторону центра и откуда пули летят", никакого удовольствия не ощущалось. Почти уверен, что нужно реализовать разграничение различных типов объектов чем-нибудь, например, цветовым кодированием или базовыми формами.
Почему-то я всегда вспоминаю Meritous, когда вижу подобный bullet-hell.
Выглядит довольно сочно, надо сказать. По видео видно, что комнаты закрыты и из них не выйти. Это всегда так?
» WarCraft 3 / Ищу синематик-мейкеров для WC3 за деньги
Ред. Clamp
» WarCraft 3 / Событие - получает урон
» WarCraft 3 / Глобальный таймер
Кроме того, такое написание явным образом демонстрирует логику работы алгоритма, что в качестве ответа несколько актуальнее. Всё-таки почитай про отступы и стандарты оформления кода и комментариев в нём
Ред. Clamp
» WarCraft 3 / Глобальный таймер
Ред. Clamp
» WarCraft 3 / Глобальный таймер
Ред. Clamp
» WarCraft 3 / Событие - получает урон
» Он вам не клоун! / Брейншторм по контентной стратегии XGM
» WarCraft 3 / система отлова урона
» WarCraft 3 / Важная информация об обновлении 1.28
Жаль только, что теперь не получится на bnet зайти =(
» WarCraft 3 / Важная информация об обновлении 1.28
» WarCraft 3 / Можно ли у GetLocalPlayer изменить интерфейс во время игры?
Ред. Clamp
» Spaceship Looter / Spaceship Looter
» Он вам не клоун! / По технической реализации xgm
» WarCraft 3 / Космическая платформа
У этого тайла косяк в том, что он плавно сочетается со склоном
» Spaceship Looter / Spaceship Looter
» WarCraft 3 / Можно ли у GetLocalPlayer изменить интерфейс во время игры?
» Он вам не клоун! / По технической реализации xgm
» WarCraft 3 / Как сделать урон заклинаний на 60% слабее?
» Spaceship Looter / Spaceship Looter
» Spaceship Looter / Spaceship Looter
Значит, и правда сочный
» Spaceship Looter / Spaceship Looter
Выглядит довольно сочно, надо сказать. По видео видно, что комнаты закрыты и из них не выйти. Это всегда так?
Ред. Clamp
» WarCraft 3 / Как сделать урон заклинаний на 60% слабее?
» Dota 2 / Конкурс героев для Dota 2
» WarCraft 3 / Как сделать урон заклинаний на 60% слабее?
» WarCraft 3 / Как сделать урон заклинаний на 60% слабее?