Сейчас 09:56:21 Понедельник, 29 апреля, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » Скилл Механика у Тинкера (Апргрейд абилок)
Скилл Механика у Тинкера
FatalBladeДата: Пятница, 05 Августа 2011, 14:19:51 | Сообщение # 1
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Все знают что за скилл? Если нет вкратце обьясню. Этот скилл пассивка, улучшает заданные абилки, с первой на вторую. Т.е. задаются 2 абилки. Ну там можно сделать 4 апгрейда, так что для каждого апгрейда 2 абилки, и того 8.
Так вот, сделал как бы покупку скиллов герою, на выбор 3 из 9, по линейкам. Сделал нейтральный невидимый магазин с абилками пустышками с иконками нужных абилок героя, и когда герой тыкает на 1 из абилок, то из магазина удаляется выбранная абилка + остальные 2 абилки которые можно было бы выбрать вместо выбранное. И у героя появляется нужная абилка, прокачиваемая.
Создаётся 3 геройские абилки пустышки, которые по умолчанию есть у всех героев (задано ещё в ВЕ), назовём их Spell1, Spell2, Spell3. Создаётся 3 абилки Механики, в каждой из которых уровней = количество героев * 3. На каждый лвл своя геройская абилка. Когда герой выбирает в магазине абилку (пустышку), то герою даётся Механика, соответствующая слоту самой геройской абилки. То есть герой должен выбрать 3 абилки, он получает 3 механики. В механике, каждый лвл выставляется в строке Ability Upgrade 2 абилки, первая эта пустышка Spell1 или Spell2 или Spell3 (опять же в зависимости от слота). Вторая, это сама геройская абилка. То есть в итоге Механика апгрейдит пустышку на нужную геройскую абилку, и та появляется у героя в Learn Skills.

Весь алгоритм уже реализован, и прекрасно работает. Сделано через хэш. Проблема в самой Механике. Оказывается там можно апгрейдить абилку только на похожую абилку. Например если Spell1 на основе Канала, то и та геройская абилка на которую она должна апгрейдится, тоже должна быть на основе Канала (ID канала не важен). Иначе Spell1 пропадёт, а нужная абилка не появится. Я попробовал сделать Spell1 пассивкой, так он тоже принимает только пассивки на основе этой же. А ведь у меня спеллы на основе многих скиллов... Что делать? Как схитрить и обойти это, или как по другому реализовать то что я сделал?

Я попробовал альтернативу - в хэш сохранять равкоды геройских абилок, и потом когда герой покупает абилку в магазине, то дать герою ту самую геройскую абилку которая сидит в хэше под номером абилки из магазина. Ну и сохраняются ещё и другие абилки в том же слоте, которые должны удаляться с магазина, и то же потом удаляются. Тут тоже всё работает в плане алгоритма, но UnitAddAbility не даёт прокачиваемую абилку герою. Она даёт абилку определённого лвла, и её нельзя прокачивать. Что делать?




Сообщение отредактировал FatalBlade - Пятница, 05 Августа 2011, 14:22:59
 

FkoFFДата: Пятница, 05 Августа 2011, 14:30:31 | Сообщение # 2
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Quote (FatalBlade)
Весь алгоритм уже реализован, и прекрасно работает. Сделано через хэш. Проблема в самой Механике. Оказывается там можно апгрейдить абилку только на похожую абилку. Например если Spell1 на основе Канала, то и та геройская абилка на которую она должна апгрейдится, тоже должна быть на основе Канала (ID канала не важен). Иначе Spell1 пропадёт, а нужная абилка не появится. Я попробовал сделать Spell1 пассивкой, так он тоже принимает только пассивки на основе этой же. А ведь у меня спеллы на основе многих скиллов... Что делать? Как схитрить и обойти это, или как по другому реализовать то что я сделал? Я попробовал в хэш сохранять равкоды геройских абилок, и потом когда герой покупает абилку в магазине, то дать герою ту самую геройскую абилку которая сидит в хэше под номером абилки из магазина. Ну и сохраняются ещё и другие абилки в том же слоте, которые должны удаляться с магазина, и то же потом удаляются. Тут тоже всё работает в плане алгоритма, но UnitAddAbility не даёт прокачиваемую абилку герою. Она даёт абилку определённого лвла, и её нельзя прокачивать. Что делать?


Бред ложь и провокация ) у меня активки и на пассивки меняются, и ничего )

Ты просто не правильно заполняешь механику )
Открой ве и найди смену спеллов.

