98 lines
6.6 KiB
Perl
98 lines
6.6 KiB
Perl
#!/usr/bin/perl
|
||
require 'common.pl';
|
||
use CGI qw/:standard/;
|
||
use locale;
|
||
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
|
||
@pairs = split(/&/, $buffer);
|
||
foreach $pair (@pairs) {
|
||
local($name, $value) = split(/=/, $pair);
|
||
$value =~ tr/+/ /;
|
||
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
|
||
$value =~ s/<!--(.|\n)*-->//g;
|
||
$in{$name} = $value;
|
||
}
|
||
if ($ENV{'QUERY_STRING'} ne '') {
|
||
@qstr = split (/=/,$ENV{'QUERY_STRING'});
|
||
$command = $qstr[0];
|
||
$value = $qstr[1];
|
||
$value =~ s/[\x00-\x20<>\|;\(\)\$^\+!\^\[\]\?\"\'\`]//g;
|
||
|
||
if ($command eq "help") {&displayHelp;}
|
||
elsif ($command eq "error"){$error=1;&displayDefault;}
|
||
else {&displayDefault;}
|
||
}
|
||
else{&displayDefault;}
|
||
my @cookieArray=split ("; ",$ENV{'HTTP_COOKIE'});
|
||
my $cookieName;my $cookieValue;my %cookieHash;
|
||
foreach (@cookieArray){
|
||
($cookieName,$cookieValue)=split("=",$_);
|
||
$cookieHash{$cookieName}=$cookieValue;
|
||
}
|
||
sub displayHelp(){
|
||
print "Content-type: text/html\n\n";
|
||
print <<"EOF";
|
||
<html>\n<head><title>Инструкция и помощь</title>\n
|
||
<link type="text/css" rel="stylesheet" href="white.css">
|
||
</head><body>\n
|
||
Мой сайт сделан в виде текстового приключения.
|
||
<p>Вы набираете команду в поле команд.Команда чаще всего состоит из глагола и существительного,например:<br>
|
||
взять ящик<br>
|
||
выпить чай<br>
|
||
выброситься в окно<br>
|
||
перекинуть дерево через плечо и вмазать им по самые помидоры<br>
|
||
делать дело<br>
|
||
использовать свой ум<br>
|
||
посмотреть на записку<br>
|
||
поговорить о жизни со шкафом<br>
|
||
пить пиво<br>
|
||
включить вилку в розетку<br>
|
||
Эти команды - лишь примеры,и они не будут работать.Но я надеюсь,что вы поняли идею.</p>
|
||
<p>Когда вы входите в комнату,вы читаете её описание.Оно неполно,и содержит лишь основные черты.Чтобы уточнить описание предмета,достаточно его осмотреть.Если он вам понравился,вы даже можете попробовать его взять с собой.</p>
|
||
<p>Одной из отличительных черт текстовых приключений от графических является нелинейность.Вы не можете войти в комнату и потыкать на каждый предмет в ней.Принцип научного тыка не работает.Команды "использовать","применить","добавить",которые являются детищами именно графических приключений,не работают.Если вы хотите что-нибудь сделать - описывайте это действие чётко и лаконично.Если вы будете использовать более пяти слов,то сценарий,вас,скорее всего,просто не поймёт.Конечно,стоит учитывать еще и вероятность ложных срабатываний.</p>
|
||
<p>Несколько слов о стратегии.</p>
|
||
<p>Не пытайтесь вводить нецензурные слова и "ненормативную лексику".Та же команда "вмазать по самые помидоры" - это,конечно,образно,но чаще всего неправильно.Здесь используется русский язык,и русский коренной.Конечно,есть и скрытые команды,но я могу вас уверить - нецензурных среди нет.<br>
|
||
<p>Второй отличительной чертой текстовых приключений является полная неработоспособность метода научного тыка.<br>Вы не можете просто тыкаться во все предметы,пока что-то не произойдет.По сути,это - прямое следствие первой отличительной черты.Чтобы что-то сделать,вы должны <b>чётко представлять</b> себе,что вы хотите от программы.Если вы хотите "открыть замок с помощью книги",это нечётко,причём независимо от контекста.Можно её понять как "открыть книгу,приложить ее к замку и повернуть".Можно её понять как "подубасить книгой по замку,авось откроется".Можно её понять как "выучить заклинание из книги и открыть им замок",даже как "выдрать кучу страниц из книги и набить ими замок,пока он не откроется от переполнения".Команда "прочитать книгу и открыть замок" слишком сложна,потому что содержит в себе 2 действия.А вот команды "прочитать книгу" и "открыть замок" уже могут сделать что-нибудь дельное.Но опять же,не всегда.</p>
|
||
<p>С другой стороны,из контекста многое ясно.Не надо уточнять,когда вы хотите посмотреть на стол,что это - стол,стоящий у шкафа,который стоит у стены...и так далее,если это - единственный стол в комнате.Если честно,то для краткости вообще не надо особых уточнений относительно предметов.Каждый предмет в каждой комнате уникален,поэтому уточнение "открыть левую дверцу шкафа" излишне,если можно просто "открыть шкаф".Уточнения могут и не влиять на обработку команд,но набирать длинное предложение вместо двух или трёх слов - это морока.</p>
|
||
<p>Я напоминаю,что мне можно написать по адресу oreolek>at<gmail.com.Единственные вопросы,на которые я точно не отвечу - это подсказки по прохождению.</p>
|
||
<p align="right"><i>Александр Яковлев a.k.a. Oreolek.</i></p>
|
||
<br>Это поле понимает только одну команду - "продолжить".Из контекста ясно,зачем она:
|
||
<FORM NAME='input' ACTION='parse.pl' METHOD='POST'>\n
|
||
<input type='hidden' name='location' id='location' value='index'>\n
|
||
> <input type=text id="in" name="input" size=64 maxlength=32>\n</form>
|
||
</body></html>
|
||
EOF
|
||
}
|
||
sub displayDefault(){
|
||
print "Content-type: text/html\n\n";
|
||
print <<"EOF";
|
||
<html>\n<head>
|
||
<script language="javascript">
|
||
window.onload=function() {document.getElementById("in").focus();};
|
||
</script>\n<title>Приветствие от автора</title>\n
|
||
<link type="text/css" rel="stylesheet" href="white.css">
|
||
</head><body>\n
|
||
Здравствуйте!<br>
|
||
Добро пожаловать на мой сайт.Вы находитесь на главной странице.
|
||
<br>Введите вашу команду в поле внизу.Вы можете делать огромное количество вещей,например,осматривать предметы,скачивать файлы
|
||
или брать понравившееся с собой,в свою "котомку".Котомка пригодится вам в решении задач,которые вы можете здесь встретить.<br>
|
||
Если вы хотите пользоваться функцией сохранения,то убедитесь,что в вашем браузере включена поддержка cookies.<br>
|
||
Также я хочу известить вас о том,что на сайте работает автосохранение.Все предметы,которые побывали в вашей котомке,
|
||
сохранятся в ней при следующем посещении сайта.<br>
|
||
Мне очень важно ваше мнение.Мой адрес электронной почты <em>oreolek >at< gmail.com.</em> Я стараюсь проверять свой электронный ящик как можно чаще,и пытаюсь ответить на каждое письмо.В любом случае,вы можете быть уверены:я прочту каждое письмо,которое пройдёт мой спам-фильтр.
|
||
<br>Чтобы продолжить,введите в поле внизу команду <b>"продолжить"</b>.
|
||
Удачи!<br>
|
||
<i>Oreolek.</i><br>
|
||
EOF
|
||
if ($error){print "<p id=\"err\">Команда не распознана.</p>";$error=0;}
|
||
print "Введите команду: ";
|
||
print "<FORM NAME='input' ACTION='parse.pl' METHOD='POST'>\n";
|
||
print "<input type='hidden' name='location' id='location' value='index'>\n";
|
||
print '> <input type=text id="in" name="input" size=64 maxlength=32></form>';
|
||
print <<"EOF";
|
||
<div id="hint"><noscript>Нажмите Tab,</noscript>введите вашу команду и нажмите Enter.<br/>
|
||
В недоумении? Прочтите <a href="?help">инструкцию</a>.<br>
|
||
<a href="changelog.html"><div align="right">Версия $version</div></a>
|
||
</div>
|
||
EOF
|
||
print "</body>\n</html>";
|
||
} |