【SEGA MEGA-CD版】 シャドウラン レビュー③

うひょ〜、アサシン クリード リベレーションが発売されたぜぇ〜。
だのに、私というもののメガCDにて発売された「最強最後のMEGA-CD RPG シャドウラン*1のレビュー記事なんて書いております。
なんの拷問なんでしょうか。
 
さて、今回でこのレビュー記事もラストとなります。
元気にやっていきたいと思いますので、最後までお楽しみいただければと思います。
 
 
○システム
最後の最後にきてようやく本作のシステムにメスを入れていきたいと思います。
 
1.RPG?Not RPG!This is SaikyouSaigo-No-RPG
最初から太字で書いて参りましたが、このゲームは「最強最後のMEGA-CD RPGです。*2
 

 
ただのテキストアドベンチャーとか言わない。
第1回でも書きましたが、基本的な情報収集はこのようにアドベンチャー形式で進行します。
と言っても、ドアを開けたらナイフが飛んできてゲームオーバー*3とか、ヤスが犯人だったり*4とか、せっかくだから赤の扉を選ぶぜ*5とかそんなトンチキな事件は発生しませんので、ご安心くださいね。
しかし、このスタイルは取りにようによっては非常にRPGらしいスタイルではないでしょうか?
と言いますのも、基本となったTRPGを表現する上でこうしたテキストアドベンチャー形式は非常にマッチしていると個人的には思うからです。
ある意味ドラクエスタイルなトップビューを外すことでどこにもないRPGを提唱し、かつアナログゲームらしさを前面に押し出すことに成功している好例と言えるのではないでしょうか?
また、第1回でも述べた通りシナリオが非常に素晴らしい。
これを堪能するにはやはりこの形式が良かったのではないかと推測します。
ええ,言い過ぎですね。
 
2.お買い物
上記のようなスタイルで進行する以上、本作においてレベルなんて概念はありません。
 
「やった!これでレベル上げから解放される!」
 
などと思った諸氏。
いささか待たれよ。
本作では「レベルアップしない=強くならない」というロジックを持っているのです。
では、どのようにキャラクターは強くなっていくのでしょうか?
答えは簡単です。
強くなりたければ強い武器や魔法、サイバーウェアを買えばいいのです!
 
武器屋(トリプルZ)

 
魔法屋(十日堂)

 
闇医者(エンジェルクリニック)

 
すごくシャドウランらしくて個人的には非常に好感が持てます。*6
しかし、そうなると強化するために幾ばくかの金銭が必要になります。
 
「ええ!じゃあ、結局お金稼ぎしなきゃいけないじゃん!」
 
大丈夫です。
本作では、依頼人からしか報酬を受け取れないシステムになっています。
そして、本作にはフリーミッションなどという小洒落たシステムは存在しません。
勘の良い方はお気づきになられていると思いますが、本作では「俺TUEEEEEE!」できません。
ですので、限られた資源で最良のセットを組み上げるという遊び方を強要されます。
 
3.ステータス
キャラクターのステータスは、基本的にシャドウランTRPGに準じたものになっておりますが、不要なスキルは削られています。
 

 
不要なスキルは削られているはずなんですけど、削られていないスキルもほとんど利用しません。
本作で利用するスキルは、〈素手戦闘〉、〈武器戦闘〉、〈小火器〉、〈重火器〉、〈魔術〉の5種類です。
その他にも何やら書かれていますが、全てダミーです。
反面、優れていると感じたのは、サイバーウェア周りでしょうか?
原作ではサイバーウェアごとに設定されたエッセンス消費量をエッセンスから差し引き、キャラクターのエッセンスが0未満にならないように調整すると言うシステムでしたが、今作では全キャラクターに6スロットのサイバーウェアスロットがあります。
 

 
理論的にはスロットの限界である6個まで自由にサイバーウェアを移植することができます。*7
ただし、シャーマンであるマオタソはサイバーウェアを移植できません。
上図は誰のサイバーウェアかわかりますか?(初期サイバーウェアを表示)*8
 
