JavaScript must be enabled to play.
Browser lacks capabilities required to play.
Upgrade or switch to another browser.
Loading…
Вы всегда были здесь. За печкой. Смотрели, как люди суетятся, пьют чай, ссорятся и мирятся. Вы — Хранитель. Маленький дух старого дома. Вас никто не видит, но вы следите за порядком: чтобы половицы не скрипели слишком зловеще, чтобы мыши не наглели, чтобы в доме был уют. Сегодня всё было как обычно. Пахло пирогами и вечерней сыростью. Но потом вы почувствовали это — запах гари. Он идет не из печной трубы, а откуда-то изнутри. Проводка в стене старого дома наконец не выдержала. Щелчок. Треск. И тонкая струйка дыма потянулась из-под плинтуса в коридоре. Людей нет дома. Они вернутся только к ночи. А пока... пока дом в опасности. Вы маленький, но это ваш дом. И эти твари — мыши, тараканы, моль — они уже чуют поживу. Они хотят, чтобы всё сгорело, чтобы руины стали их царством. Нужно спешить. Нужно добраться до кухни, где разгорается огонь. [[За печкой]] [[Выйти в коридор|У выхода в коридор]] [[Примечание от автора]]
<<if not $musicStarted>> <<set $musicStarted = false>> <<set $musicTrack = "фоновая">> <<cacheaudio $musicTrack "./fon.mp3">> <</if>> <<set $error = "Неизвестная ошибка">> <<set $player = setup.createPlayer(15)>> <<run $player.questManager.add(setup.createQuest('ловушка_паука'))>> <<run $player.questManager.add(setup.createQuest('тайник_за_плинтусом'))>> <<run $player.questManager.add(setup.createQuest('в_башмаке'))>> <<run $player.questManager.add(setup.createQuest('клад'))>> <<run $player.questManager.add(setup.createQuest('подозрительный_чай'))>> <<run $player.questManager.add(setup.createQuest('тумба_в_спальне'))>> <<run $player.questManager.add(setup.createQuest('сорока'))>> <<run $player.questManager.add(setup.createQuest('сорока_2'))>> <<run $player.questManager.add(setup.createQuest('кот'))>> <<run $player.questManager.add(setup.createQuest('ковер'))>>
<<nobr>> <<include "CSSLoader">> <<Location>> <<MusicPlayer 0.3>> <div class="card"> <<PlayerInfo $player>> </div> <<VisitedLocations>> <</nobr>>
<<set _roomName = "за_печкой">> <<set _quest = $player.questManager.get("ловушка_паука")>> <<set _spiderDefeated = _quest.getFlag('победа_над_печным_пауком')>> <<set _trapVisited = _quest.isComplete()>> <<set _isFirstVisit = !$player.isVisit(_roomName)>> <<if _isFirstVisit>> <<run $player.setVisit(_roomName)>> Вы заглядываете под печку. Сколько же тут пыли! Люди, наверное, вообще сюда не заглядывали с прошлой зимы. Порывшись в куче хлама, которая копилась здесь долгое время, можно найти много интересностей. <<GiveItems "гвоздь" "зубочистка" "корка">> <<if not _trapVisited>> Впереди, в проходе, висит <<= _spiderDefeated ? "безжизненная паутина клочьями" : "свежая паутина — густая, плотная">>. За ней что-то поблескивает. <<if _spiderDefeated>> [[Осмотреть остатки паутины|Ловушка паука]] <<else>> [[Осмотреть свежую паутину|Ловушка паука]] <</if>> <</if>> [[Забрать всё и вернуться|На печке]] <<else>> За печкой теперь пусто. Только пыль и паутина... <<if not _trapVisited>> <<if _spiderDefeated>> Паутина безжизненно свисает клочьями — там, где раньше была ловушка, теперь просто старые нити. За ней по-прежнему что-то поблескивает. [[Осмотреть остатки паутины|Ловушка паука]] <<else>> В проходе всё еще висит свежая паутина — густая, плотная, явно чья-то работа. За ней что-то поблескивает. [[Осмотреть свежую паутину|Ловушка паука]] <</if>> <</if>> [[Вернуться|На печке]] <</if>>
<<set _quest = $player.questManager.get("ловушка_паука")>> <<set _spiderDefeated = _quest.getFlag("победа_над_печным_пауком")>> <<set _isUnderFurnaceVisit = $player.isVisit('за_печкой')>> <<if _spiderDefeated>> Выход в коридор пуст и тих. Паутина, что висела здесь раньше, более не пугает. Напротив, создает некоторый уют. Вдалеке, со стороны кухни, слышен треск — огонь разгорается. [[Идти дальше|Коридор]] [[Вернуться на печку|На печке]] <<else>> На пути у выхода в коридор висит плотная паутина. Частично она перекрывает проход, отдавая с тусклым отблеском в темноте. <<if _isUnderFurnaceVisit>> Такая же, как за печкой. Те же нити, тот же узор. У этих ловушек явно один владелец. <</if>> В центре паутины замер хозяин. Восемь мохнатых лап, тело в серой шерсти, две безжизненные чёрные точки на месте глаз. Он не двигается. Вообще. Кажется, что время здесь остановилось. Но вы чувствуете — он ждёт. Чует вас. Охотится. <<set _battleConfig = { enemyKey: "паук", actions: [ { type: "setQuestFlag", questId: "ловушка_паука", flag: "победа_над_печным_пауком", value: true } ] }>> <<Battle _battleConfig>> [[Вернуться на печку|На печке]] <</if>>
<<nobr>> <style> .inventory { max-width: 800px; margin: 0 auto; display: flex; flex-direction: column; gap: 1rem; } .inventory__body { display: flex; flex-direction: column; gap: 0.5rem; } </style> <div class="inventory"> <span class="h3">🎒 ИНВЕНТАРЬ ХРАНИТЕЛЯ</span> <<do tag 'inventory'>> <div class="inventory__body"> <<if $player.inventory.length == 0>> 🕸️ Пусто. Совсем пусто. <<else>> <<for _i = 0; _i < $player.inventory.length; _i++>> <<set _item = $player.inventory.items[_i]>> <<ItemCard _item _i>> <</for>> <</if>> </div> <</do>> </div> <</nobr>>
<<nobr>> <<widget "EquipButton">> <<set _item = _args[0]>> <<capture _item>> <<if _item.equipped>> <<link "🔓 Снять">> <<run $player.unequipItem(_item.id)>> <</link>> <<else>> <<link `_item.type === "weapon" ? "⚔️ Экипировать" : "🛡️ Надеть"`>> <<if _item.type === "weapon">> <<run $player.equipWeapon(_item.id)>> <<else>> <<run $player.equipArmor(_item.id)>> <</if>> <</link>> <</if>> <</capture>> <</widget>> <<widget "ItemCard">> <<set _item = _args[0]>> <<set _index = _args[1]>> <<capture _item, _index>> <article @class="'item-card' + (_item.equipped ? ' item-card--equipped' : '')"> <header class="item-card__header"> <h3 class="item-card__title"> <<= _item.name>> </h3> <<if _item.equipped>> <span class="item-card__badge">экипировано</span> <</if>> </header> <p class="item-card__description"> <<= _item.description>> </p> <footer class="item-card__footer"> <<switch _item.type>> <<case "weapon">> <p class="item-card__stats"> ⚔️ Урон: <<= _item.power>> | 💔 Шанс поломки: <<= _item.breakChance * 100>>% </p> <div class="item-card__actions"> <<EquipButton _item>> </div> <<case "armor">> <p class="item-card__stats"> 🛡️ Защита: -<<= _item.power>> урона | 💔 Шанс поломки: <<= _item.breakChance * 100>>% </p> <div class="item-card__actions"> <<EquipButton _item>> </div> <<case "consumable">> <p class="item-card__stats"> 💊 Восстанавливает <<= _item.healAmount>> HP </p> <div class="item-card__actions"> <<link "💊 Использовать">> <<set _isUsed = $player.useConsumable(_item.id)>> <</link>> </div> <<case "story">> <p class="item-card__story-label"> 📜 Сюжетный предмет </p> <</switch>> </footer> </article> <</capture>> <</widget>> <</nobr>>
<<nobr>> <<if not $battle>> <<set $error = "Battle is undefined">> <<goto "Ошибка">> <</if>> <<set _battle = $battle>> <<set _enemy = _battle.enemy>> <<set _actions = _battle.actions>> <<run _battle.setGlobalPlayer()>> <<include "BattleStyles">> <<link "Справка">> <<run Dialog.wikiPassage("Бой - справка").open()>> <</link>> <<do tag "battle">> <div class="battle"> <!-- Статус боя --> <div class="battle__status"> <div class="battle__card--player"> <<PlayerInfo $player>> </div> <<BattleEnemyStatus _enemy>> </div> <!-- Индикатор хода --> <<BattleTurnIndicator _battle>> <!-- Лог боя --> <<BattleLog _battle.log>> <!-- Действия игрока --> <<BattleActions _battle>> <!-- Результат боя --> <<BattleResult _battle _actions>> </div> <</do>> <</nobr>>
<<nobr>> <<widget "PlayerStat">> <<set _title = _args[0]>> <<set _value = _args[1]>> <<set _icon = _args[2] ?? null>> <div class="player-stat"> <<if _icon>> <span class="player-stat__icon"><<= _icon>></span> <</if>> <span class="player-stat__label"><<= _title>>:</span> <span class="player-stat__value"><<= _value>></span> </div> <</widget>> <<widget "PlayerInfo">> <<do tag 'player'>> <<set _player = _args[0]>> <<set _hpString = _player.hp + "/" + _player.maxHp>> <<set _weaponString = _player.weapon ? _player.weapon.name : "Кулаки">> <<set _armorString = _player.armor ? _player.armor.name : "Нет">> <section class="card"> <span class="h3">⚔️ Игрок</span> <div class="player-info__stats"> <<PlayerStat "HP" _hpString "❤️">> <<PlayerStat "Оружие" _weaponString "⚔️">> <<PlayerStat "Броня" _armorString "🛡️">> </div> </section> <</do>> <</widget>> <</nobr>>
<<set _quest = $player.questManager.get('ловушка_паука')>> <<set _isSpiderDefeated = _quest.getFlag("победа_над_печным_пауком")>> <<if _isSpiderDefeated>> <<run _quest.complete($player)>> <<set _rewardItems = _quest.getReward()>> Со стен свисает паутина — паук больше не охраняет свое добро. Вы раздвигаете остатки ловушки и подбираете то, что блестело в темноте. <<GiveItems _rewardItems>> <<else>> Вы подходите к паутине. Она липкая, плотная — просто так не порвешь. За ней что-то блестит, но рассмотреть толком не получается. Трогать паутину опасно — если здесь паук, он мигом прибежит на вибрацию. Довольно опасно сражаться с врагом на его территории. <</if>> [[Вернуться за печку|За печкой]]
<<set _roomName = "коридор">> <<if $player.isVisit(_roomName)>> Вы снова в коридоре. Дым стал гуще, запах гари уже не выветривается. Где-то трещит огонь. <<else>> <<run $player.setVisit(_roomName)>> Вы выползаете из-под печки и оказываетесь в коридоре. Здесь темно, только из-под двери кухни пробивается оранжевый свет — там уже горит. Пахнет гарью, воздух стал тяжелым. <</if>> Коридор длинный, в пыли и старом хламе. Вдоль стен тянется щель под плинтусом — там можно спрятаться или что-то найти. В углу валяется дырявый башмак. **Двери:** - Дверь на кухню — оттуда валит дым. - Дверь в кладовую — заперта на маленький ключик. - Дверь в зал — приоткрыта, оттуда слышено слабое сопение. - Дверь в спальню — закрыта, но неплотно. **Куда теперь?** <<nobr>> <<if $player.isVisit("плинтус")>> [[Осмотреть дощечку с гвоздем|Плинтус - задвижка]] <</if>> <</nobr>> [[Осмотреть плинтус|Плинтус]] [[Заглянуть в башмак|Башмак]] [[В кладовую|Кладовая]] [[Зайти в зал|Зал]] [[Зайти в спальню|Спальня]] [[Дверь на кухню|Кухня - вход]] [[Вернуться на печку|На печке]]
<<set _roomName = "Башмак">> <<set _isVisit = $player.isVisit(_roomName)>> <<set _quest = $player.questManager.get('в_башмаке')>> <<set _insideVisited = _quest.isComplete()>> <<set _hasMatch = $player.inventory.hasStoryItem("спичка")>> <<EnterRoom _roomName "в_башмаке">> Старый хозяйский башмак стоит в углу коридора. Носок уткнулся в стену, внутри зияет черная дыра. Оттуда тянет сыростью и затхлостью — там давно никто не убирался. Внутри темно — хоть глаз выколи. <<if not _hasMatch>> Без света туда лучше не соваться. Нужно найти чем посветить. <<else>> Однако есть спичка. <<if not _insideVisited>> <<link "Войти глубже">> <<run $player.useStoryItem("спичка")>> <<goto "Башмак - внутри">> <</link>> <<else>> Внутри теперь пусто. Только мусор и следы вашей битвы. <</if>> <</if>> [[Вернуться в коридор|Коридор]]
<<set _quest = $player.questManager.get('в_башмаке')>> <<set _insideVisited = _quest.isComplete()>> <<set _roachDefeated = _quest.getFlag("победа_над_башмачным_тараканом")>> <<if not _insideVisited and not _roachDefeated>> Вы протискиваетесь внутрь. Стены башмака поднимаются высоко над головой, под ногами хлюпает какая-то жижа. Свет от спички выхватывает из темноты груды мусора, скомканные газеты и... Шевеление. Из кучи ветоши на вас выбирается **таракан**. Не такой уж и маленький — для вас размером с добрую крысу. Он явно не рад гостям и угрожающе шевелит усами. <<set _battleConfig = { enemyKey: "таракан", actions: [ { type: "setQuestFlag", questId: "в_башмаке", flag: "победа_над_башмачным_тараканом", value: true } ], firstStriker: "enemy", linkText: "Принять схватку" }>> <<Battle _battleConfig>> Отступить не выйдет. Он уже прыгнул на вас. <<elseif _roachDefeated>> <<run _quest.complete($player)>> Внутри башмака теперь тихо. Таракан повержен, его владения достались вам. <<GiveItems "корка" "зубочистка">> [[Выбраться наружу|Башмак]] <<else>> <!-- Сюда вообще не должны попадать, но на всякий случай --> Что-то пошло не так. Таракан должен был атаковать при первом входе. <<set _battleConfig = { enemyKey: "таракан_башмачный", actions: [ { type: "setQuestFlag", questId: "в_башмаке", flag: "победа_над_башмачным_тараканом", value: true } ], firstStriker: "enemy", linkText: "Принять схватку" }>> <<Battle _battleConfig>> <</if>>
<<set _roomName = "плинтус">> <<set _isVisit = $player.isVisit(_roomName)>> <<set _baseboardQuest = $player.questManager.get('тайник_за_плинтусом')>> <<set _hideoutFound = _baseboardQuest.isComplete()>> <<set _nailPulled = _baseboardQuest.getFlag("гвоздь_дернут")>> <<set _chaseActive = $player.isVisit("кот_в_погоне")>> <<set _chaseEnded = $player.isVisit("погоня_окончена")>> <<EnterRoom _roomName "тайник_за_плинтусом">> Вы заглядываете в щель под плинтусом. Здесь темно, пыльно и пахнет старой древесиной. Щель тянется вдоль всей стены, но закрыта дощечкой. <<if not _nailPulled>> Дощечка не прибита, но засела плотно — просто так не сдвинуть. <<elseif _nailPulled and not _hideoutFound>> После того как гвоздь был вздернут дощечка свободно ходит взад-вперед. Теперь можно пройти в углубление. [[Пройтив углубление|Плинтус - укрытие]] <<else>> В тайнике пусто. Но здесь по-прежнему можно спрятаться. <<if _chaseActive and not _chaseEnded>> [[Спрятаться от кота|Плинтус - укрытие]] <</if>> <</if>> [[Вернуться в коридор|Коридор]]
<<set _quest = $player.questManager.get('тайник_за_плинтусом')>> <<set _nailPulled = _quest.getFlag("гвоздь_дернут")>> <<if _nailPulled>> Гвоздь со скрипом выходит из стены. Он настолько старый, что кажется его можно сломать об коленку, как прутик. <<else>> Вы присматриваетесь к дощечке. Она держится на старом ржавом гвозде, который торчит из плинтуса в метре отсюда. Если дернуть за гвоздь, дощечка должна отойти. <<link "Дернуть за гвоздь">> <<run $player.questManager.get('тайник_за_плинтусом').setFlag("гвоздь_дернут", true)>> <<goto "Плинтус - задвижка">> <</link>> <</if>> [[Вернуться обратно|Коридор]]
<<set _roomName = 'Плинтус - укрытие'>> <<set _baseboardQuest = $player.questManager.get('тайник_за_плинтусом')>> <<set _hideoutFound = _baseboardQuest.isComplete()>> <<set _catQuest = $player.questManager.get('кот')>> <<set _catChase = _catQuest.getFlag('кот_разбужен')>> <<set _chaseEnded = _catQuest.getFlag('кот_ушел')>> Вы забираетесь в щель под плинтусом. Здесь темно, тесно и пыльно. <<if not _hideoutFound>> <<run _baseboardQuest.complete($player)>> <<set _reward = _baseboardQuest.getReward()>> Пройдя в самое углубление, вы находите маленький **ключик**. Похоже, от кладовой! А рядом с ним — еще пара полезных мелочей. <<GiveItems _reward>> <<else>> Все ценное вы забрали. Но здесь по-прежнему можно спрятаться. <</if>> <<if _catChase and not _chaseEnded>> <<run _catQuest.setFlag('кот_ушел', true)>> <<run _catQuest.complete($player)>> Вы ныряете в щель за мгновение до того, как огромная кошачья лапа врезается в пол там, где вы только что стояли. Кот сует морду в щель, его глазище с вертикальным зрачком заглядывает внутрь. Он пытается просунуть лапу, но щель слишком узкая. Когти царапают дерево в паре сантиметров от вас. Вы сидите тихо-тихо. Кот ворчит, шипит и наконец уходит. <</if>> [[Вылезти обратно|Плинтус]]
<<set _roomName = "Зал">> <<set _quest = $player.questManager.get('кот')>> <<set _hasFood = $player.inventory.hasStoryItem('кошачья_миска')>> <<set _catFriendly = _quest.getFlag('кот_друг')>> <<set _catChase = _quest.getFlag('кот_разбужен')>> <<set _catGone = _quest.getFlag('кот_ушел')>> <<set _hideoutFound = $player.questManager.get('тайник_за_плинтусом').isComplete()>> <<if not $player.isVisit(_roomName)>> <<run $player.setVisit(_roomName)>> <<run _quest.start()>> Вы осторожно приоткрываете дверь в зал. Здесь царит полумрак, пахнет пылью и кошачьей шерстью. Сквозь грязные занавески едва пробивается свет. Посреди комнаты, на старом продавленном диване, развалился **кот**. Огромный, пушистый, размером с доброго барбоса. Из его носа вырываются порывы ветра, когда он храпит. <</if>> <<if _catGone or _catFriendly>> <<run _quest.complete($player)>> <</if>> <<if _catFriendly>> Кот лениво открывает один глаз, смотрит на вас и снова засыпает. Вы теперь друзья — он вас не тронет. **Что будем делать?** [[Подойти к комоду|Зал - комод]] [[Осмотреть ковер|Зал - ковер]] [[Осмотреть журнальный столик|Зал - столик]] [[Вернуться в коридор|Коридор]] <<elseif _catGone>> Кота в зале нет. Видимо, ушёл охотиться на мышей. Можно спокойно осмотреться. **Что будем делать?** [[Подойти к комоду|Зал - комод]] [[Осмотреть ковер|Зал - ковер]] [[Осмотреть журнальный столик|Зал - столик]] [[Вернуться в коридор|Коридор]] <<elseif _hasFood and not _catFriendly and not _catChase>> У вас есть кошачья миска. Кот ещё спит. Если подойти аккуратно... <<link "Аккуратно подойти с миской">> <<run $player.useStoryItem('кошачья_миска')>> <<run _quest.setFlag('кот_друг', true)>> <<run Dialog.create("Дружба с котом").wiki("Вы бесшумно приближаетесь к спящему коту и ставите миску рядом с его мордой. Кот открывает один глаз, нюхает, урчит и начинает есть. Покончив с едой, он облизывается и смотрит на вас уже без агрессии. Кажется, вы подружились.").open()>> <<goto "Зал">> <</link>> [[Тихо вернуться в коридор|Коридор]] <<elseif not _catChase>> Кот спит. Но в любой момент может проснуться. Надо быть очень осторожным. **Что будем делать?** [[Подойти к комоду|Зал - погоня]] [[Осмотреть ковер|Зал - погоня]] [[Осмотреть журнальный столик|Зал - погоня]] [[Тихо вернуться в коридор|Коридор]] <<else>> Кот уже однажды гнался за вами. Он настороже. Лучше не рисковать. [[Вернуться в коридор|Коридор]] <</if>>
<<set _questMagpie = $player.questManager.get('сорока')>> <<set _questMagpie2 = $player.questManager.get('сорока_2')>> <<set _magpieComplete = _questMagpie.isComplete()>> <<set _windowOpen = _questMagpie2.getFlag('окно_открыто')>> <<set _magpieGone = _questMagpie2.getFlag('сорока_улетела')>> Комод стоит у стены — старый, тёмный, с потрескавшимся лаком. Ящики плотно закрыты, но один чуть приоткрыт, из щели торчит край пожелтевшей ткани. Сверху — слой пыли, на котором чётко видны чьи-то следы. Маленькие, острые, с длинными отпечатками когтей. Похоже, здесь кто-то любит сидеть и наблюдать за комнатой. <<if _magpieComplete and not _magpieGone>> <<run _questMagpie2.start()>> За комодом, в углу, виднеется щель. Оттуда доносится тихое стрекотание. Сорока. [[Заглянуть за комод|Комод - сорока]] <<elseif _questMagpie2.isComplete()>> Из-за открытого окна в комнате пахнет свежестью и сырой листвой. Сорока улетела, но следы её лапок остались на пыльном комоде. <<else>> <</if>> [[Вернуться в зал|Зал]]
<<set _rugQuest = $player.questManager.get('ковер')>> <<set _monsterDefeated = _rugQuest.getFlag('монстр_под_ковром_побежден')>> <<set _rugLifted = _rugQuest.getFlag('ковер_приподнят')>> <<if not _rugLifted>> <<run _rugQuest.start()>> Ковёр на полу вытерт почти до дыр. Когда-то он был пёстрым, но сейчас краски потускнели, а ворс свалялся в жёсткие комки. В одном месте край завернулся, открывая голые доски пола. Под ковром что-то есть. Когда наступаешь рядом, снизу доносится сухое шуршание — будто кто-то торопливо перебирает лапками. <<link "Приподнять край ковра">> <<run _rugQuest.setFlag('ковер_приподнят', true)>> <<goto "Зал - ковер">> <</link>> [[Назад|Зал]] <<elseif not _monsterDefeated>> Вы откидываете край ковра. Внизу — чёрная щель, пахнет сыростью и чем-то гнилым. Что-то шевелится в темноте, и вдруг оттуда выскакивает... таракан. Он явно не рад, что его потревожили, и бросается на вас! <<set _battleConfig = { enemyKey: "таракан", actions: [ { type: "setQuestFlag", questId: "ковер", flag: "монстр_под_ковром_побежден", value: true } ] }>> <<Battle _battleConfig>> [[Отступить|Зал]] <<elseif not _rugQuest.isComplete()>> <<set _reward = _rugQuest.complete($player)>> <<GiveItems _reward>> [[Вернуться в зал|Зал]] <<else>> Под ковром теперь пусто. Только голые доски и пыль. [[Вернуться в зал|Зал]] <</if>>
<<set _tableSearched = $player.isVisit('журнальный_стол')>> Журнальный столик на кривых ножках едва держит стопку старых журналов. На самом верху — пожелтевшая газета с крупным заголовком: **«ПРОПАЖА КОТА: ХОЗЯЕВА ОБЕЩАЮТ НАГРАДУ»**. Рядом стоит пустая кружка, внутри засохло что-то бурое. <<if not _tableSearched>> Под столиком валяется скомканная салфетка, а на ней — что-то блестит. <<link "Осмотреть салфетку">> <<run $player.setVisit('журнальный_стол', true)>> <<run Dialog.create("Выцветшая записка").wiki('На салфетке кто-то вывел углём: «Кто найдёт Мурзика — приходите к сараю. Забирайте награду. Хозяева»\n\nЗаписка старая, края истлели. Похоже, её никто не заметил. <<GiveItems "корка" "зубочистка" "серьга">>').open()>> <<goto "Зал - столик">> <</link>> <<else>> Под столиком только пыль и старые крошки. <</if>> [[Вернуться в зал|Зал]]
<<set _quest = $player.questManager.get('кот')>> <<set _hideoutFound = $player.questManager.get('тайник_за_плинтусом').isComplete()>> <<set _isMouseHouseFound = $player.isVisit('мышиная_тусовка')>> <<run _quest.setFlag('кот_разбужен', true)>> Вы делаете шаг в глубь комнаты. Половица прогибается и издаёт протяжный, тоскливый скрип, прерывая, как казалось могильную тишину. Кот просыпается рывком. Его шерсть встаёт дыбом, а спина выгибается дугой. В полумраке загораются два жёлтых глаза — зрачки сужаются в вертикальные щели. Он смотрит прямо на вас. Кровь стынет в жилах. Не пошевелиться. Не вдохнуть. Мгновение кажется вечностью. Зверь чавкает, открывая клыки. Из горла вырывается шипение — низкое, протяжное, будто кто-то медленно выпускает воздух из пробитой шины. Когти с сухим цоканьем выходят из подушечек лап, впиваются в половицы. На миг он замирает. Тяжёлое тело напряжено, хвост бьёт по бокам. Прыжок... Воздух свистит. Тень накрывает вас. Лапы гулко бьют по полу, когти скребут дерево в опасной близости. В лицо бьёт запах шерсти, слюны и зверя. Сердце колотится где-то в горле, до такой степени, что больно дышать. Ноги немеют, но сами несут прочь. Куда бежать? <<if _hideoutFound>> [[Спрятаться под плинтусом|Плинтус - укрытие]] <<else>> <span class="link-disabled" title='Вам не доступен этот вариант'>Спрятаться под плинтусом</span> <</if>> <<if _isMouseHouseFound>> [[Бежать к мышам|Мышиная нора]] <<else>> <span class="link-disabled" title='Вам не доступен этот вариант'>Бежать к мышам</span> <</if>> <<link "Попытаться убежать зигзагом">> <<run Dialog.create('Попытка бегства').wikiPassage('Попытка бегства').open({}, () => { if ($player.isAlive()) { $.wiki(`<<goto "Коридор">>`); } })>> <<run $player.questManager.get('кот').setFlag('кот_ушел', true)>> <</link>>
<<set _roomName = "кладовая">> <<set _isVisit = $player.isVisit(_roomName)>> <<set _hasKey = $player.inventory.hasStoryItem("ключ_от_кладовой")>> <<set _quest = $player.questManager.get('клад')>> <<set _isInspectPotato = _quest.getFlag('куча_картошки_осмотрена')>> <<set _isInspectGrain = _quest.getFlag('куча_зерна_осмотрена')>> <<set _doorUnlocked = _quest.getFlag("дверь_в_кладовую_открыта")>> <<EnterRoom _roomName 'клад'>> <<if not _hasKey and not _doorUnlocked>> Дверь в кладовую заперта на маленький ключик. Нужно найти ключ, если хотите попасть внутрь. [[Вернуться в коридор|Коридор]] <<else>> <<if not _doorUnlocked>> <<run $player.useStoryItem("ключ_от_кладовой")>> <<run _quest.setFlag("дверь_в_кладовую_открыта", true)>> Вы вставляете ключик в замочную скважину. Механизм щелкает, и дверь приоткрывается ровно настолько, чтобы вы могли протиснуться внутрь. <</if>> Кладовая встречает вас запахами старой муки, сухих трав и мышиного помета. Здесь царит полумрак, только тонкий луч света пробивается сквозь щель в потолке. Вдоль стен стоят мешки и ящики. Пол усыпан рассыпанным зерном. **Что здесь есть:** --- **Куча зерна** <<if not _isInspectGrain>> В куче зерна кто-то шевелится. Оттуда торчат длинные усы — **таракан**. [[Подойти к куче зерна|Кладовая - куча зерна]] <<else>> Куча зерна теперь пуста. Только зерно и ничего ценного. <</if>> --- **Куча картошки** <<if not _isInspectPotato>> В куче картошки кто-то возится. Слышно характерное попискивание — там **мышь**. [[Подойти к куче картошки|Кладовая - куча картошки]] <<else>> В куче картошки больше ничего нет. <</if>> --- **Сода** В углу стоит ржавая банка с надписью «Сода». <<if _quest.isComplete()>> Банка пуста. <<elseif _isInspectPotato and _isInspectGrain>> [[Подойти к банке с содой|Кладовая - сода]] <<else>> Тяжело будет туда пробраться не разобрав соседние кучи. <</if>> --- [[Вернуться в коридор|Коридор]] <</if>>
<<set _quest = $player.questManager.get('клад')>> <<set _grainDefeated = _quest.getFlag("победа_над_зерновым_тараканом")>> <<if not _grainDefeated>> Вы подходите к куче зерна. Таракан выбирается наружу и угрожающе шевелит усами. <<set _battleConfig = { enemyKey: "таракан_зерновой", actions: [ { type: "setQuestFlag", questId: "клад", flag: "победа_над_зерновым_тараканом", value: true } ] }>> <<Battle _battleConfig>> [[Отойти|Кладовая]] <<else>> Таракан повержен. Вы осматриваете кучу. <<run _quest.setFlag("куча_зерна_осмотрена", true)>> <<GiveItems "корка" "булавка">> [[Вернуться в кладовую|Кладовая]] <</if>>
<<set _quest = $player.questManager.get('клад')>> <<set _potatoDefeated = _quest.getFlag("победа_над_картофельной_мышью")>> <<if not _potatoDefeated>> Вы подходите к куче картошки. Мышь выскакивает и бросается на вас! <<set _battleConfig = { enemyKey: "мышь", actions: [ { type: "setQuestFlag", questId: "клад", flag: "победа_над_картофельной_мышью", value: true } ], firstStriker: 'enemy' }>> <<Battle _battleConfig>> [[Отойти|Кладовая]] <<else>> Мышь убежала. Вы рыскаете в картошке <<run _quest.setFlag("куча_картошки_осмотрена", true)>> <<GiveItems "сыр">> [[Вернуться в кладовую|Кладовая]] <</if>>
<<set _quest = $player.questManager.get('клад')>> <<set _whiteMouseDefeated = _quest.getFlag("победа_над_белой_мышью")>> <<if not _whiteMouseDefeated>> Вы заглядываете в банку. Внутри что-то белое, но вдруг оттуда выскакивает **белая мышь** — она вся перепачкалась в соде и стала незаметной на ее фоне. <<set _battleConfig = { enemyKey: "мышь_белая", actions: [ { type: "setQuestFlag", questId: "клад", flag: "победа_над_белой_мышью", value: true } ], firstStriker: 'enemy' }>> <<Battle _battleConfig>> <<else>> Мышь повержена. <<set _reward = _quest.getReward()>> <<run _quest.complete($player)>> <<GiveItems _reward>> <</if>> [[Вернуться в кладовую|Кладовая]]
Оставшийся основной функционал: - босс файт - smoke level в зависимости от кол-ва локаций. Возможно у каждой локации свой вес - добавить атмосферные звуки
<<nobr>> <<widget "GiveItems">> <<set _items = []>> <<if _args.length == 1 && Array.isArray(_args[0])>> <<set _itemKeys = _args[0]>> <<for _i = 0; _i < _itemKeys.length; _i++>> <<set _item = $player.addItem(_itemKeys[_i])>> <<if _item>> <<run _items.push(_item)>> <</if>> <</for>> <<else>> <<for _i = 0; _i < _args.length; _i++>> <<set _item = $player.addItem(_args[_i])>> <<if _item>> <<run _items.push(_item)>> <</if>> <</for>> <</if>> <<if _items.length > 0>> <span class="h3">Вы нашли:</span> <ul> <<for _i = 0; _i < _items.length; _i++>> <li> <<= _items[_i].getInfo()>> </li> <</for>> </ul> <</if>> <</widget>> <</nobr>>
<<widget "Battle">> <<set _settings = $args[0] ?? {}>> <<set _enemyKey = _settings.enemyKey>> <<set _actions = _settings.actions>> <<set _firstStriker = _settings.firstStriker ?? 'player'>> <<set _passage = _settings.passage ?? passage()>> <<set _linkText = _settings.linkText ?? "Вступить в бой">> <<link _linkText>> <<set _enemy = setup.createEnemy(_enemyKey)>> <<set $battle = setup.createBattle($player, _enemy, _actions, _firstStriker)>> <<set $returnPassage = _passage>> <<goto "Бой">> <</link>> <</widget>>
<<nobr>> <<widget "Location">> <<set _passage = passage()>> <<if _passage == "Инвентарь" || $battle?.isActive >> <<set _passage = $returnPassage>> <</if>> Локация: <<= _passage>> <</widget>> <</nobr>>
Не понятно что произошло, но игра ошиблась. Не разраб. <<= $error >>
<<widget "VisitedLocations">> <<set _flags = $player.visitedRooms>> <div class='card'> <span class="h3">Посещенные локации:</span> <ul> <<if _flags.length == 0>> <li>нет флагов</li> <<else>> <<for _i = 0; _i < _flags.length; _i++>> <li><<= _flags[_i]>></li> <</for>> <</if>> </ul> </div> <</widget>>
<style> #story-caption, #ui-bar { background-color: var(--bg-accent); } #story-title, #menu li a, #ui-dialog-title, #ui-dialog-close:hover { color: var(--color-primary); } #story-subtitle, #story-author, #ui-dialog-close { color: var(--text-soft); } #menu li a:hover { color: var(--color-accent); } #history-backward, #history-forward, #history-jumpto { background: var(--bg-card); border: 1px solid var(--color-accent); color: var(--text-main); } #history-backward:hover, #history-forward:hover, #history-jumpto:hover { background: var(--color-primary); color: white; border-color: var(--color-primary); } #ui-dialog { background-color: var(--bg-card); border: var(--border); } #ui-dialog-titlebar { background-color: var(--bg-accent); border-bottom: 1px solid var(--color-accent); } </style>
<style> .item-card { border: var(--border); padding: 1rem; background-color: var(--bg-card); border-radius: 12px; box-shadow: var(--shadow); margin-bottom: 1rem; transition: all 0.2s ease; } .item-card--equipped { box-shadow: 0 0 15px var(--color-primary); border-color: var(--color-primary); background-color: var(--bg-accent); } .item-card__header { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem; } .item-card__title { font-size: 1.1rem; font-weight: bold; color: var(--text-main); margin: 0; } .item-card__badge { color: var(--color-primary); font-size: 0.9rem; font-style: italic; } .item-card__description { color: var(--text-soft); font-size: 0.9rem; margin: 0 0 0.75rem; line-height: 1.5; } .item-card__footer { margin-top: 0.75rem; } .item-card__stats { font-size: 0.9rem; color: var(--text-main); margin: 0 0 0.5rem; line-height: 1.4; } .item-card__story-label { font-size: 0.9rem; color: var(--text-soft); font-style: italic; margin: 0; } </style>
<<include "itemCardStyles">> <<include "StoryCaptionStyles">> <<include "PlayerInfoStyles">> <<include "QuestDisplayStyles">> <<include "MusicPlayerStyles">> <<include "NotifyStyles">>
<style> .player-stat { display: flex; align-items: center; gap: 0.3rem; } .player-stat__icon { font-size: 1.1em; } .player-stat__label { color: var(--text-soft); } .player-stat__value { font-weight: 500; color: var(--text-main); } .player-info__stats { display: flex; flex-wrap: wrap; gap: 1rem; margin-top: 0.5rem; } </style>
<<nobr>> <<widget "BattleEnemyStatus">> <<set _enemy = $args[0]>> <<set _hpPercent = (_enemy.hp / _enemy.maxHp) * 100>> <div class="card battle__card--enemy"> <div class="battle__title">👾 <<= _enemy.name>></div> <div class="battle__stats"> <div class="battle__stat-row"> <span class="battle__icon">❤️</span> <<= _enemy.hp>>/<<= _enemy.maxHp>> </div> <div class="battle__health"> <div class="battle__health-fill battle__health-fill--enemy" @style="'width: ' + _hpPercent + '%'"></div> </div> <div class="battle__stat-row"> <span class="battle__icon">⚔️</span> Урон: <<= _enemy.attackPower>> </div> <<if _enemy.dodgeChance > 0>> <div class="battle__stat-row"> <span class="battle__icon">💨</span> Уклонение: <<= _enemy.dodgeChance * 100>>% </div> <</if>> <div class="battle__description">"<<= _enemy.description>>"</div> </div> </div> <</widget>> <<widget "BattleLog">> <<set _log = $args[0]>> <div class="battle__log"> <<for _i = 0; _i < _log.length; _i++>> <<set _entry = _log[_i]>> <<set _entryClass = 'system'>> <<if _entry.includes('атаковали') || _entry.includes('Кулаки')>> <<set _entryClass = 'player'>> <<elseif _entry.includes('врага') || _entry.includes('Враг')>> <<set _entryClass = 'enemy'>> <<elseif _entry.includes('Победа')>> <<set _entryClass = 'victory'>> <<elseif _entry.includes('погибли')>> <<set _entryClass = 'defeat'>> <</if>> <div @class="'battle__entry battle__entry--' + _entryClass"><<= _entry>></div> <</for>> </div> <</widget>> <<widget "BattleTurnIndicator">> <<set _battle = $args[0]>> <<if _battle.isActive>> <div @class="'battle__turn battle__turn--' + _battle.turn"> <<if _battle.turn == 'player'>> ⚔️ ВАШ ХОД! Выберите действие ⚔️ <<else>> 👾 ХОД ВРАГА... 👾 <<run _battle.enemyTurn()>> <</if>> </div> <</if>> <</widget>> <<widget "BattleActions">> <<set _battle = $args[0]>> <<if _battle.isActive && _battle.turn == 'player'>> <div class="battle__actions"> <div class="battle__buttons"> <<link "⚔️ АТАКОВАТЬ">> <<run _battle.playerAttack()>> <<run _battle.enemyTurn()>> <<redo "battle">> <</link>> <<link "🛡️ ЗАЩИТИТЬСЯ">> <<run _battle.playerDefend()>> <<run _battle.enemyTurn()>> <<redo "battle">> <</link>> </div> </div> <</if>> <</widget>> <<widget "BattleResult">> <<set _battle = $args[0]>> <<set _actions = $args[1]>> <<if not _battle.isActive>> <div @class="'battle__result ' + ($player.hp > 0 ? 'battle__result--victory' : 'battle__result--defeat')"> <<if $player.hp > 0>> <strong>🏆 ПОБЕДА!</strong> <<if _actions && _actions.length>> <<for _i = 0; _i < _actions.length; _i++>> <<set _action = _actions[_i]>> <<if setup.actions[_action.type]>> <<run setup.actions[_action.type]($player, _action)>> <</if>> <</for>> <</if>> <<link "Вернуться">> <<unset $battle>> <<unset $battleReturnTo>> <<goto $returnPassage>> <</link>> <<else>> <strong>💀 ПОРАЖЕНИЕ...</strong> <<link "Начать заново">> <<run Engine.restart()>> <</link>> <</if>> </div> <</if>> <</widget>> <</nobr>>
<style> .battle { max-width: 800px; margin: 0 auto; display: flex; flex-direction: column; } .battle__status { display: flex; justify-content: space-between; gap: 20px; padding: 0 0 20px 0; } /* Карточки используют глобальный .card */ .battle__card--enemy { background-color: var(--bg-accent); border-color: var(--color-accent); } .battle__title { font-size: 1.2rem; font-weight: bold; color: var(--color-primary); padding: 0 0 0.5rem 0; } .battle__stats { font-size: 1.1rem; line-height: 1.6; display: flex; flex-direction: column; } .battle__stat-row { display: flex; align-items: center; gap: 5px; color: var(--text-main); } .battle__icon { opacity: 0.8; } .battle__health { width: 100%; height: 20px; background-color: rgba(58, 46, 36, 0.1); border-radius: 5px; margin: 10px 0; overflow: hidden; border: 1px solid var(--color-accent); } .battle__health-fill { height: 100%; background-color: var(--color-success); border-radius: 5px; transition: width 0.3s ease; } .battle__health-fill--enemy { background-color: var(--color-primary); } .battle__description { font-style: italic; font-size: 0.9rem; color: var(--text-soft); padding: 0.5rem 0 0 0; } /* Индикатор хода */ .battle__turn { text-align: center; padding: 1rem; background-color: var(--bg-accent); color: var(--text-main); border-radius: 25px; margin: 10px 0; font-size: 1.1rem; border: var(--border); } .battle__turn--player { background-color: var(--color-primary); color: white; border-color: var(--color-accent); } .battle__turn--enemy { background-color: var(--color-accent); color: white; border-color: var(--color-primary); } /* Лог */ .battle__log { background-color: var(--bg-card); border: var(--border); border-radius: 12px; padding: 1rem; margin: 20px 0; height: 150px; overflow-y: auto; color: var(--text-main); font-family: monospace; box-shadow: var(--shadow); display: flex; flex-direction: column-reverse; } .battle__entry { padding: 0.25rem 0; border-bottom: 1px solid var(--bg-accent); } .battle__entry--player { color: var(--color-primary); font-weight: bold; } .battle__entry--enemy { color: var(--color-accent); font-weight: bold; } .battle__entry--system { color: var(--text-soft); } .battle__entry--victory { color: var(--color-success); font-weight: bold; } .battle__entry--defeat { color: var(--color-primary); font-weight: bold; } /* Панель действий */ .battle__actions { background-color: var(--bg-accent); border: var(--border); border-radius: 12px; padding: 1.5rem; margin: 20px 0 0 0; } .battle__buttons { display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; } /* Результат */ .battle__result { text-align: center; padding: 2rem; border-radius: 12px; margin: 20px 0 0 0; border: var(--border); } .battle__result--victory { background-color: var(--color-success); color: white; border-color: var(--color-success-hover); } .battle__result--defeat { background-color: pink; color: white; border-color: var(--color-accent); } </style>
<<set _roomName = "Кухня">> <<set _catQuest = $player.questManager.get('кот')>> <<set _catGone = _catQuest.getFlag('кот_ушел')>> <<set _catFriendly = _catQuest.getFlag('кот_друг')>> <<set _catDefeat = _catQuest.getFlag('победа_над_котом')>> <<run Dialog.create('Внимание!').wiki('Вы приближаетесь к финальной локации. Дороги назад может не быть.').open()>> Кухня пылает. Пламя с жадностью пожирает всё вокруг — шторы уже превратились в пепел, столешницы тлеют, а из разбитой плиты вырываются шипящие струи газа. Дым клубится под потолком, оседая в лёгких едкой горечью. С каждой секундой становится только жарче. <<if _catDefeat>> <<run _catQuest.complete($player)>> Кот принял свое поражение и более не попытается вам мешать. [[Идти дальше|Кухня]] <</if>> <<if _catGone and not _catFriendly and not _catDefeat>> На кухне вас встречает знакомый кот. Он сидит у порога, облизывается и явно не собирается уступать дорогу. <<set _battleConfig = { enemyKey: "кот", actions: [ { type: "setQuestFlag", questId: "кот", flag: "победа_над_котом", value: true } ] }>> <<Battle _battleConfig>> <<elseif _catFriendly>> Кот урчит и трётся о стены. Он явно не против вашего присутствия. Даже напротив, желает помочь. [[Идти дальше|Кухня]] <<else>> [[Идти дальше|Кухня]] <</if>> [[Вернуться|Коридор]]
<<nobr>> <<widget "QuestCard">> <<set _quest = $args[0]>> <div @class="'quest-card ' + (_quest.state == 'active' ? '' : 'quest-card--completed')"> <div class="quest-header"> <span @class="'quest-status ' + _quest.state"><<=_quest.state>></span> </div> <<if _quest.name>> <div class="quest-name"><<=_quest.name>></div> <</if>> <<if _quest.description>> <div class="quest-desc"><<=_quest.description>></div> <</if>> <<if _quest.state == "active">> <<set _flagNames = Object.keys(_quest.flags)>> <<if _flagNames.length > 0>> <div class="quest-flags"> <<for _j = 0; _j < _flagNames.length; _j++>> <<set _flag = _flagNames[_j]>> <div class="quest-flag"> <span class="flag-name"><<=_flag>></span> <span @class="'flag-value ' + (_quest.flags[_flag] ? 'true' : 'false')"> <<=_quest.flags[_flag]>> </span> </div> <</for>> </div> <</if>> <</if>> </div> <</widget>> <<widget "QuestDisplay">> <<set _mode = _args[0] ?? "all">> <!-- "all" или "active" --> <<set _qm = $player.questManager>> <div class="quests"> <<if _mode == "all">> <<set _quests = Object.values(_qm.quests)>> <<else>> <<set _activeQuests = _qm.getByState("active")>> <<set _completedQuests = _qm.getByState("complete")>> <<set _quests = _activeQuests.concat(_completedQuests)>> <</if>> <<if _quests.length == 0>> <div class="quest-empty">📭 Нет квестов</div> <<else>> <<for _i = 0; _i < _quests.length; _i++>> <<set _quest = _quests[_i]>> <<QuestCard _quest>> <</for>> <</if>> </div> <</widget>> <</nobr>>
<style> .quests { display: flex; flex-direction: column; gap: 8px; max-width: 400px; margin: 5px 0; font-family: 'Georgia', serif; } .quest-card { border: 2px solid var(--color-accent, #7b5e4b); border-radius: 8px; padding: 8px; background: var(--bg-card, #fff9ef); box-shadow: 0 2px 6px rgba(0,0,0,0.1); } .quest-card--completed { opacity: 0.7; background: var(--bg-accent, #e8d9c0); } .quest-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 4px; padding-bottom: 4px; border-bottom: 1px dashed var(--color-accent, #7b5e4b); } .quest-status { font-size: 0.7em; padding: 2px 6px; border-radius: 10px; text-transform: uppercase; font-weight: bold; color: white; } .quest-status.active { background: var(--color-success, #27ae60); } .quest-status.complete { background: var(--color-primary, #b0775c); } .quest-name { font-weight: 600; margin: 3px 0; color: var(--text-main, #3a2e24); font-size: 0.9em; } .quest-desc { font-size: 0.85em; color: var(--text-soft, #5f4e3c); margin: 3px 0 6px; font-style: italic; } .quest-flags { display: flex; flex-direction: column; gap: 3px; margin-top: 4px; padding-top: 4px; border-top: 1px dotted var(--color-accent, #7b5e4b); } .quest-flag { display: flex; justify-content: space-between; font-size: 0.8em; padding: 2px 4px; background: rgba(123, 94, 75, 0.1); border-radius: 3px; } .flag-name { color: var(--text-main, #3a2e24); font-family: monospace; } .flag-value { padding: 1px 4px; border-radius: 8px; font-size: 0.75em; font-weight: bold; color: white; } .flag-value.true { background: var(--color-success, #27ae60); } .flag-value.false { background: #c0392b; } .quest-empty { padding: 15px; text-align: center; border: 2px dashed var(--color-accent, #7b5e4b); border-radius: 8px; color: var(--text-soft, #5f4e3c); font-style: italic; } </style>
<<widget "EnterRoom">> <<set _room = _args[0]>> <<set _questId = _args[1] ?? null>> <<set _quest = $player.questManager.get(_questId)>> <<if not $player.isVisit(_room)>> <<run $player.setVisit(_room)>> <<if _quest>> <<run _quest.start()>> <</if>> <</if>> <</widget>>
⚔️ БОЕВАЯ СИСТЕМА - СПРАВКА ⚔️ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1️⃣ ХОДЫ Бой идет по очереди. Сначала ваш ход, затем ход врага. Когда вы атакуете или защищаетесь - ход переходит к врагу. После атаки врага - ход снова ваш. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2️⃣ АТАКА (⚔️) Урон зависит от экипированного оружия: - С оружием: урон = сила оружия - Без оружия: урон = 1 Оружие может сломаться после удара (см. описание предмета) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3️⃣ ЗАЩИТА (🛡️) Вставая в защиту, вы уменьшаете следующий удар врага вдвое, а также в <<= $battle.counterAttackChance * 100 >>% случаев совершите контратаку. Защита действует только на один удар и тратит ход. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4️⃣ ЗДОРОВЬЕ (❤️) У каждого есть HP. Когда HP падает до 0 - бой проигран. Вы можете лечиться предметами из инвентаря (если они есть). ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5️⃣ БРОНЯ Броня поглощает часть урона (см. описание предмета). Броня может сломаться при попадании. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6️⃣ УКЛОНЕНИЕ (💨) Некоторые враги могут уклоняться от атак, полностью уходя от урона. Шанс уклонения указан в описании врага. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7️⃣ ПОБЕДА И ПОРАЖЕНИЕ - Победа: враг побежден, вы получаете награду - Поражение: ваше HP = 0, игра начинается заново ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
<<link "Открыть инвентарь">> <<run Dialog.create('Инвентарь').wikiPassage("Инвентарь").open()>> <</link>> <<link "Показать квесты">> <<run Dialog.create('Квесты').wiki("<<QuestDisplay 'active'>>").open()>> <</link>>
<<set _roomName = "спальня">> <<EnterRoom _roomName>> Ты пробираешься в спальню. Здесь тихо и пыльно, но чувствуется, что комната жилая — на кровати сбито одеяло, на подушке вмятина от головы, на тумбочке стоит чашка с недопитым чаем. Сквозь грязные занавески пробивается мягкий свет, делая комнату почти уютной. В углу стоит старый платяной шкаф, его дверца приоткрыта. На подоконнике, в единственном горшке, грустит живой цветок, а вокруг него вьется муха. А из-под кровати доносится отчетливый топот — там словно устроили жесткую дискотеку. Мыши явно знают толк в веселье. Куда заглянем? [[Осмотреть тумбочку|Тумбочка]] [[Заглянуть в шкаф|Гардероб]] [[Забраться под кровать|Под кроватью]] [[Подойти к подоконнику|Подоконник]] [[Вернуться в коридор|Коридор]]
<<set _roomName = "тумбочка">> <<set _teaQuest = $player.questManager.get('подозрительный_чай')>> <<set _standQuest = $player.questManager.get('тумба_в_спальне')>> <<set _isCupBroken = _teaQuest.isComplete()>> <<set _isOpenAll = _standQuest.getFlag('осмотрен_верхний') and _standQuest.getFlag('осмотрен_средний') and _standQuest.getFlag('осмотрен_нижний')>> <<EnterRoom _roomName "тумба_в_спальне">> Старая деревянная тумбочка притулилась у кровати, чуть покачиваясь на короткой ножке — видно, пол тут неровный. Когда-то она была полированной, но годы стерли глянец, оставив только темные разводы и царапины, похожие на морщины. В воздухе пахнет старой древесиной и почему-то валерьянкой. <<if not _isCupBroken>> Сверху, на потертой салфетке с вышитыми ромашками, стоит фарфоровая кружка. <<else>> В округе разбросаны острые осколки чашки. <</if>> Три ящика. Верхний — самый маленький, с медной ручкой в виде лапки. Он приоткрыт ровно настолько, чтобы видеть темноту внутри. Из щели тянет затхлостью. Средний — заперт на крошечный замочек. Ржавый, но держит крепко. Нижний — самый большой, прикрыт неплотно. Оттуда доносится подозрительное шебуршание. Кажется, там кто-то есть. <<if _isOpenAll>> <<run _standQuest.complete()>> <</if>> <<if not _isCupBroken>> [[Осмотреть кружку|Чашка чая]] <</if>> [[Верхний ящик (щель)|Верхний ящик]] [[Средний ящик (заперт)|Средний ящик]] [[Нижний ящик (шебуршит)|Нижний ящик]] [[Вернуться в спальню|Спальня]]
<<set _roomName = "гардероб">> <<set _questMagpie = $player.questManager.get('сорока')>> <<set _magpieGone = _questMagpie.isComplete()>> <<set _questChest = $player.questManager.get('тумба_в_спальне')>> <<set _keyFound = _questChest.getFlag('найден_ключ')>> <<EnterRoom _roomName _questMagpie>> Старый шкаф пахнет нафталином. <<if not _keyFound>> Слева висит **халат**, на верхней полке коробки. <</if>> <<if not _magpieGone>> На вешалке сидит сорока. <</if>> <<if not _magpieGone>> [[Поговорить с сорокой|Сорока]] <</if>> <<if not _keyFound>> [[Осмотреть халат|Халат]] <</if>> [[Вернуться в спальню|Спальня]]
<<set _roomName = "под_кроватью">> <<set _partyVisited = $player.isVisit('мышиная_тусовка')>> <<if not $player.isVisit(_roomName)>> <<run $player.setVisit(_roomName)>> Ты забираешься под кровать. Здесь темно, пыльно и тесно. В дальнем углу — настоящее столпотворение: мыши в маленьких шляпках отплясывают под старый граммофон, кто-то свистит, кто-то пискляво поет. Дискотека в самом разгаре. Одна мышь замечает тебя, машет лапкой и кричит: «Заходи, сосед!» <<else>> Под кроватью всё так же пыльно и шумно. Мыши продолжают веселиться. <</if>> [[Войти в нору|Мышиная нора]] [[Вернуться в спальню|Спальня]]
<<set _roomName = "подоконник">> <<set _questMagpie = $player.questManager.get('сорока')>> <<if not $player.isVisit(_roomName)>> <<run $player.setVisit(_roomName)>> Широкий деревянный подоконник залит мягким светом, пробивающимся сквозь грязное стекло. В центре стоит глиняный горшок с чахлым комнатным цветком — листья поникли, стебли вытянулись к солнцу, но так и не достали его. Земля в горшке потрескалась, давно просящая воды. <<link "Взять монетку">> <<run $player.addItem('монетка')>> <<goto "Подоконник">> <</link>> <<else>> Подоконник всё так же залит мягким светом. Цветок стоит на том же месте — поникший, несчастный, давно ждущий, когда его польют. Монетки больше нет, только горшок, потрескавшаяся земля и тонкий слой пыли, успевший осесть с прошлого раза. <</if>> [[Вернуться в спальню|Спальня]]
<<do tag "tea_choice">> <<set _roomName = "чашка_чая">> <<set _questId = 'подозрительный_чай'>> <<set _quest = $player.questManager.get(_questId)>> <<set _drinkTea = _quest.getFlag('выпить_чай')>> <<set _pourTea = _quest.getFlag('избавиться_от_чая')>> <<EnterRoom _roomName _questId>> Вы подбираетесь к тумбочке. Кружка стоит на самом краю, рядом с ней — размоченный сухарик. Жидкость внутри мутноватая, на поверхности лениво лопаются пузырьки. Пахнет... хмелем? Пиво. Настоящее пиво. В чайной кружке. Непорядок. <<if _quest.isComplete()>> Кружка разбита. А жаль, красивая была. [[Вернуться|Тумбочка]] <<elseif _pourTea>> <p>Ты выплескиваешь пиво на кровать и разбиваешь кружку. Автор одобряет. На месте кружки появляется подарок.</p> <<set _reward = _quest.getReward()>> <<run _quest.complete($player)>> <<GiveItems _reward>> <<elseif _drinkTea>> <p>Ты выпиваешь содержимое и случайно роняешь кружку. Автор осуждающе дает пинка Хранителю.</p> <<link 'Попробовать уклониться'>> <<run $player.hp = 1>> <<run $player.maxHp = 10>> <<run Dialog.create('Сообщение от автора').append('От себя уклонись, алкоголик!').open({}, () => { UI.alert('Хранитель чувствует, как жизненные силы покидают его... Показатель его здоровья значительно уменьшен') })>> <<run _quest.complete($player)>> <<redo 'player'>> <<goto 'Чашка чая'>> <</link>> <<else>> <<link 'Осудить (вылить пиво)'>> <<run _quest.setFlag('избавиться_от_чая', true)>> <<redo "tea_choice">> <</link>> <<link 'Поддержать (выпить пиво)'>> <<run _quest.setFlag('выпить_чай', true)>> <<redo "tea_choice">> <</link>> [[Вернуться|Тумбочка]] <</if>> <</do>>
<<set _roomName = "верхний_ящик">> <<set _quest = $player.questManager.get('тумба_в_спальне')>> <<set _hasScrew = $player.inventory.hasStoryItem('скрепка')>> <<set _opened = _quest.getFlag('осмотрен_верхний')>> <<if not _opened>> <<if _hasScrew>> <<run $player.useStoryItem('скрепка')>> Ты просовываешь скрепку в щель и аккуратно поддеваешь защелку. Ящик со скрипом открывается. Внутри — пыль, моток старых ниток и пожелтевший конверт. Похоже, это письмо. Рядом валяется пуговица. <<GiveItems 'пуговица'>> <<link "Забрать всё и закрыть ящик">> <<run _quest.setFlag('осмотрен_верхний', true)>> <<goto "Тумбочка">> <</link>> <<else>> Ящик приоткрыт ровно настолько, чтобы просунуть разве что лапку. В щели темно, но видно что-то блестящее. Нужна чем-то поддеть защелку. [[Вернуться к тумбочке|Тумбочка]] <</if>> <<else>> Ящик уже открыт. Внутри пусто, только пыль и пара старых ниток. [[Вернуться к тумбочке|Тумбочка]] <</if>>
<<set _roomName = "средний_ящик">> <<set _quest = $player.questManager.get('тумба_в_спальне')>> <<set _hasKey = $player.inventory.hasStoryItem('ключ_от_тумбы')>> <<set _opened = _quest.getFlag('осмотрен_средний')>> <<if not _opened>> <<if _hasKey>> <<run $player.useStoryItem('ключ_от_тумбы')>> Ключ подходит! Замок щелкает, и ящик выезжает наружу. Внутри аккуратно сложены какие-то тряпицы. Под ними — **кошачья миска**. Совсем маленькая, игрушечная. <<GiveItems 'кошачья_миска' "корка">> <<link "Забрать миску и закрыть ящик">> <<run _quest.setFlag('осмотрен_средний', true)>> <<goto "Тумбочка">> <</link>> <<else>> Ящик заперт на маленький замочек. Нужен ключ. [[Вернуться к тумбочке|Тумбочка]] <</if>> <<else>> Ящик пуст. Только затхлый запах и следы того, что здесь когда-то что-то лежало. [[Вернуться к тумбочке|Тумбочка]] <</if>>
<<set _roomName = "нижний_ящик">> <<set _quest = $player.questManager.get('тумба_в_спальне')>> <<set _opened = _quest.getFlag('осмотрен_нижний')>> <<set _isEnemyDefeat = _quest.getFlag('побежден_противник_нижний')>> <<if not _opened>> Ты осторожно приоткрываешь нижний ящик. Оттуда пахнет сыростью и старой пылью. Внутри — ворох старой ваты и тряпок. Что-то шевелится. Из-под лоскута ткани высовываются длинные усы, а затем выползает усатый таракан. Недовольно шевелит усами — явно считает это место своим. <<if not _isEnemyDefeat>> <<set _battleConfig = { enemyKey: "таракан_зерновой", actions: [ { type: "setQuestFlag", questId: "тумба_в_спальне", flag: "побежден_противник_нижний", value: true } ] }>> <<Battle _battleConfig>> <<else>> <<GiveItems "сыр" "песок">> <<run _quest.setFlag('осмотрен_нижний', true)>> <</if>> [[Отступить|Тумбочка]] <<else>> В ящике пусто. Только клочки ваты и пыль. [[Вернуться к тумбочке|Тумбочка]] <</if>>
<<set _roomName = 'торговая_лавка'>> <<set _questMagpie = $player.questManager.get('сорока')>> <<set _hasCoin = $player.inventory.hasStoryItem('монетка')>> <<set _hasPaperclip = $player.inventory.hasStoryItem('скрепка')>> <<EnterRoom _roomName 'сорока'>> <<if _questMagpie.isComplete()>> Сорока улетела. <<elseif _hasPaperclip>> Сорока косится на тебя, но скрепка у тебя уже есть. <<elseif _hasCoin>> Сорока вытягивает лапку, увидев монетку. <<link "Отдать монетку">> <<run $player.useStoryItem('монетка')>> <<run $player.addItem('скрепка')>> <<run _questMagpie.complete($player)>> <<run Dialog.create("Сорока").wiki("Сорока хватает монетку и бросает тебе скрепку.").open()>> <<goto "Гардероб">> <</link>> <<else>> Сорока стрекочет. Ей нужна блестящая монетка. <</if>> [[Вернуться|Гардероб]]
<<set _questChest = $player.questManager.get('тумба_в_спальне')>> <<set _keyFound = _questChest.getFlag('найден_ключ')>> <<if not _keyFound>> В кармане халата что-то топорщится. <<link "Взять ключ">> <<run $player.addItem('ключ_от_тумбы')>> <<goto "Гардероб">> <</link>> <<else>> Карман пуст. [[Вернуться|Гардероб]] <</if>>
<<set _roomName = 'мышиная_тусовка'>> <<set _isVisit = $player.isVisit(_roomName)>> <<set _catQuest = $player.questManager.get('кот')>> <<set _catChase = _catQuest.getFlag('кот_разбужен')>> <<set _catGone = _catQuest.getFlag('кот_ушел')>> <<EnterRoom _roomName>> <<if _catChase and not _catGone>> Ты в попыхах рассказываешь мышам, о приближении опасности. Они, без доли паники, будто это происходит ежедневно, выключают музыку, накрывают дискошар тряпкой и замолкают, у входа в нору. Подоспевший кот, немного поежился, поворчал и ушел прочь. Мыши продолжили веселье. <<run _catQuest.setFlag('кот_ушел', true)>> <<else>> Ты протискиваешься в нору. Внутри — уютный зал, где мыши танцуют, угощают друг друга крошками и крутят граммофон. Тебя встречают радостными писками и угощают сыром. Мыши упоминают, что давно прячутся здесь от кота. <<if not _isVisit>> <<GiveItems "наперсток" "сыр" "сыр">> <</if>> <</if>> [[Вернуться|Под кроватью]]
<<nobr>> <<widget "MusicPlayer">> <<set _volume = _args[0] ?? 0.3>> <<do tag 'music'>> <div class="music-player"> <<if $musicStarted>> <<link "🎵 Выключить музыку">> <<audio $musicTrack stop>> <<set $musicStarted = false>> <<redo 'music'>> <</link>> <<else>> <<link "🎵 Включить музыку">> <<audio $musicTrack loop volume _volume play>> <<set $musicStarted = true>> <<redo 'music'>> <</link>> <</if>> </div> <</do>> <</widget>> <</nobr>>
<style> .music-player { position: fixed; bottom: 1rem; right: 1rem; z-index: 100; } .music-player a, .music-player .link-internal { background: var(--bg-card); border: 1px solid var(--color-accent); border-radius: 50px; padding: 0.5rem 1rem; font-size: 0.9rem; text-decoration: none; color: var(--text-main); cursor: pointer; transition: all 0.2s ease; } .music-player a:hover { background: var(--color-primary); color: white; border-color: var(--color-primary); } </style>
<style> .toast-container { position: fixed; bottom: 3rem; left: 80%; transform: translateX(-50%); display: flex; flex-direction: column; gap: 10px; z-index: 100000; pointer-events: none; } .toast-notify { background: var(--bg-card); border: var(--border); border-color: var(--color-primary); border-radius: 12px; padding: 1rem 1.5rem; box-shadow: var(--shadow); color: var(--text-main); opacity: 0; transform: translateY(20px); transition: all 0.3s ease; pointer-events: none; } .toast-notify.show { opacity: 1; transform: translateY(0); } .toast-notify.hide { opacity: 0; transform: translateY(-20px); } </style>
<<set _catQuest = $player.questManager.get('кот')>> <<set _isCatFriendly = _catQuest.getFlag("кот_друг")>> <<set _score = 0>> <<if _isCatFriendly>> <<set _score += 1>> <</if>> <<set _itemsKeys = ["сода", "ведро_воды", "песок"]>> <<set _foundItems = []>> <<for _i = 0; _i < _itemsKeys.length; _i++>> <<set _item = $player.inventory.getItemById(_itemsKeys[_i])>> <<if _item>> <<set _score += 1>> <<set _foundItems.push(_item.name)>> <</if>> <</for>> Для тушения пожара вы использовали: <<if _foundItems.length>> <<= _foundItems.join(", ")>>. <<else>> ничего. <</if>> <<if _score >= 4>> ✨ **ИДЕАЛЬНО!** ✨ Вы встретили огонь во всеоружии. Кот, с которым вы подружились, помогает засыпать тлеющие угли. Пламя гаснет почти мгновенно. Дом спасён. Вы — настоящий Хранитель. Усталый, но довольный, вы возвращаетесь на своё место за печкой. <<link "Начать заново">> <<run Engine.restart()>> <</link>> <<elseif _score >= 2>> 🔥 **ПОЖАР ПОТУШЕН** 🔥 Огонь удалось сбить, но не сразу. Чего-то не хватало. Кухня закопчена, половицы обуглились, но дом уцелел. <<if _isCatFriendly>> Кот довольно мурлычет и трётся о вас. Он тоже старался. <</if>> Вы сделали всё, что могли. Дом ещё стоит, а вы возвращаетесь к печи — отдыхать после тяжёлой битвы с огнём. <<link "Начать заново">> <<run Engine.restart()>> <</link>> <<elseif _score >= 1>> 💨 **ЕДВА СПАСЛИСЬ** 💨 Огня было слишком много. Вы бросаете в пламя всё, что нашли, но этого едва хватает. Кухня сильно пострадала — мебель обуглилась, стены покрылись копотью. <<if _isCatFriendly>> Кот хватает вас зубами за шкирку и вытаскивает из горящей комнаты. Вы оба выбираетесь живыми. <<else>> Вы выбираетесь сами, задыхаясь в дыму, и падаете без сил на пороге дома. <</if>> Восстановление дома займёт много времени. Главное — вы живы. <<link "Начать заново">> <<run Engine.restart()>> <</link>> <<else>> 💀 **ПОЖАР ПОБЕДИЛ** 💀 Пламя пожирает кухню. У вас нет ничего, чтобы остановить огонь. Дым застилает глаза, жар становится невыносимым. Вы не справились. Дом, который вы хранили, горит. А вместе с ним — всё, что вы успели найти. <<link "Начать заново">> <<run Engine.restart()>> <</link>> <</if>>
💀 ВЫ ПОГИБЛИ 💀 Ваше приключение оборвалось... Слишком велика оказалась опасность, подстерегавшая вас на пути. <<link "🏠 Начать заново">> <<run UI.restart()>> <</link>>
ИГРА ВСЕ ЕЩЕ В РАЗРАБОТКЕ, ПОЭТОМУ: 1. Для полного погружения рекомендуется нажать F11. 2. Не перезагружайте страницу. Все сломается. 3. Механика сохранений корявая. Не рекомендуется. 4. Если что-то сломалось - напиши мне [[Назад|На печке]]
<<set _damage = 10>> <<run $player.damage(_damage)>> Вы бежите что есть сил, но кот быстрее. Огромная лапа настигает вас... После того, как ваше тело перестало двигаться, он утратил интерес и ушел восвояси. <<set _message = 'Вы получили урон: ' + _damage>> <<notify _message>> <<do tag 'player'>> <<if $player.isAlive()>> Из последних сил вы поднимаетесь на ноги, отряхиваете штаны в горошек и продолжаете путь. <</if>> <</do>>
<<set _questMagpie2 = $player.questManager.get('сорока_2')>> <<set _windowOpen = _questMagpie2.getFlag('окно_открыто')>> <<set _magpieGone = _questMagpie2.getFlag('сорока_улетела')>> <<set _hasEarring = $player.inventory.hasStoryItem('серьга')>> За комодом обнаруживается щель, ведущая к окну. Сорока сидит на подоконнике и что-то клюёт. <<if _magpieGone or _questMagpie2.isComplete()>> Сорока улетела. <<elseif _windowOpen>> Окно открыто. Сорока сидит на подоконнике и с интересом смотрит на вас. <<if _hasEarring>> <<link "Отдать серьгу">> <<run $player.useStoryItem('серьга')>> <<set _reward = $player.questManager.get('сорока_2').complete($player)>> <<run Dialog.create("Сорока").wiki("Сорока хватает серьгу, довольно стрекочет и улетает. На подоконнике остаётся ведро воды. <<GiveItems _reward>>").open()>> <<goto "Комод - сорока">> <</link>> <<else>> Сорока косится на вас и перебирает лапками. Кажется, она ждёт плату. Но у вас ничего блестящего нет. <</if>> <<else>> Окно закрыто. Сорока сидит снаружи и смотрит на вас. <<link "Открыть окно">> <<run _questMagpie2.setFlag('окно_открыто', true)>> <<goto "Комод - сорока">> <</link>> <<link "Не открывать">> <<run _questMagpie2.setFlag('сорока_улетела', true)>> <<run Dialog.create("Сорока").wiki("Сорока обиженно улетает.").open()>> <<goto "Комод - сорока">> <</link>> <</if>> [[Вернуться|Зал - комод]]