ZX Format
#05
11 декабря 1996 |
|
Программистам - adventure: разумный подход к прохождению.
ADVENTURE: РАЗУМНЫЙ ПОДХОД К ПРОХОЖДЕНИЮ music by DNK (С) 1996 Alex ASP _________________________________________ 1. Введение Для начала, наверное, необходимо разъ- яснить, о чем вообще пойдет речь, дабы любители диззеобразных игр не закидали бы автора тухлыми яйцами, а сразу же могли вернуться к столь привычным для них соро- ка восьми предметам народного потребле- ния или что там у них на подходе. Итак, если, загрузив игру, Вы увидели кучу тек- ста (с корявыми картинками), да и еще от Вас требуют что-то вводить с клавы на ан- глицком, как правило, лангуаге после по- хабных 'What now?', '>', '*' и им подо- бных, то смело можете жать Super Magic Button или 'комбинацию из трех пальцев' (Ctrl+Alt+Del), что, в сущности, одно и то же, наконец-то понимая, что из себя представляет Adventure-игрушка. Теперь можно поговорить и о спеллинге. Всвязи с тем, что автор - человек доволь- но ленивый, и его просто ломает переклю- чаться без особой надобности на вышеупо- мянутый англицкий посредством хлопания по двум клавишам, то он просто введет рус- ский эквивалент слова Adventure. На самом деле, это слово звучит так: "адвенчер", а в переводе означает "приключение", но го- ворить "приключенческая игра" влом, похо- же, не только автору, но и всем, а термин "адвенчер", похоже, никого не прикалывал. И тут добрый "Инфорком" предложил: "А да- вайте-ка обзовем все это дело словцом "адвентюра"! Ведь крутое словцо-то, а?" И именно с той поры и начали все, кому не лень, именовать игрушки данного рода этим корявым словом. Что ж, раз уж так пове- лось, то и автор будет употреблять этого уродца в качестве эквивалента. Теперь немного поговорим о том, какие бывают адвентюры, ибо адвентюра адвентюре рознь. Так вот, поделим мы их на две ча- сти: написанные при помощи всевозможных неудобных, но все-таки работающих пакетов и написанные без оных. В свою очередь, пакетные делятся по наименованиям паке- тов, в коих они были сотворены, а безпа- кетные делятся по языку написания. Среди пакетов наиболее распространены (отделя- ются точкой с запятой) Adventure Builder System (ABS и ее русифицированная произ- водная); Graphic Adventure Creator (он же GAC); Quill, Patch, Illustrator (QPI). Среди беспакетных распространены написан- ные в BASIC'e (как с использованием маш- кода, так и без оного (сюда же можно от- нести и ABS)), на других языках высокого (хм?) уровня, например, Laser BASIC'e (честно признаюсь, что видел только одну такую вещицу), а также на языке низкого уровня, т.е. Assembler'e (или в машкоде - кому что больше нравится). Интересно от- метить то, что качество игры, ее слож- ность и интересность (простите) обратно пропорциональны уровню языка, на котором она написана. Есть еще несколько параме- тров, по которым можно поделить адвентю- ры: с графикой/без нее, требующей не ме- нее 128К/не имеющей данных претензий, с сопровой музыкой/вообще немой, а также по годам выпуска или производителям, но не это будет главным. И именно в этот момент настало то вре- мя, когда можно объяснить уставшему чита- телю, о чем же дальше пойдет повествова- ние. А пойдет речь о том, как помочь себе самому, если адвентюра упирается и не хо- чет раскалываться. Чем-то этот материал поможет русификаторам (сам автор в такие игры не играет, так как придерживается принципа, что если что-то хорошо, то его всегда можно сделать еще хуже, а желающих это сделать всегда с лихвой найдется). И, наконец, последний абзац. Автор бу- дет рад видеть какие-либо отклики на ра- боту, замечания, исправления, доп. инфо- рмацию и проч. Для связи можно использо- вать журнал ZX-FORMAT (адрес можно найти где-нибудь внутри журнала), а также можно выйти (пешком, наезжать лучше не надо - не конструктивно это) лично на автора по E-mail: SAB94174@D1.IFMO.RU P.S. Пару слов о теневом мониторе, вшитом в Scorp. Автору интересно, по каким при- чинам создатели Scorp'a отрубили вход в монитор из BASIC'a и TR-DOS. Возможно, у автора устаревшая прошивка (прошивка ав- тора или ПЗУ - не известно). Некоторым читателям, по-видимому, прийдется пользо- ваться теневым монитором, и столкнуться с такой же проблемой, а посему автор осме- лился предложить для них нижеизложенный способ входа из BASIC'a в монитор. В ко- мандной строке набирается: POKE 16384,195: POKE 16385,0: POKE 16386, 64: POKE 16387,201: RANDOMIZE USR 16384 или в переводе 16384 JP 16384 16387 RET Для тех, кто не понял, объясняю: програм- ма запускается с адреса 16384 и выполня- ет команду, предписывающую перейти по ад- ресу 16384 и выполнить команду, находящу- юся там (а там находится команда перехо- да по адресу 16384, где содержится ко- манда перехода...). После запуска этой программки самое время нажать Magic But- ton (не путать с SMB, о которой было на- писано выше) и с радостью вывалиться в теневой монитор. Зачем же по адресу 16387 стоит команда возврата, спросите Вы. А затем, чтобы, при необходимости, суметь вновь вывалиться в родимый BASIC не пере- капывая кучу машкода в поисках команды возврата. Делается это путем набивания двух строк в командной строке монитора: PC=16387 EXIT и нажатия кнопки '0', означающей возврат в программу. Может быть, это все и извра- щение, но является одним из возможных подходов к решению проблемы. На сем месте разрешите откланяться, и, если автора не прибьют в конец обнаглевшие гоблины, то в следующий раз и начнется серьезный разго- вор об адвентюрах, а в частности - об их словарном запасе. ZF> Пара слов по поводу более простого способа вызова теневика: POKE 16384,243: POKE 16385,118: POKE 16386,251: POKE 16387,201: RANDOMIZE USR 16384 что в свою очередь значит: DI HALT EI RET И вам не понадобиться переустанавливать PC, a для выхода из теневика достаточно просто набрать J. 2. Словарь. Настала пора поговорить об языковых проблемах. Можно долго спорить, какой язык лучше - русский или английский. Ав- тор придерживается того мнения, что лю- бое произведение лучше всего читать в оригинале, поэтому про всевозможные руси- фикации может лишь заметить, мол, третий сорт - не брак. Однако и в русской версии игры, и в английской очень часто встает вопрос: а что же программа сможет понять из того, что ей скажут? И вообще, что ну- жно сказать программе, чтобы пройти игру дальше? Одного знания языка быват мало. Так, например, несколько лет назад, играя в игру Robin of Sherlock, я был весьма удивлен тем, что, во-первых, нужно было звонить по телефону Лестрейду, про суще- ствование которого создатели позабыли оповестить играющих, а, во-вторых, тем, что для того, чтобы осуществить вышеука- занное действие, нужна была команда Redi- al, что означает перезвонить, а не Dial, означающая просто позвонить. Для устране- ния подобных обломов и полезно просматри- вать словарь игры. Существует несколько форматов хране- ния словарей. Далее по тексту будут опи- саны некоторые из них (те, которые ис- пользовались в игрушах, валявшихся у ав- тора где-то в районе коробки с дисками). Совсем в конце будут приведены небольшие программки, которые, ковыряясь в кишках игрушки, вытаскивают на свет то, о чем идет речь вот уже порядка полутора кило- байтов. Что ж, настала пора войти в этот Ад злобной богини Вентюры. 2.1 Пакетные игры. 2.1.1 ABS А что Вы, собственно говоря, ожидали здесь увидеть? Это весьма простой пакет, где для ввода данных (словаря и пр.) и для самой игры используется BASIC, чем обуславливается неудобство написания, ма- лый размер (в локациях, памяти же она за- нимает отвратительно много), тормозность при получении не только машкодового бло- ка, но и при самой игре, и куча других нареканий. Этот пакет пару лет назад ис- пользовали русские программисты, наводняя страну продукцией весьма сомнительного (в большинстве своем) качества, за что ог- ромное СПАСИБО нужно сказать все тому же Инфоркому, который умудрился откопать это чудо со свалки, русифицировал его и выпу- стил в свет. Сам пакет можно найти в ZX-Ревю (на мой взгляд "ревью" бы звучало куда лучше и больше бы соответствовало слову Review) NN 9-12 1993 года и в Spec- trofon N 1 (данные приведены из памяти). Вернемся к нашим баранам (это я не об Инфоркоме). В пакете применяется самый простой формат хранения словаря, описание которого сейчас последует. Формат N 1. Каждое слово словаря начинается с пер- вых, как правило, четырех букв слова. Вместо четырех может быть и любое другое число букв, например, пять или три, но обычно используют именно четыре. Затем следует номер этого слова в словаре, по- сле чего - первые четыре буквы следующего слова и т.д. Если длина слова меньше не- обходимого для распознавания числа букв (в данном случае меньше четырех), а это бывает при использовании сокращений типа E вместо EAST, то оставшееся место доби- вается пробелами (будет E и три пробела) или нулями. В играх словарь начинается с адреса, записанного в ячейках 64860/1. Встреча- лась, правда, игрушка Last Rider, которая базировалась на ABS, но сам пакет был до- работан, благодаря чему программа воспри- нимала не два, а три слова. В этой игре начало словаря хранилось в ячейках 65297/8. Перед поиском словаря рекоменду- ется переключиться на шрифт, используемый в данной программе, особенно при просма- тривании словаря русских игрушек. 2.1.2 QPI. Этот пакет будет посерьезнее предыду- щего. Сам пакет автору увидеть не дове- лось, поэтому о том, что этот пакет пред- ставляет, автор может судить лишь по иг- рушкам, написанным в этом пакете. Хочется заметить, что большинство пакетных игру- шек, валявшихся на дисках, были написаны именно в QPI, среди них изрядное количес- тво занимают пародии на другие известные адвентюрные игры. В пакете используется следующий формат хранения словаря: Формат N 2. Сей формат являет собой модификацию предыдущего формата, заключающуюся в том, что сами слова закодированы. При кодиро- вании использовалась команда CPL, которая инвертирует все биты аккумулятора, т.е. выполняет то же самое, что и команда XOR #FF. Существует два адреса, где могут хра- ниться данные о начале словаря. В самых старых игрушках (Hotel 'Africa Gardens'; Hampstead) они находятся в ячейках 27937/8, а в более новых - в ячейках 27557/8. 2.1.3 GAC Этот пакет довольно хорошо известен нашему народу, как и вышеопущенный ABS. Информация о нем может быть найдена где-то в районе Cпектрофона N 10, автор же работал с кассетной версией, откопан- ной там же, где и ABS. Не смотря на иден- тичное место обнаружения, он вселяет го- раздо больше оптимизьма в светлое будущее пакетного адвентюропроизводизьма, чем его менее удачливый коллега. Наверное, он на- ходится на одной ступени с QPI. Словарь же хранится следующим образом: Формат N 3. Сначала идет слово полностью. Потом это слово заканчивается и вслед за ним идет его номер. После этого все повторя- ется. Кодировка отсутствует. Эти данные были получены при работе с прилагающимся примером игры и могут быть совершенно другими в других игрушках, ко- их автору видеть до сей поры еще не дове- лось, окромя Apollo, но о ней нужно вести разговор особый. Не смотря на вышеупомя- нутый формат словаря, программа положи- тельно реагирует на сокращения из трех букв (как не стыдно! Не о том думаете!). 2.2 Беспакетные игры. Настала пора рассмотреть продукцию тех авторов, которые сказали:"Мы пойдем дру- гим путем". Сказано - сделано, и вскоре появляются замечательные игрушки, пере- числять которые автор не будет (кто ж за это ему будет благодарен?), а лучше зай- мется он описанием форматов хранения сло- варей в этих игрушках, отсортировав их по производителям. 2.2.1 Adventure Soft Здесь используется уже известный нам Формат N 1 (Rebel Planet). Комментарии излишни. 2.2.2 Adventure International Словарь в игрушках этой фирмы имеет пару различных форматов хранения, но, к счастью, он не закодирован. Формат N 4. Сначала идет идентификатор слова, за- нимающий один байт. Если он равен 0, то слово, которое за ним последует, будет новым словом, а если он равен 42 (#2А), то следующее за ним слово будет синони- мом предыдущего. Далее следуют первые че- тыре буквы слова, после чего все повторя- ется. Такой формат кодирования применялся в старых игрушках (Hulk). Осознав, видимо, что в результате такой кодировки словаря совершенно неоправданно расходуется лиш- ний байт на каждое слово, программисты побросали свои любимые игрушки, стали но- чами не спать и, наконец, придумали, как уберечь пропадавшую раньше сотню-другую байт. Так, судя по всему, и появился сле- дуюущий формат. Формат N 5. Вначале идут первые четыре буквы сло- ва. Если первая буква - прописная латин- ская, то слово новое, а если она заглав- ная латинская, то это слово является си- нонимом предыдущего. Три оставшиеся бук- вы - заглавные. Следом идут четыре буквы следующего слова, подчиняясь этому же правилу и т.д. Такой формат хранения словаря приме- нялся в более поздних играх (Robin of Sherwood, Seas of Blood). Словарь в них начинается со следующей строки символов: "aUTOgO". Если надумаете сами искать сло- варь, то можно рекомендовать искать его начало по этой строке. 2.2.3 Mastertronic. Долгое время автор считал, что эта фирма производит только игрушки, в кото- рые заставляют играть приговоренных к высшей мере наказания (хорошо по этому поводу высказались в Robin of Sherlock). Но тут попалась(лся/лось) на глаза ZZZZ, и именно эта игрушка опровергла вышеупо- мянутое представление об этой фирме. Фор- мат хранения словаря - N 5. Формат N 6. Чем-то этот формат напоминает предыду- щий. Вначале три заглавные буквы первого слова, потом три заглавные буквы второго и т.д. 2.2.4 Ocean. Весьма уважаемая автором фирма, соз- давшая множество неплохих Action игрушек, приложила руку и к адвентюрам, и вышло у нее это совсем неплохо. Для хранения сло- варя был использован Формат N 1 с тремя первыми буквами слова (Neverending Story). 2.2.5 Abstract Concepts. Концепции этой фирмы и вправду абс- трактные, эдакий изврат. Если посмотреть на игрушку невооруженным взглядом, а рас- сматривался Mindfighter, то создается впечатление наворотности. На самом же де- ле все не так сложно, как могло бы быть, а формат хранения словаря, на мой взгляд, страдает некоторой избыточностью. Формат N 7. Словарь закодирован как и его коллега под номером 2, т.е. используется команда CPL. С самого начала обнаруживаются пер- вые пять букв слова. Следом за ними идет байт, значение которого означает номер слова в группе. После него идет еще один байт, означающий номер группы, к которой принадлежит данное слово. При длине слова менее пяти байт, оставшееся место забива- ется пробелами, что в закодированном ва- рианте соответствует числу 233. Синонимы имеют одинаковые порядковые номера и но- мера групп. Группы имеют следующие номе- ра: 0. Глаголы 1. Не используется 2. Существительные 3. Прилагательные 4. Наречия, предлоги и прочая нечисть 5. Союзы 6. Местоимения Про группы 4, 5 и 6 сказать что-либо сложно, но, вроде бы, приемущественное разграничение именно такое. Словарь начинался с адреса 38433 в файлах MindFX.A, где X={0..3}. 2.2.6 Level 9. Похоже, девизом этой фирмы было выска- зывание приблизительно следующего содер- жания: "Никогда не делай проще то, что можно и нужно сделать гораздо труднее". Именно этого принципа фирма придержива- лась во всех своих программах. О самой фирме писалось где-то в неизменном ZX-Ревю, если не ошибаюсь, 94 года. Без приличного знания английского языка в этих игрушках делать практически нечего, а без приличного знания Assembler'а - не- чего в них и ковыряться. В большинстве случаев и то, и другое становится просто бессмысленной тратой времени при отсут- ствии наличия или при наличии отсутствия вышеоговоренных знаний. Зато при знании первого, а еще лучше и второго, гаранти- ровано изрядное количество головодроби- тельных, а не просто головоломных задач. Впрочем, это - лирическое отступление. Настала пора поговорить и о словаре. Здесь подстерегают несколько форматов, поэтому рассмотрим их согласно устано- вленному регламенту. Для разминки фирма использовала третий формат (Emerald Isle). В программе Red Moon был использо- ван немного другой формат, а имено вышео- писанный Формат N 3. И вот мы подобрались к самому навороченному формату хранения данных из всех виденных ранее. Это извра- щение было откопано в программе The Worm in Paradise. Формат N 8. Признаюсь честно, я так до конца и не разобрался, что и как там происходит, то есть разобрался, но как это перевести во что нибудь простое на BASIC'е или Assem- bler'е мне до сих пор непонятно. Поэтому не могу я его конкретно описать здесь, а, чтобы не мучить вас своими 'вроде как', приведу программку, позволяющую счастли- вым владельцам теневого монитора просмо- треть хоть как-то этот словарь. 2.3 Что делать?... Написал я всю эту лабуду и подумал, а кому все это, собственно говоря, нужно? Посидел, подумал и хотел уж было весь этот текст заксорить, а дискетку после него расформатировать, но в последний мо- мент, когда рука уже зависла над самой главной кнопкой, пришла мысль о том, что вдруг кто-нибудь мне этого не простит. Вот так и остались вышеизложенные мысли в этой статье. На самом же деле мораль это- го текста вовсе не в них, а вот в чем. Предположим такую ситуацию: неизвестно откуда среди порядком поднадоевших ходи- лок-собиралок, мочилок и прочих остаточ- ных продуктов безотходного производства появляется одна-единственная сиротинуш- ка - адвентюрка. Решив, что заняться со- всем нечем, Вы бросаетесь в бой и, пройдя около половины игрушки, осознаете, что дальше-то идут сплошные обломы. Что же делать? Предлагаются следующие варианты (нужное подчеркнуть): а) Расформатировать диск и забыть об этой адвентюре как о страшном сне. б) Найти умного дядю, который либо произ- ведет вместо Вас действие а), либо Вам скажет, как ее пройти дальше. в) При невозможности выполнения первых двух действий прийдется копать про- грамму самому. Предположим также, что из предложенного выбран третий пункт. Для начала следует обратить внимание на файловую структуру программы. Если с первого взгляда броса- ется в глаза аномально огромная длина BASIC-файла, то это или ABS'овское поро- ждение, или не менее страшное нечто, ло- гика которого написана в BASIC'e, либо моноблоковый загрузчик. В первых двух случаях рекомендуется просмотреть кодовые блоки этих монстров каким-либо viewer'ом. Если там нет ничего похожего на словарь, то приготовтесь к поискам в BASIC'е. В случае же с моноблоковым загрузчиком сто- ит обматерить (про себя) тех буржуев, ко- торым жалко лишнего полупустого сектора на диске, а затем прийдется либо ломать загрузчик и обломкам придавать вид фай- лов, если просмотр каким-либо viewer'ом дает ровным счетом ничего, а ломка такая требует небольшого знания Assembler'a, либо обзаводиться теневым монитором и ко- паться в кишках дальше. Кстати, прежде чем лезть вовнутрь любой адвентюры, пе- рвым делом посмотрите коды viewerом - это сэкономит и время, и нервы. Обратите внимание на фирму, произвед- шую Ваше подопытное животное и посмотри- те эту статейку - быть может Вам повезет и Вы найдете эту фирму (или пакет) среди вышеописанных. Ну а если Вам повезет еще больше, то формат, описанный здесь, сов- падет с форматом в Вашей игре. При наличии теневого монитора можно слегка повеселиться. Бывают такие прогон- щики, которые перекодируют загружаемые данные сразу после загрузки, что встре- чается довольно часто, либо во время за- грузки, что встречается реже и, вроде бы, только на ленте. В таком случае ждем до тех пор, пока игрушка не начнет работать, а затем с радостными воплями жмем любимый Magic Button и, если какой-нибудь извра- щенец не придумал обломать Вас с этим де- лом, заЩИТщая свой загрузчик с очередной хромающей ползукой, полной мегафуцков, даете команды mem начиная от 25000 с ша- гом 1000. Справа будет видно содержимое ячеек в символьном виде. Двигаясь таким макаром, Вы либо натолкнетесь на словарь, а может быть и на текст сообщений, либо прийдется лезть еще глубже. Ежели Вам посчастливилось с пол-пинка найти словарь, то можно поздравить Вас с удачей. Остальным же можно посочувство- вать и предложить провести проверку на использование формата N 2 или N 7. Для Формата N 2 можно использовать следующую программку: 10 FOR N=256*PEEK 64861+PEEK 64860 TO 64000 STEP 5: PRINT PEEK (N+4);TAB 4;: FOR M=N TO N+3: PRINT CHR$ (255-PEEK M);: NEXT M: PRINT: NEXT N Ну а если кто-то желает покопаться в мозгах MindFighter'а, или посмотреть Фор- мат N 7, рекомендуется следующее извраще- ние: 10 FOR A=0 TO 6: PRINT '"Group ";A'': FOR N=38433 TO 65535 STEP 7: IF PEEK (N+6)=A THEN PRINT PEEK (N+5); TAB 7;: FOR B=N TO N+4: PRINT CHR$ (255-PEEK B);: NEXT B: PRINT 20 IF PEEK (N+7)=0 THEN GOTO 40 30 NEXT N 40 NEXT A Можно предположить существование неко- его формата, похожего на N 2 - использо- вание кодировки по XOR #NN. В этом случае можно опять же пролистать всю память ни- жеследующей программкой, смотря на то, что появляется сугубо скептически (с ша- гом 1000, как и в ситуации с теневым мо- нитором): 10 LET T=40000: LET A=1: POKE T+3,A: INPUT L: FOR N=L TO 65535: POKE T+1, PEEK N: RANDOMIZE USR T: NEXT N Здесь Т - адрес расположения процедурки в машкоде (его можно менять, но не за- будьте запоукать машкод именно туда, к чему приравняли Т), А - код ксорирования, а сама процедура выглядит следующим обра- зом: 62, 0, 238, 0, 215, 201 или T LD A, 0 XOR 0 RST #10 RET (Намеренно не привожу программок полно- стью написанных в машкоде дабы не отпуг- нуть юзеров - для них же, родимых, ста- раюсь, а то ищи их потом...) Набрав все это, делайте RUN. Далее листайте память. Ничего не дало - меняй- те А и снова - RUN. Повторю, что этот недоформат - мои измышлизмы, сам я его НИГДЕ не встречал, но вдруг?.. А теперь будет приведена обещанная ко- вырялка для Формата N 8. Для начала за- грузите игрушку как положено (эту фразу я увидел в одной инструкции к Art Studio, и у меня сразу же возник вопрос: а КАК по- ложено?) . Когда игра запустится и выве- дет Вам первый What now?, жмите MB. По благополучному прибытию в теневой монитор давайте команду mem #EAA0 и затем введите следующую строку: .#CD, #C0,#FF. Переводя на нормальный язык - CALL #FFC0, где и разместится наша программка. Дайте коман- ду mem #FFC0 и введите следующие строчки: .#E5, #21, #43, #E6, #7E, #FE, 0, #28, 6 .#CD, #3C, #F0, #23, #18, #F5, #3E, #20 .#CD, #3C, #F0, #E1, #C9 что в переводе означает: PUSH HL ; Запоминаем HL LD HL, #E643 ; в HL - начало буфера, ; где хранится слово, вы- ; тащенное программой для ; сравнивания с тем, что ; Вы ввели на What now? L1 LD A, (HL) ; В Акк. - содержимое HL CP #0 ; Проверяем на конец сло- ; ва JR Z, L2 ; Если конец - переход ; на L2 CALL #F03C ; Вызов подпрограммы пе- ; чати символа INC HL ; Увеличиваем значение ; HL, чтобы прочитать ; следующую букву JR L1 ; И все делаем заново L2 LD A, #20 ; Суда мы попадаем, если ; слово закончилось. В ; Акк. - код пробела CALL #F03C ; Печатаем пробел, чтобы ; слова не сливались POP HL ; Восстанавливаем HL RET ; Возвращаемся в програм- ; му Теперь выходим из монитора и вводим какое-нибудь слово. В ответ наша програм- мка напечатает те слова, с которыми осно- вная программа проверяла введенное слово. В программе стоит хитрый анализатор, по- этому вам прийдется слегка поработать, чтобы просмотреть весь словарные запас. Возможны глюки со стороны программы печа- ти. Но все же это лучше, чем ничего. здесь, казалось бы, можно было поста- вить точку, но я скажу еще парочку слов. Во-первых, здесь рассмотрено не все мно- гообразие форматов хранения словарей, а лишь только то, что у меня валялось под рукой. Если у кого-то что-то завалялось из неописанного мной, и он не может ра- зобраться сам, то не шлите мне мегафуц- ки, а лучше (если не влом) саму эту про- граммку. Глядишь, что-нибудь про это бе- зобразие и появитсяв следующем ZF. Може- те и сами послать описание формата. Для меня - халява, для Вас в этих двух слу- чаях - персональный тханкс прям здесь, если сами халявить не будете. А я тем временем чем-нибудь да позанимаюсь . Так что ждите того, сам не знаю чего да и продолженьица - на этот раз про хранение текстов. На сей весьма оптимистической ноте разрешите закончить наш разговор. Если повезет, то еще увидимся.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября