Форум Oni

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

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

#21 14-07-2009 14:41:28

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

Re: Интелект

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

"Чтобы создать бота нужно прописать в BINA новые данные (модель, имя, анимация...)?" Смотря, что такое 'создать'. ai2_spawn - создание? Анимации прописаны в ONCC, а не в CHAR.

"А потом просто бота прописать в скрипты?" Смотря, что такое 'просто'... Вообще-то доводка уровня - это процесс итеративный: поскриптил, скривился, поправил BINA, поскриптил ещё...

"Есть ли инструкция по созданию ботов?" Т.е. по добавлению в BINACharacter? http://wiki.oni2.net/AE:Adding_spawnable_characters http://wiki.oni2.net/OBD_talk:BINA/OBJC/CHAR#XML

"мне нужна команда, которая бы любые процессы выполняла последовательно" Смотря что такое 'любые', но для начала посмотри сюда: Oni Scripts: FAQ-пособие

Спасибо гейсер посмотрел!) Начинаю понимать... С BINACharacter мне пока рано!:) А вот насчёт команды:
func void wait_to_help(void)  - "wait_to_help" это просто название функции и не несёт смысловой нагрузки.

chr_wait_health Muro 200  -  "chr_wait" команда ждать. А например, если нужно сделать покруче событие, что-бы ждать приходилось не наличие 200 хп , а окончание жуткого замеса между 10 TCTF и 10 Синдикатов =))... Нужно создавать отдельную функцию и уже делать привязку к chr_wait ???

Или ждать пока откроется дверь, то команда выглядеть будет вот так: chr_wait_door_open 21 ???
&&

Оффлайн

 

#22 14-07-2009 15:49:00

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

Re: Интелект

Smith, не путай... "wait_to_help"(void) - функция, прописанная уже в скриптах. "смысловой нагрузки" в имени этой функции ровно столько же, как у любой другой. "chr_wait_health"(ai_name,hp) - функция, прописанная глубже. принципиальная разница только в размещении и вроде ещё паре нюансов. никакого "chr_wait" здесь нет вообще. есть только функции с таким префиксом: chr_wait_health, chr_wait_animation, chr_wait_animtype, chr_wait_animstate. их объединяет только схожесть названий (ну, и примерно аналогичная суть: остановить дальнейшее выполнение до события).
тем более, "chr_wait_door_open" - чушь ещё и потому, что chr_ относится в чарам, а у дверей свой собственный префикс door_. ) но к названию никогда не надо цепляться и тем более делить его на что-то. это лишь для удобства.

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

А например, если нужно сделать покруче событие, что-бы ждать приходилось не наличие 200 хп , а окончание жуткого замеса между 10 TCTF и 10 Синдикатов =))

20 организаций? или 20 человек? +)
chr_wait_health Suwestvo 0
повторить для всех существ...
хотя традиционно разработчиками использовались функции, вызываемые смертями персонажей (т.е. на самом деле они всей группой ссылались на одну-единственную функцию), чтобы декрементить счётчик и при достижении нуля делать все дела.

для того, чтобы что-то произошло по событию, необходим какой-то триггер. или мы имеем скриптовую вилку с ожиданием события (то есть не так уж и много всего... пересечение некоторого значения здоровья, исполнение некой анимации... возможна периодическая проверка значения переменной через рекурсивную функцию), или прописанное в ресурсах событие, вызывающее определённую функцию в игре. можно спрятать от игры все скрипты и побегать по уровням со включенной девмодой - консоль будет периодически заявлять, что "нет такой-то функции, запрошенной движком". тут тебе и лазеры, и открытие определённых дверей, и прохождение/пролетание по определённой области, и указанные в BINA смерть и разговор с персонажем.
если триггера в нужном месте нет - создавай... насколько я понимаю, здесь опять следует обратиться к BINA - TRIG, DOOR. если оно того стоит.

Оффлайн

 

#23 14-07-2009 17:18:31

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

Re: Интелект

Я написал функцию а она не прокатила: =(((
func void TCTF(void)
{
chr_wait_health Griffin 0
ai2_spawn ParkStriker
chr_location 1 -27.501019 1445.000000 -2914.32613

}

Оффлайн

 

#24 14-07-2009 17:28:48

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

Re: Интелект

Smith, а вызов-то этой функции есть? ) и кто именно имеется ввиду под номером "1" в chr_location?

Оффлайн

 

#25 14-07-2009 18:24:20

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

Re: Интелект

Мih@ написал(а):

Smith, а вызов-то этой функции есть? ) - всмысле?)) Как её запустить?
и кто именно имеется ввиду под номером "1" в chr_location?

-  ПРОВЕРЯЛ ВСЁ ПРАВИЛЬНО!

Оффлайн

 

#26 14-07-2009 18:57:45

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

Re: Интелект

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

всмысле?)) Как её запустить?

вилкой... из какого-нибудь исполняемого места. смотри пресловутое wait_to_help.
    fork MyFunction
кстати, функцию лучше не называть таким общим словом, имхо. и суть неясна, и пересечение с командой...

Оффлайн

 

#27 14-07-2009 19:21:44

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

Re: Интелект

Люди вы nick9 извинити онмойдруг просто когдая книму домойзаходил вмести с другом, мы с nick9 пошли пить а его и мой дружок оказывается написал это мы токо понилиэто по цитате чёон там наколякал извините что я за него отмазываюсь,ноэто правда!!!!!!!!!!!

Оффлайн

 

#28 14-07-2009 19:38:12

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

Re: Интелект

Мih@ написал(а):

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

всмысле?)) Как её запустить?

вилкой... из какого-нибудь исполняемого места. смотри пресловутое wait_to_help.
    fork MyFunction
кстати, функцию лучше не называть таким общим словом, имхо. и суть неясна, и пересечение с командой...

