| #!/usr/bin/gawk -f | |
| # To run type: awk -f cloak_of_darkness_ru.awk | |
| # Cloak of Darkness demo and GNU AWK Interactive Fiction engine | |
| # Copyright 2005 by Nick Moffitt | |
| # This code is released under the WTFPL: http://sam.zoy.org/wtfpl/ | |
| # Just do what you want with it! | |
| # Russian translation and modifications by Alexey Galkin, august 2022 | |
| BEGIN { | |
| IGNORECASE = 1 | |
| EAST = "^в$|восток" | |
| WEST = "^з$|запад" | |
| NORTH = "^с$|север" | |
| SOUTH = "^ю$|юг" | |
| DROP = "бросить|положить" | |
| TAKE = "взять|забрать|поднять" | |
| EXAMINE = "^о$|осм|осмотреть|изучить|оглядеть" | |
| INVENTORY = "^и$|инв|инвентарь" | |
| QUIT = "выход|выйти|закончить" | |
| player = "The Player" | |
| dark[player] = "true" | |
| score = 0 | |
| } | |
| #initial input sanitizing | |
| $2 { $2 = cansee($2) } | |
| ############################################################# | |
| # Game Data Begins Here | |
| ############################################################# | |
| BEGIN { | |
| foyer = "Фойе Оперного театра" | |
| description[foyer] = "Вы стоите в просторном зале, великолепно украшенном красным и золотым, со сверкающими люстрами над головой. Вход с улицы — на севере, а дверные проёмы — на юге и западе." | |
| } | |
| here == foyer && $1 ~ NORTH { | |
| print "Вы только пришли, и, кроме того, погода снаружи, похоже, портится." | |
| prompt() | |
| } | |
| here == foyer && $1 ~ WEST { go(cloakroom) ; prompt() } | |
| here == foyer && $1 ~ SOUTH { go(bar) ; prompt() } | |
| BEGIN { | |
| cloakroom = "Гардероб" | |
| description[cloakroom] = "Стены этой маленькой комнаты явно когда-то украшали крючки, хотя сейчас остался всего один. Выход — через дверь на востоке." | |
| } | |
| here == cloakroom && $1 ~ EAST { go(foyer) ; prompt() } | |
| BEGIN { | |
| hook = "маленький латунный крючок|крюк" | |
| location[hook] = cloakroom | |
| open[hook] = 1 | |
| invisible[hook] = 1 | |
| } | |
| $2 == hook && $1 ~ /взять/ { print "Вы не можете это взять!"; prompt()} | |
| $2 == hook && $1 ~ EXAMINE { | |
| printf "Небольшой латунный крючок " | |
| if (location[cloak] == hook) { | |
| printf "на котором висит плащ." | |
| } else { | |
| printf "прикручен к стене." | |
| } | |
| } | |
| BEGIN { | |
| bar = "Бар в фойе" | |
| description[bar] = "Бар выглядит гораздо хуже, чем вы представляли, после всей роскоши фойе на севере, и совершенно пуст. Кажется, в опилках на полу оставлено какое-то послание." | |
| dark[bar] = 1 | |
| bumblings = 0 | |
| } | |
| here == bar && $1 ~ NORTH { go(foyer) ; prompt() } | |
| dark[bar] && here == bar { | |
| print "В темноте? Вы можете наделать беспорядок!" | |
| bumblings++ | |
| prompt() | |
| } | |
| BEGIN { | |
| cloak = "бархатный плащ" | |
| description[cloak] = "Красивый плащ из бархата, отороченный атласом и слегка забрызганный каплями дождя. Плащ настолько чёрный, что кажется, будто он высасывает свет из комнаты." | |
| location[cloak] = player | |
| } | |
| $2 == cloak && ($1 ~ DROP || /повесить|снять/) { | |
| if (here == cloakroom) { | |
| delete dark[bar] | |
| move(cloak, hook) | |
| print "Вы осторожно вешаете чернильного цвета плащ на маленький латунный крючок. Вы чувствуете себя... как-то легче." | |
| } else { | |
| print "Это не лучшее место, чтобы оставить валяться здесь такой элегантный плащ!" | |
| } | |
| prompt() | |
| } | |
| $2 == cloak && $1 ~ TAKE || /надеть/ { | |
| if (location[$2] == player ) { | |
| print "У вас уже есть " $2 "." | |
| prompt() | |
| } | |
| move($2, player) | |
| dark[bar] = 1 | |
| print $2 ": взято." | |
| prompt() | |
| } | |
| BEGIN { | |
| message = "нацарапанное сообщение|послание|опилки" | |
| location[message] = bar | |
| invisible[message] = 1 | |
| } | |
| $2 == message && ($1 ~ EXAMINE || /читать/) { | |
| if (bumblings < 2) { | |
| print "Аккуратно выведенное в опилках послание гласит: «ВЫ ПОБЕДИЛИ».\n" | |
| exit 0 | |
| } else { | |
| print "Послание на полу по неосторожности растоптано, не позволяя разобрать его содержание. Вы различаете лишь слова «ВЫ ПРОИГРАЛИ».\n" | |
| exit 1 | |
| } | |
| } | |
| BEGIN { | |
| here = foyer | |
| print "\033[1mПЛАЩ ТЬМЫ\033[0m\n\nВы мчитесь сквозь дождливую ноябрьскую ночь и радуетесь, увидев яркие огни Оперного театра. Удивительно, что никого нет, но, эй, что вы ожидали от дешевой демо-игры...?" | |
| printf "\n\n> " | |
| } | |
| ############################################################# | |
| # Game Data Ends Here | |
| ############################################################# | |
| $1 ~ EAST || $1 ~ WEST || $1 ~ NORTH || $1 ~ SOUTH { | |
| print "Вы не можете пойти в этом направлении." | |
| prompt() | |
| } | |
| $1 ~ TAKE { | |
| if (location[$2] == player ) { | |
| print "У вас уже есть " $2 "." | |
| prompt() | |
| } | |
| move($2, player) | |
| print $2 ": взято." | |
| prompt() | |
| } | |
| $1 ~ INVENTORY { inventory() ; prompt() } | |
| $1 ~ EXAMINE && $2 { look($2) ; prompt()} | |
| $1 ~ EXAMINE || ! $1 { look(here) ; prompt() } # пустая строка - вывод описания локации | |
| $1 ~ QUIT {exit 1} | |
| # Default verb confusion | |
| { | |
| print "Неизвестный глагол \"" $1 "\"." | |
| prompt() | |
| } | |
| function prompt() { | |
| printf "\n> " | |
| next | |
| } | |
| function move(object, destination) { | |
| location[object] = destination | |
| } | |
| function go(destination) { | |
| here = destination | |
| look(here) | |
| } | |
| function look(object) { | |
| if (object == here) { | |
| print "\033[1m" here "\033[0m" | |
| } | |
| if (dark[here]) { | |
| print "Здесь темно — хоть глаз выколи. Вас может съесть гру." | |
| prompt() | |
| } else { | |
| print description[object] | |
| } | |
| if (object == here) { | |
| for (item in location) { | |
| if (location[item] == here && !invisible[item]) { | |
| print "\nЗдесь есть " item "." | |
| } | |
| if (location[item] == here && open[item]) { | |
| for (subitem in location) { | |
| if (location[subitem] == item) { | |
| print "\nЗдесь есть \033[33m" subitem "\033[0m." | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| function inventory() { | |
| print "У вас есть: " | |
| for (item in location) { | |
| if (location[item] == player) { | |
| print " " item | |
| } | |
| } | |
| } | |
| function cansee(object) { | |
| for (item in location) { | |
| if (location[item] == here || location[item] == player) { | |
| if (item ~ object) { | |
| return item | |
| } | |
| if (open[item]) { | |
| for (thing in location) { | |
| if (location[thing] == item) { | |
| if (thing ~ object) { | |
| return thing | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| print "Я не вижу здесь \"" object "\"." | |
| prompt() | |
| } | |
| # ex:ts=4 sw=4 tw=72 expandtab ai | |
Xet Storage Details
- Size:
- 7.99 kB
- Xet hash:
- b1da31310d05667a04c098193f9b05f45f79d7b473d374b1195a69a0b61436af
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.