2013年12月30日月曜日

C++11 と obj-c

別に obj-c を使ってるわけでもなんでもないのですけど、前回の記事で cocoa のコードをつらつら書いてるときに”拡張子を .mm にして clang に食わすとその中身は C++ と obj-c が混在しまくってても OK"というのを知りました。
オブジェクトの互換性はなく、 obj-c のクラスを C++ で継承したりその逆はできないみたいですが、それ以外のことは一通りできており、 C++ で設計、記述したクラスに実に自然に mac の GUI を被せることができて結構感動したものです。
もうこれでくだらない glue を沢山書かなくていいんだ!

それはそれで大変素晴らしいことなのですが、それでは C++11 ではどうなのかというところが気になりました。
気になる事は試してみましょう。

まず、 clang で C++11 を有効にするには -std=c++11 をつけてコンパイルします。
更に、 C++11 の新しい標準ライブラリを使うには -stdlib=libc++ をつけます。
libstdc++ とかではありません。

cmake でいうとこうです。
   set(CMAKE_CXX_FLAGS "-std=c++11 -stdlib=libc++")
ただ一つ問題があります。
cmake の project に .m が混在しているとこれはエラーになってしまいます。
.mm だけならば問題ありません。 project を別けるかしましょう。
無論、自分で makefile を書くならば suffix ルールを別けるだけで済みます。
まぁ、全部 .mm にしちゃいましょう。

これで準備は完了です。
界面に関わらないことであれば、概ね C++11 の機能が使えるようです。

クロージャ

C++ のコンテキストでクロージャを呼び出すことは難なくできました。
これを obj-c のメソッドに渡すことを考えてみましょう。
Test::foobar というクロージャを受け取って呼び出す obj-c のクラスを考えます。

Test* test = [Test alloc];
const char* msg = "Hello";
[test foobar:[msg](){printf ("%s\n", msg);}];
太字がクロージャであります。
Test の実装はこんな感じ。
@interface Test : NSObject
@end

@implementation Test
- (void) foobar:(std::function< void(void) >)closure
{
  printf("call begin\n");
  closure();
  printf("call end\n");
}
@end
結果は以下の通り。

call begin
Hello
call end
問題なく受け渡すことができました。

__attribute__

クロージャが使えるならかなり色々なことができそうです。
界面に関わるうち、構文上どうにもならなそうなもの以外(例えば obj-c メソッドのシグネチャでrvalue 制約や型推論を使う等)は一通り使えそうです。

構文上厳しそうなものといえば [[]] による __attribute__ です。
GNU 拡張の __attribute__ ディレクティブを、 clang は理解しますが、折角仕様に盛り込まれたのだからそっちを使ったほうがいいです(もっとも、 no_inline だけは効いてくれたことがないですが)。
でもこいつは [] で括る obj-c の文法と相性が悪そうです。
    float vec4 [[align(4)]] [1];
    float vec8 [[align(8)]] [1];
    float vec16 [[align(16)]] [1];
    printf("vec4:%p vec8:%p vec16:%p\n", vec4, vec8, vec16);
一応コンパイルは通りました。ですが実行結果は以下の通り。
vec4:0x7fff5fbfee78 vec8:0x7fff5fbfee74 vec16:0x7fff5fbfee70
手元の clang では残念ながら [[align(x)]] 自体が動いていないようです。
gcc-4.9 では大丈夫だったように思うのですが。

まぁ、使えるんじゃないですかね?(鼻をほじりながら)

2013年12月27日金曜日

cmake で Mac のアプリケーションをビルド

働きたくないでござる!
絶対に IDE で働きたくないでござる!!

……というわけで、 mac 用のアプリも CUI ベースで開発してビルドも make で行いたいというような話です。
マルチプラットフォームでビルドしたいので cmake を使います。

mac のバイナリ(?)である bundle は、要するに何の変哲もないディレクトリで中身にお作法があります。
ここにはアプリケーションの実行形式とアプリケーションの MANIFEST である InfoList.plist 、そしてメインウインドウを記述する .nib ファイルが最低限必要です。
それ以外にも、必要に応じて so や、リソースファイルなどが必要になるでしょう。

こうしたものは Xcode を使えば特に気にすることもなく出来てしまうのですが、そもそも Xcode 使いたくないじゃん?というようなところに動機があります。

Linux や cygwin にも対応できるよう、 gnu make をベースにビルドすることを考えます。
makefile を最初から書く覚悟のある人は、バンドルの規則に従ってターゲット書けばいいだけの話ですのでそうしてもらうとして、ここでは cmake を使って makefile や好みにあわせて .xproj なども作れるようにしておきましょう。

CMakeLists.txt を書く

framework の追加

まずは framework を追加しましょう。ぶっちゃけ GUI でチマチマ追加するより簡単ですよ。

cmake_minimum_required(VERSION 2.8)
project(cocoa.app)

if (APPLE)
   add_executable(cocoa MACOSX_BUNDLE main.mm app.mm)
   include_directories ( /System/Library )
   find_library(COCOA_LIBRARY Cocoa)
   find_library(APPKIT_LIBRARY AppKit)
   find_library(APP_SERVICES_LIBRARY ApplicationServices )
   mark_as_advanced (COCOA_LIBRARY
                     APPKIT_LIBRARY
                     APP_SERVICES_LIBRARY)
   set(EXTRA_LIBS ${COCOA_LIBRARY} ${APPKIT_LIBRARY} ${APP_SERVICES_LIBRARY})
   target_link_libraries(cocoa ${EXTRA_LIBS})
endif (APPLE)