Предположим что у тебя
A001 = Скилл пустышка, который заменяется
A003 - спелл который на втором уровне механики дается
A002 - спелл на первом уровне механики.

И заполнено по уровням в механике вот так:
A001,A002
A001,A003

Тоесть каждый уровень меняет оригинальную пустышку на новый скилл, но так оно работать не будет. Заполнятся должно так:

A001,A002
A002,A003

И когда герой изучает навык, к примеру, 10-го уровня, он заочно получит все навыки на этот слот с первого по десятый уровень (будет наблюдаться некоторая задержка). по этому все ветки перед игрой требуется прелоадить.


 

FatalBladeДата: Пятница, 05 Августа 2011, 14:43:48 | Сообщение # 3
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (FkoFF)
И заполнено по уровням в механике вот так:
A001,A002
A001,A003

Угу

Quote (FkoFF)
A001,A002
A002,A003

:o

Quote (FkoFF)
И когда герой изучает навык, к примеру, 10-го уровня, он заочно получит все навыки на этот слот с первого по десятый уровень (будет наблюдаться некоторая задержка). по этому все ветки перед игрой требуетсяпрелоадить.

Поподробнее плз


 

SirNikolasДата: Пятница, 05 Августа 2011, 14:50:00 | Сообщение # 4
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (FatalBlade)
прелоадить
Ты хотел сделать это с кнопкой F9.


 

FkoFFДата: Пятница, 05 Августа 2011, 15:03:27 | Сообщение # 5
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Quote (SirNikolas)
Ты хотел сделать это с кнопкой F9.

эээ? щито?

Прелоадить спеллы достаточно просто - во время инициализации создается герой (как раз такой, у которого все эти спеллы есть), и ему через функцию добавляются спеллы.. условно говоря как то так:

function PreloadSpell takes unit u, integer ability, integer maxlevel returns nothing
call UnitAddAbility(u,ability)
call SetUnitAbilityLevel(u,ability,maxlevel)
call UnitRemoveAbility(u,ability)
endfunction

function PreloadBlock takes nothing returns nothing
local unit u=CreateUnit(Player(13),'Hpal',0,0,0)
call PreloadSpell(u,'A001',60)
call PreloadSpell(u,'A002,25)
call RemoveUnit(u)
call Preload("war3mapImported//Hero_GodlyPaladin.mdx")
endfunction

последняя функция (Preload(string)) подгружает в память модель со всеми текстурами и при первом появлении этой модели на карте не будет никаких ровным счетом тормозов. Бтв, можно проще - создавать в качестве спецэффекта, но это объекты, а тут - просто подгрузка )


 

FatalBladeДата: Пятница, 05 Августа 2011, 15:07:48 | Сообщение # 6
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (SirNikolas)
Ты хотел сделать это с кнопкой F9.

Типа заставить игрока на что то нажать? Но причём тут это?

Quote (FkoFF)
И когда герой изучает навык, к примеру, 10-го уровня, он заочно получит все навыки на этот слот с первого по десятый уровень

Стоп. А ведь если герой изучает например скилл 10 лвла в механике, а в механике как ты написал - с каждым лвлом улучшается предыдущая абилка, то в итоге, герой не получит все 10 абилок. Он получит последнюю, то есть ту что мне нужно. Нет? Ведь когда абилка апгрейдится, она заменяется.

Добавлено (05-08-2011, 15:07)
---------------------------------------------

Quote (FkoFF)
Прелоадить спеллы достаточно просто - во время инициализации создается герой (как раз такой, у которого все эти спеллы есть), и ему через функцию добавляются спеллы.. условно говоря как то так:

1 герой для всех героев, или для каждого?
В чём смысл вообще этого Прелоада?


 

SirNikolasДата: Пятница, 05 Августа 2011, 15:10:04 | Сообщение # 7
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (FkoFF)
call Preload("war3mapImported//Hero_GodlyPaladin.mdx")
Интересно, что произойдет, если дважды подгрузить один и тот же объект?
P. S. А где "u = null"?

Добавлено (05-08-2011, 15:10)
---------------------------------------------

Quote (FatalBlade)
В чём смысл вообще этого Прелоада?
Тормозит карта в первый раз во время прелоада, а не во время выбора героя.


 

ExtrematorДата: Пятница, 05 Августа 2011, 15:10:35 | Сообщение # 8
10 уровень
Группа: Проверенные
Сообщений: 3199
Награды: 0
Репутация: 1018
Блокировки:
создаёшь дамми...
даёшь ему все абилки (апнутые техникой)...
убераешь дамми...

