2014年8月2日土曜日

3DSキャプチャーボードのソフトウェア環境について

3DSのキャプチャーボードから入力された信号を録画する上で有用そうな情報を並べておきます。

まずはOSについて。
基本的に Windows のみでしか動作しないと思われます。Mac OS Xでできないものかと模索してみましたが失敗に終わりました。以下、試した方法を書きます。

1. Wine (一部のウィンドウズのソフトを Unix 系のコンピュータで動作させるソフト) + 最新の n3DSViewer:
キャプチャーボードを動作させるためには msvcr110.dll などの Visual C++ Redistributable 2012 に含まれるdllファイルが必要であるが、 Visual C++ Redistributable 2012 のインストーラそのものが Wine で正常に動作しない。外部サイトからダウンロード可能な msvcr110.dll を直接 wine に読ませようとしても起動しない。

2. Wine + 古い n3DSViewer: 古いビューワは msvcr110.dll に依存しないので wine でもなんとか起動はできるが、wine がUSBを認識しない。

vmware, virtualboxなどの仮想環境は試していません。高確率で起動は可能だと思いますが、パフォーマンスがどうなるかはわかりません。試してみる価値はあると思います。

一旦諦めてBootcampからのWindowsで使うことにしました。



次に録画について。
多数のソフトウェアがあり、このページによくまとめられています。
http://www18.atwiki.jp/live2ch/pages/153.html

方式が2通りあり、1つは Direct X から直接データをもってくる方法、もう1つはディスプレイに表示されている画像を読み込む方法です。前者の方が高速かつ高画質になり、かつ画面上のウィンドウの上の他のウィンドウがかぶさっても関係なく録画されます。どちらの方式でもいくつかのソフトウェアで録画を試してみましたが、Direct X経由で録画するとピクセルサイズがネイティブのデータより大きく保存されます(2x2=4倍の面積)。この余計なピクセルがファイルサイズをいたずらに増やしている可能性があるので何とも言えません。ハードディスクをかなり圧迫しますが、十分な容量があるなら問題はないでしょう。直す方法があれば知りたいです。

2014年8月1日金曜日

3DSLLキャプチャーボードの導入

公式のキャプチャーデバイスであるニトロキャプチャーをもじって、偽トロキャプチャーなどと呼ばれているものの同等品です。(偽トロキャプチャーという名称は記事執筆現在株式会社ケイティの登録商標となっています。)

カメレオンUSBことキャプチャーボードはオプティマイズさんから購入しました。
http://optimize.ath.cx/LL-SPA3/index.htm
赤外線ポートから線が出るUSB一体型の方です。

作業中に裏のフレキシブルケーブルのツメに逆方向に力をかけてしまい、ツメがとれてしまって大変焦りました。しばらく絶望していたのですが、数日後に顕微鏡で見ながらなんとかはめ直しました。電極間のピッチが狭い上に数も多く、それぞれが複雑な形状をしていたので正直復元できるとは思いませんでした。とれたツメはオプティマイズさんのページにあるこのコネクタのものです。
http://optimize.ath.cx/LL-SPA3/DSCN73461.jpg

この点を除けば組立はオプティマイズさんのサイトの説明通りで、特に難しいことはありません。コネクタの抜き差しに便利ですので作業をする前にきちんとピンセットを用意しておく事をおすすめします。

無事動くようになりましたので、これからは対戦動画などの録画ができます。楽しみです。

2014年6月23日月曜日

全自動卵割り機を作ってみた




https://www.youtube.com/watch?v=Q7TgLp15j30

ロボティクス的なことはなんだか難しそうで抵抗があったのですが、やってみたら意外と簡単だったので作ってみました。正直孵化は手作業の方が早いので実用性はあまりないかもしれません。

材料
Arduino互換マイコンボード
マイクロサーボx2
十字キー固定用クリップ
サーボを固定する台

オプション
ボタン押すところのクッション


ニコニコ動画のはこちら
http://www.nicovideo.jp/watch/sm23841636


サーボ動作用のプログラムはこんな感じです



#include <Servo.h>

Servo myservo;  // create servo object to control a servo
                // a maximum of eight servo objects can be created
