Archive - 2009.01

ジオメトリとユビキチ ver.3

gist: 46381 - GitHub

毎日更新で慌ただしいんですが、昨日のがあまりにも問題だらけでタコだったので更新しました。前回の問題点:プレビューの中でネットワーク問い合わせを何度もやってると、入力文字列が変更されてもキャンセルされない(後回しにされるだけ) だから「SeaWeez」って入力した後に「SeaWeeze」と入力すると(eを付け足すだけ、つまり普通の入力手順です)SeaWeezeの問い合わせが終わったあとに「SeaWeez」の問い合わせが始まって、結果的にNot foundになる。

対処方法がさーっぱり思いつかなかった、のでゲーマータグのみでの問い合わせ機能は無しにしました。かわりに、mode Allを付けました。あ、ちなみに今でもモード変更部分で、例えばmode dとした後にカーソルキーでモードを次々と変更するとアレな動作をしてるのが分かります。問い合わせの書き方が悪いんですかねえ。入力が変更されたら、自動的に強制切断されると思っていたんですが、どうもそういうわけじゃあないようで。とっても困りました。うーん、どうしたものかなあ。今のところ全然対処方法が分かってないのです。人のソース見てもさっぱり分からない。いかんねえ。

と、いう問題も残っていますが、今回のは、わりと普通に使えます。若干のアレな動作には目をつむりましょう。利用シーンは、例えばEVOLVED1位の「Blew Meanie」さんは他のモードではどんな感じなのかなあ?と思ったら「gw blew meanie mode a」と入力するだけ。ちょっと気になるけど手間かけるほどでもない、そんなことがササッと調べられて便利。です。是非使ってみてください。

UbiquityとJavaScript

gist: 46381 — GitHub

あまりの酷いJavaScript素人っぷりに嫌気がさしたので、JavaScript 第5版を読みました。とりあえず9章まで。というわけで、それをもとにして書きなおしてみました。functionがコンストラクタなんだねー、とかprototypeとか。そんな感想を反映。前よりは遥かにマシ、だとは思います。

んで、機能的には大幅アップです。modeを確定させる前は全部のモードから表示。modeを確定させたら、前回はプレビュー領域が余りまくりで勿体なかったので、前後3人のスコアを同時表示に変更。これでわりと実用的になってきたんじゃあないかと思われますがどうでしょう?若干、というかかなり動作が怪しいー通信しすぎー、一覧表示でてこねーぞごるぁー、ってところがあるので、追々直します。

ジオメトリランキング表示Ubiquityコマンド

gist: 46381 — GitHub

ちょっと前からゴニョゴニョと弄り中のジオメトリウォーズ2のランキング。実用的なものを、と考えた結果、FirefoxのアドオンUbiquityのコマンドに仕上げてみました。Ubiquityをインストールした状態で上記GitHubのサイトに飛ぶと上部にSubscribeするかどうかの情報バーが出るので、Subscribeすればコマンドのインストールが完了します。

使い方

Ubiquityを起動し(デフォルトではCtrl+Space)「gwre2 GAMERTAG mode MODE」とコマンドを入力するとプレビュー領域にランキングとスコアが表示され、そのままエンターキーを押すと、テキストキャレットの位置にスコアが挿入されます。例えば「gwre2 SeaWeeze mode Deadline」と入力すると「Rank:143|Score:45218795」がプレビュー領域に、エンターを押すことで「45218795」が挿入される、というわけです。

入力補完が効くので実際の入力は「gw SeaWeeze mode d」だけでOKです。また、modeを入力すると下にその他の候補が出るので、下カーソルを押すことでスムーズに他のモードのランク/スコアを見ることが可能です。残念ながら今のところUbiquityの仕様で5つまでしか出せませんけど(モードは6つあるので一つ足りない、ので基本的にSequenceが場外)

ネットを見ててゲーマータグがあると、この人のジオメトリのスコアはどのぐらいだろうなあ、とかすぐ思ってしまう人にお薦め。定期的に自分のスコアを張り付けている人にもお薦め。もうメモらなくても済む!

コード品質

ソースコード丸見え!見ちゃいやあ。そうです、品質最悪です。実のところjavascriptが全然分からないのです。そしてjQueryは初めて触った、ので全く分からない。Ubiquityも初めて、当然さっぱり。分からないx3により酷いことになっています。いやあ、困った困った。誰か改良してくれれば……。というのはともかく、明らかに酷いのは分かっているので、ちょくちょくと改良していこうとは思っています。

modeを入力しない状態だとpreview領域に全部のスコアとランクを出す。というほうが便利ですよねー。ただそうなるとサーバーにリクエスト飛ばしまくることになるので(単純にx6というだけじゃなくて、ゲーマータグの確定前にもリクエストが飛ぶので、x15ぐらいになりそう)どうかなー、と思ったんですが、どーなんでしょうかね。やっぱ不便なので、全部のスコアとランクが出た方がいいには違いないんですけどねえ。

リーダーボード分解

 static void Main(string[] args)
 {
     var service = new XBLLeaderboardSvc.ServiceSoapClient("ServiceSoap");
     var result = service.getLeaderboardNearGamertag(2, 4, "SeaWeeze", 10)
         .Skip(1) // 最初の1個目は値の個数なのでスキップ
         .Select((value, index) => new
         {
             value = value,
             index = index / 3,
             attr = (index % 3 == 0) ? "Rank" :
                    (index % 3 == 1) ? "Tag" :
                    "Score"
         })
         .GroupBy(t => t.index, t => new { t.value, t.attr })
         .Select(g => new
         {
             tag = g.First(t => t.attr == "Tag").value,
             rank = int.Parse(g.First(t => t.attr == "Rank").value),
             score = int.Parse(g.First(t => t.attr == "Score").value)
         });
 }

今年はプログラミング分を強化したいので、コードも張り付けていこう。勿論恥ずかしいけれど、照れてても成長に繋がらないと思うので、積極的に行きたいです。言語は基本的にC#3.0。というわけで、前回、GeometryWarsのLeaderboardの値を取得するの続き。ただの文字列配列で帰ってくるので分解しなきゃねー、ということで分解、まで。この後の予定は未定。ゆったりとSilverlightで簡単なグラフでも作ってから本格的に考えようかな―、と思っています。

サービス参照を追加するだけで、メソッド一発(getLeaderboardNearGamertag())で軽く取得出来る。これは楽ちん。配列はLINQを使って分解することにしました。3つ区切りなので3で割ってインデックスと属性振ってグループ化してタグから匿名型作って……。何かイマイチ。attrが野暮ったい。この辺、何とかしたい気はとてもする。

と、進捗的にはつまり全く進んでないということですね! いや、ここずっとexception conflictやってるし……。

exception conflict

zoomeの時代は、終わった。時代はHD。1280×720。Stage6の、あの頃の栄華から帰ってきた。埋め込み動画じゃなく、是非YouTubeに飛んでみてください。むしろダウンロードして見てください。というわけで、exception conflict。PCの、個人制作の、無料配布されている全方位シューティングです。とにかく凄い。その凄さはzoomeの640×480じゃダメだ、HD画質で伝えたい、というわけでPCが焼け付きそうな勢いでHDで録画しました。そもそも普通にプレイするのですら無理なのに録画だなんて!そのため、一部はフレームレート10以下という凶悪な見苦しさですが、よく分からないけど凄い。よくわからないけど立方体ヤヴァい。と、感じていただければ幸いです。あ、ちなみにこれはフルエフェクト・最高破片出現モードでプレイしているからの低フレームレートであって、普通はそこまで処理落ちしません。

概要

前作については去年記事を書いてあるけれど(neue cc - 豆腐STG exception)、今作はスクロールタイプから変わり、固定画面の全方位シューティング。あえて似ているものを探すならGeometry Wars 2のSequenceだろうか、固定画面+ステージ制という点で。また、モード名「Horde」から明らかなように、Gears of War 2のHordeのようでもある。ネットワーク協力プレイ出来るし。むしろHordeと同様に協力プレイがメインだし。そして私は基本一人Horde……。

SequenceやGoW2:Hordeとの最大の違いはノンストップで展開するという点。画面上に常に、大量に立方体が残り続けることの煽りっぷりは半端じゃない。更にWAVE(ステージの単位)毎に対処方法が違うため(例えば全方位から敵が出現してレーザーを撃ってくるようなWAVEでは中央にいたら即死) 常にWAVEの進行具合を緊迫感持って意識する必要があるので、ダラけるシーンが皆無。常に、最初から最後までハイスピードハイテンション。

それじゃあさすがに疲れちゃう、と思いきやWAVEの構成が絶妙で、レーザーがそこら中から飛んでくるシビアなWAVEの次には比較的穏やかなWAVEが来たりと、緩急の付き方が素晴らしい。勿論、穏やかといっても油断するとカタパルトのエネルギーが切れて、立方体に埋もれて一気に死ぬ、という、200km/hの中で150km/hが来るとホッとするよね(150km/hでも十分速いのに何その錯覚)みたいな、緊張感は決して絶やさせないから退屈させない、けれど確実に一息付けるという緩急の付き方が絶妙としか言いようがない。

また、GoW2:Hordeと同様の仕組みでWAVEは15までがワンセット、つまり16-30は1-15の強化版という風になっていて(30でクリア)、この16-30がシューティングの、いわゆる「2周目」的で熱い。GoW2では2周目だなんて感じなかったのは、2Dシューティングという題材の妙でしょうか。演出効果の違い、というのもあるけど。スッピピピッと入る(←表現しにくい)イントロからのアレンジBGMと、背景の色の変化による15-16の切り替わりシーンは結構感動します。

無限Extend的な何か

あまり他のゲームと比較するのも良くないとは思いつつ比較話。表面的にはGWRE2のSequenceやGoW2のHordeに似ているが、プレイ感覚的には、Geometry Wars 1のEVOLVEDが近いと思った。強力なショットで大量の敵を一掃するという点は勿論だけど、それ以上に緩急の取り方とエクステンドのシステムが非常に近い。GWRE1はかなり頻繁に、それこそ時に十数秒で一機アップ。exception conflictは自動回復の体力制で攻撃を受けなければ、かなり速い速度で全回復する。

これが緩急の緩の部分と密接に結びついている。GWRE1だと4隅ブラックホールパターンとか自機周囲に水色発生パターンとかが緩の部分だけど、これはホッと一息つけるというだけじゃなくて、ライフを失わずスコアアップ=エクステンドするという「プレイ中の自機の得」に結びついている。exception conflictでは体力の回復で、これも当然自機の得。だから、ただスコアアップして嬉しい、とか画面の敵を一掃出来て嬉しい、以上の喜びをもたらしてくれる。

GWRE2:EVOLVEDはエクステンド条件が実質有限だから、緩の部分がスコアアップの得にしかなってないので、プレイ中の喜悲の起伏が薄くなってしまっている。勿論、無限エクステンドは間延びが避けられないのでスコアアタック的にはより研ぎ澄まされていると言える。が、残念ながら偶然性の支配のデメリットが濃く出ちゃってる。うっかり死亡率の高いゲーム性を、GWRE1:EVOLVEDはエクステンド率の高さで中和してまとめあげていたのに、GWRE2:EVOLVEDはエクステンドを捨てたから、運ゲーっぽさが強くなってしまった。即死即リトライとしてPacifismやWAVESは上手くまとまっているが、EVOLVEDは長丁場になっているから、2のシステムよりは1のシステムのほうが合ってた。

その他

以上は一人Hordeの感想で、本来メインである協力プレイは、えーと、あまりプレイしてないので分からないです! いや、これからがんがんプレイしたいです。自分の吹き飛ばした破片で味方がダメージ喰らうので、一人プレイとは全く異なる、協力を強く意識しなきゃあならないんですね。へたすると一人プレイよりも二、三人プレイのほうが難しいのかもしれない。二倍三倍になった火力が自分達に跳ね返ってくるというのは想像するだけで楽しそうです。

他に対戦プレイとか防衛戦とかもあるけど、こちらは未プレイ。でも面白そう。

コンフィグとコントローラー

キーコンフィグはXbox360の有線コントローラーでLB,RBが左回転右回転、A=レーザー、X=レイ、RT=カタパルト、B=ディレクション。動画で、回転が結構ぎこちないのはボタン操作だから、ですね。この辺は普通の全方位STG的に両スティックで操作出来ると良かったんですが、configで設定、できるようなできないような、私にはできなかったのでボタンです。

話変わるんですけど「有線コントローラー」というのは強調しておきたいですね。少し前にPS3とXbox360を両方持ってるという人2人と3人で少し話した時に、両方で出てるゲームはグラフィックは大差ないから(むしろPS3のほうがイイ、というニュアンスを言外に含んでいましたが)コントローラーで選ぶ、だから軽いPS3がいい。とか言われて、エエーッ、となりつつもあまり言えず流れてしまったんですが、スティックの位置とか、ね、まあ好みだと100億歩譲ったとしても、軽さとか言いつつワイヤレス。あのですね、重量で云々言うんなら有線使ってからにしろよ、と。ワイヤレス使ってる時点で軽さ云々言う資格はない。

有線コントローラーお薦め←amazon:Xbox 360 コントローラー

総評

以前に、Xbox360のコミュニティゲーム(一般ユーザー作成ゲームの有料配布システム)なんて買わないよなあ、とか書きましたが、exception conflictなら800ゲイツでも全然払う。さすがにこのクラスの出来のものがポンポン出るとは思いませんけど(実際、コミュニティゲームにはションボリなものが多い) 一年に一作ぐらい、オオッてものが出てくれば、それだけで十二分にコミュニティゲームには価値がありますね。日本はPC同人ゲーム市場がわりと大きめでXbox360市場は小さめなので、日本発というのはなさそうですが。

まあ、とにかくexception conflictは面白い。超面白い。大絶賛。去年のクリスマス頃に出ていたら、年末補正(後からプレイしたものほど印象が新鮮)があるとしてもMy Game of The Yearと言ってもいいぐらい面白い。いや、むしろ今年でも。やりこみ要素は薄いかもですが(基本、協力プレイのHordeなので)とにかく熱い。この抜群のインパクトなグラフィックと絶妙なプレイ感覚は、興奮しないほうがオカシイ。古いPCでも解像度落としたりエフェクト切ったりすれば意外と動きそうだし、破片倍率の低いモード(そもそもfutureモードが規格外に出すぎなだけ)でも面白さは十分伝わってくると思う。ムリョームリョー、タダゲータダゲー言うのもアレですけど、無料だし。とにかくプレイしてみて欲しい。コントローラーがなくても、キーボードでも全然操作できるし。冒頭でもリンク張ったけど、ここでも張っておきます。exception conflict。これでジオメトリウォーズ的な無限モード+スコアアタックが搭載されれば死にます。PCが。熱吹いて。私も。食事すら取らず。

あと、今なら作者と一緒にプレイできるチャンスでもある。何気に地味に心臓飛び出るほど嬉しくて一言も発せず部屋解散の寂しさとドキドキを味わえるのは今だけ!

GeometryWars Leaderboard API

Xbox360がネットランキングを標準搭載したように、次世代XboxはWeb上からランキングデータを取得できるAPIを標準公開して欲しい。いや、公開すべき。そうすれば、あんなこともこんなことも、夢が膨らむ。残念ながら現行世代のXbox360はム・リ。ではあるものの、最近ではウェブ上からランキングを参照出来るゲームも多くなってきた、ということは需要の後押しがある、ということで次世代Xboxでの搭載は夢ではなさそう。HALO3のマッチングシステムと共に標準搭載の勢いでよろしくお願いしたい。

で、本題。ジオメトリ2もメーカー側のランキングや、ランキング付きゲーマーカードのようにウェブ上に公開可能な仕組みは用意されていた、けど、一般人が弄れるAPIは公開されていなかった。しかしBizarre Creationsはついにやってくれた。さらっとBBS上に公開したよー、とのお知らせが!

というわけで、そのBizarre CreationsのXBLAタイトル用のLeadboard取得WebServiceの解説。呼び出し方法が数字直打ちで分かりづらければ、帰ってくる値も素の配列という分かりづらさなので、私が調べた範囲で簡単に解説します。いや、数字ぽてぽて打って確認するだけで別に手間でもなんでもないですけどね。

getLeaderboardは順位のランキング。Overallって奴ですね。パラメータはgameIdとleaderboardIdはあとで解説します。rankToStartで開始する順位を、numToShowで取得する量を決めます。残念ながらrankToStartは901まで、numToShowも有効なのは100まで、ということで1000位までしか取得できません。十分ですけど。

getLeaderboardNearGamertagは任意のゲーマータグの人の前後のランキングを取得する。gamerTagはゲーマータグ、numToShowは前後の量。こちらのnumToShowは有効な値は101までになっています。自分の前に50人+自分の後ろに50人、ということですね。

さて、gameIdですけど、0はGWRE1、1はBoomBoomRocket、2はGWRE2。GWRE1のleaderboardIdは、0がEVOLVED、1がRETRO。BoomBoomRocketは割愛(笑) GWRE2は、0=Deadline,1=Evolved,2=Sequence,3=Waves,4=Pacifism,5=Kingでした。変な並び順ですけど気にしないことにしましょう。いや、めっちゃ気になるけど。

で、取得できるxmlは全部stringというそっけなさ。一番目が取得したデータの個数、それ以降は3つ区切りで「順位、ゲーマータグ、スコア」になっているようです。

ついでにRESTでの取得。http://www.bizarrecreations.com/XBLLeaderboardSvc/Service.asmx/getLeaderboardNearGamertag?gameId=2&leaderboardId=4&gamerTag=SeaWeeze&numToShow=11、このURLはgameIdが2なのでGWRE2、leaderboardIdが4なのでPacifism、gamerTagがSeaWeezeなので、まあ、私ですね、で、numToShowが11なので前後5人ずつのランキングが取得出来ます。

いやあ、素晴らしいですね。色々と素っ気なさ過ぎじゃね?って気がしなくもないですが、それが非公開のサービスを一般向けに公開してあげる、という優しさに感じられて嬉しかったりして。実際問題、こんなに大盤振る舞いで公開してくれている会社なんて無いですからねえ。今後もBizarreに続いてくれると(Bungieぐらいかな、もしやるとしても)嬉しいし、その勢いで次世代Xboxでは公開が当然、みたいな形になってくれれば、なお嬉しい。

そのためにも、せっかく公開してくれたこのサービスを使って何かを作らなければ!と思うんだけど、いざ何かっていうと何も思い浮かばない。プログラム流用で、ランキングが100落ちる度にTwitterに投稿するツールとか、どうでもいいネタしか浮かばない。というわけで、何かアイディアがあればください。

Search/Archive

Category

Profile


Yoshifumi Kawai
Microsoft MVP for Visual Studio and Development Technologies(C#)

April 2011
|
July 2019

Twitter:@neuecc
GitHub:neuecc
ils@neue.cc