Опыт создания вариативности миссий с примером

Вдруг кому пригодится, как внести существенное разнообразие в миссию минимальными усилиями.
Файл миссии тут прикрепить нельзя, поэтому код миссии под спойлером.
Копируем в текстовой файл, меняем расширение на .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{}

Суть метода - создание вариативности миссии с использованием генератора случайных чисел.
Другими словами, в зависимости от сгенерированного числа меняется, например, количество техники, место ее появления, маршрут движения и т.д. и т.п. Возможности ограничены лишь фантазией автора миссии.

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

И вот тут важный момент. Раньше я делал много триггеров на каждое сгенерированное случайное число.
Относительно недавно перешел на новый способ с использованием переменных.
Суть в следующем:

  1. Задаем объекты (техника, зоны появления, точки маршрута и т.д.) названием, отличающимся лишь цифрами. В миссии-примере это наземная техника Enemy_01, Enemy_02…Enemy_05. Количество в принципе может быть любым.
  2. Генерируем случайное число от 1 до 5
  3. Задаем переменную с именем “Enemy_”
  4. Приклеиваем сгенерированное число к переменной и получаем, что с помощью минимального количества триггеров мы обращаемся к технике, которая задается случайным образом.

В миссии-примере я немного расширил данный концепт. А именно:

  1. В миссии 5 танков. Тот, который выбирается случайным образом, сначала исчезает на пару секунд, а потом появляется. (Я пока не знаю, как запихнуть случайное число в текст подсказки, чтобы знать, какое именно число сгенерировано)
  2. Если уничтожить любой другой танк, появится сообщение, что уничтожен неправильный танк, а если уничтожить выбранный танк, то сообщение будет другим.

В частности, планирую это использовать в своей миссии по перехвату крылатых ракет, выпущенных с самолета. В небе будет летать много самолетов, среди которых один с ракетами. Какой будет с ракетами - будет задаваться случайным образом.
Т.е. если уничтожить мирный самолет - миссия завершится провалом. И все это описывается минимальным числом триггеров.