セガNET麻雀MJのリプレイURLを解析

## MJのリプレイURLについて

MJのリプレイはURLを基にHTML/CSS/jsを使用して再現しているだけでした。[リプレイ例](https://pl.sega-mj.com/mj_viewer?B=0001&K=03210&V=6&DI=FrPvML4HV01SPb&T=250_250_250_250&D=e&S=46&H=uu8lukr1c2yd7_nxjkg9851h4ve_iv7emqri7xofz_80aa3srkb8aoa&A=v1cvkryrfx2x4AaDjL4bCcd1lnrz68p_w_5ch_z2m9q2mR86zq_prx_t_i81qj_Cklu5j6q9_7_-5~3aUgU3&Y=11_23e7120_20210010160d2egj3a34406kkmso515204aaaa&Z=ngtjtpw21zfi6bnddublg9hwcctflm2dyx4bozovw9p3yj3eg3hq)
サーバに動画などのデータは保存されていないようなので、サーバ上に大量のデータを保存することなく、多くのリプレイを見ることが可能となっています。

今回はそのリプレイURLに書いてある情報を解析していきたいと思います。
解析が出来たら、複数のURLから様々な統計情報を作成することができると思っています。

**pythonで解析するプログラムを開発中[github](https://github.com/syado/mj-replay-url-parse)**

### 注意
**すべての解析はまだできていません。**
**3麻の場合の解析は行っていません。**

# パラメータ一覧

## 基本
### url上の牌の置換

```
1: "萬子1"
2: "萬子2"
3: "萬子3"
4: "萬子4"
5: "萬子5"
6: "萬子6"
7: "萬子7"
8: "萬子8"
9: "萬子9"
0: "萬子5赤"
a: "索子1"
b: "索子2"
c: "索子3"
d: "索子4"
e: "索子5"
f: "索子6"
g: "索子7"
h: "索子8"
i: "索子9"
"-": "索子5赤"
j: "筒子1"
k: "筒子2"
l: "筒子3"
m: "筒子4"
n: "筒子5"
o: "筒子6"
p: "筒子7"
q: "筒子8"
r: "筒子9"
s: "筒子5赤"
t: "東"
u: "南"
v: "西"
w: "北"
x: "白"
y: "發"
z: "中"
```

### プレイヤー番号
```
0: "下"
1: "右"
2: "上"
3: "左"
```

## B (場の情報)
4桁の数字に4種の情報が含まれています
それぞれの情報の数値が入力されている

###　1桁目 局数
```
0: "東一局"
1: "東二局"
2: "東三局"
3: "東四局"
4: "南一局"
5: "南二局"
6: "南三局"
7: "南四局"
```

###　2桁目 本場数

```
0: "0本場"
1: "1本場"
2: "2本場"
3: "3本場"
...etc
```

###　3桁目 供託数


```
0: "0本"
1: "1本"
2: "2本"
3: "3本"
...etc
```

###　4桁目 親の開始位置
[プレイヤー番号](#プレイヤー番号)(0~3)を参照

### `1232`の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258555/81cc8c3e-62e0-b06f-a918-b02a1fbabb10.png)

## K (未解析)
風に関する物?だと思われる

## V (未解析)
バージョンに関する物?だと思われる

## DI (未解析)
台のデザインやルールなどに関する物?だと思われる

## T (点数)
プレイヤーの位置が`下_右_上_左`の順に`_`区切りで百分の一の点数
下記の場合、下が23000点、右が24000点、上が26000点、左が27000点

```
230_240_260_270
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258555/7dbd20eb-0aac-8dde-8c1a-68be76c55321.png)

## SA (未解析)
三麻の時に使用する何か
一桁目は3麻の時に空席の部分のプレイヤー番号

## D (初期ドラ牌)
初期時のドラ牌を[一文字](#url上の牌の置換)に置き換えたもの

## S (サイコロ)
二つサイコロの目

```
11: 1の目二つ
23: 2と3の目
45: 4と5の目
66: 6の目二つ
```

## H (配牌)
プレイヤーの位置が`下_右_上_左`の順に`_`区切りし、
各プレイヤーの各牌を[一文字](#url上の牌の置換)に置き換えたもの

```
1112345678999_aaabvdefghiii_jjjklmnopqrrr_ttuuvvwwxxyyz
```

上記の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258555/77045493-eb34-3c07-eef5-111dc0dbc0ff.png)

## A (アクション、一連の流れ)
親の最初のツモ牌から最後までの行動が記入されている
大文字はそのまま入力
小文字は指示した内容に置き換え
牌はすべて[一文字](#url上の牌の置換)に置き換えたもの

### "_": ツモ切り
一文字前の牌をツモ切り

### "Rx": 立直
x: 立直時に捨てた牌

### "Cyyx": チー
yy：チーに使った2つの牌
x：捨てた牌

### "Px": ポン
x：ポンした[プレイヤー番号](#プレイヤー番号)(0~3)

### "KwDyLz": 加槓
w：カンした牌
y：めくったドラ牌
z：リンシャン牌

### "AwDyLz": 暗槓
w：カンした牌
y：めくったドラ牌
z：リンシャン牌

### "MxDyLz": 明槓
x：カンした[プレイヤー番号](#プレイヤー番号)(0~3)
y：めくったドラ牌
z：リンシャン牌

### "~xyUzUz": ツモ,ロン
x：ロンした[プレイヤー番号](#プレイヤー番号)(0~3)
y：上がり時の手配の枚数　16進数(1~e), ロンした牌は含めない、鳴いた牌は含めない
z：裏ドラ牌　ロンなどで必要ない場合はセットで書かない　枚数分だけUとセットで増やす

### ".1Tyyyy": 流局
数字の意味は不明
yに自分から順番(下右上左)にテンパイ`1`ノーテン`0`

### 例
```
12a_kRjCklz~1d
```
※東がプレイヤー番号0とする

上記の場合
東:1(萬子1) 萬子1を引く
東:2(萬子2) 萬子2を捨てる
南:a(索子1) 索子1を引く
南:_(ツモ切り) 索子1をツモ切り
西:k(筒子2) 筒子2を引く
西:R(リーチ) リーチする
西:j(筒子1) 筒子1を捨てる
北:Ckl(チー,筒子2,筒子3) 筒子1(西の捨て牌)を筒子2,筒子3(手牌)でチーする
北:z(中) 中を捨てる
南:~1d(ロン,右,13枚) 南が手牌13枚でロン

## Y (未解析)
上がり時の点数や役に関する物だと思われる

## Z (使用されなかった山牌)
ゲーム終了時に使用されなかった山牌（ドラ、裏ドラ等も含める）
各牌は[一文字](#url上の牌の置換)に置き換えたもの
順番はドラ牌が後の方になるようにする

## N (各プレイヤー名)
プレイヤーの位置が`下_右_上_左`の順に`_`区切りし、
各プレイヤーの名前を記入したもの

```
下プレイヤー_右プレイヤー_上プレイヤー_左プレイヤー
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258555/63f7098a-28eb-cf1d-7d91-90724cb1b336.png)