小文字は cmake の組み込み関数やディレクティブです。
この場合は project として cocoa.app というバンドル名を指定します。この CMakeLists.txt のルートですので、この場合はバンドル名とするのが自然と思います。さて、これは実行形式の名前とは無関係です。

実行形式は通常 project 名とは無関係で、任意の名前です。(一つのバンドルに複数の実行形式があってかまわないので)
実行形式は、ターゲットとして、  add_executable() で宣言されます。
これは極めて重要な指定で、これを行った以降でないと設定できない属性が沢山あります。実際は依存関係を記述する都合上、後方に書かれることが多いですが、ここでは解りやすさのためには真っ先に書いています。
ここでは特に、 MACOSX_BUNDLE としていることに注意してください。

mac 用の環境を切り離すのには if (APPLE) を使います。
find_library() で framework を探し、 mark_as_advanced() に設定します。
そのリストを target_link_libraries() で(上で宣言した)実行形式にリンクしましょう。
find_library() で指定するのは /System/Library/Frameworks/ 以下にある *.framework のワイルドカードにマッチする名前です。
さてここまでは簡単です。次にバンドルに突っ込むリソース類のレシピを記述します。

InfoList.plist の追加

バンドルに絶対欠かせないものの一つに InfoList.plist があります。こいつはいわゆる MANIFEST です。
バンドルは shell でさっくり実行形式をロードするのとは異なり、 Mac のシステムサービスを経由して実行されるので、これの記述は重要です。

絶対に欠かせないものは
  • 実行形式の場所
  • nib の名前
  • NSPrincipal クラスの名前
です。これがないとバンドルはシステムのロンチサービスに蹴られてエラーになります。
他にも固有識別子やバンドル自体の名前など、重要そうなものがあります。

これらは基本的には cmake 固有の変数に値を設定することで勝手に InfoList.plist が作られるのですが、なぜか nib と NSPrincipal クラスの名前だけ、 cmake 固有の変数がありません。
従ってそのままだとバンドルができても、ロンチサービスに蹴られてしまいます。ありがちですね。
すぐ思いつく対策は、あらかじめ作り込んだ InfoList.plist を用意しておいてビルドのポストコマンドでコピーすることですが、それだとカスタマイズ性がよくありません。

そこでカスタム用の変数を宣言しましょう。カスタム変数は要するに cmake の置換文字列機能です。この場合は、 MACOSX_BUNDLE_INFO_PLIST プロパティを使って、ベースとなる InfoList.plist のテンプレートを指定し、 その中身を任意の変数で置換すればよいわけです。
set_target_properties(cocoa PROPERTIES MACOSX_BUNDLE_INFO_PLIST Info-CMake.plist)
まず一点。プロパティは変数とは違います。変数がプロセッシングの過程で置換されるだけのものだとしたら、プロパティは cmake の振る舞いを変えることができます。
cmake --help-property-list で一覧を見て、 cmake --help-property でその意味を調べられます。 MACOSX で grep すると以下のようになりました。

MACOSX_BUNDLE
MACOSX_BUNDLE_INFO_PLIST
MACOSX_FRAMEWORK_INFO_PLIST
MACOSX_PACKAGE_LOCATION

困ったときに役立つと思いますので、頭に入れておきましょう。

もう一つ気をつけなければならないのは、 自分のテンプレートを指定したらもう cmake 固有のテンプレートはもう使われないというところです。
なのでどこから適当に拾ってきた InfoList.plist からテンプレートを作ると、ここで使わなかった置換変数は使われなくなります。これではカスタマイズ性が下がります。

ここでは cmake が持っているテンプレートを参考にしたほうがよいでしょう。
cmake のテンプレートは、

/Applications/CMake\ 2.8-12.app/Contents//share/cmake-2.8/Templates/AppleInfo.plist

などにあると思います。
これを使うと以下のような plist が出来上がります。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>CFBundleDevelopmentRegion</key>
        <string>English</string>
        <key>CFBundleExecutable</key>
        <string>${MACOSX_BUNDLE_EXECUTABLE}</string>
        <key>CFBundleGetInfoString</key>
        <string>${MACOSX_BUNDLE_INFO_STRING}</string>
        <key>CFBundleIconFile</key>
        <string>${MACOSX_BUNDLE_ICON}</string>
        <key>CFBundleIdentifier</key>
        <string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</string>
        <key>CFBundleLongVersionString</key>
        <string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string>
        <key>CFBundleName</key>
        <string>${MACOSX_BUNDLE_NAME}</string>
        <key>CFBundlePackageType</key>
        <string>APPL</string>
        <key>CFBundleShortVersionString</key>
        <string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
        <key>CFBundleSignature</key>
        <string>????</string>
        <key>CFBundleVersion</key>
        <string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
        <key>CSResourcesFileMapped</key>
        <true/>
        <key>LSRequiresCarbon</key>
        <true/>
        <key>NSHumanReadableCopyright</key>
        <string>${MACOSX_BUNDLE_COPYRIGHT}</string>
        <key>NSMainNibFile</key>
        <string>${MACOSX_BUNDLE_NSMAIN_NIB_FILE}</string>
        <key>NSPrincipalClass</key>
        <string>${MACOSX_BUNDLE_NSPRINCIPAL_CLASS}</string>
