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

平凡なエンジニアの独り言 はてなブログ出張所

ピアノをこよなく愛するエセRubyistが適当に書き綴ります

メタルマックス3をクリアした

17年ぶりにメタルマックスシリーズの新作が出たと言うことで、早速買ってプレーしました。買ったのは1,2のサントラ付きのLimited Edition*1。リターンズもサーガもやっていないので、本当に久しぶりにこのシリーズの雰囲気を楽しめました。とりあえず、2週目をクリアしたので、そろそろ感想をブログにアップしようかと思います。

メタルマックス3(通常版)(特典なし)

メタルマックス3(通常版)(特典なし)

メタルマックスシリーズとは?

メタルマックスシリーズは、高い自由度を持ったシナリオと、戦車のカスタマイズが特徴のゲームです。通常のRPGでは経験値を貯めてキャラクタをレベルアップさせることがメインになります。このゲームでは、そういう通常の成長もありつつ、戦車を入手してパーツを取り替えたり、改造したりしながら徐々に強くなっていくという独特のシステムを組んでいます。

この戦車システムは、ダンジョンや町のマップなどでも活かされています。ダンジョンやマップ上には戦車が通行できない箇所があります。戦車から降りて戦車が通行できない場所を攻略して何らかの操作を行うと、戦車が通行できるようになってボス戦に挑めるようになる(人間でも行けますが、大抵負けます)というような仕掛けが準備されています。戦車に乗ると飛躍的に強くなり、絶大な安心感がありますが、戦車から降りなければならないダンジョンの攻略は、かなりの緊張感があります。

自由度の高いシナリオも特徴の一つです。このゲームは全てのイベントをこなしてゲームクリアをしようとすれば、50時間くらいは優にかかります。しかし、ゲームクリアに必要なイベントはおそらく10時間程度でこなせるのではないかと思います。実際に10時間でクリアするためには、相当効率よくキャラクタと戦車を強化しないといけないでしょうが、80%のゲーム要素は本筋から蛇足と考えてもいいでしょう。

主人公や戦車の状態を引き継いで2週目を遊ぶこともできるのですが、特殊なアイテムと特技を使ったパーツの限界を超えた改造を行う改造ゲージツで改造を極めたり、賞金首が落とすレアアイテムや道ばたに落ちている強力アイテムを狙ったり(複数の種類がある上にランダムで☆の数が変わって強さが変化する)、ゲームクリア後の方が楽しみが多いとも言えます*2

成長する戦車「バイオタンク」とかニヤリとしてしまうような仕掛けがたくさん施されているのも本シリーズの特徴でしょうか。

感想

先にも書きましたが、ゲームとしては、前作の2と同等か上回っている「正常進化」を思わせる作品でした。スーファミ時代を思わせるレトロゲーの雰囲気があるのも従来からのファンとしては好印象です。届いたのは7/30くらいでしたが、その直後の土日でプレー時間が38時間(1日19時間!?)に達しました。生活崩壊寸前でしたが、面白いゲームだったと思います。

一つ残念なのは、音楽が2からの使い回しが多く、DSの残念音質も相まって微妙に退化しているように感じられたことです。アレンジや新しく作られた曲が特に悪いというわけではないのですが、仮に17年後に続編を買うとして、サントラを購入する意欲が湧くかどうかは・・・。システムが正常進化していただけに、残念なポイントだったかもしれません。

このスタッフで次回作を期待したいところですが、売れたのかな〜???

最後にお世話になったサイトを紹介します。

*1:実は、ゲームよりもサントラが欲しかったのですが・・・3の出来はゲームとしてみれば、2と同等かそれ以上でうれしい誤算でした。

*2:中古対策という側面もあって、近年のRPGにはよく見られる傾向ですが。

HTML5で動作するノベルゲームのエンジンを作ってみた

ゲームを作成して共有するサイト - RmakeゲームエンジンはFlashで作られているのですが、将来的なことを考えてHTML5 + JavaScriptで動作するエンジンを作ってみることにしました。スマートフォンやスレートPC(タブレット)などで動作することを踏まえて、まずはパフォーマンスをそれほど要求しないノベルゲームを移植してみました。

