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

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

Закрытая тема
 
agentex

offline
Опыт: 34,834
Активность:
Трабл с равкодами
Задача:
просканировать все нестандартные абилы и предметы в карте, и если имена какойто пары абила-предмет совпадают, занести равкоды абилы и предмета в соотв. переменные.

Устройство функции:
1) во внешнем цикле создается предмет с равкодом id и заносится в переменную it.
2) идет проверка на классификацию предмета it, если он из усиливающих \ только для камп., то срабатывает внутренний цикл.
3) (тут то и трабл) начиная с равкода 'A000' происходит перебор всех (но на самом деле получается не всех) нестандартных абилок, если имя предмета it равно имени абилы с равкодом abid происходит занесение равкодов абилы и итема в переменные
udg_ABLS_humanitems[]
udg_ABLS_humanspells[]
либо
udg_ABLS_hordeitems[]
udg_ABLS_hordespells[].

Код:
function Trig_AnId_Actions takes nothing returns nothing
local integer i = 1
local integer ihu = 0
local integer iho = 0
local integer id = 'I000'
local integer abid = 'A000'
local item it
  loop
  set it = CreateItem(id, 0, 0)
  if GetItemType(it) == ITEM_TYPE_POWERUP or GetItemType(it) == ITEM_TYPE_CAMPAIGN then
//-----------------------Внутренний цикл (попытка перебора всех абил)-----------------------
   loop
    if GetItemName(it) == GetObjectName(abid) then
      if GetItemType(it) == ITEM_TYPE_POWERUP then
         set ihu = ihu + 1
         set udg_ABLS_humanitems[ihu] = id
         set udg_ABLS_humanspells[ihu] = abid
      else
        set iho = iho + 1
        set udg_ABLS_hordeitems[iho] = id
        set udg_ABLS_hordespells[iho] = abid
      endif
   call DisplayTimedTextToForce( GetPlayersAll(), 10, ("|c0000FF00" + GetObjectName(abid) + " " + I2S(abid) + "|r"))
   else
   if abid == 'A009' or abid == 'A00Z' or abid == 'A019' or abid == 'A01Z' or abid == 'A029' or abid == 'A02Z' then
   if abid == 'A009' then
   set abid = 'A00A'
   endif
   if abid == 'A00Z' then
   set abid = 'A010'
   endif
   if abid == 'A019' then
   set abid = 'A01A'
   endif
   if abid == 'A01Z' then
   set abid = 'A020'
   endif
   if abid == 'A029' then
   set abid = 'A02A'
   endif
   if abid == 'A02Z' then
   set abid = 'A030'
   endif
   else
   set abid = abid + 1
   endif
   endif
   exitwhen GetItemName(it) == GetObjectName(abid)
   endloop
//---------------------------------Конец внутреннего цикла-----------------------------------
  call DisplayTimedTextToForce( GetPlayersAll(), 10, (GetItemName(it) + " " + I2S(id)))
  endif
  call RemoveItem(it)
  set it = null
  set abid = 'A000'
  if id == 'I009' or id == 'I00Z' or id == 'I019' or id == 'I01Z' then
   if id == 'I009' then
   set id = 'I00A'
   endif
   if id == 'I00Z' then
   set id = 'I010'
   endif
   if id == 'I019' then
   set id = 'I01A'
   endif
   if id == 'I01Z' then
   set id = 'I020'
   endif
  else
  set id = id + 1
  endif
  set i = i + 1
  exitwhen i > 200
  endloop
endfunction


Проблема:
Внешний цикл работает нормально, все предметы в карте определяются.
А вот при переборе ракодов абил происходит какойто глюк и внутр. цикл срабатывает только до какойто абилы, предположительно после нее происходит зацикливание, следовательно какието равкоды цикл обходит стороной либо пропускает...
Вопрос:
как избавится от ручного перехода:
Код:
if abid == 'A009' then
   set abid = 'A00A'
   endif

и вообще какие действия нужно производить с равкодами (уж точно не прибавление 1) чтобы со 100% вероятностью пройтись по равкодам ВСЕХ ОБЬЕКТОВ?
вобщем прошу - исправьте как надо эту функцию)
P.S. все имена предметов совпадают с именами соотв. абил, проверено 3 раза.
P.S.2. равкоды абил находятся в пределе 'A03Z' (хм если конешно это предел для моего случая в этой си)

agentex добавил:
ау где жассеры то?

Отредактировано agentex, 21.08.2008 в 14:24.
Старый 21.08.2008, 14:26
Toadcop

offline
Опыт: 54,313
Активность:
попробуй это... я неуверен ибо писал просто так =) т.е. не тестил.

Код:
globals
 integer maxchars=0
 integer array charz
 boolean charsetinited=false
endglobals

function InitcharsetBX takes nothing returns nothing
 if not charsetinited then
   set charz[0]='0'
   set charz[1]='1'
   set charz[2]='2'
   set charz[3]='3'
   set charz[4]='4'
   set charz[5]='5'
   set charz[6]='6'
   set charz[7]='7'
   set charz[8]='8'
   set charz[9]='9'
   set charz[10]='A'
   set charz[11]='B'
   set charz[12]='C'
   set charz[13]='D'
   set charz[14]='E'
   set charz[15]='F'
   set charz[16]='G'
   set charz[17]='H'
   set charz[18]='I'
   set charz[19]='J'
   set charz[20]='K'
   set charz[21]='L'
   set charz[22]='M'
   set charz[23]='N'
   set charz[24]='O'
   set charz[25]='P'
   set charz[26]='Q'
   set charz[27]='R'
   set charz[28]='S'
   set charz[29]='T'
   set charz[30]='U'
   set charz[31]='V'
   set charz[32]='W'
   set charz[33]='X'
   set charz[34]='Y'
   set charz[35]='Z'
   set maxchars=35
   set charsetinited=true
 endif
