Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форумы Gem of The North > NWN Toolset > Вопросы и ответы 2


Автор: DarkSet Mar 6 2006, 07:55 PM
У меня назрела пара вопросов. Есть ли в этом недо С обращение к конкретной позиции переменной типа стринг? обращение st[i] где st - string. i - integer он что то упорно не понимает.

И еще, как с описанием множеств? Помнится в том же паскале я написал ('0'..'9') и компилятор понимает что имеются в виду цифры от 0 до 9 все, тут как то так можно? Или только полным перечислением?

Автор: denis0k Mar 6 2006, 09:12 PM
1. Извращайся через GetSubString.
2. Извращайся через цикл.

Вот такой недоси smile.gif Кстати, че-то я массивов вообще в нвскрипте не замечал.

Автор: zergirl Mar 6 2006, 10:07 PM
CODE

string GetStringAt(string str, int pos)
{
 return (GetSubString(str, pos, 1));
}

// ...

void main()
{
 // ...
 string str = "Sample string";
 string ch = GetStringAt(str, 5);
 SendMessageToPC(GetFirstPC(), ch); // -> "e"
 // ...
}

Автор: zergirl Mar 6 2006, 10:18 PM
массивы

вариант 1:
CODE

// без error-чекинга

void CreateArray(string name, int len)
{
 object mod = GetModule();
 for (int i = 0; i < len; ++i)
 {
   SetLocalInt(mod, name + "_len", len);
 }
}

int DeleteArray(string name)
{
 object mod = GetModule();

 for (int i = 0; i < len; ++i)
 {
   DeleteLocalString(mod, name + "_" + i, len);
 }
 DeleteLocalInt(mod, name + "_len", len);
}

string ArrayGet(string name, int pos)
{
 object mod = GetModule();
 return (GetLocalString(mod, name + "_" + i));
}

int ArraySet(string name, int pos, string val)
{
 object mod = GetModule();
 SetLocalString(mod, name + "_" + i, val);
}


варинт 2:
смотрим hashtable модуль для nwnx2
http://www.nwnx.org/

Автор: DarkSet Mar 7 2006, 12:54 AM
первое спасибо. Массивы это не совсем тоже самое что и множества. Я имел в виду не масивы данных, а простое описание множества. с и паскаль понимают запись а..я как множество маленький букв от а до я включительно, а вот эта фигня что то не понимает, или я неправильно пишу.

Автор: zergirl Mar 7 2006, 07:21 AM
В чем проблема написать интерфейс ко множествам с реализацией через массивы? =)

ps О какой встроенной поддержке множеств может идти речь в языке, в котором нет массивов? =)

Автор: zergirl Mar 7 2006, 08:14 AM
множества (v1.02 =)):

CODE

int ArrayLength(string name)
{
 object mod = GetModule();
 return (GetLocalInt(mod, name + "_len"));
}

int ArrayResize(string name, int diff)
{
 object mod = GetModule();
 int len = ArrayLength(name);

 if (len + diff < 0)
 {
   return (FALSE);
 }

 SetLocalInt(mod, name + "_len", len + diff);

 // Удалить лишние элементы
 if (diff < 0)
 {
   for (int i = 0; i < -diff; ++i)
   {
     int pos = len - i;
     DeleteLocalString(mod, name + "_" + pos);
   }
 }
}

// ...

void CreateSet(string name)
{
 CreateArray(name, 0);
}

void DeleteSet(string name)
{
 DeleteArray(name);
}

void SetAdd(string name, string val)
{
 if (!SetIn(name, val))
 {
   int pos = ArrayLength(name);
   ArrayResize(name, 1);
   ArraySet(name, len, val);
 }
}

int SetRemove(string name, string val)
{
 int len = ArrayLength(name);
 for (int i = 0; i < len; ++i)
 {
   if (ArrayGet(name, i) == val)
   {
     // Сдвинуть все элементы после удаленного влево
     for (int j = i + 1; j < len; ++j)
     {
       ArraySet(name, j - 1, ArrayGet(name, j));
     }
     ArrayResize(name, -1);
     return (TRUE);
   }
 }
 return (FALSE);
}