現在は一つしかありませんが、HTML5で動作するテストゲームは以下に配置してあります。

サンプルゲームは以下です。

f:id:akasata:20100810194719p:image

現在の状況

  • 一部の機能しか実装していない
  • WindowsのChrome/Safari/Firefoxで動作確認済み*1
  • 十分にチューニングしていないので動作が重い
  • iPadでの動作状況
    • 動作はするが、とにかく重い
    • マウス前提で作っているので使いにくい
    • 音が鳴らない(iPadのaudioタグでは音は同時に一つまでしか鳴らせない模様・・・)
    • メモリ不足に陥って動作が停止する場合がある

一番気になるのは重さです。特にiPad。Rmakeには、Rubyのサブセットとなるように開発されているArrpというスクリプト言語があります。ActionScript3版をJavaScriptに移植した際に速度が低下するのでは無いかという懸念があったのですが、これは杞憂に終わりました。

Rmakeでは、スクリプト言語を内部命令に変換した際、1フレームあたり1000命令しか実行しないようになっています。これは、PCの性能の影響を受けにくいように配慮してなのですが、JS版をiPadで実行しても、1フレームあたり1000命令は問題なく実行できました。

しかし、iPadではCanvasへの描画が重いようで、期待したフレームレートの1/3 〜 1/5くらいまで落ちてしまいました。ブラウザの最適化が不十分なのか、機器の性能(フィルレート)の問題なのかはわかりませんが、結果として、相当遅いということになってしまいました。とはいえ、PCでは問題なく動作します。

興味のある方は、以下のベンチマークを試してください。

まとめ

今のところ、HTML5実装はテストの域を出ていません。特に普及が期待されているモバイルの世界では、HTML5の実装が未成熟な問題*2や、モバイル機器のパフォーマンスなどの問題もあり、ノベルゲームでも今すぐ実用のレベルに到達させるのは難しいかもしれません。(いくつか高速化のアイディアはあるので、もう少しいろいろチャレンジしてみるつもりですが。。。)

とはいえ、世間的に言われているとおり、モバイル機器の性能はものすごい勢いで向上しています。ムーアの法則も真っ青な状況のようなので、2 〜 3年後くらいに出てくる機器なら、ノベルゲームくらいならまず間違いなく動作するでしょう。(あるいはブラウザの最適化で案外すぐに動作するようになってしまうかもしれませんが・・・。)

できるかどうかよりも、いつどんなものを出すか考える必要がありそうです。

余談

HTML5版Rmakeでは、iPad/iPhoneCanvasのfillTextがまともに描画できないため、結局かなりの部分をDOM操作で解決しています。結果的には、HTML5なしでも実現できたなと・・・(苦笑)。HTML + JavaScriptって凄いなぁ。

*1:Firefoxでは音が鳴らない

*2:例を挙げると、iPad/iPhoneCanvasのfillTextがまともに描画できず、変な反転が起こる問題など。

twitterのOAuth認証を実装するときに、AccessTokenからscreen_nameを取得する方法

RmakeRailsで実装)でtwitterのOAuth認証を実装していたときに、screen_nameの取得方法がわからなくてあたふたしたので自分用にメモっておきます。gemのoauthとtwitterを使いました。具体的には以下の一行が書きたかっただけなのですが。。。

screen_name = access_token.params[:screen_name]

environment.rbに以下のように書いて、gemのoauthとtwitterを設定します。

config.gem 'oauth'
config.gem 'twitter'

次に、RequestTokenを取得してから、twitterの認証ページを飛ばすためのアクションを書きます。

consumer = OAuth::Consumer.new(CONSUMER_KEY, SECRET_KEY,
  {:site=>"http://twitter.com"})
request_token = consumer.get_request_token(:oauth_callback => "戻り先のURL")
session[:request_token] = request_token.token
session[:request_token_secret] = request_token.secret
redirect_to request_token.authorize_url

最後に、twitterの認証ページからの遷移先アクションを記述します。

consumer = OAuth::Consumer.new(CONSUMER_KEY, SECRET_KEY,
  {:site=>"http://twitter.com"})

request_token = OAuth::RequestToken.new(
  consumer, session[:request_token], session[:request_token_secret])

access_token = request_token.get_access_token(
  :oauth_token => params[:oauth_token],
  :oauth_verifier => params[:oauth_verifier]
)

_screen_name = access_token.params[:screen_name] # <<- これが書きたかった。。。

oauth = Twitter::OAuth.new(CONSUMER_KEY, SECRET_KEY)
oauth.authorize_from_access(access_token.token, access_token.secret)
client = Twitter::Base.new(oauth)

screen_nameはAccessToken(Twitter APIへのアクセス用のトークン)のレスポンスに含まれているようです。OAuthでは、AccessTokenに独自のパラメータを含めることができるんですかね?

ちゃんと仕様を読まないとダメかな〜。。。

RmakeがWIRED VISIONにて取り上げられました

ゲームを作成して共有するサイト - Rmakeが、WIRED VISIONにて取り上げられたようです。

去年の7月からひっそりと*1運営を続けてきたRmakeですが、ぼちぼちこういったサイトに補足されるようになってきたようです。来た人をがっかりさせないようなサービスの品質に早く高めていきたいものです。

そういえば、ぼちぼち、絵描きさんやライターさんのような非エンジニアな方も開発に参加して欲しいところなのですが、まだまだ収益化が遠い状態で手弁当で参加してくれるような人ってなかなかいないだろうな・・・。

*1:完成度の低いうちに大々的に人を集めちゃうとがっかりだけさせてしまいますからね。まぁ、大々的にやるようなコネもカネもありませんが(笑)。

2009年のふりかえりと2010年の抱負

新年あけましておめでとうございます! 一年の計は元旦にありといいますが、まぁ、去年のふりかえりと今年の抱負でも書いておこうかなと思います。去年の文は以下の通りです。年末に書いていたみたいです。

2009年のふりかえり

なんだか、2009年はたいしたことをしていないのに終わってしまった感じでした。まぁ、でも仕事的にはいろいろと成果が上がっていたみたいなので、やることはやっていたみたいです。

tmixですが、開発自体は一昨年(2008年)の夏から参加していたのですが、2009年の1月にめでたくリリースすることができて、一安心しています。ま、2010年もある程度は開発に参加することになりそうです。商売的にもそれなりに売れていて開発しがいがありました。

それにしても、前の会社を辞めてから3年ほど経ちますが、フリーランスになってから1年以上おつきあいした仕事ははじめてかもしれません。フリーランスにとっては長期の仕事をするメリットはあまりないのですが、この仕事に関しては、効率よく稼ぐことが求められるフリーランスという立場とは違う仕事の仕方を考える良い機会になりました。まぁ、そういった経験を活かすかどうかはこれから次第なのでしょうが。

実践バグ管理はなでしこのクジラ飛行机さんとの共著でした。これも2008年からの積み残しですね。本の執筆に関わるのは5年ぶりくらいです。2回も合宿したりして、なかなか楽しい仕事でした。でも、本書くよりプログラミングの方が楽しいかな〜。まぁ、またしばらくしたら書きたいと思うのでしょうが。

Rmakeは今一番力を入れているサービスです。伊東に合宿しにいったり、八角研究所のオフィスを借りて開発を進めたり、かなり楽しみながら開発を進めることができました。ユーザーさんもついたし、牛歩ですがサービスの完成度も上がりつつあるので、このまま進めていきたいところです。

2010年の抱負

tmixも実践バグ管理も2008年の積み残しみたいな感じでした。これらは一応何とかなったので、2010年は、Rmakeを何とかしたいと考えています。ビジネス的な目標としては、ユーザー数の拡大や収益化などが挙げられます。技術的には以下のあたりを進めていきたいと考えています。

  • 多数のユーザーがリアルタイム連携するためのインフラとなるメッセージングサーバーの開発
  • ネイティブアプリに負けないリッチなゲームを作るためにNative ClientもしくはUnityあたりを使ったゲーム開発にトライする

まぁ、Rmakeの携帯対応とか、スケールアウトのための開発とかに時間を取られると思うので、たいしたことはできない気はしていますが。あと、2009年はコピトレKodouguについて少ししかできなかったので、今年は何かやりたいと考えています。

まぁ、2010年の抱負はこんな感じですかね。

それでは、今年もよろしくお願いいたします!

ブラウザ上でドット絵を作成/共有できるサービス「RmakeDot」を開始した

というわけで、新サービスのお知らせです。ブラウザ上でドット絵を作成して共有できるサービス「RmakeDot」を開始しました。RmakeDotの特徴は、RmakeDotで描いたドット絵は、即時ゲーム作成時に使えることです。

RmakeDotとは?

ゲームを作れるウェブサービス - Rmakeは、ブラウザ上でゲームを作成して共有するサービスです。Rmakeでは、自分の描いたドット絵をゲームに使うことができます。

ただ、ゲーム用にエディタを描くのは、ドット絵編集用にエディタをダウンロードして、ドット絵を描いて、さらにアップロードして・・・と結構面倒です。ゲーム用のドット絵は、透過色の扱い、アニメーションの考慮など結構面倒なことが多く、ペイントなどで手軽に済ませるというわけにもいきません。ましてや、RmakeはPCにそれほど詳しくない人にもさわって欲しいサービスです。

そこで、ブラウザ上にドット絵専用エディタを提供して、これといった準備をすることなく、さくっとドット絵を作れるサービスRmakeDotを始めることにしました。Rmakeと連携しているので、描いたドット絵はすぐにゲームで使うことができます。

エディタは以下のような感じです。

f:id:akasata:20091215233223p:image

開発は、クライアント(Flash)サイドはクジラ飛行机さん(id:kujirahand)、サーバサイドは私が行いました。

Rmakeとは?

ゲームを作れるウェブサービス - Rmakeは、ブラウザ上でゲームを作成して共有するサービスです。今は、2DアクションRPG、2DRPG(サイドビューバトル)、ノベルゲームを作ることができます。グラフィカルなエディタや柔軟なスクリプト(Rubyのサブセットを目指して開発)を駆使して、さまざまなゲームを作ることができます。

ブログに貼ったりすることもできます。以下にサンプルゲームを貼り付けておくので、作れるゲームの雰囲気は以下から楽しむことができます。

基本マウスで操作します。移動は移動先をマウスでクリックしてください(カーソルキーでも移動可能。)。攻撃/決定/話す/調べるはzキー、武器の切り替えはxキー、メニューの表示はcキーです。ただし、マウスのみで操作可能です。

今後の予定など

RmakeDotのエディタやサイトはまだまだ改善の余地があります。とはいえ、作ったものを大事に隠していてもしょうがないので、実際にユーザーの皆さんに提供して要望などを集めながら改善するフェーズに移すことにしました。Rmake本体と異なり、ログインしなくても使うことができるので、気軽に試してみてください。

以下、蛇足情報。

Rails/MongoRecordでwhere句を設定する場合はセキュリティに気をつける必要がある

以下の記事でMongoDBとMongoRecordの紹介をしました。where句について、セキュリティの観点(スクリプトインジェクションができてしまう可能性がある)から念のため気にしておく必要があるかなと思ったことを書いておきます。

以下のようなコードがあるとしましょう。

_js = <<-EOS
function() {
  return this.hogehoge == "#{params[:hogehoge]}";
}
EOS

@hoges = HogeModel.find(:all, :conditions => {"$where" => _js})

params[:hogehoge]に「" || true || this.hogehoge == "」みたいな内容が入ってくると、以下のようなコードが出力されることになります。何が出てくるか、恐くもあり、楽しくもありますww

_js = <<-EOS
function() {
  return this.hogehoge == "" || true || this.hogehoge == "";
}
EOS

@hoges = HogeModel.find(:all, :conditions => {"$where" => _js})

ダブルクォーテーションをエスケープする必要がありそうです。JSを直接書いたりしないケースでは、RubyのハッシュからJSONに変換するはずなので、そのときにエスケープしてくれると思うので大丈夫だと思いますが、where句については気をつけましょう。

# ActiveRecordのように["hogehoge = ?", params[:hogehoge]]みたいな書き方ができるようになるといいのですが・・・。