прелоад завершён, полёт нормальный....
 

FkoFFДата: Пятница, 05 Августа 2011, 15:11:02 | Сообщение # 9
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Quote (FatalBlade)
Стоп. А ведь если герой изучает например скилл 10 лвла в механике, а в механике как ты написал - с каждым лвлом улучшается предыдущая абилка, то в итоге, герой не получит все 10 абилок. Он получит последнюю, то есть ту что мне нужно. Нет? Ведь когда абилка апгрейдится, она заменяется.

когда будет повышен уровень механики - апгрейд будет происходить по очереди, сам игрок этого не заметит - но лаги будут.

Quote (FatalBlade)
1 герой для всех героев, или для каждого? В чём смысл вообще этого Прелоада?

Он удаляется в самом начале игры, да, он для всех.

Смысл прелоада - подгрузка в память процесса информации, что бы когда следующий раз пошло обращение к этой информации - игра не подвисла на пару секунд(минут?).

Вот например, у урсы в доте 500 уровней спелла, дающего +1dmg, если бы способность не прелоадилась - при выборе героя игра висла бы минуты на 2, на слабых компьютерах.


 

ExtrematorДата: Пятница, 05 Августа 2011, 15:11:44 | Сообщение # 10
10 уровень
Группа: Проверенные
Сообщений: 3199
Награды: 0
Репутация: 1018
Блокировки:
делать можно со всеми абилками при ините карты... и всё
 

FkoFFДата: Пятница, 05 Августа 2011, 15:11:48 | Сообщение # 11
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Quote (SirNikolas)
P. S. А где "u = null"?

на коленке в форуме писал, так что мог и забыть )


 

ExtrematorДата: Пятница, 05 Августа 2011, 15:12:58 | Сообщение # 12
10 уровень
Группа: Проверенные
Сообщений: 3199
Награды: 0
Репутация: 1018
Блокировки:
Quote (FkoFF)
Вот например, у урсы в доте 500 уровней спелла, дающего +1dmg, если бы способность не прелоадилась - при выборе героя игра висла бы минуты на 2, на слабых компьютерах.

+1 ...реальный случай... спорить бесполезно... кто не верит могу скинуть уже готовый набросок... ))
 

SirNikolasДата: Пятница, 05 Августа 2011, 15:13:03 | Сообщение # 13
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (FkoFF)
при выборе героя игра висла бы минуты на 2, на слабых компьютерах.
Если лаги сдвигаются ближе к инициализации, то почему у меня Дота грузится меньше двух минут?


 

FatalBladeДата: Пятница, 05 Августа 2011, 15:19:20 | Сообщение # 14
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Ок в плане спеллов всё работает, но другие пустышки в магазине не удаляются. Я сохраняю в каждый равкод абилки уровень механики, слот, и 2 другие абилки в магазине (ракоды). Потом при выборе пишу:
local integer i = GetSpellAbilityId()
local integer c
local integer в
set c = LoadInteger(udg_Abilities,i,2)
set d = LoadInteger(udg_Abilities,i,3)
call UnitRemoveAbilityBJ( i, GetSpellAbilityUnit() )
call UnitRemoveAbilityBJ( c, GetSpellAbilityUnit() )
call UnitRemoveAbilityBJ( d, GetSpellAbilityUnit() )

Но удаляется только первое.


 

ExtrematorДата: Пятница, 05 Августа 2011, 15:21:18 | Сообщение # 15
10 уровень
Группа: Проверенные
Сообщений: 3199
Награды: 0
Репутация: 1018
Блокировки:
Quote (FatalBlade)
Ок в плане спеллов всё работает, но другие пустышки в магазине не удаляются. Я сохраняю в каждый равкод абилки уровень механики, слот, и 2 другие абилки в магазине (ракоды). Потом при выборе пишу: local integer i = GetSpellAbilityId() local integer c local integer в set c = LoadInteger(udg_Abilities,i,2) set d = LoadInteger(udg_Abilities,i,3) call UnitRemoveAbilityBJ( i, GetSpellAbilityUnit() ) call UnitRemoveAbilityBJ( c, GetSpellAbilityUnit() ) call UnitRemoveAbilityBJ( d, GetSpellAbilityUnit() ) Но удаляется только первое.

отладочное сообщение пробуешь юзать?
 

