|  |  |  | 
	| Канал Игры Мечты: «Скрипты» | 
	|  | 
	|  | 
	
		| Jurec 
  348 EGP 
    Рейтинг канала: 4(76)
 Репутация: 102
 Сообщения: 1441 Заблокирован
 Откуда: Seattle
 Зарегистрирован: 25.02.2006
 
      |  | Значит в моем собственном проекте пришло время писать ИИ. Здесь особо выбирать не пришось - скрипты.. но зная КАК ОНИ ТОРМОЗЯТ решил не сильно их использовать. 
 Функция скрипта - управление игровым объектом (корабль,станция,ракета и т.д.)
 
 пока применялось только для кораблей, т.к. именно им нужна сложная система поведения. Ну вот, например, атака на другой корабль. Алгоритм таков:
 
 1-приближатся к объекту
 2-при приближении на выстрел ракетой, собственно, выстрелить ракетой
   3-при приближении на выстрел пушками использовать их.
 4-при приближении на расстояние Х - улетать от объекта, а по достижению расстояния Y перейти к пункту 1.
 
 В моём предложении я наткнулся на ограничения (обойти можно, но лучше посоветоватся и переделать). Даже на такой простом алгоритме поведения.
 
 Вот. Цель данной темы обсудить скриптовую систему. Вообще как её организовать и что она из себя должна представлять.
   _________________
 MOV topka, C++
 | 
		
		|  | 
    |  | 
	
		| Executor 
  1860 EGP 
   Рейтинг канала: 1(2)
 Репутация: 522
 Сообщения: 9023
 Откуда: Беларусь
 Зарегистрирован: 09.05.2001
 
    |  | Темка тут повисит недельку (надеюсь хватит), потом я ее в КИМ отфутболю. Так что будьте в курсе, что потом ее надо будет искать там, так как она не соответствует тематике данного канала. 
 
 
	  | Jurec : |  
	  | Здесь особо выбирать не пришось - скрипты.. но зная КАК ОНИ ТОРМОЗЯТ решил не сильно их использовать. |  Я не программер, но, по моему, все зависит от того как и на чем их писать. Если делать как Эгософт, то конечно будут тормозить
   _________________
 Император Всея Галактики, Прилегающих Туманностей, Комет И Астероидов, А Также Планеты Ракксла, Буде Она Все-Таки Обнаружится :)
 | 
		
		|  | 
    |  | 
	
		| SD 
  272 EGP 
   Репутация: 30
 Сообщения: 2544
 
 Зарегистрирован: 05.03.2006
 
    |  | Угу. Все упирается в скорость взаимодействия скриптового движка с игровым. Игософт пропускает его через два (или три) фреймворка в однопоточном режиме. Если же на скрипты выделить отдельный поток с прямым доступом в физику мира, проблем быть не должно. | 
		
		|  | 
    |  | 
	
		| Jurec 
  348 EGP 
    Рейтинг канала: 4(76)
 Репутация: 102
 Сообщения: 1441 Заблокирован
 Откуда: Seattle
 Зарегистрирован: 25.02.2006
 
      |  | Да не стоит вопрос что быстрее, а что нет. Скрипты всегда будут медленне чем прямой код. И тут даже не вопрос взаимодействия. 
 Основной вопрос остается открытым - как организовать скриптовую систему. Или так - как она организована в х3.
 _________________
 MOV topka, C++
 | 
		
		|  | 
    |  | 
	
		| AlexYar 
  1953 EGP 
                Рейтинг канала: 3(46)
 Репутация: 325
 Сообщения: 33284
 
 Зарегистрирован: 26.10.2003
 
    |  | 
	  | Jurec : |  
	  | Значит в моем собственном проекте пришло время писать ИИ. |  
 ИИ для иксов, или просто ИИ как цель работы?
 | 
		
		|  | 
    |  | 
	
		| Jurec 
  348 EGP 
    Рейтинг канала: 4(76)
 Репутация: 102
 Сообщения: 1441 Заблокирован
 Откуда: Seattle
 Зарегистрирован: 25.02.2006
 
      |  | 
	  | AlexYar : |  
	  | ИИ для иксов, или просто ИИ как цель работы? |  Нет,нет. ИИ для моей собственной игры. А чтоб это ИИ написать неплохо было бы ознакомится с ним в других играх - вот, в часности в иксах.
 _________________
 MOV topka, C++
 | 
		
		|  | 
    |  | 
	
		| Jurec 
  348 EGP 
    Рейтинг канала: 4(76)
 Репутация: 102
 Сообщения: 1441 Заблокирован
 Откуда: Seattle
 Зарегистрирован: 25.02.2006
 
      |  | Ну вот, например, как бы вы написали скрипт нападения корабля "А" на корабль "В" используя какой-то псевдоскриптовый язык, синтаксис которого я оставляю на ваше усмотрение... 
 Поведение при атаке написано выше.
 _________________
 MOV topka, C++
 | 
		
		|  | 
    |  | 
	
		| aftermath 
  685 EGP 
     Репутация: 234
 Сообщения: 1316
 Откуда: Нижний Новгород
 Зарегистрирован: 07.04.2006
 
      |  | 
	  | Jurec : |  
	  | как бы вы написали скрипт нападения корабля "А" на корабль "В" |  А зачем придумывать скрипт? Можно за основу легко взять теже стандартные Егософтовские скрипты.
 
 Что-то для меня так и остался непонятным сабж этой темы
  . Нужны конкретные скриптовые реализации тех или иных действий или сама реализация скриптовой системы, ее взаимодействие с движком и т.п.?
 _________________
 В темном мире нет любви.
 И в груди пусты сердца... (c)
 | 
		
		|  | 
    |  | 
	
		| Krom 
  455 EGP 
    Рейтинг канала: 1(3)
 Репутация: 159
 Сообщения: 1988
 Откуда: Горы Урала
 Зарегистрирован: 19.07.2005
 
    |  | Jurec: Стучись в аську, поговорим. Есть наработки. И ещё в канале Х2 как-то проводили турнир боевых скриптов для ястребков класса М3, можешь поискать вот тут на предмет исходников.
 _________________
 Не спешите меня.
 | 
		
		|  | 
    |  | 
	
		| Jurec 
  348 EGP 
    Рейтинг канала: 4(76)
 Репутация: 102
 Сообщения: 1441 Заблокирован
 Откуда: Seattle
 Зарегистрирован: 25.02.2006
 
      |  | 
	  | aftermath : |  
	  | сама реализация скриптовой системы, ее взаимодействие с движком и т.п. |  вот.
 _________________
 MOV topka, C++
 | 
		
		|  | 
    |  | 
	
		| akm 
  470 EGP 
     Рейтинг канала: 1(3)
 Репутация: 173
 Сообщения: 1638
 Откуда: Паразит Прайм
 Зарегистрирован: 23.10.2002
 
    |  | Космосиму нужны не столько скрипты как таковые, сколько ИИ и управление всеми объектами (преймущественно кораблями и ракетами). Как это управление будет осуществляться - выбирать разработчику, т.е. возможны: 
 1) процедурные вызовы тех или иных действий, например
 Ship->Follow_Object(object_ptr, distance, timeout);
 Ship->Fire_Missile_by(object_ptr, missile_type);
 и т.д.
 По сути требуется каждую из подобных процедур построить на более примитивных командах физическому движку либо других уже имеющихся процедурах, например, в теле процедуры Fire_Missile_by наверняка будет что-то вроде:
 amount = Ship->get_Amount_of_Ware_in_Cargobay(missile_type);
 if (amount <= 0)  return 0;
 Ship->set_Amount_of_Ware_in_Cargobay(missile_type) = amount - 1;
 missile_ptr = Ship->get_Missile(missile_type);
 timeout = get_Missile_Max_Distance(missile_type)/get_Missile_Speed(missile_type);
 missile_ptr->Follow_Object(object_ptr, 10, timeout);
 if (get_Distance(missile_ptr, object_ptr) <= 10) missile_ptr->BOOM();
 
 2) интерпретация скрипт-команд. Фактически то же самое, только игра даже после компиляции останется открытой для доработки ИИ, т.к. вместо "зашитых" имен процедур будут употребляться скрипт-команды, а движек игры будет на лету распознавать по тексту команды, какую именно процедуру вызывать и какие ей передавать параметры, т.е.
 +: гибкость
 -: некоторая потеря производительности на интерпретацию команд/параметров.
 
 Теперь самое сложное, не зависимо от выбранной концепции, - это обеспечить одновременное выполнение десятков тысяч процедур(скриптов), порождаемых тысячами объектов во вселенной. Проблема тут не столько заставить их выполняться одновременно, сколько избежать конфликтов этого множества скриптов из-за того, что, например один скрипт отправляет корабль на станцию, другой его разворачивает в целях избежания коллизии, третий попросту корабль уничтожает (уже высвобождает ресурсы), а четвертый в это время уверен, что корабль еще припаркован на верфи, т.к. в момент поиска кораблей по какому-то критерию, запущенного еще многие миллисекунды ранее, этот корабль действительно был еще на верфи и никуда не летел... Короче, разрешение подобных граблей нужно предусматривать заранее в самом сердце движка игры.
 
 Если кратко, можно построить этот движек так:
 1. Нужен один общий стек, куда будут скидываться на выполнение абсолютно все скрипт-команды (или вызовы процедур). Порождаться такие команды очевидно будут движком ИИ, действиями игрока, событиями во вселенной и собственно другими командами/скриптами. Выполняться же они будут в порядке живой очереди в соответствии с приоритетами и таймаутами. В идеале выполнение организовать в произвольное количество потоков (выбираемое в дальнейшем на основании конфы железа игрока и др.)
 Т.е. в стек команд, например, может помещаться такой набор чисел для каждой из активных команд:
 A) указатель на объект, на котором выполняется команда
 B) указатель на скрипт (или стек объекта), где выполняется команда
 C) внутриигровое время, ранее которого выполнять данную команду не следует
 D) приоритет команды (в глобальной сетке)
 
 2. Алгоритм арбитра, отбирающего команды на выполнение, примерно такой: регулярно пробегаемся по всем командам в стеке и выбираем (например в отдельный массив) те команды, время выполнения которых уже подошло. Если найдено более 1 команды, то пробегаем по данным отобранным командам и находим с макс приоритетом. Выбранную команду удаляем из стека и выполняем.
 
 Примерно так реализовано в Х2/Х3, хотя это и не самый производительный вариант, но довольно простой.
 | 
		
		|  | 
    |  | 
	
		| Jurec 
  348 EGP 
    Рейтинг канала: 4(76)
 Репутация: 102
 Сообщения: 1441 Заблокирован
 Откуда: Seattle
 Зарегистрирован: 25.02.2006
 
      |  | Супер! akm, вот ты то мне и нужен. 
 Ув. модераторы! Можно пинать в КИМ.
   _________________
 MOV topka, C++
 | 
		
		|  | 
    |  | 
	
		| aftermath 
  685 EGP 
     Репутация: 234
 Сообщения: 1316
 Откуда: Нижний Новгород
 Зарегистрирован: 07.04.2006
 
      |  | Перенесено по просьбе автора   _________________
 В темном мире нет любви.
 И в груди пусты сердца... (c)
 | 
		
		|  | 
    |  | 
	|  | 
	
		|  | 
    |  | 
	| Канал Игры Мечты: «Скрипты» | 
	
		|  |