Перейти к содержанию

Мануал по скриптам под MWSE


Рекомендуемые сообщения

Я работаю над переводом мануала по скриптам МВСЕ . Некоторую часть уже перевел. Буду сюда класть частями .

Писание скриптов под MWSE
Вступление
Ты хотел бы изучить функции MWSE ? Если ты еще не знаком с оригинальным скриптовым языком , советую прочитать учебник Ghаn-Buri-Ghan’а.
В целом , MWSE добавляет 80 новых функций , 2 новых типа .

Компилирование скриптов с расширенными функциями.

Чтобы скомпилировать скрипты с расширенными функциями , используйте такие программы ,как MWEditSE , либо MWEdit .
ТЕС КС не поддерживает скрипты под MWSE , но вы можете использовать КС для редактирования остальных вещей в вашем плагине, не относящимся к скриптам. Впрочем, вы можете использовать КС и для редактирования скриптов с расширенными функциями , но вам выдаст ошибку , когда вы попытаетесь скомпилировать скрипт в КС.
MWEditSE не проверяет скрипты на ошибки при компиляции , когда вы используете новые функции , поэтому – будьте бдительны и не допускайте ошибок.
Команду MenuTest 0 или ToggleMenus MWedit компилирует отлично от CS. Поэтому скрипты с этими командами можно компилировать только в CS, иначе отключаются Все меню. Более подробно это может разъяснить только автор MWedit.

Новые Ограничения и Полномочия в типах переменных.

Функции MWSE паботают с двумя типами переменных – STRING и REF . Оба обьявлены в скриптах ,использующих тип “long” . В обычных скриптах переменная типа “invitem” обрабатывается как STRING ( ограничение ) расширенными функциями . “invref” и “pcref” рассматриваются , как REF ( полномочие ) .

Значение новой команды “setx”

К сожалению , новые функции не могут быть простым способом объединены со стандартными функциями и командами. Команда “setx” используется , как заменитель стандартной команды “set” , когда вы используете новую функцию. Вы можете поставить значение только одной функции или ограничения по правую сторону от “”setx , но вы также можете ставить несколько значений по левую сторону , таких , как например “xInventory” , которая возвращает множественные значеня. .
Опять напомню вам, что компилятор не проверяет скрипты с расширенными функциями на ошибки, поэтому – будьте бдительны.

Подача контрольных блоков с 'ifx' и 'whilex'

Стандартные скриптовые команды ‘if’ и ‘while’ не работают , когда тело блока включает в себя расширенные команды , для их замены используем 'ifx' и 'whilex' . 'ifx' и 'whilex' еще не полностью поддерживают синтаксис , я пока что использую только одно значение для примера . 'ifx' и 'whilex' будут работать , только когда значение НЕ равно нулю . Также вы можете использовать ‘else’ вместе с 'ifx' , но ни в коем случае ‘elseif’ , а ‘elseufx’ также нету .
Смотрите пример
Старая версия скрипта

if ( state == 5 )
раздел для 5
else
раздел , если не равно 5
endif

Новая версия скрипта

set temp to ( state - 5 )
ifx ( temp )
раздел если не равно 5
Else
раздел Если равно 5
endif


Если оставить только первый кусок , то будет так

Старая версия

if ( state == 5 )
раздел если равно 5
endif


Новая версия
set temp to ( state - 5 )
ifx ( temp )
else
раздел если равно 5
endif


Функции


Типы названые STRING и REF на самом деле поддерживаются , как переменные типа ‘long’ . Функции перечисленные с операцией REF-> на какой-то предмет , поддерживаются через оператор -> , также поддерживаются через функцию xSetRef



References ( Полномочия )
xSetRef, xRefType, xGetRef, xGetCombat, xGetPCTarget
xFirstNPC, xFirstItem, xFirstStatic, xNextRef

Math ( Математические функции )
xDistance, xSqrt, xHypot, xDegRad, xRadDeg
xCos, xSin, xTan, xArcCos, xArcSin, xArcTan

AI and Movement ( Программирование ИИ и движения )
xAITravel, xPlace, xPosition, xPositionCell, xStartCombat

Inventory ( Инвентарь )
xInventory, xNextStack, xContentList
xAddItem, xRemoveItem, xHasItemEquipped

Attributes ( Атрибуты )
xGetBaseStr, xGetBaseInt, xGetBaseWil, xGetBaseAgi
xGetBaseSpe, xGetBaseEnd, xGetBasePer, xGetBaseLuc

NPC Properties ( Параметры у NPC(non-playing character ) )
xIsFemale, xIsTrader, xIsTrainer, xIsProvider
xGetService, xSetService, xModService
xGetBaseGold, xGetGold, xSetBaseGold, xSetGold

