• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

Вопросы по скриптингу

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
  • Первое сообщение
  • #1
Прежде чем задавать вопросы, ознакомьтесь с документацией..
1) Читать онлайн
2) Архив с офлайн-версией(chm) во вложении
 

Вложения

  • Vam_tutor.rar
    171,6 KB · Просмотры: 573
Последнее редактирование модератором:

Вариматас

Забанен
Регистрация
11 Апр 2011
Сообщения
175
Благодарности
1
Баллы
165
Хз, что тогда, тупо скопипасть Spell_Logic_TeleportIsland в AI\Magic\Spell_ProcessMana.d
Ибо сорсер/игра может "неправильно" понять большие буквы(
 

Мільтен

Участник форума
Регистрация
27 Июн 2008
Сообщения
862
Благодарности
427
Баллы
265

Скрипты оттестированы, у меня работают и у тех, кто прошел урок, тоже. Если не выходит, значит сделал что-то не так. Советую внимательно еще раз пройти урок. С первого раза у многих не выходит.
 

Мільтен

Участник форума
Регистрация
27 Июн 2008
Сообщения
862
Благодарности
427
Баллы
265
Открыв меши из оригинала, увидел такие вот синие полигоны(смотреть вложение).
Кажется, они используются для снижения напряжения... вот только в чем это снижение проявляется? Более стабильное число fps?
И как грамотно создавать эти... кхм... синие полигоны?
Какой текстурой покрывать?
 

Вложения

  • Hz.jpg
    Hz.jpg
    317,3 KB · Просмотры: 353

Сизый Пень

Участник форума
Регистрация
21 Июл 2011
Сообщения
2
Благодарности
0
Баллы
145
Добрый день!
Вопрос таков: как можно изменить в г2 безлимитный инвентарь на ограниченный?
 

Мільтен

Участник форума
Регистрация
27 Июн 2008
Сообщения
862
Благодарности
427
Баллы
265
Добрый день!
Вопрос таков: как можно изменить в г2 безлимитный инвентарь на ограниченный?

Перед этим рекомендую ознакомится с уроками по скриптингу и сделать что-то попроще.

Если не ошибаюсь, то лимитованый инвентарь реализован в моде "Сестры".

P.S ник улыбнул:D
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Мільтен,
Открыв меши из оригинала, увидел такие вот синие полигоны(смотреть вложение). Кажется, они используются для снижения напряжения... вот только в чем это снижение проявляется? Более стабильное число fps?
Верно, это для снятия напряжения на территории. Сами синие полигоны называются ghostoccluder'ы, это еще одна разновидность портала служащая для отражения света, таким образом, чтоб все, что находится за ним, при виде камеры в его сторону не прорисовывалось, что снимает нагрузку с железа. Дабы не нагружать процессор территория и разбивается подобными отражателями(в гейм-деве, их иногда называют - зеркалами).


И как грамотно создавать эти... кхм... синие полигоны?
Какой текстурой покрывать?
Есть 4 вида подобного рода порталов:
p: (это стандартный портал мира типа - оутдур, локация острова/города Хоринис);
pi: (это стандартный портал мира типа - индур, любая загружаемая в игре локация-шахта);
pn: (тоже самое что и портал p:, только на него текстура ложится с альфа каналом, так как он долго исчезает, это замедленный тип портала);
ghostoccluder
Для ghostoccluder'а используется простой материал, надо только дать название текстуре ghostoccluder и все.
Что касается порталов в целом, так там используется обычный двухсторонний полигон с велдиными вершинами.

Так же, есть еще и блокиратор света sun_block, - это что-то типа искусственного отделения внутреннего помещения без загрузки. В игре, его можно посмотреть вокруг храма Аданоса.

Вроде бы и все, что касается порталов и их типов, используемых в Готике... *flowers*
 

George_M

Участник форума
Регистрация
17 Дек 2010
Сообщения
692
Благодарности
18
Баллы
255
Засел переделывать функции из скриптового пакета Икарус под требования готиксорсера и наткнулся на проблему. Готика рассматривает любой instance как int, точнее имя instance является константой int, что легко увидеть по любой внешней функции, например Hlp_GetNpc (VAR INT instanceName) или Npc_GetInvItem (VAR C_NPC self, VAR INT itemInstance). А вот в сорсере почему-то это убито на корню. В стандартных функциях он имена инстанций использует нормально, а вот в любом другом случае - нет. Пережить простое ограничение функциональности можно - выкрутится не сложно, но когда дело доходит до работы с памятью, начинаются проблемы. Дело в том, что значение int имени instance определяет адрес информации в памяти. Не могли бы посоветовать метод обойти придирчивость сорсера к типам или способ получения значения int, соответствующего имени instance? Уж очень не хочется компилить скрипты чем-то другим...
 

Vam

Почетный форумчанин
Регистрация
8 Июл 2008
Сообщения
255
Благодарности
1
Баллы
180
Не могли бы посоветовать метод обойти придирчивость сорсера к типам или способ получения значения int, соответствующего имени instance? Уж очень не хочется компилить скрипты чем-то другим...
Нужно записывать переопределенные аргументы фукций в файл RedefinedFunc.dsc, а переопределенные переменные в файл RedefinedLocalVariable.dsc и всё будет тип-топ...:)
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Нужно записывать переопределенные аргументы фукций в файл RedefinedFunc.dsc, а переопределенные переменные в файл RedefinedLocalVariable.dsc и всё будет тип-топ...:)

