Таблицы переходов 2.0
Что же такое таблицы переходов? По моему это аналог массивов. Как и к массиву, так и к таблице переходов обращение ведется по индексу. В качестве индекса у таблицы переходов выступает переменная, а правильнее сказать ее значение. Разберем принцип создания и работы таблицы переходов. Для создания таблицы переходов используется следующий опкод:
0871: init_jump_table $peremen total_jumps 7 0 @метка_выхода jumps 0 @метка1 1 @метка2 2 @метка3 3 @метка4 4 @метка5 5 @метка6 6 @метка7 // опкод должен быть записан одной строкой
total_jumps 7 – общее количество переходов, в нашем случае равно семи.
$peremen – переменная, по значению которой и будет осуществляться переход на определенную метку. Отсчет ведется с 0.
@метка_выхода – выход из таблицы.
jumps 0 @метка1 - 6 @метка7 – метки переходов, то есть те метки на которые будет осуществляться переход согласно значению переменной. Цифра 0 перед меткой @метка1 означает то, что если переменная $peremen = 0 то будет произведен переход на метку1 и т.д.
Максимальное количество переходов в строке не может превышать 7. Если же необходимо большее количество переходов, то в паре с опкодом 0871: используется еще и опкод 0872:
Все отсутствующие переходы должны быть заполнены так -1 и метка выхода. В нашем случае это выглядит так -1 @метка_выхода. Так же они заполняются и в случае если переходов меньше 7.
Теперь посмотрим, как же работает таблица переходов.
create_thread @JumpT
:JumpT
03A4: name_thread 'JumpT'
$CHECK=0
:JumpT_1
wait 0 ms
04C4: create_coordinate $X $Y $Z from_actor $PLAYER_ACTOR offset 1.0 3.0 0.0
$Z -=1.1
gosub @Jump_table
actor.Create($Actor,7,$MODEL,$X, $Y, $Z)
actor.Health($Actor)= 1000
07FE: set_actor $Actor fighting_style_to 22@ 6
if
$CHECK ==3
jf @JumpT_2
01B2: give_actor $Actor weapon 5 ammo 3000 // Load the weapon model before using this
:JumpT_2
05E2: actor $Actor kill_actor $PLAYER_ACTOR
:JumpT_3
wait 0 ms
if
actor.Dead($Actor)
jf @JumpT_3
wait 2000 ms
actor.DestroyInstantly($Actor)
$CHECK +=1
:JumpT_4
wait 0 ms
if
4 > $CHECK
jf @JumpT_5
wait 1000 ms
jump @JumpT_1
:JUMP_3_1
wait 0 ms
if and
model.Available(#OMYKARA)
model.Available(#BAT)
jf @JUMP_3_1
04AE: $MODEL = 203
22@ = 8
jump @EXIT_JT
:EXIT_JT
return
Принцип работы.
Переменная $CHECK=0
Командой gosub @Jump_table мы обращаемся к таблице переходов и сразу же производится переход на первую метку, т.е. :JUMP_0 , не забываем что отсчет ведется с 0.
:JUMP_0_1
wait 0 ms
if
model.Available(#VHMYELV)
jf @JUMP_0_1
04AE: $MODEL = 82
22@ = 5
jump @EXIT_JT
и прыгаем на метку выхода.
:EXIT_JT
return
Далее возвращаемся на следующую строку после команды gosub @Jump_table.
Создаем актера, устанавливаем ему стиль борьбы и здоровье. Проверяем, равна ли переменная 3 и если равна то даем ему оружие, а в противном случае сразу идем на метку :JumpT_2 и даем команду актеру атаковать игрока. Делаем проверку, умер ли актер и если умер, то удаляем его, увеличиваем переменную на единицу $CHECK +=1, производим проверку 4 > $CHECK и если больше, то идем на метку jump @JumpT_1. Теперь в таблице переходов будет выбрана метка @JUMP_1, поскольку $CHECK=1 и т.д.