Servo myservo2;

int pos = 0;    // variable to store the servo position
int i = 0;
int offset1 = 110;
int starta = offset1;
int enda = offset1+13;

int offset2 = 60;
int startpull = offset2;
int endpull = offset2 + 25;


int traveltime = 0; // ms


void setup()
{
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  myservo2.attach(8);
  myservo.write(offset1);
  myservo2.write(offset2);

  delay(3000);
}


void loop()
{
  int j;
  for(j=0;j<20;j++) {
    travel();
  }
talkfull();
leftrelease();
delay(50);

}


void talkshort()
{
  int j;
  for(j=0;j<4;j++) {
    pressa();
    delay(150);
  }
}

void talkfull() {
  talkshort();
  leftpull();
  talkshort();
  leftrelease();
  leftpull();
  talkshort();
}

void travel() {
  leftpull();
  delay(traveltime);
  leftrelease();
  delay(traveltime+50);
}





void leftpull()
{
  for(i=startpull;i<endpull;i++) {
    myservo2.write(i);
    delay(20);
  }
}
void leftrelease()
{
  for(i=endpull;i>startpull;i--) {
    myservo2.write(i);
    delay(20);
  }
}


void pressa()
{
  for(i=starta;i<enda;i++) {
    myservo.write(i);
    delay(20);
  }
    for(i=enda;i>starta;i--) {
    myservo.write(i);
    delay(20);
  }

}

2014年6月15日日曜日

ポケモンXYのランク補正0の急所率の検証の追試

XYに入ってから急所率が変更されたという報告が各所でみうけられます。

秋桜さんの検証では補正なしの状態での急所率が 53/600 と 1/12に近い値となっており、この値がwikiなどの情報ソースでも使われています。

秋桜さんの検証データ(BVつき)
http://cloyster.blog.fc2.com/blog-entry-200.html

ポケモンwiki (2014/6/12 現在の記述ではランク補正なしの急所率は1/12と書かれています)
http://wiki.ポケモン.com/wiki/急所

トレーナー天国では秋桜さんのデータに基づいて統計的解析をし、急所率が1/16より高い可能性が 99.5%としています。
http://pokemon-trainer.net/xy/dmcs/criticalhit.html

(あるいは1/16 か 1/12かの二択問題にすると95%程度の確率で1/12。(twitter))

しかし、公式の開発者インタビューによるとランク補正なしの急所率は過去の作品から変更されていないと語られています。
http://www.pokemon.co.jp/ex/wcs2014/news/20140425_01.html



今回の記事の目的は、急所率の実験の追試を行いランク補正なしの急所率が 1/16 と 1/12のどちらに近いかを 3σ 程度の精度で求めることとします。

まずは必要なデータ数の計算をします。急所に当たる事象をレアイベントとし、ポアソン統計を適用すると、試行回数N、急所率kとして
・急所に当たる回数: Nk
・急所に当たる回数の標準偏差: sqrt(Nk)
・急所率の標準偏差: sqrt(Nk) / N

これが現状の仮説である2つの値1/16か1/12の片方に近づいたとき、もう片方を否定できるようにするために、k=1/16のときの3 * sqrt(Nk) / N が (1/12 - 1/16) より少ないという条件を課してみます。
3 * sqrt(N / 16) / N < (1/12 - 1/16)
これを解くと、
N > (1/(1/12 - 1/16) * 3)^2 / 16 ~ 1300
となります。
ある程度余裕をもって N = 1500 とすると、1/16 か 1/12の片方に近づいたときにもう片方をだいたい3σ程度で否定できます。


実験設定
Lv1スキルリンクシェルダーのつららばり(PP30)をLv100クレセリアに150回当てる試合を10試合程度行う。シェルダーはつららばりのみを使用しクレセリアはその間光の壁を使い続ける。お互いに30回使ったらクレセリアが冷凍ビームでシェルダーを倒す。最後の冷凍ビームの急所も急所の確率に反映させる。
基本的に作業中は急所の判定を見ず、BVでまとめて急所の数を数える。また、バイアスを防ぐため、データを最後まで取得するまで解析はせず、解析を終えた後はデータの追加は行わない。
4試合目まではクレセリアに食べ残しを持たせていましたが、よく考えたらつららばり150発は耐えるので持ち物をなくしました。(粘土を持たせるともう少しだけ時間を短縮できます)

