XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Чебурашка

offline
Опыт: 5,460
Активность:
Вопрос по спеллу Fatal Bonds (DotA)
Нет, это не то о чем вы подумали. У варлока есть спелл - Fatal Bonds. Мне стало интересно, что будет если применить его дважды на одну и ту же группу юнитов
Подскажите, все ли я правильно понял работу спелла: при первом применении ищется первая незанятая группа и в нее добавляются юниты. После группа очищается, и ее можно снова использовать. Самый важный вопрос: если применить спелл на одну кучку юнитов, а затем на другую, то обе кучки будут в одной группе или в разных? Сам код:
» раскрыть

Для своего удобства я важные функции и переменные обозвал человеческим языком, все остальные имхо мусор
1. Есть глобальные переменные
Код:
boolean array BA //используется ли группа
group array GA
integer 1_GROUP_HANDLE

2. В начале игры создаются 120 групп, хэндл первой запоминается
Код:
function CREATE_GROUPS takes nothing returns nothing
local integer i=0
set I1I1I0=0
set GA[i]=CreateGroup()
set BA[i]=false
set i=i+1
set 1_GROUP_HANDLE=H2I(GA[0])
loop
exitwhen i==120
set GA[i]=CreateGroup()
set BA[i]=false
set i=i+1
endloop
endfunction

3. Есть 2 функции для работы с группами:
Функция поиска незанятых групп:
Код:
function FIND_GROUPS takes nothing returns group
local integer i=I1I1I0
loop
exitwhen i==I1I1I0-1
if BA[i]==false then
set I1I1I0=i+1
if I1I1I0==120 then
set I1I1I0=0
endif
set BA[i]=true
return GA[i]
endif
set i=i+1
if i==120 then
set i=0
endif
endloop
call II1OI1(I0100,5.00,"|c00ff0303CRITICAL ERROR: FOUND NO AVAILABLE GROUPS|r")
call II1OI1(I0100,5.00,"|c00ff0303Send this replay to IceFrog@gmail.com|r")
return CreateGroup()
endfunction

функция для очистки групп
Код:
function RESTORE_GROUP takes group g returns nothing
local integer i=H2I(g)-1_GROUP_HANDLE
if i<0 or i>120 then
set I1I110=true
else
call GroupClear(g)
set BA[i]=false
set I1I1I0=i
endif
endfunction

4. И сам спелл:
Код:
function FATAL_BONDS takes nothing returns nothing
local unit I1O0I1=GetTriggerUnit()
local unit O00I01=GetSpellTargetUnit()
local group GROUP1=FIND_GROUPS()
local boolexpr IOI111=Condition(function O01I01I)
local trigger t=CreateTrigger()
local string I11101=(I2S(H2I((t))))
local integer i=2
local group GROUP2=FIND_GROUPS()
local unit array O01II0I
local string O01IIII="Abilities\\Spells\\Undead\\Curse\\CurseTarget.mdl"
call StoreInteger(I0O1,(I11101),("Hero"),H2I((I1O0I1)))
call O010OII(I1O0I1,O00I01)
call O0OO11(O01IIII,O00I01,"overhead",25)
set O01II0I[1]=O00I01
call StoreInteger(I0O1,(I11101),("Unit1"),H2I((O01II0I[1])))
call TriggerRegisterUnitEvent(t,O01II0I[1],EVENT_UNIT_DAMAGED)
call GroupEnumUnitsInRange(GROUP1,GetUnitX(O00I01),GetUnitY(O00I01),600,IOI111)
call GroupRemoveUnit(GROUP1,O00I01)
call GroupAddUnit(GROUP2,O00I01)
call StoreInteger(I0O1,(I11101),("Group"),H2I((GROUP2)))
loop
exitwhen i>5 or FirstOfGroup(GROUP1)==null
set O01II0I[i]=FirstOfGroup(GROUP1)
call O010OII(O01II0I[i-1],O01II0I[i])
call TriggerRegisterUnitEvent(t,O01II0I[i],EVENT_UNIT_DAMAGED)
call GroupAddUnit(GROUP2,O01II0I[i])
call GroupRemoveUnit(GROUP1,O01II0I[i])
call O0OO11(O01IIII,O01II0I[i],"overhead",25)
set i=i+1
endloop
call StoreInteger(I0O1,(I11101),("FXCount"),(i-1))
set II11=GetUnitAbilityLevel(I1O0I1,(1093683765))
call ForGroup(GROUP2,function O0101OI)
call TriggerRegisterTimerEvent(t,25,false)
call TriggerAddAction(t,function O01I0II)
call RESTORE_GROUP(GROUP1)
endfunction

Самый важный вопрос: если применить спелл на одну кучку юнитов, а затем на другую, то обе кучки будут в одной группе или в разных?

Отредактировано Чебурашка, 07.07.2009 в 21:57.
Старый 06.07.2009, 20:38
MaPa3M

offline
Опыт: 25
Активность:
это тот спелл который раздает дамаг на "связанных"? Если да то это стандартный спелл орков "Эмпатия". Обе кучи будут вроде в разных группах.
Старый 06.07.2009, 21:58
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
  1. у тя есть несколько функций которые ты не написал (call O010OII(O01II0I[i-1],O01II0I[i]) пример )
  2. непонятно для чего сторятся значения
  3. поидеи ответ : да в разных
Старый 08.07.2009, 06:33
Артте
Open up your eyes
offline
Опыт: 23,423
Активность:
окажутся в разных.
p.s. icefrog либо индеец, либо очень не хочет, чтобы его код был читабельным.

Артте добавил:
Хах, да к тому же спелл после сейва\лоада работать не будет... vjass решает
Старый 08.07.2009, 10:37
ToChilo
■□□□□
offline
Опыт: 356
Активность:
есть прога RMPQEx поможет привести код в болие читабельный вид
добовляет пробелы между функциями, приводит переменные в вид <тип переменной><порядковый номер> и др.
Старый 08.07.2009, 14:02
Чебурашка

offline
Опыт: 5,460
Активность:
Цитата:
Сообщение от ToChilo
есть прога RMPQEx поможет привести код в болие читабельный вид
добовляет пробелы между функциями, приводит переменные в вид <тип переменной><порядковый номер> и др.

супер! спс
Старый 08.07.2009, 14:13
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 23:21.