|
|
16.10.2007, 10:10
|
#1883
|
|
Re: М: Скриптинг в Готике
Цитата:
Сообщение от marazmus link=board=gothic&t=1105030050&start=3796150#37961 74 date=10/16/07, в 07:41:29
Циклов нет :( Куча IF вам в помощь :)
|
Странно, у меня четкое ощущение, что я такие штуки где-то видела... А неоднозначно работающие функции и повторяющиеся строчки вызывают внутренний протест... Хотя в скриптах не так. Пора ловить съезжающую крышу... *::):( Где эти циклы бывают, а?
|
|
|
16.10.2007, 13:32
|
#1884
|
|
Re: М: Скриптинг в Готике
Цитата:
Сообщение от okin link=board=gothic&t=1105030050&start=3796275#37962 98 date=10/16/07, в 10:10:26
Где эти циклы бывают, а?
|
Циклы с крышей? *:o Лично я уже давно убедился, что метод "научного тыка" в даедалусе безотказен... ;D ;D ;D
|
|
|
16.10.2007, 15:45
|
#1886
|
|
Re: М: Скриптинг в Готике
Народ, объясните все-таки, откуда берется инт в CreateInvItem. * В благословенном туторе написано void CreateInvItem (c_npc n0, int n1); - создает в инвентаре НПС n0 предмет с ID n1. xxx.id благополучно выдает номер неписей, но для предметов рисует ноль. Так кто такой n1???
Наверное, это для всех очевидно... Но я месяц назад умела пользоваться только вордом и интернетом, так что глупые вопросы лезут из всех щелей. И нужен тутор к тутору. Хелп!
Сделала непися, который всегда одет в такой же доспех, как ГГ. Самым примитивным способом - перебрав все имеющиеся в игре броньки. Но это очень уж громоздко и уродливо. Очевидная мысля - посмотреть у одного и засунуть другому. А там эта загадочная разница типов с непонятно откуда берущимся id... И циклов немае, чтоб хоть перебрать по-быстрому... Кстати, вспомнила, где я их видела - в школьном паскале. Правда, с тех пор он ни разу не понадобился и напрочь забылся...
ps Метод тыка - эт, конечно, хорошо, но приятно понимать, что происходит... ;)
|
|
|
16.10.2007, 16:44
|
#1887
|
|
Re: М: Скриптинг в Готике
Вот небольшой пример (для 1 готики) как определить одетые на ГГ доспехи и одеть некого НПЦ в такие же (к слову, можно определять не только доспехи, но и носимое оружие) Итак:
var C_NPC AlbinoTmp; *//Это переменная для нашего "некого" нпц var C_Item AlbinoItem; //Это для получения инстанции предмета var int AlbinoArmor; * * *//Это для доспехов - фактически та же инстанция но в цифровом представлении.
if (Npc_HasEquippedArmor(hero)) { AlbinoItem=Npc_GetEquippedArmor(hero); * * * //Сначала получаем имя одетой броньки (ф-ция Npc_GetEquippedArmor возвращает C_Item) AlbinoArmor = Hlp_GetInstanceID(AlbinoItem); //Потом извлекаем её идшник - геморой, но иначе не выходит. Грубо говоря конвертируем C_item в integer. * * * * * * };
if (AlbinoArmor!=0) { * * * CreateInvItem(AlbinoTmp,AlbinoArmor); //Если ГГ одет в броню - т.е. AlbinoArmor не ноль, то создаем у нашего *AlbinoTmp такую же броньку, обратите внимание - используется переменная типа int a НЕ С_item. AI_EquipBestArmor(AlbinoTmp); * * * * * *//Экипируем лучшую броню. * * * };
Что то вроде этого что ли?
Касательно n1 - в данном случае имеется в виду не id предмета, а *именно ссылка на инстанцию предмета. Не буд врать, я не знаю, но, кажется, id предмета можно получить только через Hlp_GetInstanceID (c_item item).
Уж не знаю как, но в случае с предметами вполен можно написать CreateInvItem(hero,ItFoBeer); (где *ItFoBeer - instance ItFoBeer(C_Item)) и ошибки не будет ;)
Если есть желание можете попробовать другой, "честный" метод: var int AlbinoBeer; AlbinoBeer = Hlp_GetInstanceID(ItFoBeer); CreateInvItem(hero,AlbinoBeer);
По идее, должны работать оба.
|
|
|
16.10.2007, 17:12
|
#1888
|
|
Re: М: Скриптинг в Готике
Цитата:
Сообщение от 360 link=board=gothic&t=1105030050&start=3797075#37970 91 date=10/16/07, в 16:44:21
AlbinoArmor = Hlp_GetInstanceID(AlbinoItem);
|
Hlp_GetInstanceID - ура, вот кого я искала! И методом тыка не нашла... Спасибо! Еще один вопрос: почему одна и та же функция нормально работает в Dialoge и выдает unknown identifier в Item? А ежли ее прямо в Item вписать, работает там и там? Такое ощущение, что Item живет выше по течению от B_story и не знает, что там написано... Куда ее можно вписать, чтоб Item тоже был в курсе? Или там и оставить - вроде никто не возражает? И где определяется направление течения? ;)
|
|
|
16.10.2007, 17:39
|
#1889
|
|
Re: М: Скриптинг в Готике
2okin:
И где определяется направление течения?
|
Направление течения определяется в файле Gothic.src. Если вы пользуетесь GothicSourcer'om то при добавлении нового файла скрипта(подключении существующего), он выводит готик.срц списком с предложением вставить создаваемый\подключаемый скрипт в определенную его часть. Разумеется, пользовательские функции должны предшествовать диалогам, иначе получим сообщение о неизвестном идентификаторе (вызове необъявленной ф-ции). Иногда, кстати, приходиться заново закрыть\открыть проект в соурсере, чтобы компилятор увидел-таки объявленную ф-цию.
|
|
|
17.10.2007, 10:39
|
#1890
|
|
Re: М: Скриптинг в Готике
2okin:
Народ, объясните все-таки, откуда берется инт в CreateInvItem. * В благословенном туторе написано void CreateInvItem (c_npc n0, int n1); - создает в инвентаре НПС n0 предмет с ID n1. xxx.id благополучно выдает номер неписей, но для предметов рисует ноль. Так кто такой n1???
|
Тип instance в скриптах эквивалентен, но не равен типу int. Т.к. в Даедалусе можно выполнять операции только с простыми типами, а производные типы в нем вообще отсутствуют (указатель, ссылка), то возникает сложность передачи (или присвоения) указателя на класс, а конкретнее на инстанцию (т.к. класс в чистом виде, без инициализации, в скриптах не используется). Для такой возможности разработчики сделали следующее - переопределили тип инстанции к типу int. Функции движка (системные) понимают такое переопределение и работают с ним правильно, с прикладными функциями (записанными в скриптах) всё обстоит сложнее, попробую показать это на примере. Пример: есть instance hero(C_NPC) и есть const int MyInt = 3; также есть функция func int Info(var int Info_inst). Эту функцию можно вызвать так Info(hero) или так Info(MyInt). Компиляторы, отличные от GS, пропустят оба выражения и не сообщат об ошибках, но первое выражение правильно, а второе - ошибочно. Компилятор GothicSourcer способен распознавать такие ошибки, но только с вашей помощью. В папке System есть два файла RedefinedFunc.d и RedefinedLocalVariable.d. В первый файл записываются функции скриптов (только скриптов, функции движка Готики сюда писать не надо), где запись int# обозначает инстанцию переопределенную к типу int. Например так: int Info(int#); и т.д. Во второй файл записываются имена локальных переменных функций, в которых тип instance переопределен к типу int. После выполнения этих действий вы можете создавать свои функции, аргументом (или возвращаемым значением) которых может быть инстанция, а точнее переопределенный int. И по аналогии с этим использовать локальные переменные в функциях, состоящие из инстанций. Добавление от 10/17/07, в 10:59:04 2360:
Уж не знаю как, но в случае с предметами вполен можно написать CreateInvItem(hero,ItFoBeer); (где ItFoBeer - instance ItFoBeer(C_Item)) и ошибки не будет Если есть желание можете попробовать другой, "честный" метод: var int AlbinoBeer; AlbinoBeer = Hlp_GetInstanceID(ItFoBeer); CreateInvItem(hero,AlbinoBeer);
|
Да, оба этих варианта справедливы, но только для функций движка. Поясняю, т.к. инстанция переопределенная к int, есть не что иное, как id инстанции, т.е. её порядковый номер объявления в скриптах. Это справедливо для всех инстанций скриптов, как предметов, нпс, так и других. Предпочтельно использовать первый метод, т.к. он будет работать и со всеми вашими (прикладными функциями) - см. написанное выше. Второй метод тоже можно использовать с вашими функциями, но в этом случае аргумент int должен быть "чистым", а не переопределенным, но это приведет несколько к увеличению кода скриптов, нужно всегда будет использовать функцию Hlp_GetInstanceID для получения id инстанции.
|
|
|
17.10.2007, 12:58
|
#1891
|
|
Re: М: Скриптинг в Готике
2Vam:
Второй метод тоже можно использовать с вашими функциями, но в этом случае аргумент int должен быть "чистым", а не переопределенным, но это приведет несколько к увеличению кода скриптов, нужно всегда будет использовать функцию Hlp_GetInstanceID для получения id инстанции.
|
Увы, без него иногда просто не обойтись, например Wld_RemoveNpc (); работает только с типом int. Кстати, а вот и вопрос - если в мир вставить двух одинаковых НПЦ, а потом попробовать удалить их кодом: Clone = Hlp_GetInstanceID(NON_xxx); Wld_RemoveNpc (Clone);Что произойдет? Удаляться оба нпц, ни одного или же мы получим вылет в windows?
|
|
|
17.10.2007, 16:40
|
#1892
|
|
Re: М: Скриптинг в Готике
Цитата:
Сообщение от 360 link=board=gothic&t=1105030050&start=3797200#37972 16 date=10/16/07, в 17:39:40
2okin: Направление течения определяется в файле Gothic.src. Если вы пользуетесь GothicSourcer'om то при добавлении нового файла скрипта(подключении существующего), он выводит готик.срц списком с предложением вставить создаваемый\подключаемый скрипт в определенную его часть. Разумеется, пользовательские функции должны предшествовать диалогам, иначе получим сообщение о неизвестном идентификаторе (вызове необъявленной ф-ции).
|
Получается, что файл можно вписать в src выше или ниже независимо от того, где он лежит. Значит, распределение по папкам не имеет значения, это только для удобства пользования? Или?
|
|
|
17.10.2007, 16:51
|
#1893
|
|
Re: М: Скриптинг в Готике
2okin:
Получается, что файл можно вписать в src выше или ниже независимо от того, где он лежит. Значит, распределение по папкам не имеет значения, это только для удобства пользования? Или?
|
Точно так. Компилирует GS по порядку, указанному в gothic.src. Все остальное - забота о модостроителях.
|
|
|
17.10.2007, 17:11
|
#1894
|
|
Re: М: Скриптинг в Готике
2okin:
Получается, что файл можно вписать в src выше или ниже независимо от того, где он лежит. Значит, распределение по папкам не имеет значения, это только для удобства пользования? Или?
|
Да, всё именно так, значение имеет только местоположение файла в src файле, всё остальное только для удобства. 2360:
Увы, без него иногда просто не обойтись, например Wld_RemoveNpc (); работает только с типом int. Кстати, а вот и вопрос - если в мир вставить двух одинаковых НПЦ, а потом попробовать удалить их кодом: Clone = Hlp_GetInstanceID(NON_xxx); Wld_RemoveNpc (Clone); Что произойдет? Удаляться оба нпц, ни одного или же мы получим вылет в windows?
|
Значит так: 1. Функция Hlp_GetInstanceID может выдать id только предмета или НПС, на все другие инстанции она выдаст -1. 2. Что делает функция Wld_RemoveNpc внутри себя пока не скажу, поэтому только проба может дать ответ на твой вопрос.
|
|
|
17.10.2007, 23:25
|
#1895
|
|
Re: М: Скриптинг в Готике
Умм... Нельзя ж так людей пугать!
Завесила в очередной раз игру, в общем, предполагала, что повиснет, но проверила... Вернула обратно к работавшему варианту. Новый запуск - ВИСИМ!!! Хотя ошибки уже нет! Пробовала удалять строки, закрывать-открывать программу... То же самое.
Помогло удаление файла и создание его заново, с прежним текстом.
Sourcer что, где-то еще запоминает, что было написано? Или это случайный глюк и мне очень повезло?
Наверное, все-таки случайность... Вешаю я игру регулярно и такого раньше не было...
Добавление от 10/17/07, в 23:45:54 Попыталась разобраться, как работают всякие там плиты-наковальни. Вроде что-то поняла, не знаю, насколько правильно...
Вопрос номер раз: с некоторыми предметами используется OnFunc и вводится константа MOBSI_. Парочку уже ввела... Есть ограничение на их количество? Кажется, где-то я про это уже читала, но не помню... Сколько штук их можно навставлять?
2. Превращение сырого мяса в жареное как будто нигде не нарисовано и является внутренним свойством сковороды... А красные кресты Грега вроде бы вызывают функцию B_SCGetTreasure, но опять же в спейсере ее не видно... Это что, вставлено уже в их ASC или как-их-там-еще-зовут? *Или я чего-то не нашла в скриптах-спейсере? Подскажите, пожалуйста, куда смотреть. Или как увидеть содержимое ентих asc'ов и прочих. Я их трогать не собираюсь, только посмотреть хочу...
|
|
|
18.10.2007, 23:49
|
#1896
|
|
Re: М: Скриптинг в Готике
Не могу найти, где описаны заклинания превращения.
С заклинаниями телепорта вроде понятно: Spell_Logic_Teleport, потом в Spell_Cast_Teleport сам AI_Teleport и анимация.
А с превращением все заканчивается на Spell_Logic_TrfDragonSnapper: Npc_SetActiveSpellInfo(self,DragonSnapper); return SPL_SENDCAST; - Где искать продолжение? Само описание превращения?
Хочу срисовать оттуда превращение в снеппера. Если просто написать Mdl_SetVisual(self,"DragonSnapper.mds"); Mdl_SetVisualBody(self,"Razor_Demon_Body",DEFAULT, DEFAULT,"" ,DEFAULT,DEFAULT,-1); то получается бегающий гребешок... Хотя со скелетом все прокатывает, человекообразное все-таки...
ps Понимаю, что вопросы через раз получаются глупые или некорректно сформулированные. Прошу прощения, но я только начинаю разбираться с тем, что все уже выяснили два года назад - в начале этой темы...
Добавление от 10/18/07, в 23:52:53 Кстати, из диалога использовать заклинания нельзя? Только напрямую кастовать?
|
|
|
19.10.2007, 01:36
|
#1897
|
|
|
|
|
A.G.F.C.
Регистрация: 04.09.2006
Сообщений: 20
|
|
|
|
|
|
Re: М: Скриптинг в Готике
2okin:
А с превращением все заканчивается на Spell_Logic_TrfDragonSnapper: Npc_SetActiveSpellInfo(self,DragonSnapper); return SPL_SENDCAST; - Где искать продолжение? Само описание превращения?
|
- потерянное продолжение в движке игры. Попробуй использовать удаление и в ставку в мир нового непеся, при перевоплощении если это не Гг,
(хотя и с ним тоже можно попробывать)
|
.
Кстати, из диалога использовать заклинания нельзя? Только напрямую кастовать?
|
- нет нельзя.
|
|
|
19.10.2007, 13:56
|
#1898
|
|
Re: М: Скриптинг в Готике
Цитата:
Сообщение от MaGoth link=board=gothic&t=1105030050&start=3802350#38023 60 date=10/19/07, в 01:36:47
2okin:
|
- потерянное продолжение в движке игры. Попробуй использовать удаление и в ставку в мир нового непеся, при перевоплощении если это не Гг, (хотя и с ним тоже можно попробывать).
|
С другим неписем представляю, а как такое можно с ГГ провернуть, из скриптов? :o Заставила другого непися кастануть после диалога превращение в снеппера. Результат порадовал. Появился снеппер, но от первого лица, т. е. он - ГГ и управляется клавишами. А рядом в растерянности стоял прежний ГГ с надписью "Я". *;D ;D ;D А после обратного превращения снеппер благополучно перекинулся в кастовавшего НПС, пришлось пользоваться марвином и устраивать переселение душ... То есть, превращенный может быть только ГГ и не важно, что он уже есть, вставляется новый. А при обратном превращении все-таки проверяется, кем он был... Хм, оч наглядно получилось, осталось только понять, можно ли это использовать... ГГ-то из диалога кастовать не заставишь, по крайней мере так, как я для нпс сделала... И превратить другого низя... Н-да, получилось то самое удаление-вставка (вернее, вставка-удаление) в исполнении движка. Радикально. Даже слишком. ??? Можно устроить переселение душ без марвина? Где определяется, что "вот это - ГГ"? Подменить бы в последний момент кастующего... ::)
|
|
|
19.10.2007, 16:46
|
#1899
|
|
Re: М: Скриптинг в Готике
2okin:
??? Можно устроить переселение душ без марвина? Где определяется, что "вот это - ГГ"?
|
Инстанция hero и есть ГГ.
|
|
|
19.10.2007, 20:08
|
#1900
|
|
Re: М: Скриптинг в Готике
2Vam: Инстанция hero и есть ГГ.
|
Ну да, вроде все было понятно, hero - он и в Африке hero... Но меня эта ситуация с превращением озадачила. Когда ГГ в виде снеппера клавишами управляется, кто рядом стоит? "Я" же остается ГГ, он как был прописан, таким и остался. А управление потерял. И как зовут снеппера - он тоже pc_hero с другой внешностью? Хотя если из него выселиться, он вполне дикий... А если вставить непися и попросить его атаковать hero, на кого он все-таки нападет? Приду с работы проверю... Или ему сплохеет от такого издевательства? Тем более проверю! ;D Или если удалить "Я"... Вылетит сразу или при обратном превращении? Как получилось два ГГ и по какому принципу выбрался управляемый? Что происходит, когда в марвине нажимается "О"? Именно про эту штуку я и спрашивала, что определяет ГГ, управляемое состояние? С заклом превращения не в тех руках - это, конечно, непредусмотренное безобразие... Но, может, можно это использовать? Очень хочется превратить ГГ в зверя, но в определенный момент, не давать ему в руки свиток... М-дя, опять сумбур, но точно сформулированный вопрос наполовину является ответом, а это мне пока не светит... Спрашивать, где нарисована невозможность сохранения игры в виде монстра и обратное превращение enter'ом, конечно, бесполезно? *::) И до сохраненных характеристик НПС, в которого предстоит обратно перекидываться, тоже не достать?
|
|
|
19.10.2007, 20:18
|
#1901
|
|
Re: М: Скриптинг в Готике
2okin:
Спрашивать, где нарисована невозможность сохранения игры в виде монстра и обратное превращение enter'ом, конечно, бесполезно?
|
Все там же - в недрах движка Готики :)
И до сохраненных характеристик НПС, в которого предстоит обратно перекидываться, тоже не достать?
|
Вообще харакеристики можно достать обращаясь к массиву hero.attribute[], если hero в этот момент, конечно, снеппером не становится ;)
Очень хочется превратить ГГ в зверя, но в определенный момент, не давать ему в руки свиток...
|
Не совсем понял, что вы тут сделать хотите? :) В определенный момент не давать свитком воспользоваться? Я могу, конечно ошибаться, я с таким не сталкивался, но можно попробовать перехватить действие свитка до того, как он передаст ф-ции создания движку. Поставить доп. условие в виде некой функции в самом скрипте кастования. При определенных услвоиях ф-ция возвращает 1, т.е. true в прочих - false, соответственно в зависимости от этого заклинание либо кастуется, либо нет.
|
|
|
19.10.2007, 22:26
|
#1902
|
|
Re: М: Скриптинг в Готике
360:
Вообще харакеристики можно достать обращаясь к массиву hero.attribute[], если hero в этот момент, конечно, снеппером не становится *;)
|
Да не те характеристики... Получилось, что закл превращения просто вставляет в мир снеппера, независимо от того, кто кастовал. А вот обратное превращение - точное, то есть где-то сохраняются характеристики кастующего. Вот они мне и нужны. Вернее, не они, а возможность вставить туда ГГ. Чтоб снеппер обратно превратился в ГГ, а не в мага. Поудалять лишних свидетелей - и получится нужный результат... Но подозреваю, что ответ будет такой же: :(
Все там же - в недрах движка Готики :)
|
Не совсем понял, что вы тут сделать хотите?
|
Скорее всего, изобретаю очередной велосипед. ;) Хочу сделать превращение ГГ в зверя из диалога. Злой дяденька маг говорит: "Чичас я тебя..." и превращает ГГ в снеппера. - Через SetVisual не получилось, одни рога видны. - Заклинания в движке, сделать аналогично не получается. - Заставить ГГ кастануть из диалога низя. А пока я пыталась разобраться, как оно устроено, получился смешной вариант с магом... Теперь буду с ним развлекаться ;D. Наверное, есть какой-нибудь очень простой способ превратить ГГ, который я буду очень долго искать?.. ::) Кстати, есть же всякие проверочные варианты ГГ, типа рокфеллера и т.д. Как они вставляются в игру?
|
|
|
21.10.2007, 23:01
|
#1904
|
|
|
|
|
A.G.F.C.
Регистрация: 04.09.2006
Сообщений: 20
|
|
|
|
|
|
Re: М: Скриптинг в Готике
2okin:
Нормальный он. :) Теперь тебе останется написать функцию перебора всего инвентаря, чтобы добавлять новому Гг в инвентарь предметы, думаю для этого лучше использовать массивы для проверок того что есть в инвентаре у Гг, и после превращения обратно в чела, добавлять ему то что было в инвентаре до превращения.
Получится километровый скрипт проверки, который для активации нуна будет частичто использовать в превращении в зверя, это чтобы понять что есть у Гг и вторая часть, при обратном, чтобы дать Гг то что было. :) Тоже для статов но там мона переменными обойтись, массив не нужен. ;)
|
|
|
23.10.2007, 11:01
|
#1906
|
|
Re: М: Скриптинг в Готике
2okin:
Народ, подскажите, плз, как с массивами обращаться.
|
Сначала скажи, что ты хочешь с ними (массивами) сделать ::) А обращаются с ними обычно по правилам скриптов - можно взять элемент массива, можно положить элемент в массив. Ограничения - индекс элемента должен быть константой, а не переменной, max размер массива - 255 элементов.
|
|
|
23.10.2007, 11:55
|
#1907
|
|
Re: М: Скриптинг в Готике
Vam:
Сначала скажи, что ты хочешь с ними (массивами) сделать ::)
|
Чтоб понять, что я с ними хочу сделать, мне надо сначала понять, что с ними вообще МОЖНО делать. И как. А дальше я как-нить сообразю. Пытаюсь понять премудрый совет Магота ;). Копирую инвентарь. Сделала кусочек на пробу с переменными. Работает, но это длинное уродство...
А обращаются с ними обычно по правилам скриптов - можно взять элемент массива, можно положить элемент в массив. Ограничения - индекс элемента должен быть константой, а не переменной, max размер массива - 255 элементов.
|
А как это - взять, положить? Где-нибудь пример можно найти? Чтоб понять, с чем это едят? Это как - одна переменная хором на много значений или как?
|
|
|
24.10.2007, 15:34
|
#1908
|
|
Re: М: Скриптинг в Готике
2okin:
А как это - взять, положить? Где-нибудь пример можно найти? Чтоб понять, с чем это едят? Это как - одна переменная хором на много значений или как?
|
Это очень просто, всё как и с переменными. пример: массив из класса C_NPC - int aivar[100]; можем взять значение из массива: ааа = aivar[3];, где - ааа объявлен ранее как var int aaa; или const int aaa; 3 - индекс переменной в массиве или ааа != aivar[3], или ааа == aivar[3], и т.д. любая операция сравнения тоже берет значение из массива и сравнивает с чем-либо. можем положить значение в массив: aivar[3] = ааа; вместо индекса 3, может быть запись ввв, где - ввв объявлен ранее как const int ввв; в качестве индекса var int ввв; использовать нельзя.
|
|
|
24.10.2007, 16:30
|
#1909
|
|
Re: М: Скриптинг в Готике
2Vam:
вместо индекса 3, может быть запись ввв, где - ввв объявлен ранее как const int ввв; в качестве индекса var int ввв; использовать нельзя
|
Кстати да, очень важное замечание - я так уже накололся, пытаясь сократить количество кода и был неприятно удивлен такой особенности даедалуса. Весьма странно, когда наряду с некоторыми удобными вещами натыкаешься на такие подводные камни.
|
|
|
25.10.2007, 13:13
|
#1911
|
|
Re: М: Скриптинг в Готике
Может кто сталкивался с такой проблемой, и/или может что-то посоветовать: В движке Готики есть возможность диалога 2-х персонажей, один из которых ГГ. Понадобилось мне ввести в диалог 3-го персонажа. Сделал это достаточно просто. Он говорил, обращаясь к other, пришлось еще его заставить AI_WaitTillEnd, ну и AI_TurnToNPC. Немного пошлифовал синхронизацию и добился желаемого эффекта. В диалоге участвовало трое. Дальше - больше. Понадобился диалог, где участвуют четверо. Причем ГГ - как сторонний наблюдатель. И вот один из собеседников (из тех, что не self и не other) вываливается из диалога. Т. е. вдруг продолжает свое расписание и не хочет говорить диалоговые фразы. Например, если у него в расписании SmallTalk, то говорит эти фразы вместо диалоговых. Может уйти раньше завершения диалога на свою wp. Или, если у него в расписаннии GuidePC, повернул голову к ГГ, несмотря на AI_TurnToNPC. Может кто-нибудь, что-нибудь посоветует как избавиться от этих эффектов? PS: Пришла идея, а что, если бы other сделать не ГГ, а другого персонажа. Может кто что-то похожее делал? Добавление от 10/25/07, в 13:32:41
Цитата:
Сообщение от okin link=board=gothic&t=1105030050&start=3815250#38152 71 date=10/25/07, в 13:11:44
Vam: 360:
|
Спасибо. Буду играться... :)
|
ВОПРОС: Везде пишут, что при изменении скриптов надо начинать игру заново,а то неписи новые не вставляются и изменений не будет... Но некоторые изменения все-таки видны, иногда срабатывают свеженаписанные функции, которых точно в сейвах не было. Но вроде тоже не все... ::)
|
Почему так получается и, соответственно, когда нужно начинать новую игру, а когда не обязательно? Я уже Ксара в начале игры видеть не могу, хоть и закомментировала диалоги... И ждать долго...
|
Насколько я понимаю, когда добавляется новый объект (диалог, персонаж, предмет и т.п., т. е. instance), тогда надо начинать заново, чтобы при инициализации эти объекты были сосзданы. Если же добавляются функции, то это уже процедурные изменения, объекты не добавляются, инициализировать нет необходимости. Исходя из этого я поступаю следующим образом. Задумывая сюжетную линию, прогнозирую сколько будет добавлено диалогов и у каких персонажей (чтобы они получали более-менее адекватные идентификаторы, иначе легко будет запутаться). Условия к ним возвращают 0. Также поступаю и с персонажами. И потом только наполняю эти объекты содержанием. Поэтому переигрывать при создании сюжетной линии не приходится.
|
|
|
25.10.2007, 14:03
|
#1912
|
|
Re: М: Скриптинг в Готике
2okin:
2. Как можно убрать ролик в самом начале? Мешает...
|
Найдите в startup.d строчки вида PlayVideo(xxx); и закомментируйте ;) 2kraw: Скорее всего, существут некое ограничение по времени, в течение которого НПЦ ждет реакцию а после возвращается к расписанию. ВОзможно также, что из-за отсутвия озвучки диалогов это происходит раньше, чем хотелось бы. А что если попробовать дать НПЦ чужие озвученные фразы и понаблюдать за реакцией?
|
|
|
26.10.2007, 11:36
|
#1913
|
|
Re: М: Скриптинг в Готике
Цитата:
Сообщение от 360 link=board=gothic&t=1105030050&start=3815350#38153 72 date=10/25/07, в 14:03:42
2kraw: Скорее всего, существут некое ограничение по времени, в течение которого НПЦ ждет реакцию а после возвращается к расписанию. ВОзможно также, что из-за отсутвия озвучки диалогов это происходит раньше, чем хотелось бы. А что если попробовать дать НПЦ чужие озвученные фразы и понаблюдать за реакцией?
|
Попробую. Только вот сюжетно не очень хорошо получается... Впрочем, тут можно сманеврировать. Добавление от 10/26/07, в 11:56:20
Кажется проблему решил. Во многом дело было в использовании модифицированной функции состояния SmallTalk, которая перехватывала управление "лишними" участниками диалогов. Заменил на Stay и большая часть проблемы решилась. Ну и еще пришлось пошаманить. Например, если делать AI_GotNPC для other, то начинают в диалоге лезть глюки. А если не делать, то, вроде бы, все нормально. Ну и не давал персонажам долго бездействовать во время диалога.
|
|
|
30.10.2007, 15:28
|
#1915
|
|
Re: М: Скриптинг в Готике
2Владай: Со стороны скрипта все просто - создается некая функция, ну например func void trigger_insert() { Wld_InsertNpc ([инстанция_нпс], "[вейпоинт]"); }; где [инстанция_нпс] - вставляемый НПЦ, а [вейпоинт] - имя вейпоинта на который вставляется НПЦ.
Соответсвенно, чтобы вставка произошла, функцию необходимо вызвать. А раз речь идет о триггерах, ф-цию будем вызывать при срабатывании триггера. Для создания триггера как раз и необходим спейсер.
Необходимый нам триггер принадлежит к классу zCTrigger и зовется oCTriggerScript. Соответсвенно: 1. Выбираем панель "objects", вкладку "create" и из списоков - zCTriggerBase -> zCTrigger -> oCTriggerScript. 2. Переходим в основное окно, жмем ПКМ и выбираем пункт Insert [oCTriggerScript.] 3. Задаем триггеру размеры с помощью вкладки "Modify" и кнопки "Edit the Bbox" 4. Задаем триггеру условия срабатывания reactToOnTouch:TRUE, respondToPC:TRUE, respondToNPC:FALSE, startEnabled:TRUE *(подробнее тут -> http://mod.worldofgothic.ru/3s_zen/48/spacer-basilio58) 5. В параметр scriptFunc вписываем имя нашей ф-ции - trigger_insert. Остается собрать ZEN-файл и откомпилировать gothic.dat. По-моему - так :)
|
|
|
03.11.2007, 19:24
|
#1917
|
|
Re: М: Скриптинг в Готике
Не могу понять, как в игре считается время. ::)
Мне нужно отловить КОНЕЦ действия Mdl_ApplyOverlayMDSTimed (c_npc self, string overlayname, int timeTicks);
- Пробовала использовать Npc_HasBodyFlag или Npc_GetBodyState. Они срабатывает в первый момент, но кончает действовать гораздо раньше, чем проходит timeTicks. Не знаю почему, но получается так...
- Пробовала в цикле zs_loop использовать Npc_GetStateTime. Для наглядности попросила его печатать значение. Оно все время равно 0, то есть в ней время не идет, хотя вроде должно... Или я неправильно использую функцию - время какого состояния она отсчитывает?
- Вставила в zs_loop переменную, прибавляя по единице в каждом цикле. Тоже распечатала значения и эмпирически подобрала то, которое соответствует timeTicks. *Ура, все работает! А потом вдруг задумалась - скорость счета в цикле связана с внутренним временем игры? Она не будет зависеть, например, от компа? Что это за единица времени - один цикл??? :o
В общем, объясните, если можно, в чем считаются время в игре и чему соответствуют циклы? И как связано время, проставленное в разных функциях?
|
|
|
06.11.2007, 12:57
|
#1918
|
|
Re: М: Скриптинг в Готике
2okin:
- Вставила в zs_loop переменную, прибавляя по единице в каждом цикле. Тоже распечатала значения и эмпирически подобрала то, которое соответствует timeTicks. Ура, все работает!
|
Это единственное правильное решение получения времени работы какого-либо состояния.
А потом вдруг задумалась - скорость счета в цикле связана с внутренним временем игры? Она не будет зависеть, например, от компа? Что это за единица времени - один цикл???
В общем, объясните, если можно, в чем считаются время в игре и чему соответствуют циклы? И как связано время, проставленное в разных функциях?
|
Любая функция цикла вызывается движком 1 раз в секунду, следовательно, счетчик реализованный в функции будет показывать кол-во секунд в данном состоянии.
|
|
|
06.11.2007, 19:50
|
#1919
|
|
Re: М: Скриптинг в Готике
2Vam:
Любая функция цикла вызывается движком 1 раз в секунду, следовательно, счетчик реализованный в функции будет показывать кол-во секунд в данном состоянии.
|
Секунд игровых? Для реальных они чересчур короткие. А в чем тогда проставлено timeTicks в Mdl_ApplyOverlayMDSTimed ? Соотношение с насчитавшимися "секундами" совершенно кривое...
|
|
|
11.11.2007, 19:54
|
#1920
|
|
Re: М: Скриптинг в Готике
2Vam:
Любая функция цикла вызывается движком 1 раз в секунду
|
А помоему время цикла зацикленной функции зависит от конкретного восприятия и может варьироваться функцией Npc_SetPercTime(self, 0.1); В данном случае 1/10 секунды. А вот реальное время в секундах, в котором находится НПЦ, в текущей зацикленной функции по идее считывается через: int Npc_GetStateTime (c_npc self); - возвращает кол-во секунд, которые НПС self находится в текущем состоянии, заданном в " Loop " цикле. Также есть еще одна интересная функция: void Npc_SetStateTime (c_npc self, int seconds); - установить кол-во секунд seconds, как долго НПС self может находится в этом состоянии.
|
|
|
Здесь присутствуют: 3 (пользователей: 0 , гостей: 3)
|
|
Ваши права в разделе
|
|
|
|
Текущее время: 03:38. Часовой пояс GMT +4.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|