вторник, 29 ноября 2011 г.

JavaScript. Рандомайзер

А вот небольшой скрипт для получения случайного числа в заданном диапазоне. Диапазон задаётся в текстовых полях: первое поле — минимальное возможное число, второе — максимальное. Генерация начинается при нажатии на кнопку. На время генерации текстовые поля и кнопка блокируются. Время генерации зависит от значения милисекунд системного таймера в момент нажатия кнопки, и может составлять от 3 до 10 секунд. Это сделано для придания результату ещё большей «случайности».

<div align="center">
<input type="text" id="gorndtbfrom" value="1" maxlength="9" size="4" />
<input type="text" id="gorndtbto" value="100" maxlength="9" size="4" />
<p><font size="5"><b id="gorndlbl">--</b></font></p>
<input type="button" id="gorndbtn" value="Gornd!" onclick="gorndbegin()"></div>
<script type="text/javascript">

function gorndbegin() {
 gorndc = (new Date()).getMilliseconds();
 if (gorndc < 300) {
  gorndc += 300;
 }
 gorndfrom = document.getElementById("gorndtbfrom").value * 1;
 gorndto = document.getElementById("gorndtbto").value * 1 - gorndfrom + 1;
 document.getElementById("gorndtbfrom").readOnly = true;
 document.getElementById("gorndtbto").readOnly = true;
 document.getElementById("gorndbtn").disabled = true;
 gorndproc();
}

function gorndproc() {
 if (gorndc > 0) {
  document.getElementById("gorndlbl").innerHTML = Math.floor(Math.random() * gorndto) + gorndfrom;
  gorndc--;
  gorndt = setTimeout("gorndproc()",10);
 } else {
  clearTimeout(gorndt);
  document.getElementById("gorndtbfrom").readOnly = false;
  document.getElementById("gorndtbto").readOnly = false;
  document.getElementById("gorndbtn").disabled = false;
 }
}

</script>

По традиции, пример работы скрипта:

--


Приведённый выше скрипт с эффектом анимации удобно использовать при необходимости получить одно случайное число (например, номер победителя при розыгрыше «кофеток»). Если же таких чисел нужно много, больше подойдёт скоростной вариант скрипта без анимации (см. ниже). Генерация тут происходит не по событию таймера (как в предыдущем случае) а в цикле.

<div align="center">
<input type="text" id="gorndtbfrom" value="1" maxlength="9" size="4" />
<input type="text" id="gorndtbto" value="100" maxlength="9" size="4" />
<p><font size="5"><b id="gorndlbl">--</b></font></p>
<input type="button" id="gorndbtn" value="Gornd!" onclick="gorndbegin()"></div>
<script type="text/javascript">

function gorndbegin() {
 gorndc = (new Date()).getMilliseconds();
 if (gorndc < 300) {
  gorndc += 300;
 }
 gorndfrom = document.getElementById("gorndtbfrom").value * 1;
 gorndto = document.getElementById("gorndtbto").value * 1 - gorndfrom + 1;
 document.getElementById("gorndbtn").disabled = true;
 var i = 0;
 for (i = 0; i < gorndc; i++) {
  document.getElementById("gorndlbl").innerHTML = Math.floor(Math.random() * gorndto) + gorndfrom;
 }
 document.getElementById("gorndbtn").disabled = false;
}

</script>

воскресенье, 23 октября 2011 г.

Созвездие Миротворец

Второй (и, надеюсь, окончательный) вариант созвездия нашей гильдии для проекта "Звёздное небо Годвилля". Первый вариант был практически таким же, за исключением нескольких названий.

А вот и гипотетический снимок этого созвездия со спутника.

Называется, нагуглил в интернете урок для Фотошопа «Как нарисовать звёздное небо». :)

понедельник, 4 июля 2011 г.

JavaScript. Таймер или динамичный последний отсчёт

А теперь другой вариант последнего отсчёта. На этот раз самый настоящий, динамичный.

<div id="datecounter2">--:--:--</div>

<script type="text/javascript">

onload = function start() {
  timesp();
}

function timesp() {
  var ts = new Date(2012,11,21) - new Date();
  var html = "уже наступил!";
  if (ts>0) {
    var h = ts/3600000;
    var m = (h-Math.floor(h))*60;
    var s = (m-Math.floor(m))*60;
    html = ctime(h)+" : "+ctime(m)+" : "+ctime(s);
    t = setTimeout("timesp()",300);
  } else {
    clearTimeout(t);
  }
  document.getElementById("datecounter2").innerHTML=html;
}

