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. Когда мы щёлкаем по действию, выполняется код действия:
- Добавляем очередную строку к переменной для вывода на экран
$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