Item Properties ( Параметры у итемов )
xGetValue, xGetOwner, xGetWeight, xGetEncumb, xGetQuality
xGetCondition, xGetMaxCondition, xGetCharge, xGetMaxCharge

Keyboard Input ( Раскладка клавиатуры )
xKeyPressed, xTextInput, xTextInputAlt

File I/O
xFileRewind, xFileSeek, xFileReadText, xFileWriteText
xFileReadShort, xFileReadLong, xFileReadFloat, xFileReadString
xFileWriteShort, xFileWriteLong, xFileWriteFloat, xFileWriteString

Strings( Ограничения )
xPCCellID, xRefID, xMyCellID, xGetName, xGetBaseID
xStringCompare, xStringLength, xStringParse
xStringBuild, xLogMessage, xMessageFix


xSetRef REF_reference
эта функция позволяет называть функции обьектов там , где стандыртный синтаксис не позволяет
set myalchemyskill to myobject->GetAlchemy не работает , потому что стандартная ‘set’ не позволяет использовать переменные , как обьекты , поэтому мы будем писать так :
xSetRef myobject
set myalchemyskill to GetAlchemy

LONG REF->xRefType

Видит тип полномочий обьекта и переводит тип обьекта в цифры

1230259009 = ACTI (Активатор)
1212369985 = ALCH (Алхимия(выпивка и т.п.))
1095782465 = APPA (Аппарат для деланья зелий)
1330467393 = ARMO (Армор )
1263488834 = BOOK (Книжка)
1414483011 = CLOT (Одежда)
1414418243 = CONT (Контейнер)
1095062083 = CREA (Кричер)
1380929348 = DOOR (Дверь)
1380404809 = INGR (Ингридиент)
1129727308 = LEVC (Уровневый кричер)
1230390604 = LEVI (Уровневый итем)
1212631372 = LIGH (светильник)
1262702412 = LOCK (Отмычка)
1129531725 = MISC (Миск итем)
1598246990 = NPC_ (Непись)
1112494672 = PROB (Щуп)
1095779666 = REPA (Чинилки)
1414546259 = SCPT (Скрипт)
1195658835 = SNDG (Генератор звука)
1413567571 = STAT (Статик)
1346454871 = WEAP (Оружие)

REF REF->xGetRef STRING_objectid
Возвращает значение к одному активным обьектам , распределяя по ID , или 0 , если не находит активных обьектов. Очень полезно для размещения Неписей и уникальных обьектов.

REF REF->xGetCombat
Возвращает значение к цели, на которую была совершена атака , или же 0 , если атака совершена не была .

REF xGetPCTarget
Возвращает значение обьекту , на который направлен прицел игрока , или же 0 , если игрок не смотрит ни на что , что могло бы по отношению к нему быть использовано

REF xFirstNPC
Возвращает значение определенному неписю или кричеру , который находится с игроком в одной ячейке , или же 0 , если там никого нет .

REF xFirstItem
Возвращает такое же значение , как и xFirstNPC , отличие в том , что теперь подразумеваются обьекты.

REF xFirstStatic
То же самое , теперь со статиками.

REF xNextRef REF_current
Возвращает значение 'next' одному из трех типов обьектов (NPC, Item, и Static) которые находятся с игроком в одной ячейке .

 

 

 

Изменено пользователем morrow
Ссылка на комментарий
Поделиться на другие сайты

Функции (продолжение)

 

 

FLOAT REF->xDistance REF_target
Подобно оригинальному GetDistance , но берет значения переменной , несмотря на ограничение objected . Использует систему координат из ТЕС КС.

FLOAT xSqrt FLOAT_value
Возвращает квадратный корень значения ( аналогично с GetSquareRoot из трибунала )

FLOAT xHypot FLOAT_a, FLOAT_b
Возвращает гипотенузу для сторон а,б и с

FLOAT xDegRad FLOAT_degrees
Контвертит значение из градусов в радианы.

FLOAT xRadDeg FLOAT_radians
Из радианов в градусы

FLOAT xCos FLOAT_angle
Возвращает косинус угла( угол дается в радианах )

FLOAT xSin FLOAT_angle
Возвращает синус угла ( угол дается в радианах )

FLOAT xTan FLOAT_angle
Возвращает тангенс угла( угол дается в радианах )

FLOAT xArcCos FLOAT_value
Возвращает косинус дуги ( в радианах )

FLOAT xArcSin FLOAT_value
Синус дуги ( в радианах )

FLOAT xArcTan FLOAT_value
Тангенс дуги ( в радианах )

REF->xAITravel FLOAT_x, FLOAT_y, FLOAT_z
Аналог AITravel , чтобы согласовать переменные.

