RU

Проблема с выводом диалога в HTML-таблицу

Чернильный_гость #1208 20.08.2014 08:23 18 comments 10175 views

Формируется таблица из одной строки и двух столбцов. В первом столбце в последствии предполагается расположить изображение. Во втором столбце должен быть текст. Первые реплики выводятся в нужный столбец, затем открывается окно действий и начинается диалог. При этом строки диалога выводятся под таблицей.

!отключить окно действий
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>'

Код приведен полностью, без изьятий.

Чернильный_гость,
ты не указал, в чём заключается проблема.

Чернильный_гость #1208 20.08.2014 09:19 (11 years ago)

Nex,Проблема в том, что диалоговая часть текста выводится под таблицей, а не во второй столбец таблицы

Чернильный_гость,
Это потому что код в ACT выполняется отдельно от кода локации, он с кодом локации никак не связан. Всё что между ACT и END, выполняется только в момент нажатия действия.

Поэтому у тебя и получается, сначала выводится таблица, а потом ACT дописывает кашу из тэгов.

Если хочешь динамически формировать описание, пользуйся переменными, условиями, и делай перезаход на текущую локацию:

GOTO $CURLOC

Ну и само собой, избавься от DELACT.

Чернильный_гость #1208 20.08.2014 09:59 (11 years ago)

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>'

Aleks Versus Moderator 23.08.2014 05:17 (11 years ago)

Чернильный_гость,
несмотря на то, что код у тебя работает, он в принципе неправильный. Если бы ты просмотрел результат с отключенным распознаванием 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='&nbsp;'
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 я убрал, но это несущественно.

Чернильный_гость #1208 23.08.2014 07:28 (11 years ago)

Aleks Versus,
Ты, конечно, профессионал - тебе виднее.
А не мог бы ты привести пример ситуации, когда ни одно из действий не будет выполнено, а перемещение на другую локацию состоится.
В моем коде не выполнив все действия переместиться из этой локации попросту нельзя. Ссылка на другую локацию появляется лишь в последнем действии. И сразу после нее идут закрывающие тэги.

Чернильный_гость:

А не мог бы ты привести пример ситуации, когда ни одно из действий не будет выполнено, а перемещение на другую локацию состоится.

Речь не перемещение на другую локацию, а проблемы с прорисовкой текущей - при нарушении правил HTML могут возникнуть проблемы в совершенно неожиданный момент. Если их нет сейчас - это скорее везение.

Чернильный_гость #1208 23.08.2014 08:43 (11 years ago)

newsash,
Я может быть и не прав, но, если следовать твоей логике, то процесс наполнения любой таблицы есть нарушение правил HTML, поскольку в этот момент закрывающий тэг еще не достигнут.

Если таблица заполняется за один проход кода, то она прорисовывается уже с нормальным закрывающим тегом. Если таблица заполняется через ACT, то она прорисовывается на промежуточных стадиях без нормально закрытых тегов.

Чернильный_гость #1208 23.08.2014 09:06 (11 years ago)

newsash,
С этим я согласен. Но, по-моему, ACT - лишь этап прорисовки, который принципиально ничем не отличатся от стандартного добавления текста в ячейку.

Прорисовка срабатывает: по выполнению всего кода (перехода, act, счетчика,…) или по wait. Код внутри ACT - это отдельный от локации код и выполняется отдельно.

В обычных браузерах прогрузка и прорисовка страницы действительно идёт в нарушение правил (если медленный интернет, то можно увидеть, как постепенно посты на форуме появляются или что-то подобное), но правильное отображение гарантируется лишь с момента полной прогрузки/прорисовки страницы.

Теперь мои домыслы о последствиях: html автоматически закрывает теги в конце страницы, т.е. проблемы могут возникнуть, если после такой “неправильной” таблицы захочется ещё что-нибудь вывести (отдельное от таблицы).

Чернильный_гость #1208 23.08.2014 13:21 (11 years ago)

newsash,
Т.е. хочешь сказать, что хотя в ACT прописаны закрывающие тэги, но фактически они таблицу не закрывают? Интересный момент… А можно нарисовать две таблицы в одной строке - в первой вывести информацию из локации, а во второй - из ACT?

Они таблицу закроют только по нажатию соответствующих действий, а до того таблица будет не закрыта. Про две таблицы в одной строке - я не очень понял. Лучше всё-таки пойти по пути, который Aleks Versus предлагал.

Чернильный_гость #1208 23.08.2014 13:31 (11 years ago)

newsash,
Я подумаю, спасибо.

Aleks Versus Moderator 23.08.2014 14:12 (11 years ago)

Чернильный_гость,
зачем учийтца писат паруски твая мая и так панимает.
HTML - это язык разметки. Он требует соблюдения орфографических и синтаксических правил. И лучше заранее учесть эти правила, а не отмахиваться “и так сойдёт”.
Твой диалог сейчас состоит из пары фраз. А если он будет многовариантным, с тремя ветками разной длины и переходами на шесть локаций, возможностью вернуться к началу диалога, или к любой его части? Я понимаю, сейчас тебе такая сложность ни к чему, но почему заранее не исключить ошибки и не набить руку, грамотно структурируя разметку?

Log in or Register to post comments.