謎解きブログ「100階建ての無人ホテル」

ブログで遊べる無料オンライン脱出ゲーム。誰もいないホテルから逃げ出そう。

「100階建ての無人ホテル」開発後記(あとがき)

謎解きブログ「100階建ての無人ホテル」の開発を振り返って
制作中に考えたことなどを書き留めておく。

ただし、以下にはゲーム中のネタバレも多数含まれるため、
これからプレイする方は読まないようにして欲しい。

新作開発の決意

実況配信を許可することを明文化して以来、
謎解きブログの1作目
YouTubeやTwitch上で実況してくれる人が少しずつ現れた。

自分の作ったものを誰かがプレイする姿というのは
クリエイターにとってかなりエネルギーがもらえるもので、
こうなると新たな作品を作って
またいろいろな人を楽しませたい気持ちが湧いてきた。

ただ、5年経ったとはいえ前作の開発で
多く苦労をした記憶が残っていたため、
同じように完成までがんばれるか、
謎のアイデアが思いつくかの自信が出なかった。

もんもんとした気持ちのまま数日悩んだ末、
創作意欲が不安な気持ちを上回ったため
新作の開発をする決心をした。

舞台設定

最初に考えたことは世界設定だ。

脱出ゲームである以上、どこか閉鎖空間に閉じ込める必要があるが、
謎解きの展開を考えると内部がある程度区分けされている方がいい。

最初に思いついたのは「電車」だったのだが、
電車の車内は物が隠せる場所がなさすぎること、
電車の中にあっても不自然じゃないものが限られること、
ちょうど「8番のりば」が話題になっていたことから却下した。

次にゾンビものなどで定番の「デパート」を思いついたが、
デパート内の店舗はドアを介さずに出入りできることや
店舗数は多くてもジャンルが限られていることから却下した。

アイデアとしては「病院」もあったのだが、
病室以外にどんな部屋があるのかが一般的に知られておらず、
馴染みがない場所は世界観が想像しにくいので却下した。

結果的に妻のアイデアが発端で「ホテル」に決まった。
建物内に客室という閉鎖空間がたくさんあることと、
その中ならたいていの物があっても問題がないことから都合がよかった。

部屋移動のプログラムを開発

どうせならバカみたいに客室が多いホテルにして
そのどの部屋にもアクセスできるようにしようと思いついた。

そこでまず作ったのが、4ケタの部屋番号を入力すると
表示されていた画像が客室のドア前の写真に変わって
文章中の部屋番号も置き換わるというプログラムだ。

まさか数千もの客室を実際に作るわけにいかないので
客室ページを1つだけ用意して
部屋番号の情報を書き換えるようにしたのだ。
これが実現できなければホテルのアイデアは諦めていただろうが、
無事に0101号室から9999号室まで行けるページが完成した。

スタート地点の設定

前作は小学校の2階から始まり、3階、4階と上ったあと
1階に下りて脱出するという展開だったが、
今回はホテルのロビーから始まって上階へと上ることを考えた。

しかし屋上まで到達しても脱出できないし、
ヘリコプターが迎えに来るのも違和感がある。
(脱出ゲームなので他に人間がいる世界観は避けたい)

そこで最上階から始めて1階に下りてくる流れに変えた。

そうなるとどこをスタート地点にするかだが、
ホテルの最上階といえば展望台やレストラン、
スイートルームぐらいしか思いつかない。

そう考えていたときに
「レストランがあるならトイレもあるはず」と思いついた。

スタート地点には一番簡単な小謎があるべきなので
前作同様にトイレに鍵をかけようかと思ったが、
紙がなくて便座から立ち上がれないようにした方が
トイレというシチュエーションが活きて面白いと思い直した。

当初は男子トイレの個室を想像していたのだが、
ゲームをプレイする人が女性の可能性があり、
いきなり男子トイレに座っていると感情移入を妨げるだろう。

そこで男女どちらが使っていても違和感のない多機能トイレを
スタート地点とすることにした。
結果的にそのおかげで男女ペアにすることで解ける謎や
3つのトイレを正しく出入りすることで解ける謎につながった。

正しい手順で移動する謎の仕組み

プログラムには主人公の体力や所持金を保存する「変数」という仕組みがあるが、
ブログ上で動いている本作ではページをまたいで変数を持ち越すことが難しく、
アイテムの有無や同じ場所に何回来たかを調べることができない。

