Перейти к основному содержимому

20.16. Как заставить действия выводиться в нужном мне порядке?

В: Как заставить действия выводиться в нужном мне порядке?

О: Чтобы действия появлялись в нужном порядке, необходимо чётко понимать, как именно выводятся действия в QSP.

В первую очередь выводятся базовые действия локации. Это те действия, которые мы добавляем при помощи специального окна в Quest Generator. Они выводятся в том порядке, в котором прописаны в этом окне.

Во вторую очередь выводятся действия, прописанные в поле "выполнить при посещении" в Quest Generator с помощью оператора act. Точно так же они выводятся в том порядке, в каком вы их прописываете, то есть в порядке чтения кода плеером.

Таким образом, чтобы действия выводились в нужном вам порядке, необходимо прямо в окне базовых действий и поле "выполнить при посещении" расположить их так, как вы хотите, чтобы они выводились.

Например:

act "Первое действие":
*pl "Действие вверху списка"
end
act "Второе действие":
*pl "Действие в середине списка"
end
act "Третье действие":
*pl "Действие внизу списка"
end

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

Пример:

usehtml=1
! записываем действия в массив

if arrsize('$act_array')=0:
! непосредственно действие

$act_array[0]={
act "Первое действие":
$text+="Теперь порядок действий меняется.<br>"
! в самом действии есть код замены

i=arrpos('$id_array',"первое")
$act_array[]=$act_array[i]
$id_array[]=$id_array[i]
killvar '$act_array',i
killvar '$id_array',i
! чтобы список обновился на экране

goto $curloc
end
}
! а здесь лежит идентификатор действия

$id_array[0]="первое"
$act_array[1]={
act "Второе действие":
$text+="Раньше это действие было в середине списка.<br>"
i=arrpos('$id_array',"второе")
$act_array[]=$act_array[i]
$id_array[]=$id_array[i]
killvar '$act_array',i
killvar '$id_array',i
goto $curloc
end
}
$id_array[1]="второе"
$act_array[2]={
act "Третье действие":
$text+="Теперь действия меняются местами.<br>"
i=arrpos('$id_array',"третье")
$act_array[]=$act_array[i]
$id_array[]=$id_array[i]
killvar '$act_array',i
killvar '$id_array',i
goto $curloc
end
}
$id_array[2]="третье"
end
! выводим действия

loop local i=0 while i<arrsize('$act_array') step i+=1:
dynamic $act_array[i]
end
*pl $text

Работает всё очень просто. Сами действия в виде кода вписаны в массив, и воспроизводятся циклом через dynamic. Параллельно с каждым действием в массив $id_array вписывается идентификатор действия. Именно по нему мы узнаём, в какой ячейке массива $act_array лежит действие.

Например, второе действие вписано в ячейку [1] массива $act_array, идентификатор "второе" вписан в ячейку [1] массива $id_array. Когда мы щёлкаем по действию, выполняется код действия:

  1. Добавляем очередную строку к переменной для вывода на экран
    $text+="Раньше это действие было в середине списка.<br>"
  2. Вычисляем, в какую ячейку вписан идентификатор данного действия:
    i=arrpos('$id_array',"второе")
  3. Поскольку идентификатор вписан в ячейку [1] массива $id_array, значит и действие вписано в ячейку [1] массива $act_array. Это значит, что теперь мы можем скопировать и действие и идентификатор в ячейки [3] массивов $act_arry и $id_array соответственно:
    $act_array[]=$act_array[i]
    $id_array[]=$id_array[i]
  4. Остаётся удалить ячейки [1] из обоих массивов, чтоб действий не получилось 4:
    killvar '$act_array',i
    killvar '$id_array',i
  5. Ну и чтобы список обновился, а текст обновился на экране, перезаходим на локацию:
    goto $curloc