TOPページへ

日記帳(2006.11)

過去の日記へ


2006/11/29(水)

マクロゲームパッドについて。
目的は26日の日記の通りですが、これ実はものすごく簡単にできるんですな。

まぁ、EZ-USBを使ってるのでそれないとスタートラインに立てませんが、昔のUSB-シリアル変換機やらケータイ通信ケーブルやらに入っていた奴を改造しても良し、オプティマイズさんからmini EZ-USBを購入しても良し。

肝心な点はですねUSBケーブルの先にこのIC(と最低限の周辺回路)さえつながっていればOKってことですよ。

最低限ってなにさ、といいますと
0.開発環境はメーカー提供
 Cypressから無償でダウンロードできます。

1.ドライバもメーカー提供
 上記環境に入ってきます。

2.ROM不要
 USBデバイスとして動作するためのプログラム、いわゆるファームウェアを格納するためのROMも、敢えて言うなら要りません。
USBポートに挿した時はまず開発環境と通信するためだけのデバイスとしてデフォルトのドライバがロードされますので、そこから書き込みツール(これもフリーの開発環境に同梱)を使って書き込んでやれば済むんですね。
まぁ毎回やればですけど。
毎回やるのが面倒であればEEPROMを乗っけておいてそこからロードするのが吉。

3.入出力機器不要
 ぶっちゃけ、ボタンの一つもないデバイスが「パッド」を名乗っていいのかよと思わんでもないですが、不要です。
全ての操作はUSBの通信上でPC側から操作できます。というか操作できるように作っておく。
ただまぁボタンで動作開始停止くらい出来たほうが、それからLEDで動作中かどうかくらいは判ったほうがスクリプトのデバッグは楽ですけどね。

てな感じでなんもいらねんす。
USBとしてつながっていて、「標準HIDのJOYSTICKでーす」と名乗り、ゲームパッド相当のレポートを定期的に上げてりゃ実際は十字キーの一つも無くてもOKOK。

さて、では肝心のレポートの内容はどうするか。
今回の目的にピンポイントでアジャストするのであればこんな感じです。

(※リストは読み飛ばしてOK)
 1.「■ボタンのみ押下のデータを送信」
 2.「1秒待つ」(ホールド時間)
 3.「全ボタンリリースのデータを送信」
 4.「1秒待つ」(インターバルタイマ)
 5.「1〜4までを10回繰返し」
 6.「●ボタンのみ押下のデータを送信」
 7.「1秒待つ」(ホールド時間)
 8.「全ボタンリリースのデータを送信」
 9.「1秒待つ」(インターバルタイマ)
 10.「6〜9までを2回繰返し」(PPチャージメニュー→全チャージ選択)
 11.「↑ボタンのみ押下のデータを送信」(いいえ→はい選択)  12.「1秒待つ」(ホールド時間)
 13.「全ボタンリリースのデータを送信」
 14.「1秒待つ」(インターバルタイマ)
 ・・・
飽きた。
とにかくこんな感じで魔法を使って使って使って、PPが無くなったらPPチャージマシンで買うのですが、デバイス側にこのような動作を固定的に持たせてしまうと他に何もできません。
そこはあなた、技術屋ですから 「汎用性」 は永遠の命題です。

内部に命令のデータ列を作成し、ポインタを進めていく、いわば仮想アセンブラを構築してみます。
このデータ列を外部(USB経由のPC)から編集できるようにしておけば、好きなように動作を変えられるわけですよ。

アセンブラ経験の無い人向けに言うと、この命令のデータ列ってのは言ってみればスクリプト言語の各行のようなもの。そこまで汎用性はありませんが。
スクリプトも無しで言うと・・・難しいな、すごろくのマス目みたいなもの(※)か。

※「みたいなもの」
たとえのたとえをしだすと最初から判ってる人には「うまい!」と映るけど判らないからこそ読んでる人にはよけいわからないという問題が出てきますな。
オブジェクト指向の説明をするのに「犬というオブジェクトにワンワンと鳴くメソッドが」なんて説明されても解りゃしねーよwwww