ゲームをプレイしているパソコンやスマホに保存する方法はあるだろうが、
それをしてしまうとプレイを中断したときに
以前と同じマシンでないと再開できないという不便さが出てしまい、
ブックマークするだけで中断できるという手軽さをなくしてしまう。

今回、序盤に3種類のトイレを正しい順序で行き来する謎が出てくるが、
これを変数を使わずに実現する必要がある。

そこでまったく同じ見た目の廊下を複数用意し、
正しいトイレから出たときだけ次の廊下に移動するようにした。

つまり、1つ目の廊下にある3つのトイレのうち
男性トイレと多機能トイレから出ると1つ目の廊下に進むが、
女性トイレだけは2つ目の廊下につながっているのだ。

そして2つ目の廊下にある3つのトイレのうち
女性トイレと多機能トイレから出ると1つ目の廊下に戻るようにし、
男性トイレだけは3つ目の廊下に出ていくのだ。

要するに内部的には同じ見た目のトイレと廊下がいくつもあり、
それらの出口と入口が複雑につながっている。
技術ではなくアイデアで実現した謎だ。

最後に示すメッセージを考える

謎解きというのは問題を解いて導き出した答えが
次の行動を指示するメッセージとして使われるため、
まず一番最後に伝えたい文章を考え、
それらの文字が含まれる単語が答えになるような問題を考える。
つまり解くのとは逆の順番で作っていく必要がある。

今回、最後の大謎として
西暦を部屋番号として入力するアイデアを思いついたが、
どうせなら1年ごとにしか変わらない答えより
毎日変化した方が斬新だと考えて
今日の日付を部屋番号とする仕様に変更した。

現在の月日をプログラムで取得し、
1ケタの場合は0を追加して4ケタの数字に仕上げ、
部屋番号として判定できるようにする処理が作れたので
このアイデアが実現できる確信を持った。

「今日の日付を4桁の部屋番号として入力しろ」だと
指示が直接的すぎて作業感が出るので
「今日をノックしろ」というメッセージで
「ノックする=ドア?=部屋番号?」と連想できるようにした。

答えとなる単語から逆算して問題を作る

また、1フロアに99部屋の客室があり、
それらが99階あるという世界観と絡める意味でも
「客室の数」をどこかで利用したいと考えた。

個人的に謎解きでグッとくるのが
以前使った用紙や答えを別の形で再利用する場面だ。
つまり途中で求めた答えから
別の文章が取り出せるようにしたかった。

そこで「きゃくしつのかず」という8文字をひとつずつ含む単語を考えたあと、
さらに「きょうをのっくしろ」の文字が含まれるよう少しずつ調整していった。
(「を」が入る単語はどうしても作れなかったのでそこだけ枠から外した)

また、あまりに無関係な単語というのも避け、
なるべくホテルや旅行や豪華な雰囲気を感じるものにする。
それらの条件がすべてそろった単語選びに相当苦労した。

こうして「ひゃっかい」「かんこう」「いつつぼし」など
計8個の単語が導き出され、
それらが答えとなる問題を考えていった。

この時期の開発メモ:


8個の問題を考える苦悩の日々

答えの方が先に決まっているため
そこに行き着く問題を考えていくのだが、
正直、この過程が一番辛く、毎日毎日疲弊していた。

通勤時間は音楽を流さないままノイズキャンセリングイヤホンをして
無音の空間で問題を考える日々が続いた。
まさに寝ても覚めても謎を考えている状況で、
家でも職場でも頭が休まる暇がなかった。

開発に着手する前から予想できていたことだが、
今回は前作で使ったネタと重複しないようにする必要があるため
とにかくキツかった。本当に大変だった。

問題が置かれた部屋への誘導を考える

今回、謎が置かれた8個の客室を用意したが、
どうにかしてその客室番号を伝える必要がある。
答えを書き込む用紙に
部屋番号を載せてしまえば楽だが、それでは面白くない。

そこで最上階に展望台とレストランを作り、
そこに部屋番号を散りばめることにした。

ゲーム公開当初、レストランのホワイトボードには
4つもの部屋番号が書かれていたが、
それでは工夫がないため、のちのち2つを別のネタに移動した。