</dict>
</plist>
せっかく DTD がありますので、必須の要素がどれかなどは DTD か Apple のドキュメントを参照してください。
しかしながら、一点問題があります。
CFBundleExecutable の値を、デフォルトの cmake のテンプレートはターゲット名から自動で埋めてくれるのですが、カスタムテンプレートを使うとどうもその機能が動かなくなってしまいます。従って、 MACOS_BUNDLE_EXECUTABLE は明示的に指定するようにしましょう。(なくっても、バンドル名が 実行形式名.app なら勝手にそれを実行してくれるようですが)  
   set(MACOSX_BUNDLE_EXECUTABLE "cocoa")
   set(MACOSX_BUNDLE_INFO_STRING "${PROJECT_NAME}")
   set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.example")
   set(MACOSX_BUNDLE_LONG_VERSION_STRING "${PROJECT_NAME} Version ${VERSION}")
   set(MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME})
   set(MACOSX_BUNDLE_SHORT_VERSION_STRING ${VERSION})
   set(MACOSX_BUNDLE_BUNDLE_VERSION ${VERSION})
   set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2013.")
   set(MACOSX_BUNDLE_NSMAIN_NIB_FILE "MainMenu")
   set(MACOSX_BUNDLE_NSPRINCIPAL_CLASS "NSApplication")
   set_target_properties(cocoa PROPERTIES MACOSX_BUNDLE_INFO_PLIST Info-CMake.plist)
まとめるとこんな感じでしょうか。
InfoList.plist については以上です。

.nib などのリソース類

最後にして大物です。
リソースは bundle.app/Contents/Resources 以下にある雑多なものですが、 .nib のようにウインドウシステムレベルで重要なものも含まれます。
雑多なリソースは依存を書いておけば勝手にコピーされますが、 nib に関してはそうはいきません。 .xib から .nib へのコンパイルなどはカスタムコマンドを定義してビルドのポストフェイズに走らせる必要があります。