REF xPlace STRING_objectid
Ставит обьект objectID за игроком.

REF->xPosition FLOAT_x, FLOAT_y, FLOAT_z, FLOAT_zRot
Аналог оригинальной функции Position.

REF->xPositionCell FLOAT_x, FLOAT_y, FLOAT_z, FLOAT_zRot, STRING_cellname
Аналог оригинальной PositionCell

REF->xStartCombat REF_target
Аналог оригинальной StartCombat

STRING, LONG, REF REF->xInventory
Возвращает три значения , которые основаны на инвентаре определенного контейнера , непися или кричера . Первое – ID итема в инвентаре. Второе – номер итема который найден . Третье – то ,полномочие , которое мы имеем относительно этого итема . Все три значения будут равны 0 ,если ничего в инвентаре нет

STRING, LONG, REF xNextStack REF_next
Возвращает значение следующего итема в инвентаре. Параметром этой функции является результат предыдущей функции xInventory . Попытки привязать другой вид значений этой функции приведет к ошибкам , и , возможно , краху игры. Если инвентарь непися , кричера или контейнера изменен , то полученное значение этой функции бесполезно, потому , что надополучить новое значение с измененным инвентарем .

STRING, LONG, LONG, LONG, FLOAT, STRING, REF REF->xContentList REF_next
Альтернатива как для функции xInventory , так и для функции xNextStack , которая возвращает 7 значений основанных на состоянии определенного контейнера , непися или кричера . Если входной параметр равен 0 , то первый итем контейнера , непися или кричера возвращена
Пример : set id count type value weight name next to container->xContentList next
Первый параметр – id – это ИД обьекта . Второй – который он по счету . Третий – тип по кодам , использованным в функции xRefType . Остальные три – цена , вес , имя .

REF->xAddItem STRING_idstring, LONG_count
Аналог стандартной AddItem .

REF->xRemoveItem STRING_idstring, LONG_count
Аналог стандартной RemoveItem .

LONG REF->xHasItemEquipped STRING_objectid
Возвращает 1 если непись или кричер чтото еквипнул ( меч и т.п ) , 0 – если ничего не еквипнул .

FLOAT REF->xGetBaseStr
Возвращает значение силы непися.

FLOAT REF->xGetBaseInt
Возвращает значение интеллекта непися .

FLOAT REF->xGetBaseWil
Возвращает значение воли непися.

FLOAT REF->xGetBaseAgi
Возвращает значение ловкости непися.

FLOAT REF->xGetBaseSpe
Возвращает значение скорости непися

FLOAT REF->xGetBaseEnd
Возвращает значение выносливости непися.

FLOAT REF->xGetBasePer
Возвращает значение привлекательности непися .

FLOAT REF->xGetBaseLuc
Возвращает значение удачи непися.

LONG REF->xIsFemale
Возвращает 1 если непись – женщина , 0 – если нет.

LONG REF->xIsTrader
Возвращает 0 , если непись или кричер не торговец , остальные значения – это сколько типов предметов он будет покупать .

LONG REF->xIsTrainer
Возвращает 1 , если непись тренирует навыки , 0 – если нет .

LONG REF->xIsProvider
Возвращает значения выше 0 ,если непись делает заклинания , учит заклинаниям , чинит предметы или зачаровывает. Возвращает 0 , если нет .

LONG REF->xGetService LONG_mask
Комбинация функций xIsTrader, xIsTrainer, и xIsProvider .

Значение Занятие
1 Торгует оружием
2 Торгует арморами
4 Торгует одеждой
8 Торгует книжками
16 Торгует ингредиентами
32 Торгует отмычками
64 Торгует щупами
128 Торгует светильниками
256 Торгует аппаратурой для деланья зелий
512 Торгует чинилками
1024 Торгует misc итемами
2048 Учит заклинаниям
4096 Торгует зачарованными предметами
8192 Торгует зельями
16384 Тренирует
32768 Делает заклинания.
65536 Зачаровывает предметы
131072 Чинит арморы и оружие

REF->xSetService LONG_value
Используется для перемены параметров непися , через значение цифр . Например , Используя значение 8 мы сделаем , чтобы непись торговал книжками .

REF->xModService LONG_value
Модифицирует уже выбранные значения занятий непися.

LONG REF->xGetBaseGold
Возвращает значение , сколько золота есть у непися ( или кричера ).

LONG REF->xGetGold
Возвращает значение количества золота , которым сейчас обладает непись для проведения
торговли.

REF->xSetBaseGold LONG_amount
Изменяет основное количество золота у непися ( или кричера )

REF->xSetGold LONG_amount
Аналогично , но количество золота- которое есть сейчас.