FkoFFДата: Пятница, 05 Августа 2011, 15:21:28 | Сообщение # 16
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Quote (SirNikolas)
Если лаги сдвигаются ближе к инициализации, то почему у меня Дота грузится меньше двух минут?

По тому что когда прелоад происходит во время инициализации - он не нагружает память так сильно, как во время игры. Причины тому - отсутствие исполняемого кода (помимо инициализации) + нет обновления экрана, тоесть 60% систем варкрафта просто простаиваются. И то, что в игру вешает на минуту, в прелоаде займет секунду.


 

FatalBladeДата: Пятница, 05 Августа 2011, 15:25:00 | Сообщение # 17
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (SirNikolas)
Тормозит карта в первый раз во время прелоада, а не во время выбора героя.

Ок. Правда у меня не тормозит при выборе героя, но у меня комп сильный))))

Quote (FkoFF)
когда будет повышен уровень механики - апгрейд будет происходить по очереди, сам игрок этого не заметит - но лаги будут.

Ясно. Но главное что герой получит желаемую абилку. И только её. ?

Quote (FkoFF)
Он удаляется в самом начале игры, да, он для всех.

Но ведь нельзя дать герою больше 5 хиро абилок.

Quote (FkoFF)
Смысл прелоада - подгрузка в память процесса информации, что бы когда следующий раз пошло обращение к этой информации - игра не подвисла на пару секунд(минут?).

ээ.. это варкрафт 3 а не Crysis :D

Quote (SirNikolas)
Если лаги сдвигаются ближе к инициализации, то почему у меня Дота грузится меньше двух минут?

В доте импорта мало. мб изза этого?


 

FkoFFДата: Пятница, 05 Августа 2011, 15:26:11 | Сообщение # 18
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Quote (FatalBlade)
Ок в плане спеллов всё работает, но другие пустышки в магазине не удаляются. Я сохраняю в каждый равкод абилки уровень механики, слот, и 2 другие абилки в магазине (ракоды). Потом при выборе пишу: local integer i = GetSpellAbilityId() local integer c local integer в set c = LoadInteger(udg_Abilities,i,2) set d = LoadInteger(udg_Abilities,i,3) call UnitRemoveAbilityBJ( i, GetSpellAbilityUnit() ) call UnitRemoveAbilityBJ( c, GetSpellAbilityUnit() ) call UnitRemoveAbilityBJ( d, GetSpellAbilityUnit() ) Но удаляется только первое.

хэштаблицу заинитить ты забыл )

в триггер где заполняется база в самый верх впихни через custom script: set udg_Abilities = InitHashtable()

Добавлено (05-08-2011, 15:26)
---------------------------------------------

Quote (FatalBlade)
о ведь нельзя дать герою больше 5 хиро абилок.

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


 

FatalBladeДата: Пятница, 05 Августа 2011, 15:35:50 | Сообщение # 19
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (Extremator)
отладочное сообщение пробуешь юзать?

?

Quote (FkoFF)
По тому что когда прелоад происходит во время инициализации - он не нагружает память так сильно, как во время игры.

Зато инициализация будет долгой, не? И кстати возможно ли уменьшить время загрузки карты (Loading Screen), то есть некоторые вещи загружать уже по ходу игры (по ходу надобности в игре)?
Например есть игры где когда игрок заходит в игру, и там есть большой игровой мир, то он загружается весь сразу, пожтому загрузка очень долгая, но зато загружается всё. А бывает игры где игровой мир загружается по локациям, и поэтому когда игрок входит в игру, то загружается только локация в которой он находится, а значит загрузка идёт намного быстрее. Но минус в том, что каждый раз при переходе в другую локацию, выскакивает загрузка, и надо ждать пока она загрузиться. Но опять же это не долго.

Добавлено (05-08-2011, 15:35)
---------------------------------------------

Quote (FkoFF)
set udg_Abilities = InitHashtable()

У меня это написано при инициализации.

Quote (FkoFF)
так ты просто на любого юнита должен дать абилки, а давать их герою надо что бы подгрузить все ветки скиллов разом, понимаешь?

То есть дать абилку, удалить абилку, дать абилку, удалить абилку... так? Ну с функцией естественно))


 