Я эту команду "TCTF" вставил в другую функцию, "fork TCTF" - не сработало(

Оффлайн

 

#29 14-07-2009 19:59:46

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

Re: Интелект

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

Люди вы nick9 извинити онмойдруг просто когдая книму домойзаходил вмести с другом, мы с nick9 пошли пить а его и мой дружок оказывается написал это мы токо понилиэто по цитате чёон там наколякал извините что я за него отмазываюсь,ноэто правда!!!!!!!!!!!

А чё он отрицал что это написал?

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

Я эту команду "TCTF" вставил в другую функцию, "fork TCTF" - не сработало(

Ты не понял Миху.
Функцию делай TCTF,а в скрипте на нужном месте пиши fork TCTF.


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

Оффлайн

 

#30 14-07-2009 20:02:16

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

Re: Интелект

Smith, ну скрипт в студию... а вообще, на то и есть dprint и dmsg, чтобы такие дела отлаживать.

Оффлайн

 

#31 15-07-2009 00:11:17

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

Re: Интелект

Smith, слушай сюда. Есть определённая тонкость с chr_location и вообще с любыми функциями, которые обращаются к челам через индекс (char ID). Этот индекс уникален, в каждый данный момент он соответствует максимум одному челу. Выдаётся этот индекс в момент появления чела в памяти (он соответствует номеру первой пустой ячейки, куда игра "кладёт" нового чела). Поэтому - и это главное - этот индекс сильно зависит от состояния памяти на момент вызова ai2_spawn, т.е. от предыстории. Этот индекс важно не путать с так называемым "скриптовым индексом" (script ID), который бывает у безмозглых челов и игроков. У Коноки, например, скриптовый индекс есть, и как правило 0, но он не имеет ничего общего с индексом Коноки как чела, т.е. с индексом её ячейки в памяти, который как правило тоже 0 (ибо Коноко появляется в уровне в первую очередь).

Рассмотрим твой скрипт. Целиком ты нам его не показываешь, но допустим, что кроме Коноки в уровне был только Гриффин, соответственно у Коноки был индекс 0, а у Гриффина - 1. Гриффин не освободит индекс 1, пока не станет трупом, а трупом он не станет, пока ты от него не отвернёшься и не попрыгаешь, например. Дело в том, что игра не спешит удалять мёртвых челов из памяти и заменять их на трупы, и предпочитает это делать, когда игрок на труп не смотрит. Поэтому ты не можешь заранее знать, какой индекс окажется у ParkStriker, скорее всего - 2, но в других ситуациях может оказаться и 1, если ты дашь Гриффину время и возможность стать трупом, до того как вызывать ai2_spawn(ParkStriker). Решить неоднозначность можно несколькими способами. Во-первых, можно найти подходящий FLAG и использовать chr_telerport. Во-вторых, статус Гриффина можно заморозить, чтобы он ни в коем случае не становился трупом, вот так: chr_death_lock(Griffin,1). В последних, Гриффина можно, наоборот, явно удалить из игры, не дожидаясь его превращения в труп: например, делаешь ему chr_death_lock, а потом чуть-чуть лечишь и chr_delete(Griffin).

Полную информацию о челах, существующих в памяти на данный момент, даёт девмодовая команда chr_who (с консоли). Чтобы увидеть информацию, надо пользоваться английским движком, а не русским, так что советую поставить недавно опубликованный гуёвый Эдишн, в котором содержится английский движок вместе с новым Даоданом, который позволяет играть в русскую версию, имея при этом все преимущества английского движка.


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

Оффлайн

 

#32 15-07-2009 07:49:18

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

Re: Интелект

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

Smith, слушай сюда. Есть определённая тонкость с chr_location и вообще с любыми функциями, которые обращаются к челам через индекс (char ID). Этот индекс уникален, в каждый данный момент он соответствует максимум одному челу. Выдаётся этот индекс в момент появления чела в памяти (он соответствует номеру первой пустой ячейки, куда игра "кладёт" нового чела). Поэтому - и это главное - этот индекс сильно зависит от состояния памяти на момент вызова ai2_spawn, т.е. от предыстории. Этот индекс важно не путать с так называемым "скриптовым индексом" (script ID), который бывает у безмозглых челов и игроков. У Коноки, например, скриптовый индекс есть, и как правило 0, но он не имеет ничего общего с индексом Коноки как чела, т.е. с индексом её ячейки в памяти, который как правило тоже 0 (ибо Коноко появляется в уровне в первую очередь).

Рассмотрим твой скрипт. Целиком ты нам его не показываешь, но допустим, что кроме Коноки в уровне был только Гриффин, соответственно у Коноки был индекс 0, а у Гриффина - 1. Гриффин не освободит индекс 1, пока не станет трупом, а трупом он не станет, пока ты от него не отвернёшься и не попрыгаешь, например. Дело в том, что игра не спешит удалять мёртвых челов из памяти и заменять их на трупы, и предпочитает это делать, когда игрок на труп не смотрит. Поэтому ты не можешь заранее знать, какой индекс окажется у ParkStriker, скорее всего - 2, но в других ситуациях может оказаться и 1, если ты дашь Гриффину время и возможность стать трупом, до того как вызывать ai2_spawn(ParkStriker). Решить неоднозначность можно несколькими способами. Во-первых, можно найти подходящий FLAG и использовать chr_telerport. Во-вторых, статус Гриффина можно заморозить, чтобы он ни в коем случае не становился трупом, вот так: chr_death_lock(Griffin,1). В последних, Гриффина можно, наоборот, явно удалить из игры, не дожидаясь его превращения в труп: например, делаешь ему chr_death_lock, а потом чуть-чуть лечишь и chr_delete(Griffin).

Полную информацию о челах, существующих в памяти на данный момент, даёт девмодовая команда chr_who (с консоли). Чтобы увидеть информацию, надо пользоваться английским движком, а не русским, так что советую поставить недавно опубликованный гуёвый Эдишн, в котором содержится английский движок вместе с новым Даоданом, который позволяет играть в русскую версию, имея при этом все преимущества английского движка.

Спасибо! Но дело в том что телепортировать челов я могу. Я прописываю по порядку ai2_spawn (имя)
И и телепортирую их соответственно в том порядке котором стоят, если первый в скрипте написал ai2_spawn Sr_9 то он и будет телепор. под номером 1. Это срабатывает. И где это нужное место (тем более тстф была функцией)?? Получается нужно команду fork TCTF вписать в ту фукцию, которая отвечает именно за 4сохранение, за последнюю битву?? Но в какую??

Оффлайн

 

#33 15-07-2009 08:05:02

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

Re: Интелект

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

И где это нужное место (тем более тстф была функцией)?? Получается нужно команду fork TCTF вписать в ту фукцию, которая отвечает именно за 4сохранение, за последнюю битву?? Но в какую??

ну смотри последовательно. начинается исполнение всегда из одного места - функции main. в последнем уровне, она ссылается на функцию start. в которой, в свою очередь, есть ряд ифов, среди которых находим:
    if (my_save_point eq 4)
    {

а ещё глубже - вариации в зависимости от того, жив ли Гриффин:
    if (did_kill_griffen() eq #)
    {

в его присутствии - вилка для ожидания 200 хелсов у Муро, на которую и следовало бы ориентироваться (хотя это ни разу не принципиально):
    fork wait_to_help
собственно, если ориентироваться на оригинальное течение скрипта (а не написание его с нуля), где-то тут вилке самое место. то бишь, мыслим логически - функция "ожидает" событие, и её вилочный вызов нужно ставить там, где начинается это "ожидание".

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

И и телепортирую их соответственно в том порядке котором стоят, если первый в скрипте написал ai2_spawn Sr_9 то он и будет телепор. под номером 1. Это срабатывает.

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

Оффлайн

 

#34 15-07-2009 08:32:33

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

Re: Интелект

Мih@ написал(а):

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

И где это нужное место (тем более тстф была функцией)?? Получается нужно команду fork TCTF вписать в ту фукцию, которая отвечает именно за 4сохранение, за последнюю битву?? Но в какую??

ну смотри последовательно. начинается исполнение всегда из одного места - функции main. в последнем уровне, она ссылается на функцию start. в которой, в свою очередь, есть ряд ифов, среди которых находим:
    if (my_save_point eq 4)
    {

а ещё глубже - вариации в зависимости от того, жив ли Гриффин:
    if (did_kill_griffen() eq #)
    {

в его присутствии - вилка для ожидания 200 хелсов у Муро, на которую и следовало бы ориентироваться (хотя это ни разу не принципиально):
    fork wait_to_help
собственно, если ориентироваться на оригинальное течение скрипта (а не написание его с нуля), где-то тут вилке самое место. то бишь, мыслим логически - функция "ожидает" событие, и её вилочный вызов нужно ставить там, где начинается это "ожидание".

О получилось=) Спасибо что обяснил! Всё BlackSwat делает кроме того, что он не идёт к флагу, вот моя ф-ция:
func void arbalet(void)
{
chr_wait_health Griffin 0
chr_location 5 -395.204987 1445.000000 -2941.419941
chr_set_class 5 TCTF_swat_blackops_1
chr_changeteam C_Sr19 TCTF
chr_set_health C_Sr19 210
chr_giveweapon C_Sr19 w3_phr
ai2_attack C_Sr19 Muro
ai2_movetoflag 0516 C_Sr19
ai2_setmovementmode C_Sr19 run


}

ДА и ещё Муро не атакует=)

Отредактировал(а) Smith (15-07-2009 08:34:06)

Оффлайн

 

#35 15-07-2009 08:45:29

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

Re: Интелект

А чё он отрицал что это написал?

Говорё же написал не он, а стёр он!
У него такая реакция!

Оффлайн

 

#36 15-07-2009 09:10:21

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

Re: Интелект

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

ai2_movetoflag 0516 C_Sr19

дословно "флаг 0516, иди к персонажу". +)) первый аргумент - персонаж, а второй - флаг.

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

ai2_attack C_Sr19 Muro

да это вообще весьма условная штука... точно не уверен, но вроде это функция просто выставляет персонажу приоритет для атаки. например, в оригинале финальной битвы - Муро всегда атакует игрока, до достижения им 200 хелсов остальные синдикатовцы заняты лишь TCTF. когда же muro_in_danger eq 1, все начинают фокусить игрока. никакой мощной низкоуровневой привязки нет.

Оффлайн

 

#37 15-07-2009 09:18:12

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

Re: Интелект

Мih@ написал(а):

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

ai2_movetoflag 0516 C_Sr19

дословно "флаг 0516, иди к персонажу". +)) первый аргумент - персонаж, а второй - флаг.

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

ai2_attack C_Sr19 Muro

да это вообще весьма условная штука... точно не уверен, но вроде это функция просто выставляет персонажу приоритет для атаки. например, в оригинале финальной битвы - Муро всегда атакует игрока, до достижения им 200 хелсов остальные синдикатовцы заняты лишь TCTF. когда же muro_in_danger eq 1, все начинают фокусить игрока. никакой мощной низкоуровневой привязки нет.

А вот я хочу что бы при смерти гриффина опять появлялся вертолёт, ну и поновой 2 TCTF (можно без гриффина)! функцию сделал камеры удалил, невышло(( Как правильно оформить процедуру??

Оффлайн

 

#38 15-07-2009 10:34:50

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

Re: Интелект

Smith, не бывает "не вышло". бывает "вышло не то, что ожидалось, потому что написано не то, что нужно".
появление вертолёта - не очень удобная штука... катсцена с ним постоянно меняет обзор, что позволяет делать некоторые махинации "за кадром", поэтому, во-первых, спрыгивание с вертолёта и бег к центру не согласованы (как вариант, бег вообще убираем и назначаем движение к флагу или атаку на врага), а во-вторых, вертолёт не умеет красиво исчезать. или в некоторый момент он удаляется начисто (лично я в таких случаях использую быстрые fade_out и fade_in, но они бросаются в глаза ещё больше, чем ВНЕЗАПНОЕ исчезновение вертолёта), или, если эта операция выполняется единожды, висит до самого конца.
ну, например, я поглядел в таком виде:
func void tround_z(void)
{
    obj_create 901 906
    env_anim 901 906
    ai2_spawn Griffin force
    ai2_spawn GrifOps02 force
    ai2_spawn GrifOps03 force
    chr_envanim Griffin GrifGrifBox01
    chr_envanim GrifOps02 GrifOps01Box01
    chr_envanim GrifOps03 GrifOps03Box01
    chr_animate Griffin COMGUYlev7_helistand 500
    chr_animate GrifOps01 STRIKEcrouch_idle 400
    chr_animate GrifOps02 STRIKEcrouch_idle 400
    chr_animate GrifOps03 STRIKEcrouch_idle 400
    sleep f290
    env_setanim 901 heli_doors_rt08
    env_setanim 902 heli_doors_lt08
    env_setanim 903 heli_rotorblades08
    env_setanim 904 heli_body08
    env_setanim 905 heli_canopy08
    env_setanim 906 heli_interior08
    chr_envanim Griffin GrifGrifBox02 norotation
    chr_envanim GrifOps02 GrifOps01Box02 norotation
    chr_envanim GrifOps03 GrifOps03Box02 norotation
    chr_animate Griffin COMGUYlev7_Grif
    chr_animate GrifOps02 STRIKElev7_Ops01
    chr_animate GrifOps03 STRIKElev7_Ops03
    sleep f240
    playback Griffin GrifGrifRunAlt
    playback GrifOps02 GrifOps01Run
    sleep f10
    playback GrifOps03 GrifOps03Run
}

всё работает безо всяких проблем... разве что дурацкое ai2_spawn GrifOps0# force желательно поменять на полноценного персонажа и убрать force.

Оффлайн

 

#39 15-07-2009 11:31:46

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

Re: Интелект

Спасибо Mih@ сработало=))) Ещё проблемка, я пару синдикатов телепортировал на крышу (в финальную битву)
Битва началась... всё замечатель, но радиус обзора челов мелковат( Ближе к середины битвы 2 TCTF в одном углу ,пару синдикатов по центру... И друг друга не видят... Короче как сделать радиус обзора больше? Скриптом можно обойтись?

Оффлайн

 

#40 15-07-2009 12:04:25

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

Re: Интелект

Smith, скриптом... смотря по ситуации... самое простое - периодическое обновление рекурсивной функцией... всё те же ai2_attack между нужными чарами, ai2_movetoflag для сбора народа в кучку, и т.п.

Оффлайн

 

Board footer

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