LONG REF->xGetValue
Возвращает значение цены обьекта .

STRING REF->xGetOwner
Возвращает 0 если обьект никому не принадлежит , ID владельца , если кому –то принадлежит , или ”unknown” если он принадлежит какой-то фракции .

FLOAT REF->xGetWeight
Возвращает значение веса обьекта.

FLOAT REF->xGetEncumb
Возвращает полный вес всех обьектов у непися , кричера или у контейнера .

FLOAT REF->xGetQuality
Возвращает значение качества аппаратов для деланья зелий , отмычек и щупов , чинилок.

LONG REF->xGetCondition
Возвращает текущее значение для армора , оружия , отмычек , щупов.

LONG REF->xGetMaxCondition
Возвращает максимальное условие оружию , отмычкам, чинилкам .

FLOAT REF->xGetCharge
Возвращает текущее использование , типа ”когда заклинание использовано” . Постоянный эффект и незачарованые вещи – возвращает 0.

FLOAT REF->xGetMaxCharge
Показывает максимальный эффект заклинания.

LONG REF->xKeyPressed LONG_code
Показывает статус клавиатуры ( и кнопок мыши ) . Что-то похожее на GetPCSneaking , но вообще-то отслеживает , какая кнопка была нажата .Если входной параметр – цифровое значение клавиши ( между 1 и 254 ) будет остлеживать состояние заданной клавиши , если входной параметр 0 – отслеживать нажатие любой клавиши.

LONG, STRING REF->xTextInput STRING_message, LONG_endcode
Это позволяет сразу считать входной сигнал клавиатуры и результаты будут возвращены как ограничение Функция ждет ключа , который нужно набрать , и после этого предпримет одно из 3 действий. Если ключ подходит , то все возвращается. Если код соответствует стандартам ASCII , то возвращается цифра 0 . Если RETURN или BACKSPACE то ничаинается новая линия , или стирается старая .
Пример

l

ong endchar
long message
long length
ifx ( endchar )
else
DisablePlayerControls
set endchar to 13
setx message to xStringBuild ""
set length to 0
return
endif
ifx ( length )
else
setx length message to xTextInput message endchar
.
MessageBox ""
xMessageFix "%s %" message
MessageBox " "
MessageBox "Enter a message and press ENTER when it is complete."
return
endif
EnablePlayerControls ; The message is complete now

LONG, STRING REF->xTextInputAlt STRING_message, LONG_endcode
Функция , идентичная функции xTextInput .

xFileRewind STRING_filename
Двигает текущее положение чтения к началу скрипта.

xFileSeek STRING_filename, LONG_offset
Сдвигает позицию считывания в определенное место файла.

LONG, ... xFileReadText STRING_filename, STRING_pattern
Считывает текст с файла с определенной позиции считывания. Текущая позиция должна быть потом выбрана .

xFileWriteText STRING_filename, STRING_format, ...
Вписывает строку в файл в определенную позицию .

LONG, SHORT, ... xFileReadShort STRING_filename, LONG_NumToRead
Считывает значение и число переменных типа SHORT ( 2 байта ) .

LONG, LONG, ... xFileReadLong STRING_filename, LONG_NumToRead
Аналогично с xFileReadShort , но считывает переменные типа LONG .(4 байта)

LONG, FLOAT, ... xFileReadFloat STRING_filename, LONG_NumToRead
Аналогично , но считывает переменные типа FLOAT.

xFileWriteShort STRING_filename, SHORT_value
Вписывает значение типа SHORT (2 байта) в файл в определенное место

xFileWriteLong STRING_filename, LONG_value
Аналогично , тип LONG

xFileWriteFloat STRING_filename, FLOAT_value
Аналогично , тип float

STRING xPCCellID
Возвращает строку с названием ячейки , в которой игрок.

STRING REF->xMyCellID
Возвращает значение , в котором имя ячейки , в которой определенный обьект .

STRING REF->xGetName
Возвращает имя обьекта , или 0 , если у обьекта нет имени ( не ID , а имя )

STRING REF->xGetBaseID
Возвращает значение основного ID обьекта .

LONG xStringCompare STRING_str1, STRING_str2
Сравнивает 2 строки( обьекта ) в алфавитном порядке , и возвращает 0 , если они идентичны.

LONG xStringLength STRING_string
Возвращает число character’зов во входной строке.

xLogMessage STRING_format, ...
вписывает отформатированные строки коды в файл – лог . ((MWScriptExtender.log) )

