Автор Тема: Скрипты для NewDark  (Прочитано 2593 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Chuzhoi

  • Тень
  • Сообщений: 9419
Скрипты для NewDark
« : 26 Марта 2017 17:56:19 »
Chuzhoi, я так понял, ты уже почитал немного по сути вопроса. С каким из двух инструментов работать удобнее? Для какого документация написана толковее, точнее и подробнее? Какой лучше изучать с околонулевым уровнем подготовки?
Учитывая наличие третьего вопроса, для меня важнее всего ответ на второй.
Мне трудно что-то посоветовать.  Конечно, для себя я бы выбрал Squirrel, несмотря на то, что с этим языком я раньше дела не имел - там привычный С-образный синтаксис; там имеется классическое ООП, основанное на классах, которого нет в Lua; кроме того, сама репутация языка (несмотря на то, что он довольно молодой) вроде как уже достаточно высока. Кроме того, поддержка новых функций NewDark тоже имеет достаточно важное значение, как ни крути. Но...

Во-первых, важно понимать, что язык - это язык, а API - это API. Документации к языку Lua на сайте LGScript нет - надо искать доки и учебники по Lua на специализированных сайтах; точно также нет документации по языку Squirrel в тех четырех текстовых файликах, которые приложены к Squirrel.osm. И если говорить чисто о языке, то мне кажется, что новичку, который далек от программирования, все-таки будет легче освоить Lua, нежели Squirrel - сам язык, как мне кажется, синтаксически несколько проще (хотя это еще вопрос), и ввиду довольно высокой популярности самого языка документации в интернете по нему навалом (в т. ч. и на русском языке) - чем вряд ли сможет похвастать Squirrel. По крайней мере, я сходу не нашел ни одного толкового руководства по "белке" на русском языке.

А что касается мощи и возможностей языка, то при тех объемах и той сложности скриптинга, с которыми приходится иметь дело при создании ФМ (когда функция - обработчик сообщения занимает в среднем пять строчек), я вообще не вижу большой разницы, какой язык использовать. Даже если кому-нибудь взбрело бы в голову использовать для скриптинга в Thief какой-нибудь диалект SQL, то, полагаю, мы бы все равно примерно с тем же объемом усилий добились аналогичных результатов. ООП, которое я упомянул ранее - это хорошо, но вряд ли в нем есть какой-то реальный профит в нашей ситуации, когда в основном нужно "что-то подправить" - ну разве что если мы будет городить совершенно новую игру с нуля.

Ну а во-вторых, если говорить о самом API, то, опять же, документация к LGScript представлена в более подробном и удобоваримом виде - на сайте есть структурированный онлайн-справочник по API (в котором даны краткие описания всех сообщений движка и функций с их аргументами) и небольшой, но достаточно информативный туториал, построенный по принципу "от простого к сложному". Документация же к Squirrel.osm расчитана на подготовленного человека и в части описания собственно API предельно лаконична - там даны лишь структуры классов и имена функций с перечнем аргументов (без каких-либо комментариев). В самом API используются разные подходы: в LGScript - более простой  функциональный (скрипт представляет собой набор функций, обрабатывающих сообщения), а в Squirrel script - объектно-ориентированный (скрипт представляет собой класс, унаследованный от SqRootScript, методы которого обрабатывают сообщения - уже напугал, да?) Конечно, документацию по API в некоторой степени можно считать универсальной, и ничто не мешает использовать справочник по LGScript для программирования в Squirrel script (ведь сообщения и сервисы движка те же), но то, что полученные сведения придется переводить из одной "системы координат" в другую, для новичка может оказаться непосильной задачей.

В общем, если Zontik самостоятельно начнет изучать LGScript, то он с большей вероятностью добьется некоторых успехов, нежели если он возьмется за "белку", где его, учитывая околонулевую подготовленность, почти наверняка ждет фиаско. У LGScript, по большому счету, только один серьезный недостаток - он не поддерживает новые функции Dark Engine. А вообще, если бы вместо Squirrel.osm в NewDark включили бы доработанный lgs.osm, то я бы глазом не моргнул и был бы только рад, несмотря на всю мою любовь к си-образным языкам. Так что сам выбирай. Вообще, я думаю, мир не без добрых людей, и на чем бы ты ни остановил свой выбор, без помощи ты не останешься. Но проще будет с LGScript. Но это мое мнение. Кто не согласен, тот может высказаться.

Оффлайн nemyax

  • Мастер Теней
  • Сообщений: 4390
  • Нёмыч
Скрипты для NewDark
« Ответ #1 : 26 Марта 2017 19:22:33 »
На ttlg резонно отмечают, что можно и вовсе обойтись без скриптинга, а написать себе что надо на си. Тоже вариант.

Оффлайн Zontik

  • Призрак
  • Сообщений: 14770
    • Тёмное место
Скрипты для NewDark
« Ответ #2 : 27 Марта 2017 09:21:58 »
Я когда-то давно изучал С, но это было еще до появления С++. С последним у меня понимание так и не сложилось, поэтому мысль уловил и в общем-то согласен.
Хотя все равно гложет мысль, что я чего-то в этой жизни не понимаю.
Цитировать
скрипт представляет собой класс, унаследованный от SqRootScript, методы которого обрабатывают сообщения
Вот если можно объяснить это нормальными человеческими словами - было бы здорово. В порядке общего развития. Что такое класс? Что такое метод? Про сообщения объяснять не надо, наверное, если это то же самое, что и в LGS.
Дайте глазам отдохнуть! Тёмное место

Оффлайн HellRaiser

  • Мастер Теней
  • Сообщений: 4302
Скрипты для NewDark
« Ответ #3 : 27 Марта 2017 09:48:07 »
Цитировать
скрипт представляет собой класс, унаследованный от SqRootScript, методы которого обрабатывают сообщения
Вот если можно объяснить это нормальными человеческими словами - было бы здорово. В порядке общего развития. Что такое класс? Что такое метод? Про сообщения объяснять не надо, наверное, если это то же самое, что и в LGS.

Короч, если совсем простыми словами, то слющай дарагой сюды:
Класс - это структура данных (типа struct в Си), только в ООП юзается как элементарная единица данных. Ну вот например, есть у тебя тип данных с плавающей точкой (как float в Сях), по сути его можно описать как класс, который имеет набор определённых свойств, необходимых для работы с вещественными числами. Метод класса - это функция, которая работает с внутренними полями класса - мемберами (или членами, кому как удобно называть). Член класса - это поле внутри класса (аналогично в структурах, за тем исключением, что доступ к ним в отличии от структур, по-дефолту закрыт). Методы в литературе тоже обзывают мембер-функциями, так что не путаться - это одно и то же.

Возвращаемся к нашему флоуту: у тебя есть класс, в котором есть набор функций-методов, описывающих операции с вещественным числом: умножение, деление, приведение типа и проч, есть мембер(ы): описывающие например мантиссу и порядок твоего флоута. Так же есть некий 4-байтовый контейнер, в котором ты хранишь своё число в каком угодно тебе виде, а при обращении к объекту твоего класса специальная функция-мембер (или метод) вернёт вызывающему тот самый флоут, который мы привыкли видеть в архитектуре х86.

Касательно наследования: у тебя есть базовый класс (а лучше - интерфейс), описывающий поведение какого-нить объекта (группы объектов): ну например .... ну например.... ну например.....
ну пусть будет жЫвотное.
Так вот, у базового класса есть например функции "родиться", "умереть", "размножиться" и "пожрать".  Это поведение свойственно всем животным. Но ты решил придумать своё мифическое животное, например единорога, так?
Мы опустим щас всю иерархию (животное->млекопитающее->парнокопытное->лошадеобразное), где каждый унаследованный класс конкретизирует абстракцию понятия животное и сводит его к конкретному описанию конкретного животного и будем счситать, что от обычного животного единорог отличается лишь наличием рога на лбу...
Поэтому мы пишем унаследованный класс единорог, которому добавятся мемберы описывающие длину рога и и его цвет например..

Надеюсь, в общих чертах понятно разложил? Более подробно могу в личке рассказать :)
« Последнее редактирование: 27 Марта 2017 09:55:13 от HellRaiser »