Или, прочтите наконец Ридми по работе с Сурсером... :D
 

George_M

Участник форума
Регистрация
17 Дек 2010
Сообщения
692
Благодарности
18
Баллы
255
То что совет Vam-a работает, я проверил, но вот найти упоминания про это еще где-то я не смог.
MaGoth, а поделись, плиз, Ридми, где про это написано;)
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
Не могли бы посоветовать метод обойти придирчивость сорсера к типам или способ получения значения int, соответствующего имени instance?
Как получить int из instance?
Из личного опыта могу предложить такой вариант:

Код:
[COLOR="DarkOrange"][B]var int[/B][/COLOR] ItmID;
Npc_GetInvItem([COLOR="DarkOrange"][B]self[/B][/COLOR],ItWr_Diary0);[COLOR="DarkGreen"]//создаём глобальную ссылку на вещь[/COLOR]
ItmID = Hlp_GetInstanceID([COLOR="DarkOrange"][B]item[/B][/COLOR]);[COLOR="DarkGreen"]//получаем нужный ID и записываем в переменную[/COLOR]
[COLOR="DarkGreen"]//Где ItWr_Diary0 - нужная нам инстанция[/COLOR]
 

George_M

Участник форума
Регистрация
17 Дек 2010
Сообщения
692
Благодарности
18
Баллы
255
Jr13San, такой метод не пройдет: ID предмета это совершенно другая величина.
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
Jr13San, такой метод не пройдет: ID предмета это совершенно другая величина.

А.. вон ты про что...
А так что не устраивает?:

Код:
var int itemId;
itemId = ItFo_Apple.id;
Я точно не проверял, т.к. в этом не было необходимости...

Скорей всего нужно сначала присвоить id предмету внутри самой структуры инстанции, а потом уже обращаться к этому свойству...
 

George_M

Участник форума
Регистрация
17 Дек 2010
Сообщения
692
Благодарности
18
Баллы
255
Jr13San, тут только совет Vam-a даст правильное решение. Я сам в этом не ахти разбираюсь, но попробую объяснить. id которое можно получить стандартными методами просто одна из характеристик объекта и, например, NPC и яблоко могут иметь одинаковый id - просто первый условно говоря номер 1 среди всех объектов класса oCNpc, а второе опять таки номер один среди всех объектов класса oCItem. Двиг игры же присваивает каждому instance отдельный номер и далее воспринимает название из скриптов как имя константы типа int для того, чтобы знать, где лежит информация об объекте. Если точнее, в 4 байтах по адресу currSymbolTableAddress + 4 * inst (inst - наша константа-имя объекта) хранится относительный сдвиг адреса, где начинается запись информации об инстанции (простое id, например лежит в 256 байтах от этого начала).
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
Я не очень догоняю тему:-\
Просто если надо тот идентификатор для определённого объекта, то лучше пользоваться теми функциями, что были написаны выше. В остальном думаю не стоит дальше продолжать.
Разобрался и разобрался, мне если честно не интересна эта "калобродия" в адресах памяти
через скрипты:)

