Форум Oni

Русскоязычный форум поклонников игры «Они» от Bungie

  • Здравствуйте, Гость

#1 19-07-2009 04:57:13

geyser (муж.)
Учёный Синдиката
Откуда: угадайте
Регистрация: 25-06-2007
Сообщений: 1352
Профиль  Вебсайт

Задачник по скриптированию: вопросы и ответы.

Эта лента - дополнение к Михиному справочнику: Oni Scripts: FAQ-пособие
Здесь вы можете по очереди задавать вопросы о BSL, желательно конкретные и серьёзные.
Мы - Миха, я, и другие - будем считать своей задачей исчерпывающе отвечать на вопросы.
За бестолковые вопросы больно бить не будем - но можем немножко изменить суть вопроса.

Что-то подобное было на старом Централе: http://konokoffin.bungie.org/forums/index.php?threadid=5

В этом сообщении будут прямые ссылки на самые важные вопросы, рассмотренные в этой теме.
Постепенно рассмотренные вопросы и ответы будут мигрировать в тот же справочник и на вики.


Если у тебя есть фонтан, заткни его; дай отдохнуть и фонтану.

Оффлайн

 

#2 19-07-2009 06:46:41

geyser (муж.)
Учёный Синдиката
Откуда: угадайте
Регистрация: 25-06-2007
Сообщений: 1352
Профиль  Вебсайт

Re: Задачник по скриптированию: вопросы и ответы.

Отвечаю на вопрос Smith, касающийся нестабильного поведения ИИ.
Интелект
Интелект

Базовая идея у Smith такая: на первой сохранке главы 2 добавить в команду Коноки ещё одного бойца, с пулемётом. Чтоб исход битвы был пооднозначнее. Вот как это выглядит (добавки Smith - с двойной индентацией).

Код:

if (save_point eq 1) {
    my_save_point=1;    
    particle vent03 start
        ai2_spawn patrol_striker_3  
    ai2_spawn partner_cop_1
    ai2_spawn partner_cop_2
    ai2_spawn ambush_striker_1
    ai2_spawn ambush_striker_2
    ai2_spawn ambush_striker_3
        chr_location 1 156.666428 -1.000000 -39.771038
        chr_giveweapon patrol_striker_3 w2_sap
        chr_givepowerup patrol_striker_3 ammo 
        chr_changeteam patrol_striker_3 TCTF 
        chr_set_health patrol_striker_3 80
        chr_set_class 1 TCTF_lite_1
    chr_delete Recep
    door_lock 1
    door_lock 4
    restore_game
    ai2_attack partner_cop_1 ambush_striker_1
    ai2_attack partner_cop_2 ambush_striker_3
    music_script_start();
    sleep 30
    set_objective_1
}

Тупо и банально, но, во-первых - похвально, что освоена адресация челов по индексу. Действительно, тех челов, к которым придётся обращаться по индексу, имеет смысл споунить до того, как заполнение ячеек персами станет неоднозначным, т.е. как можно ближе к загрузке уровня.
(Однако важно помнить, что хоть ты ему и дал 80 хелсов, в конечном счёте у него останется не больше 69, а если играть на малом уровне сложности, то и того меньше.)
Во-вторых, дальше возникает интересный момент и собственно вопрос. После драки скрипт обыкновенно вызывает функцию all_music_counters, чтобы остановить музыку. Выглядит она так (добавки Smith - с двойной индентацией) :

Код:

func void all_music_counters(void)
{
    dprint ELVIS_HAS_LEFT_THE_BUILDING
                 fork three
    sound_music_stop mus_ambgrv1b
    sound_music_stop mus_fiteb_hd
    sound_music_stop atm_low_perc1
    sound_music_stop atm_cl12
    sound_music_stop atm_cl11
    sound_music_stop mus_sv
}

Заметим, что после победы над Страйкерами двое обыкновенных TCTF-овцев (partner_cop_1 и partner_cop_2) отправляются патрулировать первый этаж - поперёк холла, в комнату с рабочими и консолью, потом назад и так далее. Делают это они независимо от скриптов - просто у них такая работа (job), и прописана она в ихнем CHAR. Работа номер 3, т.е. "patrol", патрули (PATR) "partner_1" и "partner_1", номера 4 и 5, можете проверить.
Так вот, надо бы и нашему третьему бойцу (переодетому Страйкеру patrol_striker_3) придумать какое-нибудь полезное дело. Например, он может занять наблюдательскую позицию на галерее, которая идёт поперёк того же холла этажом выше. Smith так и решил - пусть он после битвы бежит к флагу 29, и остаётся там. Эти инструкции содержатся в отдельной функции с гордым названием three, которую целиком написал Smith:

Код:

func void three(void) {
    sleep 600
    ai2_movetoflag patrol_striker_3 0029
    ai2_setmovementmode patrol_striker_3 run
}

На первый взгляд всё нормально, да и на второй тоже, разве что номер флага 29 с нулями впереди странно смотрится. И довольно часто этот скрипт срабатывает. Но иногда - тоже довольно часто - переодетый Страйкер после битвы не слушается команды ai2_movetoflag, прописанной в этой функции three. Он как бы в неком ступоре - или остаётся стоять, где стоял в конце битвы, или перемещается к координатам (156.666428,-1.000000,-39.771038). После этого можно ему дать повторный приказ переместиться к флагу 29, и тогда он слушается, но первый приказ почему-то игнорирует. Иногда.