function ctime(i) {
  i = Math.floor(i);
  if (i<10) {
    i = "0"+i;
  }
  return i;
}

</script>

После загрузки страницы отрабатывает функция start(), которая запускает функцию timesp(). А timesp() уже при помощи команды setTimeout('timesp()',300) будет запускать сама себя через каждые 300 милисекунд. Функция ctime(i) округляет передаваемый аргумент и, если его значение меньше 10, добавляет "0". Это нужно для того, чтобы вместо "1:2:3" было "01:02:03", как в настоящих электронных таймерах.

Пример работы скрипта:

До Нового года:

--:--:--

А, собственно, само время, оставшееся до следующего Нового года, посчиталось так:

var d = new Date();
var ts = new Date(d.getFullYear() + 1,0,1) - d;

вторник, 28 июня 2011 г.

JavaScript. Последний отсчёт

Будем считать количество часов или дней до какой-нибудь знаменательной даты. Например, до дня рождения, до Нового года, до начала отпуска, ну, или как у меня. :) Как всегда, добавляем новый гаджет «HTML/JavaScript» и копируем такой код:

<div id="datecounter"></div>
<script type="text/javascript">
var ts = new Date(2012,0,15) - new Date();
var str = "" + Math.round(ts / 3600000);
var len = str.length;
var html = "<b>уже наступил!</b>";
var t = "часов";
if (ts > 0) {
  if (len == 1 || (len > 1 && str[len - 2] != '1')) {
    switch (str[len - 1]) {
      case '1':
        t = "час";
        break;
      case '2':
      case '3':
      case '4':
        t = "часа";
    }
  }
  html = "через <b>" + str + "</b> " + t;
}
document.getElementById("datecounter").innerHTML = html;
</script>

Дата нашего события задаётся в строчке:

var ts = new Date(2012,0,15) - new Date();

В скобках указываем год, месяц, день. Обратите внимание: счёт месяцев начинается с нуля! Т.е. дата в нашем примере — это 15 января 2012 года. Если интересующее событие начинается не в 0:00, а, скажем, в пол-первого, можно учесть и это, добавив в строчке с датой и время:

var ts = new Date(2012,0,15,12,30) - new Date();

Следующая строка кода переводит отрезок времени (который измеряется в милисекундах) в часы. Если нас интересует измерение в днях, то придётся изменить эту строку так:

var str = "" + Math.round(ts / 86400000);

Кроме того, Капитан Очевидность подсказывает, что дальше в коде нужно заменить "часов" на "дней", "час" на "день", а "часа" на "дня". :)

пятница, 24 июня 2011 г.

JavaScript. Случайная фраза из списка

Итак, у нас есть список наших любимых фраз, цитат, анекдотов или чего-то там ещё. Нужно выбрать наугад одну из этих фраз и показать у себя на сайте или в бложике, чтобы тем самым порадовать себя и позабавить посетителей. Для бложика перейдите в «Дизайн», добавьте новый гаджет «HTML/JavaScript» и скопируйте туда следующий код:

<div id="myphrase">
</div>
<script type="text/javascript">
var div = document.getElementById("myphrase");
var lst = new Array();
lst.push("Моя любимая фраза номер один.");
lst.push("Моя любимая фраза номер два."); 
lst.push("Моя любимая фраза номер три."); 
lst.push("..."); 
lst.push("Моя любимая фраза номер стопицот."); 
div.innerHTML = lst[Math.floor(Math.random() * lst.length)];
</script>

Пример работы этого скрипта можно видеть справа (под ссылкой на мой профиль). Фраза меняется при каждом обновлении страницы. Учтите только, что если в вашем списке мало фраз, то одна и та же фраза может радовать ваш взор несколько раз подряд. А чем фраз больше, тем, соответственно, меньше вероятность выбора одной и той же.

Первая строка кода — это блок div, в котором будет помещаться выбранная фраза. При желании можно поработать со стилем этого блока, задав, к примеру, цвет текста или шрифт. В таком случае первая строка примет какой-то такой вид:

<div id="myphrase" style="color: green; font-size: small; font-style: italic;">
</div>

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

