読者です 読者をやめる 読者になる 読者になる

PS4「うたわれるもの 偽りの仮面」アクアプラス

ゲーム

うたわれるもの 偽りの仮面 (通常版)

アクアプラス20周年記念タイトルの「うたわれるもの 偽りの仮面」をクリアしたので、ざっと感想メモでも。

前作の「うたわれるもの」が2002年ですから、13年ぶりの続編ということになります。事前情報はテレビCMのPVくらいの状態だったのですが、始めた当初は、前作キャラが出てこない上に、ハクオロさんと比べものにならない軽薄な主人公で、これは外れかなぁ、としょんぼりしてプレイしておりました。しかし、クリアした今、振り返ると、まさに十数年の時を越えた正統続編。これぞ「うたわれるもの」でした。

正直なところ、「俺たちの戦いはこれからだ」的なところで終わるため、完結主義者の方にはおすすめできませんが、ボリュームは十分ですし、ストーリー的にも中途半端感は全くないです。満足度はとても高し。続編はよ。

ゲームシステムとしては、前作同様、ADV+シミュレーションゲームで、途中で単調にならないようにミニエピソードは選択式で表示されますが、結局は全部見ることになりますので、実質一本道です。行動選択もありません。

以下、もう少し踏み込んだ感想を(ネタバレ有り)。

続きを読む

逆転裁判シリーズの近作のスクリプトシステムの講演

CEDEC2015で「逆転裁判のスクリプトシステムによる実演を交えた3Dアドベンチャーの作り方」というセッションがありました。こちら、ワークフローもよく分かる素晴らしい講演でした。ニコニコ生放送での中継があり、プレミアム会員なら9月下旬までタイムシフトで閲覧できますので、ADVのシステムに興味のある方なら、ぜひ直接ご覧いただきたい。

講演内容は以下のようなメディアの記事にもなっています。

www.famitsu.com www.gamer.ne.jp

ポイントは、結局アドベンチャーゲームのスクリプトも統合開発環境的なサポートがあった方がよく、それを Excel のマクロを用いることで実現した、というところかと思います。コマンドに応じて引数をドロップダウンで選べたり、エディタ上でエラー検出をしたり。

また、途中実行時の状態を安定させるための様々なノウハウが本当に興味深かったです。 毎シーンの最後にその時の立ち絵の状態やカメラなどのグローバル状態を宣言的に書いておくことで、それが通常実行時には assert となり、途中から再開したときは、設定データとなるというのは、元自動検証屋としては何かもう一段抽象化できそうな匂いを感じてワクワクしましたw また、シーンの頭で自動的に呼ばれる共通スクリプトがあり、そこで現在のシーンに応じて所持アイテムなどのフラグを毎回再設定しているという話も面白いですね。アイテムは主人公がもっているもの、という発想ではなく、あるシーンに紐付いた小道具である、という意識の持ち方なのでしょう。デバッグはやりやすそうです。

セッションの最後の質疑応答の時間に質問した人たちの質問がいずれも聞きたいことを的確に突いていたのが面白かったです。実務者の集まりであるCEDECならでは。 コマンドをメッセージに直接埋め込めるのは、せっかくの Excel サポートが使えなくなる苦肉の策と感じましたし、ローカライズもどうするんだろうと思っていました。が、質疑でばっちり聞いてくれて、それに対してローカライズ向けに各言語のメッセージに埋め込まれたコマンドが一致しているかのチェックを走らせることが出来ると聞いたときに、その発想はなかった感が新鮮でした。

やっぱり分岐が弱いのは気になりますが、まぁ、逆転裁判自体、あんまり分岐を楽しませたいゲームではない、ということなのでしょうね。

ともあれ、Excel 最強神話がまたひとつ。本当は自動補完やエラーチェック付きの IDE として実装するのが一番筋がいいはずとは思うのですけどね……。

Win「Analogue: A Hate Story」Christine Love

ゲーム

playism.jp

欧米のインディのビジュアルノベルとして時々噂を聞いていた Christine Love の「Analogue: A Hate Story」の日本語版があることを知り、PLAYISM から購入してプレイしてみました。

テーマとしては李氏朝鮮時代のような男性優位の社会に生きる女性を描いたものなのですが、舞台を宇宙船にし、物語る手段を、AIのサポートを受けながらメインコンピュータに遺された過去のログを読んでいく、という設定にしたことで、非常に独特なプレイ感が得られています。

カナダ人の女性制作者が韓国文化圏を舞台に作ったゲームではありますが、キャラクターデザインは日本のビジュアルノベルとの親和性が高く感じます。AIとの対話もその文脈で違和感はそれほど無いはずですので、日本のADVファンにも取っつきやすいはず。ログを読んでいくという体裁上、直線的に遊んでいけないため、決して遊びやすいとは言えないのですが、見たことがない ADV の構成に興味のある方には、ぜひプレイしていただきたい一品です。

少しずつ開いていく記録ファイル+コンソールでのコマンド直接入力というスタイルは、もっと磨けばさらに面白い方向性が生まれそうですが、これだけを単体コンテンツにするのはやはりインディゲームサイズが丁度よく、これ以上大きくするのはハードル高そうですね。

同じようにコマンドラインでコマンドを入力しながら遊ぶものの、こちらはパソコン通信時代が舞台となる旧作「Digital: A Love Story」も日本語版が進行していそうな噂ですので、そちらも楽しみです。

以下、完全ネタバレのプレイ後メモ。

続きを読む

finkからHomebrewへ

プログラミング

Mac で非標準なコマンドをインストールするときに、これまでは fink を使っていたのですが、Homebrew cask が使いたくなって、brew に転向することにしました。

fink のアンインストールは /sw を消せばよいだけでお手軽だったのですが、brew doctor してみたら、誰がインストールしたか不明な /usr/local/bin/node があって困ったりと、いろいろありました……。

(該当しそうな node-*.pkg がディスク上に残っていたので、それを再インストールして /var/db/receipts/org.nodejs.pkg.bom の情報を使って削除)

ようやく brew doctor がクリーンになったので、早速 brew install ricty しようとおもったら、pango のインストールでドはまったり。

最終的には brew install --universal gobject-introspection を事前にしておくことで解決したのですが、一体何が機嫌を損ねた原因だったのか、未だに分かっておりません。

こういうトラブルに遭いたくないので、メジャーな環境とメジャーなパッケージマネージャーを使いたいのに、早まったでしょうか……。

Emacs も brew から入れてみました。 brew install --with-cocoa --japanese emacs Emacs にはパッチ盛りだくさんの Emacs Mac Port バージョンもあって、 brew install railwaycat/emacsmacport/emacs-mac で入れることもできます。違いは http://www.sevencredit.com/2014/07/02/580/ が分かりやすいかと。

IntelliJ で Emacs 互換の ctrl-r の挙動

プログラミング

ようやく悩んでいた挙動を解決できた感動で久しぶりに記事を書いちゃいました。

JetBrains IntelliJ は、有料ですが、活発に機能追加が行われている素晴らしいエディタです。Sublime Text が流行って、猫も杓子も Goto Anything な昨今、Search Everywhere という同様の機能をきちんと標準でサポートしてくれていますし、その実装も気持ちよく使えるものになっています。最近では Multiple Cursor に対応したりもしました。

なにより、昔はエディタはカスタマイズしまくってこそ、と思っていた私も、最近は、出来るだけ標準で済ませたいという気持ちになってきておりまして、できれば VisualStudio で済ませたいが、Mac じゃ使えないし、そもそも .NET 以外のウェブアプリを VS で開発するわけにもいかないし、と思ったときに、VisualStudio の Mac 版あるいは LL 版みたいな存在が IntelliJ というわけです。

なお、IntelliJ はそもそも Java の開発環境ではありますが、全部入りの IntelliJ を買えば、Ruby や Python や JavaScript などのサポート機能は Plugin として無償で追加できます。 (この Plugin が実はときどきバージョン追従が怪しかったりして、完全に何も考えずに全部入りにならないのが微妙な悩みなのですが、今回の話題とは関係ないので割愛します) ちなみに、Ruby と JavaScript と HTML にしか興味なければ RubyMine というサブセット版が安く売っていたりもします。一般的には PHP + JS の PhpStorm が人気商品なのかもしれません。