В чём состоит причина облома? Главным образом в том, что мы имеем дело с переодетым Страйкером, задача которого по сюжету - не холл сторожить, а патрулировать (PATR "patrol_3", номер 19) с плазменной винтовкой на другом конце карты, и между прочим первый флаг его патруля, номер 54, находится за запертой дверью номер 23. Это обломно, почему? Потому, что после битвы этот Страйкер сразу вспоминает о своей (невыполнимой) задаче и впадает в депрессию, ещё до того, как мы посылаем его на флаг 29. Депрессия проходит, например, если к нему настойчиво обращаться и снова послать куда следует. Или наоборот от него отвлечься - тоже может повезти. Но рано или поздно он всё равно вспомнит о своей работе по ту сторону запертой двери 23 - и закручинится. То есть ситуация так или иначе нештатная, и удивляться глюкам не следует. Надо ситуацию починить. Как?

Можно для проверки использовать вместо чела patrol_striker_3, например, чела nookleft_thug_1, у которого патруль в соседнем закуточке, дверь не заперта. Главной работой у него пусть по-прежнему будет медитация перед компьютерами в закуточке, и поскольку она осуществима, в депрессию наш чел никогда не впадёт, и сторожить холл с верхней галереи тоже согласится - на какое-то время, ведь в итоге он вспомнит про свои компьютеры и пойдёт медитировать дальше.

Можно - тоже для проверки - использовать того же patrol_striker_3, но отпереть дверь 23. Тогда депрессия нашему герою поначалу не грозит, и он беспрекословно согласится бежать к флагу 29 и немного там подежурит. Однако в конце концов он вспомнит про свою работу и смотается на другой конец карты, к флагу 54, и уже там впадёт в ступор, потому что остальные флаги его патруля, 52 и 55, в свою очередь находятся за запертыми дверями, 22 и 6 соответственно.

А теперь самый настоящий фикс. То есть не самый - самым настоящим было бы создание новых контейнеров PATR и CHAR для нашего героя, чтоб всё было по правилам. Скажем так - самый мудрый фикс в рамках данного урока.
Мы сделаем следующее - мы будем использовать всё того же patrol_striker_3, но дадим ему новую работу (job), причём выполнимую, без всяких патрулей за запертыми дверями, чтобы он не сомневался в смысле жизни и не впадал в депрессию.
Эта замечательная безмятежная деятельность называется "idle" (номер 1), её мы форсируем командой ai2_idle(patrol_striker_3) и сразу же назначаем её ему в качестве работы, командой ai2_setjobstate(patrol_striker_3). Сделать это надо пораньше, например ещё до того, как чела телепортировать из патрулируемой им зоны, но можно и попозже, уже в холле, сразу перед битвой - главное, чтобы до ступора успеть. Что мы имеем в результате? чела, который ничего патрулировать не собирается, и будет только рад бежать по первому зову к флагу 29.

Smith, я понятно объяснил?

P.S. Похожую проблему я решил 4 года назад, вот здесь:
http://konokoffin.bungie.org/forums/index.php?threadid=5&page=2#post_1124
http://konokoffin.bungie.org/forums/index.php?threadid=5&page=2#post_1392


Если у тебя есть фонтан, заткни его; дай отдохнуть и фонтану.

Оффлайн

 

#3 19-07-2009 09:00:26

Smith (муж.)
Агент TCTF
Регистрация: 12-07-2009
Сообщений: 130
Профиль

Re: Задачник по скриптированию: вопросы и ответы.

Да! Исчерпывающий ответ:) Спасибо много узнал. Но не прочитав статью, днём раньше... я решил проблему, довольно тупым способом - просто прописал ему команду бежать к флагу, раз 20 наверное. При чём если напишешь 10 раз он тока половины пути пройдёт. Вот так!:) Короче я прописал флагов наверное 5, и в разное время в зависимости от условий заставляю бота бегать. Надо будет по умному попробовать.

Кстати, а анимации (бега, ходьбы , полуприседа, вскрикивание при виде врага) - на уровне BINA или чего там делаются??? Или скриптом можно заставить бота выполнять.
Просто эти анимации - человечность придают боту, а то встанет как статуя не оч. смотрится=)

Туговато у мя пока получается разобратся с BiNA, Char, пока вообще не врубаюсь, и ангилийский пока не тот, чтобы на ходу всё читать. :( А в каких файлах Они, хранятся персонажи (боты). Например в level3_Final.dat ???

Оффлайн

 

#4 19-07-2009 11:10:18

vitya (муж.)
Мутантмуро
Откуда: Саратов
Регистрация: 14-06-2009
Сообщений: 915
Профиль  Вебсайт

Re: Задачник по скриптированию: вопросы и ответы.

Да ответ исчерпавующий вот тогда мои вопросы, я челу даю команду чтоб он бегал за мной, а он не бегает, чё дела?
Потом какой камандойможно узнать лакацию где ты находишся?
И последнее какой камандой можно зделать чтоб штатские не боялись пративников, а били их,и какой командойможно зделать чтоб штатские играли и за тебя и против тебя какими командами это можно зделать!;):):):):)

Оффлайн

 

#5 19-07-2009 11:14:36

AWP_Mega (муж.)
Спецназ TCTF
Откуда: Румыния
Регистрация: 22-06-2009
Сообщений: 319
Профиль  Вебсайт