При помощи строк lst.push("какой-то текст"); мы добавляем наши фразы. Строчек этих можно добавить сколько угодно, но не забывайте про точку с запятой в конце каждой строки. Кстати, в тексте фраз можно использовать теги HTML.

понедельник, 13 июня 2011 г.

VB.Net. Пересылка данных по локальной сети

Итак, в качестве примера пересылки данных по локальной сети сделаем простейший чат. В нашем случае будем пересылать текст в кодировке Юникод, но в общем случае это может быть любая последовательность байт. Пересылку организуем при помощи классов UdpClient и Socket из пространства имён System.Net.Sockets.

Отправляем данные мы при помощи функции SendTo(b, ep) экземпляра класса Socket, где b — массив байт (наши данные), а ep — конечная точка (экземпляр класса System.Net.IPEndPoint, для инициализации которого нужно знать IP-адрес и порт адресата).

При загрузке формы запускается таймер, в обработчике события Tick которого мы опрашиваем порт нашей машины, на который должны поступить ответные данные, и получаем их при помощи функции Receive(ep) экземпляра класса UdpClient.

IP-адрес 127.0.0.1 — это так называемая петля. Т.е. данные, отправленные на этот адрес, возвращаются нам.

Полный код формы приведён ниже:

Public Class Form1

    Private lport As Integer
    Private udpc As Net.Sockets.UdpClient
    Private soc As Net.Sockets.Socket
    Private sent As Boolean = False

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        lport = 9999
        udpc = New Net.Sockets.UdpClient(lport)
        soc = New Net.Sockets.Socket(Net.Sockets.AddressFamily.InterNetwork, Net.Sockets.SocketType.Dgram, Net.Sockets.ProtocolType.Udp)
        If ComboBox1.Items.Count > 0 Then ComboBox1.SelectedIndex = 0
        TextBox2.Select()
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If udpc.Available > 0 Then
            Dim ep As New Net.IPEndPoint(Net.IPAddress.Any, lport)
            Dim b = udpc.Receive(ep)
            Dim txt = System.Text.Encoding.Unicode.GetString(b)
            TextBox1.Text &= String.Format("{0:HH:mm:ss} from [{1}]:{3}{2}{3}----------------------------{3}", Now, ep.ToString, txt, ControlChars.NewLine)
        End If
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If TextBox2.Text.Length > 0 AndAlso ComboBox1.Text.Length > 0 Then
            Dim b = System.Text.Encoding.Unicode.GetBytes(TextBox2.Text)
            Dim ipadr = Net.IPAddress.Parse("127.0.0.1")
            Net.IPAddress.TryParse(ComboBox1.Text, ipadr)
            Dim ep As New Net.IPEndPoint(ipadr, lport)
            soc.SendTo(b, ep)
            TextBox1.Text &= String.Format("{0:HH:mm:ss} Me (to [{1}]):{3}{2}{3}----------------------------{3}", Now, ep.ToString, TextBox2.Text, ControlChars.NewLine)
            TextBox2.Text = ""
            TextBox2.Select()
            If Not ComboBox1.Items.Contains(ComboBox1.Text) Then ComboBox1.Items.Add(ComboBox1.Text)
        End If
    End Sub

    Private Sub TextBox2_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox2.KeyDown
        If e.Control AndAlso e.KeyCode = Keys.Enter Then
            Button1_Click(Nothing, Nothing)
            sent = True
        End If
    End Sub

    Private Sub TextBox2_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
        If sent Then
            TextBox2.Text = ""
            sent = False
        End If
    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        TextBox1.SelectionStart = TextBox1.Text.Length - 1
        TextBox1.SelectionLength = 1
        TextBox1.ScrollToCaret()
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Timer1.Stop()
        udpc.Close()
        soc.Close()
    End Sub
End Class

Архив с проектом Visual Studio:

NetTest.zip (105 КБ)

VB.Net. Как объявить массив

Одной строкой объявить и инициализировать массив можно так:

Dim arr = New ТипЭлементовМассива() {значение0, значение1, значение2 и т.д.}

Где это можно использовать? Ну, например, при задании первичного ключа для таблицы, который должен быть массивом колонок этой таблицы:

Dim dt As New DataTable
dt.Columns.Add("id", GetType(Integer))
dt.Columns.Add("name", GetType(String))
dt.Columns.Add("description", GetType(String))
dt.PrimaryKey = New DataColumn() {dt.Columns("id")}

понедельник, 6 июня 2011 г.

