Онлайн-справочник по самым часто задаваемым вопросам из темы "Как сделать?" на форуме QSP.su
20.16. Как заставить действия выводиться в нужном мне порядке?
В: Как заставить действия выводиться в нужном мне порядке?
О:
Чтобы действия появлялись в нужном порядке, необходимо чётко понимать, как именно выводятся действия в QSP.
В первую очередь выводятся базовые действия локации. Это те действия, которые мы добавляем при помощи специального окна в Quest Generator. Они выводятся в том порядке, в котором прописаны в этом окне.
Во вторую очередь выводятся действия, прописанные в поле "выполнить при посещении" в Quest Generator с помощью оператора `act`. Точно так же они выводятся в том порядке, в каком вы их прописываете, то есть в порядке чтения кода плеером.
Таким образом, чтобы действия выводились в нужном вам порядке, необходимо прямо в окне базовых действий и поле "выполнить при посещении" расположить их так, как вы хотите, чтобы они выводились.
Например:
*pl "Действие вверху списка"
end
act "Второе действие":
*pl "Действие в середине списка"
end
act "Третье действие":
*pl "Действие внизу списка"
end
Если же вам нужно, чтобы порядок действий менялся динамически, например, выбранное игроком действие добавлялось в конец списка, то действия можно поместить в виде текстовых значений в переменные, или массив.
Пример:
! записываем действия в массив
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`. Когда мы щёлкаем по действию, выполняется код действия:
Добавляем очередную строку к переменной для вывода на экран
$text+="Раньше это действие было в середине списка.<br>"
Вычисляем, в какую ячейку вписан идентификатор данного действия:
i=arrpos('$id_array',"второе")
Поскольку идентификатор вписан в ячейку `[1]` массива `$id_array`, значит и действие вписано в ячейку `[1]` массива `$act_array`. Это значит, что теперь мы можем скопировать и действие и идентификатор в ячейки `[3]` массивов `$act_arry` и `$id_array` соответственно:
$act_array[]=$act_array[i]
$id_array[]=$id_array[i]
Остаётся удалить ячейки `[1]` из обоих массивов, чтоб действий не получилось `4`:
killvar '$act_array',i
killvar '$id_array',i
Ну и чтобы список обновился, а текст обновился на экране, перезаходим на локацию:
goto $curloc