Re: Задачник по скриптированию: вопросы и ответы.

vitya написал(а):

Потом какой камандойможно узнать лакацию где ты находишся?

where в консоле

Добавлено спустя 47 секунд:

vitya написал(а):

И последнее какой камандой можно зделать чтоб штатские не боялись пративников, а били их,и какой командойможно зделать чтоб штатские играли и за тебя и против тебя какими командами это можно зделать!

Нууу командой на постановку команды персонажу

Добавлено спустя 3 минуты 32 секунды:
а мой вопрос:какими командами гейсер сделал так,чтоб при определенном убийстве противников(как в ОТА)срабатывала следующая функция,скажем(как в ОТА) набрал я 20 фрагов,и win,и т.д.Думаю многим интересно,лень самому искать в скриптах,не зря же тему создали


Работа ценится не по усталости,а по результатам труда(это все про нас,про нас)

Оффлайн

 

#6 19-07-2009 11:22:50

doktordulit (муж.)
Забанен
Откуда: Рига
Регистрация: 07-10-2008
Сообщений: 478
Профиль

Re: Задачник по скриптированию: вопросы и ответы.

Я не помню но что-то вроде этого-

Код:

func who_win(void)
{
if(fragse eq 20);fork fwin
if(fragsf eq 20);fork ewin
}

http://yoursmileys.ru/tsmile/stamp/t2708.gif

Оффлайн

 

#7 19-07-2009 11:34:40

doktordulit (муж.)
Забанен
Откуда: Рига
Регистрация: 07-10-2008
Сообщений: 478
Профиль

Re: Задачник по скриптированию: вопросы и ответы.

И ещо мой вопрос.В скрипте есть функции-

Код:

func void simple_powerup(string x)
{
chr_teleport(x,14)
chr_set_health(x,80)
chr_givepowerup(x,shield,40)
chr_givepowerup(x,ammo,1)
}
и
func void spawn_outside_1
{
ai2_spawn tech_thug_1
ai2_spawn cruel_commguy_1
ai2_spawn brain_commguy_2
simple_powerup tech_thug_1
simple_powerup cruel_commguy_1
simple_powerup brain_commguy_2
}

Вызов spawn_outside_1 есть,проверял.
Однако никаких поверупов НЕТ!Спавны есть,поверупов нет...

Отредактировал(а) doktordulit (19-07-2009 12:20:28)


http://yoursmileys.ru/tsmile/stamp/t2708.gif

Оффлайн

 

#8 19-07-2009 11:44:35

AWP_Mega (муж.)
Спецназ TCTF
Откуда: Румыния
Регистрация: 22-06-2009
Сообщений: 319
Профиль  Вебсайт

Re: Задачник по скриптированию: вопросы и ответы.

с раздачей предметов и оружии часто замечаю такую фигню,у меня кстати у персов некоторые пушки идут(допустим плазма)а если ЕМУ же ставлю ртутник то оружие не появляется...


Работа ценится не по усталости,а по результатам труда(это все про нас,про нас)

Оффлайн

 

#9 19-07-2009 12:17:16

Мih@ 
Регистрация: 27-08-2006
Сообщений: 824
Профиль

Re: Задачник по скриптированию: вопросы и ответы.

doktordulit, во-первых, в чём смысл таких функций? spawn_outside_1 имеет параметр, но никак его не использует. не логичнее ли будет, например, вынести спавн к поверапу и вызывать его по имени спавнуемого? или, если этот поверуп не одноразовый, spawn_outside должен просто перенаправлять своё "x" поверапу, а вызываться несколько раз.
во-вторых, я бы ставил точки с запятой после скобочных вызовов (хотя с наличием переносов это несущественно), и как раз вызовы simple_powerup оформил со скобками. если там будет перенаправление по аргументу, то тем более. мелочи...
что касается самих поверапов - есть разница, нету только щита и обоймы, или нету и ровно 80 хелсов, или нету и телепорта куда надо. на всякий случай можно проставить между строк dprint/dmsg и проверить, не стопорится ли выполнение на каком-то месте. если выполнение проходит, но функция не работает - перепроверяй консолью, в чём проблемы с данными чарами в данной ситуации.
не видя остального скрипта и контекста вызова этой функции (ну, может, эти чары умирали где-то, или с force спавнились, или какой-нибудь ещё катаклизм пережили), больше ничего сказать не могу. -_- сами по себе функции в таком виде прекрасно работают, и чары и щиты есть на месте.

Оффлайн

 

#10 19-07-2009 15:39:47

geyser (муж.)
Учёный Синдиката
Откуда: угадайте
Регистрация: 25-06-2007
Сообщений: 1352
Профиль  Вебсайт

Re: Задачник по скриптированию: вопросы и ответы.

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


Если у тебя есть фонтан, заткни его; дай отдохнуть и фонтану.

Оффлайн

 

#11 19-07-2009 15:50:44

Smith (муж.)
Агент TCTF
Регистрация: 12-07-2009
Сообщений: 130
Профиль

Re: Задачник по скриптированию: вопросы и ответы.

НУ вроде я первый! :)

Оффлайн

 

#12 20-07-2009 01:38:18

geyser (муж.)
Учёный Синдиката
Откуда: угадайте
Регистрация: 25-06-2007
Сообщений: 1352
Профиль  Вебсайт