また、8個の答えを用紙内のどの枠に書くかを示す必要があったが、
各枠に部屋番号を添えてしまうと目的地を調べる意味がなくなってしまうため、
◎や▼といった記号を用紙と問題に記載してペアを表すことにした。

ロビーに下りてからの問題を考える日々

8個の謎を解いたあと、プレイヤーはロビー階に下りてくる。
そこからホテルを脱出するための方法を手にいれるため、
さらに新たな問題が必要になり、また苦難の日々が始まった。

しかもゲーム後半で登場する謎のため少し難易度を上げる必要があり、
複数の手がかりを一気に提示した上で
どれから取りかかるかという判断自体も謎にしている。

問題Aと手がかりA、問題Bと手がかりB、問題Cと手がかりCのように
2つの情報をペアにして解く謎を複数用意し、
ロビーには手がかりAと手がかりBと問題Cを置く。
このうち手がかりCだけはすでに解き終えた問題を利用する。

つまりこの3つで解けるのはペアが成立している問題Cだけだが、
取っ掛かりを見出すための推理をするところが難しい。
そして問題Cを解くと問題Aが手に入るので
「もしかしてさっきの情報を使うでは?」となるわけだ。

ペアの数が多すぎると混乱するだけでストレスになるし、
序盤の8個のように単体で解ける謎だと歯応えがないので
このあたりの調整には非常に神経を使った。

随所で過去のプログラミング実験が役立った

今回は前作以上にあちこちでプログラムを使ったが
それを支えているのは普段のブログで試してきたJavaScriptの知識だ。

謎解きブログのためにプログラムを勉強したというより
「以前使ったアレを利用すればこんなネタができそう」という発想で、
日頃から細々といろいろなアイデアを実現していたのが役立った。


mclover.hateblo.jp


公開3ヶ月後に深刻なバグが発生した

本作ではその日の日付が部屋番号になっていることがキモなのだが、
7月初旬に公開してから3ヶ月が経った10月10日、
ずっとうまく動いていたその処理が急に動かなくなった。
とあるプレイヤーから「こういう風に解くとしか思えないけど
どうにもうまく進まなくなった」という報告があったのだ。


「そんなバカな」と思って大謎のページを開き、
その日の日付である「1010」という部屋番号を入れてみたが
確かに正解の部屋に進むことができない。バグだ。


いろいろとチェックしてみると
非常に単純なミスが原因だと発覚した。




まず、プログラムでは数値と文字列には明確な違いがあり、
同じように見えるデータでも扱いがまったく異なる。
たとえば「+」の記号を使った計算の場合、
数値だと足し算になるが、文字列だと単語が結合されるのだ。


C++言語だとそもそもデータを入れる変数で区別されるのだが、
謎解きブログで使ったJavaScriptでは自動的に変換されるため、
楽と言えば楽だが、扱っているデータがどちらの形式なのか実感しにくい。




そして、文字列と数値を組み合わせると
計算結果が文字列になるのも今回の重要なポイントだ。




たとえば7月12日を部屋番号にする際、
「712号室」ではなく「0712号室」になるよう
7月に「0」を加えて2ケタに加工している。
足し算ではなく単語の結合になるよう文字列の「0」を使っているので、
結合後の「07」も文字列だし、その後の「0712」も文字列となる。




10月になると月の方は2ケタになるが、
日付側が文字列として加工されるので
最終的な部屋番号もやはり文字列としてできあがる。




しかし厄介なのが10月10日以降だ。


月も日付も2ケタのため、
文字列の「0」を結合する手順が飛ばされる。
その結果、データ形式が数値のまま進んでしまい、
「1010号室」ではなく「20号室」になってしまう。


これだと「今日の日付を部屋番号にすればいいんだ」とひらめいても
正解と判定されなくて謎解きが進まなくなる。
そこで、月と日付を結合する前に
それぞれを文字列形式に変換する処理を入れて修正した。


本作の開発が6~7月だったことと
10月9日までは月か日付のどちらかが1ケタだったために
10月10日まで不具合が発見できなかったのだ。


「ゲームが進行できなくなる」という致命的な状況にヒヤリとしたが、
「娘がどうしてもクリアしたいと何度も入力している」と
連絡をくれた女性のおかげで早期発見・早期対処することができた。