Оффлайн Zontik

  • Призрак
  • Сообщений: 14770
    • Тёмное место
Скрипты для NewDark
« Ответ #4 : 27 Марта 2017 09:53:23 »
Единственное, что я понял хорошо - это степень своего невежества. На этом достаточно, спасибо.
Дайте глазам отдохнуть! Тёмное место

Оффлайн nemyax

  • Мастер Теней
  • Сообщений: 4390
  • Нёмыч
Скрипты для NewDark
« Ответ #5 : 27 Марта 2017 09:55:27 »
Пора открывать отдельную тему про программизм в моддинге вора.

Оффлайн HellRaiser

  • Мастер Теней
  • Сообщений: 4302
Скрипты для NewDark
« Ответ #6 : 27 Марта 2017 10:02:13 »
Оффтопик: Вот чё, на самом деле чтоли из меня НАСТОЛЬКО наиприпоганейший объясняльщег?

Оффлайн nemyax

  • Мастер Теней
  • Сообщений: 4390
  • Нёмыч
Скрипты для NewDark
« Ответ #7 : 27 Марта 2017 10:13:56 »
Оффтопик:
HellRaiser
Лично мне ты объяснял вполне успешно. Но мне надо было для дела, а не на форуме потрындеть.

Оффлайн HellRaiser

  • Мастер Теней
  • Сообщений: 4302
Скрипты для NewDark
« Ответ #8 : 27 Марта 2017 10:44:47 »
nemyax, благодарю, отлегло ))
Zontik
ну может так понятнее будет?

*** это чисто для примера, так что господа программировщики, прошу не пинать***