結果
BV (14試合分。最初4試合はメインロム、あとはサブロムからアップロードしました)
3QYG-WWWW-WWW7-UY7A
UMVW-WWWW-WWW7-UY7H
F8CW-WWWW-WWW7-UYUJ
LYRG-WWWW-WWW7-UY7Z
48PG-WWWW-WWW7-UY98
DA6G-WWWW-WWW7-UY9D
W5EG-WWWW-WWW7UY9G
G6BW-WWWW-WWW7-UY9M
YWGG-WWWW-WWW7-UY9Q
23LW-WWWW-WWW7-UY9S
R2FG-WWWW-WWW7-UY9V
NZUW-WWWW-WWW7-UYA4
LU5G-WWWW-WWW7-UYA8
TXCW-WWWW-WWW7-UYA9


勢い余って14試合してしまったのでその全てのデータを用います。実験設定にも書きましたが、解析した後でデータを加えることはしていません。
急所の数
1試合目: 7/151
2試合目: 7/151
3試合目: 15/151
4試合目: 6/151
5試合目: 4/151
6試合目: 9/151
7試合目: 8/151
8試合目: 8/151
9試合目: 9/151
10試合目: 10/151
11試合目: 14/151
12試合目: 9/151
13試合目: 11/151
14試合目: 8/151

合計 125 / 2114 ~ 0.0591
1/16 は 0.0625
1/12 は 0.0833 程度なので、どちらかというと1/16に近いです。
標準偏差を sqrt(125) / 2114 として正規分布を仮定し(本来は二項分布でしょうが、このデータ数があれば正規分布への近似も妥当かと思われます)信頼区間を計算すると、
95%信頼区間は 0.0488-0.0695
99%信頼区間は 0.0455-0.0728 なので、
どちらの信頼区間でも1/16は区間内、1/12は区間外となります。
結果を図にまとめておきます。



結論
今回の検証から、1/16か1/12のどちらかと言われれば非常に高い確率で1/16であると言えると思います。これは開発者インタビューの通り、従来から変更されていないという結果になります。秋桜さんの実験で1/12に近い値が出てしまったのはおそらく偶然であるかと思われます 。


2014年6月11日水曜日

簡易版ダメージ計算方法

むしこあ式ダメージ計算簡易版

目標
誤差2%程度のダメージ計算を素早く行う。

攻撃側の計算
ルール 1
性格無補正A振りガブリアスの地震の最低ダメージを100とする
(A種族値130、実数値182
威力100、一致
最低ダメージ補正 x 0.85)

技の威力から計算を始める (不一致は1/3削る)。
他のポケモンの場合、種族値10あたり5.5%増減。
努力値は無振りの場合(種族値-32)扱い (調整分は適当に埋める)
最大ダメージはこの18%くらい上

例: A252いじっぱりファイアローのブレイブバード
A種族値 81

120 * (1 - 0.055 * 4.9) * 1.1 ~ 96 (陽気ガブの地震とだいたい一緒!)


防御側の計算
ルール1からの結論
耐久指数(HPx防御) / 104、 で攻撃側と比較可能になる

あるいは、無補正無振りHBD種族値100のポケモンが
だいたい200くらいの防御指数をもっているのでそこから計算する。
種族値10あたりHPは5.7%, BDは8%増減させる。
努力値は全振りで(種族値+32)扱い

例, クレセリア(H120, B120)の物理耐久
無振り: 200 * (1 + 0.057*2) + (1 + 0.08*2) ~ 260 (ガブのげきりん(120)で乱数2)
H振り: 200 * (1 + 0.057*5.2) + (1 + 0.08 * 2) ~ 300 (ガブのげきりん(120)で確3)

これらの指数を代表的なポケモンに対してあらかじめ計算し、リストにしておくとわかりやすいと思います。

2014年6月10日火曜日