で、ようやく本題です。この IntelliJ、デフォルトで Emacs のキーバインディングも入っており、これに切り替えるとほぼOKなのですが、挙動が近しいだけに、かえって微妙な差異に困ったりします。 例えば、ごく一部のダイアログだけキーバインドの変更がきいておらず、Ctrl+G で閉じられなかったりとか。このあたりはまぁ、Esc をたたき直せばいいので、まだ我慢できます。(ちなみに、Search Everywhere の窓が Esc でも閉じない件は、Keymap で Escape を Esc に割り当て直せば閉じました。バグではないかと)

ただ、どうしても誤操作し続けていたものとして、Ctrl+R に関して、Emacs の isearch-backward を使用としたときの挙動の違いがあります。IntelliJ デフォルトの Emacs バインディングでは Ctrl+R は Find Previous / Move to Previous Occurrence に割当たっています。しかし、求める動作はこれではないのです。Ctrl+R を押すと、最初の1回は検索語を聞いてきて、その時に何も入力せずに Ctrl+R をもう一度押すと、直前の検索語でもう一度前方検索できる、という挙動を期待しています。Ctrl+S ではそうなっているので、Ctrl+R でもそうならないかとずっと思っていたのですが、ようやく方法が分かりました。

参考: Customizing IntelliJ for Emacs Compatibility

Ctrl+R を Find... にも追加で割り当てれば良かったのです。ショートカットがダブっているよ、って警告でますが、無視します。これで、Find のダイアログが開いていないときに Ctrl+R を押すとダイアログが開き、そのまま Ctrl+R を押し続けると前の出現を検索する、という挙動が実現できました!

なお、Emacs では incremental 検索からその場で抜けるときは Enter を押しますが、IntelliJ では Esc か Ctrl+G で抜ける必要がありますので、そこは慣れてください。

Ctrl+R 押して検索語入力したつもりがエディタ内で破壊的な編集を行ってしまうという事故を何度か起こしていましたが、これからは快適に使えそうです。

や、標準で満足したいなら、エディタの標準キーバインドになれろって話ではありますが、色々染みついてしまったものもございまして……。

その他の設定変更
  • Editor > General > Editor Tabs > Mark modified tabs with asterisk 編集したファイルのタブにアスタリスクっぽいマークを付ける

アドベンチャーゲームを語る夕べ

ゲームシナリオ

表題のトークショーに参加してきました。 リアル脱出ゲームの加藤隆生さんと、428やタイムトラベラーズのイシイジロウさんが、Zork から 428、そしてこれからのアドベンチャーゲームを語る、というイベントでした。

とても面白かったです。2時間では全然足りず、あと3倍くらいは欲しいですね。

内容は以下にまとめています。

アドベンチャーゲームについて語る夕べ まとめ - Togetterまとめ

加藤さんが、レイトンを楽しく遊びつつも、アドベンチャーゲームとして評価して良いのか悩む話など、たいへん興味深かったです。加藤さんはわりと物語と障害をぱっきり割っても気にしないタイプの方かと思っていましたが、そうではないのですね。

そのあたりについて過去のリアル脱出ゲームや渋谷迷宮殺人事件なども踏まえてどういう考えで作られているか、もっとお話を聞いてみたかったです。

また、アドベンチャーゲームを作りたいが、どうすれば採算が取れる広がりを作れるのか分からない、という私と同じ問題意識を抱えていらっしゃるような気がして、とても共感しながら加藤さんの質問を聞いていました。

次回があることに期待ですね!

Rubyで日本の休日一覧

プログラミング

急に、日本の休日の一覧を取得したくなりました。 幸いなことに、Ruby には 2050 年までの日本の祝日(予定)一覧が取れる holiday_jp という Gem がありますので、有難く使わせていただきます。

> gem install holiday_jp

こちらには日曜日は入っていませんので、あとは日曜の確認を追加するだけ。 2013年の休日一覧はこちらとなります。

require 'rubygems'
require 'holiday_jp'

Date.new(2013, 1, 1).upto(Date.new(2013, 12, 31)) {|day|
  if day.wday == 0 or HolidayJp.holiday?(day)
    puts day.to_s
  end
}