class base_object
{
private: // доступ к этим членам закрыт, их может менять только сам класс (т.е. мемберы класса)
 BOOL bIsExistInThisReality; // мембер (член) класса
protected: // это защищённые мемберы, для всех других классов они как закрытые, а для унаследованных от данного класса - доступны. Короч модификатор видимости такой.
 void createObject();  // это метод класса
 void destroyObject(); // это тоже метод класса (или функция-член, ибо всё, что внутри фигурных скобок - есть члены класса)
public: // доступ к этим мемберам открыт:
 BOOL IsObjectCreated(); // это тоже метод класса
  virtual void Show() = 0; // ключевое слово vitrual означает, что функция в производном классе будет переопределена по-другому, для того, об это м поговорим чуть ниже
 // более того, "=0" означает, что эта функция не должна быть описана в данном классе, а только в производных. И верно же- как "показать" то, у чего нет формы, а только флаг существования?
};

void base_object::createObject()
{
  bIsExistInThisReality = TRUE;
}
void base_object::destroyObject()
{
  bIsExistInThisReality = FALSE;
}
base_object::base_object() // конструктор класса
{
  createObject();
}

base_object::base_object() // деструктор класса
{
  destroyObject();
}

////////////////////////////////////////////////////////////////////////////////////
class triangle: public base_object
{
private: // у него есть помимо базового ещё и координаты, которые можно менять извне с помощью функции SetPosition
// также неявно в этом объекте будет присутствовать переменная bIsExistInThisReality, но менять мы её не сможем
 int x;
 int y;
 int z;
public:
 virtual void Show();
 void SetPosition (int newX, int newY, int newZ);
}

void triangle::SetPosition(int newX, int newY, int newZ)
{
x = newX;
y = newY;
z = newZ;
}
void triangle::Show()
{
 // рисуем треугольник на экране
}

class rectangle: public base_object
{
private: // у него есть помимо базового ещё и координаты, которые можно менять извне с помощью функции SetPosition
// также неявно в этом объекте будет присутствовать переменная bIsExistInThisReality, но менять мы её не сможем
 int a;
 int b;
 int c;
 int d;
public:
 virtual void Show();
 
}
void rectangle::Show()
{
 // рисуем прямоугольник на экране
}

class circle: public base_object
{
private:
int radius;
int x;
int y;
public:
 virtual void Show();
 
}
void circle::Show()
{
 // рисуем прямоугольник на экране
}

void main()
{
  base_object* arr[3];
  arr[0] = new circle();
  arr[1] = new rectangle();
  arr[2] = new triangle(); 
  ...
  for (int i = 0 ; i < 3)
  arr[i]->Show(); // для каждого типа объекта будет вызываться своя рисовальная функция
}

Оффлайн Zontik

  • Призрак
  • Сообщений: 14770
    • Тёмное место
Скрипты для NewDark
« Ответ #9 : 27 Марта 2017 10:44:59 »
Оффтопик: Ты нормально объяснил, а я понял, что не был готов к таким объяснениям. В принципе могу понять, о чем речь, но полок, чтобы разложить эти знания, у меня в голове еще нет. Для правильного вопроса еще надо созреть.
Дайте глазам отдохнуть! Тёмное место

Оффлайн HellRaiser

  • Мастер Теней
  • Сообщений: 4302
Скрипты для NewDark
« Ответ #10 : 27 Марта 2017 10:52:11 »
Zontik теперь точно отлегло  ;D

Оффлайн ndk

  • Член Гильдии Воров
  • Сообщений: 1778
Скрипты для NewDark
« Ответ #11 : 27 Марта 2017 11:08:29 »
На ttlg резонно отмечают, что можно и вовсе обойтись без скриптинга, а написать себе что надо на си. Тоже вариант.
Совсем нет. Сейчас так уже не делают. (время выставил) :)
https://youtu.be/WC6Xx_jLXmg?t=1m56s

Оффлайн nemyax

  • Мастер Теней
  • Сообщений: 4390
  • Нёмыч
Скрипты для NewDark
« Ответ #12 : 27 Марта 2017 13:09:35 »
Оффтопик: я понял, что не был готов к таким объяснениям
Оффтопик: Тыж учил си. Вот это примерно как оборачивать структы другими структами (можно с применением объединений, чёб доступ к членам был прямее). Разве что в сях все члены на виду, а в плюсах можно прикрыться.
А вместо методов можно включать в структы указатели на функции, хотя смысла тут маловато.

Оффлайн Zontik

  • Призрак
  • Сообщений: 14770
    • Тёмное место
Скрипты для NewDark
« Ответ #13 : 27 Марта 2017 14:13:12 »
Оффтопик: То есть глобализация, если по-русски? Если да, то принцип понятен, вопрос - как это использовать на практике. Избавление от рутины?
Пробовал как-то разобраться в тексте простенькой программы на С++. Был поражен, насколько сложно докопаться до ответов на простейшие конкретные вопросы. Такое ощущение, будто все конкретные вещи определяются "где-то там", и как туда забраться и что-то исправить - фиг знает.
Дайте глазам отдохнуть! Тёмное место

Оффлайн nemyax

  • Мастер Теней
  • Сообщений: 4390
  • Нёмыч
Скрипты для NewDark
« Ответ #14 : 27 Марта 2017 14:19:40 »
Оффтопик: То есть глобализация, если по-русски?
Оффтопик: Почему глобализация? Обычное наследование. Такой, но с перламутровыми пуговицами.