int SetIn(string name, string val)
{
 int len = ArrayLength(name);
 for (int i = 0; i < len; ++i)
 {
   if (ArrayGet(name, i) == val)
   {
     return (TRUE);
   }
 }
 return (FALSE);
}

// Если нужны, то могу написать
// void SetCopy(string source, string dest);
// void SetUnion(string source1, string source2, string dest);
// void SetIntersection(string source1, string source2, string dest);
// void SetDifference(string source1, string source2, string dest);

Автор: DarkSet Mar 7 2006, 10:33 AM
я не понимаю этот скрипт ) Нет, то есть все ясно, но суть в том что описать можно и перечислением, если надо, это не так сложно ) меня интересовало можно ли это не делать, значит нельзя.

Для моего случая все так сложно не надо, там попроще будет. Ну я разберуся ) Спасибо

Автор: dumbo Mar 7 2006, 11:33 AM
QUOTE (DarkSet)
с и паскаль понимают запись а..я как множество маленький букв от а до я включительно, а вот эта фигня что то не понимает, или я неправильно пишу

можно с этого места поподробней? - что там С понимает?.. huh.gif

Автор: DarkSet Mar 7 2006, 11:46 AM
не знаю как это в С описывается. Да и в паскале уже точно не помню smile.gif описание толи ['a'..'z'] толи ('a'..'z'), означает все буквы от а до z. Точнее ищи в хелпе, или описании языков, я с ходу не скажу )

Автор: DarkSet Mar 8 2006, 01:24 PM
как реализован наш банк? Как поиметь доступ к последнему сказанному выражению? Все равно кого, но можно и кого то конкретного.

не понял я толком как он работает. Сначала объект должен сказать что то, а потом запускатся эта функция и находит его последние слова или сначала надо запустить функцию, она начинает слушать, после чего то что скажет объект заносит в переменную?

И совсем непонятно что за третий интеджерный параметр?

Может это работает только в диалоге? Я пытался сделать на ящике на открытие определение объекта на закрытие этот сет лиснпатерн, не получилось. И пытался сделать на открытие сет лиснпатерн а на закрытие просто вывести то что записалось в переменную. Ничего не записалось.

Автор: dumbo Mar 10 2006, 09:42 AM
в OnSpawn ставить паттерны и включать слушалку (SetListenPattern, SetListening). третий параметр назначает номер этому паттерну. этот номер вернет функция GetListenPatternNumber, если слушающий услышит фразу, совпадающую с паттерном. а вообще, все это десятикратно разбиралось на форуме wrg.ru - сделай поиск по любой из этих функций.

Автор: zergirl Mar 10 2006, 11:06 AM
будет слушать все фразы вида "I wish ..."

OnSpawn
CODE

void main()
{
   SetListening(OBJECT_SELF, TRUE);
   SetListenPattern(OBJECT_SELF, "I wish **", 1001);
}


OnConversation
CODE

void main()
{
   object oSpeaker = GetLastSpeaker();
   if (GetIsObjectValid(oSpeaker))
   {
       int match = GetListenPatternNumber();
       if (match == 1001)
       {
           int matches = GetMatchedSubstringsCount();
           if (matches == 2)
           {
               string str = GetMatchedSubstring(1);
               // тут идет обработка str
           }
      }
   }
}

Автор: DarkSet Mar 25 2006, 11:53 AM
Как поиметь квенту персонажа? Получить ее как то и в каком виде она будет? Как с ней работать?

Автор: denis0k Mar 25 2006, 01:39 PM
Квента - это description (есть у любого объекта), пока никак. Где-то вроде был разговор, что с патча 1.67 можно будет, но я могу ошибаться.

