12

» WarCraft 3 / cJass - дополнение к языку JASS

bb:я могу попробовать сделать это в паскале, если это переведут в ассемблер, то сё ок
разумеется буду делать вариант Б :Р
12

» WarCraft 3 / cJass - дополнение к языку JASS

[quote=Sebra]Такого делать нельзя!
Автор карты может явно использовать подобные системы (они есть), но оптимизатор не может.
Разные триггеры могут использовать по нескольку разных событий, разные функции - фильтры, на их хэндлы могут быть привязаны разные данные. Всего этого просто так не учесть.[/quote]
я и не спрашивал про всё, а токо эквивалентные!!!
пример реализации:
А:
  1. Ищем блоки, содержащие CreateTrigger( ) и считаем вхождение функций регистрации событий, допустим TriggerRegisterAnyUnitEventBJ, без ограничения общности, EVENT_PLAYER_UNIT_SPELL_EFFECT
  2. Отсеиваем функции, единственные в своём классе, и содержащие сложные условия
  3. Для каждого оставшегося класса оставляем один триггер - диспетчер
  4. Для каждого диспетчера - действие - выбор по соответствующему условию
Пример:
[code]
до оптимизации
function Trig001_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A001'
endfunction
function Trig001_Actions takes nothing returns nothing
endfunction
function InitTrig001 takes nothing returns nothing
local trigger t = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( t, Condition( function Trig001_Conditions ) )
call TriggerAddAction( t, function Trig001_Actions )
set t=null
endfunction
function Trig002_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A002'
endfunction
function Trig002_Actions takes nothing returns nothing
endfunction
function InitTrig002 takes nothing returns nothing
local trigger t = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( t, Condition( function Trig002_Conditions ) )
call TriggerAddAction( t, function Trig002_Actions )
set t=null
endfunction
результат оптимизации
function TrigSuper_Actions takes nothing returns nothing
local integer Super = GetSpellAbilityId()
if Super=='A001' then
call Trig001_Actions(Super)
elseif Super=='A002'
call Trig002_Actions(Super)
endif
endfunction
function InitTrigSuper takes nothing returns nothing
local trigger t = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction( t, function TrigSuper_Actions )
set t=null
endfunction[/code]
  1. 2 функции эквивалентной структуры InitTrig001 и InitTrig002
  2. нечего отсеивать...
  3. результат InitTrigSuper
  4. результат TrigSuper_Actions
И главное - критерии сравнения можно также передать в функцию, заменив соответственно вызовы "условной" функции переменной
Б:
Можно также сделать "явный" приказ оптимизатору - типо эта функция - должна относится к блоку "заклинания"; нечто вроде:
void OnSpell() #spell(<код заклинания>)
{
}
тогда эта функция при оптимизации будет зарегистрирована в соответствующем диспетчере
<код заклинания>==цифирка или глобалка типа инт
Каждая карта имеет в себе обычно несколько триггерных заклинаний, которые могут входить в разные системы(library) - поэтому чтобы джассеру самому оптимизировать вызовы функции, необходимо вручную избавляться от ООП, или работать с результатом трансляции vJASS компилятора...
Я бы сам сделал вариант Б, но я ассемблер немного плоховато знаю, чтобы подписать ...
12

» WarCraft 3 / cJass - дополнение к языку JASS

bb:у меня вопрос по оптимизатору - а является ли эта штука супер чудоштукой?))))
поясню немного:
допустим есть в карте несколько триггерных спелов, разумеется они регистрируются эквивалентными событиями с разными условиями
дак супероптимизатор объединяет их события в один триггер - где будет одна функция GetSpellAbilityId() и кучка ифоф?))
ну и соответственно с другими событиями...
если нет, то можно считать это предложением)
12

» WarCraft 3 / cJass - дополнение к языку JASS

[code]library ZloVnytri initializer init
define private e_Accelerator = 3
define
{
private void=nothing
private int=integer
private bool=boolean
}
private group dgroup
private bool Zlo
{
return GetWidgetLife(GetFilterUnit())>.405 and (not IsUnitAlly(GetFilterUnit(), dplayer))
}
private void OnTimer
{
dplayer=Player(1)
}
private void init()
{
count=0
dgroup=CreateGroup()
TimerStart(CreateTimer(),0.01*e_Accelerator,true,function OnTimer)
Zlo
}
endlibrary[/code]
Очень забавно - AdicHelper вешается в шаге Killing Vexorian
как бы если внутри очень много чего написано сомнительного, то тривиальность ошибки не сразу видна...
12

» WarCraft 3 / cJass - дополнение к языку JASS

bb:лучше выводить отчёт и неиспользуемых глобалках, ну или даже локалках будет айс ^^
12

» WarCraft 3 / cJass - дополнение к языку JASS

bb:если установка "старого образца" меню нету))
ок, переставлю через инсталятор...
12

» WarCraft 3 / cJass - дополнение к языку JASS

после трансляции получаю код, в котором не убраны директивы условной трансляции:
[code]globals
globals from System:
#if 0==0
hashtable HashTable=InitHashtable()
#endif
endglobals from System
trigger gg_trg_____________________________________001=null
trigger l__library_init
endglobals[/code]
может у меня не последняя версия - есть какойто способ узнать версию AdicHelper?
такто я для уверенности несколько раз позапускал AHupdate.exe - результат - окошко "cJass is up to date."
12

» WarCraft 3 / cJass - дополнение к языку JASS

[code]define HASHTABLETYPE = 0 0=no hash 1=have
define hash = name
library System initializer init
define
{
private void=nothing
private int=integer
private bool=boolean
}
#if HASHTABLETYPE==0
hashtable HashTable=InitHashtable()
setdef hash = HashTable
#endif
void init()
{
hash=hash
}
endlibrary[/code]
почемуто условная трансляция не работает(
п.с. что я садист - можно не сообщать)
12

» WarCraft 3 / Библиотека функций

function HT takes player P returns string
local integer D=GetPlayerId(P)
if(D<=5)then
return"|c"+SubString("00FF0303000042FF001CE6B90054008100FFFC0100FE8A0E",D*8,D*8+8)
else
set D=D-6
return"|c"+SubString("0020C00000E55BB000959697007EBFF100106246004E2A04",D*8,D*8+8)
endif
нашёл в чужом коде - судя по всему - получение string-кода цвета игрока )
12

» WarCraft 3 / cJass - дополнение к языку JASS

bb:предлагаю придумать дерективы
private:
public:
ну то есть чтобы не перед каждой функцией, переменной, константой, дефином писать их область видимости, а чтобы сразу разбить всё по сегментам)))
(вроде такого нет, правда?)
12

» WarCraft 3 / cJass - дополнение к языку JASS

[quote=Sebra]s=2*Pi*r => s=r*6.2831...[/quote]
а разве при загрузке варик не считает константы?
12

» WarCraft 3 / cJass - дополнение к языку JASS

bb:гж)
У меня вопрос по области видимости:
если мне нравится пользоваться блоком define /enddefine то куда приписывать private?
12

» WarCraft 3 / XGM Room в Garena

"который быстрыми сообщениями блокирует чат, невозможно его пролистать."
выдели несколько предложений в окне и щёлкни правой кнопкой - автоматическая пролистовка остановится (корявая гарена...)
12

» WarCraft 3 / XGM Room в Garena

обычно мапу то тестишь с друзьями и им всёравно какая рума...
если создавать мапы в дота румах то ясно дело заходить никто не будет если не дота =\
12

» WarCraft 3 / Что готовит нам патч грядущий?

нет, чтобы наконецто добавить функцию GetHostPlayer, они какуюто вату пинают (