Проблема с выводом диалога в HTML-таблицу
Формируется таблица из одной строки и двух столбцов. В первом столбце в последствии предполагается расположить изображение. Во втором столбце должен быть текст. Первые реплики выводятся в нужный столбец, затем открывается окно действий и начинается диалог. При этом строки диалога выводятся под таблицей.
!отключить окно действий
SHOWACTS 0
!Разрешить HTML
USEHTML=1
!Создать таблицу, создать строку таблицы
'<table border=1><tr>'
!Если время меньше 11:15 или больше 14:45
IF (varHourNow=11 and varMinuteNow <= 15) or (varHourNow = 14 and varMinuteNow > 45):
!Определить Открыто/закрыто (0-нет, 1-да)
IF rand(0,1)=1:
!Создать пустой столбец для рисунка, создать столбец
'<td></td><td>'
'<font color=Green> Закрыто'
ELSE
!Создать пустой столбец для рисунка, создать столбец
'<td></td><td>'
'<font color=Green> Открыто'
END
ELSE
!Создать пустой столбец для рисунка, создать столбец
'<td></td><td>'
'<font color=Green> Окна нет'
END
!открыть окно действий
SHOWACTS 1
act 'Залезть':
'<font color=blue> - Сейчас я залезу.'
!Удалить действие
delact $selact
'<font color=blue> - Получится или нет?'
'<font color=Magenta> - Не попробуешь - не узнаешь'
act 'Я тут подумал...':
'<font color=blue>А может ну его'
'<font color=green> Отходит от окна'
delact $selact
'<font color=Magenta> - Неужели испугался?'
'<font color=blue> - Ищи дурака!'
varWindowIn[0]=1
IF KeyDoorIn[0]=0:
act 'Ключ от двери':
'<font color=blue> - Я бы прошел через дверь'
delact $selact
SHOWACTS 0
'<font color=Magenta> Я сделаю тебе дубликат ключа.'
KeyDoorIn[0]=2
KeyDoorIn_ServiceDay[0]=varDayNow
KeyDoorIn_ServiceDay[1]=varMonthNow
KeyDoorIn_ServiceDay[2]=varYearNow
*PL '<a href="exec:gt ''procDateTime'',''locHall'', 30">Уйти</a>'
end
ELSE
SHOWACTS 0
*PL '<a href="exec:gt ''procDateTime'', ''locHall'', 30">Уйти</a>'
END
end
end
!Закончить работу со шрифтом, закрыть столбец, закрыть строку, закрыть таблицу
'</font></td></tr></table>'
Чернильный_гость,
ты не указал, в чём заключается проблема.
Nex,Проблема в том, что диалоговая часть текста выводится под таблицей, а не во второй столбец таблицы
Чернильный_гость,
Это потому что код в ACT выполняется отдельно от кода локации, он с кодом локации никак не связан. Всё что между ACT и END, выполняется только в момент нажатия действия.
Поэтому у тебя и получается, сначала выводится таблица, а потом ACT дописывает кашу из тэгов.
Если хочешь динамически формировать описание, пользуйся переменными, условиями, и делай перезаход на текущую локацию:
GOTO $CURLOC
Ну и само собой, избавься от DELACT.
Nex, спасибо, теперь понятно, что не так. Поступил проще - перенес закрывающие таблицу теги в тело последних ACT. Стало работать как планировал. Код теперь выглядит так:
!отключить окно действий
SHOWACTS 0
!Разрешить HTML
USEHTML=1
!Создать таблицу, создать строку таблицы
'<table border=1><tr>'
!Если время меньше 11:15 или больше 14:45
IF (varHourNow=11 and varMinuteNow <= 15) or (varHourNow = 14 and varMinuteNow > 45):
!Определить Открыто/закрыто (0-нет, 1-да)
IF rand(0,1)=1:
!Создать пустой столбец для рисунка, создать столбец
'<td></td><td>'
'<font color=Green> Закрыто'
ELSE
!Создать пустой столбец для рисунка, создать столбец
'<td></td><td>'
'<font color=Green> Открыто'
END
ELSE
!Создать пустой столбец для рисунка, создать столбец
'<td></td><td>'
'<font color=Green> Окна нет'
END
!открыть окно действий
SHOWACTS 1
act 'Залезть':
'<font color=blue> - Сейчас я залезу.'
!Удалить действие
delact $selact
'<font color=blue> - Получится или нет?'
'<font color=Magenta> - Не попробуешь - не узнаешь'
act 'Я тут подумал...':
'<font color=blue>А может ну его'
'<font color=green> Отходит от окна'
delact $selact
'<font color=Magenta> - Неужели испугался?'
'<font color=blue> - Ищи дурака!'
varWindowIn[0]=1
IF KeyDoorIn[0]=0:
act 'Ключ от двери':
'<font color=blue> - Я бы прошел через дверь'
delact $selact
SHOWACTS 0
'<font color=Magenta> Я сделаю тебе дубликат ключа.'
KeyDoorIn[0]=2
KeyDoorIn_ServiceDay[0]=varDayNow
KeyDoorIn_ServiceDay[1]=varMonthNow
KeyDoorIn_ServiceDay[2]=varYearNow
*PL
'<a href="exec:gt ''procDateTime'',''locHall'', 30">Уйти</a>'
'</font></td></tr></table>'
end
ELSE
SHOWACTS 0
*PL
'<a href="exec:gt ''procDateTime'', ''locHall'', 30">Уйти</a>'
'</font></td></tr></table>'
END
end
end
!Закончить работу со шрифтом, закрыть столбец, закрыть строку, закрыть таблицу
!'</font></td></tr></table>'
Чернильный_гость,
несмотря на то, что код у тебя работает, он в принципе неправильный. Если бы ты просмотрел результат с отключенным распознаванием html, ты бы это увидел: если ни одно из действий не выполнено, таблица не закрывается.
<table border=1><tr>
<td></td><td>
<font color=Green> Окна нет
Фактически таблица не закроется, пока ты не выполнишь последнее действие. Да, выглядит всё нормально, но стоит чуть-чуть усложнить диалог и посыплются ошибки. Все открытые теги обязательно следует закрывать. Классический плеер очень чувствителен к этому, и в будущем при возникновении косяков с прорисовкой таблиц, блоков <div> и всяких там MAP, следует искать в первую очередь незакрытые теги. Даже теги жирности и курсива очень сильно влияют на общую разметку.
Попробуй сделать так: сначала вставь таблицу, чтобы она выводилась при нужном условии полностью. Данные, которые должны помещаться в эту таблицу определи в переменные. Например $left_tada - для рисунка, $right_tada - для текста.
Т.е. так примерно будет выглядеть твоя таблица:
'<table border=1><tr><td>'+$left_tada+'</td><td>'+$right_tada+'</td></tr></table>'
Теперь всякий текст, который следует помещать в правой половине таблицы, просто добавляешь в переменную $right_tada. Действия тоже следует поправить. Nex рекомендовал тебе избавиться от delact и воспользоваться командой goto $curloc, так и следует поступить:
$left_tada=' '
if action[0] = 0:
IF (varHourNow=11 and varMinuteNow <= 15) or (varHourNow = 14 and varMinuteNow > 45):
!Определить Открыто/закрыто (0-нет, 1-да)
IF rand(0,1)=1:
$right_tada = $right_tada + '<font color=Green> Закрыто.</font><br>'
ELSE
$right_tada = $right_tada + '<font color=Green> Открыто.</font><br>'
END
ELSE
$right_tada = $right_tada + '<font color=Green> Окна нет.</font><br>'
END
act 'Залезть':
$right_tada = $right_tada + '<font color=blue> - Сейчас я залезу.</font><br>'
$right_tada = $right_tada + '<font color=blue> - Получится или нет?</font><br>'
$right_tada = $right_tada + '<font color=Magenta> - Не попробуешь - не узнаешь</font><br>'
action[0] = 1
goto $curloc
end
end
IF KeyDoorIn[0]=0 and action[0]=2:
act 'Ключ от двери':
$right_tada = $right_tada + '<font color=blue> - Я бы прошел через дверь</font><br>'
$right_tada = $right_tada + '<font color=Magenta> Я сделаю тебе дубликат ключа.</font><br>'
KeyDoorIn[0]=2
KeyDoorIn_ServiceDay[0]=varDayNow
KeyDoorIn_ServiceDay[1]=varMonthNow
KeyDoorIn_ServiceDay[2]=varYearNow
action[0]=3
goto $curloc
$right_tada = $right_tada + '<a href="exec:gt ''procDateTime'',''locHall'', 30">Уйти</a><br>'
end
ELSEIF action[0]=2:
$right_tada = $right_tada + '<a href="exec:gt ''procDateTime'', ''locHall'', 30">Уйти</a><br>'
END
if action[0] = 1:
act 'Я тут подумал...':
$right_tada = $right_tada + '<font color=blue>- А может ну его?</font><br>'
$right_tada = $right_tada + '<font color=green> Отходит от окна</font><br>'
$right_tada = $right_tada + '<font color=Magenta> - Неужели испугался?</font><br>'
$right_tada = $right_tada + '<font color=blue> - Ищи дурака!</font><br>'
varWindowIn[0]=1
action[0]=2
goto $curloc
end
end
'<table border=1><tr><td>'+$left_tada+'</td><td>'+$right_tada+'</td></tr></table>'
переменная action[0] в этом случае используется для указания, какое действие следует вывести далее. все SHOWACTS я убрал, но это несущественно.
Aleks Versus,
Ты, конечно, профессионал - тебе виднее.
А не мог бы ты привести пример ситуации, когда ни одно из действий не будет выполнено, а перемещение на другую локацию состоится.
В моем коде не выполнив все действия переместиться из этой локации попросту нельзя. Ссылка на другую локацию появляется лишь в последнем действии. И сразу после нее идут закрывающие тэги.
Чернильный_гость:
А не мог бы ты привести пример ситуации, когда ни одно из действий не будет выполнено, а перемещение на другую локацию состоится.
Речь не перемещение на другую локацию, а проблемы с прорисовкой текущей - при нарушении правил HTML могут возникнуть проблемы в совершенно неожиданный момент. Если их нет сейчас - это скорее везение.
newsash,
Я может быть и не прав, но, если следовать твоей логике, то процесс наполнения любой таблицы есть нарушение правил HTML, поскольку в этот момент закрывающий тэг еще не достигнут.
Если таблица заполняется за один проход кода, то она прорисовывается уже с нормальным закрывающим тегом. Если таблица заполняется через ACT, то она прорисовывается на промежуточных стадиях без нормально закрытых тегов.
newsash,
С этим я согласен. Но, по-моему, ACT - лишь этап прорисовки, который принципиально ничем не отличатся от стандартного добавления текста в ячейку.
Прорисовка срабатывает: по выполнению всего кода (перехода, act, счетчика,…) или по wait. Код внутри ACT - это отдельный от локации код и выполняется отдельно.
В обычных браузерах прогрузка и прорисовка страницы действительно идёт в нарушение правил (если медленный интернет, то можно увидеть, как постепенно посты на форуме появляются или что-то подобное), но правильное отображение гарантируется лишь с момента полной прогрузки/прорисовки страницы.
Теперь мои домыслы о последствиях: html автоматически закрывает теги в конце страницы, т.е. проблемы могут возникнуть, если после такой “неправильной” таблицы захочется ещё что-нибудь вывести (отдельное от таблицы).
newsash,
Т.е. хочешь сказать, что хотя в ACT прописаны закрывающие тэги, но фактически они таблицу не закрывают? Интересный момент… А можно нарисовать две таблицы в одной строке - в первой вывести информацию из локации, а во второй - из ACT?
Они таблицу закроют только по нажатию соответствующих действий, а до того таблица будет не закрыта. Про две таблицы в одной строке - я не очень понял. Лучше всё-таки пойти по пути, который Aleks Versus предлагал.
newsash,
Я подумаю, спасибо.
Чернильный_гость,
зачем учийтца писат паруски твая мая и так панимает.
HTML - это язык разметки. Он требует соблюдения орфографических и синтаксических правил. И лучше заранее учесть эти правила, а не отмахиваться “и так сойдёт”.
Твой диалог сейчас состоит из пары фраз. А если он будет многовариантным, с тремя ветками разной длины и переходами на шесть локаций, возможностью вернуться к началу диалога, или к любой его части? Я понимаю, сейчас тебе такая сложность ни к чему, но почему заранее не исключить ошибки и не набить руку, грамотно структурируя разметку?

