00052. Пример полноценной миссии "Взрывчатка"
Пример полноценной миссии "Взрывчатка"|Всем привет! Давно не было уроков по скриптингу Санни Билдер, так как все известные моменты мы рассмотрели, я решил писать уже не уроки, а примеры полноценных миссий. Сегодня мы будем "хардкорить" в написании миссии, которую я назвал "Взрывчатка".|wmysterio|wmysterio||||Суть миссии в том, что к CJ обращается Свит и сообщает что его машину заминировали. Допустим, что Свит насколько привязан к этой тачки, что решает разминировать её. Нам необходимо привести сапёра, чтобы тот взялся за это нелёгкое дело. Как оказалось, что для этого дела понадобится неординарное решение - чтобы успешно разминировать её, нужно держать скорость автомобиля примерно на скорости 100 км/час. В противном случаи машину не разминировать. Думаю идея понятна.
Хочу добавить, что данная статья не для новичков, а для тех, что более-менее уже понимает чужой код и может дополнить его.
Давайте приступим к написанию кода. Миссию мы будем делать, используя CLEO. Я сочинил простейший стартер, который запустит нашу миссию.
1
{$CLEO .cm}
2
thread 'BOMB'
3
4
gosub @BOMB_RUN
5
if
6
wasted_or_busted
7
jf @BOMB_FINISH
8
gosub @BOMB_FAILED
9
10
:BOMB_FINISH
11
$ONMISSION = 0
12
mission_cleanup
13
end_thread
14
15
:BOMB_RUN
16
increment_mission_attempts
17
$ONMISSION = 1
18
wait 1000
19
fade 1 1000
20
21
// Код миссии
22
23
gosub @BOMB_END
24
0394: play_music 1
25
01E3: show_text_1number_styled GXT 'M_PASS' number 5000 time 5000 style 1
26
Player.Money(0) += 5000
27
return
28
29
:BOMB_FAILED
30
gosub @BOMB_END
31
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1
32
return
33
34
:BOMB_END
35
return
Copied!
А необходимую конструкцию миссии я привёл к такому виду:
1
{$CLEO .cm}
2
thread 'BOMB'
3
4
gosub @BOMB_RUN
5
if
6
wasted_or_busted
7
jf @BOMB_FINISH
8
gosub @BOMB_FAILED
9
10
:BOMB_FINISH
11
$ONMISSION = 0
12
mission_cleanup
13
end_thread
14
15
:BOMB_RUN
16
increment_mission_attempts
17
$ONMISSION = 1
18
wait 1000
19
fade 1 1000
20
21
// Код миссии
22
23
gosub @BOMB_END
24
0394: play_music 1
25
01E3: show_text_1number_styled GXT 'M_PASS' number 5000 time 5000 style 1
26
Player.Money(0) += 5000
27
return
28
29
:BOMB_FAILED
30
gosub @BOMB_END
31
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1
32
return
33
34
:BOMB_END
35
return
Copied!
Приступаем к написанию последовательности скрипта. Прежде всего очищаем местность от всего хлама и рендерим местность для камеры, убрав трафик пешеходов и автомобилей. Создаём неподалёку тачку Свита и садовим его в транспорт. Перемещаем СЖ к нему:
1
03DE: set_pedestrians_density_multiplier_to 0.0
2
01EB: set_traffic_density_multiplier_to 0.0
3
00C0: set_current_time 4 0
4
0395: clear_area 0 at 2514.7581 -1670.5378 12.5749 radius 3.0
5
04E4: refresh_game_renderer_at 2514.7581 -1670.5378
6
023C: load_special_actor 'SWEET' as 1
7
model.Load(#GREENWOO)
8
038B: load_requested_models
9
10
repeat
11
wait 0
12
until 023D: special_actor 1 loaded
13
14
[email protected] = Car.Create(#GREENWOO, 2517.1985, -1665.6057, 12.7179)
15
Car.Angle([email protected]) = 96.3102
16
0229: set_car [email protected] primary_color_to 0 secondary_color_to 1
17
01C8: [email protected] = create_actor_pedtype 23 model #SPECIAL01 in_car [email protected] passenger_seat 0
18
077A: set_actor [email protected] acquaintance 0 to_actors_pedtype 0
19
0296: unload_special_actor 1
20
Model.Destroy(#GREENWOO)
21
Actor.PutAt($PLAYER_ACTOR, 2516.5964, -1663.8156, 12.8959)
22
Actor.Angle($PLAYER_ACTOR) = 203.1531
Copied!
Ставим нашим героям иммунитеты и устанавливаем камеру для видеоролика. Дальше пишем код пропуска этого видеоролика:
1
Car.SetImmunities([email protected], 1, 1, 1, 1, 1)
2
Actor.SetImmunities([email protected], 1, 1, 1, 1, 1)
3
015F: set_camera_position 2513.7539 -1666.6892 14.5696 rotation 0.0 0.0 0.0
4
0160: set_camera_point_at 2516.5203 -1664.2532 13.8745 switchstyle 2
5
wait 1000
6
00BE: text_clear_all
7
03E6: remove_text_box
8
0826: enable_hud 0
9
0581: enable_radar 0
10
02A3: enable_widescreen 1
11
05BF: AS_actor [email protected] look_at_actor $PLAYER_ACTOR 20000 ms
12
05BF: AS_actor $PLAYER_ACTOR look_at_actor [email protected] 20000 ms
13
fade 1 1000
14
0707: start_scene_skip_to @BOMB_END_SCENE_1
15
wait 1000
16
// Диалог
17
18
:BOMB_END_SCENE_1
19
fade 0 1000
20
0701: end_scene_skip
21
wait 1000
Copied!
Используется анимация PED, актёры смотрят друг на друга и шевелят губами. По окончанию диалога, как и при нажатии клавиши Пробел` идёт затемнение экрана, СЖ перемещается в транспорт, за руль. Камера сбрасывается в обычный режим.
Далее, по-сюжету, мы должны приехать к сапёру, и подобрать его. Организуем простой цикл, в котором нельзя ехать больше 100 км/час. В нём же не допустим смерти тачки и Свита:
1
Player.CanMove(0, 1)
2
Actor.SetImmunities($PLAYER_ACTOR, 0, 0, 0, 0, 0)
3
Car.SetImmunities([email protected], 0, 0, 0, 0, 0)
4
Actor.SetImmunities([email protected], 0, 0, 0, 0, 0)
7
8
9
wait 0
10
if or
11
0741: actor $PLAYER_ACTOR busted
12
Actor.Dead($PLAYER_ACTOR)
13
then
15
continue
16
end
17
if or
18
02BF: car [email protected] sunk
19
car.Wrecked([email protected])
20
then
22
continue
23
end
24
if
25
Actor.Dead([email protected])
26
then
28
continue
29
end
32
if
34
then
35
then
37
continue
38
end
39
if and
40
41
Actor.InCar($PLAYER_ACTOR, [email protected])
43
then
44
Marker.Disable([email protected])
45
Marker.Disable([email protected])
46
018A: [email protected] = create_checkpoint_at 2336.2732 -1679.54 12.2143
47
03BC: [email protected] = create_sphere_at 2336.2732 -1679.54 12.2143 radius 2.0
48
0AD1: show_formatted_text_highpriority "O¦£pa¢ž¬¦ec© k ~y~ca£epy~w~!" time 3000
50
continue
51
end
52
if or
53
not Actor.InCar($PLAYER_ACTOR, [email protected])
55
then
56
if
58
then
59
Marker.Disable([email protected])
60
03BD: destroy_sphere [email protected]
61
[email protected] = Marker.CreateAboveActor([email protected])
62
[email protected] = Marker.CreateAboveCar([email protected])
63
0AD1: show_formatted_text_highpriority "Cašœ¦ec© ¢ ~b~¯a¥œ®y~w~!" time 3000
65
continue
66
end
67
end
68
if AND
70
00EC: actor $PLAYER_ACTOR sphere 0 near_point 2336.2732 -1679.54 radius 2.0 2.0
71
then
73
end
74
end
75
76
Marker.Disable([email protected])
77
03BD: destroy_sphere [email protected]
78
Marker.Disable([email protected])
79
Marker.Disable([email protected])
80
if
82
then
83
jump @BOMB_FINISH_SWEET_DEAD
84
end
85
if
87
then
88
jump @BOMB_FINISH_CAR_DEAD
89
end
90
if
92
then
93
jump @BOMB_FAILED
94
end
95
if
97
then
98
jump @BOMB_SPEED
99
end
100
101
Player.CanMove(0, 0)
102
Actor.SetImmunities($PLAYER_ACTOR, 1, 1, 1, 1, 1)
103
Car.SetImmunities([email protected], 1, 1, 1, 1, 1)
104
Actor.SetImmunities([email protected], 1, 1, 1, 1, 1)
105
fade 0 1000
106
wait 1000
107
// Следующая мини-сцена
108
109
{ блоки провала }
110
:BOMB_FINISH_SWEET_DEAD
111
gosub @BOMB_END
112
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1
113
0AD1: show_formatted_text_highpriority "Cўњ¦ yЇep!" time 3000
114
return
115
116
:BOMB_FINISH_CAR_DEAD
117
gosub @BOMB_END
118
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1
119
0AD1: show_formatted_text_highpriority "–aҐњ®a y®њ¤¦o›e®a!" time 3000
120
return
121
122
:BOMB_SPEED
123
gosub @BOMB_END
124
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1
125
0AD1: show_formatted_text_highpriority "‹Ё ЈpeўЁcњћњ ckopoc¦©!" time 3000
126
return
Copied!
Дальше нужно организовать цикл, в котором будут условия обезвреживания бомбы. Как сказал в диалогах сапёр, нужно проверить на открытия двери, чтобы взорвать транспорт. Это можно осуществить путём проверки к-ва занятых мест. Если такое число превышает 0, то это значит, что кто-то покинул траспорт, тем самым открыв дверь. Цикл будел разделён на три этапа:
  • Когда игрок не набрал 100 км/час
  • Когда уже набрал такую скорость, включается таймер
  • Ожидание времени. Для полного хардкора включим трафик, чтобы игрок попотел :)
2
[email protected] = 1 // etap
3
02E3: $CAR_SPEED = car [email protected] speed
4
008C: $CAR_SPEED = float $CAR_SPEED to_integer
5
04F7: status_text $CAR_SPEED type 0 line 1 GXT 'DEF0' // global_variable // Score
6
$TIMER = 60000
7
8
9
wait 0
10
if or
11
02BF: car [email protected] sunk
12
car.Wrecked([email protected])
13
then
15
continue
16
end
17
if
18
Actor.Dead([email protected])
19
then
21
continue
22
end
23
if
24
Actor.Dead([email protected])
25
then
27
continue
28
end
29
30
01E9: [email protected] = car [email protected] num_passengers
32
33
if OR
34
87D6: not [email protected] == $PLAYER_ACTOR // @ == $ (int)
35
36
then
37
020B: explode_car [email protected]
38
continue
39
end
40
41
02E3: $CAR_SPEED = car [email protected] speed
42
$CAR_SPEED *= 3.2
43
008C: $CAR_SPEED = float $CAR_SPEED to_integer
44
45
if AND
47
$CAR_SPEED > 100
48
then
50
continue
51
end
52
53
if
55
then
56
03C3: set_timer_to $TIMER type 1 GXT 'DEF1' // global_variable // Time
58
end
59
60
if AND
62
Actor.InCar($PLAYER_ACTOR, [email protected])
63
100 > $CAR_SPEED
64
then
65
020B: explode_car [email protected]
66
continue
67
end
68
69
if AND
71
Actor.InCar($PLAYER_ACTOR, [email protected])
72
$TIMER == 0
73
then
75
end
76
end
77
78
014F: stop_timer $TIMER
79
0151: remove_status_text $CAR_SPEED
80
if
82
then
83
jump @BOMB_FINISH_CAR_DEAD
84
end
85
if
87
then
88
jump @BOMB_FINISH_SWEET_DEAD
89
end
90
if
92
then
93
jump @BOMB_FINISH_SAP_DEAD
94
end
Copied!
Нам осталось только написать код, который выгружает из памяти все ненужные объекты:
1
:BOMB_END
2
if
3
056D: actor [email protected] defined
4
then
5
Actor.RemoveReferences([email protected])
6
Actor.DestroyInstantly([email protected])
7
end
8
if
9
056D: actor [email protected] defined
10
then
11
Actor.RemoveReferences([email protected])
12
Actor.DestroyInstantly([email protected])
13
end
14
if
15
056E: car [email protected] defined
16
then
17
Car.RemoveReferences([email protected])
18
if
19
not Actor.InCar($PLAYER_ACTOR, [email protected])
20
then
21
Car.Destroy([email protected])
22
end
23
end
24
return
Copied!
Результат нашей миссии:
Вам задание: Дописать миссию до логического завершения - нужно приехать к дому Свита. На этом урок окончен. С Вами был wmysterio, всего доброго!
P.S Исходники вы можете скачать здесь. Улучшайте миссию на свой вкус.|1238|1|0|12857216png800480400240``\|79472534png800480400240``||primer_polnocennoj_missii_vzryvchatka|1504598907
Copy link
Edit on GitHub