#!/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