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) – остальное система сделает автоматически! Рассказывать о том как это работает не имеет смысла в этой статье, главное, что это работает =) |
27.03.2007, 15:28 | #1
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Vash
Удалён
offline
Опыт:
1,722Активность: |
неплохо ВСЁ получилось, просто олично. Но это только ведь использование и учение заклинаний, но всё равно отлично. Спс Warden !!! |
27.03.2007, 15:56 | #2
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Toadcop
offline
Опыт:
54,313Активность: |
ты гений =) !
Toadcop добавил: кстати это описание сиситемы (твоей) а не чего то вообще общего ! т.е. это не статья а мануал пользования твоей системой (которая очень примитивная...) |
27.03.2007, 17:12 | #3
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
dk
offline
Опыт:
60,293Активность: |
ИМХО я уже много раз говорил, что описание своей наработки я статьей не считаю... По наработке: норм, оригинальный способ со строкой мне понравился... |
28.03.2007, 14:30 | #4
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Toadcop
offline
Опыт:
54,313Активность: |
Цитата:
|
|
28.03.2007, 23:12 | #5
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Warden
:::...
offline
Опыт:
26,106Активность: |
Toadcop - помоему типя вечно все неустраивает =)
|
31.03.2007, 19:40 | #6
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
пустые ключи в кеше крашат вар |
01.04.2007, 14:17 | #7
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Vanguard
Оборотень модмэйкер
offline
Опыт:
3,011Активность: |
Короче чёто у меня не получается, копирую всё из этой карты в свою, при сохранении выдаёт кучу ошибок |
03.08.2007, 19:39 | #8
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DFlyer
<3 MJ
offline
Опыт:
43,079Активность: |
Vanguard
Наверно забыл CustomCode скопировать? |
03.08.2007, 19:47 | #9
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Vanguard
Оборотень модмэйкер
offline
Опыт:
3,011Активность: |
Не, CustomCode скопировал. А теперь тригеры не отключаются при ашипке, а просто карту нельзя запустить. Хотел бы я аи создать. |
03.08.2007, 19:54 | #10
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DFlyer
<3 MJ
offline
Опыт:
43,079Активность: |
Цитата:
Создать? Ты же копируешь чужой... |
|
03.08.2007, 20:03 | #11
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Vanguard
Оборотень модмэйкер
offline
Опыт:
3,011Активность: |
Ну тогда копировать, просто я имел ввиду создать карту с аи. |
03.08.2007, 20:11 | #12
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Vanguard
Оборотень модмэйкер
offline
Опыт:
3,011Активность: |
Народ, объясните в чём моя ошибка, делаю всё как в описании и нифига. |
05.08.2007, 15:25 | #13
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DFlyer
<3 MJ
offline
Опыт:
43,079Активность: |
Значед, не "всё так, как в описании". И вообще, мы не телепаты. Откуда мы можем знать в чём ошибка? |
05.08.2007, 21:01 | #14
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Void
offline
Опыт:
1,632Активность: |
Warden - ты использовал свой SC в карте Grand Battle, но я заметил глюк в том, что герои качают магию только первого уровня и только один раз. Если на карту поставить героя 7 уровня записанного в скилкоде, тогда он прокачает магии, но если он получит после этого уровень он больше не качает магии. Сам проверь, в Grand Battle. |
08.08.2007, 20:40 | #15
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Kodoo
Ł☼√ę
offline
Опыт:
12,845Активность: |
Я сделал всё как в примере, вообще всё, разве что героев не так расставил. Выдаёт кучу ошибок, вот даю карту в которую я всё скопировал, может у меня просто редактор левый, у вас пойдёт? |
27.12.2008, 20:09 | #16
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Hellfim
Новичок
offline
Опыт:
79,700Активность: |
Kodoo, переменная кеш пишется как "cache", а не "cashe". Больше ошибок не наблюдал.
|
27.12.2008, 20:50 | #17
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Kodoo
Ł☼√ę
offline
Опыт:
12,845Активность: |
Цитата:
Ы. Спасибо Hellfim. Мда... бывают и такие ошибки. |
|
27.12.2008, 20:56 | #18
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Gres
Кораэлестраз
offline
Опыт:
18,575Активность: |
Warden чтобы упростить юзерам работу при применении наработки, предлагаю автоматически определять Максимальный Уровень Героев, а не юзать Кэш!
Примерно вот так: » Функции определения Максимального Уровня героя Код:
тобиш функция GetMaxLevel() возвращает число Интеджер равное максимально-возможному уровню героя! Отредактировано Gres, 27.12.2008 в 21:54. |
27.12.2008, 21:16 | #19
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|