4.戦闘
さて、ここまでテキストアドベンチャー形式で進んできましたが、戦闘だけはグリッドマップ戦闘になります。
さすが「最きょ(ry*9
 

 
こんな感じでの戦闘画面になります。
原作で煩雑であった修正値計算はすべてコンピュータがやってくれます。
ので、プレイヤーは口を開けてぼんやりしていても戦闘はできます。
が、本作の戦闘はサイコロふって、目標値以上が何個出たかを評価するシステムです。
キャラクターの能力はこのサイコロの数が増えるかどうかにしか寄与しません。
目標値は行動の内容*10によってのみ決まるので、具体的な戦闘イメージを持つ方*11以外は、全く楽しめない仕様になってます。
 
また、本作ではチームのメンバーが全て戦闘不能になった場合、ゲームオーバーとなります。
反面、一人でも生き残った状態で勝利すれば、自動的に戦闘不能になったメンバーが復活します。
蘇生パッチで。
 

 
誰であっても蘇生パッチで無理やり復活です。
しかも、100%復活します。*12
原作を知る者にとっては、こうポンポン復活されるとなんだか複雑な気持ちになります。
 
5.呪文
戦闘では呪文を唱えることもできます。
と言っても、マオタソと一部NPCくらいしか呪文を行使することはできません。
まぁ、ぶっちゃけシステム的には、呪文くらいしか魔法使いらしいことしません。
アストラル投射とか、精霊召喚とかできません。
別にそんなことできなくともいいのですよ!
我らがマオタソには、可愛らしいヒロイン像を演じていただければいいのです!
呪文なんて飾りです!*13
とまぁ、そんな魔法使いの見せ場である呪文詠唱ですがとにかく地味です。
 
マオタソ「マナッボルトォォー」

 
マオタソ「パァワァァッボルトォォー」

 
 
色変わっただけかよ!
  
いやいやいや、ちゃんと効果も違うので安心して下さいね♪
まぁ、こんな感じで地味なんですけど、この2つの呪文はまだマシです。
地味だってダメージが通るんですから。。。
 
今、「ん?」と思った方がいらっしゃったと思います。
えーそーです。
このゲームには、バグがあります。
ひとまず次の呪文を御覧ください。
 
マオタソ「いくわよ!スリープ!」

 

 

 

 
 
 
えーと、一応解説しておきますね。
本作では、どんなに高い達成値を叩き出しても、範囲呪文は必ず外れます。
 
「そんなアホな〜」
 
と思われるでしょう。
私も自分が悪いと思って、様々な範囲呪文で何度も試してみました。
でもね、何度やっても成功数は0なんです。
もうバグとしか言いようがない。
でもまぁ、単体呪文はキチンとダメージ通るし、そもそも呪文で一発逆転無理なんでいいんです。
むしろマオタソが失敗する様を想像して、楽しもうじゃありませんか!*14
 
6.武器
さて、呪文では残念な気持ちになりましたが、やはり主力となるのは火器類に違いありません。*15
スキルに〈手投げ武器〉やら〈射出武器〉やら散見されましたが、
 
 
このゲームにそんな物は登場しません。
 
 
それはともかくとして、本作では小火器から重火器までと様々な武器が登場しますが、基本的に重たい方が攻撃力も高く設計されています。
反面、反動が大きくて命中しにくくなっています。
が、そんなことはどうでもヨロシ。
やはり、リプレイファンとしてはキャラクターたちが使っていた武器を持たせたいじゃないですか。
そんな訳でここではライトマシンガンであるイングラム・バリアントとアサルトライフルのAK-98を取り上げてみます。
 
イングラム・バリアント
イングラム・バリアントと言えば紫雲。
紫雲と言えばグラサンイングラム・バリアント。
それほどに彼を象徴する火器の一つといえるでしょう。
もちろん今作でも登場しますよ!
 

 
あれ?
 
 

 
 
(つд⊂)ゴシゴシ
 
 
 
 
 
 
 

 
 
 
 
 
 
(;゚ Д゚) …?!
 
な、なんじゃこりゃ〜!!!
 
せ、せ、せ、セミ・オートてぇ!*16
ダメージ上がらねぇよ!
8Mのライトマシンガンとかいらねぇよ。
それなのにも関わらず、ガスベンドとか標準装備ってアホなの?バカなの?
これでライトマシンガンとかヘソで茶が沸くよ!
 
…ま、まぁ、ゲームバランスを考慮してこうなったんでしょうね。
それじゃなかったら納得できねぇよ。
 
AK-98
リプレイで六堂がビルに陣取る相手に対してグレネード・ランチャーを打ち込むシーンがあるのですが、あれは爽快でしたね。
あの時使っていたのがAK-97だったか、AK-98だったのか、忘れてしまいましたが、今作ではグレネード・ランチャーが装備されているのがAK-98しかなかったので、これを六堂のそっくりさん*17に使ってもらいましょう。
 
グレネード・ランチャーで一網打尽だ!

 
武器を変更してと。

 
あれ?どうやって使うのかな?

 
えーと、えーと…

 
 
 
ターン!!!

 

 

 
 
 
 
 
 
 
 
 
オイイイイ!コンパイルゥ!!
 
ターン!!!じゃねぇよ!
 
グレネード・ランチャー使えなかったら、こんなもんちょっと射程の長いヘビー・ピストルじゃねぇか!
どうやらコンパイルは、私達に範囲攻撃とかさせる気がないらしいです。
させる気がないなら最初から盛り込もうとかしないで欲しい。
というか、なぜテストの段階で誰も気づかなかったんだ。。。
 
 
○総括
あーだこーだと書きましたが、ローディングの長さ*18隠し味程度のバグが気にならなければ、よくできたゲームであると思います。
メガCDにしてはマトリクスとか頑張ってるしね。
ただここまでじっくりと取り組んできて、ふとあの名文句を思い出している自分がいました。
 
油断するな。
 
迷わず撃て。
 
弾を切らすな。
 
ドラゴンに手を出すな。
       ───ストリートの警句
 
 
 
メガCDにも手を出すべきじゃなかったのかも知れません。
 

*1:これが正式タイトルです。

*2:くどい。

*3:ミシシッピー殺人事件」

*4:ポートピア連続殺人事件

*5:デスクリムゾン」つか、アドベンチャーですらねぇし。

*6:まぁ、1時間後には逆にイライラの原因になりますが。

*7:現実ではお金の問題にぶち当たるのですが。

*8:正解は紫雲。ただのオッサンに成り下がったようだ。

*9:もういい。

*10:「歩いた」とか「視界が悪い」とか

*11:つまり、TRPG

*12:判定不要。

*13:偉い人にはそれがわからんのです

*14:注:私は正常です。

*15:本作では、「Samurai Catalog」所蔵の火器も登場しますよ。

*16:原作では、バーストファイア/フルオート

*17:前回参照。

*18:ここだけの話、私は30分でぶち切れてチョメチョメしたが。

【SEGA MEGA-CD版】 シャドウラン レビュー②

前回は全体の概要とシナリオに関してご紹介致しましたが、今回は登場するキャラクターたちにスポットを当ててみたいと思います。
 
 
○キャラクター
やはりリプレイファンならば誰しもキャラクターたちに思い入れがあるかと思います。
まぁ、賛否両論あるかと思いますが、もう10年以上も前のことですし、肩の力を抜いて楽しんでいただければ幸いです。
 
紫雲
PC1枠の六堂からといきたいところですが、主人公っぽくトリでも務めていただくとして、ここは影が薄い脇を支える紫雲から紹介していくことにしましょう。
 

 
紫雲は元アズテクノロジー社保安部に勤めていた工作員です。
今作でもアズテクノロジーとの関係や彼自身の過去について触れられています。
全国でもそれほど多くない紫雲萌えの皆様には、うれしい内容となっているのではないでしょうか?
では、ゲームでの紫雲はどんな感じで表現されているかといいますと。
 

 
まぁ、許容範囲。
リプレイシリーズから2年経過しているので、若干髪の毛が後退したと捉えておきましょう。
それにいつまでもミラーシェードとかアレなんでグラサンに変えたのではないでしょうか。
今作の紫雲は何かといえば警察に頼りたがる傾向にあるので、少し影の世界に疲れたのかも知れません。
あるいは、護るべき存在でもできたのでしょうか?
 
Dヘッド
出ました。
リストラエルフの登場です。
 

 
SR2のルールではマトリクスルールがその他のルールと切り離されていたので、扱いにくいという理由だったのかどうか不明ですが、リストラの憂き目にあったかわいそうなエルフ。
異種族差別運動とかに参加していないことを祈っていたのですが、どうやらそんなことはなかったようです。
が、
 

 
Dヘッドがグレたー!
なんか髪染めてるんですけど。
つーか、眉毛だけは黒くして一体なんのつもりなんでしょうか。
え〜、今作ではマトリクスもキチンと表現されているので、活躍の機会はあります!
また、戦闘シーンでは肉の壁としてダメージディーラーの弾避けとして涙ぐましい活躍もしてくれます。
しかし、そんな涙ぐましい努力があっても、事あるごとに「シアトルに帰りたくなったか?」とか言われる始末。
シナリオに対するインセンティブがめっさ低く設定されてるのがしのびない。
そんな彼ですが自らを奮い立たせ、「乗りかかった船です。最期まで見届けたいです」とか言って着いてきてくれます。
彼の活躍を是非とも目の当たりにしていただきたいです。
もちろんハンカチ持参で。
 
マオ
さて、大分エスプリの利いた改変がここから大きくなっていきますよ。
次は、マオです。
 

 
猫のストリート・シャーマンであり、情に厚い性格の持ち主。
今作でもその力は十分に再現されており、チームの駆動力として八面六臂の活躍をしてくれます。
もちろん大して強力でもない様々な呪文も扱うことができますし、今作ではキーとなるグレートスピリットとの邂逅なんかも果たしたりします。
まぁ、ぶっちゃけヒロイン枠ですね。
殺ちゃんがスタメンとして登場しない以上、頑張ってくれてます。
彼女はどんな感じに変わっているのでしょうか?
 

 
ポニテキター!!!*1
そうですか。
ポニーテールですか。
コンパイル*2スタッフが送る渾身のヒロイン像がこれか。。。*3
 
 
…いいじゃないか。
マオ、、、いや、マオタソ最高じゃないか。
むしろ、2年経ってむしろ若くなってるし。
お目々がクリっとして、これがまた可愛らしい事この上ないですなぁ、部長。
また、渾身さをアッピールするためかドジっ子な一面も見せてくれたりしますよ。
 

 
これは壁を乗り越えようとしてちょっとした失敗をしちゃうシーンですね。
SR4で言えばグリッチしたけど成功しましたという感じでしょうか。*4
ちなみに、マオタソはキャラクター画像がもう一枚あります。
 

 
これはいたいけな研究員を騙す時の格好になります。
しかし、バンダナて、、、いいじゃないか。
むしろ、騙されたいじゃないか。
マオタソに関しては良くなってるんじゃないかな。
 

SR2の日本語展開においてこの娘を外すわけには参りません!
天真爛漫、純真無垢、ちょっとだけ腕っ節の強い*5おにゃにょこ。
フィジカル・アデプトの殺ちゃんがきましたよっと。
当時の大きなお友達をガツンとシャドウランに引っ張ってきてくれた世紀末ヒロインですよ!
 

 
その人気っぷりは凄まじいものがあり、彼女を主人公にした小説が出るくらいでした。*6
リプレイシリーズのあとチームを離れていたようで、*7今作では最後の方から登場します。
また、選択によってはプレイヤーキャラクターとして操作できないこともあるというレアキャラです。
彼女はどんな風に変わったのでしょうか?
 

 
…あ〜、うん。
2年後だもんね。
リプレイシリーズでは16歳だもんね。
うん、成長したんだよね。
決してコンパイルスタッフにハマらなかったわけじゃないよね。
その他のキャラクターが、髪が後退してたり、染めてたり、ポニテになったりするくらいだもの。
このくらい大したことではないですよ。
 
六堂
いよいよラストです。
PC1枠は変わらず、ストリート・サムライの六堂です。
 

 
今作でもその戦闘能力の高さは変わらず、並みいる敵をバッタバッタとなぎ倒してくれます。
頼れるアニキですね。
さてさて、2年後の彼はどんな風に変わったのでしょうか?
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
ズギャァーン!
 
だ、誰だこいつ!!!
 
…落ち着け。*8
もう一度“本物の”六堂を確認するんだ。
 

 

 
そう!これだ!
俺たちが知っている六堂はこれだ!
石神カムロ*9みたいなヤツが六堂だ。
士貴智志さんが描く主人公のみが許される髪型をしてるヤツが六堂だ。
 
 
 
 
 
 
 
 
 
 
 
 
 

 
このバンダナ野郎は誰だ!
 
90年代を代表するオタクファッションのこいつは誰なんだ!
 
本物の六堂を出せ!
 
ま、まぁ2年も経てばバンダナの1つも巻くよね。
前向きに考えようじゃないか。
しかし、こんなものは序の口でした。
 

 
は、半袖短パンだとぅ!
 
こいつバカなのか!*10
例えば、登山に行くのに革靴履いて行かないだろ?
にも関わらず、この六堂らしき人物は3段飛ばしくらいで明後日の方向に進化してんじゃねぇか。
 
影の仕事を舐めるな、小僧。
説明書にも謎の半袖短パン小僧が登場していたが、まさかアレを六堂と呼ぶ日が来るとは。。。
 

 
ちなみに、ゲーム中でもこの小僧は大分病んでいて、同じ相手に対して口の利き方が大分違ったりします。
 
使用前:

 
使用後:

 
そんなところでエッセンス*11の低さを表現しなくていいんですよ?コンパイルさん。
 
 
キャラクター紹介は以上となります。*12
とりあえず、皆様にご理解いただきたいことは、2年って歳月は結構変われるんだなということです。
そして、今作のチームは紫雲、Dヘッド、マオタソ、ときどき殺ということですね。
え?六堂?六堂は今回お休みじゃないんですか?
まぁ、数合わせのストリート・ギャングなら混じってますけど。
 

シャドウラン 4th Edition (Role&Roll RPGシリーズ)

シャドウラン 4th Edition (Role&Roll RPGシリーズ)

*1:筆者は決してポニテ萌えではないのであしからず。

*2:「最強最後のMEGA-CD RPG」を作った偉大な会社。代表作に「魔導物語」がある偉大な会社。「ぷよぷよ」でアホみたいに儲けた偉大な会社。

*3:コンパイルは「アルル=ナジャ」とかぶっ飛んだヒロインに定評がある。

*4:現にSR4のルールブックには同様のシーンが例として登場します。べんきょうになるなぁ=

*5:素手で殺人ができる程度。

*6:図は小説のジャケットから抜粋したものです。

*7:なにかドロドロした展開があったのでしょう。

*8:素数を数えるんだ。1、、、1は素数じゃねぇ!

*9:士貴智志さんの神・風に登場する準主人公。

*10:このシーンはボスを倒しに行く際にヘリに乗るところ。

*11:人間性

*12:全く紹介する気ないですけど。

【SEGA MEGA-CD版】 シャドウラン レビュー①

2011年の運命の日(12月24日)が近づいてくるこの頃、いかがお過ごしでしょうか?
 
「え?クリスマスイブ?今年なんかあるの?」
 
などと思われた方もいらっしゃるかと思います。
以下の記事内容は、基本的にそうした方々を余裕でぶっちぎる内容となっておりますので、ご容赦のほどお願いいたします。*1
 
 
今からおよそ20年ほど前のことです。
アメリカのアナログゲームレーベル「FASAコーポレーション」が、世に偉大なる作品を発表しました。
そう。ご存知の通りShadowrun 1st Edition」です。

この作品は方々で人気を勝ち得、コンピュータゲームとしても様々なハードに進出いたしました。
スーパーファミコンXBOX360、そして今回レビューいたしますMEGA-CDにも!
 


 
今回はこの最狂最期最強最後と銘打たれた本当の意味でのMEGA-CD最後のソフト、「シャドウラン」にスポットを当てたいと思います。*2
 
 
○概要
AD2011
世界中で神話上の生命体であったエルフやドワーフなどが取替え子として生まれ始める。
世界の覚醒、第六世界の...
 
長いので割愛。
わからない方はwikiの年表をご覧ください。*3
 
このゲームはリプレイシリーズを踏襲したファンゲームであり、
 
「リプレイ読んだことないよ!」
 
とか、
 
「そもそもシャドウランってなに?」
 
と言う方は対象外のようです。
残念ながらパッケージのどこを見てもそのようなことは書いてありませんし、説明書にも明記されていませんので、知らずに購入された方はがっかりされたかと思います。
 
閑話休題
 
舞台は2053年の東京。
リプレイシリーズから2年ほど経ったある日からゲームははじまります。
ランナーチームとしてプレイヤーに与えられるキャラクターはお馴染みの面々です*4
 

 
ストリートの狼、「ストリート・サムライ 六堂」
企業を捨てた仕事人、「フォーマー・カンパニーマン 紫雲」
自然精霊と魔法を操る魔術師、「ストリート・シャーマン マオ」
電子の申し子、「エルフ・デッカー Dヘッド」
 
この4人がスタメンとなるメンバーです。*5
 
「ぶ、ぶひひぃ?スタメンに殺ちゃんいないの〜?」
 
とかお思いのそこな大きなお友達
ストーリーが進むと出てきます。
しかし、残念なことにジェーン・ドゥ*6は出てきません。
残念ですね。
まぁ、その代わりリストラされた初期メンバーであるDヘッドがいるから良いじゃない。
 
 
○ゲームの内容
このゲームは、「最強最後*7MEGA-CD RPGと言うことらしいのですが、キャラクターたちは全くレベルアップしません。
どちらかと言えば、テキストアドベンチャーが近いのではないでしょうか。
ゲームはシナリオ構成になっており、各話ごとに以下のような流れで進行します。
 
1.オープニング

仕事の背景やシナリオへの駆動力を得られると思います。
主にGMシーンなど。
 
2.依頼シーン

テキストアドベンチャー形式。
依頼人や仲間たちとの会話がメインとなります。
 
3.情報収集シーン

テキストアドベンチャー形式。
2番の依頼シーンからシームレスに移行しますが、内容が異なるので分けてみました。
様々なコンタクトや現場での聞き取りなどをして情報を集めるシーンです。
 
4.出入りシーン

ダンジョン探索だったり、単なる移動だったり、色々な要素があります。
ランダムエンカウントはない*8ので、ある意味安心感はあります。
だが、だるい。
 
5.戦闘シーン

4番からシームレスに移行します。
シミュレーションゲームのようにミニキャラを移動させて、攻撃などコマンドを選択し、敵を殲滅したならば勝利となります。
パーティ全員が死亡しない限り、ゲームオーバーにはなりません。
しかし、頻繁に全員死亡するので、根気よくプレイしましょう。
この戦闘シーンは、シナリオによっては何回か発生します。
後ほど、システムの項目でもふれますが、SR2のシステムをなかなか再現していると思います。
あ、キャラクターは戦闘中に死亡しても、戦闘終了後に自動的に蘇生パッチで何回でも復活します。*9
 
6.エンディング

仕事の後日談が語られたり、色々あります。
 
この1〜6を繰り返すことになります。
そうですね。どちらかと言えばシミュレーションRPGとかに近いかもしれませんね。
お気づきの方もいらっしゃると思いますが、このシナリオ構成はFEARゲーなどでお馴染みのシーン制に非常に近い構成ですね。
TRPG者としては馴れた展開だと思いますので、より安心度が高い構成になっていますね。
 
 
○シナリオ
兎にも角にもこのゲームで最もイチオシできるポイントをご紹介しておきます。
それはやはりよく練られたシナリオに尽きるのではないでしょうか?
 
自由精霊、昆虫精霊と言ったSR2の日本語展開では取り扱われなかったフックをはじめ、アステカ博や封鎖が解かれた池袋に焦点を当てたりしているところも見逃せません。
また、ORCや未だ封鎖区として残る地帯での種族問題などを取り上げている点もグッときます。
それだけではありません。
登場するストリートギャングや店などは、リプレイシリーズやその他ソースブックなどに登場するものたちを中心に構成されています。
もちろんキャラクターたちの掛け合いもファンにはニヤリと来る点でしょう。
 
私はこれらのシナリオを体験し、
 
「むむむ、やるなコンパイル。よく勉強して作っているじゃないか」
 
などと思ったものです。*10
まぁ、もちろんその期待はおもいっきり裏切られるわけですけど。。。

!!!
そら、シナリオまともになるっつーの!*11
ともあれ、どういった経緯であろうがシナリオは十分に納得できる仕上がりになっていること請け合いです。
 
 
さてさて、次回からよーやくツッコミに入って行きますよ。
では、次回お会いいたしましょう。
 

Shadowrun: 20th Anniversary Edition

Shadowrun: 20th Anniversary Edition

*1:このレビューはSR2プレイヤーであり、完全にその筋の人間がプレイした感想となっております。
ので、「TRPG知らんし、そもそもシャドウラン知らんし」と言う方にはあまり面白いものではありません。
また、この記事に含まれる内容は、完全に個人の主観であり、誹謗中傷の類ではないことをここに明記しておきます。

*2:何回かに記事を分けると思いますので、気長にどうぞ。

*3:シャドウラン wiki

*4:詳しい解説はキャラクターの項目を参照。

*5:カーくんは登場しません。

*6:おしりがキュッとなってる魔術師。

*7:これがとっても重要。

*8:100%イベント戦闘。

*9:フリですよ!

*10:コンパイルは「ぷよぷよ」や「魔導物語」を手がけた老舗メーカーです。

*11:俺はカーチャンの奴隷じゃないっつーの!

テスティングフレームワーク調査

今日は大人の事情によりテスティングフレームワークについて調査。
対象となるフレームワークの要件としてはサーブレットJSPをテストできること。
できれば単体が良いけど、無理ならデプロイ系のやつでも仕方ないかと思ってます。
対象となるコードはサーブレットとか言ってる時点でJAVA
 
 
JUnit
まずは、王道のJUnitから調べてみる。
JUnitにはそもそもリクエストとかそんな小洒落た機能なんぞ持ち合わせていない(と思う)。
じゃあ、ダメだなぁ。
と、諦める前にモックオブジェクト方式のやり方を検討してみたい。
実際に必要なものはHttpServletRequestとか自分で作成することが困難なオブジェクトが必要なだけ。
んだば、こうした面倒くさいものをモックで用意してやれば良い。*1
JUnit*2との連携を考えると資料が揃っているjMockかEasyMockを使いたいところ。
また動的にモックオブジェクトを作成してくれるのもありがたいですね。
どっちもどっちの性能だし、開発もどっちもどっちな感じ。
ライセンスとしてはjMockは独自ライセンスで、EasyMockはApacheライセンス。
独自ライセンスは少し怖いけどね。
どちらも以下のようにモックを作成できるので、サーブレットテストを行う分には問題なさそうですね。
 

jMock
Mock mock = new Mock(HttpServletRequest.class);

EasyMock
HttpServletRequest req = createMock(HttpServletRequest.class);

 
jMockは独自にMockインスタンスを持っているようで、それで他のインスタンスをラップしてるのでしょうか。*3
EasyMockの方が視認性は高そうですね。
単純に別インスタンスを生成するだけならばEasyMockの方がわかりやすいかも。
しかし、どちらのフレームワークであっても、モックオブジェクト方式の最低限のルールは守らなければなりません。
それはインタフェースを介した呼び出しが可能なインスタンスしか取り込めないこと(らしい)。
独自クラスや既存クラスの場合はこれが障害になりそうですね。*4
HttpServletRequestのMockObjectを作るよりは、素直にコンテナの中でテストしたほうが良いという場合もありますけど。
 
参考:
jMock
EasyMock
いがっちの覚書(java/JUnit)
Strategic Choice(テストに関するパターン・Mock Object(モックオブジェクト))
 
 
Cactus
Cactusは言わずと知れたサーブレットJSP、フィルターなどをテストするフレームワーク
Apacheプロジェクトのため何となく安心できるのは、多分気のせいでしょう。
サイトの最終更新日が2009年(2011/04現在)となっているのがなんとも微妙な気分にさせてくれます。
 
CactusはJUnitを拡張したものであり、基本的な利用に関してはJUnitを踏襲しています。*5
問題点としてはコンテナを必要とする点でしょうか。
純粋な単体テストとは微妙に異なるかもしれません。*6
また、コンテナ依存してしまうようなテストも難しいでしょう。
テストの取捨選択の必要がありますね。
 
CactusにはRedirector Proxyという強い味方がいます。
Redirector Proxyとは、クライアントとサーバ間のHTTP通信制御や処理を行うプロキシです。
このプロキシはサーブレット用、JSP用、フィルター用といくつか用意されており、テスト対象に合わせてweb.xml荷記述することになります。*7
面倒くさいですね。
テストのためにweb.xmlを書き換えなければならないとかガッカリします。*8
Cactusは比較的によく利用されているテストツールのため様々なTipsがあるので、参考サイトを見ると良いかもしれません。
 
参考:
Apache Cactus
TECHSCORE
 
 
HTTPUnit
目的からは大分離れていますが、物のついでに調べてみました。
HTTPUnitはxUnit系列のテスティングフレームワークです。
主にwebアプリケーションの画面テストなんかを取り扱うもの。
ブラウザエミュレーションしてテストを行うようですが、それならJMeterでもあんまり変わらないんじゃないだろうかとか思わない。
開発履歴が2008年とかで止まっているのがミソで、成熟しているのか枯れているのかは不明なところ。
記法はxUnit系列なのでJUnitなんかとあまり変わらないのは良いかも知れませんね。
基本的にブラウザ動作のテストになるので、完全に結合テストになってしまいますね。
 
参考:
HttpUnit
 
 
3つのテスティングフレームワークを調査しましたが、何となく楽そうなのはモックオブジェクト方式のものですね。
メンテナンス性で言えばCactusなのでしょうが、コード書きにはjMockやEasyMockなどのように感じます。

とかなんとか。

*1:ご承知の通り、モックオブジェクト方式とはテストに必要な外部インスタンスを擬似的にメモリ上に用意し、それを利用してテストする手法

*2:あと、Eclipse

*3:コード見てないので不明

*4:回避方法としては指定クラスをオーバーライドすればいいらしい

*5:JUnitライブラリが必要ですし

*6:と言っても、Redirector Proxyの恩恵によりクラスを直接扱える模様

*7:とかとかで囲むあれです。

*8:antで何とかしたい

SR4 GameMaster Terminal

ようやくアプリが完成しましたので、リリース報告をしたいと思います。
ここ数ヶ月の間、マスターアップやらApp Storeへの登録やらでワタワタしておりました。
本当にようやくと言った感じです。
 

 
タイトルは「SR4 GameMaster Terminal」ということで、Shadowrun 4th用の支援ツールとなっております。*1
Shadowrunは管理しなければならないリソースが少ない訳ではないゲームです。
特に、戦闘時における管理となると「ぼへへへ。。。」とニヤついてしまうぐらいリソースが多いです。
パスやイニシアティブ管理にはじまり、各キャラクターのコンディション、修正値、ついでに膨大な数のサイコロ量と枚挙に暇がありません。
そういった負担を少しでも削減できればと思い、製作&配布に至った次第です。
少々の電気代をいただく形になってしまいましたが、ぜひぜひ使っていただければと思います。*2
 

 
デザインは少し残念な感じですが、必要な機能を必要な分だけ揃えております。
まだまだ発展途上でいくつかアップデートも考えておりますが、それは次回のお楽しみということで。
また、SR4以外のアプリも随時製作していく予定でありますので、どうぞご贔屓になすってください。
皆様のゲームライフが善きものでありますように。
ご報告までに。
 
 
corestrike's lab
 
SR4 GameMaster Terminal(iTuneが起動します)

*1:ゴメンナサイ。iPad用アプリです。

*2:たぶん、200円くらい

iPadアプリにスプラッシュムービーを表示する

iPhoneiPadのアプリとなると機能はもとよりやはり見てくれも大切ですよね?
そんな中で標準的になってきたのがスプラッシュ画像*1ですね。
スプラッシュ画像は結構簡単に作成することができますので、
今回はスプラッシュムービーを表示させようと思います。
なお、今回はiPadを対象としています。
iPhoneでも同じなので適宜読み替えてください。
 
使用環境
<動画作成>
 Device:ショップモデル
 OS:Windows Vista
 メモリ:4GB
 CPU:Quad-Core
<実装>
 Device:MacBook Pro
 OS:Mac OSX 10.6.6
 メモリ:4GB
 CPU:Core2Duo
<テスト>
 Device:iPad 16GB
 OS:iPad iOS4.2
 
用意する具材
<動画作成>
 Gimp2.6(素材作成)*2
 Suzuka(フラッシュ作成)*3
 swfdrop(SWF→AVI)*4
 ffdshow tryouts(SWF用コーデック)*5
 XMedia Record(AVI→MP4 H.264*6
<実装>
 XCode 3.2.5*7
 iOS4.2 SDK
 
流れ
1.ムービー素材を用意しよう
2.ムービーを変換しよう
3.スプラッシュムービーを組み込もう
 
1.ムービー素材を用意しよう
 ムービーの素材を簡単に手に入れるには、もちろん自前で撮影するのが一番。
 ですが、今回はそんな時間もお金もないのでフラッシュで作成しましょう。
 環境がWindowsであればフラッシュの作成は手軽に行えます。
 凝ったことをしたい場合はActionScriptを使えるので、便利と言えば便利です。
 今回は単純に作成したいので、Suzukaを利用しました。
 流れとしてはGimpで元となる画像を用意して、
 Suzukaでフラッシュを作成すると言う感じです。
 この辺りは個々人の趣味が左右されるので、おいとくとします。
 料理番組で言えば、「ここに15分茹でた野菜を取り出して〜」という感じですね。
 なお、SuzukaはVBランタイムをインストールしたりと面倒いので、
 ParaFla!を利用するのも良いです。
 どちらにせいよこれらのソフトはGUIを使って、簡易にフラッシュ作成ができます。
 以下のサイトでは、ソフトの簡単な使い方を解説してくれています。
 堕ち武者弐 Flashの作り方
 
 注釈として、iPad用に作成したい場合、画像サイズを1024×768で作成すると、
 拡大や縮小が発生しないのでロスが少ない高画質なものが作れます。
 
 
2.ムービーを変換しよう
 フラッシュが用意できたとしましょう。
 しかし、今回利用した作成ソフトではSWFという形式のファイルになります。
 このままではiPadで利用することができません。
 ので、iPadで利用できるように変換します。
 さて、簡単に変換したいところですが、現実はかくも厳しいものです。
 SWFからiPad用動画*8に変換してくれるソフトを発見できませんでした。
 変換数が多いとロスが多くなり画質が落ちますが、今回は目を瞑ります。
 手順としてはSWF→AVI→MPEG4という感じで変換しました。
 ここで利用するのがswfdropとffdshowです。
 ffdshowは圧縮処理を行ってくれるエンコーダーですね。
 swfdropはドラッグアンドドロップによる簡単な処理で変換をしてくれるソフトです。
 ポイントとしてはffdshowを利用して画像劣化を防ぐことです。
 また、変換する際に色空間をYV12にすることでしょうか?
 透過色を利用している場合、RGBだけだと表現できないことを防ぐためです。
 
 AVIに変換しましたらXMedia Recordの登場です。
 このエンコーダーiPad用などとデバイスにあわせたテンプレートを持っています。
 起動したらファイルを追加し、左ペインよりデバイスの会社を選択し、
 デバイスの種類を選択すればOKです。
 あとは変換リストに登録してエンコードすれば出来上がりです。
 難しいことを書いているようですが、すべてGUIで行うことができます。
 これらの作業は以下のサイトが参考になります。
 気になるフリーソフトをクリップしとくブログ
 あらゆる動画をiPadで再生できる形式に変換「XMediaRecode」
 
 
3.スプラッシュムービーを組み込もう
 さて、ここからはMacでの作業になります。
 私にとって1、2の項目が大変だったので*9、なんだかやっと感があります。
 それでは進めていきましょう。
 
3-1.XCodeにてファイルを追加
 XCodeから利用できるようにするためにXCodeに追加しましょう。
 
 1.XCodeの左ペインのツリーより[Resources]を右クリック
 2.[追加] > [既存のファイル]
 3.ムービーファイルを選択する。
 
3-2.フレームワークの追加
 ムービーファイルを手軽に扱うためにXCodeには最初からフレームワークが搭載されています。しかし、標準ではこうしたフレームワークを利用できませんので、プロジェクトに追加しましょう。
 
 1.XCodeの左ペインのツリーより[Frameworks]を右クリック
 2.[追加] > [既存のフレームワーク]
 3.MediaPlayer.frameworkを選択する。
 
 これでフレームワークを利用することができます。
 全く簡単ですね。
 
3-3.実装
 いよいよ実装です。
 と言っても、それほど大変な作業じゃありませんので、
 以下のコードを参考にして組み込んでみましょう。

AppDelegate.h
#import
 
@interface /*アプリ名*/AppDelegate : NSObject {
 UIWindow *window;
 RootViewController *rootViewController;
 MPMoviePlayerViewController *mpmPlayerViewController;
}
 
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet RootViewController *rootViewController;
@property (nonatomic, retain)
 MPMoviePlayerViewController *mpmPlayerViewController;
@end

 デリゲートのヘッダソースです。
 先ほど追加したフレームワークをインポートしています。
 MPMoviePlayerViewControllerというのがムービーが再生される下地ですね。

AppDelegate.m
@synthesize mpmPlayerViewController
 
- (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:
        (NSDictionary *)launchOptions {
 [[NSNotificationCenter defaultCenter] addObserver:self
   selector:@selector(splashMoviePlayBackDidFinish:)
   name:MPMoviePlayerPlaybackDidFinishNotification
   object:nil];
 
 NSURL *filePath = [NSURL fileURLWithPath:
           [[NSBundle mainBundle] pathForResource:
           /*ムービーファイル名*/ ofType:@"mp4"]];
 mpmPlayerViewController =
     [[MPMoviePlayerViewController alloc]
     initWithContentURL:filePath ];
 mpmPlayerViewController.moviePlayer.controlStyle
     = MPMovieControlStyleNone;
 [self.window addSubview:mpmPlayerViewController.view];
 [self.window makeKeyAndVisible];
  return YES;
}
 
- (void)splashMoviePlayBackDidFinish:(NSNotification *)notification{
 [[NSNotificationCenter defaultCenter] removeObserver:self];
 [self.window addSubview:rootViewController.view];
 [mpmPlayerViewController.view removeFromSuperview];
 [mpmPlayerViewController release];
}

 こちらはデリゲートのインプリメントの方ですね。
 didFinishLaunchingWithOptionsでムービーをビューにのっけています。
 addSubViewすることで表示と同時に再生も勝手にやってくれます。
 Notificationを追加することでムービーの終了を知らせてくれます。
 splashMoviePlayBackDidFinishが終了したあとの処理ですね。
 ここでメインの画面をウィンドウに追加して、プレイヤーを除去しています。
 
 ポイントとしては、、、
  1.ウィンドウの背景色を黒にしておく
  2.プレイヤーのコントローラースタイルはNoneに設定する
  3.メインのビューをAddしてからムービー用のビューを取り除く
 ですね。
 1と3をきちんとしておかないと入れ替えのタイミングで
 ウィンドウの背景色が表示されてしまいます。
 デフォルトだと白ですので、一瞬フラッシュしたようになります。
 2の処理は再生とかシークバーの表示を隠すということですね。
 スプラッシュムービーで表示されたらなんかダサイですしね。
 
 今回の実装ですとスプラッシュは初回起動時とアプリが
 タスクリストにないときのみ再生されます。
 毎回は再生しません。
 スプラッシュのON/OFFを操作したい場合は、
 ムービーの作成やら諸手続きをdidFinishLaunchingWithOptionsではなく、
 applicationDidBecomeActiveなどで行うと良いかもしれません。
 こちらのメソッドはアプリがアクティブになったら
 処理を行うと言うものですので、
 アプリが選択されたら毎回実行されるメソッドになります。
 あとは、設定画面などを設けて、そこでON/OFFを行うようにすれば良いでしょう。
 
 
駆け足の解説でしたが、参考になれば良いかと思います。

*1:起動画像のこと

*2:GIMP

*3:Suzuka

*4:Swf Drop 0.9c Download

*5:ffdshow tryouts

*6:XMedia Record

*7:iOS Dev Center

*8:今回はH.264エンコードのMpeg4を想定しています。

*9:3日かかりました。

iPhoneアプリ内のテーブルアイテムのローカライズ

iPhoneアプリの開発をやってるとやはり気になるのがローカライズ(多言語化)ですよね。
世界中のユーザ向けにアプリを提供する気ならば間違いなく避けては通れません。
リソースファイルによる多言語化は各所で解説がなされています。
例えば、ラベルやプレイスホルダー、アラートなど単一のメッセージに対してのローカライズ手法です。
以下のサイトがわかりやすく解説しています。
 
SE奮闘記/【Objective-C】iPhoneアプリの多言語化(ローカライズ)
 
今回はこのローカライズをテーブルアイテムに適用してみようという試みです。
基本的な方法は以下。
 
1.各言語のテーブルアイテム用リソースファイルを作成
2.<国記号>.lprojフォルダに作成したファイルをコピー
3.XCodeにてコピーしたファイルを追加
4.追加したファイルを読み込む
ex.テーブル追加例
 
1.各言語のリストアイテム用リソースファイルを作成
 リソースファイルの形式に決まりはありません。
 ですので、JSONなりXMLなりで各言語ごとに作成してください。*1
 ポイントとしては、全てのリソースファイルは共通のファイル名を持つようにしてください。
 例えば、「sample.xml」というリソースファイルを作成したならば、
 英語用も日本語用も中国語用も全て同じ名前にする必要があります。
 
 
2.<国記号>.lprojフォルダに作成したファイルをコピー
 作成したリソースファイルを<国記号>.lprojフォルダにコピーします。
 例えば、英語用リソースファイルならば「en.lproj」、
 日本語用リソースファイルならば「ja.lproj」にコピーしてください。
 これらのリソースフォルダはiPhoneの設定で
 言語環境を変更した場合に呼ばれるフォルダとなります。
 これらのフォルダがない場合はFinderより作成して、XCodeに追加してください。
 
 
3.XCodeにてコピーしたファイルを追加
 XCodeから利用できるようにするためにXCodeに追加しましょう。
 
 1.XCodeの左ペインのツリーより[Resources]を右クリック
 2.[追加] > [既存のファイル]
 3.先ほどコピーしたリソースファイルを選択する。
 ※追加オプションはデフォルトで問題ないと思います。
 
 ファイルが追加されると[Resources]配下が以下のようになると思います。

<英語用と日本語用を追加した場合>
 
▼Resources
 ▼[追加したファイル名]
  en
  ja

 
 
4.追加したファイルを読み込む
 次に追加したファイルを読み込みます。

NSString *fileName = [ [NSBundle mainBundle]
 pathForResource:@"ファイル名" ofType:@"ファイル拡張子"];
NSString *fileDesc = [ [NSString alloc]
 initWithContentsOfFile:fileName encoding:NSUTF8StringEncoding error:nil];

 上記例ではファイルをUTF8エンコードでNSString型で読み込んでいます。
 
 
ex.テーブル追加例
 テーブルアイテムとして追加する例を以下に示します。
 今回、読み込むデータはJSONで作成しており、
 JSONパーサとしてJSON-Frameworkを利用しています。*2

/** samleData.json **/
{"items":[
 {"key":"firstKey","val":"firstValue"},
 {"key":"secondKey","val":"secondValue"},
 {"key":"thirdKey","val":"thirdValue"}
]}

/** Table View**/
@synthesize sampleArray
 
- (void)viewDidLoad {
 [super viewDidLoad];
 sampleArray = [ [NSMutableArray alloc] initWithCapacity:10];
 NSString *fileName = [ [NSBundle mainBundle]
           pathForResource:@"sampleData"
           ofType:@"json"];
 NSString *jsonString = [ [NSString alloc]
            initWithContentsOfFile:fileName
            encoding:NSUTF8StringEncoding error:nil];
 NSDictionary *jsonDic = [jsonString JSONValue];
 [sampleArray removeAllObjects];
 [sampleArray addObjectsFromArray:[jsonDic objectForKey:@"items"]];
 [jsonString release];
}
 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)TableView {
 return 1;
}
 
- (NSInteger)tableView:(UITableView *)TableView numberOfRowsInSection:(NSInteger)section {
 return [sampleArray count];
}
 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 
 static NSString *CellIdentifier = @"Cell";

 UITableViewCell *cell =
  [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
 
 if (cell == nil) {
  cell = [[[UITableViewCell alloc]
   initWithStyle:UITableViewCellStyleDefault
   reuseIdentifier:CellIdentifier] autorelease];
 }
 
 NSDictionary *tmp = [sampleArray objectAtIndex:indexPath.row];
 cell.textLabel.text = [tmp objectForKey:@"key"];
 
 return cell;
}

 必要な箇所のみ記述してあります。
 このソースでは「sampleData.json」を読み込み、それを配列に格納しています。
 その後、格納した配列から列を取り出して、それをNSDictionaryとして扱っています。
 テーブルに表示されるのは、「key」で指定した値ということになりますね。
 これだけでiPhoneの言語設定に合わせたファイルを取得することができます。
 ちょっとした静的リストを扱いたいときなどには便利ですね。

*1:JSONを利用する場合は外部ライブラリを利用する必要があります。

*2:Google Code json-framework