Re: Задачник по скриптированию: вопросы и ответы.

Предупреждение всем тем, кто игнорировал очередь и сыпал вопросы в кучу - так у нас с вами дело не пойдёт.

Вообще-то исторически первым должен был быть vitya, потому что один из своих вопросов он мне задал в личку:

vitya написал(а):

я челу даю команду чтоб он бегал за мной, а он не бегает, чё дела?

Но поскольку этот вопрос задан крайне бестолково, vitya пропускает ход, и я перехожу к новому вопросу Smith:

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

Есть команда chr_animate для "анимации на заказ", например chr_animate(chelovek, KONCOMsuper_kick) заставляет чела с именем chelovek сделать Колесо Дьявола.
"Бег" и "ходьба" обычно задаются челам не как анимации, а как способ передвижения, через команду ai2_setmovementmode. Ты ведь вроде сам её использовал и должен знать, с чем её едят: сначала ai2_setmovementmode(chelovek, run) или ai2_setmovementmode(chelovek, walk), а потом, например, ai2_movetoflag(chelovek, 42). Или ты чего-то другого хочешь? тогда объясни так, чтоб я понял =)
Что такое полуприсед, я не понял совсем. А вскрикивание при виде врага - это поведение происходит автоматически, и зачем тебе делать так, чтобы он шарахался "просто так"?

Manticore, предупреждение за гору вопросов вне очереди... doktordulit, предупреждение за ложную информацию про индексы...
Дайте экспертам время проверить ответы, ведь не факт, что они исчерпывающие и вообще верные... Я завтра по всему пройдусь.


Если у тебя есть фонтан, заткни его; дай отдохнуть и фонтану.

Оффлайн

 

#13 20-07-2009 06:46:12

doktordulit (муж.)
Забанен
Откуда: Рига
Регистрация: 07-10-2008
Сообщений: 478
Профиль

Re: Задачник по скриптированию: вопросы и ответы.

geyser написал(а):

doktordulit, предупреждение за ложную информацию про индексы

Нормально.Я думал что пишу все правильно а мне предупреждение что СПЕЦИАЛЬНО писал неправильно"
P.C.А что собсно неправильно?

EDIT (geyser): Я и не говорил, что ты "СПЕЦИАЛЬНО" дезинформировал Manticore, но имело смысл чуть-чуть поискать, подумать, проверить, или по прайней мере не выдавать ответ так авторитетно, как будто ты в нём на 100% уверен,
и после твоих слов вопрос можно считать закрытым. См. ниже.

Отредактировал(а) geyser (20-07-2009 16:41:44)


http://yoursmileys.ru/tsmile/stamp/t2708.gif

Оффлайн

 

#14 20-07-2009 11:40:09

Smith (муж.)
Агент TCTF
Регистрация: 12-07-2009
Сообщений: 130
Профиль

Re: Задачник по скриптированию: вопросы и ответы.

Есть команда chr_animate для "анимации на заказ", например chr_animate(chelovek, KONCOMsuper_kick) заставляет чела с именем chelovek сделать Колесо Дьявола.

Попробовал очень забавно. А есть список анимаций? Ударов коноки, синдикатов, TCTF...?


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

Я неправильно выразился... Как заставить бота сесть или идти полуприсев, или выкинуть фразу типа (Может стоит попытаться), а вскрикивание например для роликов нужно, так как в этом режиме боты пассивны и автомитически они не чё не сделают.

Отредактировал(а) Smith (21-07-2009 17:24:03)

Оффлайн

 

#15 20-07-2009 12:39:01

geyser (муж.)
Учёный Синдиката
Откуда: угадайте
Регистрация: 25-06-2007
Сообщений: 1352
Профиль  Вебсайт

Re: Задачник по скриптированию: вопросы и ответы.

Значит так, хотя это было и вне очереди, разбираюсь с вопросом Manticore об индексах и ответом doktordulit.

Manticore написал(а):

2) Существует список абсолютно всех функций и команд, существующих в Oni? Спасибо!

doktordulit написал(а):

2)- http://ssg.oni2.net/commands.htm

Есть ещё соответствующие разделы на вики, от перечня переменных http://wiki.oni2.net/BSL:Variables до детального объяснения функций (например, http://wiki.oni2.net/BSL:Frustum_and_fog ), но если нужен более-менее полный справочник на одной странице - тогда да, пожалуй, на вики ещё нет аналога страницы с OniStuff. Можете поспособствовать, ведь вики-справочники - это очень важное и нужное дело.
Заодно скажу, что в данный момент буржуи добавляют в BSL много новых команд, так что некоторые ограничения, к которым мы привыкли, в скором времени могут исчезнуть: http://wiki.oni2.net/Daodan_DLL/Beta

Manticore написал(а):

1) "Каждый персонаж в игре имеет свой индекс (номер)" - где список этих номеров? Здесь его нет http://ssg.oni2.net/subfold/charas/charas.htm !

doktordulit написал(а):

1)- Он определяется по ходу игры.К примеру,на уровне есть:чел1,чел2,чел3,коноко.
Коноко спавнится ВСЕГДА первой,у неё индекс 0.
спавним чела1,у него индекс 1.
спавним чела2,у него индекс 2.
спавним чела3,у него индекс 3.

Дальше!Убиваем чела1,и его индекс становится свободным,но на мгновение,ибо его занимает чел2!
И щас расклад такой-коноко 0,чел2 1,чел3 2.Убиваем чела3,его индекс освобождается,и его никто не занимает ибо больше никого с большим индексом нет!И так далее...понял?

doktordulit прав в том, что индексы раздаются в порядке появления персонажей в уровне, а порядок этот меняется в зависимости от сохранки и нелинейного прохождения. Именно поэтому, Manticore, этих индексов не может быть ни в каких постоянных таблицах. В остальном doktordulit заблуждается: индексы персонажей ПОСТОЯННЫ. В твоём примере, doktordulit, после того как умер человек с индексом 1 (и окончательно превратился в труп - это важно! ), память его освобождается, но ни в коем случае не занимается ни одним из живых челов. Поэтому в памяти образуется пустая ячейка между Конокой и вторым челом, и если в уровень добавить ЧЕТВЁРТОГО чела, то у НЕГО будет индекс 1, а у второго с третьим индексы НЕ изменятся.

То есть важно понимать три момента: во-первых, индекс чела забит - ПОСТОЯНЕН - с того самого момента, как чела добавили в уровень. Это номер ячейки в памяти, в которую он угодил, и никуда он из неё не денется, разве что умрёт и исчезнет из памяти вообще. То есть если вы заспоунили кучу челов, и один из них оказался седьмым, то он и ОСТАНЕТСЯ седьмым, пока не помрёт. А то, что сказал doktordulit - неправда.
Второе - свежедобавленный чел кладётся в ПЕРВУЮ СВОБОДНУЮ ячейку памяти. Если было занято семь ячеек (плюс Конокина - нулевая), и из них ни одна не опустела, то новый чел будет челом номер 8. Если же к тому времени, как его добавляют, опустела ячейка номер 3, то этот новый чел станет номером 3, а не 8. Такая вот перетасовка.
Третье - при каких обстоятельствах освобождаются индексы (ячейки)? Во-первых, индекс освобождается сразу, если чела грубо удалить через chr_delete. Во-вторых, индекс освобождается если чел умер - но НЕ СРАЗУ, а после того, как он благополучно стал ТРУПОМ - а это происходит, как правило, после того, как мёртвый чел "надолго" пропадает из поля зрения камеры (в случае камеры игрока - отвернуться мало, иногда приходится удалиться и/или попрыгать).

Чему нас это учит? тому, что если у нас было много челов, и мы кое-кого поубивали, то состояние памяти - и значение первого свободного индекса, который будет назначен новому челу - вещи весьма неопределённые. Всё зависит от того, смотрим ли мы на "ещё тёпленьких" поверженных челов или нет, а если не смотрим, то как далеко мы от этих ещё-не-трупов отошли, и прыгали ли мы при этом. Вот такая в этом деле тонкость, и я о ней неоднократно на этом форуме распостранялся во всех деталях, причём последний раз был буквально совершенно недавно, вот здесь: Интелект

Вот. Для полноты картины отвечаю ещё и на дополнительный вопрос Manticore.

Manticore написал(а):

Код:

func void level_start(string ai_name) {
    dprint func_void_start
    if (my_save_point eq 1) {
        dprint restore_game_1
        set_objective_1
        ai2_spawn Barabus
        chr_location Barabus 10 200 0

"chr_location Barabus 10 200 0" - вместо индекса я написал имя, но так не работает! Почему? Можно имя вписывать, а не индекс?

Говорят же тебе, что chr_location работает с индексом, а не с именем. Значит, имя не покатит, как бы ты этого не хотел. Тут всё очень строго, уж извини.

Manticore написал(а):

А если мне надо спавнить 20-ого страйкера и переместить его в точку x, мне что, отсчитывать какой у него номер?

Да, индекс надо угадывать, причём (см. выше) он будет зависеть от всей предыстории споунов и смертей (точнее, окончательных превращений в трупы), и за всем этим надо следить. Это довольно сложно. Гораздо проще - принять меры, чтобы индекс челов был известен заранее: например, можно предотвратить превращение чела в труп командой chr_death_lock(chelovek, 1), а потом в некий удобный момент сделать ему chr_full_health(chelovek) и сразу chr_delete(chelovek). Таким образом ты сам выбираешь, когда именно челы исчезают из памяти, и какие именно ячейки они освобождают для новых споунов.

Manticore написал(а):

Я посмотрел список команд и как я понял, нельзя назначить персу конкретный стиль боя, то есть указать "бить только руками или все время активировать дрожь земли" и т.д. Это действительно нельзя? Жаль...

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

Ещё раз скажу. Чтобу эту ленту было удобно читать как справочник, сообщения в ней должны быть по возможности строгие и сердитые. То есть никаких "вообще" и "допустим" и "я не помню но что-то вроде" и "часто замечаю такую фигню". Все должны приложить усилие к тому, чтобы обмен репликами был наиболее эффективным. Так что вопросы должны быть обдуманными и обоснованными, и ответы - разумеется - тоже. И спрашивающим, и отвечающим, рекомендуется использовать поиск и существующие справочники, а также проводить некоторое количество экспериментов, чтобы сказанное не было чистой теорией и/или словоблудием.


Если у тебя есть фонтан, заткни его; дай отдохнуть и фонтану.

Оффлайн

 

#16 20-07-2009 18:01:08

geyser (муж.)
Учёный Синдиката
Откуда: угадайте
Регистрация: 25-06-2007
Сообщений: 1352
Профиль  Вебсайт

Re: Задачник по скриптированию: вопросы и ответы.

Smith, извини, я потом до-отвечу на твои вопросы, а пока могу сказать только следующее. Анимации хранятся под кодом "Трям! здравствуйте" ( http://wiki.oni2.net/TRAM ), поэтому их довольно легко опознать после распаковки через ОниСплит, или например взять Эдишнский level0_Animations.dat, открыть его для просмотра как бинарный текст, и искать в нём строку "TRAM" - таким образом узнаешь имена всех-всех анимаций, даже тех, которые нельзя использовать с вызовом (оверлейные и прицельные вообще). Кроме того, база данных всех боевых приёмов есть тут: http://wiki.oni2.net/Gameplay/Combat_moves  Имя колонки - это приставка, а полное имя анимации состоит из приставки и того хвоста, который фигурирует в клетках таблицы.
Информацию про полуприсед я добавлю в предыдущий пост, а с остальным тебе придётся подождать. Советую тебе чуть-чуть подумать и внести некоторую ясность в своё сообщение (можешь прямо его и редактировать): что такое "выкинуть фразу типа (Может стоит попытаться)", например? "Выкинуть" - это значит что её надо отменить и выкинуть из игры, или наоборот, изловчиться вызвать вне очереди? Кстати, "может, мне стоит попытаться" - это до ужаса кривой перевод фразы "maybe I should start trying", которая дословно означает "наверно, мне пора бы рвение прикласть". Смысл в том, что он якобы дерётся в полсилы, и дразнится, что вот-вот развяжет себе руки и размажет противника по стенке. Ну а русский перевод, ессессна, мимо, аж стыдно как.

AWP_Mega написал(а):

мой вопрос:какими командами гейсер сделал так,чтоб при определенном убийстве противников(как в ОТА)срабатывала следующая функция,скажем(как в ОТА) набрал я 20 фрагов,и win,и т.д.Думаю многим интересно,лень самому искать в скриптах,не зря же тему создали

"Думаю многим интересно,лень самому искать в скриптах,не зря же тему создали"
Ну уж нет, тему я создавал для кого угодно, только не для ленивых. А совесть?
Я буду "сенсеем" только в меру того, что вы сами будете - хорошими учениками.

В OTA я функцию win не вызываю никогда: переход на следующую арену из цикла происходит непрерывно, без выхода из игры вообще.
Там по сути есть одна сложная функция Death, которая вызывается из циклов RespawnPlayer, каждый раз, когда какой-либо чел умирает:

Код:

func void Death(string ai_team, string ai_name, string ai_nick) {
    dmsg(" "); dmsg(ai_nick); RandDead(); chr_pain(ai_name, death);
    if(ai_team ne Konoko and ai_team ne Syndicate) {
        dmsg(" "); dmsg("WHO CARES?");
    } 
    if(ai_team eq Syndicate) {
        cinematic_stop(BOSS1talking, 16, 30)
        friend_sc= friend_sc + 1
        friend_lt= friend_lt - 1; if(friend_lt eq 0) dmsg " "
        friend_xl= friend_xl + 1; enemy_xl= 0
        friend_ld= enemy_lt - friend_lt
        dmsg "[b.FISH]"
        if(friend_lt < 6 and enemy_lt > friend_lt)
            LeftMess(Konoko, friend_lt)
        else if(friend_ld eq 0 or friend_ld eq 1)
            LeadMess(Konoko, friend_ld)
        else    ExcelMess(Konoko, friend_xl)
    }
    if(ai_team eq Konoko) {
        cinematic_stop(KONtransform, 15, 30)
        enemy_sc= enemy_sc + 1
        enemy_lt= enemy_lt - 1; if(enemy_lt eq 0) dmsg " "
        enemy_xl= enemy_xl + 1; friend_xl= 0
        enemy_ld= friend_lt - enemy_lt 
        dmsg "[y.FISH EATERS]"
        if(enemy_lt < 6 and friend_lt > enemy_lt)
            LeftMess(Syndicate, enemy_lt)
        else if(enemy_ld eq 0 or enemy_ld eq 1)
            LeadMess(Syndicate, enemy_ld)
        else    ExcelMess(Syndicate, enemy_xl)
    }
    if(chr_is_player(ai_name)) {
        dmsg " "
        dmsg "[b.FISH] :"
        PrintScore(friend_sc)
        dmsg "[y.FISH EATERS] :"
        PrintScore(enemy_sc)
    }
    ArenaWeaponModerator(enemy_sc + friend_sc);
}

из которой всё должно быть ясно. Неясно? тогда спрашивайте, но только чур строго и сердито, по существу.

doktordulit написал(а):

Я не помню но что-то вроде этого-

Код:

func who_win(void)
{
if(fragse eq 20);fork fwin
if(fragsf eq 20);fork ewin
}

Не обижайся, doktordulit, но ведь это полная лажа. Во-первых, почему ты поставил точку с запятой между if и fork? и во-вторых, какой смысл имеет функция who_win? кто её вызывает и по какому поводу?


Если у тебя есть фонтан, заткни его; дай отдохнуть и фонтану.

Оффлайн

 

#17 21-07-2009 17:40:46

Smith (муж.)
Агент TCTF
Регистрация: 12-07-2009
Сообщений: 130
Профиль

Re: Задачник по скриптированию: вопросы и ответы.

И так, вопросики:
1. Как сделать так, чтобы команда "ai2_movetoflag" при каких-то внешних факторов не отменялась а откладывалась (например бежит гриффин к флагу, увидел синдиката... прикончил его, и дальше побежал к флагу) а то я пропишу "ai2_movetoflag" и любой даже шум сбивает перса. :( ( например от выстрелов шум).

2. Программой OniUnPacker, я из 19 уровня вытащил файлы TRAM, и сохранил в отдельную папку, как глобализировать эти файлы или засунуть их например в 2 уровень???

3. В той же программе OniUnPacker я открыл ресурсы 19 уровня ONCC как я понял в ресурсах собрана инфармация о каждом персонаже. Вот например открыл код файла "TCTF_swat_blackops_1.ONCC". На сайте "http://wiki.oni2.net/ONCC" посмотрел какая строчка за что отвечает.
И мя интересует вот что! возьмём строчку: "0xC50:"

Отдельно в этой строке рассмотрим значение: "C8 00 00 00" - это значение отвечает за здоровье персонажа в конкретном случае оно равняется 200 единиц. (Базовая жизнь коноки). "C8" это 200, например FF получается должно быть наибольшим здоровьем, так если я меняю другие числа (соседние нули) то показатель жизни устанавливается повторно но жизнь не добавляется. Вопрос! за что они отвечают??? Больше 255 единиц мне неудаётся установить, так как жизнь устанавливается по паре чисел.
:( Как поставить например 600 ед. жизни??? На уровне кода ессна!

И кстати в описании персонажей у гриффина указано 200 ед. жизни. А  в коде ONCC написано 100 ед. Почему так?

4. Я хочу изменить характеристики Blackops SWAT, а именно такие:

A) например увеличить скорость выполнения комбы "comb_p_p_p" так, чтобы например фурия немогла эту комбу прервать! (аналогично и с comb_k_k_k)

B)  Ещё чтобы AI чёрного TCTF сооброжал побыстрее, например Blackops_swat начинает делать комбу ногой, а фурия уже увернулась от этой атаки, а балбес Blackops_swat,  продолжает комбу. Нужно чтобы он прерывал в нужный момент атаку.
После каждой атаки он тормозит, 1 - 1,5 сек. стоит. Нужно повысить реакцию на происходящие события в битве !!
Где эти параметры, я ищу но конкретно немогу найти, могбы Гейсер подсказать пожалуйста! :) :) Скорректировать меня так-сказать.
5. Каким образом открыть ресурсы "MELE", просто на страничке увидел описание - "http://wiki.oni2.net/OBD:BINA/OBJC/MELE" где эти ресурсы находятся????

6. В ONCC можно изменять характеристики моделей например: "TCTF_swat_blackops_1", "elite_hard_1", "thug_wh_1", "striker_hard_2" - а где менять характеристики конкретных персонажей????

Отредактировал(а) Smith (22-07-2009 17:32:19)

Оффлайн

 

#18 22-07-2009 18:37:30

geyser (муж.)
Учёный Синдиката
Откуда: угадайте
Регистрация: 25-06-2007
Сообщений: 1352
Профиль  Вебсайт

Re: Задачник по скриптированию: вопросы и ответы.

0a. По-моему, Smith, до тебя очередь по второму кругу ещё не дошла.
0b. Надо, например, с doktordulit разобраться: что там у него такого в скриптах, что присвоение оружия и боеприпасов не работает.
0c. Ну и чуть-чуть развить те вопросы, которые задал vitya.

1. С простой командой "идти к флагу 42" это сделать нельзя. Можно сделать только с консолями или патрулями. Делаешь, например, самый простой патруль, из одного флага 29, без цикла вообще. Называешь этот патруль "flag_29".

Код:

<?xml version="1.0" encoding="utf-8"?>
<Oni Version="0.9.30.0">
   <ObjectCollection>
       <Object Id="8283" Type="PATR">
           <Header>
               <Flags>0</Flags>
               <Position>-408.598755 60.1162872 -1402.20361</Position>
               <Rotation>0 0 0</Rotation>
           </Header>
           <OSD>
               <Name>goto_flag_29</Name>
               <PatrolId>42</PatrolId>
               <ReturnToNearest>0</ReturnToNearest>
               <Points>
                   <MoveToFlag FlagId="29" />
                   <ScriptId ScriptId="42" />
               </Points>
           </OSD>
       </Object>
   </ObjectCollection>
</Oni>

Сохраняешь это в файл GdePopalo\BINACJBOPatrol Path.xml , потом делаешь onisplit -create GdePopalo GdePopalo\BINACJBOPatrol Path.xml и onisplit -import:nosep GdePopalo GdePopalo\level2_OBJC.dat
Кладёшь level2_OBJC.dat и level2_OBJC.raw в рабочую папку GameDataFolder(например, в Oni\Edition\GameDataFolder), а в скриптах Oni\Edition\GameDataFolder\IGMD\manplant пишешь следующее:

Код:

func main {
    ai2_spawn nookleft_thug_1
    ai2_dopath nookleft_thug_1 goto_flag_29
    ai2_setjobstate nookleft_thug_1
}
func patrolscript0042 {
    dmsg "What now?"
}

Кажется, что эта хреновина может сработать несколько раз, т.е. если чела отвлечь (или по пути, или после того, как он придёт к флагу 29 и спросит "What now?"), а потом уступить в бою или исчезнуть - то он в итоге снова направится к флагу 29 и снова спросит "What now?". Устойчивости этого поведения я не гарантирую, но на один раз должно хватить. Также замечу, что "movement mode" чела как правило меняется с форсированного бега на by-alert-level, а это значит, что если он вдруг успокоился (победил или потерял противника, например), то патруль он продолжит вразвалочку, а не бегом. Единственный способ это изменить - прописать ему в CHAR, чтобы он всегда суетился (либо он должен иметь привычку бегать, даже если не встревожен; либо его минимальный уровень встревоженности должен быть повышен).

1b. Бег к консоли ещё сложнее, т.к. для этого надо править CMBT. Я с этим совсем не экспериментировал, и о надёжности сказать ничего не могу. По идее эти настройки совсем не влияют на патрули и на бег к флагам, так что поле применения довольно ограничено. Однако рано или поздно надо продокументировать эту возможность и воспользоваться ей, например, в OTA.

2a. ПРИ ЧЁМ ТУТ СКРИПТЫ?
2b. OUP выдирает данные в довольно-таки немодулярном формате, поэтому вставить эти TRAM ты практически никуда не сможешь. Используй OniSplit. Сначала -export, потом -move, потом -import.

3a. ПРИ ЧЁМ ТУТ СКРИПТЫ?
3b. По адресу 0x12C хранится максимальная скорость вращения ИИ вокруг оси (его скорость мышки, так сказать). Наугад такие вещи менять нельзя, тем более, что это не целое число а "ай-яй-яй": http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%BE%D0%B4%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8
В хексе менять значение таких вещей - противопоказано. Если уж на то пошло, OUP позволяет менять значение чисел через диалог "Value viewer", а вообще-то давно пора пересесть на OniSplit: -extract:xml для экспорта в текстовый формат XML, -create для импорта обратно в .oni
Я не понял, что такое "сделать TCTF очень быстрым (по анимации и AI) или тупым и очень медленным". Зато я понял, что к скриптам это вряд ли имеет какое-то отношение. Так что можешь не уточнять.


Если у тебя есть фонтан, заткни его; дай отдохнуть и фонтану.

Оффлайн

 

#19 22-07-2009 19:07:39

geyser (муж.)
Учёный Синдиката
Откуда: угадайте
Регистрация: 25-06-2007
Сообщений: 1352
Профиль  Вебсайт

Re: Задачник по скриптированию: вопросы и ответы.

Smith, имей совесть и пропусти пару ходов, а то такое впечатление, что до чужих вопросов дело не дойдёт никогда...
И зачем ты так радикально поменял суть вопроса 3? Придётся мне теперь отвечать заодно и на новый вопрос номер 3.

НИ ОДИН ИЗ ЭТИХ ВОПРОСОВ НЕ ИМЕЕТ ОТНОШЕНИЯ К СКРИПТАМ!!! Smith, очередное и почти последнее предупреждение =)

