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

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

Результаты опроса: Голосуем
16GB 50 80.65%
Nerevar 12 19.35%
Голосовавшие: 62. Вы еще не голосовали в этом опросе

  • Дуэлянты - 16Gb, Nerevar
  • Тема - Техника
  • Начало голосования - 03.07.11
  • Окончание голосования - 10.07.11
АвторНазвание работыСпособ исполненияЦельУровниMUIИмпортГолоса
16GbРакетыJassunit1данет<голосование идёт>
NerevarЗажигательная ракетаJassAOE4данет<голосование идёт>

Ответ
 
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
сори, значит совпадение. =)
Старый 03.07.2011, 16:17
Helpmeplz

offline
Опыт: 11,738
Активность:
голосовал конечно же за 16GB.
красиво, интересно. сделал заметку для нового героя в impossible siege 2.
у Nerevar слишком просто. больше нечего сказать.
Старый 03.07.2011, 17:22
prog

offline
Опыт: 32,865
Активность:
16GB
достаточно оригинально и эффектно, вызывает желание пойти сделать карту, в которую вписалась бы подобная способность
Nerevar
по сути - обычный дамми-каст, ничего кроме воспоминаний об унылых картах где надо перебить 100500 мобов не вызывает
Старый 03.07.2011, 17:24
FKoFF
Venomancer 89lvl. Europe
offline
Опыт: 5,975
Активность:
Конечно у 16GB достойный спелл, однако слова Manhun1, о том что это смогут реализовать единицы - ложь, не такой уж и сложный этот спелл, что впрочем не мешает ему быть достаточно зрелищным и интересным на вид.
одно замечание по исполнению - слишком много лишних функций (string hash) которая так же как I2S не имеет смысла (I2S("pew")=='pew')
В связи с этим:
Jass: 4\5
Реализация Задумки: 5\5, ибо рационально.
Зрелищность: 4.3\5, Потому как есть один косяк. Ракеты не имеют инерции, тобишь когда цель умирает, ракеты вдруг начинают плавную посадку, хотя угол между ракетой и целью был под 270 градусов считая с горизонтального нуля.
Идея: 3\5, потому как все достаточно банально; обычный DD спелл, однако изысканное исполнение не слабо повышает его цену.
Итого: 4+5+4.3+3 \ 20 = 4\5
Спелл Nerevar
Код:
local unit dammicaster
local unit dammitarget
...
set dammicaster=CreateUnit(GetOwningPlayer(caster), 'u000', x, y, 0)
set dammitarget=CreateUnit(GetOwningPlayer(caster), 'u000', tx, ty, 0)
заставляют ощущать неопытность автора.
Так же строка:
call SetUnitAbilityLevel( dammicaster,'A003',  R2I(I2R(int)/I2R((22-level*2))/0.1) )
Автор по всей видимости даже не подозревает о том что команда I2R бессмысленна, и что целые числа вполне можно вписывать без неё в формулы оперирующие real числами.
Так же бессмысленна local group g=CreateGroup() потому как лишние объекты нам ненужны, а шансы коллизии групп при моментальном их очищении равны нулю.
""
(GetWidgetLife(f) > 0.405)
""
IsUnitType(f,UNIT_TYPE_DEAD)==false работает быстрее и не срабатывает если юнит находится под реинкарнацией.
Далее следим за комментариями:
((код jass
call GroupEnumUnitsInRange(g, tx, ty, 300, null)
loop
set f = FirstOfGroup(g)
exitwhen f == null
if IsPlayerEnemy(GetOwningPlayer(caster), GetOwningPlayer(f)) and (GetWidgetLife(f) > 0.405) and IsUnitType(f, UNIT_TYPE_STRUCTURE) != true and IsUnitType(f, UNIT_TYPE_MECHANICAL) != true and IsUnitType(f, UNIT_TYPE_ANCIENT) != true and IsUnitType(f, UNIT_TYPE_MAGIC_IMMUNE) != true then
set remove=LoadInteger(udg_ah,GetHandleId(f),S2I("remove"))+1
set t=CreateTimer()
t в последствии не обнуляется; == утечка.
set id=GetHandleId(t)
call UnitAddAbility( f , 'A001' )
call SetUnitAbilityLevel(f,'A001', level )
call SaveInteger(udg_ah,GetHandleId(f),S2I("remove"),remove)
'remove' было бы более быстрым, потому как это было бы сразу интегерное число, в которое, к слову, и превращается S2I("remove")
call SaveUnitHandle(udg_ah,id,1,f)
call TimerStart(t,6.,false,function fire_rocket_m)
щито это за дьявольский бред выше? Не проще ли написать отдельную НОРМАЛЬНУЮ функцию на добавление абилы юниту?
call GroupRemoveUnit(g, f)
else
call GroupRemoveUnit(g, f)
endif
call GroupRemoveUnit(g,f) следует вынести вообще за пределы ифзена.
endloop
))
Но это еще не все; автор пользуется техникой смещения массивов на хэштаблице, это все равно что катить машину в ручную, когда у неё есть колеса и топливо.
Jass: 1.3\5, все описано выше
Реализация задумки: 1.\5, стун и пожар можно сделать на джасс без использования дамми юнитов и лишних абил, а соответственно колоссально увеличить производительность этих моментов.
Зрелищность: 2.\5, это мы уже видели неоднократно.
Идея: 2.\5, лишний бал за то что есть чувство меры, впрочем стун + поджег + снятие защиты уже достаточно много.
итого 1.3+1.+2.+2. \ 20 = 1.5\5; провальная работа.
Голос за 16GB
Старый 03.07.2011, 17:42
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
set dammicaster=CreateUnit(GetOwningPlayer(caster), 'u000', x, y, 0)
set dammitarget=CreateUnit(GetOwningPlayer(caster), 'u000', tx, ty, 0)
Я так сделал потому что отследить точно время между началом и концом полета ракеты нельзя(т.к. у неё имеется траектория движения),если я буду заставлять юнита,который использует Ракетный удар,то он не будет давать стана,т.к. канальный)
call TimerStart(t,6.,false,function fire_rocket_m)
Этот таймер запускается отнюдь не для добавления абилы юниту, а для нормального её удаления через 6 секунд(за её удаление отвечает переменная remove(допустим что перезарядки у абилы не было бы,тогда запустив 1 ракету,за ней через 2 секунды другую,обе бы сняли защиту юниту,причём защита бы вернулась после 6 секунд после добавления в первой ракете,несмотря на то,что она должна была провисеть,пока не закончатся 6 секунд второй ракеты),в итоге эта переменная не даёт такому случиться.
call SaveInteger(udg_ah,GetHandleId(f),S2I("remove"),remove)
S2I("remove") я использую лишь потому,что в карте таких стаковых магий может быть несколько,чтобы отделить каждую такую переменную для каждого скила.
Про "технику смещения массивов на хэштаблице" я не понял - поясни пожайлуста.
else
call GroupRemoveUnit(g, f)
endif
endloop
set caster=null
set dammicaster=null
set dammitarget=null
call DestroyGroup(g)
set g=null
set f=null
set t=null
В конце обнуляется переменная,разве нельзя её несколько раз использовать?
call SetUnitAbilityLevel( dammicaster,'A003',  R2I(I2R(int)/I2R((22-level*2))/0.1) )
Разве можно передать для уровня реальное число,которое может быть и 19.172 и каким хочешь?
Старый 03.07.2011, 20:27
FKoFF
Venomancer 89lvl. Europe
offline
Опыт: 5,975
Активность:
Nerevar:
Разве можно передать для уровня реальное число,которое может быть и 19.172 и каким хочешь?
int = целое число, 22-level*2 тоже операция с целыми числами. Вопрос - зачем используется i2r?
Nerevar:
Я так сделал потому что отследить точно время между началом и концом полета ракеты нельзя(т.к. у неё имеется траектория движения),если я буду заставлять юнита,который использует Ракетный удар,то он не будет давать стана,т.к. канальный)
бред по той простой причине что ты сразу после блока объявления локальных переменных создаешь этих самых дамми. суть ошибки в том что должно быть
local unit dammicaster=CreateUnit(GetOwningPlayer(caster), 'u000', x, y, 0)
local unit dammitarget=CreateUnit(GetOwningPlayer(caster), 'u000', tx, ty, 0)
Nerevar:
Этот таймер запускается отнюдь не для добавления абилы юниту, а для нормального её удаления через 6 секунд(за её удаление отвечает переменная remove(допустим что перезарядки у абилы не было бы,тогда запустив 1 ракету,за ней через 2 секунды другую,обе бы сняли защиту юниту,причём защита бы вернулась после 6 секунд после добавления в первой ракете,несмотря на то,что она должна была провисеть,пока не закончатся 6 секунд второй ракеты),в итоге эта переменная не даёт такому случиться.
щито это за дьявольский бред выше? Не проще ли написать отдельную НОРМАЛЬНУЮ функцию на добавление абилы юниту?
я имел ввиду отдельную функцию на временное добавление абилы. и хэндл юнита должен использоваться совершенно по другому..
ознакомься с тем, как это должно выглядеть:
» Нормальная АПИшная функция
unction GATcb takes nothing returns nothing    
local timer t=GetExpiredTimer()    
local integer ti=GetHandleId(t)    
local unit u=LoadUnitHandle(udg_Data,ti,0)    
local integer ui=GetHandleId(u)    
local integer abilcode=LoadInteger(udg_Data,ti,1)    
local real time=LoadReal(udg_Data,ui,abilcode)    

if time>0 then    
set time=time-0.1    
call SaveReal(udg_Data,ui,abilcode,time)    
else    
call UnitRemoveAbility(u,abilcode)    
call SaveReal(udg_Data,ui,abilcode,0)    
call FlushChildHashtable(udg_Data,GetHandleId(t))    
call DestroyTimer(t)    
set t=null    
endif    

endfunction    

function GiveAbilityTimed takes unit u, integer abilcode, integer lvl, real duration returns nothing    
local timer t    
local integer ui =GetHandleId(u)    
local integer ti    
if LoadReal(udg_Data,ui,abilcode) == null or LoadReal(udg_Data,ui,abilcode)<=0 then    
set t=CreateTimer()    
set ti=GetHandleId(t)    
call UnitAddAbility(u,abilcode)    
call SetUnitAbilityLevel(u,abilcode,lvl)    
call SaveInteger(udg_Data,ti,1,abilcode)    
call SaveUnitHandle(udg_Data,ti,0,u)    
call SaveReal(udg_Data,GetHandleId(u),abilcode,duration)    
call TimerStart(t,0.1,true,function GATcb)    
set t=null    
else    
call SaveReal(udg_Data,ui,abilcode,duration)    
if GetUnitAbilityLevel(u,abilcode) != lvl then 
call SetUnitAbilityLevel(u,abilcode,lvl) 
endif    
endif 
endfunction
Nerevar:
Про "технику смещения массивов на хэштаблице" я не понял - поясни пожайлуста.
я про set remove=LoadInteger(udg_ah,GetHandleId(f),S2I("remove"))+1
Nerevar:
В конце обнуляется переменная,разве нельзя её несколько раз использовать?
хм, не заметил, мои извинения.
R2I(I2R(int)/I2R((22-level*2))/0.1) 
должно выглядеть так:
R2I(int/(22-level*2)/.1)

Отредактировано FKoFF, 03.07.2011 в 21:48.
Старый 03.07.2011, 21:18
silumin

offline
Опыт: 11,153
Активность:
Оба спелла мрачные, неинтересные и до жути банальные.


16Gb:



Идея: 10/35.
Обычный дамми с "наведением" на цель, только "размноженный". Падение ракеты в случайную точку, если цель уничтожена - минус, имхо.

Внешний вид: 15/35.
Захватывает именно массовостью и не более. Нет изюминки. Взрывы можно было "прикрутить" более красивые.

Исполнение: 15/30.
Бегло просмотрел код, не разбираясь в тонкостях. Написано аккуратно, но нечитаемо. Настройки "спрятаны" в коде. Слишком "объёмная" реализация.

Итого: 40/100

Nerevar



Идея: 1/35.
Для дуели можно было бы поднапрячь фантазию, а так - банальщина.

Внешний вид: 5/35.
Ракета слишком велика относительно отряда. Если 16Gb поскупился на взрывы, то Nerevar явно переборщил.

Исполнение: 5/30.
Банальная идея - банальное исполнение. Использование BJ. Ничего сложного.

Итого: 11/100

Общий итог:


Оба спелла слишком банальны и неинтересны. Чисто техническая победа 16Gb над Nerevar.
Старый 03.07.2011, 21:41
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
-Почему хэндл юнита вообще не нужен? Ведь получается,что я веду для каждого юнита на карте свою переменную,отвечающую за удаление,которая распологается в хт по адресу хэндла юнита.У тебя он же,судя по коду,тоже используется,только для учёта длительности.Используешь просто другой способ.
-Про "технику смещения массивов на хэштаблице" я не слыxал ни разу - просто,поломав голову над нормальным удалением абилы,нашел такое решение.
Старый 03.07.2011, 21:48
FKoFF
Venomancer 89lvl. Europe
offline
Опыт: 5,975
Активность:
Nerevar, приглядись какой childkey используешь ты, и какой рациональней использовать для полной MUIшности. И подумай зачем я время отсчитываю, если мог бы отсчитывать что угодно другое )
Старый 03.07.2011, 21:50
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Я не вижу практически никакой разницы в наших методах - можно и мой сделать под твой образец,только передаваемый параметр duration можно было сразу вписать во время таймера,запустив его однократным,а дальше при окончании таймера делать мои действия.Различие лишь в том,что твоя функция будет вызываться каждые 0.1 секунды на протяжении duration(что не является необходимым),а моя функция будет вызываться один раз в конце его действия.
Старый 03.07.2011, 22:05
FKoFF
Venomancer 89lvl. Europe
offline
Опыт: 5,975
Активность:
Nerevar:
Я не вижу практически никакой разницы в наших методах - можно и мой сделать под твой образец,только передаваемый параметр duration можно было сразу вписать во время таймера,запустив его однократным,а дальше при окончании таймера делать мои действия.Различие лишь в том,что твоя функция будет вызываться каждые 0.1 секунды на протяжении duration(что не является необходимым),а моя функция будет вызываться один раз в конце его действия.
Удобство в том что ячейка по хэндлу юнита занята рационально, не булем а таймером; к тому же чилдкий использованный мной дает возможность дать юниту хоть 100 разных спеллов на разное время и не будет конфликта между ними, потому как их таймеры будут работать на разные чилдкеи, в твоем же случае тебе придется изобретать какие то дурацкие i2s("remove") и прочий мусор. Но это ладно, еще момент - даже если у юнита уже есть таймер - ты создаешь еще один, увеличивая нагрузку, в моем же случае лишь меняются уровни абил и добавляется время действия, что несомненно удобнее (именно для этого в хэндле хранится таймер).
Старый 03.07.2011, 22:13
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
-Булем у меня ничего не занято.
-Можно просто заменить "какие то дурацкие i2s("remove")" на передаваемое в функцию название абилы - и не будет никаких конфликтов между ними.
-Зачем ты в своей функции используешь таймер с периодом в 0.1?Почему его нельзя однократно запустить на duration?
Старый 03.07.2011, 22:25
elfloo

offline
Опыт: 1,119
Активность:
16GB. однозначно)) Легко настроить даже несведущим людям, впечатляет массовость картинки и изящная траектория движения. +)
Старый 03.07.2011, 22:56
LOR_D
    
offline
Опыт: 8,450
Активность:
У ~16GB спелл намного красивее и интерснее и удобочитаемо.
Старый 03.07.2011, 23:27
FKoFF
Venomancer 89lvl. Europe
offline
Опыт: 5,975
Активность:
Nerevar:
-Зачем ты в своей функции используешь таймер с периодом в 0.1?Почему его нельзя однократно запустить на duration?
для того что бы в нужный момент увеличивать длительность, если требуется.
Старый 04.07.2011, 00:53
FEARSTARTER
desert eagle
offline
Опыт: 19,364
Активность:
Идеи спелов у обоих так себе, слишком банально. Но у 16GB порадовало исполнение, выглядит красиво, ракеты летят плавно и правильно по XYZ с любых растояний, еще забавно мигает тимколор, незнаю у кого там че но столько дамми, а никакой нагрузки на комп я не почувствовал вобще. Не очень понравилось что когда ракеты летят вдоль земли прямо, то не попадают в юнитов, а летят насквозь пока сами не рванут.
Старый 04.07.2011, 01:56
SID69
DET
offline
Опыт: 19,693
Активность:
Однозначно за 16GB, там хоть видна работа и старание, а у Nerevar все как-то просто выглядит, то что можно сделать ну максимум за пол часа!
Старый 04.07.2011, 15:38
sheff4

offline
Опыт: 1,371
Активность:
16GB красивее, но не доработки, по моему мнению ракеты летят в доль карты по не проходимой зоне, атаковать можно всех даже юнит атакует сам себя)
Старый 04.07.2011, 18:22
WaterMan
J.R.R.
offline
Опыт: 17,019
Активность:
16GB имхо, в разы лучше. Хотя от его работы тоже не в восторге.
Старый 04.07.2011, 19:04
Oxygen D
Вернулся
offline
Опыт: 5,180
Активность:
16GB, +1 хороший код, единственно читаемость страдает, а так все круто! Спел красивый.
Nerevar, Bj функции это раз, читаемость еще хуже чем у 16GB, спел не очень и его можно сделать было гораздо проще. Даже без хеша.
Старый 20.07.2011, 00:39
Ответ

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

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

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

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



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