Так уж случилось, что я сейчас переодически мучаю XP. Версия 1.04 (пиратка ессено). И наткнулся на очень интересное поведение исполнения скрипта. И пока моя пятая точка плавит льды, быстро тающих от неслабого нагрева, опишу в чем же суть:
Давайте представим, что вы сделали событие, выполняющее скрипт одной строчкой, например такое
Говорим с этим персонажем и попадаем в лимбо вечного цикла. Меняем строчку на
И у нас все в шоколаде. Окей, а что будет, если написать вот так
И вы угадали! Мы снова можем ходить! Почему? Ну, потому что. Давайте окунемся в принцип исполнения команд интерпретатором. Interpreter1 метод update, строки 198-203:
# If return value is false when trying to execute event command
if execute_command == false
return
end
# Advance index
@index += 1
Если команда вернула true, то идем к следующей. Если false, остаемся на этой. Но погодите, разве предыдущий пример из 2 строк не вернул false? Вернул.
Давайте посмотрим как интерпретатор исполняет скрипт:
#--------------------------------------------------------------------------
# * Script
#--------------------------------------------------------------------------
def command_355
# Set first line to script
script = @list[@index].parameters[0] + "\n"
# Loop
loop do
# If next event command is second line of script or after
if @list[@index+1].code == 655
# Add second line or after to script
script += @list[@index+1].parameters[0] + "\n"
# If event command is not second line or after
else
# Abort loop
break
end
# Advance index
@index += 1
end
# Evaluation
result = eval(script)
# If return value is false
if result == false
# End
return false
end
# Continue
return true
end
Так что эта фигатень значит? Ну, сначала интерпретатор проходит по всем строчкам события, которые являются продолжением скрипта и останавливаются на последнем.
...
Вот что получается, Если событие однострочное, то оно состоит из команды 355, но если многострочное, то первая строка это команда 355, а последующие 655. И он останавливается на последнем. И ясное дело такая команда (655я) не обрабатывается интерпретатором и пропускается. В чем проблема? Ну, даже операция присваивания имеет результат (равный присваемому значению), а значит, что строка
$game_switches[1] = false
Погрузит вас в отчаяние вечного цикла. Как говорится, всего хорошего.