endfunction


function InitRawCodesBX takes nothing returns nothing
   local integer i=0
   local integer rawblank='A'*0x1000000+'0'*0x10000
   local integer raw=0
   call InitcharsetBX()
// watch out for operation limit !
  loop
    exitwhen i>10 // optional // set charz[10]='A' aka last will be 'A0AZ'
    set i2=0
   loop
    exitwhen i2>maxchars
     set raw=rawblank+charz[i]*0x100+charz[i2]
// now you get the "unique" war3 generated id.
    set i2=i2+1
   endloop
    set i=i+1
  endloop
endfunction


Toadcop добавил:
еее вот в таких случиях как раз удобно юзать hex =) когда числа являютьса степению 2ойки.
Старый 21.08.2008, 14:45
agentex

offline
Опыт: 34,834
Активность:
ладно спс буду разбираться
т.е. в raw под вторым циклом будет находится следующий равкод?
Старый 21.08.2008, 15:06
Toadcop

offline
Опыт: 54,313
Активность:
Цитата:
set raw=rawblank+charz[i]*0x100+charz[i2]
- это равкод =) по идеи...
Старый 21.08.2008, 15:10
agentex

offline
Опыт: 34,834
Активность:
exitwhen i>10 // optional // set charz[10]='A' aka last will be 'A0AZ'
а это означает что после 'A0AZ' будет ити равкод 'A0B0' ?
я просто не очень понимаю как распределяются разряды в равах

agentex добавил:
а это rawblank='A'*0x1000000+'0'*0x10000 для меня вообще загадка =)

agentex добавил:
слух еще вопрос был в exitwhen "or" катит? ну т.е.
exitwhen i>5 or GetItemName(it) == GetObjectName(raw) будет корректно работать?

agentex добавил:
УРАА! заработало!!! Респектище тебе! всегото нужно было в одном месте добавить i=0 и адаптировать твою ф-ию для моего тригера

Отредактировано agentex, 21.08.2008 в 15:43.
Старый 21.08.2008, 16:06
Toadcop

offline
Опыт: 54,313
Активность:
Цитата:
а это означает что после 'A0AZ' будет ити равкод 'A0B0' ?
я просто не очень понимаю как распределяются разряды в равах
это означает что AZ. это последний равкод =)

agentex ну и зашибись =)
Старый 21.08.2008, 18:39
adic3x

offline
Опыт: 108,439
Активность:
http://xgm.guru/articles.php?section=wc3&name=about_int )))

сабж, равкоды идут вообще по нетрадиционным числам т.е. скажем равкод с чаром 00h (ака конец строки) невозможен

собстно Тс и предложил цикл по чарам...

можно поинтересоваться целью такой работы? ведб все равдоды la'defined, и мб это можно решить иначе
Старый 21.08.2008, 18:59
agentex

offline
Опыт: 34,834
Активность:
Цитата:
Сообщение от Toadcop
это означает что AZ. это последний равкод =)

нет я имею ввиду впринципе какой будет после нее ити равкод, ну например если через РО добавить еще абилу
ADOLF не у меня просто мапа с системой покупки заклинаний (и последующей прокачкой через +), а для нее нужно присвоить этим переменным
udg_ABLS_humanitems[]
udg_ABLS_humanspells[]
udg_ABLS_hordeitems[]
udg_ABLS_hordespells[].
уникальные itemId и AbilityId соответственно.

Собсна до этого приходилось вручную задавать каждую пару абила\предмет, а это довольно геморно, особенно если у тя 100+ скилов
Старый 21.08.2008, 20:02
adic3x

offline
Опыт: 108,439
Активность:
дык я бы либо создавал все равкоды как я писал встатье (ссыль выше, тебе же их всеравно создавать, зри пример про артефакт и юнита) либо конвертнул бы в слк и там руками легко править (много легче чем в ОЕ)
Старый 21.08.2008, 20:12
agentex

offline
Опыт: 34,834
Активность:
да, смотрел я твою статью но почти ниче там непонял (либо лень было вьезжать)
хм а разве после конверта в слк и импорта в мапу работа в обычном РО будет возможна? (ну вернее при загрузке то данные будут браться из слк, т.е. каждый раз после внесения изменений придется конвертить + импортить что некатит)
Старый 21.08.2008, 20:31
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
хм а разве после конверта в слк и импорта в мапу работа в обычном РО будет возможна?

нет
Цитата:
ну вернее при загрузке то данные будут браться из слк, т.е. каждый раз после внесения изменений придется конвертить + импортить что некатит

вносить изменения сразу в слк и импортить, что очень даже катит (импорт вполне окупается по времени благодаря отсутсвием лагов в екселе и кучей их же в ОЕ)
Цитата:
но почти ниче там непонял

нокоент=/
Старый 22.08.2008, 00:24
Закрытая тема

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

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

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

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



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