xMessageFix STRING_message, ...
Эта функция позволяет вам использовать переменные STRING вместе с функцией MessageBox. Во – первых , команда MessageBox должна сразу следовать после команды
xMessageFix. Во – вторых , число строк для этой функции должно соответствовать числу строк в функции MessageBox. В – третьих , MessageBox имеет кнопки , но не может использовать переменные . И , в конце – концов , значения строк используемых на MessageBox будут заменены значениями xMessageFix .
пример
long thiscell
setx thiscell to fid->xPCCellID
xMessageFix "куда телепортнуть Фаргота ?" thiscell "Сейда Нин" "Красная Гора"
MessageBox "Отправить Фаргота в локацию" "Моя ячейка" "Де он был" "Вос"
Если вы в Кальдере , Арене Вивека или Альдруне , вам выдаст

куда телепортнуть Фаргота


Кальдера

Сейда Нин

Красная Гора

 

куда телепортнуть Фаргота


Вивек, Округ Арены

Сейда Нин

Красная Гора

 

куда телепортнуть Фаргота


Альдрун

Сейда Нин

Красная гора

Примеры скриптов

Этот скрипт отслеживает и выводит массу предмета , на который направлен прицел игрока

begin getweight_of_pctarget

long pctarget
float weight

StopScript getweight_of_pctarget

setx pctarget to xGetPCTarget ; Возвращает 0 если нету цели

if ( pctarget == 0 ) ; Нет цели , поэтому массу не показывает
MessageBox "Вы не нашли предмета для вычисления массы."
return
endif

; гм, теперь если направил
setx weight to pctarget->xGetWeight

MessageBox "The item had weight %f" weight

End

Скрипт , который заставит всех неписей мужиков , кроме Фаргота , бежать на место , на котором сейчас находится игрок

begin siren_call

short call

long prospectref
long prospectid

long temp

float px
float py
float pz

; только для одного фрейма
stopscript siren_call

set px to player->GetPos X
set py to player->GetPos Y
set pz to player->GetPos Z

; проверяем , что за НПС или кричеры в ячейке
setx prospectref to xFirstNPC
whilex ( prospectref )

set call to 1

; проверяем тип , так как мы не хотим , чтобы кричеры тоже шли на это место
setx temp to prospectref->xRefType
if ( temp != 1598246990 ) ; it's not an NPC
set call to 0
endif

; проверяем , мужчина ли это
setx temp to prospect->xIsFemale
if ( temp != 0 ) ; it's not a male
set call to 0
endif

; считываем ID этого НПС , Фаргот ли это
setx prospectid to prospect->xGetBaseID
setx temp to xStringCompare prospectid "fargoth"
if ( temp == 0 ) ; it's Fargoth
set call to 0
endif

;
ifx ( call )
xSetRef prospect
ForceRun
prospect->xAITravel px py pz
endif

setx prospect to xNextRef prospect
endwhile

end


Удачного скриптинга ! http://fullrest.ru/forum/public/style_emoticons/default/17.gif

Redoran_Warrior

Изменено пользователем morrow
Ссылка на комментарий
Поделиться на другие сайты

Скачать версию как документ Microsoft Word _____________________MWSE.rar
Скачать MWEditSE MWSE0.9.2_editor.zip
Скачать МВСЕ http://www.fullrest.ru/load/mwse.html

 

О функциях подробнее:

xsetEffectInfo

xGetClass

Изменено пользователем morrow
Ссылка на комментарий
Поделиться на другие сайты

есть такой тег, крайний справа в панельке под форматированием, для читабельности кусков кода стоило бы применить

Ссылка на комментарий
Поделиться на другие сайты

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

Самый суровый ляп - "reference" это ссылка, указатель на обьект, но никак не какие-то полномочия. И вообще перечитай внимательно все что ты написал, читаешь свой перевод описания функции и думай понятно ли тебе что эта функция делает и как её использовать в скрипте. Если непонятно - разбираешься, описываешь нормально, приводишь примеры скриптов. Без этого толку мало будет.

Если знаешь/разберешься неплохо бы написать про функции работы с файлами, сходу и по твоим описаниям там ничего не понятно

Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...
  • 3 года спустя...
При редактировании MWSE-плагинов в MWEdit не забывайте загружать мастер-файлы! По крайней мере, скрипты точно без этого не компилируются.
Ссылка на комментарий
Поделиться на другие сайты

  • 2 года спустя...
Закрепите пожалуйста, чтоб не убегала тема, а то много полезного справочного материала, чтоб не искать каждый раз.
Ссылка на комментарий
Поделиться на другие сайты

чтоб не искать каждый раз

Добавь в закладки браузера, два клика мышкой всего-то нужно сделать.
Ссылка на комментарий
Поделиться на другие сайты

  • 3 месяца спустя...
  • 2 месяца спустя...

Люди, ну ёлы палы! Руководство лежит на форуме уже семь лет, и хоть кто нибудь бы сказал, что в нем есть ошибки в скрипте Фаргота:

