Вдруг кому пригодится, как внести существенное разнообразие в миссию минимальными усилиями.
Файл миссии тут прикрепить нельзя, поэтому код миссии под спойлером.
Копируем в текстовой файл, меняем расширение на .blk и кладем в папку с пользовательскими миссиями.
Код миссии
selected_tag:t=“”
bin_dump_file:t=“”
mission_settings{
player{
army:i=1
wing:t=“Player”
}
player_teamB{
army:i=2
}
mission{
type:t=“singleMission”
level:t=“levels/wake_island.bin”
environment:t=“Day”
weather:t=“good”
locName:t=“Wake Island - RND Test”
locDesc:t=“RND Numbers test”
}
}
imports{}
triggers{
isCategory:b=yes
is_enabled:b=yes
“RND Generate”{
is_enabled:b=yes
comments:t=“”
props{
actionsType:t="PERFORM_ONE_BY_ONE"
conditionsType:t="ALL"
enableAfterComplete:b=no
}
events{
initMission{}
}
conditions{}
actions{
varSetRandomInt{
var:t="RND"
from:i=1
to_not_including:i=6
}
varAddString{
value:t=""
digits:i=2
var:t="E_Tank_Right"
input_var:t="RND"
}
unitSetProperties{
object:t="Enemy_01"
object:t="Enemy_02"
object:t="Enemy_03"
object:t="Enemy_04"
object:t="Enemy_05"
attack_type:t="dont_aim"
}
wait{
time:r=2
}
unitPutToSleep{
target:t="@E_Tank_Right"
}
wait{
time:r=3
}
unitWakeUp{
target:t="@E_Tank_Right"
}
}
else_actions{}
}
“Addition Constant Generation”{
is_enabled:b=yes
comments:t=“”
props{
actionsType:t="PERFORM_ONE_BY_ONE"
conditionsType:t="ALL"
enableAfterComplete:b=yes
}
events{
periodicEvent{
time:r=0.001
}
}
conditions{}
actions{
varSetString{
value:t="Enemy_"
var:t="E_Tank_Wrong+"
}
varSetInt{
value:i=0
var:t="fakeRND"
input_var:t="RND"
}
varSetRandomInt{
var:t="AddRND"
from:i=1
to_not_including:i=6
check_prev_value:t="AddRND"
}
varModify{
operator:t="subAB"
value:r=1
var:t="fakeRND"
var_value:t="AddRND"
}
varAddString{
value:t=""
digits:i=2
var:t="E_Tank_Wrong+"
input_var:t="AddRND"
}
varSetRandomInt{
var:t="MinusRND"
from:i=0
to_not_including:i=10
var_to_not_including:t="RND"
check_prev_value:t="MinusRND"
}
varSetString{
value:t="Enemy_"
var:t="E_Tank_Wrong-"
}
varAddString{
value:t=""
digits:i=2
var:t="E_Tank_Wrong-"
input_var:t="MinusRND"
}
}
else_actions{}
}
“Wrong Tank Killed”{
is_enabled:b=yes
comments:t=“”
props{
actionsType:t="PERFORM_ONE_BY_ONE"
conditionsType:t="ANY"
enableAfterComplete:b=yes
}
events{
periodicEvent{
time:r=0.01
}
}
conditions{
unitWhenKilled{
target:t="@E_Tank_Wrong+"
}
unitWhenKilled{
target:t="@E_Tank_Wrong-"
}
}
actions{
playHint{
hintType:t="standard"
name:t="You killed wrong tank!"
action:t="show"
shouldFadeOut:b=no
isOverFade:b=no
time:r=3
priority:i=0
target_marking:i=0
object_var_name:t=""
object_var_comp_op:t="equal"
object_var_value:i=0
}
}
else_actions{}
}
“Right Tank KiIled”{
is_enabled:b=yes
comments:t=“”
props{
actionsType:t="PERFORM_ONE_BY_ONE"
conditionsType:t="ANY"
enableAfterComplete:b=no
}
events{
periodicEvent{
time:r=0.01
}
}
conditions{
unitWhenKilled{
target:t="@E_Tank_Right"
}
}
actions{
playHint{
hintType:t="standard"
name:t="You killed right tank"
action:t="show"
shouldFadeOut:b=no
isOverFade:b=no
time:r=5
priority:i=0
target_marking:i=0
object_var_name:t=""
object_var_comp_op:t="equal"
object_var_value:i=0
}
}
else_actions{}
}
}
mission_objectives{
isCategory:b=yes
is_enabled:b=yes
}
variables{
RND:i=5
AddRND:i=7
E_Tank_Right:t=“Enemy_”
“E_Tank_Wrong+”:t=“Enemy_”
E_Tank_Wrong-:t=“Enemy_”
MinusRND:i=1
fakeRND:i=1
}
dialogs{}
airfields{}
effects{}
units{
tankModels{
name:t=“Player”
tm:m=[[1, 0, 0] [0, 1, 0] [0, 0, 1] [1466.18, 16.8656, -2060.61]]
unit_class:t=“ussr_t_90m_2020”
objLayer:i=1
closed_waypoints:b=no
isShipSpline:b=no
shipTurnRadius:r=100
weapons:t=“”
bullets0:t=“125mm_ussr_3BM42_APDS_FS_ammo_pack”
bullets1:t=“”
bullets2:t=“”
bullets3:t=“”
bulletsCount0:i=40
bulletsCount1:i=0
bulletsCount2:i=0
bulletsCount3:i=0
crewSkillK:r=0
applyAllMods:b=no
props{
army:i=1
count:i=1
formation_type:t="rows"
formation_div:i=3
formation_step:p2=2.5, 2
formation_noise:p2=0.1, 0.1
}
way{}
}
tankModels{
name:t=“Enemy_01”
tm:m=[[1, 0, 0] [0, 1, 0] [0, 0, 1] [1554.27, 16.724, -2021.85]]
unit_class:t=“uk_m3_stuart”
objLayer:i=1
closed_waypoints:b=no
isShipSpline:b=no
shipTurnRadius:r=100
weapons:t=“”
bullets0:t=“”
bullets1:t=“”
bullets2:t=“”
bullets3:t=“”
bulletsCount0:i=0
bulletsCount1:i=0
bulletsCount2:i=0
bulletsCount3:i=0
crewSkillK:r=0
applyAllMods:b=no
props{
army:i=2
count:i=1
formation_type:t="rows"
formation_div:i=3
formation_step:p2=2.5, 2
formation_noise:p2=0.1, 0.1
}
way{}
}
tankModels{
name:t=“Enemy_02”
tm:m=[[1, 0, 0] [0, 1, 0] [0, 0, 1] [1555.69, 16.724, -2047.44]]
unit_class:t=“uk_m3_stuart”
objLayer:i=1
closed_waypoints:b=no
isShipSpline:b=no
shipTurnRadius:r=100
weapons:t=“”
bullets0:t=“”
bullets1:t=“”
bullets2:t=“”
bullets3:t=“”
bulletsCount0:i=0
bulletsCount1:i=0
bulletsCount2:i=0
bulletsCount3:i=0
crewSkillK:r=0
applyAllMods:b=no
props{
army:i=2
count:i=1
formation_type:t="rows"
formation_div:i=3
formation_step:p2=2.5, 2
formation_noise:p2=0.1, 0.1
}
way{}
}
tankModels{
name:t=“Enemy_03”
tm:m=[[1, 0, 0] [0, 1, 0] [0, 0, 1] [1558.13, 16.724, -2067.43]]
unit_class:t=“uk_m3_stuart”
objLayer:i=1
closed_waypoints:b=no
isShipSpline:b=no
shipTurnRadius:r=100
weapons:t=“”
bullets0:t=“”
bullets1:t=“”
bullets2:t=“”
bullets3:t=“”
bulletsCount0:i=0
bulletsCount1:i=0
bulletsCount2:i=0
bulletsCount3:i=0
crewSkillK:r=0
applyAllMods:b=no
props{
army:i=2
count:i=1
formation_type:t="rows"
formation_div:i=3
formation_step:p2=2.5, 2
formation_noise:p2=0.1, 0.1
}
way{}
}
tankModels{
name:t=“Enemy_04”
tm:m=[[1, 0, 0] [0, 1, 0] [0, 0, 1] [1556.93, 16.724, -2086.87]]
unit_class:t=“uk_m3_stuart”
objLayer:i=1
closed_waypoints:b=no
isShipSpline:b=no
shipTurnRadius:r=100
weapons:t=“”
bullets0:t=“”
bullets1:t=“”
bullets2:t=“”
bullets3:t=“”
bulletsCount0:i=0
bulletsCount1:i=0
bulletsCount2:i=0
bulletsCount3:i=0
crewSkillK:r=0
applyAllMods:b=no
props{
army:i=2
count:i=1
formation_type:t="rows"
formation_div:i=3
formation_step:p2=2.5, 2
formation_noise:p2=0.1, 0.1
}
way{}
}
tankModels{
name:t=“Enemy_05”
tm:m=[[1, 0, 0] [0, 1, 0] [0, 0, 1] [1558.53, 16.7241, -2106.91]]
unit_class:t=“uk_m3_stuart”
objLayer:i=1
closed_waypoints:b=no
isShipSpline:b=no
shipTurnRadius:r=100
weapons:t=“”
bullets0:t=“”
bullets1:t=“”
bullets2:t=“”
bullets3:t=“”
bulletsCount0:i=0
bulletsCount1:i=0
bulletsCount2:i=0
bulletsCount3:i=0
crewSkillK:r=0
applyAllMods:b=no
props{
army:i=2
count:i=1
formation_type:t="rows"
formation_div:i=3
formation_step:p2=2.5, 2
formation_noise:p2=0.1, 0.1
}
way{}
}
}
areas{}
objLayers{
layer{
enabled:b=yes
}
layer{
enabled:b=yes
}
layer{
enabled:b=yes
}
layer{
enabled:b=yes
}
}
wayPoints{}
Суть метода - создание вариативности миссии с использованием генератора случайных чисел.
Другими словами, в зависимости от сгенерированного числа меняется, например, количество техники, место ее появления, маршрут движения и т.д. и т.п. Возможности ограничены лишь фантазией автора миссии.
Например, в некоторых моих миссиях есть этап, где надо отбивать атаки вражеской авиации. Миссии сделаны так, что враг появляется со случайного направления. От этого миссия играется каждый раз по разному.
И вот тут важный момент. Раньше я делал много триггеров на каждое сгенерированное случайное число.
Относительно недавно перешел на новый способ с использованием переменных.
Суть в следующем:
- Задаем объекты (техника, зоны появления, точки маршрута и т.д.) названием, отличающимся лишь цифрами. В миссии-примере это наземная техника Enemy_01, Enemy_02…Enemy_05. Количество в принципе может быть любым.
- Генерируем случайное число от 1 до 5
- Задаем переменную с именем “Enemy_”
- Приклеиваем сгенерированное число к переменной и получаем, что с помощью минимального количества триггеров мы обращаемся к технике, которая задается случайным образом.
В миссии-примере я немного расширил данный концепт. А именно:
- В миссии 5 танков. Тот, который выбирается случайным образом, сначала исчезает на пару секунд, а потом появляется. (Я пока не знаю, как запихнуть случайное число в текст подсказки, чтобы знать, какое именно число сгенерировано)
- Если уничтожить любой другой танк, появится сообщение, что уничтожен неправильный танк, а если уничтожить выбранный танк, то сообщение будет другим.
В частности, планирую это использовать в своей миссии по перехвату крылатых ракет, выпущенных с самолета. В небе будет летать много самолетов, среди которых один с ракетами. Какой будет с ракетами - будет задаваться случайным образом.
Т.е. если уничтожить мирный самолет - миссия завершится провалом. И все это описывается минимальным числом триггеров.