これについては以下のようにするのがよいようです。

   set(XIB MainMenu)
   set_source_files_properties(
       ${MACOSX_RESOURCE_FILES}
       # 任意のリソース群 (.nib は除く)
       PROPERTIES
       MACOSX_PACKAGE_LOCATION Resources)

   find_program(IBTOOL ibtool HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin")

   add_custom_command (TARGET cocoa PRE_BUILD
       COMMAND mkdir -p ${PROJECT_NAME}/Contents/Resources)
   add_custom_command (TARGET cocoa POST_BUILD
           COMMAND ${IBTOOL} --errors --warnings --notices --output-format human-readable-text
           --compile ${PROJECT_NAME}/Contents/Resources/${XIB}.nib
           ${XIB}.xib
           COMMENT "Compiling ${XIB}.xib -> ${MODULE}/Contents/Resources/${XIB}.nib")
新たな変数が登場していますが、全部デフォルトでよいです。
基本は set_source_files_properties() でリソースファイルの MACOSX_PACKAGE_LOCATION を指定してやることと、 ibtool を探してビルドのポストフェイズに明示的にコンパイルするようにしてやることです。
.xib はこの場合一つですが、複数ある場合は foreach でリスト要素ごとに add_custom_command() でポストフェイズのコマンドを追加してやる必要があります。

パスを自分で指定しなおしてやったりと少々冗長なところもありますが汎用の関数だし、これでいいのです。

重要じゃありませんが、 find_program() も find_library() と同様よくつかう関数です。

さて、問題はどうやって .xib を用意するか、です。
XML エディタで作ってもいいですが、なんせ結構煩雑ですし、ドキュメントも DTD すらもありません。
ノードを削っていって最小限の .xib を作るというのも面白いところですが、結構でかいファイルですんでここは Xcode 様にご登場願いましょう。
一個作って使い回しましょう。直したいところだけ XML エディタで直しゃーいいじゃないですか。
ibtool は結構便利なプロセッサですが、真面目に UI を作ろうと思ったらどうしたって Interface Builder を使うことになりますから。

ではそういったところでお疲れさん。

2013年12月25日水曜日

XBA ハイブリッド

メリークリスマス!
プレゼントにいいイヤフォンを探して試聴してきたのでメモ。

XBA のハイブリッド型を見て来ました。

XBA-H1:

ダイナミックとフルレンジ BA のハイブリッド。
音が籠るけれど、全体的に自然で、低音が効きすぎるとも金物がうるさいとも思わず、値段とのバランスもとてもいいと思いました。
17000 円くらい。


XBA-H2:

音の籠もりがブーストされた感。
正直言って 25000 円もするイヤフォンとは思えないです。9000 円くらいでもっといいのあると思います。
中音重視で選んだので、まぁ中音は癖もなくよく聞こえるかなと思ったんですけど、聞く曲によっては 1500 円のイヤフォンと違わないんじゃないかこれ。
XBA-H3:

ダイナミックと BA 2 ドライバらしいです。……それにしてはデカイ。
音の籠もりはやや軽減され、バランスはこの中では一番いいです。
でも中音がやや痩せたような部分も気になりました。総合して 32000 円も取るような品質か?
自分で使うならギリギリこれだけど、別に面白くもないし、 XBA-40 のほうが全然好き。
ドライバが重過ぎるのも、人に使わせるものとしては使用シーンを限定しすぎていてちょっと難しい。
でもケーブルにウレタンが入っていて耳にかけられるようになっているのはちょっといい。

お勧めは XBA-1H です。
以前の XBA シリーズがどれも尖ってる印象ですが、かなり丸くなった感じですね。値段とのバランスも優れていると思います。
ドライバも小さくてとても軽い。
特にロックばっかり聞いているとかじゃないなら、オールマイティに使える良いイヤフィンだと思います。

2013年11月11日月曜日

Rocksmith2014

Rocksmith 2014。
Rocksmith の待望の続編でございます。
本ゲームは市販のエレキギターを専用のシールドで PS3 などに接続してゲームに使います。

そんなのゲームになるのかよ……。

前作をプレイするまではそう思ってました。
倍音の多い弦楽器に置いて、弦の音をちゃんと分離して判定するのは難しい。勿論ポジションが合ってなくても音的に合ってればよかろうなのですが、それだって簡単じゃなかったのです。
ましてギターのテクニックにはミュートといった、波形的にはノイズに近くて判定しずらいものもありますから。

まぁそれでもチャレンジ精神は買わないとということで北米版を輸入してやってみたら、これがゲームになる。しかも面白い。
アンプシミュレータも搭載し、エフェクターなどもデザインできます。これがまた高性能です。

リアルギターを使うデメリットとしては、ギターが必要でチューニングしないといけないというのはありますが、これは仕方が無いです。
かなりバグってる感じがありますが、一応チューナーも入ってます。

続編が出たということで、これは買うしかありません。

どういうゲームかは、こればっかりは説明しずらいしスクリーンショット撮ってもどうしようもないので動画を撮ってみました。前作の曲を久々に2曲プレイしてみましたが……かなり失敗してますが……いや、というかダラダラ中継って言う割には二曲だけなんですよね。誰かが間違って紛れ込んでくる前にご飯食べに行きたかったんですよ。ごめんなさい。
PS Eye のマイクからの入力を拾えなくって、 Mac の内蔵マイクになってしまったようで音量がかなり小さいのでご注意ください。



メニューの曲選択に中割りがないのは動画が悪いからではなく、こういうものです。
HDMI で直接テレビから出しており、ディレイがあるせいか気持ち早めに弾かないと合わない感じありますが、前作もそうでした。
(Rocksmith 推奨は HDMI と avmulti ケーブルを併用し、音声を別にアナログで出力する低遅延環境です)

こんなに難しいのかよとビビる人もいるでしょうが、これはプレイヤーの練度に合わせて勝手に難易度が変わるシステムのためで、ゲーム開始時はもっと全然らくちんなアレンジで始まります。
何度もやれば勝手に難易度が上がっていきますが、予期せぬ上がり方をされると「あっ、あっ」ってなります。逆に言うと自分で設定できないということでもあります。
国産の音ゲーとはだいぶ発想が異なりますね。

でもってそのアレンジこそが重要で、簡単過ぎると弾いてるって感じがしない。難し過ぎると心が折れるし指が痛くなる。
今作 Rocksmith 2014 のアレンジはイマイチのよーな気がしてですね……。好みの問題でしょうけど曲も前作のほうが良かったと思う。
前作のセーブデータがあれば 1200 円でディスクインポートパックを買って前作の曲を今作でも遊べます。前作の DLC は無料で引き継げます。
前作を北米版でしか遊んでいない僕でも一応できました。(最初上手くいかなくて、前作のセーブデータのタイムスタンプを一度更新させてからストアでディスクインポートパックをダウンロードしなおして遊べるようにしました)

ちなみに、前作はサクセスモードといいますか、セットリストを構成してライブを行い、成功すると生活が良くなってゆくモードがありました。
煩わしいと思うかもしれませんが——これってあまり好きじゃない曲やアレンジが好きになれない曲でもこなしているうちに好きになれるというモードでもありました。
ライブは三曲連続(スコアが一定以上ならアンコールもあり)で失敗できないということで、簡単なアレンジでも緊張感がありました。

そんなサクセスモードは今作ではなくなってしまいました。これってかなりの改悪のような気がするんですけども……。
今作では新たにセッションモードができました。
これは他のバンドメンバーのリズムや指定のスケールに合わせて適当に弾くだけで勝手に盛り上がったり盛り下がってくれるというモードです。
ちょっとやってみたけどいまいち……よく解らない。もうちょっとやってみないと解らないですかねえ。

そして一番肝心な今回の収録曲ですが——うーん、アレンジも含めて今のところいまいち好きになれない。
いやー多分好きになる動機がないということなのかな。サクセスモードがなくなっちゃったことで。
原曲に近づくのはいいことだと思うのですが、 Hotei (布袋寅泰)の Thrill (エガちゃんのテーマ呼ばわりされている曲)とか延々と F5 のバッキングを座って弾くのはつらいです。しんどいです。
今回の日本語版では、 B'z の Ultra soul が収録されていることは話題ですが、 Hotei 曲は全部 DLC であります。音ゲーというやつは曲のライセンス料がすんごいしんどくて、あれだけ爆売れした Rockband シリーズでさえライセンス料が嵩んだことで台所は火の車、遂にはシリーズを継続できなくなりました。(北米の事情で、日本はどうか知らないけど)
ですので音ゲーに関しては、 DLC にしないといけないという事情も鑑みて温かく接してあげましょう。

各曲のチューニングも複雑になりました。曲毎に微妙なチューニングを要求されることはありますが、今作では頻度が上がり、それも少し高めとか少し低めとか全フラットとかでチューニングする必要があります。
チューニングというのは、弦の伸縮で音が狂うのを補正する作業であります。しかしながらテクニックとして変則的なチューニングをしておく場合があります。解放弦の音を6 弦(ギターを構えたときに一番上の弦)から順に EGBDAE と鳴る場合を "E スタンダード" と呼ぶとしましょう。これが普通です。
例えば 6 弦(一番太い弦)を D にして DGBDAE とか。これを "D ドロップ" と呼び、特定のキーの曲を弾くのを楽にしてくれます。

チューナーがまともならそれも気にならないのですが、今回チューナーの出来がどうも謎で、どう考えても合ってるのに合ってないと判定されて再度チューニングさせられ、その結果がどうもおかしいと思いつつもプレイが始まってミスを連発するというような事故です。
それと、あまりヘタった弦(古くなって音の伸びが悪くなってるような場合)のことを考慮しておらず、ロングトーンを正しく維持できないとチューニングが合っているとは判定されません。チューニングが合ってないとプレイを開始できないため、延々とチューニングを続けるということもありました。(張り替えろって話ですが)

そういうわけでチューナーはなるべく早く直してくれ、弦は張り替えてくれということで。

個人的には前作のほうが好きなので、まず前作をプレイしてから今作を買うかどうか決めてもいいんじゃないかと思います。
付属のリアルトーンケーブルは使い回しできますよ。



2013年11月3日日曜日

Grand Theft Auto V(5)

今回もまた写真一枚ありゃしないエントリです。想像力を盛ってどうぞ。
スクリーンショット撮る機能はあるんで外に出せればいいのに……。
[Rockstar Social Club のアカウントとってゲーム内で撮れるフォト機能使って取り出しました。なんかゲームで見るより解像度低いし暗いのであんまり好きじゃないですが]

GTA シリーズは 3 からずっとやってますが、 今作 5 は最高傑作です。
案外、コンスタントに評価を伸ばして行くって難しいんですよ。実際 4 は進化したものの、色々な点でイマイチでした。
4 ではグラフィックスは(今からみるとひどく見劣りするものの)それまでよりは大幅にグレードアップしましたが操作感が前作までと変わらず、結局ゲーム性についてきてませんでした。特に新たに採用されたカバーアクションはアイスケースに飛び込んで写真を撮って twitter にポストするくらいかったるくて間抜けな自殺行為でありました。

5 ではこれまでの独特ののっぺりとした操作感を残しつつ、ストレスにならない程度まで改善が図られている感じがします。カバーアクションもかなり良くなりました。

今作では主人公は複数おり、任意のタイミングでザッピングしてそれぞれのストーリーを楽しむことができます。

ゲーム開始直後くらいは、正直言って、「ずいぶん真面目なゲームになっちゃったなぁ〜」と感じました。
昔はもっと、どちらかというとバカゲーに分類されるようなところが多かったのに一ヶ月で 8 億ドル稼ぐタイトルになるとこんなに真面目になっちゃうのかーというところです。
  • 主人公が真面目
  • ストーリーが深いっぽい
  • 車がすぐ爆発しない
  • 頭を撃っても頭から上が吹き飛んだりしない
  • AI がアホみたいに攻撃的じゃない
  • 街にならずものが溢れ、手の施しようがないほど抗争状態になったりしない
  • 追跡してきたパトカーが勝手に海に飛び込んで手配ランクが天井知らずに上がったりしない
(頭が吹き飛ぶのは 3 だけだったような気がしますが)
これまでの主人公ときたら独りもんか母親と同居、従兄弟くらいしか知り合いがいない密入国者と、過去も現在も未来もないような、良く言えば比較的身軽な立場の若者でした。
でも今作はまず一家の大黒柱。しかも腕利きの強盗だったのに仲間を裏切った後ろ暗い過去があるらしく、回想パートからドラマティックにタイトルに繋がります。
最初の主人公マイクは家族に問題を抱え、本人もキレやすい性格を矯正するためカウンセリング中だけど、豪邸に住み、金持ち。趣味はテニス。そしてゴルフ。

もう一人の主人公はギャングの手先として使われてる青年。学もないし貧乏で仕事も怪しいですが、根が真面目で向上心があり、環境が良ければずっとまっとうな人生を送っていそうな若者です。

暗殺ミッションをこなせば貧乏青年もバインウッドの映画スターの豪邸に住める!
プールとジャグジーを備えた豪邸で犬も飼えます
もう映画的ですよね。かなり真面目です。
妄想ミッションもありません。あるけど虐殺するのは宇宙人です。車も爆発しません。過剰に攻撃的な人物なんか周囲におりません。
……ですけどそんなのは最初だけでした。

ご安心あれ。
かつての強盗仲間トレバーの登場とともに物語は一変します。
こいつというのが、ダークナイトのジョーカーを彷彿とさせるようなサイコパス野郎でとにかく攻撃的。異常。
物語上、最初の主人公マイクが家族に「サイコパス!」となじられることがよくありますが、トレバーに比べたらマイクなんか全然真人間ですよ。
お楽しみください。大変なやつですから。その大変なやつはラスボスではなく、プレイヤーが操作する主人公なのです。
突然妄想ミッションも大復活。飛行機にも乗れるし部下もダーウィン賞級の馬鹿ばかり。
すげえ。これは歴代シリーズでも随一だぜ。

バインウッドから見るトスサントス中心部
あとは皆さん一番気にしているであろう、街のことです。
街はサンアンドレアスのほどちかくに浮かぶ島です。
南北に長く、グアムほどもある大きさでしょうか。南にあるロスサントスは西海岸っぽいのに、更に縦横無尽に高速道路が貫く風光明媚で退廃的な大都市。北部はアラモ海という巨大な湖を抱くブレイン郡です。
海に囲まれ、山地や高地に恵まれ、セスナでの飛行やパラグライダー、ツーリングやジェットスキー、果てはなんと素潜りして海底まで楽しめてしまいます。
巨大な工業港、鉄道駅、高層ビル群、山には天文台や採石所とランドマークも実に変化に富んでいます。

ロスサントスから山と砂漠のブレイン群へ
街は複雑で高密度でして、全体のマップはそうとう広いですから今作は道路地図を頭に入れるのを諦めてしまっています。
何せ立体交差が多いので、地図を見ても上手く走るのは難しい。あちこちにカーペイントショップはあるのですが、すんなり入れるようになるにはかなり下調べが必要ですね。
高速道路から空港へ。特徴的なランドマークが幾つも見えます。

そしてこの最高のエンターテインメントにはオンラインプレイもあります。
日本ではまだオフラインのみでして、 11/7 からスタート予定となっております。でも 4 のオンラインは既に最高に楽しかったですからね。オフィシャルに対人戦が実装されたのは PSP 版の GTA Vice City Stories からだったように記憶していますが、車や街を自由に使ったデスマッチができてとても楽しかったですけども、 4 では広大な街を自由に使えるようになり、車ばかりかヘリコプターなども使えるようになりました。
ゲーム性も殺伐としたデスマッチからフリーダムな散策と幅が広がり、ヘリでビルの屋上へ行ってスカイダイビング(パラシュートなし)に挑むなど。

それからあと一つだけ、今作の特徴的なゲーム性についてご紹介しておきましょう。
新要素は結構沢山ありますが、今作はなんたって主人公のうち二人が銀行強盗です。
銀行強盗とは銀行を襲って金品を巻き上げるお仕事ですが、僕らの常識で判断する限りその成功率は 10% 未満——よっぽどの後進国でない限り、首尾よく逃げたところでほぼ必ず足がつく、失敗する犯罪の代名詞であります。
にも関わらず銀行強盗で財を成すとか、職業として成立させるとか、映画の中だけの話ですけれども、まぁこれはゲームです。
これはゲームですが、彼らはプロらしく手際もよく頭脳派で、しかも慎重であります。さすがに銀行よりは遥かに手薄そうなターゲットが中心となります(銀行よりもヤバそうな場合もありますが)。
本作での強盗は偵察・計画・準備・実行・反省のサイクルで成り立っており、プレイヤーは強盗案件をコーディネートしてうまく行くようにする必要があります。
偵察して、侵入経路、金目のもの、セキュリティの手厚さ、逃走経路などを調べ上げ、計画では大胆な作戦と安全な作戦の二つの作戦から、ひとつの方針を選びます
作戦が決まったら必要な道具(多くは特殊な車や特殊な武器など)を揃え、必要な人材を選びます
下線を引いたところが実行前にプレイヤーが実際に行うことです。
強盗に必要な人材は、警察を攻撃するガンマン、一定時間セキュリティを無効化させるハッカー、車を運転するドライバーです。それぞれの技術は必要な分け前に比例して熟練しています。例えば 30 秒しかセキュリティを無効化できないハッカーでも、繰り返し依頼していると実力が上がっていきます。成長しても要求する分け前は増えません。なんと義理堅い世界でしょう。
(それ以外にも、ミッションで出会うキャラクターのうち何名かは強盗ミッションで使うこともできますよ)
いざ強盗を実行するときは普通のミッションと同じです。違いは逃走経路が決められていること、難易度や実入りが選んだメンバーによって左右されるところでしょうか。
襲撃が終わって首尾よく逃げ切ったら反省しましょう。
反省は別にシステムには含まれていないので、仲間の愚痴を聞きながらプレイヤーが勝手に反省すればよいです。

さぁ、いかがでしょうか。
遊び方は自由です。真面目にミッションをこなすのもよし、ただただ観光するもよし、犯罪者を捕まえるのも犯罪者になるも自由。犯罪もパパラッチから重武装した強盗犯まで幅が広いです。
ロスサントスでの生活を楽しみましょう。

2013年10月28日月曜日

Beyond:Two Souls

個人的に PS3 世代最後の華と思っていた BEYOND: Two Souls 、クリアしましたのでご紹介。
 BEYOND: Two Souls はいかにも地雷っぽいタイトルですが、 HEAVY RAIN をプレイした人には鮮烈に焼き付いているであろうデベロッパ Quantic Dream の新作です。
耳馴染みの薄いデベロッパって人も多いでしょうが、高密度なポリ人形に人間らしい魂を吹き込むことに関しては Insomniac も Guerrilla Games も、 Naughty Dog さえも凌ぐ技術を持っています。
緻密で、強烈な説得力のあるグラフィックスで語られる物語、それが本作の魅力です。
列車からの逃走、そして森を逃げ惑うシーンはもの凄いですよ。
列車といえば UNCHARTED2 の列車の上で戦うシーンも、ゲーム史に残る屈指の名シーンでしたが、本作のそれはまた違った鬼気迫るものがあります。
特にプレイヤーと主人公たちを結びつけるその特徴的なインターフェイスと、ストーリーについてお伝えしたい。



HEAVY RAIN とはストーリーに一切関連がないものの、ゲームシステムはよく似た特徴的なものです。
全く同じではなく、部分的にはシェイプアップされ、部分的には複雑化しております。
システムはまず誤解を恐れずにいうと QTE です。「(Q)急に(T)タイムギャルみたいになって(E)エッてなる」アレです。

QTE なんて嫌だ

QTE といや God of War やバイオハザード4-6 で悪名高いあのシステムです。
企画屋がやりたがる「僕の考えた最高のシステム」としてプレイヤーには散々嫌がられる QTE ですけども、 Quantic Dream が完成させた一貫性のある QTE はそれほど反射神経を求めず、失敗がなく、充分対話的なものです。

一例を挙げるなら、 QTE が文脈を無視して唐突に始まり四角ボタンの連打といった、これまた意味の分からない入力を強制されるものならば、 Quantic Dream のそれは「左手ならば L1, 右手ならば R1」と対応がある程度決められており、タイミングは概ねシビアではありません。
HEAVY RAIN においては、「朝目覚めてベッドから出て洗面所に行き、歯を磨く」といった一連の動作を、この QTE を用いて行うことで、プレイヤーは主人公の操り方を学びます。学ぶといっても記憶する必要はなく、なんとなく一体感を得るわけです。

更に、 BEYOND においては QTE 以外の操作、自由な操作によるストーリーへの介入が強化され、ほぼいつでも自由な移動を行い、シーンによっては乗り物を操縦することもできます。
HEAVY RAIN でも自由な操作ができるシーンは多かったのですが、今作は文字通り飛躍的です。霊体を操ってシーンを飛び回れるのですから。


霊体?

本作の特徴は、超能力を持った少女ジョディ(主人公)に取り憑いた、二つ目の魂(仮にエイデンと呼ばれている)を操ってストーリーに介入できることです。
エイデンは敵と見做した人物を直接殺害できます。利用価値のある人物はオレンジ色に見え、自由に操ることができます。
更に残留思念の読み取り、回復、オブジェクトの破壊、操作など。
霊体ですので、あまりジョディから離れることはできませんが、あらゆる障害物を通り抜けることができます。
非力なジョディに代わり、エイデンを使って障害物を取り除いてあげましょう。

ちなみにエイデンを操作する場合、 QTE は発生しません。自由移動のみです。


物語

HEAVY RAIN は誘拐された実の子供を助けるという、解りやすい目的を解りやすく(概ね)時系列でプレイするゲームでしたが、今回は海外ドラマ的にエピソディックな感じになっています。 LOST なんかを思い出すと似た雰囲気があるのではないでしょうか。
主人公ジョディの半生を幼少期から青年期(?)までが必要に応じて断片的に呈示されます。
サスペンスよりもアクション、ホラーや青春の断片であったりします。

いつからかエイデンという正体不明の霊体を宿した少女ジョディは、両親とも引き離され DPA という国防の観点から超能力を研究する研究所で実験を繰り返しています。
プレイヤーはゲームを開始してすぐ、超能力とはエイデンが起こしている現象だと理解できるでしょう。だってプレイヤーが実際に操作してそれを起こすんですから。

エイデンの神秘性は早々に失われてしまうわけですが、話のメインはそっちじゃありません。
もちろんエイデンという存在が示唆する"インフラワールド"(霊体の住む、いわゆる死後の世界)と、そこへのアクセスというのはストーリーのメインラインとして存在しますが、ジョディは無関心です。周りのキャラクターがインフラワールドに夢中だから何かと因縁はでてくるのですけど。

なので、ストーリーは飽くまでジョディという女性の人生を、その挫折や苦悩、時には自分のために死体の山を築いて語られます。
TLOUS のように強固に個人的な物語を体験したあとでは少々発散して見えるかもしれません。なにせグレたと思ったら CIA に就職したり逃走して皆殺しして自分探しの旅を始めたりとハチャメチャ人生ですからね。

そして何より重要なことは、解りやすいゲームオーバーがないということです。
何かに失敗しても、 ゲームオーバーですといわれてやり直すということが、このゲームでは(HEAVY RAIN もそうでしたが)ありません。失敗しても失敗したなりにストーリーは続いてゆきます。
だからもう否が応でも必死にならざるを得ません。


不満なところ

オートセーブなのはいいけど、止め時がみつかりません。
それからオマケでついてくるスマホモード。これはスマホと接続するとスマホに面白いインタラクトがあるものかと思っていたんですけど……どうやらスマホをコントローラとして使うモードでした。
簡単操作がウリらしいのですけど、さっぱり意味がわかりませんでした。
一番最初の ESP 実験で、透視するどころか椅子に座る事すらできない始末。即刻止めました。

物語中、時折現れるインフラワールドから来るモンスター。
最初のうちはいいんですけど、こいつらがあんまりバリエーションがないし、説得力もいまひとつ……という感じですね。

グラフィックスは凄くいいけどフィジックスはあまり良くない。
別に気になるほどじゃないけど……たまに特に乗り物に乗ったときに顕著ですね。
エイデンの力で重そうなものでも軽々と吹き飛ばすのは楽しいのですけど、小さいモノがあんまり派手に壊れないと「アレ?」となっちゃいますね。


2013年9月18日水曜日

Papers, Please

Steam でリリースされたインディ作品、 "Papers, Please" です。

海外のゲーム動画で見て惚れました。
Glory to Arstotzka!
先に言っておきますが、このゲームは、暗いです。
今まで僕がやってきたどんなゲームよりも暗いです。

このゲームでプレイヤーは Arstotzka の入国審査官となり、入国者を ACCEPT (入国許可)/ DENIED(不許可) にわけてゆきます。
なぜこんなに殺伐としているのかというと、独立したばかりの仮想の共産国 Arstotzka と敵対する共産国 Kolechina の国境が舞台だからです。
プレイヤーにしたって、夢と希望をもって入国審査官になったわけではないですからね。
10月の労働者抽選で選ばれ、家族を村から連れてきて養っているだけです。希望なんかほんの僅かもありゃしない。

ざっと流れを見てみましょう。
これがゲーム画面——入国希望者の運命を左右し、様々なドラマが生まれるあなたのブースです。

赤字は筆者が書き足しました

暗い!!

画面上がブースの外の様子、左がブースの全貌、右があなたのデスクです。
ゲームが進むとショートカットも使えるようになりますが、最初はマウスのクリックとドラッグのみです。

旅行者は左側に書類を出してきますので、デスクにドラッグ&ドロップして書類を検分しましょう。

先にクリアのためにとても重要な、ブースの情報を整理しておきましょう。
左から、カレンダーと時計、指示や手配書をまとめた手紙、オーディオトランススクリプト、ルールブック、体重計です。
非常に見えづらいですか、旅行者の後ろ側に書いてある縞は身長の指標です。
オーディオトランススクリプトとは、相手の喋ったことをテキストに落としたもので、たいへん便利です。
最初の数日、もっぱら使うのは時計とルールブックでしょうね。

右下の Inspector と書いてあるのはプレイヤーを助けてくれる調査機能で、具体的な使い方は後ほど。

シャッターはブースのシャッターで、朝一番に開けるところから始まります。
シャッターの上にあるスピーカーは超重要で、高圧的に次の客を呼ぶのに使います。これ押さないと仕事になりません。

NEXT!


日本のパスポートは超強力ですので、友好的な関係にある国に出入りするのに他の書類出したりしません。ですがここはアレ。アレな国とアレな国の国境。
ゲームが進むと、この入国ゲートはテロリスト、密入国者の脅威に晒されます。
毎日必要な書類が増えていくでしょう。

最も基本となるのはパスポートです。パスポートの情報と他の情報に矛盾がないか、有効期限を調べるのが基本です。
つまり、氏名、性別、パスポート番号、写真、発行都市(ISS)、有効期限です。

上のスクリーンショットはもうだいぶ複雑な状況です。
入国者から、入国許可証、ID付帯情報、が提出されましたが肝心のパスポートが出てません。
ルールブックを出して、最初の項目 "入国者はパスポートを所持すること" を参照しましょう。
右下の Inspector を押して有効化し、指摘すべき項目を順にクリックします。
この場合は、ルールブックの最初の項目とテーブルの上をクリックし、パスポートが不足していることを示します。
(スクリーンショットはまさにその瞬間であります)
その後、オーディオトランススクリプトがある Interrogate を使って尋問します。

「ああ、パスポートね。これだよ」なんて言いながらパスポートが出てきました。
氏名、性別、体型、特徴、パスポート発行都市、パスポート番号、全ての書類の有効期限……書類上は問題なさそうです。
更に指名手配書とオーディオトランススクリプトを調べて、 入国目的と期間が入国許可証とズレていなければ、 ACCEPT のスタンプを押して入国許可をしても大丈夫そうです。
スタンプを押したら書類を全て返却して見送りましょう。
Glory to Arstotzka!!

もし人相が写真と合わない場合、氏名が異なる場合、性別が異なる場合は inspector を使って指摘し、更に指紋を取ったりスキャンなどをします。
危険物を持っている場合は、 Inspector でルールブックの「武器、麻薬の持ち込みを禁ず」を参照して指摘してください。
逮捕権が与えられたら、その場で逮捕することもできます。


さて、これはかなり簡単な例。
Arstotzka のパスポートを持つ者は付帯書類がずっと少なくてよいです。
初日は Arstotzka 国民なら全員受け入れてよく、それ以外のパスポートは全部拒否してよいです。
その後、 Arstotzka 国民はパスポートと ID が必要になります。
この場合は ID とパスポートの対照は問題ありませんが、パスポートの有効期限が切れています。
Inspector を起動して、有効期限とカレンダーを対照しましょう。これを指摘すると相手は「時間がなかった」など言い訳しますが、聞く耳持つことはありません。
ぱぱっとリジェクトして次の人を呼びましょう。

NEXT!

有効な期間を示す日付は、一番基本的な有効期限である Expire と、示された日付から有効な "Valid on" と示された日まで有効な "Date by" などがあるので注意しましょう。

でも本当に辛いのは生活


このゲームが暗いのは雰囲気が陰々滅々としていて仕事が単調で、呪われろ!とか呪詛の言葉を浴びせられるからだけではありません。
一日10人処理しても$50くらいにしかならない、その超低賃金とクソ高い物価にあります。
Arstotzka では毎日 $25 のアパートの料金と $15 の燃料費がかかります。そうでなければ家族は凍え、弱い者から病気になってしまいます。
テロが発生すると半ドンなので5-6人の処理で大赤字です。

初めのうちこそ、誤って正しい書類をリジェクトしてしまってもペナルティにはなりません。
ですがすぐ厳格さが求められるようになり、間違って密入国者を通してしまっても、正当な入国者を拒んでしまっても給料を引かれるようになります。
最初の二回は警告、そして次からは -$5 のペナルティ。
家賃が払えなくなれば即クビであります。
そうなる前に家族は凍え、飢え、病み、妹は窃盗で捕まり姪が宿無しに……。

このゲームには冗長な説明とかはありません。
一日のリザルトに表示される短いテキストと、翌朝の新聞が基本です。
翌朝の新聞を見ると、昨日通した不法入国者が殺人で捕まったり死んでいたりします。
周辺国との関係も悪くなる一方。

そんなプレイヤーにとってほんの僅かな希望は、たまに持ちかけられる賄賂です。
守衛が持ちかけて来る、一人逮捕するとボーナスくれる話はとにかく美味しい。期限切れや入国理由があやふやなだけでは逮捕できないから、パスポート偽造してる奴や危険物隠している奴を見つけると嬉しくなりますよ。

そして怪しい反政府組織 EZIC がプレイヤーに接触し、巨額賄賂を受け取るよう迫ります。
賄賂の見返りは彼らへの協力。敵対組織の構成員をみつけて入国拒否したり、不法入国の手助けをしたり、さらには——。
もちろん、頑に賄賂を断ることもできると思います。エンディングは20種類。