1. В некоторых местах вместо "prospectref" написана необъявленная переменная "prospect"

2. строчку "stopscript siren_call" нужно вынести в самый конец, после endwhile

Использовал его как тест для редактора скриптов, столько времени потерял...

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Люди, ну ёлы палы! Руководство лежит на форуме уже семь лет, и хоть кто нибудь бы сказал, что в нем есть ошибки в скрипте Фаргота:

1. В некоторых местах вместо "prospectref" написана необъявленная переменная "prospect"

2. строчку "stopscript siren_call" нужно вынести в самый конец, после endwhile

Использовал его как тест для редактора скриптов, столько времени потерял...

Обычно не копируют эти скрипты, а пишут свои, по сути тут важно новый принцип работы понять, а использование функций лучше смотреть тут, тем более расписано в каких ситуациях может быть баг, к примеру есть функция xsettrap, ей можно выставить ловушки, либо снять их ( xsettrap 0 ), но написано, что ловушки нельзя выставить или снять с "не закрытых" объектов. Казалось бы мелочь, а можно багов кучи избежать, траты нервов и времени.
Ссылка на комментарий
Поделиться на другие сайты

  • 2 года спустя...

   xsetEffectInfo

  Не очень удобный формат уроков, хрен что найдешь. есть предложение в шапке закрепить ссылки на рассмотренные функции.

Вот по просьбе Эла кой чего рассмотрел в новом мвсе, наверное можно поделиться, так как информации практически не найти, только методом проб и ошибок.

Функция xsetEffectInfo - редактирует характеристики имеющихся эффектов заклинаний. Функция очень перспективная в геймплейных модах. 

Рассмотрим пример:

Begin al
short result
setx result to xseteffectinfo 1279610963 "blind" 1 47 31 1 15 60 5 100
If (result == 1 ) 
Messagebox "Заклинание изменено"
else
Messagebox "Что-то пошло не так"
endif
stopscript Al
end

 

 

Значение result показывает на сколько удачно прошло изменение заклинания.

Теперь подробнее о значениях рассматриваемой функции:

setx result to xseteffectinfo 1279610963 "blind" 1 47 31 1 15 60 5 100

 

1279610963 -id spell, ещё есть id ингредиентов и зачарований,
"blind" -id заклинания
1 -номер эффекта в списке эффектов
47 -id эффекта слепоты
31 -для заклинаний влияющих на атрибут, тут скриптом просто пропускается значение
1 -касанием(0 -на себя, 2 - удаленная цель)
15-область
60 -длительность
5 -минимальное значение
100- максимальное значение эффекта
Всё вроде просто, но столкнулся со следующим:
1 Если номер эффекта в списке указать не равный 1, т.е. не соответствующий действительности, то в игре получим error
2 Если эффект, в нашем случае 47 не соответствует эффекту заклинания, то в игре получим error
И ещё добавлю для ясности, что и откуда брать - вот ссылка
id spell/enchant  ищем в разделе 6.7
ID заклинания берем из редактора
Номер эффекта в списке варьируется от 1 до 8
id эффекта берем в разделе  6.5
Остальное должно быть и так понятно.
P.S. не разбирался с флагами заклинаний, типа автоподсчета стоимости, скорее всего значения, указанные в пункте 6.6 должны суммироваться с 1279610963 
Изменено пользователем mortuus
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Рассмотрим функцию xGetClass

Функция определяет ряд параметров выбранного нами класса, либо класса нпк, имеет три маски(т.е. фильтр по заданным параметрам)

Рассмотрим следующий скрипт, определяющий главные, важные и второстепенные навыки игрока:

 

 

Begin Mort_DS
short state 
long refPlayer
long attributesMask
long majorMask
long minorMask
long classID
long name
long playable
long specialization
long attributes
long majorSkills
long minorSkills
if ( chargenstate >= 0 )
return
endif
 
If ( state == 0 )
setx refPlayer to xGetRef "Player"
setx classID name playable specialization attributes majorSkills minorSkills to refPlayer->xGetClass attributesMask majorMask minorMask 
set state to 1
endif
 
 
if (state == 1 )
if ( majorSkills >=67108864 )
set majorSkills to majorSkills - 67108864
set mort_PCHandToHand to 1
endif
if ( majorSkills >=33554432 )
set majorSkills to majorSkills - 33554432
set mort_PCSpeechcraft to 1
messagebox "Красноречие главный навык"
endif
if ( majorSkills >=16777216 )
set majorSkills to majorSkills - 16777216
set mort_PCMercantile to 1
endif
if ( majorSkills >=8388608 )
set majorSkills to majorSkills - 8388608
set mort_PCMarksman to 1
endif
if ( majorSkills >=4194304 )
set majorSkills to majorSkills - 4194304
set mort_PCShortBlade to 1
endif
if ( majorSkills >=2097152 )
set majorSkills to majorSkills - 2097152
set mort_PCLightArmor to 1
endif
if ( majorSkills >=1048576  )
set majorSkills to majorSkills - 1048576 
set mort_PCAcrobatics to 1
endif
if ( majorSkills >=524288  )
set majorSkills to majorSkills - 524288 
set mort_PCSneak to 1
endif
if ( majorSkills >=262144  )
set majorSkills to majorSkills - 262144 
set mort_PCSecurity to 1
endif
if ( majorSkills >=131072 )
set majorSkills to majorSkills - 131072
set mort_PCUnarmored to 1
endif
if ( majorSkills >=65536 )
set majorSkills to majorSkills - 65536
set mort_PCAlchemy to 1
endif
if ( majorSkills >=32768  )
set majorSkills to majorSkills - 32768 
set mort_PCRestoration to 1
endif
if ( majorSkills >=16384 )
set majorSkills to majorSkills - 16384
set mort_PCMysticism to 1
endif
if ( majorSkills >=8192  )
set majorSkills to majorSkills - 8192 
set mort_PCConjuration to 1
endif
if ( majorSkills >=4096 )
set majorSkills to majorSkills - 4096
set mort_PCIllusion to 1
endif
if ( majorSkills >=2048  )
set majorSkills to majorSkills - 2048 
set mort_PCAlteration to 1
endif
if ( majorSkills >=1024 )
set majorSkills to majorSkills - 1024
set mort_PCDestruction to 1
endif
if ( majorSkills >=512)
set majorSkills to majorSkills - 512
set mort_PCEnchant to 1
endif
if ( majorSkills >=256 )
set majorSkills to majorSkills - 256
set mort_PCAthletics to 1
endif
if ( majorSkills >=128 )
set majorSkills to majorSkills - 128
set mort_PCSpear to 1
endif
if ( majorSkills >=64 )
set majorSkills to majorSkills - 64
set mort_PCAxe to 1
endif
if ( majorSkills >=32 )
set majorSkills to majorSkills - 32
set mort_PCLongBlade to 1
endif
if ( majorSkills >=16 )
set majorSkills to majorSkills - 16
set mort_PCBluntWeapon to 1
endif
if ( majorSkills >=8 )
set majorSkills to majorSkills - 8
set mort_PCHeavyArmor to 1
endif
if ( majorSkills >=4 )
set majorSkills to majorSkills - 4
set mort_PCMediumArmor to 1
endif
if ( majorSkills >=2 )
set majorSkills to majorSkills - 2
set mort_PCArmorer to 1
endif
if ( majorSkills >=1 )
set majorSkills to majorSkills - 1
set mort_PCBlock to 1
endif
set state to 2
endif
if (state == 2 )
if ( minorSkills >=67108864 )
set minorSkills to minorSkills - 67108864
set mort_PCHandToHand to 2
endif
if ( minorSkills >=33554432 )
set minorSkills to minorSkills - 33554432
set mort_PCSpeechcraft to 2
endif
if ( minorSkills >=16777216 )
set minorSkills to minorSkills - 16777216
set mort_PCMercantile to 2
endif
if ( minorSkills >=8388608 )
set minorSkills to minorSkills - 8388608
set mort_PCMarksman to 2
endif
if ( minorSkills >=4194304 )
set minorSkills to minorSkills - 4194304
set mort_PCShortBlade to 2
endif
if ( minorSkills >=2097152 )
set minorSkills to minorSkills - 2097152
set mort_PCLightArmor to 2
endif
if ( minorSkills >=1048576  )
set minorSkills to minorSkills - 1048576 
set mort_PCAcrobatics to 2
endif
if ( minorSkills >=524288  )
set minorSkills to minorSkills - 524288 
set mort_PCSneak to 2
endif
if ( minorSkills >=262144  )
set minorSkills to minorSkills - 262144 
set mort_PCSecurity to 2
endif
if ( minorSkills >=131072 )
set minorSkills to minorSkills - 131072
set mort_PCUnarmored to 2
endif
if ( minorSkills >=65536 )
set minorSkills to minorSkills - 65536
set mort_PCAlchemy to 2
endif
if ( minorSkills >=32768  )
set minorSkills to minorSkills - 32768 
set mort_PCRestoration to 2
endif
if ( minorSkills >=16384 )
set minorSkills to minorSkills - 16384
set mort_PCMysticism to 2
endif
if ( minorSkills >=8192  )
set minorSkills to minorSkills - 8192 
set mort_PCConjuration to 2
endif
if ( minorSkills >=4096 )
set minorSkills to minorSkills - 4096
messagebox "Иллюзии второстепенный навык навык"
set mort_PCIllusion to 2
endif
if ( minorSkills >=2048  )
set minorSkills to minorSkills - 2048 
set mort_PCAlteration to 2
endif
if ( minorSkills >=1024 )
set minorSkills to minorSkills - 1024
set mort_PCDestruction to 2
endif
if ( minorSkills >=512)
set minorSkills to minorSkills - 512
set mort_PCEnchant to 2
endif
if ( minorSkills >=256 )
set minorSkills to minorSkills - 256
set mort_PCAthletics to 2
endif
if ( minorSkills >=128 )
set minorSkills to minorSkills - 128
set mort_PCSpear to 2
endif
if ( minorSkills >=64 )
set minorSkills to minorSkills - 64
set mort_PCAxe to 2
endif
if ( minorSkills >=32 )
set minorSkills to minorSkills - 32
set mort_PCLongBlade to 2
endif
if ( minorSkills >=16 )
set minorSkills to minorSkills - 16
set mort_PCBluntWeapon to 2
endif
if ( minorSkills >=8 )
set minorSkills to minorSkills - 8
set mort_PCHeavyArmor to 2
endif
if ( minorSkills >=4 )
set minorSkills to minorSkills - 4
set mort_PCMediumArmor to 2
endif
if ( minorSkills >=2 )
set minorSkills to minorSkills - 2
set mort_PCArmorer to 2
endif
if ( minorSkills >=1 )
set minorSkills to minorSkills - 1
set mort_PCBlock to 2
endif
set state to 3
endif
end

Разберем детальнее что мы делаем:
setx refPlayer to xGetRef "Player" - эта строка обозначает то, что проверка класса будет выполнена для игрока.
setx classID name playable specialization attributes majorSkills minorSkills to refPlayer->xGetClass attributesMask majorMask minorMask -данная строка считывает значения с нашего класса.
classID -id класса
name -имя класса, то как мы его назвали, либо название выбранного класса
playable - игровой или нет, для собственных классов значение будет 0
specialization -специализация класса, воин, маг, вор. Для воина значение 0, для мага - 1, для вора - 2
attributes -выбранные атрибуты класса, те два навыка, которые мы выбираем. Складывается из суммы id атрибутов, значения можно взять из пункта 8.53.1
majorSkills -сумма id пяти главных навыков, значения можно взять из того же пункта мануала
minorSkills -сумма id пяти важных навыков, значения можно взять из того же пункта мануала
Далее идет подсчет суммы id главных и важных навыков, если значение подходит по условиям, то соответствующая глобальная переменная меняет своё значение на 1 для главных навыков и на 2 для важных, значение переменной для второстепенных навыков остается равным 0. 
 
Подытожим. В целом функция не вносит ничего нового, всё это можно было определить без mwse, но только после выхода из имперской канцелярии. Тут мы можем определить значения на любом этапе игры. Теоретически с этой функцией можно придумать какие-то интересные плагины, типа управления AI для разных классов, по факту же, никто этого делать не будет. Можно сделать так чтоб игрок получал информацию о классе встреченных нпк, но это также не очень интересно. Вообще функция не очень перспективная, на мой субъективный взгляд. 
 
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Не очень удобный формат уроков, хрен что найдешь. есть предложение в шапке закрепить ссылки на рассмотренные функции.

Сделал. Закинул под спойлер километры текста в постах топикстартера.

Ссылка на комментарий
Поделиться на другие сайты

  • 5 недель спустя...

В копилку знаний, если у вас при старте мвсе-скрипта в игре вываливается ошибка:

Trying to RunFunction index greater than function count
The script will not run anymore.

Это значит, что вы внутри простых функций "if"-"elseif" вложили мвсе-команды, компилятор этого не любит.

 

Так же стоит отметить, что в таком случае надо использовать команду "ifx", причем обратной команды elseifx просто... не существует. Если вам она нужна, то иерархия функций должна быть просто вот такая:

else
    ifx ()
    endif
endif

Замечу что endif остается обычный.

 

Ну и да, еще эта патла не понимает булевые функции внутри ifx ( .. ), то есть:

set temp to ( al - 10)
ifx ( temp)
  ...
else ;как раз тут идет нужный нам блок
  ...
endif
Изменено пользователем aL☢
Ссылка на комментарий
Поделиться на другие сайты

  • 5 месяцев спустя...

С помощью каких функций можно узнать текущее значение силы магического эффекта, действующего на актёра? Например, сколько у него сейчас бонуса атаки или светоча?

Ссылка на комментарий
Поделиться на другие сайты

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...