効率のよいゼルネアス・イベルタルの厳選の方法と、厳選のやめ方

第6世代ポケモンでは、Xにはゼルネアス、Yにはイベルタルがそれぞれ伝説のポケモンとしてストーリーの間に登場します。このイベントはスキップできないので伝説のポケモンの良個体が欲しい場合にはどうしてもストーリー中に厳選作業をすることになります。
この方法として既にwebに投稿されている情報の例はこちら。

「ポケモンXY攻略」
http://blog.game-de.com/pm-xy/xy-xerneas-yveltal/

「秘伝マシン03@ポケモンXY攻略まとめ」
http://pokemonxymatome.blog.fc2.com/blog-entry-303.html

「フロッゼのニコニコ ポケモン 育成記」
http://ch.nicovideo.jp/frozze0419/blomaga/ar367431

その他たくさんあります。各サイトよくまとめられております。
一般的な手順を振り返ってみましょう。

1. ストーリーを進めてゼルネアス・イベルタルに出会う。
2. 最初の戦闘で逃げるか倒すかする(これでゼルネアス・イベルタルが固定シンボルになる)
3. 一度ポケモンセンターに戻り、目的の性格を持った瀕死のシンクロ要員をパーティーの先頭に配置する
4. 目的の素早さ-1の素早さを持ち、戦闘開始時に特性表示があるポケモンを二番目に配置する
5. 個体値同定用のドーピングアイテムを買っておく(インドメタシンなど)
6. 固定シンボルの目の前でレポートを書く
7. 固定シンボルに話しかけ戦闘を開始する。自分のポケモンの特性表示が先だったら逃げるを選択して再戦する(ゼルネアス・イベルタルが目的の素早さではないことが確定するため)
8. 相手のポケモンが先だったら捕獲し、フラダリ戦にてステータスの確認をする
9. この時点で個体値が完全に確定するわけではないが、目的の個体が来たら無駄な努力値が入らないようにフラダリのポケモンに倒される。そうでなければリセットして7に戻る
10. ポケモンセンターに戻り、ドーピングアイテムを使って目的の個体か確認する。駄目ならリセットして7に戻る


どのような個体を目的にすればいいかは対戦考察wikiなどを参照。
ゼルネアス
http://www57.atwiki.jp/pokemon6th/pages/88.html
イベルタル
http://www57.atwiki.jp/pokemon6th/pages/89.html

素早さの条件を満たさない個体は速い段階で無視できるので最速(素早さ個体値V+性格補正↑)を狙うとわかりやすいと思います。
仮にここでは最速のゼルネアスを狙うことにしましょう。
多くの場合ゼルネアスには攻撃が必要ないため性格は攻撃↓素早さ↑のおくびょうを選択します。手順3で用意するシンクロを持ったポケモンの性格をおくびょうにしておきます。
最速ゼルネアスの努力値なしの素早さは130(イベルタルも同じ値)なので、手順4で用意するポケモンの素早さは129にしておきます。このポケモンの特性ですが、トレースだと特性表示が二回あるので特性表示が一回のものと比較すると1試行あたり数秒多く時間がかかります。



以降、このテストケースにおいていつ厳選をやめればいいかについて解説します。
どの程度の個体が来たら厳選をやめればいいかは最終的には各人の判断に委ねられますが、その時々に来た個体がどの程度の確率で発生し得るものなのかがわかると妥協点を探すためのヒントになります。ゼルネアス・イベルタルは3Vが確定しているので過去の作品の厳選に比べれば簡単に良い個体が手に入るようになっています。ここでは最速は外せない条件として、残りの個体値は総合的な値を見て判断することとします。

まず、自分のポケモンの特性が先に表示される確率を調べます。