Автор: DarkSet Mar 25 2006, 10:06 PM
как по человечески, а не извращенно как я smile.gif застравить скрипт эдитор юзать русские буквы?

Автор: zergirl Mar 25 2006, 11:07 PM
http://download.wrg.ru:8057/WWW/public_wrg/toolset/NWTSrus.rar

Автор: 2_advanced Mar 27 2006, 02:11 PM
QUOTE (nwtoolset.ini)
[Script]
FontName=Courier New Cyr

Автор: denis0k Mar 27 2006, 05:25 PM
QUOTE
не могла та патчилка и инишку поменять, чтоли
Насколько я помню без того патча компилятор выдавал ошибку на букве "я" из-за короткой кодовой таблицы (биоварцы подумали, что текст и комменты тож по-английски писать будут), так что только ини тут вряд ли поможет.

Кстати, в реестре ключи касательно кодовых таблиц правил? Помогает многим прогам.

Автор: denis0k Apr 4 2006, 05:48 PM
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage

Там 3 параметра 1250, 1251 и 1252 должны иметь одно значение c_1251.nls. Специально для тех программ, которые не юзают кодовую таблицу системы. Насколько я помню помогает писать по-русски даже в старых фотошопах.

Автор: undergorund Sep 18 2006, 07:39 PM
Как сделать общие переменные для нескольких функций?
CODE

int bPlayer1Ready = FALSE;
int bPlayer2Ready = FALSE;
void main()
{
   return;
}

void StartBattle()
{
   bPlayer1Ready = FALSE;
   bPlayer2Ready = FALSE;
   object MainDoor = GetObjectByTag("Main_Gate");
   ActionCloseDoor(MainDoor);
   SetLocked(MainDoor, TRUE);
   SignalEvent(GetObjectByTag("Main_Gong"), EventUserDefined(GetUserDefinedEventNumber()));
}

void PlayerReady1()
{
   bPlayer1Ready = TRUE;
   if ((bPlayer1Ready == TRUE) && (bPlayer2Ready == TRUE))
       StartBattle();
}

void PlayerReady2()
{
   bPlayer2Ready = TRUE;
   if ((bPlayer1Ready == TRUE) && (bPlayer2Ready == TRUE))
       StartBattle();
}

PlayerReady1() и PlayerReady2() вызываються из других фаилов.

П.С. Есть разница в НВН когда пользуешся #include "" в какой последовательности компилировать скрипты, или меня уже просто глючит?

Автор: denis0k Sep 18 2006, 09:03 PM
Что-то мне подсказывает, что глобальные переменные там же, где и массивы. Юзай локалки на чарах/локе/моде.

В смысле в какой последовательности компилировать? Пример в студию.

Автор: FenrIX_666 Sep 21 2006, 10:58 PM
Вообщем наверное есть. Однажды была ситуация, когда скрипт (1) инклюдил функцию из другого скрипта (2). Забавно было, когда я забыл откомпелировать (2). НВскрипт и слова не сказал, а НВН после запуска просто повесился. Хотя это было еще до 1.59, так что могло все измениться.

На счет глобальных переменных - юзай SetGlobal[Type]() (вроде в каком-то из инклюдов ХотУ было). Помогает.

Автор: denis0k Sep 22 2006, 02:26 PM
А если копануть инклуд, то там 100% это сделано через локалки на модуле smile.gif Так собсно и массивы можно сделать.

Автор: Allati Sep 22 2006, 03:37 PM
Никто же не спорит про реализацию smile.gif
Всегда лучше использовать единые функции. Управлять проще.

Автор: FenrIX_666 Sep 22 2006, 11:28 PM
Угу, через локальные переменные =)
Но тут два варианта - если на 100% веришь в скриптеров биотварей, то юзай стандартный инклюд. А если хочешь чтобы все 100% работало - пиши сам =)

Я например предпочитаю всю грязную работу сливать на биотварей, а потом внести небольшие изменения и сказать что все так и было =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)