diff --git a/.vscode/launch.json b/.vscode/launch.json index dd14571..bf44c1e 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -17,7 +17,7 @@ "buildFlags": "-tags local" }, { - "name": "Local Launch", + "name": "Launch for tests", "type": "go", "request": "launch", "mode": "debug", diff --git a/.vscode/settings.json b/.vscode/settings.json index ae84134..2053561 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -11,5 +11,9 @@ "palces", "qrcode", "signintech" + ], + "makefile.configureOnOpen": false, + "go.testFlags": [ + "-count=1", ] } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..105cbda --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,33 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Gen Config", + "type": "shell", + "isBackground": true, + "command": "make generate", + "presentation": { + "reveal": "always", + "panel": "new" + }, + "problemMatcher": [ + "$go" + ] + }, + { + "label": "Tests", + "type": "shell", + "isBackground": true, + "command": "make test", + "presentation": { + "reveal": "always", + "panel": "new" + }, + "problemMatcher": [ + "$go" + ] + } + ] +} \ No newline at end of file diff --git a/api/main.proto b/api/main.proto index fdb99e7..63bbda4 100644 --- a/api/main.proto +++ b/api/main.proto @@ -191,6 +191,8 @@ message GetGraphReq {} message GetGraphRsp { repeated Node nodes = 1; repeated Edge edges = 2; + int32 countNodes = 3; + int32 countEdges = 4; message Node { int32 id = 1; diff --git a/data/story/story.json b/data/story/story.json index ca6212e..c6dad0a 100644 --- a/data/story/story.json +++ b/data/story/story.json @@ -1 +1 @@ -{"places":[{"code":"ЛП-1","name":"Шезлонги","text":"Десяток аккуратно расставленных шезлонгов с пастельно-голубыми полосатыми матрасами, под цвет балетных пачек. Каркасы — из потемневшего от солёного воздуха тика, с небольшими табличками, указывающими номера кают. Утром они стоят пустые, лишь на некоторых остались следы вчерашнего вечера:\nНа одном — пустой бокал с подтаявшим дном, прилипший к подстаканнику. Внутри болтается синий бумажный зонтик.\nПод третьим шезлонгом, в тени, валяется небольшая розовая заколка-краб.\nВоздух пахнет речной водой, нагретым деревом и сладковатым ароматом засохшего коктейля. Утреннее солнце высветливает пылинки, кружащиеся в воздухе. Единственный свидетель утра — горничная Люба, которая сонно протирает матрасы тряпкой, напевая что-то себе под нос и поглядывая на дверь в бар, откуда доносятся звуки уборки."},{"code":"ЛП-2","name":"Бассейн","text":"Небольшой, но живописный бассейн в форме лебедя. Вода чуть мутновата от ночной прохлады, на поверхности плавает несколько опавших лепестков от цветочных композиций с вечеринки. По краям — синие пластиковые шезлонги и плетёные столики."},{"code":"ЛП-3","name":"Прохладительные напитки","text":"Небольшая стойка-бар под тентом у бассейна. За прилавком — ряды бутылок с яркими сиропами, содовой в сифонах и медный холодильник, густо покрытый конденсатом. Утром бар не работает, но на стойке остались следы вчерашней суеты."},{"code":"ТЗ","name":"Танцевальный зал","text":"Господа артисты, а теперь растяжка, девочки помогите, к нам гости.\nВас встречает Маргарита Станиславовна. \nПочему не в форме, вчера вы отлично танцевали с нами вместе.\nВы рассказываете события которые застали вас с первыми лучами солнца. \nЯ вчера была в том баре, И девочки там были, Этот мужчина в пиджаке за баром сидел, не нравится он мне, телефоном своим тыкал бармену в лицо, мне даже жалко мальчишку стало. А потом пришел этот мясник, злой весь пыхтел. Я чего заметила то, он меня каждый вечер танцевать зовет, а вчера с барменом поговорил, и пулей вылетел из бара."},{"code":"Р-1","name":"Ресторан «Феэте \u0026 Фуа-гра»","text":"Вас встречает высокий грузный мужчина лет 40. В белой форме, он уже накричал на двоих поваров за халатность.\nСемен Викторович? Конечно знаю - VIP клиент, холить и лелеять, целовать в жопу - приказ капитана. Был вчера, не самый приятный человек. Поел был даже весел. Когда ушел не знаю. Я отходил отнести в “Пуанты” десерт. \nВы просите поговорить с официантом который приносил вчера обед в каюту 323.\nГЕНА! Хороший парень. Его ещё нет. Весь вечер он был тут, а после за разбитую тарелку, он мыл посуду вместе с посудомойкой. Часов до 3 должны были тут быть."},{"code":"Т-1","name":"Туалет","text":"Все уделали, паразиты, а мне опять отмывай. Проклятый бар.\nОсмотрев комнату уже нельзя было понять что кому-то здесь было плохо, тётя Глаша тут уже все убрала."},{"code":"Б-1","name":"Бар «Пуанты вверх!»","text":"С утра бар закрыт, приглушённое освещение и тишина делают его похожим на театральные кулисы после спектакля. Стойка липкая от пролитых напитков, на её поверхности — засохшие круги от бокалов, рассыпанная соль, мятные палочки и крошки от орешков. Под стойкой, рядом с мусорным ведром, валяется смятая пачка сигарет «Ява» и один синий пластиковый зонтик для коктейлей."},{"code":"К","name":"Костюмерная","text":"Тесное, забитое до потолка стеллажами помещение. Повсюду висят пышные пачки, трико, перья и блестящие аксессуары. Пахнет нафталином, гримом и пудрой. На большом столе у зеркала — беспорядок: коробка с нитками и иголками, пустая упаковка от таблеток «от усталости ног» и распечатанная афиша вчерашнего выступления с автографом."},{"code":"К-200","name":"Каюта 200","text":"Дверь закрыта."},{"code":"К-201","name":"Каюта 201","text":"Дверь закрыта."},{"code":"К-202","name":"Каюта 202","text":"Вам открывает дверь невысокий пожилой мужчина. Он встречает вас широкой улыбкой. Из разговора вы узнаете, что с обеда он до полуночи был на верхней палубе и играл на аккордеоне. Парни наверное спят еще, тяжелый денек был."},{"code":"К-203","name":"Каюта 203","text":"Дверь закрыта."},{"code":"К-204","name":"Каюта 204","text":"Вы стучитесь в дверь, которая с тихим скрипом открывается. Из каюты повеяло мягким цветочным ароматом. Вы проходите в комнату, никого нет. Осмотревшись, Вы замечаете пачку фотографий на столе среди которых вывстречаете и фото вчерашнего вечера.","applications":[{"name":"Фото"}]},{"code":"К-205","name":"Каюта 205","text":"Дверь закрыта."},{"code":"К-206","name":"Каюта 206","text":"На двери висит расписание занятий в танцевальном зале и сейчас Маргарита Станиславовна должна быть там."},{"code":"К-207","name":"Каюта 207","text":"Около каюты Вы встречаете молодую девушку, это же она танцевала вчера под звёздами. В каюте вы рассказываете что произошло и что ей грозит тюрьма. \nНет! Я ничего не крала! - она начинает плакать, - Я не самый хороший человек но я не нарушаю закон. Спросите руководителя, девчонок, я никогда…\nЭто дело кажется вам странным а почему-то вы верите, девушке. Хладнокровно украсть дорогой телефон, и так неудачно спрятать, что горничная находит его даже при легкой уборке.\nВчера всё утро мы репетировали, а после показывали историю про париж 19 века. После был мастер класс. Вечером как обычно с девчонками заглянули в бар, Алинке там бармен Толя нравится. Там были до половины десятого, а потом на Лебединую палубу пошли, там танцы вчера были и звезды красивые, Соня нас даже сфотографировала.\nВы с задумчивым видом получаете разрешение взять буклеты, кладете их в карман и покидаете каюту.","applications":[{"name":"Карта"}]},{"code":"К-208","name":"Каюта 208","text":"Дверь закрыта, Николай Степанович обычно в это время уже на верхней палубе играет в шахматы, поэтому вы не удивлены."},{"code":"К-209","name":"Каюта 209","text":"Убирайтесь прочь! - низкий голос из каюты."},{"code":"К-210","name":"Каюта 210","text":"Каюта закрыта, капитан на мостике."},{"code":"К-211","name":"Каюта 211","text":"Встретив старпома в коридоре, он разрешает вам исследовать его каюту, он дает вам ключи и удаляется. Идеальный порядок, пахнет свежей краской, типографской краской и металлом. Каюта похожа на кабинет штурмана. На столе — стопка уставов, навигационные приборы, распечатанный график вахт и телескоп в чехле. На стене — астрономическая карта звёздного неба, схема устройства теплохода и диплом мореходного училища. На полке — потёртый блокнот со стихами о море и лейкопластырь. Возле иллюминатора на штативе установлен телескоп, направленный на звёзды. В ящике стола, под схемами, лежит секретная шифровка о розыске контрабандистов, а на её полях карандашом написано: «Груз №7 — бананы? Проверить по накладным. Капитан не слушает...». Рядом валяется пузырёк с антигистаминными таблетками."},{"code":"Р-2","name":"Ресторан «Гранд батон»","text":"Более скромный, чем «Фуэте \u0026 Фуа-гра», но уютный ресторан на третьей палубе. Утром здесь подают завтрак: запах кофе, свежей выпечки и масла. На столиках — остатки еды, сморщенные салфетки и меню с пятном от варенья. За стойкой официанты суетятся, разнося подносы."},{"code":"И","name":"Игровая комната «Золотая рыбка»","text":"Небольшая комната с игрушками, столом для рисования и несколькими стеллажами книг за кафедрой. Похоже руководитель комнаты еще не пришел. За кафедрой вы находите засаленный учебник по мореходству и пачку читательских билетов. В центре сидит девочка и строит башню из металлического конструктора. На полу валяется плюшевая пчёлка и раскраска с кораблём. В углу стоит жестяная коробка с надписью «Юный архитектор». На ваши вопросы она не отвечает."},{"code":"Т-2","name":"Туалет","text":"Чисто, пахнет хлоркой. На полу — мокрый след от швабры. Ведро для мусора переполнено смятыми бумажками и обёртками от леденцов."},{"code":"Б-2","name":"Бар «Гранд шот»","text":"У барной стойки никого нет. На столешнице табличка с надписью:\nРаботаем с 12:00"},{"code":"А","name":"Администрация","text":"Да-да, я знаю про трагедию, а Вы тот самый детектив о котором все только и говорят? Очень приятно Валерия Сергеевна Сомова, администратор.\nНа полках много папок но все расставлены в идеальном порядке по годам и рейсам, кажется ошибок быть не может.\nВот вам список пассажиров, в этот раз не все каюты заняты, одну даже выкупили но не поплыли с нами, я там отметила. Все пассажиры у нас хорошие вежливые. А я вчера вечером уже спала, режим, да и остановка сегодня большая работы много. А теперь еще и эта кража. Больше ничем помочь не могу.","applications":[{"name":"Список пассажиров"}]},{"code":"К-300","name":"Каюта 300","text":"Проходите, садитесь.\nВ её каюте пахнет духами и воспоминаниями. На столе — программки старых балетов, фото в роли Жизели на столе.\nЭто я. Хорошие были времена. А вот в кардебалете Витя Кораблев он с нами плывет. Хороший парень был. Связался с плохой компанией. \nНа фотографии вы видите шеф-повара. Моложе худее, но это точно он!\nЕго в 90-е поймали на хранении наркотиков, они называли его “скорость”. Красивое название, вы не находите? Тогда и пропал."},{"code":"К-301","name":"Каюта 301","text":"Я думаю это инопланетяне, даже Анжела поверила. Вчера такая вспышка была, и она двигалась Дима подтвердит. Зачем им телефон я не знаю, могли же кого-нибудь украсть, А все пассажиры на месте?"},{"code":"К-302","name":"Каюта 302","text":"Кто там? Мне папа запрещает открывать незнакомым, а он ещё спит."},{"code":"К-303","name":"Каюта 303","text":"Закрыто."},{"code":"К-304","name":"Каюта 304","text":"На стук никто не отвечает, прислушавшись Вы слышите легкое сопение и бормотание.\nКакая хорошенькая девочка. … Как так напиться можно было, негодяй! … Это же совсем не ваше дело, Вам танцевать нужно, а не пирожки печь."},{"code":"К-305","name":"Каюта 305","text":"Ты видел её глаза! Теперь то она точно поверит в НЛО! Такая вспышка интересная получилась, да все теперь поверят.\nСлышится радостный разговор из каюты."},{"code":"К-306","name":"Каюта 306","text":"Здравствуйте, я вчера на Лебединой с дочкой весь вечер была. Салюты огни было красиво. Мужчину про которого вы говорите я там не видела. Знаете что странно было. Вчера шеф сильно наорал на бармена на коктейльном столике. Он принес ящик бананов, а другой забрал точно такой же. Я запомнила потому что Настюшка сильно напугалась. А в остальном вечер отличный был."},{"code":"К-307","name":"Каюта 307","text":"Здравствуйте, это вы занимаетесь этим делом? У меня есть несколько зацепок. Вчера около 22:00 часов была вспышка очень близко к кораблю, и тогда же и исчез телефон. Это инопланетяне, им нужны наши технологии, они изучают нас! Я раньше не верила, но факты!!!"},{"code":"К-308","name":"Каюта 308","text":"Эту каюту Вы уже видели. Тут живет отличный мальчуган, внук Григория Семеновича и Людмилы Аркадьевны, скорее всего где-то с ними сейчас."},{"code":"К-309","name":"Каюта 309","text":"Здрасте, свою комнату обыскивать не позволю!!! Я завуч, я на вас жаловаться буду!\nВы пытаетесь объяснить ситуацию, и что обыскивать её вы не собираетесь. Но толку было бы больше рисуй вы на воде ровные квадраты вилами.\nВорует прислуга, они уже украли мою статуэтку и очки! Я найду на них и Вас управу.\nОчень вежливо извинившись вы уходите. Очки же у нее на цепочке, о статуэтка на полочке для ключей, увы сказать ей это не получится."},{"code":"К-310","name":"Каюта 310","text":"Дверь заперта, а около ручки очень аккуратно приклеен листок с кружевной надписью: “Греем косточки, ищите на верхней палубе”."},{"code":"К-311","name":"Каюта 311","text":"По коридору быстрым шагом несется Станислав с огромной клетчатой сумкой, кажется скоро его остановка. Вы кричите ему в след, но он уже Вас не слышит."},{"code":"К-312","name":"Каюта 312","text":"Виктор Павлович с которым вы познакомились еще в очереди на посадку очень рад вас видеть.\nПроходите, дорогой друг. \nОн приглашает вас в каюту и быстро закрывает дверь. В то же мгновение улыбка на его лице исчезла.\nНас нашли. Это они, наводят суету чтобы нас поймать. Я не могу сказать за что нас ищут, это государственная тайна.\nЕго жена, Людмила Ивановна, насторожено посмотрела на дверь. \nПосле пятиминутной беседы но уже шепотом, вы покидаете каюту, с боязнью что за 3 дня путешествия вы так обмякли что не заметили шпионов прямо под носом."},{"code":"К-313","name":"Каюта 313","text":"Уютный хаос из книг. На столе — «Три мушкетёра», очки и клетка с канарейкой Кешей. На тумбочке — стопки книг с закладками. На полу стоит корзинка с пряжей и следы птичьего корма.\nЯ вчера вечером ходила по коридору, уснуть долго не могла из-за музыки сверху. И видела как мальчишка зашел в каюту Катеньки в белой рубашке был и брюках. Еще шапочка была. Я с катенькой болтаю иногда, она молодец хочет в большой пойти, на пробы едет. Ой, я же забыла ей рассказать что вор был.\nВы обещаете что всё передадите и уходите."},{"code":"К-314","name":"Каюта 314","text":"Доносится громкий женский храп! Не стоит будить такую женщину."},{"code":"К-315","name":"Каюта 315","text":"Я ничего не крал! Я просто погоду смотрел! Я не знаю вашего … ну того обокраденного.\nДверь он так и не открыл, скрывает он что-то."},{"code":"К-316","name":"Каюта 316","text":"Из двери доносится легкий запах канифоли.\nЗдравствуйте, проходите. Я про вас слышал. Вернее читал в газете. Тогда в лагере мой ребенок отдыхал. Но он ничего не знает я не рассказывал, но спасибо огромное. \nОн крепко жмет Вашу руку.\nВы видели эту молодежь верят в привидения, и ползают везде. Я их даже в запретной зоне видел. А туда же нельзя. Ух руки бы им поотрывать. Столько радиоэлементов на свои глупости тратят, и откуда деньги!"},{"code":"К-317","name":"Каюта 317","text":"Дверь закрыта. На стук никто не отвечает."},{"code":"К-318","name":"Каюта телохранителя Гриши","text":"Ты это куда, сердешный? Я тут. А там никого нет.\nПрогремел мужчина у 320 каюты."},{"code":"К-319","name":"Каюта 319","text":"Закрыто."},{"code":"К-320","name":"Каюта 320","text":"У двери вас встречает охранник. Обыскав вас он стучит в дверь каюты. Вам открывает мужчина плотного телосложения в водолазке и толстой цепи. \nЗаходите, слышал конечно, весь корабль гудит. Я даже хотел отправить Гришу отправить искать, но администратор запретила, говорит не законно это. Не то чтобы я закона боюсь, но паники нам тут не надо.\nОн как то зло улыбнулся.\nЯ вам вот что скажу мои соседи - очень подозрительные ребята, из 303 постоянно что-то бормочет себе под нос. Поехавший, зуб даю. Гриша его уже дважды сломать хотел. А больше ничего подозрительного не видел, да я и не ищу, больше не ищу.\nОн ухмыльнулся и расплылся в холодной улыбке."},{"code":"К-321","name":"Каюта 321","text":"Ключ от этой двери вам достать не получилось, но Вас уверяют что там никого нет уже давно, и пыль в щели под дверью намекает на тоже."},{"code":"К-322","name":"Каюта 322","text":"Заперта на ключ. Из-под двери тянет запахом старой ткани и пыли. Если заглянуть в замочную скважину, можно увидеть стопки постельного белья и ведро с тряпками. Видимо, используется горничными для хранения запасов."},{"code":"К-323","name":"Каюта 323","text":"Просторная VIP каюта отличается от вашей только расположением кровати, и наличием чайника с микроволновкой. \n“Всё утро я играл в шахматы с Николаем Степанычем пока не проснулся Дмитрий Федотыч и я любезно уступил ему место на верхней палубе. После читал здесь “Записки юного врача” - он указал на книгу лежащую на столе рядом с буклетами.\n“Обед я заказал в каюту официант, который приносил мне блюда был очень любопытный все про телефон спрашивал, где я его купил и сколько стоит” - Семен закурил, руки его тряслись все сильнее и уже от злости.\nУбью ворюгу! Через 2 часа остановка там я и должен позвонить сыну. Вечером отужинав с Вами и нашей милой медсестрой, я проводил последнюю до её 400-ой каюты и пошел в бар пропустить стаканчик. Я был в баре, в том что на носу, остаток вечера, и точно помню мне пришло смс, где-то в 10 часов, от жены… не будем об этом. Я и много пить не собирался вчера. В итоге даже фарфорового друга обнимал в том же баре, только никому не говорите. Больше ничего не помню, проснулся думал проспал время звонка и потянулся за телефоном, дальше вы знаете.\nТолько он завершил свой рассказ, в дверь каюты кто-то постучался. \nВойдите.\nТётя Глаша взволнованно открыла дверь. Я случайно нашла ваш телефон в 207-ой. Вы забираете телефон: \n- Никому не говорите что нашли его.\nТелефон найден дело закрыто! Слишком просто. Вы убеждаете Семёна никому ничего не говорить пока Вы не разрешите. И направляетесь в 207-ую каюту [к-207].","applications":[{"name":"Список смс"}]},{"code":"К-324","name":"Каюта 324","text":"Незаправленная кровать, выдает не самое спокойное утро, приняв холодный душ, Вы садитесь в кресло и начинаете вспоминать события вчерашнего дня. Прекрасный спектакль на первой палубе, со сцены три неотразимые молодые танцовщицы рассказывали дерзкую историю улиц ночного Парижа. Вкуснейший ужин в ресторане «Феэте \u0026 Фуа-гра» состоящий из 3 блюд прелестной компании Семёна Викторовича и Эльвиры Петровны. Волшебные танцы под звездами и целого импровизированного шоу от Екатерины (одной из участниц труппы театра). Вы были тут - прямо в центре преступления и в шаге от его предотвращения. Что ж, за дело, нужно опросить потерпевшего, он живет в каюте 323 [К-323]."},{"code":"К-325","name":"Каюта 325","text":"Тихая и неприметная([К-412]). За дверью слышен звук радио и чье-то покашливание. Постучавшись, вы слышите пожилой мужской голос, это капитан:\nУходите, я отдыхаю!\nВидимо, Вы не вовремя."},{"code":"С","name":"Склад","text":"Прохладное помещение со стеллажами до потолка. Пахнет овощами, металлом и свежестью. В углу стоят ящики с надписью «Эквадор. Бананы.». На полу — следы грязи от ботинок и белый порошок, мука похоже. На стене висит график разгрузки и список поставок."},{"code":"М","name":"Медпункт","text":"Работа с 10:00 до 20:00. В экстренных ситуациях обращаться в каюту 400."},{"code":"К-400","name":"Каюта 400","text":"Дверь закрыта. Постучавшись в дверь вы слышите:\nБегу, бегу. Что случилось? Кто-то утонул?\nПока вы рассказываете ситуацию, глаза медсестры все больше теряют к ней интерес.\nКогда кто-то будет умирать, ну или хотя-бы пораниться, зовите. А пока я спать. Скоро смена."},{"code":"К-401","name":"Каюта 401","text":"На двери табличка “не беспокоить”. Ручка двери слегка покрылась пылью."},{"code":"К-402","name":"Каюта 402","text":"Сквозь замочную скважину ничего увидеть не получается. Взяв ключи у администратора вы открываете дверь. По всей комнате разбросаны обрывки каких-то бумаг. В мусорном ведре вы находите упаковку снотворного и пачку слабительного. На столе также рекламу агентства элитной недвижимости с пометками и журнал сотовых телефонов и надпись: “3 штуки”. В тумбочке вы находите паспорт на имя Виктора Кораблева и билет в “большой театр”."},{"code":"К-403","name":"Каюта 403","text":"Книга рецептов, фото семьи и расписание смен. На стене висит график готовки и список обязанностей с кучей пометок и советов. В углу стоит чемодан, а на вешалке 3 чистых выглаженных фартука. На тумбочке — два будильника и записка:\n\t“У тебя всё получится - мама и папа.”\nВы спрашиваете про вип гостей.\nУ нас много гостей, я знаю всех, но как-то особенно к ним не отношусь. Обслуживаю всех по высшему классу. Я хочу когда-нибудь стать шефом. Начальство довольно. Правда я еще не могу спорить с капитаном или шефом, опытом они меня побеждают многократно. Но я учусь. А вечером я был здесь перечитал книгу рецептов из рыбы, он будет сегодня, вчерашний хаос хорошо что закончился. Повара были раздражены этим инцидентом."},{"code":"К-404","name":"Что это?","text":"Каюта не найдена. И ее вы не отыщите её на корабле. Когда-то давно, конструктор забыл добавить ее в план."},{"code":"К-405","name":"Каюта 405","text":"Дверь открывает молодой крючковатый парень с красными глазами. Он пускает вас в каюту. На столе — форма официанта, книга «Как стать богатым» и фото матери и журнал открытый на странице с мобильными телефонами среди которых есть и модель которая пропала у вашего соседа. На стене висит расписание рейсов и мотивирующие цитаты. Под кроватью — ящик с деньгами и пустые упаковки от лекарств. На тумбочке — записка: «Завтра разгрузка. Не опоздать.». Увидев что вы осматриваете стол он прикрывает записку:\nЭто личное, не имеете права, вчера я помогал на кухне, таскал ящики с продуктами на кухню, да шеф позавчера объявил что сегодня будет день бананов и надо принести со склада 10 ящиков.\nПопрощавшись с парнем вы выходите из каюты, после того как дверь закрылась вы слышите как бумагу начинают рвать."},{"code":"К-406","name":"Каюта 406","text":"Дверь открыта, но внутри никого. На столике записка:\nЕсли вам нужна внеплановая уборка номера запишитесь в книгу. \nНа столе также вы находите вязание, фото сына-милиционера и коробку конфет «Дюшес». На стене висит график уборки. В углу стоит тележка с чистящими средствами и запасные перчатки.\nВ книге запросов вы находите записи:\nТуалет у бара на носу, пассажиру стало плохо\nКаюта 300, сменить постельное белье\nСклад, рассыпали муку\nКаюта 412, раздавлено печенье"},{"code":"К-407","name":"Каюта 407","text":"Дверь приоткрыта. Внутри пахнет свежим бельём и мылом. На кровати — свёрнутые полотенца для гостей. Очень милая бабушка встречает вас широкой улыбкой. \nЯ с пассажирами почти не контактирую, белье горничные мне приносят. Но вот 2 дня назад приходил мальчишка официант, попросил форму почистить. Сказал на кухне мукой его осыпали. Странно потому что он пришел рано утром, там ресторан еще не работает. А еще я как-то в простыне нашла какое-то зеленое пятно.\nОна продолжает шепотом.\nМожет у нас на корабле инопланетяне, люди писают желтым."},{"code":"К-408","name":"Каюта 408","text":"Милая светлая комната. На столе — дневник с котиками, брелок-пчёлка и фото гитариста Алексея. На стене висит расписание и открытка от мамы. На кровати — плюшевый мишка и форма горничной. В углу стоит корзинка с подарками для пассажиров (конфеты, открытки). На тумбочке — кольцо из пробки.\nВчера я убирала склад и медпункт, там все как обычно было, разве что через вентиляцию я подслушала разговор с кухни, я правда не хотела. Повар ворчал на шефа, тот заставил потратить 10 ящиков бананов за день, якобы по плану должна быть рыба, а теперь чертовы бананы не дают спокойно работать, это мыло очень смешно и грустно одновременно. Су-шеф ответил что тоже был не в курсе, но Игорю Михайловичу виднее."},{"code":"К-409","name":"Каюта 409","text":"Вы стучите в грузную дверь каюты, недавно покрытую лаком. На темно коричневом фоне сияла бронзовая ручка с исцарапанной замочной скважиной, сквозь которую пробивался слабый лучик света. Дверь вам открыл худощавый парень с растрепанными волосами и как-то неловко прикрытых шапкой, окна были завешаны шторами насколько это позволяла их форма. \nТы кто?\nБеглым взглядом вы осмотрели каюту - койка и полтора квадратных метра, которые позволяли разве что дойти до кровати. Маленький откидной столик с бутылкой виски, и вешалка с одним крючком. У самой двери была лампочка и полочка с тремя ключами от номера.\nВчера я работал в баре, как и всегда. Потом пошел спать, как и всегда. Шеф живет в 402. Жалобы ему.\nИ он захлопывает дверь перед Вашим носом."},{"code":"К-410","name":"Каюта 410","text":"Каюта заперта. Из-за двери доносится сильный храп. Вы стучите в дверь приложив все усилия, на храп не прекратился. Потеряв надежду вы отворачиваясь от двери замечаете схему корабля которая отличается от той что есть у вас на этаже. Последний пункт помечен как [Б-3] - Баня."},{"code":"К-411","name":"Каюта 411","text":"Дверь каюты закрыта и на стук никто-не отзывается, видимо в это раннее утро есть важные дела не только у вас."},{"code":"К-412","name":"Каюта 412","text":"Вас встречает Нина Александровна библиотекарь корабля и руководитель игровой комнаты. Вы спрашиваете ее событиях о минувшей ночи.\n– Вчере был обычный вечер, я сидела у себя в библиотеке, вечером даже ела свой любимый банановый пирог, на этом рейсе меня им балуют каждый вечер. А, знаете, шеф вчера чуть не сломал мне дверь в библиотеку, торопился куда-то, даже не извинился. Я запомнила потому что Настюшка очень испугалась, пришлось успокаивать, Извините, мне пора бежать на рабочее место."},{"code":"Б-3","name":"Баня","text":"Разорвав запретные ленты вы заходите вы проходите в конец коридора с 3 дверьми. За одной их них вы находите баню, достаточно чистую и вполне рабочую. Похоже персонал корабля очень любит проводить тут время. Также тут лежит кусок картонной коробки на которой нарисованы бананы."},{"code":"ЗЗ","name":"Запретное место","text":"В коридоре вы видите желтую полосатую ленту, с предупреждением не входить. В конце коридора есть несколько дверей. Но идти туда вы не решаетесь."}]} \ No newline at end of file +{"places":[{"code":"ЛП-1","name":"Шезлонги","text":"Воздух пахнет речной водой, нагретым деревом и сладковатым ароматом засохшего коктейля. Утреннее солнце подсвечивает пылинки, кружащиеся в воздухе. \nДесяток аккуратно расставленных шезлонгов с пастельно-голубыми полосатыми матрасами, под цвет балетных пачек. Каркасы — из потемневшего от солёного воздуха тика, с небольшими табличками, указывающими номера кают. Утром они стоят пустые, лишь на некоторых остались следы вчерашнего вечера:\nНа одном — пустой бокал с подтаявшим дном, прилипший к подстаканнику. Внутри болтается синий бумажный зонтик.\nПод третьим шезлонгом, в тени, валяется небольшая розовая заколка-краб."},{"code":"ЛП-2","name":"Бассейн","text":"Небольшой, но живописный бассейн в форме лебедя. Вода чуть мутновата от ночной прохлады, на поверхности плавает несколько опавших лепестков от цветочных композиций с вечеринки. По краям — синие пластиковые шезлонги и плетёные столики."},{"code":"ЛП-3","name":"Прохладительные напитки","text":"Небольшая стойка-бар под тентом у бассейна. За прилавком — ряды бутылок с яркими сиропами, содовой в сифонах и медный холодильник, густо покрытый конденсатом. Утром бар не работает, но на стойке остались следы вчерашней суеты."},{"code":"ТЗ","name":"Танцевальный зал","text":"— Господа артисты, а теперь растяжка самостоятельно, к нам гости.\nВас встречает Маргарита Станиславовна. \n— Почему не в форме, вчера вы отлично танцевали с нами вместе.\nВы рассказываете события которые застали вас с первыми лучами солнца. \n— Я вчера была в том баре, и девочки там были. Этот мужчина в пиджаке за баром сидел, не нравится он мне, телефоном своим тыкал бармену в лицо, мне даже жалко мальчишку стало. А потом пришел этот мясник, злой весь пыхтел. Я чего заметила то, он меня каждый вечер танцевать зовет, а вчера с барменом поговорил, услышала только “Придумай что нибудь до 11”, и пулей вылетел из бара([Р-1])([К-323])."},{"code":"Р-1","name":"Ресторан «Фуэте \u0026 Фуа-гра»","text":"Вас встречает высокий грузный мужчина лет 40, Игорь Ковалев, шеф повар ресторана. Кухня кипит, повара работают, персонал бегает, в этот момент раздается звук бьющегося стекла и крик шефа.\n— Откуда у тебя руки растут, огрызок. Алиса! Убери это! Семен Викторович? Конечно знаю - VIP клиент, холить и лелеять, целовать в жопу - приказ капитана. Был вчера, не самый приятный человек. Поел, был даже весел. Когда ушел, не знаю. Я отходил отнести в “Пуанты” десерт.\nВы просите поговорить с официантом который приносил вчера обед в каюту 323.\n— ГЕНА! Хороший парень. Его ещё нет. Весь вечер он был тут, а после за разбитую тарелку, он мыл посуду вместе с Алисой. Часов до 3 должны были тут быть([К-405])."},{"code":"Т-1","name":"Туалет","text":"— Все уделали, паразиты, а мне опять отмывай. Проклятый бар.\nОсмотрев комнату уже нельзя было понять что кому-то здесь было плохо, тётя Глаша тут уже все убрала.([К-406])"},{"code":"Б-1","name":"Бар «Пуанты вверх!»","text":"С утра бар закрыт, приглушённое освещение и тишина делают его похожим на театральные кулисы после спектакля. Стойка липкая от пролитых напитков, на её поверхности — засохшие круги от бокалов, рассыпанная соль, мятные палочки и крошки от орешков. Под стойкой, рядом с мусорным ведром, валяется смятая пачка сигарет «Ява» и один синий пластиковый зонтик для коктейлей."},{"code":"К","name":"Костюмерная","text":"Тесное, забитое до потолка стеллажами помещение. Повсюду висят пышные пачки, трико, перья и блестящие аксессуары. Пахнет нафталином, гримом и пудрой. На большом столе у зеркала — беспорядок: коробка с нитками и иголками, пустой тюбик мази «от усталости ног» и распечатанная афиша вчерашнего выступления с автографом."},{"code":"К-200","name":"Каюта 200","text":"Дверь закрыта."},{"code":"К-201","name":"Каюта 201","text":"Дверь закрыта."},{"code":"К-202","name":"Каюта 202","text":"Вам открывает дверь невысокий пожилой мужчина. Он встречает вас широкой улыбкой. Из разговора вы узнаете, что с обеда он до полуночи был на верхней палубе и играл на аккордеоне. Парни наверное спят еще, тяжелый денек был."},{"code":"К-203","name":"Каюта 203","text":"Дверь закрыта."},{"code":"К-204","name":"Каюта 204","text":"Вы стучитесь в дверь, которая с тихим скрипом открывается. Из каюты повеяло мягким цветочным ароматом. Вы проходите в комнату, никого нет. Осмотревшись, Вы замечаете пачку фотографий на столе среди которых вы встречаете и фото вчерашнего вечера.","applications":[{"name":"Фото"}]},{"code":"К-205","name":"Каюта 205","text":"Дверь закрыта."},{"code":"К-206","name":"Каюта 206","text":"На двери висит расписание занятий в танцевальном зале и сейчас Маргарита Станиславовна должна быть там.([ТЗ])"},{"code":"К-207","name":"Каюта 207","text":"Около каюты Вы встречаете молодую девушку, это же она танцевала вчера под звёздами. В каюте вы рассказываете что произошло и что ей грозит тюрьма. \n— Нет! Я ничего не крала! - она начинает плакать, - Я не самый хороший человек но я не нарушаю закон. Спросите руководителя, девчонок, я никогда…\nЭто дело кажется вам странным а почему-то вы верите, девушке. Хладнокровно украсть дорогой телефон, и так неудачно спрятать, что горничная находит его даже при легкой уборке.\n— Вчера всё утро мы репетировали, а после показывали историю про цыган. После был мастер класс. Вечером как обычно с девчонками заглянули в бар, Алинке там бармен Толя нравится. Там были до половины десятого, а потом на Лебединую палубу пошли, там танцы вчера были и звезды красивые, Соня нас даже сфотографировала.([ТЗ])([К-206])([К-204])([К-205])([К-409])([Б-1])\nВы с задумчивым видом получаете разрешение взять буклеты, кладете их в карман и покидаете каюту.","applications":[{"name":"Карта"}]},{"code":"К-208","name":"Каюта 208","text":"Дверь открывает сонный мужчина, одетый в пижаму темно зеленого цвета.\n— Ну собственно сыграли с Сёмочкой пару партий, рассказывал, что жена его, та еще стерва, разводятся они, а сына то, забрать хочет, вот и подала в суд, не хочет чтобы отец с сыном общался, а тот и психует. Сёмка то весь вечер в баре пил, не заметил даже, что у него бармен сумку стырил, ну я так думал, а потом увидел, что Сёмочке плохо стало, и бармен помог до туалета этому горю луковому дойти. А потом они вернулись.([К-323])"},{"code":"К-209","name":"Каюта 209","text":"— Убирайтесь прочь! - низкий голос из каюты."},{"code":"К-210","name":"Каюта 210","text":"Каюта закрыта, капитан на мостике.([КМ])"},{"code":"К-211","name":"Каюта 211","text":"Встретив старпома в коридоре, он разрешает вам исследовать его каюту, он дает вам ключи и удаляется. Идеальный порядок, пахнет свежей краской, типографской краской и металлом. Каюта похожа на кабинет штурмана. На столе — стопка уставов, навигационные приборы, распечатанный график вахт и телескоп в чехле. На стене — астрономическая карта звёздного неба, схема устройства теплохода и диплом мореходного училища. На полке — потёртый блокнот со стихами о море и лейкопластырь. Возле иллюминатора на штативе установлен телескоп, направленный на звёзды. В ящике стола, под схемами, лежит секретная шифровка о розыске контрабанды, а на её полях карандашом написано: «Груз №7 — бананы? Проверить по накладным. Капитан не слушает...». Рядом валяется пузырёк с антигистаминными таблетками.([КМ])([С])"},{"code":"Р-2","name":"Ресторан «Гранд батон»","text":"Более скромный, чем «Фуэте \u0026 Фуа-гра», но уютный ресторан на третьей палубе. Утром здесь подают завтрак: запах кофе, свежей выпечки и масла. На столиках — остатки еды, сморщенные салфетки и меню с пятном от варенья. За стойкой официанты суетятся, разнося подносы.([Р-1])"},{"code":"И","name":"Игровая комната «Золотая рыбка»","text":"Небольшая комната с игрушками, столом для рисования и несколькими стеллажами книг за кафедрой. Так же имеется записка “По вопросам работы библиотеки и игровой комнаты, обращаться в каюту 412” Похоже руководитель комнаты еще не пришел. За кафедрой вы находите засаленный учебник по мореходству и пачку читательских билетов. В центре сидит девочка и строит башню из металлического конструктора. На полу валяется плюшевая пчёлка и раскраска с кораблём. В углу стоит жестяная коробка с надписью «Юный архитектор». На ваши вопросы она не отвечает.([К-412])([К-306])"},{"code":"Т-2","name":"Туалет","text":"Чисто, пахнет хлоркой. На полу — мокрый след от швабры. Ведро для мусора переполнено смятыми бумажками и обёртками от леденцов."},{"code":"Б-2","name":"Бар «Гранд шот»","text":"У барной стойке никого нет. На столешнице табличка с надписью:\nРаботаем с 12:00"},{"code":"А","name":"Администрация","text":"Заходя в помещение, вы замечаете небольшое пространство с диванчиком, а также рабочий стол в углу.\n— Да-да, я знаю про трагедию, а Вы тот самый детектив о котором все только и говорят? Очень приятно Валерия Сергеевна Громова, администратор.\nНа полках много папок но все расставлены в идеальном порядке по годам и рейсам, кажется ошибок быть не может.\n— Вот вам список пассажиров, в этот раз не все каюты заняты, одну даже выкупили но не поплыли с нами, я там отметила. Все пассажиры у нас хорошие вежливые. А я вчера вечером уже спала, режим, да и остановка сегодня большая работы много. А теперь еще и эта кража. Больше ничем помочь не могу.([К-319])","applications":[{"name":"Список пассажиров"}]},{"code":"К-300","name":"Каюта 300","text":"— Проходите, садитесь.\nВ её каюте пахнет духами и воспоминаниями. На столе — программки старых балетов, фото в роли Жизели на столе.\n— Это я. Хорошие были времена. А вот в кардебалете Витя Кораблев он с нами плывет. Хороший парень был. Связался с плохой компанией. \nНа фотографии вы видите шеф-повара. Моложе худее, но это точно он!\n— Его в 90-е поймали на хранении наркотиков, они называли его “скорость”. Красивое название, вы не находите? Тогда и пропал.([Р-1])([К-401])"},{"code":"К-301","name":"Каюта 301","text":"— Я думаю это инопланетяне, даже Анжела поверила. Вчера такая вспышка была, и она двигалась Дима подтвердит. Зачем им телефон я не знаю, могли же кого-нибудь украсть, А все пассажиры на месте?([К-207])([К-305])"},{"code":"К-302","name":"Каюта 302","text":"— Кто там? Мне папа запрещает открывать незнакомым, а он ещё спит."},{"code":"К-303","name":"Каюта 303","text":"Закрыто."},{"code":"К-304","name":"Каюта 304","text":"На стук никто не отвечает, прислушавшись Вы слышите легкое сопение и бормотание.\n— Какая хорошенькая девочка. … Как так напиться можно было, негодяй! … Это же совсем не ваше дело, Вам танцевать нужно, а не пирожки печь."},{"code":"К-305","name":"Каюта 305","text":"— Ты видел её глаза! Теперь то она точно поверит в НЛО! Такая вспышка интересная получилась, да все теперь поверят.\nСлышится радостный разговор из каюты."},{"code":"К-306","name":"Каюта 306","text":"— Здравствуйте, я вчера на Лебединой с дочкой весь вечер была. Салюты огни было красиво. Мужчину про которого вы говорите я там не видела. Знаете что странно было. Вчера шеф сильно наорал на бармена на коктейльном столике. Он принес ящик бананов, а другой забрал точно такой же. Я запомнила потому что Лерочка сильно напугалась. А в остальном вечер отличный был.([ЛП-3])([P-1])([К-401])"},{"code":"К-307","name":"Каюта 307","text":"— Здравствуйте, это вы занимаетесь этим делом? У меня есть несколько зацепок. Вчера около 22:00 часов была вспышка очень близко к кораблю, и тогда же и исчез телефон. Это инопланетяне, им нужны наши технологии, они изучают нас! Я раньше не верила, но факты!!!"},{"code":"К-308","name":"Каюта 308","text":"Эту каюту Вы уже видели. Тут живет отличный мальчуган, внук Григория Семеновича и Людмилы Аркадьевны, скорее всего где-то с ними сейчас.([К-310])"},{"code":"К-309","name":"Каюта 309","text":"— Здрасте, свою комнату обыскивать не позволю!!! Я завуч, я на вас жаловаться буду!\nВы пытаетесь объяснить ситуацию, и что обыскивать её вы не собираетесь. Но толку было бы больше рисуй вы на воде ровные квадраты вилами.\n— Ворует прислуга, они уже украли мою статуэтку и очки! Я найду на них и Вас управу.\nОчень вежливо извинившись вы уходите. Очки же у нее на цепочке, о статуэтка на полочке для ключей, увы сказать ей это не получится."},{"code":"К-310","name":"Каюта 310","text":"Дверь заперта, а около ручки очень аккуратно приклеен листок с кружевной надписью: “Греем косточки, ищите на верхней палубе”([ЛП-1])."},{"code":"К-311","name":"Каюта 311","text":"По коридору быстрым шагом несется Станислав с огромной клетчатой сумкой, кажется скоро его остановка. Вы кричите ему в след, но он уже Вас не слышит."},{"code":"К-312","name":"Каюта 312","text":"Виктор Павлович с которым вы познакомились еще в очереди на посадку очень рад вас видеть.\n— Проходите, дорогой друг. \nОн приглашает вас в каюту и быстро закрывает дверь. В то же мгновение улыбка на его лице исчезла.\n— Нас нашли. Это они, наводят суету чтобы нас поймать. Я не могу сказать за что нас ищут, это государственная тайна.\nЕго жена, Людмила Ивановна, насторожено посмотрела на дверь. \nПосле пятиминутной беседы но уже шепотом, вы покидаете каюту, с боязнью что за 3 дня путешествия вы так обмякли что не заметили шпионов прямо под носом."},{"code":"К-313","name":"Каюта 313","text":"Уютный хаос из книг. На столе — «Три мушкетёра», очки и клетка с канарейкой Кешей. На тумбочке — стопки книг с закладками. На полу стоит корзинка с пряжей и следы птичьего корма.\n— Я вчера вечером ходила по коридору, уснуть долго не могла из-за музыки сверху. И видела как мальчишка зашел в каюту Катеньки в белой рубашке был и брюках. Еще шапочка была. Я с катенькой болтаю иногда, она молодец хочет в большой пойти, на пробы едет. Ой, я же забыла ей рассказать что вор был.\nВы обещаете что всё передадите и уходите.([К-207])"},{"code":"К-314","name":"Каюта 314","text":"Доносится громкий женский храп! Не стоит будить такую женщину."},{"code":"К-315","name":"Каюта 315","text":"— Я ничего не крал! Я просто погоду смотрел! Я не знаю вашего ну того обокраденного.\nДверь он так и не открыл, скрывает он что-то.([К-323])"},{"code":"К-316","name":"Каюта 316","text":"Из двери доносится легкий запах канифоли.\n— Здравствуйте, проходите. Я про вас слышал. Вернее читал в газете. Тогда в лагере мой ребенок отдыхал. Но он ничего не знает я не рассказывал, но спасибо огромное. \nОн крепко жмет Вашу руку.\n— Вы видели эту молодежь верят в привидения, и ползают везде. Я их даже в запретной зоне видел. А туда же нельзя. Ух руки бы им поотрывать. Столько радиоэлементов на свои глупости тратят, и откуда деньги!"},{"code":"К-317","name":"Каюта 317","text":"Дверь закрыта. На стук никто не отвечает."},{"code":"К-318","name":"Каюта 318","text":"— Ты это куда, сердешный? Я тут. А там никого нет.\nПрогремел мужчина у 320 каюты.([К-320])"},{"code":"К-319","name":"Каюта 319","text":"Закрыто."},{"code":"К-320","name":"Каюта 320","text":"У двери вас встречает охранник. Обыскав вас он стучит в дверь каюты. Вам открывает мужчина плотного телосложения в водолазке и толстой цепи. \n— Заходите, слышал конечно, весь корабль гудит. Я даже хотел отправить Гришу искать, но администратор запретила, говорит не законно это. Не то чтобы я закона боюсь, но паники нам тут не надо.\nОн как то зло улыбнулся.\n— Я вам вот что скажу мои соседи - очень подозрительные ребята, из 305 постоянно что-то бормочет себе под нос. Поехавший, зуб даю. Гриша его уже дважды сломать хотел. А больше ничего подозрительного не видел, да я и не ищу, больше не ищу.\nОн ухмыльнулся и расплылся в холодной улыбке.([К-318])([А])([К-305])"},{"code":"К-321","name":"Каюта 321","text":"Ключ от этой двери вам достать не получилось, но Вас уверяют что там никого нет уже давно, и пыль в щели под дверью намекает на тоже."},{"code":"К-322","name":"Каюта 322","text":"Заперта на ключ. Из-под двери тянет запахом старой ткани и пыли. Если заглянуть в замочную скважину, можно увидеть стопки постельного белья и ведро с тряпками. Видимо, используется горничными для хранения запасов."},{"code":"К-323","name":"Каюта 323","text":"Просторная VIP каюта отличается от вашей только расположением кровати, и наличием чайника с микроволновкой. \n— Всё утро я играл в шахматы с Николаем Степанычем пока не проснулся Дмитрий Федотыч и я любезно уступил ему место на верхней палубе. После читал здесь “Записки юного врача” - он указал на книгу лежащую на столе рядом с буклетами.\n— Обед я заказал в каюту. Официант, который приносил мне блюда был очень любопытный все про телефон спрашивал, где я его купил и сколько стоит” - Семен закурил, руки его тряслись все сильнее и уже от злости.\n— Убью ворюгу! Через 2 часа остановка там я и должен позвонить сыну. Вечером отужинав с Вами и нашей милой медсестрой, я проводил последнюю до её 400-ой каюты и пошел в бар пропустить стаканчик. Я был в баре, в том что на носу, остаток вечера, и точно помню мне пришло смс, где-то в 10 часов, от жены… не будем об этом. Я и много пить не собирался вчера. В итоге даже фарфорового друга обнимал в том же баре, только никому не говорите. Больше ничего не помню, проснулся думал проспал время звонка и потянулся за телефоном, дальше вы знаете.\nТолько он завершил свой рассказ, в дверь каюты кто-то постучался. \n— Войдите.\nТётя Глаша взволнованно открыла дверь. Я случайно нашла ваш телефон в 207-ой. Вы забираете телефон: \n— Никому не говорите что нашли его.\nТелефон найден дело закрыто! Слишком просто. Вы убеждаете Семёна никому ничего не говорить пока Вы не разрешите. И направляетесь в 207-ую каюту([К-208])([К-209])([К-400])([Р-1])([Б-1])([к-207])([К-406]).","applications":[{"name":"Список смс"}]},{"code":"К-324","name":"Каюта 324","text":"Незаправленная кровать, выдает не самое спокойное утро, приняв холодный душ, Вы садитесь в кресло и начинаете вспоминать события вчерашнего дня. Прекрасный спектакль на первой палубе, со сцены три неотразимые молодые танцовщицы в образе цыганок рассказывали историю о гадании на картах. Вкуснейший ужин в ресторане «Фуэте \u0026 Фуа-гра» состоящий из 3 блюд прелестной компании Семёна Викторовича и Эльвиры Петровны. Волшебные танцы и живая музыка под звездами и целого импровизированного шоу от Екатерины (одной из участниц труппы театра). Вы были тут - прямо в центре преступления и в шаге от его предотвращения. Что ж, за дело, нужно опросить потерпевшего, он живет в каюте 323 [К-323] ([К-323])([ТЗ])([Р-1])([К-400])([К-207])."},{"code":"К-325","name":"Каюта 325","text":"Дверь каюты была заперта, вы присматриваетесь и понимаете что по списку этой каюты не должно быть, хмм… Как ни странно, под дверью валялась покерная фишка."},{"code":"С","name":"Склад","text":"Прохладное помещение со стеллажами до потолка. Пахнет овощами, металлом и свежестью. В углу стоят ящики с надписью «Эквадор. Бананы.». На полу — следы грязи от ботинок и белый порошок, мука похоже. На стене висит график разгрузки и список поставок."},{"code":"М","name":"Медпункт","text":"Работа с 10:00 до 20:00. В экстренных ситуациях обращаться в каюту 400.([К-400])"},{"code":"К-400","name":"Каюта 400","text":"Дверь закрыта. Постучавшись в дверь вы слышите:\n— Бегу, бегу. Что случилось? Кто-то утонул?\nПока вы рассказываете ситуацию, глаза медсестры все больше теряют к ней интерес.\n— Хмм, необычное? да вроде нет… хотя… да, было кое что странное. Во время медосмотра персонала у нашего официанта Гены были вены исколоты, я еще подумала “наркоман что ли”. Ну сказал что снотворное колит. Из странного еще бабулька сумасшедшая есть одна, вроде в 300-й каюте живет, все ходит и болтает, что шеф повар наш бывший балерун.\nТут медсестра расхохоталась. На звук смеха из комнаты вышла Алиса и вы решаете опросить ее тоже\n— Вчера я весь день провела на кухне, до 12 ночи, это ужас какой то, сверхурочно я не нанималась, чертов шеф со своими бананами. Ну хоть не одна я маялась, мы с Геной вместе были. А в остальном я ничего не знаю, вам лучше поговорить с Любой и Глашей, они должны что то знать.([К-400])([Р-1])([К-405])([К-406])([К-408])([к-405])([к-300])"},{"code":"К-401","name":"Каюта 401","text":"На двери табличка “не беспокоить”. Ручка двери слегка покрылась пылью."},{"code":"К-402","name":"Каюта 402","text":"Сквозь замочную скважину ничего увидеть не получается. Взяв ключи у администратора вы открываете дверь. По всей комнате разбросаны обрывки каких-то бумаг. В мусорном ведре вы находите упаковку снотворного и пачку слабительного. На столе также рекламу агентства элитной недвижимости с пометками и журнал сотовых телефонов и надпись: “3 штуки”. В тумбочке вы находите паспорт на имя Виктора Кораблева и билет в “большой театр”."},{"code":"К-403","name":"Каюта 403","text":"Книга рецептов, фото семьи и расписание смен. На стене висит график готовки и список обязанностей с кучей пометок и советов. В углу стоит чемодан, а на вешалке 3 чистых выглаженных фартука. На тумбочке — два будильника и записка:\n\t“У тебя всё получится - мама и папа.”\nВы спрашиваете про вип гостей.\n— У нас много гостей, я знаю всех, но как-то особенно к ним не отношусь. Обслуживаю всех по высшему классу. Я хочу когда-нибудь стать шефом. Начальство довольно. Правда я еще не могу спорить с капитаном или шефом, опытом они меня побеждают многократно. Но я учусь. А вечером я был здесь перечитал книгу рецептов из рыбы, вчерашний хаос на кухне меня совсем с толку сбил, хорошо что он закончился. Повара были раздражены этим инцидентом, но это наше внутреннее, не важно, гости довольны.([КМ])([Р-1])"},{"code":"К-404","name":"Что это?","text":"Каюта не найдена. И ее вы не отыщите её на корабле. Когда-то давно, конструктор забыл добавить ее в план."},{"code":"К-405","name":"Каюта 405","text":"Дверь открывает молодой крючковатый парень с красными глазами. Он пускает вас в каюту. На столе — форма официанта, книга «Как стать богатым» и фото матери и журнал открытый на странице с мобильными телефонами среди которых есть и модель которая пропала у вашего соседа. На стене висит расписание рейсов и мотивирующие цитаты. Под кроватью — ящик с деньгами и пустые упаковки от лекарств. На тумбочке — записка: «Завтра в 11 передача груза. Путь чист. Не опоздать.». Увидев что вы осматриваете стол он прикрывает записку:\n— Это личное, не имеете права, вчера я помогал на кухне, таскал ящики с продуктами на кухню, да шеф позавчера объявил что сегодня будет день бананов и надо принести со склада 10 ящиков.\nПопрощавшись с парнем вы выходите из каюты, после того как дверь закрылась вы слышите как бумагу начинают рвать.([Р-1])([С])"},{"code":"К-406","name":"Каюта 406","text":"Дверь открыта, но внутри никого. На столике записка:\nЕсли вам нужна внеплановая уборка номера запишитесь в книгу. \nНа столе также вы находите вязание, фото сына-милиционера и коробку конфет «Дюшес». На стене висит график уборки. В углу стоит тележка с чистящими средствами и запасные перчатки.\nВ книге запросов вы находите записи:\n— Туалет у бара на носу, пассажиру стало плохо\n— Каюта 300, сменить постельное белье\n— Склад, рассыпали муку\n— Каюта 412, раздавлен банановый пирог\n— Каюта 210, разлит ром, воняет([Т-1])([К-300])([С])([К-412])([К-210])"},{"code":"К-407","name":"Каюта 407","text":"Дверь приоткрыта. Внутри пахнет свежим бельём и мылом. На кровати — свёрнутые полотенца для гостей. Очень милая бабушка встречает вас широкой улыбкой. \n— Я с пассажирами почти не контактирую, белье горничные мне приносят. Но вот 2 дня назад приходил мальчишка официант, попросил форму почистить. Сказал на кухне мукой его осыпали. Странно потому что он пришел рано утром, там ресторан еще не работает. А еще я как-то в простыне нашла какое-то зеленое пятно.\nОна продолжает шепотом.\n— Может у нас на корабле инопланетяне, люди писают желтым.([P-1])"},{"code":"К-408","name":"Каюта 408","text":"Милая светлая комната. На столе — дневник с котиками, брелок-пчёлка и фото гитариста Алексея. На стене висит расписание и открытка от мамы. На кровати — плюшевый мишка и форма горничной. В углу стоит корзинка с подарками для пассажиров (конфеты, открытки). На тумбочке — кольцо из пробки.\n— Вчера я убирала склад и медпункт, там все как обычно было, разве что через вентиляцию я подслушала разговор с кухни, я правда не хотела. Повар ворчал на шефа, тот заставил потратить 10 ящиков бананов за день, якобы по плану должна быть рыба, а теперь чертовы бананы не дают спокойно работать, это мыло очень смешно и грустно одновременно. Су-шеф ответил что тоже был не в курсе, но Игорю Михайловичу виднее.([К-200])([С])([М])([Р-1])([К-401])([К-403])"},{"code":"К-409","name":"Каюта 409","text":"Вы стучите в грузную дверь каюты, недавно покрытую лаком. На темно коричневом фоне сияла бронзовая ручка с исцарапанной замочной скважиной, сквозь которую пробивался слабый лучик света. Дверь вам открыл худощавый парень с растрепанными волосами и как-то неловко прикрытых шапкой, окна были завешаны шторами насколько это позволяла их форма. \n— Ты кто?\nБеглым взглядом вы осмотрели каюту - койка и полтора квадратных метра, которые позволяли разве что дойти до кровати. Маленький откидной столик с бутылкой виски, и вешалка с одним крючком. У самой двери была лампочка и полочка с тремя ключами от номера.\n— Вчера я работал в баре, как и всегда. Потом пошел спать, как и всегда. Шеф живет в 402. Жалобы ему.\nИ он захлопывает дверь перед Вашим носом.([Б-1])([К-402])"},{"code":"К-410","name":"Каюта 410","text":"Каюта заперта. Из-за двери доносится сильный храп. Вы стучите в дверь приложив все усилия, на храп не прекратился. Потеряв надежду вы отворачиваясь от двери замечаете схему корабля которая отличается от той что есть у вас на этаже. Последний пункт помечен как [Б-3] - Баня.([Б-3])"},{"code":"К-411","name":"Каюта 411","text":"Дверь каюты закрыта и на стук никто-не отзывается, видимо в это раннее утро есть важные дела не только у вас."},{"code":"К-412","name":"Каюта 412","text":"Вас встречает Нина Александровна библиотекарь корабля и руководитель игровой комнаты. Вы спрашиваете ее событиях о минувшей ночи.\n— Вчера был обычный вечер, я сидела у себя в библиотеке, вечером даже ела свой любимый банановый пирог, на этом рейсе меня им балуют каждый вечер. А, знаете, шеф вчера чуть не сломал мне дверь в библиотеку, торопился куда-то, даже не извинился. Я запомнила потому что Лерочка очень испугалась, пришлось успокаивать. Извините, мне пора бежать на рабочее место.([И])([Р-1])([К-401])"},{"code":"Б-3","name":"Баня","text":"Разорвав запретные ленты вы заходите вы проходите в конец коридора с 3 дверьми. За одной их них вы находите баню, достаточно чистую и вполне рабочую. Похоже персонал корабля очень любит проводить тут время. Также тут лежит кусок картонной коробки на которой нарисованы бананы."},{"code":"ЗЗ","name":"Запретное место","text":"В коридоре вы видите желтую полосатую ленту, с предупреждением не входить. В конце коридора есть несколько дверей. Но идти туда вы не решаетесь."},{"code":"КМ","name":"Капитанский мостик","text":"— Ну что, нашли телефон? Нужно срочно его найти! Семен Викторович очень серьезный человек, нам эта шумиха с ним не нужна. И было бы лучше, если бы вы обращались к моему старпому Коваль Денису Матвеевичу, я сейчас занят, много дел накопилось([К-211])"}]} \ No newline at end of file diff --git a/internal/services/services.go b/internal/services/services.go index 17533cd..b73d771 100644 --- a/internal/services/services.go +++ b/internal/services/services.go @@ -183,7 +183,7 @@ func (s *Services) AddTeams(ctx context.Context, req *proto.AddTeamsReq) (*proto for _, team := range teams { res = append(res, mapTeamsToTeamFull(team)) } - return &proto.AddTeamsRsp{Teams: res}, err + return &proto.AddTeamsRsp{Teams: res}, nil } func (s *Services) DownloadTeamsQrCodesFile(ctx context.Context, req *proto.DownloadTeamsQrCodesFileReq) (*proto.DownloadTeamsQrCodesFileRsp, error) { @@ -218,8 +218,10 @@ func (s *Services) GetGraph(ctx context.Context, req *proto.GetGraphReq) (*proto }) } return &proto.GetGraphRsp{ - Nodes: nodes, - Edges: edges, + Nodes: nodes, + Edges: edges, + CountNodes: int32(len(nodes)), + CountEdges: int32(len(edges)), }, nil } diff --git a/internal/services/story_service/service.go b/internal/services/story_service/service.go index 8eba9c3..334d706 100644 --- a/internal/services/story_service/service.go +++ b/internal/services/story_service/service.go @@ -87,8 +87,13 @@ func (s *StoryService) GetPlace(code string) *Place { for _, place := range s.story.Places { if clearCode(place.Code) == code { re := regexp.MustCompile(`\(\[[a-zA-Zа-яА-Я\d-]+\]\)`) - place.Text = re.ReplaceAllString(place.Text, "") - return place + text := re.ReplaceAllString(place.Text, "") + return &Place{ + Code: place.Code, + Name: place.Name, + Text: text, + Applications: place.Applications, + } } } return &Place{ diff --git a/internal/tests/action_test.go b/internal/tests/action_test.go index 7d408ec..ccc01a4 100644 --- a/internal/tests/action_test.go +++ b/internal/tests/action_test.go @@ -13,7 +13,7 @@ func TestGetApplication(t *testing.T) { defer close() createTeamResp, err := createTeam(client, "Тестовая команда") - assert.Nil(t, err, "запрос отправлену спешно") + assert.Nil(t, err, "запрос отправлен успешно") team := createTeamResp.Teams[0] diff --git a/internal/tests/client.go b/internal/tests/client.go index b3f8c21..d2178bd 100644 --- a/internal/tests/client.go +++ b/internal/tests/client.go @@ -79,3 +79,10 @@ func addAction( _, err := client.AddAction(ctx, req) assert.Nil(t, err, "запрос отправлен успешно") } + +func getGraph(client pb.EveningDetectiveClient) (*pb.GetGraphRsp, error) { + ctx, cancel := getContext() + defer cancel() + req := &pb.GetGraphReq{} + return client.GetGraph(ctx, req) +} diff --git a/internal/tests/statistics_test.go b/internal/tests/statistics_test.go new file mode 100644 index 0000000..7b8e162 --- /dev/null +++ b/internal/tests/statistics_test.go @@ -0,0 +1,18 @@ +package tests + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_StoryStatistics(t *testing.T) { + client, close := getClient() + defer close() + + getGraphResp, err := getGraph(client) + assert.Nil(t, err, "запрос отправлен успешно") + + assert.Equal(t, 5, int(getGraphResp.CountNodes)) + assert.Equal(t, 3, int(getGraphResp.CountEdges)) +} diff --git a/internal/tests/story.json b/internal/tests/story.json index b9a60d4..71641ef 100644 --- a/internal/tests/story.json +++ b/internal/tests/story.json @@ -3,8 +3,32 @@ { "code": "Т-1", "name": "Точка 1", - "text": "Текст точки 1", + "text": "Текст точки 1([Т-2])([Т-3])", "applications": [{ "name": "application 1" }] + }, + { + "code": "Т-2", + "name": "Точка 2", + "text": "Текст точки 2([Т-4])", + "applications": [{ "name": "application 2" }] + }, + { + "code": "Т-3", + "name": "Точка 3", + "text": "Текст точки 3", + "applications": [{ "name": "application 3" }] + }, + { + "code": "Т-4", + "name": "Точка 4", + "text": "Текст точки 4", + "applications": [{ "name": "application 4" }] + }, + { + "code": "Т-5", + "name": "Точка 5", + "text": "Текст точки 5", + "applications": [{ "name": "application 5" }] } ] } diff --git a/proto/main.pb.go b/proto/main.pb.go index ecb35d1..f3ef5cc 100644 --- a/proto/main.pb.go +++ b/proto/main.pb.go @@ -1290,6 +1290,8 @@ type GetGraphRsp struct { state protoimpl.MessageState `protogen:"open.v1"` Nodes []*GetGraphRsp_Node `protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"` Edges []*GetGraphRsp_Edge `protobuf:"bytes,2,rep,name=edges,proto3" json:"edges,omitempty"` + CountNodes int32 `protobuf:"varint,3,opt,name=countNodes,proto3" json:"countNodes,omitempty"` + CountEdges int32 `protobuf:"varint,4,opt,name=countEdges,proto3" json:"countEdges,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1338,6 +1340,20 @@ func (x *GetGraphRsp) GetEdges() []*GetGraphRsp_Edge { return nil } +func (x *GetGraphRsp) GetCountNodes() int32 { + if x != nil { + return x.CountNodes + } + return 0 +} + +func (x *GetGraphRsp) GetCountEdges() int32 { + if x != nil { + return x.CountEdges + } + return 0 +} + type GetGraphRsp_Node struct { state protoimpl.MessageState `protogen:"open.v1"` Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` @@ -1519,10 +1535,16 @@ const file_main_proto_rawDesc = "" + "\x1bDownloadTeamsQrCodesFileReq\"5\n" + "\x1bDownloadTeamsQrCodesFileRsp\x12\x16\n" + "\x06result\x18\x01 \x01(\fR\x06result\"\r\n" + - "\vGetGraphReq\"\x81\x02\n" + + "\vGetGraphReq\"\xc1\x02\n" + "\vGetGraphRsp\x12?\n" + "\x05nodes\x18\x01 \x03(\v2).crabs.evening_detective.GetGraphRsp.NodeR\x05nodes\x12?\n" + - "\x05edges\x18\x02 \x03(\v2).crabs.evening_detective.GetGraphRsp.EdgeR\x05edges\x1a,\n" + + "\x05edges\x18\x02 \x03(\v2).crabs.evening_detective.GetGraphRsp.EdgeR\x05edges\x12\x1e\n" + + "\n" + + "countNodes\x18\x03 \x01(\x05R\n" + + "countNodes\x12\x1e\n" + + "\n" + + "countEdges\x18\x04 \x01(\x05R\n" + + "countEdges\x1a,\n" + "\x04Node\x12\x0e\n" + "\x02id\x18\x01 \x01(\x05R\x02id\x12\x14\n" + "\x05label\x18\x02 \x01(\tR\x05label\x1aB\n" + diff --git a/proto/main.swagger.json b/proto/main.swagger.json index 8197de2..76fa2bd 100644 --- a/proto/main.swagger.json +++ b/proto/main.swagger.json @@ -487,6 +487,14 @@ "items": { "$ref": "#/definitions/GetGraphRspEdge" } + }, + "countNodes": { + "type": "integer", + "format": "int32" + }, + "countEdges": { + "type": "integer", + "format": "int32" } } },