Пример скрипта 2
Разберем более сложный пример. Этот скрипт сделан на основе "типового скрипта с предметом". Он отвечает за действия Крыса в игре "Диззи и таинственное письмо".
Фабула такова: Диззи встречает Погги, но общение с ним особо не ладится. С ним до бесконечности можно обмениваться парой фраз. Затем Диззи находит запертую дверь. После этого он встречает персонажа Крыса, который обещает ему дать ключ от двери, но взамен просит сыр. После этого диалога Погги начинает вести себя по другому и огрызаться на просьбу дать ему сыр. В тоже время крыс ругается, если ему попробовать подсунуть что-то кроме сыра. Но если ему дать сыр, то он исчезает, а взамен оставляет ключ.
Вот этот скрипт целиком.
redraw_sprites()
set(j,ret)
ne(ret,0,item) //это уже повторное срабатывание и применение предмета
objget(this,O_STATUS)//проверим говорили с ним или нет
eq(ret,0,talk)
set(ret,SHOW_INVENTORY) //повторное нажатие без предмета
goto(exit)
talk: //не говорили
//Сюда вставляем свой код
showmessage (3,8,143,cl_rat1,cl_rat2,1)
showmessage (5,10,144,cl_rat1,cl_rat2,1)
showmessage (7,12,145,cl_rat1,cl_rat2,1)
showmessage (2,14,146,cl_dizzy,cl_white,1)
showmessage (9,14,147,cl_rat1,cl_rat2,1)
showmessage (4,12,148,cl_dizzy,cl_white,1)
//--------------------
objset(this,O_STATUS,1)
objroomfind(1,14,2)
objset(ret,o_user1,26)
set(ret,NO_INVENTORY)
redraw_screen()
goto(exit)
item:// применили предмет
itemget(j,I_ID)
ne(ret,14,wrong)
//правильный предмет
//Сюда вставляем свой код
showmessage (5,7,150,cl_rat1,cl_rat2,1)
showmessage (1,12,151,cl_teller,cl_white,1)
showmessage (9,9,152,cl_rat1,cl_rat2,1)
showmessage (3,14,153,cl_rat1,cl_rat2,1)
objset(this,o_disabled,true)
itemfind(15)
itemset(ret,i_status,0)
//--------------------
set(ret,NO_INVENTORY)
removeitem()
redraw_screen()
goto(exit)
wrong:
//не правильный предмет
//Сюда вставляем свой код
showmessage (5,7,149,cl_rat1,cl_rat2,1)
//--------------------
set(ret,NO_INVENTORY)
redraw_screen()
exit:
Пройдемся по этому скрипту построчно.
redraw_sprites()
Перерисуем спрайтовые объекты для того, чтобы во время диалогов с экрана не пропал Диззи и прочие объекты рисуемые спрайтами.
Во время работы скриптов, в которых не планируются диалоги перерисовывать спрайты в начале скрипта не нужно.
set(j,ret)
Как вы должны помнить из предыдущих разделов, в переменной RET, при запуске скрипта хранится либо ссылка на предмет, которым подействовали на активный объект, либо 0.
Этой строчкой мы сохраняем данные, хранящиеся в RET в другую переменную J до поры до времени.
ne(ret,0,item)
Здесь проводится проверка: передали какой-нибудь предмет в скрипт или нет. И если предмет был передан т.е. в RET не 0, то происходит переход к метке ITEM.
objget(this,O_STATUS)//проверим говорили с ним или нет
eq(ret,0,talk)
set(ret,SHOW_INVENTORY) //повторное нажатие без предмета
goto(exit)
talk: //не говорили
//Сюда вставляем свой код
showmessage (3,8,143,cl_rat1,cl_rat2,1)
showmessage (5,10,144,cl_rat1,cl_rat2,1)
showmessage (7,12,145,cl_rat1,cl_rat2,1)
showmessage (2,14,146,cl_dizzy,cl_white,1)
showmessage (9,14,147,cl_rat1,cl_rat2,1)
showmessage (4,12,148,cl_dizzy,cl_white,1)
//--------------------
objset(this,O_STATUS,1)
objroomfind(1,14,2)
objset(ret,o_user1,26)
set(ret,NO_INVENTORY)
redraw_screen()
goto(exit)
Весь этот кусок кода обрабатывает ветку, когда к объекту не успели еще применить предмет.
objget(this,O_STATUS)//проверим говорили с ним или нет
Переменная THIS объект, которому принадлежит скрипт. Эта строчка получает значение переменной O_STATUS у текущего объекта. Переменной O_STATUS обычно применяется в скриптах для хранения состояния объекта, однако нельзя забывать, что эта переменная так же используется в движущихся объектах для хранения скорости.
eq(ret,0,talk)
set(ret,SHOW_INVENTORY) //повторное нажатие без предмета
goto(exit)
Здесь происходит вот что. Проверяется полученный статус объекта (он вернулся в переменную RET). Если статус равен нулю, значит с объектом взаимодействуют первый раз и нужно перейти на ветку диалога. Иначе нужно записать в RET значение SHOW_INVENTORY для того, чтобы по завершении работы скрипта было выведено окно инвентаря.
После чего происходит безусловный переход на метку EXIT, которая находится в самом конце скрипта.
Что должно произойти после? После игрок выбирает какой-нибудь предмет в инвентаре. Если он выбирает предмет, а не выходит из инвентаря, то скрипт вызывается еще раз, но уже в переменной RET будет ID выбранного предмета и работа скрипта пойдет по другой ветке - в самом начале будет произведен переход по метке ITEM.
talk: //не говорили
//Сюда вставляем свой код
showmessage (3,8,143,cl_rat1,cl_rat2,1)
showmessage (5,10,144,cl_rat1,cl_rat2,1)
showmessage (7,12,145,cl_rat1,cl_rat2,1)
showmessage (2,14,146,cl_dizzy,cl_white,1)
showmessage (9,14,147,cl_rat1,cl_rat2,1)
showmessage (4,12,148,cl_dizzy,cl_white,1)
Это часть кода, отвечающая за первый диалог. Здесь, в принципе, ни чего интересного. Просто набор вызовов showmessage, однако внимательный скорее всего уже задался вопросом: "что это за цвета такие: cl_rat1, cl_rat2 и cl_dizzy? Их же нет в движке."
И правильно сделает, что задастся. Это не цвета, а подстановки-замены. Их для удобства работы можно настроить в редакторе подстановок. Когда я разрабатывал эту игру, то постоянно забывал какому персонажу какие цвета соответствуюи. Система подстановок пригодилась как нельзя кстати.
objset(this,O_STATUS,1)
Изменим статус активного объекта. Теперь, в следующий раз, скрипт будет знать, что с ним уже взаимодействовали.
objroomfind(1,14,2)
objset(ret,o_user1,26)
Тут происходит смена поведения Погги.
objroomfind(1,14,2)
Ищет Погги с ID =1 в комнате 14,2.
objset(ret,o_user1,26)
Устанавливает новый скрипт с номером 26.
set(ret,NO_INVENTORY)
redraw_screen()
goto(exit)
Тут происходит выход из скрипта.
Первый раз показывать инвентарь не нужно. Значит в RET нужно записать NO_INVENTORY.
После этого нужно обновить экран, чтобы стереть рамки диалогов.
Ну и перейти по метке EXIT, чтобы выйти из скрипта.
item:// применили предмет
itemget(j,I_ID)
ne(ret,14,wrong)
//правильный предмет
//Сюда вставляем свой код
showmessage (5,7,150,cl_rat1,cl_rat2,1)
showmessage (1,12,151,cl_teller,cl_white,1)
showmessage (9,9,152,cl_rat1,cl_rat2,1)
showmessage (3,14,153,cl_rat1,cl_rat2,1)
objset(this,o_disabled,true)
itemfind(15)
itemset(ret,i_status,0)
//--------------------
set(ret,NO_INVENTORY)
removeitem()
redraw_screen()
goto(exit)
wrong:
//не правильный предмет
//Сюда вставляем свой код
showmessage (5,7,149,cl_rat1,cl_rat2,1)
//--------------------
set(ret,NO_INVENTORY)
redraw_screen()
exit:
Далее вторая часть скрипта. Здесь уже идет обработка повторной активации скрипта, когда к нему уже применили предмет.
objget(j,I_ID)
Помните, что мы сохраняли ID примененного предмета в переменную J? Это оно. Тут получается ID примененного предмета.
ne(ret,14,wrong)
А здесь происходит проверка этого номера на тот, что нам нужен. В данном случае Крыс хочет сыр, а сыр в игре имеет номер 14.
//правильный предмет
//Сюда вставляем свой код
showmessage (5,7,150,cl_rat1,cl_rat2,1)
showmessage (1,12,151,cl_teller,cl_white,1)
showmessage (9,9,152,cl_rat1,cl_rat2,1)
showmessage (3,14,153,cl_rat1,cl_rat2,1)
objset(this,o_disabled,true)
itemfind(15)
itemset(ret,i_status,0)
//--------------------
set(ret,NO_INVENTORY)
removeitem()
redraw_screen()
goto(exit)
Этот кусок кода срабатывает, если был применен правильный предмет.
itemfind(15)
itemset(ret,i_status,0)
Ищем указатель на предмет с номером 15 - это ключ.
И устанавливаем его статус в 0. т.е. предмет свободно лежит и может быть поднят.
Изначально там был записан статус 2 т.е. предмет спрятан. Он не находится в инвентаре, но и не выводится на экран.
set(ret,NO_INVENTORY)
Инвентарь больше нет смысла выводить.
removeitem()
Удалить из инвентаря текущий предмет. В данном случае сыр.
wrong:
//не правильный предмет
//Сюда вставляем свой код
showmessage (5,7,149,cl_rat1,cl_rat2,1)
//--------------------
set(ret,NO_INVENTORY)
redraw_screen()
exit:
Последняя часть скрипта. Здесь обрабатывается ветка, когда Крысу дали неправильный предмет.
После всего прочтенного, тут должно быть и так все понятно.
На экран выводится сообщение с руганью Крыса, затем указывается, что инвентарь не нужно выводить,
а после обновляется экран.
Вот и все. После этого разбора, думаю, скриптописание в DizzySE должно стать для вас намного понятнее.
Created with the Personal Edition of HelpNDoc: Easily create HTML Help documents