文芸部に体験入部した話

This article is not suitable for children or
those who have never played DDLC.


タイトルからおわかりいただけると思うが「Doki Doki Literature Club」を遊んでみて思ったことについて書きます。

当然ながらネタバレを結構含みます。あと筆者が一応技術屋な人間なので視点がそっち寄りです。

 

 

 

ここは摘要欄でネタバレすることを防ぐためのダミーテキストだよ

忘れてたけどPythonに関する知識があるとより楽しめるかもしれないね

 

 

 


 

たぶんこんくらいスクロールさせればいいよね

 


 

ここから下はバンバン内容についても書くのでそのつもりで読み進めていただきたい。

プレーに至った経緯

Twitterを眺めているとなんか後輩と部長が言い合いをしていて興味本位で調べてみたら

悲しいことにここで引き返してりゃ良かったんですが怖いもの見たさでインスコしてしまったんですよね

ホラーゲームなのかとはすぐに察せられましたがなんかあんまり怖くなさそうというか怖くってもIbくらいのもんかなみたいに思ってしまってたのがすべての運の尽きでした。

やめときゃいいのにやっちまったんだもんなぁ

感想のような謎解説のような

途中はアホほど怖かったです

ホラー普段読まないやらないような人間が真夜中に1人でやったらそらーこわいわな

Discordの通話でしょっちゅうオワッタしてたぼくにつきあってくれた友人と先輩本当にありがとうございました。某絵師と某みかん許さんからな。某後輩くんはつらいだろうけどEDまで走ってくれることを祈っています。

このゲームは、確かに怖いけれどもそれ以上に得るものがあります。

あとこれやってから、DDLCしてるわけじゃないのにいきなり画面にエラーが表示されたりするとめちゃくちゃビビるようになってしまいました。後遺症かな?

まあとにかくいろいろビビったすげえと思った点とかを書いていこうと思います。

トレースバックに完全に油断させられた

サヨリちゃんは残念でした… あの衝撃で今後しばらくADVをやることはないだろうと思いました(?)

背景とBGMが狂い、やがてエラーメッセージが表示されます

An exception has occurred.

File “game/script-ch5.rpy”, line 307
See traceback.txt for details.

日本語ではこう(確か)

例外が発生しました

ファイル “game/script-ch5.rpy”, 行 307
詳細については traceback.txt を参照してください

まず例外について解説せねばならない(隙あらば解説)

ゲームを含むプログラムは臨機応変に対応、ということができない。なぜならプログラムはプログラマが書いたことしかやってくれないからである。しかしプログラムはユーザーがなんかマズい事をする可能性、あるいはネットワークの問題で遂行すべきタスクをクリアできなくなる可能性に晒されている。これを全部ひっくるめて例外(Exception)と呼ぶ。

プログラマはプログラムがこれらの例外にぶちあたった時にクラッシュすることなく処理を継続、あるいはユーザーに知らせるためにあらかじめ起きうる例外に対するアクションを定義しておくことができる。そう、書いておけばプログラムはやってくれるからね。例えば、「ファイルが存在しないか破損していた」場合は「ユーザーに対して『セーブデータをロードできない』と知らせる」といった感じに。

しかしプログラマが想定していない例外が発生することはまれによくある。そういった際に「予期しない例外」としてエラーを表示し、処理を停止させる。そう、あの背景のように。

で、予期しない例外で死んだ場合はどこの処理で死んだかを開発者に知らせるためにトレースバック(バックトレースやスタックトレースと言語によって表記が異なる)を残す。以下がその例(言語はPython)

(C:\ProgramData\Anaconda3) C:\Users\miyano\Desktop\ddlc>python demo.py
Traceback (most recent call last):
 File "demo.py", line 1, in <module>
 print(3 / 0)
ZeroDivisionError: division by zero

これはゼロ除算を行おうとした場合に発生する例外である。このトレースバックを読むことで開発者はどのファイルのどのあたりでどんなエラーが起きたのかを知ることができるのだ。(解説おわりのポーズ)

で、この画面に遭遇した一応へっぽこ開発者なぼくは目の前の光景にビビりながらもとりあえずトレースバックを読もうとフォルダを開いたんです。いやーSteamからDLしたのでディレクトリにたどり着くのが大変でしたw

あるじゃないですか、traceback.txt。やっぱあれはマジのエラーだったのかもしれない。ほんなら開発者に報告したほうがいいんじゃないかな~カチカチッ

I'm sorry, but an uncaught exception occurred.

While running game code:
 File "game/script.rpy", line 67, in script call
 File "game/tl/None/script-ch5.rpy", line 882, in script
 File "renpy/common/00start.rpy", line 260, in <module>
 renpy.call_in_new_context("_main_menu")
JumpException: あらまあ……何か壊れちゃったりしたかしら?ちょっと待って、これなら多分……直せそう……
でもこれって、あの子を削除した方がよっぽど簡単じゃない?ややこしい事態にしたのはあの子なんだし。あははっ!それじゃあ、ちょっと試してみましょうか。

-- Full Traceback ------------------------------------------------------------

Full traceback:
 File "game/script.rpy", line 67, in script call
 File "game/tl/None/script-ch5.rpy", line 882, in script
 File "C:\Program Files (x86)\Steam\steamapps\common\Doki Doki Literature Club\renpy\ast.py", line 814, in execute
 renpy.python.py_exec_bytecode(self.code.bytecode, self.hide, store=self.store)
 File "C:\Program Files (x86)\Steam\steamapps\common\Doki Doki Literature Club\renpy\python.py", line 1719, in py_exec_bytecode
 exec bytecode in globals, locals
 File "renpy/common/00start.rpy", line 260, in <module>
 renpy.call_in_new_context("_main_menu")
 File "C:\Program Files (x86)\Steam\steamapps\common\Doki Doki Literature Club\renpy\game.py", line 334, in call_in_new_context
 raise renpy.game.JumpException(e.args[0])
