You are not logged in.
Pages: 1
Всем привет! Появился вопрос по шаблону миссий, который есть в справке SB и используется, наверно, всеми, кто создаёт миссии.
[c]:MISSION_0
thread 'MISSION_0'
gosub @MISSION_0_29_57 //Код самой миссии
if
wasted_or_busted
jf @MISSION_0_29_46
gosub @MISSION_0_29_144 //Код провала
:MISSION_0_29_46
$ONMISSION = 0
mission_cleanup
end_thread[/c]
По этой структуре есть парочка вопросов.
Во-первых, мы видим здесь gosub, ведущий к коду миссии. Следовательно, работа :MISSION_0 должна приостановиться, пока не завершится gosub (командой return). Но, по словам всех, кто делает миссии, проверка, стоящая после этого перехода с возвратом, работает постоянно. Как это вообще возможно, если выхода из gosub ещё не было?
Во-вторых, странен и другой факт. Если проверка работает постоянно вне зависимости от завершения первого gosub, то миссия уже должна завершиться, так как при верном условии (wasted_or_busted) игра идёт к коду провала, но при ложном выполняется код очистки миссии ($ONMISSION = 0 ; mission_cleanup).
Надеюсь, кто-нибудь разъяснит эти странности в работе миссии, ведь это и впрямь выходит из всех законов, которые всегда действуют в скриптинге.
Offline
При запуске миссии опкодом 0417 в .exe файле дополнительно запускается проверка состояния игрока. Это не скриптовая проверка, а именно проверка внутри .exe Работает она только во время запущенной миссии. В этой проверке проверяется умер ли игрок и поймала ли его полиция. Если это произошло, движок игры автоматически дает команду return для всех gosub в миссии. Поскольку тело миссии заключено в gosub, после смерти/арест игрока, независимо от того, какая часть кода миссии выполнялась, управление передается на следующую после gosub команду. В данном шаблоне это проверка wasted_or_busted. Тем самым скрипт проверяет, что игрок действительно умер или был арестован, в противном случае, миссия была выполнена успешно и произошел обычный возврат из тела миссии. Соответственно, либо запускается код провала, либо миссия просто завершается. Вот так.
Offline
@Seemann - спасибо большое за разъяснение. На самом деле очень интересно. По этому поводу есть ещё тогда несколько вопросов:
1) Это работает только для .scm миссий, или .cm тоже могут работать таким образом?
2) Нельзя ли запустить эту проверку вне миссий? К примеру, для обычного потока, чтобы было легче контролировать деятельность скрипта.
3) Я видел такие опкоды:
set_wb_check_to 0 create_thread_wb
Насколько я понимаю, wb означает сокращённое "wasted_or_busted". Если это так, то выходит, что можно создать такой поток, который работает с этим условием. И можно зачем-то отключить эту проверку, видимо.
В общем, здорово, интересно, теперь не буду так бояться, что миссии надо писать сложно, с кучей однотипных условий на смерть игрока. Кстати, player.defined тоже проверяется? Или игрок после создания не существует только тогда, когда мёртв или арестован?
Спасибо большое за ответы!
P.S. Удачи с Sanny Builder! Рад, что работа над ним продолжается.
Last edited by Vital (13-06-2013 12:57)
Offline
Offline
1) Это работает только для .scm миссий, или .cm тоже могут работать таким образом?
CLEO-миссия работает абсолютно идентично обычной миссии.
2) Нельзя ли запустить эту проверку вне миссий? К примеру, для обычного потока, чтобы было легче контролировать деятельность скрипта.
Можно. При запуске миссии, в структуре потока (thread), который соответствует этой миссии, выставляется два флага. Один используется для проверки WastedBusted, о которой я говорил выше. Второй указывает, что это миссия, и в случае провала надо делать return со всех gosub. Если выставить эти флаги, то простой поток будет работать как миссия. Тогда нужно оформить его как миссию
:my_wb_thread gosub @thread_body // fail block end_thread :thread_body // return
но я не знаю, как игра поведет себя в таком случае. надо тестировать.
Вы спросите, а что это за флаги. Вот они
+198 = [boolean] Mission flag 0xC6 +220 = [boolean] Mission flag 0xDC
http://www.gtamodding.com/index.php?tit … 29#Threads
Установить их можно, используя опкод 0A9F http://cleo.sannybuilder.com/?id=2#0A9F
Я видел такие опкоды
00D7 и 004F идентичны и создают одинаковые потоки. Разница в том, что 004F позволяет при создании потока установить значения его локальных переменных (передать параметры в поток).
Кстати, player.defined тоже проверяется?
player.defined это то же самое, что wasted_busted
Offline
@Seemann - спасибо огромное за ответы! Теперь пробую создать cleo миссию, вроде всё работает, как надо, этот шаблон действительно хорош. Я лишь его представил в немного другом виде, без меток, с циклом while true и чуть сократил его:
//$PLAYER_ACTOR $ONMISSION $PLAYER_GROUP {$CLEO .cm} 0000: while true //1 $ONMISSION = 1 wait 0 gosub @Mission if //2 wasted_or_busted then //Mission failed 00BA: show_text_styled GXT 'M_FAIL' time 2000 style 1 0A92: create_custom_thread "KillerSt.cs" break else //Mission complete 01E3: text_1number_styled 'M_PASS' 3500 5000 ms 4 Player.Money(0) += 3500 0110: clear_player 0 wanted_level 0394: play_music 1 break end //2 end //1 mission_cleanup $ONMISSION = 0 end_thread //The end of cleo mission
Есть ещё пара маленьких вопросиков по миссиям, насчёт маркеров: почему созданный с помощью marker.createAboveActor маркер не работает? Он просто не отображается.
И хотел бы узнать насчёт cleanup списка. Актёры в него входят прекрасно, удаляясь при завершении миссии. Всё то же самое относится к машинам, пикапам и объектам? Выгружаются ли модели после cleanup? И можно ли самостоятельно добавить что-либо (например, пикап, который, увы, не удаляется после миссии) в список удаления?
Заранее спасибо!
Offline
Pages: 1