さて、なにで実現するかですが、ただの配列、ポインタの配列、構造体の配列、構造体の連結リスト、等が考えられます。
汎用性を考えるのであれば連結リスト・・・と言いたいんですが、OSなどないヒープなどないmallocなにそれという環境では一般的な (PC上の) プログラミング作法で言う優劣とは話が違います。
そもそもデータ領域って、128バイトしかない。ぶはっ(笑
まぁ特に速度的な問題(※)があるわけじゃないのでXdata領域を使うことにしますが、とにかく容量オーバーヘッド最優先として単純配列としました。
配列の添え字にあたるインデックスを進めていく、この仮想マシンにとってはこれがプログラムカウンタに該当します。

※Xdata領域というのはCPUの外にあるメモリ空間なのでデータポインタ経由でのアクセスになります。
アセンブルリストを見ると判りますが、ダイレクトアクセスできるメモリに比べたらアクセスが遅い。
てか、この石の場合IOポートのレジスタすらこちらにあるのでポートアクセスの限界値はこの設計が足枷になっています。

まず必要な要素を抽出します。
■ボタンデータ更新
元々ボタン押下マクロが目的ですから必須です。
元にしたゲームパッドが16ボタンだった(※)ので2バイトのデータを持ちます。
前の日記に書いた通り、ステップ数圧縮のためにボタン押下コマンド自体にタイマ値を持ち、この時間だけホールドした後でボタンをリリースするという処理を設けました。
従って上の例で書いている「ホールド時間」というのは(15秒以内であれば)実際は不要です。

※何を参考にしたのか忘れたのですが、元のパッドというのは自作のデュアルショック→USB標準ゲームパッド変換機です。
このレポート形式が2軸16ボタンでした。
入力はアナログ固定で、2軸というのは左スティックの操作になります。十字キーは単なるボタン1、2、3、4です。
左右スティックの押し込みのL3、R3も含めて16ボタンですが、そういえば右スティックのぐりぐり操作が一切勘案されていませんね。
当時の俺は何を考えていたんでしょうか。
自作パッドでPSUやろうとして視点変更できずにへこみました。

さっそく右スティック対応してるパッドのレポートを透視してみると、Z軸をなぜか2つ、さらにZ軸回転という3軸を持っています。
なぞだ。。。
十字キーは単なるボタンじゃなくてハットスイッチとして8方向入力になっているみたいですね。
こいつはヌルステート(何でもないよ状態)を持つという、触ったことの無いレポートなので、結論としてあーこりゃめんどうだわ別に視点変えなくていいかになりました。

■WAIT処理
何秒待つ、という操作が必要になると思われますので実装すべきです。
余談ながらEZ-USBはFullSpeedデバイスなのでホストからSOFパケットが得られます。
どういうことかというと、1msに一度、SOF割り込みがかかるのでここでtickしてやれば1msの基準カウントが作れるのです。
概ねゲーム側のサンプリングレートが60程度なので1/60ということで16ms数えて一度レポートを送るという基本構造をとっています。
WAITに話を戻すと、この1msを数えて500msでグローバルカウンタを1進めることにしました。
さらにこれを基本単位として使います。つまりコマンド押下時間は0.5秒刻みで0〜255まで指定可能、実時間で0〜127.5秒遅延をかけることが出来ます。
おまけ機能として指定時間待った後、普通なら次の命令を実行しますが、指定アドレスへジャンプする機能も付けておきました。

■LOOP処理
命令をプログラミング可能とするためには必須です。
グローバルにループカウンタを持ち、これが指定の値に満たなければカウンタを進めつつ指定のアドレスまでジャンプします。
これを繰り返して指定回数に達した時に通過します。

■軸データ更新処理
元にしたゲームパッドが2軸だったので、X軸、Y軸の値を任意に更新します。
分解能はそれぞれ8ビット。
ボタンデータと同様にホールド時間を設定できます。
ただしこちらは0.5秒単位では微妙な調整ができないため、16msを基準カウントに変更しました。

■命令終端
命令配列の未使用部分はこれで埋めておきます。
何もしない、プログラムカウンタも進めない、事実上の停止。
暴走を防ぐためです。

■NOP
何もしないけれどプログラムカウンタだけは進める命令。
アセンブラ経験者には当たり前の機能なのですが、無いと不便です。
命令リストを配列で実装したため、挿入や削除が不便。例えば途中で1命令削除する場合、NOPで埋めることで何事も無く次の処理へ進みます。
ジャンプ先の調整にも使います。

ということで、命令の種類は6。
うーん微妙ながらもう追加しないだろ・・・ということで8あれば充分かな。ということは3ビットで表現できますね。

結果この擬似アセンブラの書式は以下のようになりました。(括弧内はビット数)

 命令コード(3)   データ0(5) 
データ1(8)
データ2(8)


元々Optimizeさんのスケルトンを流用させていただいていますので、構造的に弄るところは初期化処理、ポーリング関数、及び各種割り込み処理だけです。
本当はレポートディスクリプタのやり取りも実装する必要がありますが、ありましたが、過去に実装したものを流用していて、何をどうやったか忘れましたから!残念!

まず初期化関数。
ポートを使わないのであれば全部出力のHにして終わりっしょ。
試作品は8ビット入力ポートと3ビット(超適当)程度のLED出力を持ちますので適当にコンフィグしてます。
ここってUSBポートに挿した時くらいしか通らないので、運用中には頼りになりません。
はっきりいってコンフィグ時に問題なけりゃおk(=゚ω゚)b
後はポーリングの方で動いちゃいますけん。

肝心のポーリング関数。
本当のメインルーチンから一定周期で呼ばれる、というか何もすることが無い時は常時ここが回ってくるので事実上のユーザメインです。

この中には大別して3つの処理を実装しています。

まずは命令ディスパッチャ。
上記オペコード先頭バイトの上位3ビットを取り出してディスパッチャでそれぞれの命令解釈ルーチンを呼びます。
その中でデータ1とデータ2、BUTTONとWAIT、AXISに関してはデータ0も使用して動作を決定し、条件を満たすまで状態をキープします。
指定条件をクリアすれば仮想プログラムカウンタを1進める、つまり次の命令を処理します。

次のブロックでは一応ポート入力を監視していて、ポートにぶら下げたスイッチ類で上下左右の操作、いくつかのボタン押下、及びマクロ動作の開始停止を行えます。
まぁ、・・・おまけです。
あると便利なんだけどね・・・プルアップとか、チャタリング対策に鈍らせるか、ソフト側で複数回読むか・・・とか面倒になるのでなきゃ無いでもおk(=゚ω゚)b

最後のブロックでは16ms周期タイマがタイムアウトしてるか、あとエンドポイントをUSBコントローラが使ってないか確認した上で、レポートを作り上げてエンドポイント(というか特定レジスタというだけだが)にぶちこみまんもす。
これで勝手にPCが読んでくれてゲーム内でキャラを動かしてくれるという寸法だっ。

残る割り込み処理は、まぁディスクリプタ関係を除くと使っているのはSOF割り込みとOUTバッファ割り込みのみ。
SOFってのは上でも述べた通りホストから1ms周期でそういうパケットが来るので(正しく設定していれば) 1ms周期で割り込みがかかるんすわ。
これをカウントしておけば1msタイマになる。まぁ正確かどうかはともかくとして通信相手がくれる周期だから相手のニーズにはピッタンコなのでおk(=゚ω゚)b
ピッタンコというのは一度ずれたら二度と合わないということでもありますが。

OUTバッファ到来割り込みはPCからデータが来たぜーという割り込み。
レベルトリガではなくエッジなので、来た時に取りこぼすと二度とアサートされないという情け容赦無い仕様です。
この中に簡単な解釈ルーチンを仕込んでます。

話はそれますがストリングディスクリプタというとろにベンダ名やらプロダクト名やらを入れられます。
「新しいデバイスが検出されますた」ポップアップに出てくる名前ですな。
あんま、どうかとは思いますが・・・ここに日本語で打ちたい場合、UTF-16で書いてやればOKです。
リトルエンディアンなので気をつけて!


ところでPCからの設定や操作となると、PC→デバイス方向のデータを解釈しなくてはなりません。
USBの話はデバイスからPCに向かう方向をINとしますので、デバイスのファームを書いているときは自分に向かってくるトランザクションがOUTです。
ここはもう念仏のように唱えながらでないとミスります。
で、そのOUTバッファにデータが入ったよ割り込みというのが元々ありますんで (超楽だ) この中で予め自分ルールで決めたデータが来たらマクロ動作開始、停止、命令の追加、あるいは削除、等々をコールしてやりゃいいんです。

最終的に以下のコマンドを実装しました。
■動作開始
 文字通り、マクロ動作を開始します。
 動作中に受けた場合は無視です。
■動作停止
 文字通りマクロ動作を停止します。  停止中に受信した場合は無視です。
■命令上書き
 追加や削除よりも汎用的に、単なる上書きとしました。
 上書きコマンドに続けてアドレスと命令、データ0、1、2を送ります。
 同時に動作停止を行います。
■命令全削除
 全てがEOIで埋まります。
 同時に動作停止を行います。
 この状態で動作開始しても即終了となります。
■命令初期化
 デバイスが内部で持っている組み込み命令セットをロードします。
 本来不要なものですが、自分が使うものを石に焼いてある感じです。


さて、これらを送るPC側のソフトが必要になります。
USBとの通信てのはシリアルポートに比べるとめったやたらと敷居が高くて泣きそうですが、まずはHIDを使ってることでドライバは不要、そしてAPIコールに関する記述はJan Axelson氏の 「USB コンプリート」 という本に載っています。
載っていますどころか、HIDデバイスの見つけ方からデータの読み書きの方法までサンプルコードが載っています。VC++でも、VBでも。
ただ問題は、誤記誤植の嵐なんですな。ぶはっwww
最初は一字一句本に赤字で訂正しながらコーディングしてましたがだめだこりゃうごかねーというわけで絶望したところで氏のサイト、「Lakeview Research」でサンプルがそのまんま公開されていることに気づきました。
ひゃっほいヽ(゚∀゚)ノ

・・・・って、本の内容とだいぶ違うな(−_−;
構造体のメンバ自体違うんすけど、いいのかこの本。

そしてできた書き換えマシン。

メインフォーム
初期化、とかデバイスを見つけた、とかでポッとパイロットランプが点くような表現がしたかったのですがどうすんだろ絵を貼るのか?
すんませんVBよく知らんもんで、テキストで、ただの□と塗った■で表現しています。
うっさい!
5つの窓はデバイス(いんちきゲームパッド)へ送る5バイトのデータ。
送りたいデータが5バイト未満の時は適当に埋めますというか埋めなきゃ0送るしデバイス側は見ないので何でもおk

画面中央のDELだのINITだののボタンで前述の「マクロ動作開始/停止」、「プログラム全消去」、「プログラム初期化」等のコマンドを上記窓にセットします。
送るのは「送信」ボタンです。

最低限これだけで全てを実行できるのですが、マクロ自体は脳内でHEX変換して手打ちしなくてはなりません。
これを編集容易なようにと、増築改築を繰り返して次のフォームができました。

リスト編集フォーム1
右のグリッドがマクロです。
しまったもうわすれてる!
各コマンドのデータは脳内エンコードすると結構つらいので視覚的に設定できるフレームを用意します。
操作としては右のグリッドでスクリプトの実行行を選択し、実行する内容を左のフレームで設定します。

この画面はボタン押下データを設定しています。
市販品を見ると十字キーはボタンじゃなくてハットスイッチ(POV)(※)扱いになってるパッドが多いんですね。(’’
まぁボタンだと上と下を同時に押せちゃうし。
けどPOVだと使えないゲームとかがあるらしく、不評も聞いたのでボタンに戻しました。

※・・・ハットスイッチといっても形状の話であって、要はニュートラル状態と任意の方向へ倒した状態を持つ入力デバイス。
入力データは「方向」なので上下の同時入力とか有り得ない。
上下左右と、隣り合うボタンの同時押しによる斜めを加えた8方向デバイスが一般的。
8方向なので3ビットで表現できるが、どの方向にも倒していないヌルステートという状態も送らなくてはならないため実際には4ビット必要。

リスト編集フォーム2
軸操作コマンドです。
この時点ではXY軸しか実装していないためデュアルショックの左スティックをどう操作するかというコマンドになります。
スライドバーと数値入力の両立はともかくとして、丸印をドラッグして視覚的にX-Yを制御したくて無駄に苦労しました。
Shapeはドラッグできないんすよね。
なのでShapeの座標とマウスボタン押下座標の差分、動かせる座標の範囲でクリップしてマウスムーブ中は常時その差分だけShapeの座標を更新するという無理矢理んぐな実装をしています。
こういう変化球は大好きです。
きっと、知ってる人がやればあっさりできるようなコントロールがあるんだろうな。

なんやかやと自分が便利なように付け加えて行った設計無き実装ですが各行にコメント追加やファイルへの読み書きも加わってそれなりに使えるツールとなりました。
これだけの内容をあっさり作れるのがVBのすごいところ。

やべ、情報が足りねぇ!と思ってもきちんとクラス化してあればプロパティを追加しちゃえばいいだけで。
10日でわかるVBとかの本を真に受けてしまうとVBはフォームにイベントプロシージャを書いてく言語だと誤解してしまいますが、きちんとデータ構造を考えてクラス化しておかないと後々の増改築ができません。
フォームなど入出力に過ぎないんです。

ああ疲れた。
自己満足終わり。

で、マクロの実装が楽しくて、実際のレベル上げはマクロの試験という感じ。
もうbuff系はそれぞれ最高レベルくらいまで上がっちゃったのでもうやってませんorz


2006/11/27(月)

キティちゃんのマフラー!o(;Д;)o
キティちゃんのマフラー!o(;Д;)o
キティちゃんのマフラー!o(;Д;)o
キティちゃんのマフラー!o(;Д;)o
キティちゃんのマフラー!o(;Д;)o
キティちゃんのマフラー!o(;Д;)o
キティちゃんのマフラー!o(;Д;)o
キティちゃんのマフラー!o(;Д;)o
キティちゃんのマフラー!o(;Д;)o
キティちゃんのマフラー!o(;Д;)o

突如泣き出したもえぞう。
デンジャラス!

日曜、西松屋へ買い物に行ったとき、マフラーを一緒に物色しました。
で、赤くてキティちゃんの飾りのついたマフラーを気に入ったらしいのですが、一回首に巻いてみたら後は知らん顔で傘や長靴などを漁っています。
「これがいいの?」「どれにする?」といくら呼んでも振り向きもせず。そっちがその気ならと買うのをやめて帰りました。
別に怒ってもう帰る!と引きずり戻したわけじゃないすよ?ご機嫌で他の買い物をして、抱っこで店を出たんです。

ところが店を出たとたん、「マフラー!キティちゃんのマフラー!!!」

おまえが無視したんじゃねーか。

俺も悪い癖で非論理的な要求には意固地になってしまうので断固拒否。
泣き叫びながら走り出す車は、後にする駐車場がベビー用品店でなければ誘拐に見えたかもしれん。

まぁ、あれだ、スイッチが入ってしまっただけで別にマフラーにご執心じゃないんすよね。こういう場合。
お年頃ですから。
なので話題を少しずつそらしつつ、さらに別の嫌なことを作ってやってそれを解消してやりさらに飴という技で仲直り。
この場合はスーパーの駐車場に着いたのにママが一人で買い物に行ってしまうという状況で、「じゃぁ一緒に追いかけようか」が効く!
スーパーでは子供用の小さな買い物籠が用意されてるので 「お手伝いして」 と籠を持たせればご機嫌。

基本が自転車なので、もう少し寒くなったらマフラーは買うかもしれんけど。

ところでですね、キャラクタ商品ってどうなんすかね。
俺が子供の頃、キャラクタ商品なんて買ってもらった記憶が無いです。
というか、親にしてみればたまには買った(親戚がくれた?)かもしれんのだけど、それが何のキャラだか知らなかったみたいなんですね。

幼稚園とかの時はともかく、小学校になってもいわゆるキャラクタブランドってのはあるわけですよ。
当時だとガンダムのカンペンケースとかありましたね。とかくそういったものと無縁のごく普通の文房具なんかは、子供にとってはある意味 機能欠如に見えてしまうんですね。
みんなにはあって自分に無いもの、という感覚がありました。

この年になってみると実際のところキャラクタ商品もくだらないブランド物に見えるわけですが、だからといってきちんとしたパテント商品であればそこそこの品質を保っていることも確か。
複雑だ・・・

いわゆるブランド物をただの自己顕示欲と見るか品質と見るか(※)に近いものがありますが、キャラものはやっぱりロイヤリティ分高いんですよね。質の分に上乗せして。

※・・・質ってか、プラダの三角形つけただけのビニール袋がウン万円とか、悪ふざけとしか思えんけど。

でね、見渡してみるとうち、もうキャラクタ商品の山じゃないすか。
すでにおもいっきりやられてるな。おれ。
子供用品なんてすぐに使えなくなるのにねぇ・・・


閑話休題。
すかいらーく系のファミレスへ行くと、入り口(待合室?)におもちゃコーナーがありますよね?
待ってる間遊んでねコーナーならいざ知らず、単なる商品陳列じゃないすか。
子供が遊び始めるのを、買う気が無い親としては止めざるを得んのだけど、あれってもしかして壊れてOKの遊び用なのかね。
子供を篭絡して財布の紐を緩める作戦というのは営業的には常道なのかもしれんけど、はっきり言って腹が立ちます。
たぶん、最初にやったところは待ち客から小銭を吸い上げつつ逃がさない効果とかで社内で表彰されたんじゃないすかね。
営業的に素晴らしい手法が、客としてみたら迷惑千万ってことは多々あります。

てか、俺はこれがいやでスカイラーク系は敬遠するんだけど小銭吸い上げ狙いで本来の売り上げが落ちてたり、しないんだろうか。

営業都市伝説の一つに、味の素の売り上げを増やすために穴径を広げて消費量を増やしたというやつがありますね?
あれも販売業績的には表彰状もんでしょうが消費者としては大迷惑なんすよね。。。
ちなみに味の素は公式にこの話を否定しています。
どっちが後付けの理由かは怪しいけど。


2006/11/26(日)

こきおろしてるPSUですが、結局遊んでいます。
子供が小さくて時間が取れない家庭でもそこそこ遊べるのがいいね。

バランシングに関しては結局レベル上げオンラインなので、「廃」な人たちはレベルキャップが解禁されるまで帰ってきませんが。

ところで先日解禁されたbuff/debuffですが、かなり謎な実装です。
補助魔法という感じかな、味方のステータスを一時的に上げる、敵のステータスを一時的に下げる効果を持つのですが、この効果が謎すぎ。
魔法自体のレベルが30まであるにも関わらず、効果の大きさ、効果時間とも11、21レベルでステップ的に上昇するのみでその間は全く変化がありません。
つまり21に到達したら30まで上げる意味がわからない。
もしかしたら上昇率にレベルが係数として入っているのかもしれんけど、たぶんそれは否定されてるんでしょう。
またdebuffは必中じゃないみたいですから命中率に影響が出るのかもしれません。

しかしそれにしても目に見える効果がぜんぜん変わらんのが謎過ぎる。ステップ成長にしたのは何か思惑があってのことなのか、単にスロープ成長だと実装できなかったのか。。。

ともかく、基本職(Lv20キャップあり)ならLv11まで、上級職ならLv21まで育てることが目的になりますので、ひたすらレベル上げをすることになります。
普通に使っていてなんとなくレベルが上がってる、のが狙いなのでしょうがそこはそれ、他人とパーティーを組む場合は最大限のbuffを期待されていると思ってしまいますからFoとしては促成栽培したいんですね。

で、Buff系は重ね掛けができます。
攻撃力アップをかけて、その後でまた同じ魔法をかける。これで効果はぜんぜん変わらないんだけど (効果時間はリセットされるから多少長くなるけど) 経験値はちゃんと2回分入るんすね。
それから効果の及んだ人数に比例するようです。
これを利用して、敵もいないところでひたすらみんなでBuffし合って促成栽培する「補助育成部屋」なるパーティーを組んで、PPチャージの傍で入れ替わり立ち代り補助魔法を繰り返すという手法がとられているようです。

間抜けな仕様を逆手に取ってるわけで別にチートしてるわけでもなし、マンガよみながらボタン連打してりゃレベル上がるなら気楽なもんすね。
(もちろん嫌う人もいるみたいです)

で、俺としてはボタン連打なんてパッドにやらせりゃいいじゃない派。
こんな人間味の無い繰返し操作こそ機械にやらすべき。
だけど、俺なりに線引きがあって、サーバからのデータを勝手に解釈したり、クライアントのメモリを勝手に参照したりして偽造したキーストロークを送るようなのは黒。
クライアント−サーバ共に全く関与せず、マウス、キーボード、ゲームパッド、ディスプレイといった人間が普通に使うコンソールを操作する人間の代わりのロボは白。

俺ラインね。

というわけで、ZT4thを流用して汎用ゲームパッドを作成。
ぶっちゃけデータ領域が絶望的に足りないのでもうデュアルショックとの通信部を丸ごと削除し、連打だけでは味気ないのでその他のボタン操作も可能なようにスクリプトを解釈する仮想マシンを組み込んでみました。
命令コードとデータ1、2程度、命令はBUTTON押下バーストと、タイマによるWAIT、カウンタによるLOOP、スクリプトの編集が容易なようにNOPと命令終端のEOIを仕込んで、おおなんか擬似アセンブラになってきたぞ。

これにVBで適当に作ったアプリから仮想プログラムを書き換えられるようなIFをでっちあげて、汎用マクロパッド!
しかしRAM容量が厳しくて24段しか実装できんかった。

こうなってくるともう何が目的だかわからなくなってくるのが俺のあほなところ。
マクロパッドのチューニングが通勤時の日課になって来ます。
命令コードは3ビットで充分なので下位5ビットをデータ0としてボタン押下保持時間に流用。
これでボタンを押して放すだけで「押下」「WAIT」「リリース」「WAIT」などと4段もしていたのが「押下→HOLD→リリース」「WAIT」の2段に圧縮できた。

ちなみに実際にPSUに使うとですね、ただ立って魔法の詠唱をしただけで杖をぶ〜んと振り回すそのモーションで自キャラの座標がずれてしまいます。
何しよんねんソニチ。
モーションキャプチャの結果がこの微妙なズレなのか。
結果として、適当な回数魔法→PPチャージマシンを使ってチャージを繰り返すはずが、しばらくするとPPチャージマシンから遥か離れた位置まで遠ざかってしまいチャージできません。
空振り空振りorz


2006/11/20(月)

またkddiの小野寺社長が何か仰ってるらしいです。

「インセンティブなければワンセグの普及もない」

相変わらず現世におられないというか、ドリーミーというか、「ケータイにリセットボタン付けたい」発言の時もそうですが電機業界の誰もが思っていても人として口にしちゃいかんことを口にする人だな。
だからkiddyなんて揶揄されんだぜ。

インセンティブ制によって不当に安いワンセグケータイとのバトルを強いられて消えていった「ケータイでないワンセグ機器」というジャンルをどう思っているんでしょうか。

機能と価格のバランスが需要と供給の交点できっちり折り合いがつかなくなってきているのはケータイの安売りの貢献するところが大きいと思います。
俺たち機器メーカーとしてはケータイの小売価格と比較して高ぇと言われるのが迷惑なんすよね。


2006/11/19(日)

いや〜〜〜、キャラクタ商品って、ほんっっっっっっっっっとに恐ろしいものですね。

顔がついてりゃ中身関係ないもの。


2006/11/16(木)

もう一点、ROの良い点は属性の実装が良かったですね。

良かったというかPSUが良くないので回想してしまうだけで普通といえば普通だけど。。。

火→土→風(雷)→氷→火という循環方式、元ネタは五行相克といいましょうか、ジャンケンゲームと言ったほうが通りがいいかな?とにかく絶対的な勝者がいない方式です。
じゅんぐりに強弱関係が一周する。
で、これがまたキレイに強弱関係が一定ではなく、関連する魔法も属性以外の使い勝手が一定でなく、魔法しか通じない"闇"や魔法が一切通じない"聖"属性もあり、凍結することで相手を強制的に氷属性にしたり、あえて凍結を食らうことで後続の氷ダメージを軽減したり、駆け引きの妙というやつがありました。
思い出すに氷ばっかりですけどね。

そんかし状態異常が弱めだったかなぁ。。。
スネア系と沈黙は怖いけど、他のはあんまり実感がなかった気がする。


2006/11/15(水)

ROについて。
最近PSUの話ばっかりしていたため、対比としてワールドシミュレータとしての側面ばかりを強調していたけれど、今の状況はもう違います。
少なくとも古くからの知り合いの楽しみはチャットかGvG。
集団対集団でシンボルの奪い合いをします。
これはある意味、育成が終わった後の腕依存の対戦ゲームと言えなくも無い。
特に通常のPvE戦闘と異なり、DDのダメージが低減されていること、特定の極端に有利なスキル(※1)が封じられていること、この特別仕様のための専用MAPを用意していること、戦闘不能(※2)に陥ったキャラが即MAPから退去させられるため加害者被害者的な立場で対峙する状況がないこと。
これらの処置によりある意味別ゲームと化しています。

※1
基本的に相手のシンボルの破壊が目的なので、そこへ到達するために極端に有利な「バックステップ」(実装がほぼ瞬間移動)、「インデュア」(ダメージ受けても位置の干渉を受けないで強制突破)、また逆に絶対的な障害物となる「アイスウォール」等がシステムで殺されている。

※2
UOでは死んだキャラはその場に死体と所持品が放置されたりしたが、最近のMMOではそもそも「死」という直接的な表現をせず、「戦闘不能」と言う。
(そのくせ「蘇生」スキルがあったりするが)

純粋なPvPの設計に失敗した反省からか、GvGの実装はかなり良いと思いますね。
通常のゲーム内ではあまり使い勝手が良くないがGvでは工夫すれば便利、というアイテムやスキルも存在し、時折々の仕様変更により戦略定石も更新されます。
ただやはりMMOベースなので、GvGに参加しうる(集団に対して貢献し得る)キャラクタを育てるには長大な時間を要します。
これがさっくり100時間程度で参加できりゃぁ別の戦闘ゲームとして面白いんですがね。
単純に戦闘ゲームとして楽しむためにはこれが障害1。

それからやはりMMO、争奪のターゲットとなる砦が世界に20個しかないため、また回復アイテムを湯水のように浪費せにゃならんので結果砦を入手できないと大赤字となる。そういう競馬並みの一人勝ち方式なんですな。つまり結局は戦果が全て。
参加するだけで楽しいなんてのは俺みたいな回復度外視の魔法使いのみです。

そしてサーバの処理能力がしょぼいことをリソースの制限でごまかしたため少数精鋭は成り立たない、つまり人海戦術がメインとなったため戦績の安定化のためには連合を組まざるを得ない。
そして規模が大きくなればなるほど経費がかさむため安定的に戦果を上げる必要があり、もはや仕事並にコントロールしなくてはならなくなりました。
俺としては複雑なところなんですな。
厳密に管理した戦略レベルの衝突は楽しい、すげー楽しいんですが、処理落ちを筆頭にサーバの限界を計算に入れた戦術(まぁ、広義にはバグ利用も含め)は少々汚れっぽく感じるのとやっぱ遊びなのにあそこまで事前準備と2時間の集中業務をこなさなきゃいかんのがつらいす。

うちは子供がいるから問題外で脱落しとるわけですが。


2006/11/09(木)

また友達を無くしそうな発言をするけれど、最近のJ本じゃなかったソフトバンクのCMはどうも、今は亡きドリキャスを髣髴とさせる。
もっと前からかな?サターンからかも。
セガールとアンソニー、セガた三四郎、専務、ごとうよしお、・・・
ぱっと見で意味の解らない映像で惹きつけようとか、普通はやらないことをやって意表を突こうという意図はまだわかるんだけど結果として
→信者には大ウケ( ゚∀゚)
 →その他はポカーン(゜д゜)?
  →じれた信者が面白さの解説を始める
   →一般人どん引き

ドリキャスもハードは優秀だったのに営業が殺してしまった。
轍を踏んではいけない、と思う。


2006/11/08(水)

まだまだいくぜPSU。

オンしようとしたらいつもと違うメッセージが。
なんだ!?当たりか?(意味不明)と思ったら

「免許切れてんぜこの若葉マーク野郎。さっさと免許センター行ってきな。
ただしお前がRO用に溜め込んでたwebMoneyは受け取れねぇぜ覚悟しな。あばよ。」
(意訳)

単にライセンスが切れてました。
まぁそれはいいけど。

色気を出してロビーをMMO化したことが全ての足を引っ張っている、と俺が発言している件、補足しますとMOにおけるロビーは単にセッションを行うグループ結成のためのチャットルームなんですね。
だから負荷とか、あんまり気にならないし、負荷に耐えられなければ増設してその間を移動できればいいんすよ。
それにMOなんだから、極端な話オフラインで育ててオンラインで他人と遊べばいいわけで事実PSOではそうやってたプレイヤーも多かった。

これがMMO化したせいでロビーを単一の世界として保たなくちゃならなくなったんですね。
まぁ最初っからロビー形式の「ユニバース」なる言葉で世界を区切るという、MMO風の仮想世界のリアリティをあきらめた仕様なんだけど、それはまだ移動できるわけですよ。
けどそれでも分散し得ない、「世界でユニーク」を担保しなければいけないデータサーバが負荷に耐えられなかった。
結果「ワールド」という、MMOで普通に使うパラレルワールドによるロードバランスをとることになりました。
自由に移動してパーティー組めないMOって何のジョークだよ(笑)

またMO故もあってチートに弱い面はありましたが、はっきりいって別にいいじゃん。
他人のデータの破壊さえ行わなければMOではローカルでの俺TSUEEEEに終わるわけだし、他人がスプニー持ってようが(※)特に迷惑も無いんですけどMMO化したせいでそういった影響を許容できなくなってしまいました。

※PSO初期における最強射撃武器スプレッドニードル。
最強すぎる上に独特の形状を持ち、レア中のレアだったがディスク解析されたチート品が出回ったため、一時期はチートの代名詞だった。

ここで方針としてはいろいろあろうと思いますが、ソニチは過去ハードとソフトとデータの組合せを固定するなどという不当に最強な対策を以ってしても敗北した実績があります。
オフラインモードのDupe技のせいでオンラインのサーバが汚れた実績もあります。

結果、今回は最初からオフラインのデータとオンラインのデータを完全に別けるという、ある意味MOとしての大部分をあきらめた設計をしてきました。
オフで遊べないんすよ。
いや遊べますけどオンとは別物で、やったからといって何が変わるわけでもなし。
オンでの特定制限のアンロックというクソったれに延命策な影響はありますがそんな後ろ向きなプレイをして欲しかったのでしょうか?
しかもオフはストーリー素人、演出もベタ、先が読めまくり、どこかで聞いたような話のオンパレード。
はっきりいってやる気がせんです。

楽 し く M O さ せ ち く りヽ( `д)ノ

MOの深みとMMOの手軽さと依存性を欲張って 「両方の良いとこ採りをしました!」 と言いたいみたいなんですが、どっちかというと相補的、簡単に言うとメリットデメリットに相反する特徴が多いため 「酸とアルカリを混ぜて新作作りました!」 という感じ。
出来上がったのは酸としてもアルカリとしても使えないただの水と塩。

しかし明日のパッチで待望の補助魔法解禁キターヽ(゚∀゚)ノ
これでFoが皆様のお役に立てる!かも!!


2006/11/07(火)

またしてもPSUの話題。
最近のオンラインゲームでは運営会社への支払いを 「課金」 と称する謎の誤用がまかり通っているのは周知の事実。しかしどうもSEGAのリリースを見ていると、運営会社側すらそんな使い方をしているぽいんです。
「課金集中による・・・」とか。
幼児の英語教育もいいですけど、ニッホンゴ、チョト、チガウヨ〜

ところで先月のインプレッションでもボロクソに書きましたが謎のリアルラック可視化システムに俺様ご執心です。
いまや企業は効果の 「みえる化」 なんつって、透明化と言えば聞こえはいいんですがとかく結果をリアルタイムに数字で出せという論調に摩り替わっており迷惑千万。おっと違った。
PSUでですな、エンブレムの輝き方で表示される 「運の良さ」 これをゲーム中では星霊運などと呼んでおりますが(※)、日付と、種族と、性別の3パラメータによって決定されるようです。

※実は大本のファンタシースター自体を知らない人間なので何を言っても虚しいんだけど、この星霊と書いてフォトンと読ませ、剣が光るのも銃撃もフォトンの賜物、フォトンは常に君と共にあるフォトンの御加護のありますようにと、とかく全てがスターウォーズのパロディなのです。
いずれパダワン育成システムが実装されるのではないかと。

現状、公式発表では「エンブレムが輝いている日はいいことがあるかもしれません」というFAQの回答のみで、特に何に影響するとも述べられていません。
セガボイスの開発者インタビューの中ではさらに「パーティーのリーダーとして冒険に誘ってみてはいかがでしょうか」との発言が見られるため、現在ミッション内に影響が出る、つまりレア含むアイテムドロップ率への影響、レアエネミーの出現率への影響が噂されています。

そもそも将棋やチェスと違って運の要素を持つゲームですから少なからずダイスを振る機会があります。
戦闘に関して言えば命中判定、ダメージ量判定、アイテムドロップ判定、取得アイテムのランダム分配、またロビー領域で言えばアイテム合成の成功率、成功したアイテムの補正値、強化成功率。

この内、おそらくはユーザコミュニティに蓄積された経験からアイテムドロップ率と強化成功率への影響が(真偽のほどは別として)確信されているようです。

仮にこれが真実だとすると、開発元は何がしたかったのでしょうか?
今日は運が悪いから今度幸運な日に武器強化しよう、とかそんな惨めな時間稼ぎで延命を図ろうとしたのでしょうか。
結果として、幸運に見える(これは画面上で明らかに判る)人と同じ種族、性別のキャラを新規作成して武器強化だけして削除するとは考えないのでしょうか。
運が悪い日のモチベーションの低下、これを考えはしなかったのでしょうか。

そもそも武器強化は失敗するとロストするため、素材の入手から考えなくてはいけません。
有用なアイテムは高価で、これを強化するコストも高く、しかも成功率は低い。これだけハイリスクローリターンなギャンブルというのも珍しく、したがってユーザとしては神頼みでもおまじないでも良いから成功率を上げる能動的な努力は惜しまなくなる。
当然です。

となると「いいことがあるかもしれません」などという表現が非常に癇に障ります。
要するにですね、ユーザから見ると解釈の方向が逆なんですね。
永久不滅ポイントをサーバに積み立てることを目的とするコレクター型のプレイヤーはリスクを恐れるわけですから、いいこと、ではなくて悪いことの方から考えるわけです。

「いいことがあるかもしれない」 を 「確率Nで良い事象が起きる」 と言い換えるならば、同じ命題の対偶は 「確率(1−N)で良くない事象が起きる」 なんです。
これは必ず真(※)です。

※中学校で習ったと思いますが、ある命題が真であればその対偶は必ず真です。
逆と裏は真であるとは限りません。

単にコンプリメンタリな意味しかないとするとNと1−Nで良いのですが、「あるかもしれない」という言い回しからはNの方が低そうに聞こえるんですよね。
となると、確率Nを「稀」、確率(1−N)を「ほぼ確実」と言い換え、前述のFAQの回答の対偶を見てみれば

「星霊運が最高でないと良くない事がほぼ確実にある」

このように細かく展開していくわけではないと思いますが、藁にもすがる状況にあるプレイヤーは感覚的にカチンと来ているはずです。
ちなみに女ニューマンは9月10月通してまだ1度しか最高になったことが無いという不遇ぶり(※)です。

こういう薄幸の種族をサーバ側で作り出してしまうことはPSOの轍そのものです。
セクションIDは常時固定だったから非難を浴びた、そう解釈したのかもしれませんが振り返り見れば結果的に不幸と感じるグループがいるんです。
偶然の連鎖の結果を振り返って人は運と呼ぶ、それを仮に本当にランダムだとしてもサーバ側で実装しかつ可視表示してしまうことには俺は不快感を覚えます。

※ただし、現在の偏りは所詮偶然の範囲内です。
「【PSU】星霊運ログ」様の9、10月のデータを参照させていただきました。
9月8日に始まり10月27日までの通算50回のデータがあります。
少なくとも 「当日の星霊運が種族と性別により決まる」 ことは真として種差性差を検定しますと、残念ながら総平方和303.6に対し種差性差の影響は6.35、誤差というかこの場合は日間の変動の影響は297.2にもなります。
もちろん種差性差の自由度7に対し日間のサンプル数が多いため自由度も392まで跳ね上がり、結果として平均平方は種差性差で0.907、繰返し誤差が0.758、分散比は1.197です。
この結果からF検定を行っても母集団に差が無いとするゼロ仮説を棄却し得ません。
仮に危険度5%というヌル目の検定を行っても、分散比が最低でも2は無いと有意差とはとても言えず、結論だけを簡単に申し上げればこのサンプルからは種差性差無しと言わざるを得ません。


2006/11/06(月)

−待ってろ、今 守秘回線に切り替える−

今回のネタは妄想思索なので実在する製品、サービスに対するリサーチを行っていません。

メールの自動検閲(※)システムを設計せよと言われたらどのように実装するでしょうか。
基本的にアルファベットのみで、空白が現れるまでを一つの単語(word)と見做せばよい英語圏と異なり、日本語の場合はかなり厄介です。
リアルタイム検索を求められるかどうかでずいぶん違ってきますが、果たしてサーバ上で何ができるでしょうか。

※国家権力による検閲は憲法違反。
また電気通信事業法でプロバイダによる検閲も禁じられているが、社内で上司がスキャンすることに関しては問題無し。

実際問題として、サーバ上でのリアルタイム「ウィルス検索」は既にバリバリ稼動しています。
ということは同じ理屈でブラックリスト検索(NGワード検索)は可能なはず。日本語といってもメールの場合、エンコード情報が付加されていますし、上位バイト下位バイトの判別のオーバーヘッドがあるにしても多少の遅延が見える範囲で実行可能でしょう。
ただし、メールはテキストベース(※)ですので行という概念があります。

※ここで言うテキストとは純然たるASCII文字のこと。
そもそもSMTPは7bit透過システムであってそもそも日本語を送受信すること自体が拡張の領域。
添付ファイルの分割がどうの、ヘッダに日本語がどうのという議論はSMTPを置き換える高度なプロトコルに遷移できなかった全世界的な失策の結果に過ぎない。

SMTPは元々サーバとの行単位での対話をベースとしています。今は意識しませんが、メーラが代行しているだけのことです。
ということでこれを逐次スキャンするためには線スキャンにならざるを得ません。
一旦平面上に展開してY方向スキャン、さらにはX−Y方向(斜め)スキャンなど、できるものなのでしょうか。

話を具体的にしましょう。

仮に「殺す」がキーワードだったとして、例1はヒットするでしょうが例2や例3は無理ではないかと。

■例1(行方向)
 おまえを殺す。

■例2(列方向)
 殺お
 す前
 。を

■例3(斜め方向)
 お@@
 殺前@
 @すを
 @@。

実際の日本の会社の実情として、NGワードの直列スキャンすら実施している可能性は高くないと思っています。
なにしろ結果の精査にものすごい人的リソースが必要で、かつ無益だからです。
論理的には可能だが、実運用上は不可、という読みによりプチ暗号化スクリプトを作りました。

これ。

題して「XY変換スクリプト」。
名前が全てですな。
実際には横書きを単純にXY変換すると左から並んでしまうので、変換後のX方向に逆ソートしています。
動作はやってみればわかりますが

あいうえお
かきくけこ



かあ
きい
くう
けえ
こお

になるのですよ。
これで私的なメールもすぐに検出されることは無かろうと、そういうもくろみで個人的なメールに使っていたのですが、ここに来て全社Outlookとかいうクソメーラに乗り換え強制措置キター
しかもマイクロソフトのクソdefault設定はプロポーショナルフォントキター
もうこれで縦書きは使えません。
やってみてもらえば一目瞭然ですが、横方向に崩れまくるからです。

正直、メールでは固定ピッチにして欲しい。俺は罫線フォントで簡易な図を描くからで、そんな理由は個人的すぎるので「欲しい」としか言えんのですが(´・ω・`)

まぁこれで縦読み、斜め読みといった単純にして有効なインターリーブ方式は使えなくなったわけですが、Pフォントということはですよ、皆さんお得意のAAが使えるってことです。
AAにしちゃえばスキャンしにくさは最高級!
ただし前述の通り7bitシステムで使えない文字はサーバで削られちゃったりしますからね。残念。

いやまてよ?
一般人は崩れちゃって使えない方が守秘性は高いのでは?
じゃぁ使いたい相手とだけ事前に固定ピッチフォント化の約束をしておけばOKOKということか。