3a. Что такое "показатель жизни устанавливается повторно"? Не люблю, когда человек говорит что-то значимое, но так говорит, что понятно только ему одному.
Если бы ты послушался меня и пересел на OniSplit и XML, то у тебя бы этих проблем вообще не было: в XML вообще нет хекса, и любые числа можно править в явном виде.
Кроме того, в OUP есть диалог Value Viewer, где опять-таки можно явно вбивать новые значения чисел. Заодно поймёшь, как целые числа выглядят в хексе (Little Endian).
600 = 512 + 88 = 256 x 2 + 64 + 16 + 8
Нижний байт имеет значение 88=0x58, а во втором разряде по 256 (т.е. во втором байте снизу) имеем- 0x02. В Little Endian нижний байт идёт первым, итого: 58 02 00 00

3b & 6. В ресурсе BINACJBOCharacter указаны дополнительные хелсы конкретных персонажей, они добавляются к тем, что прописаны в ONCC. Кроме того, хелсы зависят от уровня сложности и настроек в ONGS.

4. Это не ко мне и вообще не сюда. Поставь Эдишн, там уже много таких изменений (пока что только в TRAM и ONCC, но есть еще специальный MELE-мод "Brutal Striker"). Изучи всё это (желательно в XML, а не в хексе), а потом поговорим.

5. "BINACJBOMelee Profile" в уровне 0, советую изучать в XML, т.е. через OniSplit, а не через OUP.


Если у тебя есть фонтан, заткни его; дай отдохнуть и фонтану.

Оффлайн

 

#20 22-07-2009 19:09:56

Мih@ 
Регистрация: 27-08-2006
Сообщений: 824
Профиль

Re: Задачник по скриптированию: вопросы и ответы.

geyser написал(а):

Бег к консоли ещё сложнее, т.к. для этого надо править CMBT.

это в плане?.. вроде бы по ai2_doalarm name number чар бежит, пока не умрёт или не нажмёт, минуя все преграды. А нажав, ещё и вызывает соответствующую функцию, которая ещё и будет знать его имя. Или нужно было наоборот, научить чара отбиваться? +_+

Оффлайн

 

Board footer

© 2006-2018 Амэ & Mih@
ОНИмия – фан-сайт игры Oni
Движок форума - модифицированный PunBB

[генерация скрипта: 0.026 с.] [запросов к БД: 26]