Онлайн-справочник по самым часто задаваемым вопросам из темы "Как сделать?" на форуме QSP.su

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