・シンクロが発動する確率: 0.5
・素早さに上昇補正がかかる性格が自然発生する確率: 4/25 = 0.16
・シンクロ、自然発生込みで素早さ上昇補正の性格が出る確率: 0.5 + 0.5 * 0.16 = 0.58
・確定の3Vが素早さに割り振られる確率: 0.5
・素早さのVが確定でないとき、UかVが出る確率: 2/32 = 0.0625
・素早さがVかUである確率: 0.5 + 0.5 * 0.0625 ~ 0.531
・素早さが130 になる確率 0.58 * 0.531 ~ 0.308
・素早さがSかTである確率: 0.5 * 0.0625 ~ 0.031
・素早さが129である確率: 0.58 * 0.031 ~ 0.018
・素早さが129のとき自分のポケモンの特性が先に表示される確率: 0.5
・自分のポケモンの特性が先に表示される確率: 0.308 + 0.5 * 0.018 ~ 0.317

ということなので、だいたい 1/3 の確率で自分のポケモンの特性が先に表示されることがわかります。ここから、試行の約2/3は逃げることによってキャンセルできます。この一回あたりの試行にかかる時間(戦闘開始から逃げるが完了し、元の画面に戻るまで)をt1としておきます。
この段階を通過して個体値確認してから戻るまでの時間をt2とすると、一回個体値を確認して戻るまでに、だいたい t2 + 2*t1 程度の時間を消費します。
実測していないので非常におおまかな値となりますが(データ募集!)、t2 + 2*t1 をおよそ2分程度として話を進めようと思います。

ここからはある程度ラフな計算をします。ここまで来れば素早さがVである確率はかなり高い(計算したところ約94%)なので、一旦Vを仮定します。とりわけ、計算を簡略化するため確定の3Vが割り振られたと仮定します。性格が一致しないケースも 10% 程度ありますが、それも後で考慮します。

性格一致、素早さVが満たされたとして、残りの個体値を考えます。残りにはVが2つとランダムに決められる個体値が3つあります。(ゼルネアスの場合、こうげきに配分される個体値は気にしなくてもよいですが、計算が煩雑になるので一旦考慮しないことにします。)

ランダムに決められる個体値3つの和がとれる値は0から93までです。0から93まで均一に分布しているわけではなく、3回の試行の合計なのでn=3の二項分布で表現されます。この累積分布関数は次のようになります。
3つの個体値合計93が出る確率は ~ 0.00003 (だいたい3万回に一回)なのでこの個体が出るまでにかかる時間はおよそ1000時間程度(あくまで期待値ですが)です。それほど非現実的ではありませんが、あまりに辛い戦いです。
合計92以上の場合確率はかなり緩み、~0.00012 (だいたい8000回に一回)で、250時間に一回程度となります。まだかなり辛いです。以下、現実的な時間になるまで確率を計算していきます。
合計→時間
93→1092
92→273
91→109
90→54
89→31
88→20
87→13
86→9.1
85→6.6
84→5.0
83→3.8
82→3.0
81→2.4
80→2.0
79→1.6
78→1.3
77→1.1
76→0.95

と、このあたりで一時間を切ることになります。
どのくらい時間をかけられるかは個人の都合次第ですが、自分がかけられると思った時間に対応する以上の個体が来たらそれはやめ時だと思います。
繰り返しになりますが、あくまでここで計算された時間は期待値ですのでこの時間に到達したときに目的以上の個体が得られる確率が約1/2だと解釈してください。
この時間の中には、目的の個体がVになっていない場合が含まれているので、1割か2割程度時間を割増すると丁度よくなるかもしれません。

また、CもVがいい、Aの個体値は気にしないなどの条件をつけるとまた確率が少々変わってくるので、各自計算してください。(例、確定VがCに来るという条件をつけるとすると、上記の確率にさらに2/5がかかるので、厳選時間を2.5倍することになります)

1つだけ例をあげてしめくくります。
厳選にだいたい3時間くらいかけようと決めておいて、性格一致、SがVの個体を求めるとすると、HABCDの個体値合計がだいたい 81 + 62 = 143 あたりの個体が妥協点となります。
Sも含めた合計は 174 となりジャッジさんにはゆうにすばらしい個体と認識されます。

はじめに

当ブログではポケモンに関する記事を扱います。
当面の間、内容は主にゲーム内の作業の効率化、各種検証等になると思います。

外部サイトの情報を参照することがありますが、その際にはなるべく出典を明らかにしつつ行いたいと思います。当ブログへのリンクは自由です。