#1 11-06-2013 18:36

Vital
From: Москва
Registered: 07-11-2010
Posts: 64
Website

Устройство макета миссии

Всем привет! Появился вопрос по шаблону миссий, который есть в справке 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

#2 13-06-2013 12:25

Seemann
Registered: 07-08-2006
Posts: 2,110

Re: Устройство макета миссии

При запуске миссии опкодом 0417 в .exe файле дополнительно запускается проверка состояния игрока. Это не скриптовая проверка, а именно проверка внутри .exe Работает она только во время запущенной миссии. В этой проверке проверяется умер ли игрок и поймала ли его полиция. Если это произошло, движок игры автоматически дает команду return для всех gosub в миссии. Поскольку тело миссии заключено в gosub, после смерти/арест игрока, независимо от того, какая часть кода миссии выполнялась, управление передается на следующую после gosub команду. В данном шаблоне это проверка wasted_or_busted. Тем самым скрипт проверяет, что игрок действительно умер или был арестован, в противном случае, миссия была выполнена успешно и произошел обычный возврат из тела миссии. Соответственно, либо запускается код провала, либо миссия просто завершается. Вот так.

Offline

#3 13-06-2013 12:57

Vital
From: Москва
Registered: 07-11-2010
Posts: 64
Website

Re: Устройство макета миссии

@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

#4 13-06-2013 13:35

Sergey81
Registered: 19-12-2008
Posts: 654

Re: Устройство макета миссии

Offline

#5 13-06-2013 18:25

Seemann
Registered: 07-08-2006
Posts: 2,110

Re: Устройство макета миссии

Vital wrote:

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

#6 15-06-2013 12:40

Vital
From: Москва
Registered: 07-11-2010
Posts: 64
Website

Re: Устройство макета миссии

@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

Board footer

Powered by FluxBB