В каком смысле и зачем проверить "остальные свойства" (конечно если речь не идет об изменении этих свойст)? И кто не знает, что это за "объект"? Двиг игры? Так он все знает, иначе бы просто не смог читать информацию об объекте не зная его структуры;) Мы тоже вроде как из скриптов знаем, что это за объект.
Я даже не знаю что тебе ответить по причине не понимания проблемы.
Тут и не item.id и не instanseID. Я хз. Думаю, что самое главное различие между объектами - это instanseID, который присваивается при инициализации или загрузке этого объекта в память..
Нужен конкретный пример или конкретная задача, а так я дальше в лес ухожу...
 

George_M

Участник форума
Регистрация
17 Дек 2010
Сообщения
692
Благодарности
18
Баллы
255
Jr13San,теперь я не догоняю. В каком смысле и зачем проверить "остальные свойства" (конечно если речь не идет об изменении этих свойст)? И кто не знает, что это за "объект"? Двиг игры? Так он все знает, иначе бы просто не смог читать информацию об объекте не зная его структуры;) Мы тоже вроде как из скриптов знаем, что это за объект.
 

Vam

Почетный форумчанин
Регистрация
8 Июл 2008
Сообщения
255
Благодарности
1
Баллы
180
То что совет Vam-a работает, я проверил, но вот найти упоминания про это еще где-то я не смог.
MaGoth, а поделись, плиз, Ридми, где про это написано;)
Вот где-то и когда-то я про это писал так:
Пример:
Строка int# b_doupgrade.itemInstance; говорит компилятору что в функции b_doupgrade локальная переменная itemInstance имеет переопределенный тип (int -> instance).
Другой вопрос - для чего это нужно?
Разработчики языка скриптов упростили некоторые типы переменных: есть основные переменные (int, float, string, func, class, instance и т.д.), но нет производных переменных - указателей и ссылок (формат записи: тип* - указатель, тип& - ссылка), которые представляют из себя адреса места в памяти, где расположена переменная.
Попробую пояснить: например, функция
C_ITEM Npc_GetEquippedArmor(C_NPC n0); возвращает не сам класс C_ITEM, а только адрес класса, в нормальном языке программирования это должно бы выглядеть так C_ITEM* (указатель) или C_ITEM& (ссылка), тоже относится и к аргументу с типом C_NPC.
В связи с такими упрощениями в скриптах невозможно создать функцию возвращающую производный тип. Это могут делать только встроенные функции экзешника, но жить-то надо - и было принято упрощение использовать вместо производных типов (адресов объектов) простой тип INT. К типу INT переопределяется только тип INSTANCE.
Поясню:
Например, функция void Npc_RemoveInvItem(c_npc owner,int itemInstance);, второй аргумент функции имеет тип int, но это не простой тип, а переопределенный, при вызове функции здесь записывается имя конкретной инстанции (например, ItFo_Apple - яблоко будет удалено из инвентаря). Но так как проверки на типы раньше не было, можно было бы записать в качестве второго аргумента любое число, например 10345, - всё бы скомпилировалось, но в игре из инвентаря был бы удален предмет, имеющий номер инстанции 10345, а что это - сказать трудно (в процессе компиляции первая инстанция получает номер 1, вторая - 2 и т.д.).
Дальше - чтобы проверить правильность присвоения таких переопределенных типов необходимо их отделить от типа int, вот это и выполняется в файлах RedefinedFunc.d - переопределенные параметры (помечены #) функций и RedefinedLocalVariable.d - переопределенные локальные переменные.
Далее - Декомпиляция: встретив число, например, 10345 типа int декомпилятор должен распознать, что это действительно int или номер (ссылка) инстанции, если правильного распознавания не будет, то к чему это приведет - смотри выше, правда, если скрипты не править, а только декомпилировать, а потом компилировать, то ошибки не будет, её не будет и в том случае, если новую инстанцию добавить в конец списка; а если в середину, то все номера инстанций будут смещены, в итоге вместо яблока получишь что-то другое.
Эти же два файла нужны и для правильного распознавания переопределенных типов при декомпиляции. В них записаны функции и переменные оригинальных скриптов (какие встретил), если же в модах Готик встречаются новые функции с переопределенными параметрами, то их необходимо зарегистрировать в этих файлах для избежания возможных ошибок.

PS: Нашел ссылку на оригинал - это было в далеком 2006 году...
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
То что совет Vam-a работает, я проверил, но вот найти упоминания про это еще где-то я не смог.
MaGoth, а поделись, плиз, Ридми, где про это написано;)
В каталоге сурсера:
..\GothicSourcer V3.14
Есть файл: readme_ru.txt, его содержимое:

GothicSourcer V3.14
--------------------

Документация к программе:
-------------------------
Manual_xx.doc - руководство пользователя
Errors_xx.doc - руководство по ошибкам скриптов
History_xx.doc - история создания программы

До использования программы рекомендуется прочитать Manual_xx.doc

vam@telsi.net
То, где об этом упоминается выделил жирным.
Конкретно, в этом файле: history_ru.doc
Version 2.0 (18.03.2005) /* сделано все для Готики 1,2 и их модов */
- введена проверка компилятором всевозможных синтаксических и лексических ошибок в скриптах.
Существует 3 уровня сообщений компилятора:
1. Критическая ошибка (дальнейшая работа без исправления невозможна), приводит к останову компилятора (только этот тип ошибки обрабатывался ранее).
2. Простая ошибка, при обнаружении компилятор выдает сообщение и продолжает работу далее, но линковщик не запустится до устранения всех ошибок. Если число ошибок более 25 компилятор прекратит работу.
3. Внимание - на работу компилятора не влияет, выдается только первые 50 вниманий, остальные блокируются. В некоторых случаях внимание на работе скриптов не отразится, а в некоторых может привести к потенциальной ошибке, поэтому (для особо терпеливых) рекомендуется все внимания устранить.
- переделан алгоритм обработки переопределенных типов при декомпиляции и введена проверка при компиляции, появились два файла:
RedefinedFunc.d - перечень переопределенных аргументов и возвращаемых значений внешних функций,
RedefinedLocalVariable.d - перечень переопределенных локальных переменных функций.
Эти файлы могут дополняться.


Единственное, полное описание по переопределенным аргументам и переменным и вопросов связанных с ними, Vam давал давно, еще на форумах Аг.ру. Но прочитав это ты мог бы логически все связать и домыслить, коли полез в дебри Икаруса с переносом функций.

Впрочем, Vam сам уже расписал все. *flowers*
 

George_M

Участник форума
Регистрация
17 Дек 2010
Сообщения
692
Благодарности
18
Баллы
255
У меня опять появился вопрос по переопределенным типам переменных и функций.
Следующая проблема: добавляю в скрипты класс двига oCSpell и надо передать значение переменной типа этого класса значение инстанции заклинания. Прямое присваивание переменной типа класса не работает - требует функцию, возвращающую instance. Ее создать можно, как я понимаю, только переопределив тип int - если ставить тип функции классом, то требует после return сразу ";". Получаю:
Код:
func int convert_spell (var C_Spell spl_name)
{ 
    return spl_name;
};

func int Spell_Logic_Firebolt    (var int manaInvested)
{
    PrintDebugNpc        (PD_MAGIC,    "Spell_Logic_Firebolt"    );

    if ( manaInvested >= SPL_SENDCAST_FIREBOLT    )        
        {    
            var oCSpell spell;
            spell = convert_spell(Spell_Firebolt);
            spell.DamagePerLevel=10;
            return SPL_SENDCAST;        
        };
    
    return SPL_RECEIVEINVEST;
};
В файл RedefinedFunc.dsc добавляю int# convert_spell(instance);
Тип функции вроде переопределяется - позволяется возвращать значение типа C_Spell, но в строке spell = convert_spell(Spell_Firebolt); выдает ошибку "В функции отсутствует return - instance", а вот если попробовать присвоить значение функции convert_spell переменной типа int, то ошибку не находит т.е. вроде как тип не переопределился...
Не подскажете, что я нахомутал и как это можно исправить?
 
Сверху Снизу