SirNikolasДата: Пятница, 05 Августа 2011, 15:44:33 | Сообщение # 20
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (FatalBlade)
время загрузки карты (Loading Screen)
Loading Screen - это загрузочный экран.
Quote (FatalBlade)
некоторые вещи загружать уже по ходу игры
Quote (FkoFF)
когда прелоад происходит во время инициализации - он не нагружает память так сильно, как во время игры.
Quote (Extremator)
отладочное сообщение пробуешь юзать?
call BJDebugMsg(I2S(GetHandleId(udg_Abilities)) + " " + I2S(LoadInteger(udg_Abilities, i, 2)) + " " + I2S(LoadInteger(udg_Abilities, i, 3)))

Добавлено (05-08-2011, 15:44)
---------------------------------------------

Quote (FatalBlade)
GetSpellAbilityUnit()
Кстати, замени на GetTriggerUnit(). Мелочь, но все же лучше будет.


 

FkoFFДата: Пятница, 05 Августа 2011, 15:44:42 | Сообщение # 21
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Quote (FatalBlade)
то есть некоторые вещи загружать уже по ходу игры (по ходу надобности в игре)?

Lags waits for you :P
Quote (FatalBlade)
а значит загрузка идёт намного быстрее.

Будут наблюдаться массивные лаги при переходе с локацию на локацию. А вообще конечно можно крипов создавать только если есть герои на локации, но это отдельная песня.

Quote (FatalBlade)
То есть дать абилку, удалить абилку, дать абилку, удалить абилку... так? Ну с функцией естественно))

вроде того, просто даешь каждую из механик, выставляешь им макс уровень, тогда в игре не будет лагов при выборе скиллов. У меня то уже, прости госсподи, под 120 скиллов реализовано так, я знаю о чем говорю )


 

ExtrematorДата: Пятница, 05 Августа 2011, 15:57:26 | Сообщение # 22
10 уровень
Группа: Проверенные
Сообщений: 3199
Награды: 0
Репутация: 1018
Блокировки:
Quote (FatalBlade)
?

вывод сообщения на дисплей со значениями... если пишется, значит ловит и проблема дальше... если нет - проблема в вылове
 

FatalBladeДата: Пятница, 05 Августа 2011, 16:21:58 | Сообщение # 23
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (FkoFF)
Будут наблюдаться массивные лаги при переходе с локацию на локацию. А вообще конечно можно крипов создавать только если есть герои на локации, но это отдельная песня.

Локации это я привёл пример. Конечно в карте с размером 128х128 не нужно загружать локации по отдельности. Но например модели героев. Например загружать модель героя только если он выбран игроком. Если этот герой не выбран, то модель не будет загружаться. Она не нужна)

Добавлено (05-08-2011, 16:10)
---------------------------------------------

Quote (SirNikolas)
Loading Screen - это загрузочный экран.

* То что происходит когда отображается загрузочный экран))

Добавлено (05-08-2011, 16:21)
---------------------------------------------
И ещё. Если уже прелодить, то возможно прелодить условия? Ведь каждое условие, это как бы переменная Boolean. А у меня есть громоздкие условия для предметов, например Мечи, Топоры, Посохи.... Какие то герои могут их носить, какие то нет. Так там условия, если такой то герой приобрёл предмет, и идёт целый список героев которые не могут его носить....


 

FkoFFДата: Пятница, 05 Августа 2011, 16:26:30 | Сообщение # 24
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Quote (FatalBlade)
Например загружать модель героя только если он выбран игроком

она итак сразу загрузится.

Quote (FatalBlade)
Ведь каждое условие, это как бы переменная Boolean.

переменные буль - не весят ничего, это число от 0 до 1.

Quote (FatalBlade)
Так там условия, если такой то герой приобрёл предмет, и идёт целый список героев которые не могут его носить....

Тут надо не прелоадить что то а полностью оптимизировать метод. Понимаешь?


 

HexingДата: Пятница, 05 Августа 2011, 18:38:11 | Сообщение # 25
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
Quote (FkoFF)
переменные буль - не весят ничего, это число от 0 до 1.

Я думаю ты не имеешь права судить об этом, пока не покажешь открытый код движка варика.
В некоторых языках программирования(самых простых) boolean = integer = 4 байта. В норм языках вроде c++ это 1 байт. В delphi(насчет си не знаю) есть возможность создания "упаковок": packed record boolean, тоесть так как у булина 2 значения(аля бинарный код), можно создать суммарность по очень выгодной прогрессии (0-1+ 3-4 +...) и уместить в тех же 4 байтах ну очень большое количество булинов. Я думаю что хоть ты булин хоть интегер создавай, на современных компах это не проблема, един. проблема варика в утечках и только в них.


 

Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » Скилл Механика у Тинкера (Апргрейд абилок)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz