Jump to content
  • Новые материалы

  • Книга, обучающая заклинанию


    Ed_MSL

    В этом уроке будет рассказано, как создать Spell Tome (или проще говоря, книгу, после прочтения которой игроку будет добавлено заклинание). Вам нужно создать книгу, вставить в нее какой-нибудь текст, и добавить скрипт, который будет добавлять игроку заклинание. Если вы ничего не знаете о скриптинге, или вы новичок в TES CS, я надеюсь, что вы сначала почитаете другие обучающие материалы, а затем вернетесь, когда изучите основы. Мой первый скрипт – это прекрасный обучающий материал для изучения азов скриптинга.

    Начало

    Откройте TES CS и загрузите Oblivion.esm (и какой-нибудь существующий файл .esp, если вы хотите добавить книгу, обучающую заклинанию, в него). Если вы планируете создать новый плагин, тогда перейдите в главное меню (File>Save) и сразу сохраните его, назвав, например, SpellTomeTutorial. Это позволит вам избежать возможных проблем с падением редактора при попытке создания нового файла плагина позже, когда вы проделаете большой объем работы и захотите её сохранить.

    Создание тома (книги)

    Откройте Object Window (Окно объектов) и раскройте категории 'Items' > 'Book' > 'Clutter' и выберите 'Book'. Теперь выберите одну из книг в списке (например, 'Book1CheapGuideAnvil'), правый клик на ней и в появившемся меню выберите edit (редактировать). Измените ID на что-то вроде 'aaaSpellTome' (таким образом, ее будет легко найти вверху списка книг. Прим. Если используется расширитель редактора CSE, то добавлять ааа в начало ID нет необходимости, т.к. все записи, добавляемые вашим модом, будут и так на самом верху в своих категориях, к тому же выделены цветом.) и измените name (название) на такое, которое вам нравиться. Также, пока вы еще здесь, очистите весь текст в окне справа, и убедитесь, что у книги нет зачарования (Enchanting), обучения (Teaches) или скрипта (на данный момент). Жмите OK, и когда у вас спросят, желаете ли создать новый объект, выбирайте yes (да).

    firefox_2024-03-31_11-53-08.jpg

    Заклинание

    Вы не сможете создать книгу, обучающую заклинанию, без самого заклинания. В этот момент вы можете выбрать, использовать уже существующее в игре заклинание, или создать новое. Я не буду здесь рассказывать, как создать новое заклинание, но вы можете почитать об этом, например, здесь. Неважно, какой вариант вы выберете, главное то, что вам нужен будет ID заклинания. В этом обучающем материале я буду использовать существующее заклинание 'StandardFrostDamageTarget1Novice'.

    Скрипт

    Нам нужно создать скрипт, который мы прикрепим к нашей книге, и благодаря которому игроку будет добавляться заклинание. Вернемся к главному меню, перейдем Gameplay>Edit Scripts… Идем вперед, открываем окно для написания скриптов и создаем новый скрипт (Script>New). Наберите в окошке текст, который вы видите ниже, и нажмите Save (Сохранить). Далее я объясню, как это работает.

    scn aaaSpellTomeScript
    
    short doonce
    short buttonpressed
    int button
    
    begin onActivate
    	if doonce == 0
    		MessageBox "Вы желаете изучить заклинание Снежный заряд?", "Да", "Нет, возможно позднее"
    		set doonce to 1
    		set buttonpressed to 1
    	else
    		Message "Вы уже получили все знания, которые содержатся в этой книге"
    	endif
    end
    
    begin GameMode
    	if buttonpressed == 1
    		set button to GetButtonPressed
    		if button == 1
    			set doonce to 0
    			set buttonpressed to 0
    			Message "Хорошо, возможно вы пожелаете учиться позднее"
    		elseif button == 0
    			set buttonpressed to 0
    			Player.AddSpell StandardFrostDamageTarget1Novice
    			Message "Используй эти знания мудро"
    		endif
    	endif
    end

    Как работает скрипт

    Первая часть скрипта содержит его название и объявляет переменные.

    scn aaaSpellTomeScript ;название скрипта
    short doonce ;переменная, для того, чтобы скрипт сработал только один раз
    short buttonpressed ;помогает знать, нажал или нет игрок на кнопку
    int button ;здесь будем запоминать какая кнопка была нажата

    Блок OnActivate исполняется каждый раз, когда вы открываете (активируете) книгу, и спрашивает вас, не желаете ли изучить заклинание, если вы его еще не изучили.

    begin onActivate
    	if doonce == 0 ;если указан 0, значит игрок еще не знает заклинание, предлагаем его выучить
    		MessageBox "Вы желаете изучить заклинание Снежный заряд?", "Да", "Нет, возможно позднее"
    		set doonce to 1 ;ставим 1, чтобы более не спрашивать игрока
    		set buttonpressed to 1 ;указываем скрипту, что игрок что-то выбрал
    	else
    		;иначе - говорим игроку, что он уже знает это заклинание.
    		Message "Вы уже получили все знания, которые содержатся в этой книге"
    	endif
    end

    Блок GameMode исполняется каждый фрейм игры, проверяет, была ли нажата кнопка, и срабатывает, если это так.

    begin GameMode
    	if buttonpressed == 1
    		set button to GetButtonPressed ;смотрим, какая кнопка была нажат
    		if button == 1 ;если игрок решил отказаться от изучения
    			set doonce to 0 ;говорим скрипту, что мы должны позже спросить игрока вновь
    			set buttonpressed to 0 ;указываем, что игрок пока что ничего не выбрал
    			Message "Хорошо, возможно вы пожелаете учиться позднее"
    			;подтверждаем выбор игрока
    		elseif button == 0 ;если игрок выбрал вариант "Да", то есть хочет выучить заклинание
    			set buttonpressed to 0 ;говорим скрипту, что хотим закончить проверку нажатий кнопок
    			;добавляем заклинание игроку (не забудьте изменить EditorID на свое заклинание)
    			Player.AddSpell StandardFrostDamageTarget1Novice
    			Message "Используй эти знания мудро" ; подтверждаем выбор игрока
    		endif
    	endif
    end

    Собираем все вместе

    Теперь всё, что нам осталось сделать, это собрать сделанное ранее в кучу. Давайте этим и займемся.

    Откройте окно  редактирования своей книги, выберите в раскрывающемся списке script название своего скрипта (он должен быть в самом вверху). Если вы не можете его найти, перейдите вновь к редактированию своего скрипта и убедитесь, что вы установили тип скрипта как 'object', и сохраните свой скрипт (при этом не должно появится никаких ошибок).

    В этот моменты вы также можете добавить текст в книгу, чтобы описать, что именно дает книга, или просто что-то сказать игроку, который будет это читать. Имейте ввиду, что читать текст игрок будет только после того, как решит, учиться заклинанию или нет. Нажмите OK в окне и сохраните свой мод.

    Тестирование

    Прежде всего, вам нужно убедиться, что вы сохранили свой плагин, после чего вам нужно узнать FormID вашей новой книги заклинаний. Как только вы сделаете это, запустите OblivionLauncher и выберите «Файлы данных». Убедитесь, что ваш плагин
    отмечен и закройте окно.

    Как только вы окажетесь в игре, открывайте консоль (кнопка ~ (тильда)) и набирайте следующее:

    player.addItem [YOURFORMID] 1

    замените [YOURFORMID] на Form ID книги, который вы нашли ранее. Откройте книгу и посмотрите на результат.

    Очень важное отступление от переводчика

    Есть пара важных моментов, на которых вы, наверняка, споткнетесь, если вы еще не являетесь хорошими знатоками редактора (а если вы таковыми являетесь, зачем вы это читаете?). Как узнать Form ID книги и что это вообще такое? Смотрим на картинку:

    firefox_2024-03-31_11-53-43.jpg

    Справа от столбца Editor ID идет на самом деле не столбец Count, как может показаться на первый взгляд. Вы можете видеть там рядом две полоски. Растяните их и увидите, что это скрытый еще один столбец - Form ID. Если вы поспешили записать его для вашей книги и уже готовы мчаться в игру проверять свой мод, я вас еще немного задержу. Посмотрите внимательно на рисунок. Если я зайду в игру и попробую для тестового вызова ввести в консоли что-то вроде этого:

    player.addItem 01000ED3 1

    То, скорее всего, у меня ничего не выйдет. И я сейчас объясню почему. Form ID состоит из восьми цифр в шестнадцатиричной системе исчисления. Первые две это порядковый номер мода. Так как у меня в редакторе загружен мастер-файл Обливиона и мой мод, то первые две цифры предметов из моего мода будут показываться как 01. 00 – это предметы из мастер-файла, можете на рисунке и в редакторе в этом убедиться.

    Однако и это еще не всё. Дело в том, что у вас наверняка стоит Золотое издание Обливиона. А если так, то уже установлены официальные моды. А порядковые номера модов предметам раздаются в момент загрузки их в игру. То есть вот эта запись

    player.addItem 01000ED3 1

    говорит игре – дай мне такой-то предмет из первого загруженного мода (01). Однако, у меня в Золотом издании мой мод стоит после всех официальных. И он получается аж двенадцатым esp-файлом. И чтобы вызвать предмет из него, мне нужно указать в
    порядковом номере цифру 12. Это будет выглядеть вот так:

    player.addItem 0С000ED3 1

    С – это 12 в шестнадцатиричной системе исчисления. Конечно же, есть еще вариант сортировки модов при загрузке с помощью сторонних программ (например, OBMM). В этом случае вы можете принудительно поставить свой мод первым в загрузке и
    протестировать его не задумываясь обо всех этих цифрах.

    Кстати, то, что первые две цифры задают порядковый номер модов – одна из причин, почему мы не можем загрузить в игру более 255 модов. Две шестнадцатиричные цифры, выделеные для нумерации, в сумме могут давать всего лишь 256 комбинаций. Одна из них уже занята мастер-файлом (00). Остается 255.

    Проблемы

    Блок GameMode не выполняется, когда открыто какое-нибудь меню. Поэтому некоторые сообщения могут приходить немного с опозданием, когда вы закроете книгу и выйдете из инвентаря. Лучше (и проще) всего было бы давать игроку заклинание автоматически при активации книги (так как блок OnActivate не выполняется в меню), как бы то ни было, я хотел показать, как использовать MessageBox в данном контексте.

    Скрипт не учитывает, есть ли у игрока уже заклинание или нет. Это можно изменить, используя вместо переменной 'doonce', проверку на наличие у игрока заклинания.

    Книга

    Еще одна проблема – вы не сможете книгу взять или прочитать (кроме тестов, когда вы добавляете книгу в инвентарь через консоль). Если вы хотите, чтобы книгу можно было брать, открывать и читать, нужно просто добавить Activate после OnActivate:

    begin onActivate
    	Activate
    	if doonce == 0
    		MessageBox "Вы желаете изучить заклинание Снежный заряд?", "Да", "Нет, возможно позднее"
    		set doonce to 1
    		set buttonpressed to 1
    	else
    		Message "Вы уже получили все знания, которые содержатся в этой книге"
    	endif
    end

    Теперь вы сможете читать книгу.

    Решение

    Мы можем решить эти проблемы, немного изменив и упростив наш скрипт:

    scn aaaSpellTomeScript
    short doonce
    begin onActivate
    	Activate
    	if doonce == 0
    		Player.AddSpell StandardFrostDamageTarget1Novice
    		Message "Используй эти знания мудро"
    		set doonce to 1
    	endif
    end

    Как видите скрипт стал проще, мы убрали несколько переменных, полностью выкинули второй блок. В этом варианте у нас не будут спрашивать, хотим мы изучить заклинание или не хотим. При первой активации этой книги мы автоматически выучим новое
    заклинание (при этом сможем сделать это лишь один раз) и сможем брать и читать книгу.

    Дополнение от авторов сайта

    На самом деле, данный скрипт, а именно его расширенная версия, не учитывает тот момент, что если книга взята, а заклинание не изучено, чтобы снова появился диалог с предложение изучить заклинание, книгу нужно выбросить из инвентаря и снова активировать. Решить проблему поможет дополнительный блок OnEquip:

    begin OnEquip player
    	if doonce == 0
    		MessageBox "Вы желаете изучить заклинание Снежный заряд?", "Да", "Нет, возможно позднее"
    		set doonce to 1
    		set buttonpressed to 1
    	else
    		Message "Вы уже получили все знания, которые содержатся в этой книге"
    	endif
    end

    И раз уж мы затронули эту тему, то нельзя не вспомнить про официальный DLC - SpellTomes. Он так же добавляет книги с заклинаниями, который игрок может изучить при прочтении. Давайте взглянем на один из его скриптов:

    scn DLCTomeSCRIPTDLCTomeSpellAundaesAura2Apprentice
    
    short button
    short used
    
    begin OnEquip player
    	if used == 0
    		MessageBox "Do you want to add 'Aundae's Aura' to your spell list?", "Yes", "No"
    	endif
    end
    
    begin OnActivate
    	Activate
    	if isActionRef player == 1 && used == 0
    		MessageBox "Do you want to add 'Aundae's Aura' to your spell list?", "Yes", "No"
    	endif
    end
    
    begin menumode
    	set button to getbuttonpressed
    	if button > -1
    		if button == 0
    			; add the spell to the player's spellbook
    			player.addspell DLCTomeSpellAundaesAura2Apprentice
    			playsound SPLRestorationCast
    			set used to 1
    		endif
    	endif
    end

    Как мы видим, отличий не много. Здесь отсутствуют лишние строчки с выводом сообщений, количество кнопок уменьшено до 2-х. Это, в итоге, позволяет нам отказаться от одной дополнительной переменной в коде. Но, в целом, смысл тот же. Работать будут оба варианта.


    Статья взята отсюда: https://modder.ucoz.ru/load/tutorial_po_skriptingu_kniga_obuchajushhaja_zaklinaniju/3-1-0-182, автор: Игорь Лютый (Igor Ra), которая, в свою очередь, является переводом данной статьи.


    User Feedback

    Recommended Comments

    There are no comments to display.



    Create an account or sign in to comment

    You need to be a member in order to leave a comment

    Create an account

    Sign up for a new account in our community. It's easy!

    Register a new account

    Sign in

    Already have an account? Sign in here.

    Sign In Now

×
×
  • Create New...