#2 Re: Вопросы по скриптингу » Проверки в скриптовых роликах (SA) » 31-01-2011 09:30

Seemann wrote:

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

Просто мне нужно было, если Си-Джей умрет, вырубить widescreen, сделать так, чтобы игрок опять мог двигаться, и пр., так как в сценке эти команды включаются. Я забыл в вопросе упомянуть об этом.
Но только недавно узнал, что, если ГГ умирает, игра автоматически восстанавливает камеру, убирает черные полосы с экрана, и вообще во многих командах, например как

0489: set_actor $PLAYER_ACTOR muted 1

восстанавливает исходные значения...
И, например, если в блоке Mission Cleanup написать

object.Destroy(4@)

и в самой миссии вообще этот объект не создавать, то игра не вылетит... Так же, если модель удалить, не загрузив... Почему так?

#3 Re: Вопросы по скриптингу » Один вопрос » 26-01-2011 14:32

Voron295,
Я тоже привык так думать, но меня запутал код в оригинальных миссиях. Там тоже ставится эта проверка. Но не всегда. Например, игрока, бывает, замораживают без этой проверки...
А
какое значение она возвращает, когда Сиджей умер? По идее, умер то актер,
но почему в миссиях не оставить только проверку на смерть именно актера? Игру можно начать или новую, или сохраненную. Так как мы не можем сохраняться в миссиях, то, загрузив игру, у нас только начнут действовать потоки для запуска миссий. А там уже используется проверка, есть ли игрок. Тогда смысл использовать ее в миссиях?

#4 Re: Sanny Builder и CLEO » Проблемы со звуком - CLEO 4 » 26-01-2011 12:07

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

#5 Re: Вопросы по скриптингу » Один вопрос » 26-01-2011 11:56

Не понимаю, для чего точно нужен опкод

Player.Defined($PLAYER_CHAR)

И для чего именно нужно его использовать?
Вопрос касается миссий.

В справке СБ (раздел "Условные опкоды") написано:

Player.Defined($PLAYER_CHAR) - игрок найден или уже создан.

Там же, в разделе "Создание миссии, часть 2":

1. Игрок должен быть активен (не пойманным, не утонувшим).

Так что он на самом деле значит?!
Если последнее, то зачем нужна проверка

if
  not Actor.Dead($PLAYER_ACTOR)
jf @...

?
А в миссии еще есть постоянная проверка wasted_or_busted, так получается, без этих двух опкодов можно обойтись? Но нет, в оригинальных миссиях они используются, только я не понял принципа этого использования.
Объясните, пожалуйста, что-то я запутался.

#6 Вопросы по скриптингу » Проверки в скриптовых роликах (SA) » 26-01-2011 11:43

oz91
Replies: 4

При написании миссии возникла следующая проблема.
Как использовать проверки в роликах?
Пример. Я создал триггер, запустил миссию. Привожу отрывок из нее, самое начало. Чтоб лучше было понятно - написал комментарии.

:RIDE
thread "RIDE"
gosub @MIS_ST
if
  wasted_or_busted
then
  gosub @MIS_F
end
gosub @MIS_CL
end_thread

:MIS_ST
increment_mission_attempts

//---- Загружаем телефон и мелодию звонка

model.Load(#CELLPHONE)                
03CF: load_wav 23000 as 1
038B: load_requested_models

:MIS_Z 
if or
  not model.Available(#CELLPHONE)
  83D0:  not wav 1 loaded
jf @Ride1
wait 0
jump @MIS_Z

//-------------------------------------------

:Ride1

//------ Очищаем местность в заданных координатах  

0395: clear_area 1 at -358.3962 1179.3182 19.7422 radius 15.0   
      
//-------Ставим туда игрока и камеру.

Actor.PutAt($PLAYER_ACTOR, -358.0858, 1176.1097, 19.7422)           
actor.Angle($PLAYER_ACTOR) = 294.475
camera.SetPosition(-348.5866, 1181.1206, 19.7422, 0.0, 0.0, 0.0)
camera.PointAt(-360.9038, 1176.1595, 21.9065, 2)
02A3: enable_widescreen 1 

//------- На всякий случай. У игрока оружие - убираем. Игрока преследуют - заставляем их отвязаться.

03BF: set_player $PLAYER_CHAR ignored_by_everyone 1                 
06AB: set_actor $PLAYER_ACTOR all_weapons_hidden 1                    


//------- Здесь начинаются непонятки. До начала миссии я затемнил экран. Я хочу чтобы все действие начало показываться через секунду. Пускаю таймер:
32@ = 0
while 32@ <= 1000
wait 0
  if
    Player.Defined($PLAYER_CHAR)
  then
    if
      not Actor.Dead($PLAYER_ACTOR)
    then
      Continue
    else
      jump @Ride5
    end
  end
end

//-----Первый вопрос: надо ли проверять, что случилось с игроком за эту секунду, как здесь?

0707: start_scene_skip_to @Ride6
0615: define_AS_pack_begin 1@
05D3: AS_actor -1 goto_point -352.5362 1179.427 19.7422 mode 4 3500 ms // versionA
05B9: AS_actor -1 stay_idle 500 ms
0729: AS_actor -1 hold_cellphone 1
0616: define_AS_pack_end 1@ 
0618: assign_actor $PLAYER_ACTOR to_AS_pack 1@ 
fade 1 1000 

//------Задали действия, теперь показываем их игроку

32@ = 0
while 32@ <= 2500
wait 0
  if
    Player.Defined($PLAYER_CHAR)
  then
    if
      not Actor.Dead($PLAYER_ACTOR)
    then
      continue
    else
      061B: remove_references_to_AS_pack 1@
      jump @Ride5
    end
  end
end
03D1: play_wav 1
00BC: show_text_highpriority GXT 'Ride_1' time 2000 flag 1

//------- Суть та же. Я мог написать просто "wait 2500" и пока актер выполняет действия, таймер отсчитал бы эти 2,5 секунды, и на экране в итоге появился текст.

и т.д.

Так нужны ли такие проверки актера каждую секунду? Ведь игрок может ввести чит, и сценка как-нибудь застопорится.

Board footer

Powered by FluxBB