М: Уроки скриптологии
Начинаем новую тему [glow=red,2,300]Уроки скриптологии[/glow]<br>Цель - изучение скриптов Готик.<br>Предлагается следующий вариант работы. Я выкладываю "некую информацию" по скриптам, проходит обсуждение, затем новая порция информации. Уроки, можно сказать, без учителя, так как я знаю не больше вашего, учиться предлагается друг у друга. Самое важное в изучении - диалог, чем больше будет вопросов и советов, тем быстрее будет и результат.<br><br>Весь рассматриваемый материал предлагаю разбить на темы: типы переменных, операторы, синтаксис скриптов, базовые функции и т.д. Названия и порядок тем будут рождаться по ходу дела.<br>На самом деле язык скриптов не очень сложный, очень похож на язык С с упрощениями, так что, кто знает С, тому не составит особого труда разобраться и в скриптах.<br><br>Тема первая: Типы переменных.<br>В скриптах используется всего несколько типов переменных:<br>VOID - "пустой" тип<br>INT - целое число<br>FLOAT - число с плавающей точкой<br>STRING - строка текста<br>CLASS - структура с внутренними типами и функциями<br>PROTOTYPE - обычно инициализация класса, но возможно и другое использование<br>INSTANCE - пока сказать нечего.<br>вот, кажется, и все типы.<br><br>Посмотрим, что у нас получится. *;) *:D
|
Re: Уроки скриптологии
2TycoooN:<br>
Цитата:
|
Re: Уроки скриптологии
По первой теме можно добавить следующее:<br>Типы переменных делятся на простые типы - INT, FLOAT, STRING и сложные (производные) типы - CLASS, PROTOTYPE, INSTANCE. Особняком стоит тип VOID, я нашел всего одно его применение - при объявлениии функции указывает, что функция не имеет возвращаемого значения.<br>К сложным типам мы еще вернемся позже.<br><br>Тема вторая: Операции над данными.<br><br>Существует несколько типов операций: арифметические, присваивания, отношения, логические, побитовые, над массивами, операции с членами классов.<br>В основном, все операции применимы только к простым типам, за исключением типа STRING.<br><br>1. Арифметические операции.<br>+ - простое сложение<br>- - простое вычитание<br>* - простое умножение<br>/ - простое деление (результат целая часть)<br>% - простое деление (результат остаток)<br>Здесь должно быть все понятно - без комментариев.<br><br>2. Операции присваивания.<br>= - простое присваивание<br>+= - сложение с приваиванием<br>-= - вычитание с присваиванием<br>*= - умножение с присваиванием<br>/= - деление с приваиванием (целая часть)<br>Здесь тоже все понятно - без комментариев.<br><br>3. Операции отношения.<br>< - истина, если меньше<br>> - истина, если больше<br><= - истина, если меньше или равно<br>>= - истина, если больше или равно<br>== - истина, если равно<br>!= - истина, если не равно<br>Здесь тоже все понятно - без комментариев.<br><br>(продолжение следует)
|
Re: Уроки скриптологии
4. Логические операции.<br>! - истина, если выражение ложно<br>две вертикальные палочки - истина, если истинно значение первого или второго операнда<br>&& - истина, если истинно значение первого и второго операнда<br>Операция ! является только префиксной операцией (пример !операнд)<br><br>5. Побитовые операции.<br>~ - инверсия операнда (префиксная операция)<br>>> - логический сдвиг вправо операнда1 на величину операнда2<br><< - логический сдвиг влево операнда1 на величину операнда2<br>вертикальная палочка - побитовая операция ИЛИ<br>& - побитовая операция И<br>^ - побитовая операция исключающее ИЛИ<br><br>6. Операции над массивами.<br>[] - получение или задание элемента массива по индексу (при инициализации массива задание его размерности)<br><br>7. Операции с членами классов.<br>. - обращение к элементу класса<br>Пример: аа.бб , где аа - имя класса, бб - имя переменной класса <br><br>8. Другие операции.<br>() - вызов функции с аргументами<br><br>Вот, пожалуй и все, что я знаю по этой теме. *:D<br><br>ЗЫ: Столкнулся с проблемой отображения в тексте вертикальных палочек (выглядит |). Может кто знает как ее решить?
|
Re: Уроки скриптологии
2Killer-XXX:<br>
Цитата:
Цитата:
|
Re: Уроки скриптологии
Тема третья: Операторы и идентификаторы типа.<br><br>1. Операторы.<br>Операторов в скриптах реализовано очень мало:<br>{ выражение(я) }; - оператор блок, после закрывающей фигурной скобки обязательна точка с запятой.<br>Блоки допускают вложения друг в друга.<br>IF (условие(я)) блок - оператор условного выполнения. Если условие истина, то выполняется блок, исли условие ложно, то блок пропускается. Возможна и другая реализация:<br>IF (условие(я)) блок ELSE блок - если условие истина, выполняется только блок IF, если условие ложь, то выполняется только блок ELSE. Возможно вложение операторов IF друг в друга.<br>RETURN - оператор выхода из функции, может возвращать значение.<br><br>2. Идентификаторы типа.<br>Существуют два идентификатора типа:<br>CONST - определяет тип константы<br>VAR - определяет тип переменной<br>Оба идентификатора типа применимы к следующим типам: INT, FLOAT, STRING, FUNC.<br>Идентификатор VAR может использоваться только внутри блока.<br><br>Конец темы.<br>
|
Re: Уроки скриптологии
Познакомившись со всеми основными элементами языка скриптов переходим к новой теме:<br><br>Тема четвертая: Грамматика скриптов.<br><br>Текст скриптов состоит из файлов с расширением .D, файлы желательно располагать по определенным темам, согласно директорий, можно создавать любое кол-во файлов и директорий с произвольными именами.<br>Процесс компиляции начинается с файла с расширением .SRC, в нем записывается порядок, в котором будут компилироваться файлы .D. Допускается вложенность файлов .SRC.<br><br>Одно общее правило: прежде чем использовать какую-либо переменную, она должна быть декларирована. Декларация переменной с определенным именем во всех скриптах должна быть одна. Декларация (объявление) может быть с инициализацией или без нее.<br>Формат .D файла прост: любая декларация должна начинаться с одного из ключевых слов: CONST, VAR, FUNC, CLASS, INSTANCE, PROTOTYPE. Идентификатор VAR, как говорилось ранее, может быть использован только в блоке.<br>Компилятор одинаково распознает как заглавные буквы, так и строчные буквы, поэтому имена Аааа и аааа, это одно и тоже.<br>Комментарии могут быть любые и в любом месте файла, они начинаются с // и до конца строки, или выделяются конструкцией /* комментарий */ и могуть включать несколько строк.<br><br>Вот, вроде и все о грамматике, можете задавать вопросы, постараюсь на все ответить. <br><br>ЗЫ: Хотелось бы получить ответ, устраивает ли материал в такой форме, может надо что-то изменить, жду предложений. *;)
|
Re: Уроки скриптологии
2Vam:<br>
Цитата:
|
Re: Уроки скриптологии
2Pa:<br>
Цитата:
|
Re: Уроки скриптологии
Новых предложений нет, значит продолжим.<br><br>Дополнение к четвертой теме:<br>Существует несколько главных файлов .SRC, их имена изменять нельзя. Это в папке Content - gothic.src и fight.src, а в папке System - camera.src, menu.src, music.src, sfx.src, visualfx.src и particlefx.src - из них компилируются соответствующие *.dat файлы.<br>Дальше будем рассматривать базовые классы и функции. Все конкретные классы и функции будут относиться только к скриптам gothic.src. Остальные скрипты пока рассматривать не будем, может потом в этом появится необходимость.<br>Небольшое замечание: В скриптах кол-во локальных переменных в блоке и размерность любого массива ограничены числом 4095.<br><br>Тема пятая: Классы.<br><br>Структура класса должна быть всем понятна, (если нет, то спрашивайте), поэтому перейдем к рассмотрению базовых классов. Их всего девять - C_NPC, C_ITEM, C_MISSION, C_SPELL, C_INFO, C_SVM, C_FOCUS, C_ITEMREACT, C_GILVALUES. Из названий большинства из них, понятно, что они описывают.<br><br>Рассмотрим класс C_NPC, который описывает параметры всех npc в игре, включая ГГ.<br><br>CLASS C_NPC <br>{<br> *VAR INT * * *id; * * * * * * * * * * * * //идентификатор, у каждого npc свой<br> * * *//absolute ID des NPCs<br> *VAR STRING * name[5]; * * * * * * * * * *//массив из 5 имен<br> * * *//Namen des NPC<br> *VAR STRING * slot; * * * * * * * * *<br> *VAR INT * * *npcType; * * * * * * * * * *//тип<br> *VAR INT * * *flags; * * * * * * * * * * *//флаги ??? * * *<br> *VAR INT * * *attribute[ATR_INDEX_MAX]; * //атрибуты (8 максимум) * * * * * *<br> *VAR INT * * *protection[PROT_INDEX_MAX]; //защита (кол-во защит зависит от видов урона)<br> *VAR INT * * *damage[DAM_INDEX_MAX] ; * * //урон <br> *VAR INT * * *damagetype; * * * * * * * * //тип урона<br> *VAR INT * * *guild,level; * * * * * * * *//гильдия и уровень<br> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *<br> *VAR FUNC * * mission[MAX_MISSIONS]; * * *//миссии (5 максимум)<br> *VAR INT * * *fight_tactic; * * * * * * * //тактика владения оружием<br> *VAR INT * * *weapon; * * * * * * * * * * //выбранное оружие<br> *VAR INT * * *voice; * * * * * * * * * * *//номер голоса<br> *VAR INT * * *voicePitch; * * * * * * * * //тон голоса<br> *VAR INT * * *bodymass; * * * * * * * * * //вес тела ??? * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *<br> *VAR FUNC * * aily_routine; * * * * * * * //какая-то ежедневная функция ???<br> * * *//Tagesablauf<br> *VAR FUNC * * start_aistate; * * * * * * *//функция начального AI состояния ???<br> * * *//Zustandsgesteuert<br> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *// ********************** * * * * * * * * * * * * * * *<br> * * *// Spawn * * * * * * * * * * * * * * * * * * * * * * * * * * *<br> * * *// ********************** * * * * * * * * * * * * * * *<br> *VAR STRING * spawnPoint; * * * * * * * * //место рождения ??? <br> * * *//Beim Tod, wo respawnen ?<br> *VAR INT * * *spawnDelay; * * * * * * * * // ???<br> * * *//Mit Delay in (Echtzeit)-Sekunden<br> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *<br> * * *// ********************** * * * * * * * * * * * * * * *<br> * * *// SENSES * * * * * * * * * * * * * * * * * * * * * * * * * * *<br> * * *// ********************** * * * * * * * * * * * * * * *<br> *VAR INT * * *senses; * * * * * * * * * * //чувствительность ???<br> * * *//Sinne<br> *VAR INT * * *senses_range; * * * * * * * //диапазон чувствительности<br> * * *//Reichweite der Sinne in cm<br> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *<br> * * *// ********************** * * * * * * * * * * * * * * *<br> * * *// Feel free to use * * * * * * * * * * * * * * * * * * * * *<br> * * *// ********************** * * * * * * * * * * * * * * *<br> *VAR INT * * *aivar[50]; * * * * * * * * *//массив AI переменных * * * * * * * * * * * * * * * * * * *<br> *VAR STRING * wp; * * * * * * * * * * * * //точка привязки<br> * * *<br> * * *// ********************** * * * * * * * * * * * * * * *<br> * * *// Experience dependant * * * * * * * * * * * * * * * * * *<br> * * *// ********************** * * * * * * * * * * * * * * *<br> *VAR INT * * *exp; * * * * * * * * * * * *//текущая экспа<br> * * *//EXerience Points<br> *VAR INT * * *exp_next; * * * * * * * * * //сколько нужно экспы до следующего уровня<br> * * *//EXerience Points needed to advance to next level<br> *VAR INT * * *lp; * * * * * * * * * * * * //кол-во очков обучения<br> * * *//Learn Points * * * * * *<br>};<br><br>Примечание: Свои комментарии я буду располагать в строке с переменной, а комментарии на немецком языке (если они есть), в следующей строке. Если я буду в чем-то ошибаться, то поправляйте, если немецкий комментарий более подробно описывает переменную, то его желательно перевести (может уже у кого-то есть переведенные или кто-нибудь сможет переводить по ходу дела). Я немецкий абсолютно не понимаю (он меня раздражает *>:(). Если про переменную ничего не сказано, значит мне пока про нее сказать нечего.<br>То, что помечается ??? требует дополнительных комментариев.<br><br>ЗЫ: Мучился, мучился, но так и не понял, как правильно форматировать текст? *::)
|
Re: Уроки скриптологии
Вашему вниманию предлагается следующий класс C_ITEM, описывающий все предметы в игре.<br><br>CLASS C_Item<br>{<br> * * //F№r alle Items<br> VAR INT * * id; * * * * * * * * * * //идентификатор предмета<br> VAR STRING *name,nameID; * * * * * *//имя, имя ID<br> VAR INT * * hp,hp_max; * * * * * * *// ???<br><br> VAR INT * * mainflag,flags; * * * * //категория предмета, ???<br> * * //Hauptflag und weitere Flags<br> VAR INT * * weight,value; * * * * * //вес, ???<br><br> * * //F№r Waffen<br> VAR INT * * damageType; * * * * * * //тип урона<br> * * //Welche Schadensarten<br> VAR INT * * damageTotal; * * * * * *//суммарный урон<br> VAR INT * * damage[DAM_INDEX_MAX]; *//урон по типам<br><br> * * //F№r R№stungen<br> VAR INT * * wear; * * * * * * * * * //на какое место одевать<br> VAR INT * * protection[PROT_INDEX_MAX]; //защита по типам<br><br> * * //F№r Nahrung<br> VAR INT * * nutrition; * * * * * * *// ???<br> * * //HP-Steigerung bei Nahrung<br><br> * * //BenЎtigte Attribute zum Benutzen des Items<br> VAR INT * * cond_atr[3]; * * * * * *//атрибут, требуемый для примениения<br> VAR INT * * cond_value[3]; * * * * *//значение требуемого атрибута<br><br> * * //Attribute, die bei anlegen des Items verфndert werden<br> VAR INT * * change_atr[3]; * * * * *// ???<br> VAR INT * * change_value[3]; * * * *// ???<br><br> * * //Parserfunktionen<br> VAR FUNC * *magic; * * * * * * * * *// ???<br> * * //Parserfunktion zum "Magie Header"<br> VAR FUNC * *on_equip; * * * * * * * //функция одевания<br> * * //Parserfunktion, wenn Item equipped wird.<br> VAR FUNC * *on_unequip; * * * * * * //функция снятия<br> * * //Parserfunktion, wenn Item unequipped wird.<br> VAR FUNC * *on_state[4]; * * * * * *//пользовательские функции<br><br> * * //Besitzer<br> VAR FUNC * *owner; * * * * * * * * *//кому принадлежит<br> * * //Besitzer : Instanz-Name<br> VAR INT * * ownerGuild; * * * * * * //гильдия - собственник<br> * * //Besitzer : Gilde<br> VAR INT * * disguiseGuild; * * * * *// ???<br> * * //Zur Schau getragene Gilde durch Verkleidung<br><br> * * //Die 3DS-Datei<br> VAR STRING *visual; * * * * * * * * //файл текстур<br><br> * * //Verфnderung des NSC-Meshes beim Anlegen dieses Gegenstandes<br> VAR STRING *visual_change; * * * * *//какой-то .asc файл ???<br> * * //ASC - File<br> VAR INT * * visual_skin; * * * * * *// ???<br><br> VAR STRING *scemeName; * * * * * * *// ???<br> VAR INT * * material; * * * * * * * //материал предмета<br> * * //VAR STRING *pfx;<br> * * //Magic Weapon PFX<br> VAR INT * * munition; * * * * * * * //оружейное снаряжение (стрелы, болты)<br> * * //Instance of Munition<br><br> var int * * spell; * * * * * * * * *//тип заклинания<br> var int * * range; * * * * * * * * *// ???<br><br> var int * * mag_circle; * * * * * * //круг магии<br><br> VAR STRING *description; * * * * * *//имя описания предмета<br> VAR STRING *text[ITM_TEXT_MAX]; * * //текст описания (мах 6 строк)<br> VAR INT * * count[ITM_TEXT_MAX]; * *//числовые значения для описания<br>};<br><br><br>Ребята, получается монолог вместо диалога, так мы много не изучим. Может стоит закрыть тему? *:(
|
Re: Уроки скриптологии
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Re: Уроки скриптологии
Цитата:
|
Re: Уроки скриптологии
А вот и не ошибся! *;D<br>Вот пример скрипта обычного меча с добавлением двух строк. При "одевании" его сила увеличивается на 50 единиц.<br><br>INSTANCE ItMW_Addon_Knife01 (C_Item)<br>{ * * *<br> * * *name ** * * * * * * * * * * *= * * *"Wolfsmesser"; *<br><br> * * *mainflag ** * * * * * * * *= * * *ITEM_KAT_NF;<br> * * *flags ** * * * * * * * * * * *= * * *ITEM_SWD; * * *<br> * * *material ** * * * * * * * *= * * *MAT_METAL;<br><br> * * *value ** * * * * * * * * * * *= * * *Value_Wolfsmesser;<br><br> * * *damageTotal * * * * * * *= ** * *Damage_Wolfsmesser;<br> * * *damagetype ** * * * * * * * *= * * *DAM_EDGE;<br> * * *range * * * * * * * * * * *= * * * *Range_Wolfsmesser; * * * * * *<br> * * *<br> * * *on_equip * * * * * * * * *= * * *Equip_1H_03;<br> * * *on_unequip * * * * * * * * *= * * *UnEquip_1H_03;<br> * * *<br> * * *cond_atr[2] * ** * * * * *= * * *ATR_STRENGTH;<br> * * *cond_value[2] * * * * * * *= * * *Condition_Wolfsmesser;<br> * * *visual ** * * * * * * * * * * *= * * *"ItMw_012_1h_Knife_02.3DS";<br><br> * *change_atr[2] * * * * * *= ** * *ATR_STRENGTH;<br> * *change_value[2] * * * * * *= * * *50;<br><br> * * *description * * * * * * * * *= * name;<br> * * *<br> * * *TEXT[2] * * * * * * * * * * * *= NAME_Damage; * * * * * * * * * * * * * * *COUNT[2] * * *= damageTotal;<br> * * *TEXT[3] ** * * * * * * * *= NAME_Str_needed; * * * * * * * * * * * *COUNT[3] * * *= cond_value[2];<br> * * *TEXT[4] * * * * * * * * * * * *= NAME_ADDON_BONUS_1H; * * * * * * * * *COUNT[4] * * *= Waffenbonus_03;<br> * * *TEXT[5] * * * * * * * * * * * *= NAME_Value; * * * * * * * * * * * * * * *COUNT[5] * * *= value;<br><br>Хотя добиться того же самого эффекта можно и по-другому.
|
Re: Уроки скриптологии
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Re: Уроки скриптологии
2Владимир Ильич:<br>
Цитата:
Цитата:
Цитата:
|
Re: Уроки скриптологии
Несколько дополнений по классу C_ITEM<br> VAR INT * * nutrition; * * //увеличение HP при употреблении<br> VAR INT * * visual_skin; * //номер mesh-текстуры<br> VAR STRING *scemeName; * * //внутреннее имя предмета в скриптах<br><br>Класс C_INFO используется для создания различных диалогов<br><br>CLASS C_INFO<br>{<br> *VAR INT * * npc; * * * * *//id npc, участвующего в диалоге<br> *VAR INT * * nr; * * * * * // ???<br> *VAR INT * * important; * *//кто начинает диалог (0-ты, 1-с тобой)<br> * * *//Wichtig Flag -> ansprechen<br> *VAR FUNC * *condition; * *//функция условий диалога<br> *VAR FUNC * *information; *//функция самого диалога<br> *VAR STRING *description; *//строка описания<br> *VAR INT * * trade; * * * *//возможность торговли (1-да, 0-нет)<br> *VAR INT * * permanent; * *//постоянность диалога (1-постоянный, 0-однократный)<br>};<br><br>Классы C_MISSION, C_ITEMREACT в скриптах не используются, мне о них сказать пока нечего.<br>Класс C_FOCUS используется для задания фокуса камеры при различных ситуациях, предлагаю его пока не рассматривать. :D
|
Re: Уроки скриптологии
Класс C_SPELL используется для создания заклинаний<br><br>CLASS C_Spell<br>{<br> VAR FLOAT *time_per_mana; * * * * * //требуемое время на единицу маны (мс)<br> * * // Zeit pro investierten Manapunkt (ms)<br> VAR INT * *damage_per_level; * * * *//наносимый урон на уровень заклинания<br> * * // Schaden pro Level<br> VAR INT * *damageType; * * * * * * *//тип урона<br> * * // CAN BE ONLY ONE DAMAGE TYPE<br> VAR INT * *spellType; * * * * * * * //тип заклинания<br> * * // Good, Neutral or Bad<br> VAR INT * *canTurnDuringInvest; * * //возможность поворота при кастовании<br> VAR INT * *canChangeTargetDuringInvest; //возможность выбора цели при кастовании<br> VAR INT * *isMultiEffect; * * * * * //множественные эффекты заклинания<br> * * // Effect Class is oCVisFX_MultiTarget if set to 1 (e.g. the effect can have multiple trajectorys (massdeath)<br> VAR INT * *targetCollectAlgo; * * * //кто или что является целью (тип выбора цели)<br> VAR INT * *targetCollectType; * * * //тип цели (предмет, npc и т.д.)<br> VAR INT * *targetCollectRange; * * *//дальность<br> VAR INT * *targetCollectAzi; * * * *//азимут<br> VAR INT * *targetCollectElev; * * * // ???<br>};<br><br>Следующий класс C_SVM подробно описан в файле svm.d (но, к сожалению, на немецком языке). В нем находится все то, о чем болтают неписи между собой. Рассматривать не будем.
|
Re: Уроки скриптологии
Класс C_GILVALUES описывает параметры всех типов людей и монстров<br><br>CLASS C_GILVALUES<br>{<br> VAR INT * * *WATER_DEPTH_KNEE[GIL_MAX]; * * * * *// ???<br> VAR INT * * *WATER_DEPTH_CHEST[GIL_MAX]; * * * * // ???<br> VAR INT * * *JUMPUP_HEIGHT[GIL_MAX]; * * * * * * //высота прыжка<br> * * // * * *DEFAULT = 200;<br>//VAR INT * * * JUMPUP_FORCE[GIL_MAX];<br> VAR INT * * *SWIM_TIME[GIL_MAX]; * * * * * * * * //время плавания (пока не утонет)<br> VAR INT * * *DIVE_TIME[GIL_MAX]; * * * * * * * * //время пребывания под водой<br> VAR INT * * *STEP_HEIGHT[GIL_MAX]; * * * * * * * //размер шага<br> VAR INT * * *JUMPLOW_HEIGHT[GIL_MAX]; * * * * * *// ???<br> VAR INT * * *JUMPMID_HEIGHT[GIL_MAX]; * * * * * *// ???<br> VAR INT * * *SLIDE_ANGLE[GIL_MAX]; * * * * * * * //угол начала скольжения по наклонной плоскости<br> VAR INT * * *SLIDE_ANGLE2[GIL_MAX]; * * * * * * *// ???<br> VAR INT * * *DISABLE_AUTOROLL[GIL_MAX]; * * * * *// ???<br> * * // * * *DEFAULT = 0 * * *;0 = Autoroll *enabled */1 = Autoroll *disabled<br> VAR INT * * *SURFACE_ALIGN[GIL_MAX]; * * * * * * // ???<br> * * // * * *DEFAULT = 0 * * ;0 = Alignment disabled * * */1 = Alignment enabled<br> VAR INT * * *CLIMB_HEADING_ANGLE[GIL_MAX]; * * * //какие-то углы подъема<br> VAR INT * * *CLIMB_HORIZ_ANGLE[GIL_MAX]; * * * * //<br> VAR INT * * *CLIMB_GROUND_ANGLE[GIL_MAX]; * * * *//<br> VAR INT * * *FIGHT_RANGE_BASE[GIL_MAX]; * * * * *//какие-то диапазоны борьбы<br> VAR INT * * *FIGHT_RANGE_FIST[GIL_MAX]; * * * * *//<br> VAR INT * * *FIGHT_RANGE_1HS[GIL_MAX]; * * * * * //<br> VAR INT * * *FIGHT_RANGE_1HA[GIL_MAX]; * * * * * //<br> VAR INT * * *FIGHT_RANGE_2HS[GIL_MAX]; * * * * * //<br> VAR INT * * *FIGHT_RANGE_2HA[GIL_MAX]; * * * * * //<br> VAR INT * * *FALLDOWN_HEIGHT[GIL_MAX]; * * * * * //высота падения без повреждения<br> * * // * * *Wie tief Fallen ohne Schaden ?<br> VAR INT * * *FALLDOWN_DAMAGE[GIL_MAX]; * * * * * //повреждение от падения с высоты<br> * * // * * *Schaden f№r jeden weiteren angefangenen Meter.<br> VAR INT * * *BLOOD_DISABLED[GIL_MAX]; * * * * * *//уровень показа крови<br> * * // * * *DEFAULT = 0 * * ;Blut ganz ausschalten (z.B. bei Sekletten) ?<br> VAR INT * * *BLOOD_MAX_DISTANCE[GIL_MAX]; * * * *//макс. радиус брызг крови<br> * * // * * *DEFAULT = 1000 * * *;Wie weit spritzt das Blut (in cm) ?<br> VAR INT * * *BLOOD_AMOUNT[GIL_MAX]; * * * * * * *//кол-во крови<br> * * // * * *DEFAULT = 10 * *;Wie viel Blut ?<br> VAR INT * * *BLOOD_FLOW[GIL_MAX]; * * * * * * * *// ???<br> * * // * * *DEFAULT = 0 * * ;Soll es sich langsam ausbreiten ?<br> VAR STRING * BLOOD_EMITTER[GIL_MAX]; * * * * * * //источник крови<br> * * // * * *DEFAULT = "PFX_BLOOD" * * * * *;Welcher Partikel-Emitter ?<br> VAR STRING * BLOOD_TEXTURE[GIL_MAX]; * * * * * * //текстура крови<br> * * // * * *DEFAULT = "ZBLOODSPLAT2.TGA" * ;Welche Textur ?<br> VAR INT * * *TURN_SPEED[GIL_MAX]; * * * * * * * *//скорость разворота<br> * * // * * *DEFAULT = 150;<br>};<br><br>Вот, в принципе и все, что мне известно о классах. :D<br>
|
Re: Уроки скриптологии
Тема шестая: Функции.<br><br>Несколько общих замечаний:<br>1. Функции могут возвращать значения только этих типов - VOID, INT, FLOAT, STRING, INSTANCE.<br>2. Рассматривать будем пока только базовые функции, которые реализованы в екзешнике.<br>3. Большинство базовых функций описано в файле externals.d, но в нем есть ошибки (этот файл приведен только для справки, он не компилируется), о них буду говорить по мере разбора функций, и отмечать значком ****.<br>4. Идентификаторы FUNC (при объявлении функции) и VAR (как идентификатор аргументов) для простоты приводить не буду.<br><br>1. Функции вывода текста.<br><br>VOID Print(STRING s0); - выводит на экран строку текста s0, как OutputUnits текст (аналогично выводу из OU файла).<br>VOID PrintMulti(STRING s0,STRING s1,STRING s2,STRING s3,STRING s4); - выводит текст на экран, объединяя строки параметров s0-s4 в одну строку.<br>INT PrintScreen(STRING msg,INT posx,INT posy,STRING font,INT timeSec); - выводит на экран строку текста msg (имя шрифта – font) с координатами posx, posy (диапазон от 0 до 99% размера экрана, -1 означает вывод по центру соответствующей оси экрана) на время timeSec (в секундах). *Возвращаемое значение всегда = 0. ***<br>VOID PrintDebug(STRING s); - выводит текст строки s через zSpy или в лог. файл, работает только в отладочном режиме (включается (Alt+D))<br><br>Продолжение следует. *;)<br>
|
Re: Уроки скриптологии
В завершение первого раздела привожу еще 4 функции:<br><br>void PrintDebugInst(String text); - выводит текст строки text через zSpy или в лог. файл для ссылки self *в отладочном режиме.<br>void PrintDebugInstCh(int ch,String text); - выводит текст строки text через zSpy или в лог. файл для ссылки self канала ch *в отладочном режиме (каналы определены в файле PrintDebug.d).<br>void PrintDebugCh(int ch, String text); - выводит текст строки text через zSpy или в лог. файл для канала ch *в отладочном режиме<br>INT PrintDialog(INT dialogNr,STRING msg,INT posx,INT posy,STRING font,INT timeSec); - работает аналогично функции PrintScreen, только вывод осуществляется в окно диалога c номером dialogNr (координаты в % действуют внутри окна диалога). ***<br><br>
|
Re: Уроки скриптологии
2. Функции преобразования типов.<br><br>string IntToString(int x); - преобразовывает целое число x в строку.<br>string FloatToString(float x); - преобразовывает число с плавающей точкой x в строку. ***<br>int FloatToInt(float x); - преобразовывает число с плавающей точкой x в целое число.<br>float IntToFloat(int x); - преобразовывает целое число х в число с плавающей точкой.<br>string ConcatStrings(string str1,string str2); - результирующей строкой является объединение двух строк str1 и str2.<br><br>
|
Re: Уроки скриптологии
Кто-нибудь знает расшифровку общеупотребимых сокращений в скриптах AI, VOB, SC, NSC? (Желательно на английском!) ;)
|
Re: Уроки скриптологии
3. Функции работы со звуком.<br><br>void Snd_Play(string s0); - воспроизвести звуковой файл с именем s0. <br>void Snd_Play3D(c_npc n0,string s1); - воспроизвести звуковой файл с именем s0 для npc n0. <br>int Snd_IsSourceNpc(c_npc self); - проверить, является ли npc self источником звука (return > 0) и установить ссылку other на этого npc.<br>int Snd_IsSourceItem(c_npc self); - проверить, является ли у npc self предмет источником звука (return > 0) и установить ссылку item на этот предмет<br>int Snd_GetDistToSource(c_npc self); - выдать расстояние в сантиметрах до источника звука от npc self.<br>
|
Re: Уроки скриптологии
2Vam:<br>Так держать! :)<br><br>
Цитата:
Цитата:
|
Re: Уроки скриптологии
2Killer-XXX:<br>2DimaD:<br>Возможно вы и правы, разберемся по ходу дела. Для VOB у меня тоже есть расшифровка - visual object.<br>Есть еще одно сокращение - MOB, каковы его толкования?<br><br>4. Вспомогательные функции.<br><br>int Hlp_Random(int n0); - сгенерить случайное целое число в диапазоне от 0 до n0-1.<br>int Hlp_StrCmp(string s1,string s2); - сравнивает две строки s1 и s2, возвращает true при равенстве строк или false при неравенстве.<br>int Hlp_IsValidNpc(c_npc self); - если NSC ссылка на npc self существует, то возвращает true, иначе – false.<br>int Hlp_IsValidItem(c_itm item); - если ссылка на предмет item существует, то возвращает true, иначе – false.<br>int Hlp_IsItem(c_item item,int instanceName); - проверяет принадлежность предмета item к соответствующему типу instanceName, возвращает true при соответствии, иначе – false.<br>c_npc Hlp_GetNpc(int instanceName); - возвращает ссылку на npc, принадлежащему к типу *instanceName.<br>int Hlp_GetInstanceID(c_npc npc); - получить ID номер npc по ссылке на класс npc.<br>int Hlp_GetInstanceID(c_item item); *- получить ID номер предмета по ссылке на класс item.<br><br>
|
Re: Уроки скриптологии
5. Функции работы с документами (свитки, книги, записки, карты).<br><br>int Doc_Create(); - создает новый документ и возвращает номер его обработчика.<br>int Doc_CreateMap(); - создает новую карту и возвращает номер её обработчика. ***<br>void Doc_SetLevel(int handle,string world); - устанавливает уровень world (формат ZEN) для документа handle. *** (Не знаю, что конкретно делает эта функция).<br>void Doc_SetPages(int handle,int pages); - задает кол-во отображаемых страниц pages для документа handle.<br>void Doc_SetPage(int handle,int page,string pageimage,int scale); - устанавливает параметры страницы page (если параметр page = -1, то применяется ко всем страницам) документа handle: pageimage – имя файла изображения страницы в формате TGA, scale = 0 - применять масштабируемось, scale = 1 - не использовать масштабируемость (применяется для карт).<br>void Doc_SetFont(int handle,int page,string fontname); - задать шрифт для страницы page документа handle, где fontname – имя файла шрифта в формате TGA.<br>void Doc_SetMargins(int handle,int page,int leftMargin,int topMargin,int rightMargin,int bottomMargin,int pixel); - установить границы вывода текста на странице page документа handle, где leftMargin, topMargin, rightMargin, bottomMargin – соответственно левая, верхняя, правая и нижняя границы, pixel – кол-во пикселей на единицу границы.<br>void Doc_PrintLine(int handle,int page,string text); - выводит строку текста text на странице page документа handle.<br>void Doc_PrintLines(int handle,int page,string text); - выводит текст text в несколько строк на странице page документа handle.<br>void Doc_Show(int handle); - выводит созданный документ handle на экран.<br><br>Продолжение следует. *;)
|
Re: Уроки скриптологии
void Doc_Open(string picName); - открывает документ с именем picName, как рисунок на заднем плане (в скриптах не используется).<br>void Doc_Font(string fontName); - задает для документа шрифт fontName (в скриптах не используется).<br>void Doc_Print(string text); - выводит текст text документа на экран (в скриптах не используется).<br>void Doc_MapCoordinates(string levelName,float gamex1,float gamey1,float pixelx1,float pixely1,float gamex2,float gamey2,float pixelx2,float pixely2); -инициализирует карту с именем уровня levelName, где gamex1, gamey1, gamex2, gamey2 – координаты углов карты, соответствующие координатам уровня, *а pixelx1, pixely1, pixelx2, pixely2 – соответственно коодинаты пикселей углов карты (в скриптах не используется).<br>
|
Re: Уроки скриптологии
6. Функции работы с журналом квестов.<br><br>void Log_CreateTopic(string name,int section); - создать в журнале тему с именем name в разделе section (предопределены два раздела LOG_MISSION или LOG_NOTE).<br>void Log_SetTopicStatus(string name,int status); - установить статус status темы с именем name (предопределены следующие статусы - LOG_RUNNING, LOG_SUCCESS, LOG_FAILED, LOG_OBSOLETE).<br>void Log_AddEntry(string topic,string entry); - записать в тему topic текст из строки entry.<br><br>
|
Re: Уроки скриптологии
7. Функции работы с миссиями.<br><br>void Mis_SetStatus(int missionName,int newStatus); - установить статус newStatus миссии *missionName (предопределены следующие статусы RUNNING, SUCCESS, FAILED и т.д.)<br>int Mis_GetStatus(int missionName); - получить статус миссии missionName.<br>int Mis_OnTime(int missionName); - проверка миссии, возвращает true, если миссия активна, т.е. не завершена. Примечание: данная функция в экзешнике реализована неверно, она ничего не возвращает (лучше ее не использовать).<br>void Mis_AddMissionEntry(c_mission miss,string name); - добавить в список миссий новую миссию miss под именем name. ***<br>void Mis_RemoveMission(c_mission miss); - удалить из списка миссий миссию miss. ***<br>
|
Re: Уроки скриптологии
8. Функции работы с инвентарем.<br><br>void CreateInvItem(c_npc n0,int n1); - создает в инвентаре npc n0 предмет с ID n1.<br>void CreateInvItems(c_npc n0,int n1,int n2); - создает в инвентаре npc n0 предметы с ID n1 количеством n2.<br>void EquipItem(c_npc n0,int n1); - экипировать npc n0 предметом с ID n1.<br>void Mob_CreateItems(string mobName,int itemInstance,int amount); - создает в контейнере с именем mobName (например сундук) предметы с ID itemInstance количеством amount.<br>int Mob_HasItems(string mobName,int itemInstance); - получить количество предметов с ID itemInstance, находящихся в контейнере с именем mobName.<br>
|
Re: Уроки скриптологии
2Всем:<br>Спасибо за отзывчивость, но критика тоже бы не помешала.<br>Всем слушателям (читателям) по *:pivo:<br>Продолжаем уроки.<br><br>9. Функции анимации.<br><br>void Mdl_ApplyOverlayMds(c_npc n0,string s1); - запустить файл анимации s1 с расширением mds для npc n0.<br>void Mdl_RemoveOverlayMDS(c_npc self,string overlayName); - отключить от npc self файл анимации overlayName.<br>void Mdl_ApplyOverlayMDSTimed(c_npc self,string overlayname,int timeTicks); - запустить файл анимации overlayname для npc self на время timeTicks. ***<br>void Mdl_ApplyRandomAni(c_npc n0,string s1,string s2); - запустить случайные анимации s1 для npc n0 в последовательности анимационных состояний s2.<br>void Mdl_ApplyRandomAniFreq(c_npc n0,string s1,float f2); - устанавливает частоту выборки f2 случайных анимационных состояний s1 для npc n0.<br>void Mdl_StartFaceAni(c_npc self,string name,float intensity,float holdTime); - запускает файл name анимации лица для npc self с интенсивностью intensity (в %, 1 – 100%) и временем удержания holdTime (1 – постоянно).<br>void Mdl_ApplyRandomFaceAni(c_npc self,string name,float timeMin,float timeMinVar,float timeMax,float timeMaxVar,float probMin); - запускает файл случайной анимации лица name для npc self со следующими параметрами: timeMin, timeMax – диапазон времени воспроизведения анимации в сек, timeMinVar, timeMaxVar – отклонения от значений timeMin, timeMax в сек, probMin – вероятность использования отклонения (от 0 до 1) от нижней до верхней границы.<br><br>Продолжение следует.
|
Re: Уроки скриптологии
Внимание: возможен потенциальный глюк!<br><br>В посте #18 я писал, что макс. размерность массива = 4095, это не так. Компилятор скриптов в GothicMod.exe поддерживает массивы с размерностью до 255 и не больше. Модмейкеры - будьте осторожны! *;)
|
Re: Уроки скриптологии
продолжение:<br><br>void Mdl_SetVisual(c_npc self,string fileMds); - задать для npc self файл изображения с именем fileMds (формат MDS). ***<br>void Mdl_SetVisualBody(c_npc self,string body,int bodytex,int color,string head,int htex,int ttex,int armor); - установить параметры изображения npc self, где: body – имя mesh файла изображения тела, bodytex – номер текстуры тела, color – номер палитры цвета кожи, head – имя MMS файла изображения головы, htex – номер текстуры головы, ttex – номер текстуры зубов, armor – номер одетой брони (-1 – брони нет). ***<br>void Mdl_SetModelScale(c_npc self,float x,float y,float z); - установить масштаб mesh изображения модели npc self по координатам x,y,z в % (1 - 100%).<br>void Mdl_SetModelFatness(c_npc self,float fatness); - установить жирность mesh изображения модели npc self в % (1 - 100%). Может кто-нибудь пояснить, что это за функция?<br><br>Просьба: если кто знает, скажите, что такое mesh?<br>
|
Re: Уроки скриптологии
Благодарю за понимание, продолжим...<br><br>10. Функции распорядка дня.<br><br>void TA_Min(c_npc self,int start_h, int start_m,int stop_h, int stop_m,func state,string waypoint); - для npc self задается функция распорядка дня state, где start_h и start_m – время в часах и минутах начала выполнения функции, stop_h и stop_m – соответственно время окончания функции, waypoint – имя точки, в которой выполняется функция.<br>void TA(c_npc self,int start_h,int stop_h,func state,string waypoint); - выполняет все то, что и предыдущая функция, только без привязки к минутам.<br>void TA_CS(c_npc self,string csName,string roleName); - функция, выполняемая последней в списке функций распорядка дня для npc self, где csName – имя файла CS (Cutscene), roleName – роль NSC, которая должна выполняться. (частично не понял)<br>void TA_BeginOverlay(c_npc self); - начать выполнять заявленный распорядок дня для npc self.<br>void TA_EndOverlay(c_npc self); - закончить выполнять заявленный распорядок дня для npc self.<br>void TA_RemoveOverlay(c_npc self); - удалить заявленный распорядок дня для npc self.<br>
|
Re: Уроки скриптологии
11. Функции работы с диалогами.<br><br>int InfoManager_HasFinished(); - показывает, завершен ли диалог (возвращает 0 во время диалога и 1 после окончания диалога). ***<br>void Info_AddChoice(c_info menu,string text,func fn); - добавляет в меню диалога menu строку выбора действия *text, fn – функция, которая активируется при выборе данного пункта меню. ***<br>void Info_ClearChoices(c_info menu); - удалить тему диалога menu. ***<br>
|
Re: Уроки скриптологии
12. Функции различного назначения.<br><br>void ExitGame(); - просто закончить игру. ***<br>int PlayVideo(string video); - показать видео файл video (c расширением BIK), возвращает 1, если видео показано, 0 – в случае ошибки. ***<br>void SetPercentDone(int perc); - установить процент perc отображения полоски в окне загрузки (ProgressBar), значение от 0 до 100. ***<br>void IntroduceChapter(string chapter,string name,string file,string sound,int time); - вывести на экран окно новой главы, где chapter – номер главы, name – название главы, file – файл заставки главы (формат TGA), sound – звуковой файл (формат WAV), time – время показа заставки. ***<br>void Tal_Configure(int tal,int value); - переопределить значение таланта value для константы tal (например, определены константы NPC_TALENT_PICKLOCK, NPC_TALENT_MAGE и т.д.). ***<br>void Perc_SetRange(int percID,int range); - устанавливает дальность действия range *пассивного восприятия percID в сантиметрах.<br>void Rtn_Exchange(string oldRoutine,string newRoutine); - заменяет функции oldRoutine распорядка дня NSC self на новые функции newRoutine. (Имя функции должно начинаться с RTN_ и заканчиваться идентификатором NSC скрипта).<br>int Hlp_CutscenePlayed(string csName); - информирует, игралась ли Cutscene с именем csName (0 – нет, 1 – да).<br>
|
Re: Уроки скриптологии
Замечание: точная расшифровка NSC – ближайший SC (Nearest SC). *:D (SC пока не знаю).<br><br>13. Функции работы с миром Готики.<br><br>int Wld_DetectNpc(c_npc self,int instance,func aiState,int guild); - эта функция инициализирует глобальную переменную скриптов other, отличную от NSC self, где instance – производная от класса c_npc, которая должна быть найдена и проинициализирована (-1 – любая производная), guild – гильдия, членом которой должен быть искомый NSC (-1 – любая гильдия), aiState – функция AI состояния, в котором должен находится искомый NSC (NOFUNC – любое AI состояние). Функция возвращает 1 в случае успешного завершения (other инициализирован найденным NSC), 0 – неудача (other не определен).<br>int Wld_DetectNpcEx(c_npc self,int instance,func aiState,int guild,int detectPlayer); - выполняет все тоже, что и предыдущая функция, дополнительный параметр detectPlayer указывает, исключить ли игрока (ГГ) из поиска (0 – исключить, 1 – нет).<br>int Wld_DetectItem(c_npc self,int flags); - эта функция инициализирует глобальную переменную скриптов item предметом, возможно находящимся у npc self и имеющим флаг flags, возвращает 1 при успешном поиске и инициализации, иначе – 0.<br>int Wld_DetectPlayer(c_npc self); - возвращает 1, если ГГ есть npc self, иначе – 0.<br><br>Продолжение следует.<br>
|
Re: Уроки скриптологии
void Wld_SetGuildAttitude(int guild1,int attitude,int guild2); - установить отношение между гильдиями, где guild1, guild2 – гильдии, между которыми устанавливается отношение, attitude – отношение между гильдиями (определены отношения ATT_HOSTILE, ATT_FRIENDLY, ATT_NEUTRAL, ATT_ANGRY).<br>int Wld_GetGuildAttitude(int guild1,int guild2); - получить отношение между гильдиями guild1 и guild2.<br>int Wld_IsMobAvailable(c_npc self,string schemeName); - проверяет, есть ли MOB с именем schemeName в окрестности 10 метров от npc self, возвращает TRUE, если MOB существует и свободен, иначе FALSE.<br>int Wld_GetMobState(c_npc self,string schemeName); - определяет состояние MOB с именем schemeName для npc self, возвращает состояние или -1, если MOB не найден.<br>int Wld_IsFPAvailable(c_npc self,string fpName); - проверяет, есть ли FP (Freepoint) с именем fpName в окрестности 20 метров от npc self, возвращает TRUE, если FP существует и свободна, иначе FALSE.<br>int Wld_IsNextFPAvailable(c_npc self,string fpName); - работает аналогично предыдущей функции, но проверится ближайшая точка, если fpName блокирована.<br><br>Продолжение следует.<br>
|
Re: Уроки скриптологии
2Vam: <br>
Цитата:
|
Текущее время: 21:33. Часовой пояс GMT +4. |
Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot
AGFC: Valley of Gothic © 2004-2022