JumpException: あらまあ……何か壊れちゃったりしたかしら?ちょっと待って、これなら多分……直せそう……
でもこれって、あの子を削除した方がよっぽど簡単じゃない?ややこしい事態にしたのはあの子なんだし。あははっ!それじゃあ、ちょっと試してみましょうか。

Windows-8-6.2.9200
Ren'Py 6.99.12.4.2187
Doki Doki Literature Club! 1.1.1

これを開いた時マジで「えっ…」ていいましたよえぇ

トレースバックを呼んでホラー的な意味で肝を冷やしたのは人生で初めての体験でした。あとこのゲームはなんかぼくが知ってるゲームとはケタ違いにヤバイんだと思わされました。こわい。

コマンドがすべて実際に通用するコマンド

モニカがキャラクターファイルやイメージを消去したときのログウィンドウ。なんと打ち込まれていたか覚えていますか?

os.remove("characters/yuri.chr")

このコードは実際に実行することが出来ます。というのもDDLCはPythonをベースにしたゲームエンジン Ren’Py で書かれており、Ren’Pyは任意のPythonコードを実行できるように設計されているからです。そしてこれはPythonで実行できるコードと同じです。

あ、そうそう、さっきのトレースバックも書式がPythonのものと同じです。作り込みがすごい。

例のためにダミーの sayori.chr というファイルをご用意しました。

まず、Pythonの対話コンソールを開き、osモジュールをインポートします。osモジュールとは雑多なオペレーティングシステムインタフェース(原文ママ)でPythonの標準ライブラリです。これをインポートすることでOS関連の操作、例えばファイルの削除などを実行させることができるようになります。ここにモジュールのドキュメントがあります。

osモジュールにはファイルを削除する remove関数 が用意されています。引数に削除するファイルへの相対、もしくは絶対パスを渡すことでファイルの削除を試みます。上の画像ではsayori.chrが削除されていることが前後のdirコマンドの出力でおわかりいただけるでしょう。プレイヤーもモニカと同じ手段で彼女を葬ることができるというわけですね。 

ちなみにosモジュールには現在ログイン中のユーザー名を調べる関数も存在します。getlogin関数 です。きっとモニカはこれを利用してプレイヤーの、本当の名前を調べたのでしょう。(getpass.getuser()かもしれないというつっこみは野暮)

いやぁ、作り込まれてるなぁとただ感嘆するばかりでした。

当然のようにファイルに改変を加えたり追加したり削除してそれを見せつけに来る

いやこれ普通に忘れてましたけど、ゲームのウィンドウの外でさあ見ろと言わんばかりにファイルが動きを見せるのってすごくないですか?少なくともぼくはやべえって思います。すげえ新鮮でした。

プレイヤーにディレクトリを開かせ、そこでも恐怖を覚えさせる。ゲームウィンドウの外側でプレイヤーに対し感情を抱かせるっていうのが聞いたこと無いこと過ぎてすごいですよね(語彙力がなくゲームの経験もないオタク)

これはmonika.chrを削除したあと、モニカが自分の存在をなかったことにした上でリセットした時に裏で動かしていたディレクトリ監視ソフトウェアのログです。ちょうど11:47:56にnatsuki.chr、yuri.chr、sayori.chrが作成されています。11:44:27の削除ログはぼくの手によるものです。

※11:45:12の新規はぼくが「ワンチャンこれファイル戻せば別のアクションが見れるのでは」とバックアップファイルから戻したログです。ちなみに効果はなかったので13秒後に削除しました。

ちゃんとゲームの進行にあわせてファイルに動きがあっています。すごい。次やるときはこれを常時監視させて動きをリアルタイムで追いたいと思います。

追記:ゲーム開始前にmonika.chrを削除した場合のファイルの挙動

新規プレイ時にmonika.chrを削除した状態でニューゲームすると強制的にバッドエンドに入ると聞いたので早速試します。

firstrunを削除の上DDLCの画面からセーブデータをクリアしたあと、Pythonのコンソールで os.remove(“characters/monika.chr”) を実行、ニューゲームをクリックします。

削除 (2018/04/22 16:21:19): C:\Program Files (x86)\Steam\steamapps\common\Doki Doki Literature Club\characters\monika.chr

サヨリが止めさせてと言ってゲームが強制終了した瞬間、ログはこうなりました。

削除 (2018/04/22 16:25:04): C:\Program Files (x86)\Steam\steamapps\common\Doki Doki Literature Club\characters\sayori.chr
削除 (2018/04/22 16:25:04): C:\Program Files (x86)\Steam\steamapps\common\Doki Doki Literature Club\characters\natsuki.chr
削除 (2018/04/22 16:25:04): C:\Program Files (x86)\Steam\steamapps\common\Doki Doki Literature Club\characters\yuri.chr
変更 (2018/04/22 16:25:04): C:\Program Files (x86)\Steam\steamapps\common\Doki Doki Literature Club\log.txt

そしてもう一度起動するとバッドエンドです。こんなところにも

おわり

とりあえず今回このくらい。

気が向いたらこれに追記したり別にDDLCについて書くかもしれない

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です