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やってるし……。

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に投稿するツールとか、どうでもいいネタしか浮かばない。というわけで、何かアイディアがあればください。

Profile

Yoshifumi Kawai

Cysharp, Inc
CEO/CTO

Microsoft MVP for Developer Technologies(C#)
April 2011
|
July 2022

Twitter:@neuecc GitHub:neuecc

Archive