![]()
Warden
:::...
![]() ![]() offline
Опыт:
26,106Активность: |
ИИ_SkillCodeSystem
В этой статье я расскажу о самом удобном способе заставить героя учить и использовать заклинания.
Система о которой будет идти речь называется – Skill Code System. Skill Code System (в дальнейшем, просто - SC) – основана на комбинации Cache + ID converter, что дает обширные возможности в ее использовании. Вы можете за несколько строк обучить десяток героев десятку способностей у которых по десять уровней (и это не предел), нежели писать многотонный код или еще хуже выращивать огромное древо триггерных функций. Конечно какие-то знания в JASS вам необходимы, но я думаю, что большинство меня отлично поймет и оценит мою идею. Для того чтобы использовать SC вам потребуется : 1.В CustomScriptCode (Нестандартный код) следуйщие функции : » CustomScriptCode functions function chr takes integer i returns string local string abc = "abcdefghijklmnopqrstuvwxyz" local string ABC = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" local string digits = "0123456789" if i >= 65 and i <= 90 then return SubString(ABC, i-65,i-64) elseif i >= 97 and i <= 122 then return SubString(abc, i-97,i-96) elseif i >= 48 and i <= 57 then return SubString(digits, i-48,i-47) endif return "" endfunction function CPos takes string StrData, string ToFind, integer From returns integer local integer FromPos = From loop exitwhen (SubString(StrData, FromPos, FromPos+1) == ToFind) or (SubString(StrData, FromPos, FromPos+1) == "") set FromPos = FromPos + 1 endloop if (SubString(StrData, FromPos, FromPos+1) == ToFind) then return FromPos endif return -1 endfunction function int takes string Str returns integer local integer Pos = CPos("ABCDEFGHIJKLMNOPQRSTUVWXYZ", Str, 0) + 65 if Pos == 64 then set Pos = CPos("0123456789", Str, 0) + 48 endif if Pos == 47 then set Pos = CPos("abcdefghijklmnopqrstuvwxyz", Str, 0) + 97 endif if (Str == "") then return 0 else return Pos endif endfunction function ID2String takes integer itemid returns string return chr(itemid/256/256/256) + chr(ModuloInteger(itemid/256/256, 256)) + chr(ModuloInteger(itemid/256, 256)) + chr(ModuloInteger(itemid, 256)) endfunction function String2ID takes string str returns integer return int(SubString(str,0,1))*256*256*256 + int(SubString(str,1,2))*256*256 + int(SubString(str,2,3))*256 + int(SubString(str,3,4)) endfunction function RunSkillCodeForUnit takes unit u returns nothing local integer i = 1 local integer end = GetStoredInteger(udg_cache, "MaxHeroLevel", "") * 4 local string unitID = UnitId2String(GetUnitTypeId(u)) local string skillcode = GetStoredString(udg_cache, "SkillCodeFor", unitID) loop exitwhen i > end call SelectHeroSkill(u, String2ID(SubStringBJ(skillcode, i, i + 4))) set i = i + 4 endloop set unitID = null set skillcode = null endfunction 2.Глобальная переменная gamecache (буфер игры) – cache (udg_cache) 3. Записать в кэш число равное максимальному уровню героя (см. пример) Код:
4.Инициализировать SC для юнитов (см. далее) Я думаю все понятно, значит осталось только научить вас записывать SC… Покажу вам практический пример на [offline]паладине[/offline] : Код:
Поясняю : Переменная h – id нужного юнита (Чтобы его узнать – нажмите Ctrl + D в редакторе объектов) Переменные s# – Перечень способностей героя Переменная skillcode – в эту переменную записываются переменные s# - в нужной вам последовательности (Герой будет учить заклинания в той последовательности, в которой вы их запишите) call StoreString (udg_cache, "SkillCodeFor", h, skillcode) – запись SC в кэш, для дальнейшего использования. Самое главное, что написав один SC – вы можете использовать его для всех нужных юнитов, что значительно упрощает вашу работу, особенно с большим количеством юнитов и способностей. Записав все данные SC в кэш – вы можете их использовать функцией RunSkillCodeForUnit – применрно так : call RunSkillCodeForUnit(udg_u) – остальное система сделает автоматически! Рассказывать о том как это работает не имеет смысла в этой статье, главное, что это работает =) |
![]() |
#1
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
![]()
Vash
Удалён
![]() ![]() offline
Опыт:
1,722Активность: |
неплохо ВСЁ получилось, просто олично. Но это только ведь использование и учение заклинаний, но всё равно отлично. Спс Warden !!! |
![]() |
#2
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
![]()
Toadcop
![]() ![]() offline
Опыт:
54,313Активность: |
ты гений =) !
Toadcop добавил: кстати это описание сиситемы (твоей) а не чего то вообще общего ! т.е. это не статья а мануал пользования твоей системой (которая очень примитивная...) |
![]() |
#3
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
![]()
dk
![]() offline
Опыт:
60,293Активность: |
ИМХО я уже много раз говорил, что описание своей наработки я статьей не считаю... По наработке: норм, оригинальный способ со строкой мне понравился... |
![]() |
#4
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
![]()
Toadcop
![]() ![]() offline
Опыт:
54,313Активность: |
Цитата:
|
|
![]() |
#5
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
![]()
Warden
:::...
![]() ![]() offline
Опыт:
26,106Активность: |
Toadcop - помоему типя вечно все неустраивает =)
|
![]() |
#6
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
![]()
DioD
![]() ![]() offline
Опыт:
45,134Активность: |
пустые ключи в кеше крашат вар |
![]() |
#7
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
![]()
Vanguard
Оборотень модмэйкер
![]() ![]() offline
Опыт:
3,011Активность: |
Короче чёто у меня не получается, копирую всё из этой карты в свою, при сохранении выдаёт кучу ошибок |
![]() |
#8
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
![]()
DFlyer
<3 MJ
![]() ![]() offline
Опыт:
42,879Активность: |
Vanguard
Наверно забыл CustomCode скопировать? |
![]() |
#9
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
![]()
Vanguard
Оборотень модмэйкер
![]() ![]() offline
Опыт:
3,011Активность: |
Не, CustomCode скопировал. А теперь тригеры не отключаются при ашипке, а просто карту нельзя запустить. Хотел бы я аи создать. |
![]() |
#10
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
![]()
DFlyer
<3 MJ
![]() ![]() offline
Опыт:
42,879Активность: |
Цитата:
Создать? Ты же копируешь чужой... |
|
![]() |
#11
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
![]()
Vanguard
Оборотень модмэйкер
![]() ![]() offline
Опыт:
3,011Активность: |
Ну тогда копировать, просто я имел ввиду создать карту с аи. |
![]() |
#12
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
![]()
Vanguard
Оборотень модмэйкер
![]() ![]() offline
Опыт:
3,011Активность: |
Народ, объясните в чём моя ошибка, делаю всё как в описании и нифига. |
![]() |
#13
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
![]()
DFlyer
<3 MJ
![]() ![]() offline
Опыт:
42,879Активность: |
Значед, не "всё так, как в описании". И вообще, мы не телепаты. Откуда мы можем знать в чём ошибка? |
![]() |
#14
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
![]()
Void
![]() ![]() offline
Опыт:
1,632Активность: |
Warden - ты использовал свой SC в карте Grand Battle, но я заметил глюк в том, что герои качают магию только первого уровня и только один раз. Если на карту поставить героя 7 уровня записанного в скилкоде, тогда он прокачает магии, но если он получит после этого уровень он больше не качает магии. Сам проверь, в Grand Battle. |
![]() |
#15
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
![]()
Kodoo
Ł☼√ę
![]() ![]() offline
Опыт:
12,845Активность: |
Я сделал всё как в примере, вообще всё, разве что героев не так расставил. Выдаёт кучу ошибок, вот даю карту в которую я всё скопировал, может у меня просто редактор левый, у вас пойдёт? |
![]() |
#16
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
![]()
Hellfim
Новичок
![]() ![]() offline
Опыт:
79,730Активность: |
Kodoo, переменная кеш пишется как "cache", а не "cashe". Больше ошибок не наблюдал.
|
![]() |
#17
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
![]()
Kodoo
Ł☼√ę
![]() ![]() offline
Опыт:
12,845Активность: |
Цитата:
Ы. Спасибо Hellfim. Мда... бывают и такие ошибки. |
|
![]() |
#18
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
![]()
Gres
Кораэлестраз
![]() ![]() offline
Опыт:
18,575Активность: |
Warden чтобы упростить юзерам работу при применении наработки, предлагаю автоматически определять Максимальный Уровень Героев, а не юзать Кэш!
Примерно вот так: » Функции определения Максимального Уровня героя Код:
тобиш функция GetMaxLevel() возвращает число Интеджер равное максимально-возможному уровню героя! Отредактировано Gres, 27.12.2008 в 21:54. |
![]() |
#19
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|