Инту 1.0 — Проверь свою интуицию (C#)

Инту 1.0 — это маленькое приложение для проверки интуиции. Ваша задача — угадать символ, скрытый за знаком вопроса. Старайтесь долго не раздумывать, просто гляньте на кнопки и нажмите на первую попавшуюся. Постарайтесь почувствовать, какой из символов, изображённых на кнопках, появится в следующую секунду вместо вопросительного знака. Чтобы приступить к следующему опыту, нажмите ещё раз любую кнопку или щелкните по полю с символом. Чем больше опытов вы сделаете, тем точнее будет результат. Программа запоминает текущий результат перед закрытием. Чтобы обнулить результаты, нажмите на строку «Результат».

ОС: Windows
Требования: Microsoft .NET Framework 3.5
Лицензия: Freeware
Язык: Русский
Версия: 1.0


Intu.zip(31 КБ)Исполняемый файл
IntuProj.zip(227 КБ)Проект с исходниками для Visual Studio 2008

понедельник, 18 апреля 2011 г.

Сказ про Путяту

Стало быть, жил у себя в усадьбе знатный боярин Мстислав Всеволодович, хорошо жил да горя не знал. И была у боярина дочь Велена, красавица да умница каких поискать. И вышло так, что гостил у Мстислава княжий гридень Путята, могучий воин не ведавший страха, одолевший в жестокой сече три сотни печенегов (сам-то я не видал — люди сказывали). Но так мила и пригожа была Велена, что стоило Путяте увидать ее, позабыл он обо всем на свете, так и застыл с разинутым ртом, аки истукан, слова путного вымолвить не мог. Уж и не ведаю, что Велена в нем отыскала, а приглянулся и ей славный Путята. Порешили они, стало быть, свадебку по осени сыграть, а чего ж тут думать долго.

И вот возвращался как-то Путята после княжьего поручения с верными другами своими в усадьбу Мстислава, дабы испросить у того отеческого благословения. Велена же знала о том и не могла на месте усидеть. Так спешила она возлюбленного вновь увидать, что решила на встреч ему идти. Батюшка, понятное дело, против был, да уступил девичьим слезам, отпустил-таки с верными охранителями.

Уж и не ведаю как, да только прознал о том хитрый и коварный, но благородный и отважный предводитель лесных разбойников Морахес, давно точивший зуб на Мстислава. Недоброе замыслил: продать прекрасную Велену суровым урманам, приплывшим из-за северного моря. Собрал он верных лихих людей своих числом не менее дюжины, а также и увальня Давилу, наводившего страх на все окрестные селения, и учинил засаду на поляне лесной, по которой Велена пройти должна была.

Храбрые воины были в охране Велены, да только повыскакивали лихие люди впереди из кустов, поспрыгивали позади с деревьев, и начали охранителей подло побивать. До последнего защищали Велену верные воины, да не сдюжили супротив Давилы-увальня да Морахеса коварного — все полегли. Схватил Морахес несчастную Велену, недобро ухмыляясь, белы рученьки веревкой стал скручивать, а разбойнички тем временем с павших защитников обувку да броню стаскивать принялись, оружие да кошели отбирать.

Но не успели злодеи довершить свое черное дело — ступил на поляну славный Путята с другами своими хоробрыми. Увидал он, что лихие люди учинили, и ярость обуяла его. В безумии выхватил он меч и бросился на разбойничков, а други Путятины лишь немного от него отстали. Звон оружия, треск щитов, крики и проклятия раздавались со всех сторон. Путята прорубал дорогу к Велене не видя ничего вокруг. И не раз спасали его верные товарищи от лютой смерти. Насилу управились воины с могучим Давилой — повалили его наземь, стали ногами поколачивать. Коварный Морахес тем временем ловко рубил неприкрытые спины.

Но вот полегли все злодеи, последний только Морахес и остался, поскольку Веленой прикрывался, и никто его бить не решался. Вскричал Путята гневным голосом, отпустить невесту повелев. Морахес же коварный стал потешаться над ним и обидными словами называть. Тут Велена-умница, как вывернулась из разбойничьих лап, как пнула злодея прямо в живот да к милому своему бросилась. А Путята ее собой заслонил, с Морахесом коварным биться начал не на жизнь, а на смерть. В жестокой сече одолел славный Путята злодея, снял ему буйну голову с плеч.

Тут и немногие выжившие други верные, Давилой оглушенные, очнулись. А Путята с белых рученек девичьих веревки разбойничьи снял, оземь их грянул да милую свою обнял. Жили с тех пор они долго и счастливо! И свадебку скоро справили. Я сам на той свадьбе был, мед-пиво пил!..

пятница, 15 апреля 2011 г.

Миротворцы. История гильдии

Сотворение

На заре времён, когда не существовало ещё ничего, кроме изначального хаоса, по воле извечного рандома сформировалось несколько сгустков, бесцельно блуждающих случайным образом в бескрайних просторах одномерной реальности. Неизвестно, сколько минуло времени, прежде чем эти неоднородности смогли осознать себя и свое существование. И еще больше времени прошло, пока, наконец, два случайных сгустка сознания (названные впоследствии Демиургами) не столкнулись. Оказалось, что только взаимно дополняя друг друга, эти сущности получили способность творить миры. Таким образом, история не только Годвилля, но и целой вселенной началась с формирования первой гильдии, получившей название «Миротворцы».

Шли годы, разрастался и хорошел Годвилль. Под возросшим влиянием юных пробудившихся богов, Демиурги постепенно забыли о самой первой гильдии, величественная цитадель которой, поражавшая своим великолепием, всё так же возвышалась в самом центре сотворённого мира. Опустели некогда пышные и шумные залы, где перворожденные герои дружелюбно махали друг перед другом впервые добытыми трофеями, а по вечерам удивляли собравшихся рассказами о невероятных приключениях, с выражением зачитывая выдержки из дневников, и лихо отплясывали на пиршественных столах под веселый треск трещоток и заунывное бубнение бубнов. Легенды гласят, что громадный замок был целиком сложен из золотых, 999-й пробы, блоков первыми миротворцами всего за одну ночь. И столь высоки были его башни, что невозможно было отыскать место, откуда их было бы не видать. Но терпеливое и беспощадное время любые, даже самые величественные сооружения, неспешно обращает в прах. Неприступные золотые стены и гордые башни по кирпичикам были растасканы жадными до всего яркого и блестящего невиданными доселе, жуткими тварями, наводнившими Годвилль, а ухоженные замковые холмы поросли соснами и столбами. Лишь скрытые до поры обширные подземные катакомбы остались в молчании хранить тайны далёкого прошлого.

Предания повествуют нам о том, что причиной запустения могло послужить загадочное исчезновение могущественного древнего артефакта, испокон веков находившегося в самом сердце цитадели. Кроме названия «мирный атом» никаких сведений об этом предмете не сохранилось, и мабританские учёные до сих пор тщетно бьются над загадками, как выглядел артефакт, куда делся, кто виноват и что делать. Поговаривают, что владеющий силой мирного атома будет владеть миром, но ни подтвердить, ни опровергнуть эти слухи пока не представляется возможным.

Возрождение

Как-то раз, в один студёный февральский вечер, некий герой*, из последних сил продиравшийся сквозь густые сосновые заросли, решил укрыться от непогоды в случайно обнаруженной пещере. Разведя костёр и разложив на просушку нижнее обмундирование, он, к своему удивлению, обнаружил чугуниевую дверь, тускло блеснувшую в свете огня. А поскольку, как известно, всякому герою присуще нездоровое любопытство, наш приключенец решил, во что бы то ни стало разведать, что за этой дверью скрывается. И вот, наконец, массивная дверь уступила перед напором геройской любознательности, и, вдоволь заготовив из подручного мусора факелов и иных осветительных принадлежностей, он ступил в манящую неизвестность. Обнаружившаяся за дверью бесконечная, уходящая вниз, лестница, наконец, кончилась, и наш герой очутился в обширном подземном зале, тишину которого нарушало лишь беспокойное потрескивание факела. Высоченные стены зала украшали без сомнения древние, но прекрасно сохранившиеся гобелены, изображавшие сцены сотворения Годвилля.

Множество коридоров расходились из зала в разных направлениях. К великой радости героя, на стенах обнаружились хитроумные светильники, последний раз светившие неизвестным людям сотни, а может, и тысячи лет назад. Они чудесным образом загорались сами по себе при звуке геройских шагов. Неспешно прогуливаясь по коридорам, герой с интересом заглядывал в многочисленные комнаты и залы, встречающиеся на его пути. Позабыв обо всём, он любовался богатым убранством пыточных камер, идеальной белизной костей, усеявших тюремные помещения с массивными решётками, затаив дыхание прикасался к древним фолиантам, в изобилии заполнявшим обширные стеллажи, и подолгу рассматривал таинственные знаки из круга над треугольником, украшавшие двери каморок непонятного назначения. И такое умиротворение и спокойствие охватило героя, что казалось, будто бы он вознёсся на небеса и, сидя на мягком облаке, ведёт дружескую беседу со своим Богом за бокалом отменной выдержанной зелёнки.

Но вот, войдя в очередной величественный зал, герой с удивлением обнаружил нескольких незнакомых героев точно также удивлённо входящих в зал с разных сторон. Удивление быстро сменилось радостью от мысли, что теперь не придётся трапезничать в одиночестве. По внешнему виду незнакомцев было видно, что каждый из них точно так же случайно набрёл на пещеру, так же развёл костёр, разложив сушиться намокшее обмундирование, и каждый приметил таинственную чугуниевую дверь. Именно это историческое событие потом назовут первой встречей в неформальной обстановке (без галстуков) главных кардиналов гильдии «Миротворцы», которая возродится в эту ночь. Теперь же герои, собравшиеся за круглым столом в центре зала, просто радовались жизни, вкусной еде, обильной выпивке и обществу друг друга.

__________
* – По неподтверждённым слухам это мог быть Эрроурут Эрроуширский или любой другой герой.

Последняя битва Героя

Случилось так, что славный рыцарь сэр Эрроурут Эрроуширский, по обыкновению спасая мирных жителей от ужасных созданий, вступил по геройской нужде своей в мрачные и зловонные земли Заброшенного Капища. Ядовитые испарения и дурные предзнаменования окутывали это черное место. С гниющих ветвей деревьев вместо листьев свисали во множестве полуистлевшие человеческие головы и иные бренные члены. Небо было затянуто непроглядной зеленой мглой, а из таинственных темных углов раздавались скрежет зубовный и прочие малоприятные звуки. Любой из героев давно повернул бы назад, но только не Эрроурут! Без тени страха и сомнения продвигался он вперед к своей цели.

Но вот земля содрогнулась под тяжкой поступью неведомого врага, а воздух наполнился отвратительными звуками и запахами. И через мгновение враг явил себя. Ростом он превосходил высочайшие из деревьев и, весь покрытый непробиваемой броней, был подобен черной горе. Четыре гигантские ноги его сотрясали землю, а множественные руки были вооружены острейшими ядовитыми когтями, подобными мечам и секирам. Из разинутой пасти врага виднелись черные клыки в пять локтей длиной, с которых стекала на землю кислота и щелочь. Гигантским своим хоботом он с легкостью выдирал из земли деревья, валуны и иные предметы, помещая их в свою бездонную глотку, откуда вырывались сполохи пламени и оглушительное рычание. Это был тот, о котором многие боятся даже помыслить, тот, чьим именем пугают непослушных детей: мифический демон древнего мира – Администратор Годвилля.

Отважный Эрроурут вспомнил, что излюбленной пищей демона являются молодые и неопытные герои. С жалостью подумал он о тех бедолагах, кто остался за его спиной, и для кого сегодняшний день мог стать последним. И славный рыцарь понял, что долг его – низвергнуть чудовище. Победить или пасть смертью героя! Крепче сжал он в руке оружие – свой верный боевой вантуз, и громогласно провозглашая боевой клич, отважно ринулся в бой. И так велика была его доблесть, что ужасный Администратор Годвилля, на мгновение дрогнув, попытался поджать свой чудовищный шипастый хвост. Но вот новой безумной злобой вспыхнули все восемь глаз демона, и издавая громовое рычание «СЕР-ВЕР», монстр обрушил свою колоссальную мощь на бесстрашного рыцаря…

Три дня и три ночи длилась великая битва, но силы были не равны. На последнем дыхании славный Эрроурут вонзил свое благородное оружие в чудовищную тушу врага и пал, обессилев от многочисленных ран.

Но милостив и справедлив Всемогущий! Отважный рыцарь ожил, чудесным образом очутившись в Храме, и новые славные подвиги ожидали его. Что же случилось с поверженным чудовищным демоном? Героическая гибель отважного рыцаря не была напрасной – ужасного Администратора Годвилля в тех местах боле никто не видел.

Го вверх!