PSUサービス終了

blog20120927-PSUTerminated

なんだかんだで6年。今年になってからは後継作PSO2Link をやることが多かったのでやる時間があまりなかったものの、サービス開始から2年くらいはかなりのめり込んだ作品。開始当初は不具合の連続でしたが、それが楽しかった。

個人的な印象は前作PSOが「静」で本作PSUは「動」。変わらない面白さのPSOと激しく変化したPSU。これは私がPSOを始めたのがある程度中身の固まった初代PC版(PSOBBではない)でPSOの初期を知らないせいもあるでしょう。しかしそれを抜いても、

  • 外見(種族と衣装)と中身(職業)の結びつきを弱め自由な組み合わせを認める。
  • フォトンアーツによる派手な戦闘。サービス後も幾度か新技が追加された。
  • 課金体制も変えたw

などの点でPSUに動的なものを感じてしまう。あと一時期の凄まじいアイテム&メセタ(ゲーム内貨幣)のインフレとか。

惜しむらくはPC以外のプレイ環境としてPS3ではなくPS2を選んでしまったこと。当時の稼働台数を考えればマーケティングとしてはPS2という選択になるのでしょうが、昨今のネトゲは飽きられないように新機能・新アイテムを追加し続けてなんぼ、それに大きな制限を設けてしまったと思ってますです。

最期は多くの人が一階のロビーに集まり、まるで爆竹のように吹き出し発言を連発しておりました。日頃はこれ(パーンと音のする発言)を連発されると「やかましい!」と言いたくなるのですが、この日ばかりは心地よかったり。

最後に。最大の不満は自キャラ作成時とプレイ時で顔の印象がかなり変わってしまうことだ! PSO2でもましになったけど、まだあるし (T^T)


— posted by mu at 01:24 am   commentComment [3]  pingTrackBack [0]

逆走

blog20120920-MMOnlineReverseWay

最近PSO2Link もやりつつ、まどか☆マギカオンラインLink に浮気しております。PSO2やるにはまとまった時間が欲しくなるのですが、こちらは細かい時間でもできるかなと思いきや結構時間食う…

画像は本日出会ったバグ画面。基本スタイルはすごろく。このエリアでは左下に居るボスに向かっておりまして、逆走はありません。やっている人なら分かると思いますが、このようにボスに遠ざかる方向に進むのはありえないわけです。

で、ふたコマ目で左上のドアに向かえばグルっと回ってボスに辿り着くいつものコース、右上は本来有り得ない逆走。行きたくなるよね?逆走w

結果は3コマ目の箇所で前にも後にも進めず、40ターン時間切れによりクエスト失敗でした (´・ω・`)

— posted by mu at 11:22 pm   commentComment [0]  pingTrackBack [0]

Dictonary<T1,T2>.ToString()

C# 3.0 4.0以降。LINQのメソッド式表現はほとんど使わない私ですが、これLink はちょっと感動。

string.Join(",", dictonary.Select(kv => kv.Key.ToString() + "=" + kv.Value.ToString()));

[参考] Is there anyway to handy convert a dictionary to String? (stackoverflow)Link

[2012/9/7 追記] よく考えるとクエリ形式でも書けます。LINQによる簡潔な表現としての感動は変わらず。
string.Join(",", from kv in dictionary select kv.Key.ToString() + "=" + kv.Key.ToString());
[2012/9/7 追記] String.Join(String, IEnumerable<String>)が実装されたのは.NET Framework4以降のようなので、上記はC# 4.0以降で有効。LINQ式の最後に.ToArray()を付ければC# 3.0でも行けるでしょう(簡潔さが悪化するので感動は薄れる ^ ^;)。
string.Join(",", dictonary.Select(kv => kv.Key.ToString() + "=" + kv.Value.ToString()).ToArray());
string.Join(",", (from kv in dictionary select kv.Key.ToString() + "=" + kv.Key.ToString()).ToArray());

— posted by mu at 07:32 pm   commentComment [0]  pingTrackBack [0]

古いMSIをUACに対応させる

備忘録。

Windows Vistaより前に作られたMSIファイルはUACを知らないので、管理者権限が取れずに不具合が起こるっぽい。実際使っていたインストーラーがWindows7でエラーを出して途中で落ちてしまう。

対策はここLink に書いてある通り、Orcaを使ってMSIファイルを改造する。

  • CustomActionの○○○.install/uninstall/commit/rollbackの項目のType値を2048増加させる
  • Tools→OptionからDatabaseタブに移動、"Copy embedded streams during 'Save As'にチェック (こっちは必須なのか不明)

以上。Type値の2048(=0800h)に管理者権限昇格のビットが定義されているんでしょうねぇ。

blog20100905-MSI4UAC
画像は+2048した後

[ 参考 ]

— posted by mu at 08:51 pm   commentComment [0]  pingTrackBack [0]

バイト列から.NETアセンブリをロード

.NETにはアセンブリ(クラスの実行部分を記述した物、いわばプログラム、多くの場合DLL形式)を実行時動的に読み込み、プログラム実行に使用する機能があります。よく使われるケースがプラグイン。プラグインファイルの中身が.NET形式のDLLになっていて、プログラム起動時に読み込み実行します。

で、今回来たミッション。

  1. サーバからオブジェクトのシリアライズされたデータが来るので、クライアントで逆シリアライズする
  2. ただしそのデータに対応するアセンブリがクライアントに組み込まれているとは限らない。無い場合はサーバにおいてあるから、適当に見つけて動的に読み込む。

プラグインファイルがサーバにあるって感じでしょうか。サーバから取ってくるアセンブリはファイルではなく、バイト配列(byte[])。中身は元々ファイルだったDLLそのままなのでローカルでそのバイト列をファイルに書き込んでから読むと言う方法もありますが、直接バイト列から読みこむSystem.Reflection.Assembly.Load(byte[])なんてのもあるのでそちらを使用。

が、アセンブリを読み込んだ後逆シリアルを行おうとすると、SerializationException。メッセージは"Unable to find assembly 'hoge'"つまり読み込んだはずのアセンブリが無かったことにされてしまっている。はて?

とりあえず見つけた解決法は以下のもの。

  1. .NET Frameworkはアセンブリが見つからないとき、AppDomain.CurrentDomain.AssemblyResolveイベントを投げるので、あらかじめハンドラをセットしておく
  2. 逆シリアライズ時にこのイベントが捕まるので、引数から必要とされるアセンブリの名前を引き出す
  3. サーバから該当するアセンブリをダウンロード
  4. ダウンロードしたデータをAssembly.Load(byte[])で読み込み、このメソッドの返り値を「イベントハンドラの返り値」にする

こうしておくとイベントハンドラから返されたアセンブリを使って逆シリアライズが進みます。

  • 試してないけどロードしたアセンブリがさらに別のアセンブリに依存していてそれが必要なら、またイベントが飛んでくるんじゃないでしょうかねぇ。(*1 追記参照)
  • 同じアプリケーションドメインである限りは、一度読み込まれたアセンブリに対してこのイベントが再び飛んでくることは無いようです。
  • イベントハンドラに返り値があるのかと奇妙に思われるかもしれませんが、あります。C#にとってイベントとデリゲートの違いって、デリゲートは=演算子が使えるくらいでしょうか?
[参考]

[ 2012/8/23 追記 ] 図らずも(*1)を別の方法で確認。自家製イベントハンドラがアセンブリを取ってくるためにサーバー通信用のアセンブリが必要なのですが、これが無い→通信アセンブリを取るためにAssemblyResolveイベント→同じハンドラで受け取りやっぱり通信アセンブリが無い、の無限再帰呼び出し orz。通信アセンブリはGACから取れるはずなのですが、もしかしてこのイベントの方が優先度上なの?

— posted by mu at 05:53 pm   commentComment [0]  pingTrackBack [0]

T: Y: ALL: Online:
ThemeSwitch
  • Basic
Created in 0.0160 sec.
prev
2024.5
next
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31