抜刀バグ1

抜刀バグ

ロードスでは通常、敵を倒し終わるとすぐに抜刀状態が解除される。ところが、敵を倒しても10秒間抜刀状態続くようになってしまうというバグがあって、抜刀バグと呼ばれている。三角のように、敵を倒す→部屋移動→敵を倒す→部屋移動と繰り返すマップでこのバグに掛かると、周りがサーと走っていく中、一人だけ足が遅くて取り残されることになる。辛い。この症状から鈍足バグと呼ばれることもある。

原因

このバグは、敵のタゲを持った状態で別のマップ(or 別のch、別の難易度)に移動することで起きる。

マップの移動は普通に移動しても、コール、秘宝でもだめ。逆に、同じマップ内であれば、コールや秘宝で近くの聖女に移動しても抜刀バグは起きない。

また、移動前に敵のタゲを持っているというのがバグ発生の条件で、抜刀状態になっているかどうかは無関係。なので、ダメ0装備にして被弾しない状態だったとしても、タゲが来ればこのバグは起きてしまう。

治し方 (原理編)

このバグに掛かってしまった場合、リログをするか、遠くのマップに秘宝で移動するかで治る。
「遠くのマップ」というのは少しあいまいな言い方だけど、例えば三角から太陽の聖堂くらいの距離を秘宝で飛ぶと抜刀バグは治る。

「リログで治る」と言っても、実際の所、単にリログだけすればいいという話ではない。というのも、ロードスではリログした場合「同じマップのch.1 難易度0に戻る」というバグ(or 仕様?)がある。なので、例えば三角の難2で狩り中に抜刀バグに掛かった場合、リログで直そうとしても、

抜刀バグ発生→リログ→戻ってきてすぐ殴られる→難2に移動→抜刀バグ発生

といった感じになってしまえば無限ループで、結局解決にならない。

治し方 (実践編)

なので、リログで治すとすれば、実際の所

(1) 安全な場所に移動→リログ→難2に移動
(2) リログ→安全な場所に移動してタゲを切る→難2に移動

のどちらかをする必要がある。

モンク フィニッシュブロー実験

前回作ったDPS予想プログラムはおおまかには正しい予想値を出せるレベルになった。このプログラムでは、各スキルの所要時間を計算に使うことになる。ただ、各スキルの所要時間は実際に叩いてみてその時間を測るという最も原始的な方法でしか調べることが出来ない。今日はモンクのブロー系のチェイン3、フィニッシュブロー(以下、FnB)の所要時間を調べてみる。

実験1

チェインにFnBのみをセットし、発動する様子を録画し、所要時間を測定してみる。
攻撃速度は0%

実験結果

14.253 N
14.720 FnB
15.554 N

52.251 N
52.835 FnB
53.752 N

時間間隔を測ってみるとこんな感じ。

1回目
N->FnB 0.467秒
FnB->N 0.834秒

2回目
N->FnB 0.584秒
FnB->N 0.917秒

ずいぶん揺らぎが大きい

実験2

チェインに、ファーストブロー(FB)、ブラスティングブロー(BB)とFnBをセットする。

実験結果

こんな感じ


9.281 BB
9.781 FnB
10.816 N

17.721 N
18.088 FnB
18.772 FB

27.379 BB
28.097 FnB
29.014 N

33.384 BB
34.085 FnB
34.769 FB

41.758 FB
42.308 FnB
42.859 FB

時間間隔を調べてみるとこんな感じ

N->FnB 0.367
BB->FnB 0.500, 0.718, 0.701
FB->FnB 0.550

FnB->N 1.035, 0.917
FnB->FB 0.684, 0.684, 0.551

感想

やっぱり、揺らぎが大きい。通信遅延とかの影響を受けているのだと思う。

課金装備 (2019/1/30 - 3/6)

最近、新しい課金装備がどんどん出て、全く把握できていない。
とりあえず直近のデータだけ集めてみた。

ファーンの光芒の箱 (2/20 - 3/6)

https://lodoss.pmang.jp/notices/2223

盟約の証 (U2 装身具)

レベル60制限
OP1[固定] 最終ダメ+33%
OP2[固定] クリ率 33%
OP3[固定] チェインIII ダメ+33%
OP4[ランダムで1種] 筋力+3 or 知力+3
無形シリーズの[頭防具]・ユニーク★1腰装備

障壁を突破する者 (U1 腰装備)

レベル50制限
OP1[固定] 攻撃力+15%
OP2[固定] クリ率+20%
OP3[固定] 最終ダメ(グロ) +15%
OP4[固定] スタ攻+3

U2化時
レベル60制限
OP1[固定] 攻撃力+20%
OP2[固定] クリ率+30%
OP3[固定] 最終ダメ(グロ) +20%
OP4[固定] スタ攻+5

無形のヘルム (R6 頭)

OP1[ランダムで1種] 被ダメ(物理) -5% or -10% or -15% or -25%
OP2[ランダムで1種] CT減 5% or 10% or 15% or 20%
OP3[ランダムで1種] クリ率 5% or 10% or 15% or 30%
OP4[ランダムで1種] 攻撃力 5% or 10% or 15% or 20%

カシューの光芒の箱 (2/13 - 2/20)

https://lodoss.pmang.jp/notices/2190

血塗られた指輪 (U1 指輪)

レベル50制限 (装備制限1個)
OP1[固定] クリダメ制限 +20%
OP2[固定] クリダメ +55% - 60%
OP3[固定] 攻撃力 +25% - 30%

U2化時
レベル50制限 (装備制限1個)
OP1[固定] クリダメ制限 +25%
OP2[固定] クリダメ +65%
OP3[固定] 攻撃力 +35%
OP4[固定] クリ率 +10%

ホーリー・ネックレス (U1 首飾り)

レベル50制限
OP1[固定] 被ダメ(物理) -23%
OP2[固定] 被ダメ(魔法) -23%
OP3[固定] CT減 23%
OP4[固定] 消費MP減 20%

U2化時
レベル60制限
OP1[固定] 被ダメ(物理) -28%
OP2[固定] 被ダメ(魔法) -28%
OP3[固定] CT減 28%
OP4[固定] 消費MP減 25%
OP5[固定] クリ率+10%

ディスティニーシャツ (U1 下衣)

レベル50制限 (U2化不可)
OP1[固定] アイテム +10%
OP2[固定] 上位ドロ率 +10%
OP3[固定] ゴールド +25%
OP4[固定] 金出現率 +10%

セシルの可憐な箱 (1/30 - 2/13)

https://lodoss.pmang.jp/notices/2166

トランセンド (U2 上衣)

レベル60制限
OP1[固定] 物功+30%
OP2[固定] 魔功+30%
OP3[固定] クリ率+30%
OP4[固定] 攻撃時、5%の確率で落雷

騎士隊長の印章 (U2 指輪)

レベル60制限
OP1[固定] クリダメ +25%
OP2[固定] クリ率 +20%
OP3[固定] 筋力 +4

虹の涙 (U2 首飾り)

レベル60制限
OP1[固定] 攻撃力+30%
OP2[固定] クリ率+35%
OP3[固定] CT減 25%
OP4[ランダムで1種] リアダメ +15% or 消費MP減 15% or 命中率 +25%

灼熱の大地 (U2 装身具)

レベル60制限
OP1[固定] クリダメ +30%
OP2[ランダムで1種] 被ダメ(物理 or 魔法) 15%
OP3[ランダムで1種] チェインI or II or III ダメ +80%

魅惑の陽炎 (U2 腰装備)

レベル60制限
OP1[固定] クリ率 +25%
OP2[固定] 被ダメ(物理) -25%
OP3[ランダムで1種] 命中率 20% or 基本最大LP +35%

グレートソルジャー (U2 肩)

レベル60制限
OP1[固定] 物攻 +30%
OP2[固定] 魔功 +30%
OP3[固定] クリ率 +10%

DPS予想プログラムの検証

この前総与ダメを予想するプログラムを作った。

モンクが訓練用の武器を持ちチェインにファーストブローとブラスティングブローのみをセットし通常放置でかかしを叩いたときの総与ダメを計算するもので、2分間の総与ダメを計算させてみた結果がこちら。
f:id:ochanikki:20190217232446p:plain
横軸が総与ダメで縦軸が頻度。与ダメは大体 320,000 - 420,000 くらいに収まる、というのがこのプログラムの出した予想。

前回の実験

それで前回、実際に測ってみた結果がこの3つの値。

310,873
338,954
303.108

予想とは大分外れてしまっている。ただ、この実験は夜遅い時間(鯖が混む時間)にやったので、そのせいで悪い数値が出たのかもしれない。

再実験

そこで、今日は鯖の空いている時間帯に再度実験をしてみた。4回測定してみた結果がこれ。

428,694
414,840
414,229
397,755

今度は逆に、予想値より若干高い値になった感じもするけれど、グラフと見比べてみると割と肉厚な辺りに収まっている。なのでおおまかには予想の範囲内と言って良さそう。このプログラム結構信頼できるかもだ。

というか、条件は全く同じなのに鯖が混んでいる時と空いている時とでこんなにも違うもんなんだと改めて実感。2割は落ちると思っておいた方がよさそう。

攻撃力計算機

この日記の右側の「リンク」のところに「〇〇計算機」というのがある。
これは、装備からスキルの攻撃力を求める計算機。

まだ、一部作りかけだったりするのを放置してしまっている。

一応、今でも使えるはずなんだけれど、人によっては、(以前使えたのに)使えなくなってるって事があるかもしれない。

そんな時は、クッキーを消すと直る可能性がある。本当は消したりせずに正しく動くように書くべきなんだけれど、上手くできなかったので対処療法として、クッキーを消してみてください。

消す手順は、ブラウザによって違ってくるのだけれど、例えばfirefoxの場合は

Cookie を削除してコンピューターに保存されたウェブサイトの情報を削除する | Firefox ヘルプ

例えばこことかに載ってる。これを参考にochanikki.web.fc2.comのサイトのクッキーを消す。

あるいは、ブラウザを変更するとうまく動くかもしれない。今日聞いた方の話だとIEだとうまく動かなかったのにクロームだと動いたらしい。

モンクDPS予想2

DPS予想プログラム

前回の日記で書きかけだったDPS予想プログラムを完成させた。

こんな感じ

N=10000                  # 実験回数

FB=0.45*(1.21+0.05)      # FB発動率
BB1=0.05*(1.21+0.05)     # BB発動率
BB2=BB1+0.45             # BB発動率(FBからの発動)

DM_N  = 371              # 通常攻撃与ダメ
DM_FB = 824              # FB与ダメ
DM_BB = 1396             # BB与ダメ

ST_N  = (2+1)*1.3*1.3    # 通常攻撃スタミナ
ST_FB = (4+1)*1.3        # FBスタミナ
ST_BB = (6+1)*1.3        # BBスタミナ
TM_N  = 1.04             # 通常攻撃の時間
TM_FB = 0.53             # FBの時間
TM_BB = 0.53             # BBの時間
CRI=0.8                  # クリ率
CRI_DM=1.5+1.0+0.07      # クリダメ増
GRO_DM=1.0+1.2           # グロダメ増
MaxStamina = 280         # かかしの最大スタミナ

DM_Hash={:normal => DM_N, :fb => DM_FB, :bb => DM_BB}
ST_Hash={:normal => ST_N, :fb => ST_FB, :bb => ST_BB}
TM_Hash={:normal => TM_N, :fb => TM_FB, :bb => TM_BB}

$frand=Random.new()
def occ(q)
  $frand.rand(1.0) < q
end

# 攻撃の種類を決める
def at_type(prev)
  case prev
  when :start
    return :normal
  when :normal
    return :bb if occ(BB1)
    return :fb if occ(FB)
    return :normal
  when :fb
    return :bb if occ(BB2)
    return :fb if occ(FB)
    return :normal
  when :bb
    return :fb if occ(FB)
    return :normal
  end
end

def sim (max_time)
  type=:start
  stamina=MaxStamina
  gro_time=0
  time=0
  total=0
  
  while time < max_time
    type=at_type(type)
    dm = DM_Hash[type]
    dm *= CRI_DM if occ(CRI)
    if time <= gro_time then   # グロ中
      dm *= GRO_DM
    else                       # グロ中でない
      stamina -= ST_Hash[type]
    end
    total+=dm.to_i
    time  +=TM_Hash[type]
    if stamina < 0 then
      stamina = MaxStamina
      gro_time = time + 5      # 5秒間グロ
    end
  end
  total
end

N.times do
  p sim(2*60)
end

てかプログラム長い><
これまでは、シミュレート回数を10万回でやっていたけれど、処理が重いので1万回に減らした。そして、このプログラムを使って2分間かかしを通常放置で叩くシミュレートをした結果がこちら。
f:id:ochanikki:20190217232446p:plain
横軸が総与ダメで縦軸が頻度。与ダメは大体 320,000 - 420,000 くらいに収まる感じ。

実測

そしたら、実際に叩いてみたらどうなるかが気になるところだけれど、やってみた結果がこちら。

310,873
338,954
303.108

んー。正直外れていると言えば外れてる。ただ、この実験をしたのは結構夜遅い時間で、実験中も通信遅延でキャラが結構止まっていたりした。なので、そのせいで1割ぐらい下がったんだと考えれば、一応つじつまは合っている。

やはり、鯖の空いている時間帯に実験しないとだめみたい。

モンク DPS予想

これまでの実験で分かったことを総合し、モンクのDPSを予想するプログラムを作っている。

今のところ、チェインはファストブローとブラスティングブローのみで、通常放置でかかしを叩いた場合のみを想定している。
それでも、グロで与ダメが変わったりするので、案外作るのに苦労している。
まだ未完成で、動かすこともできていない><。けれど、「りあえず今こんな感じ」というのを載せてみる。完成までもう少しかかりそう。

FB=0.45*(1.21+0.05)      # FB発動率
BB1=0.05*(1.21+0.05)     # BB発動率
BB2=BB1+0.45             # BB発動率(FBからの発動)

DM_N  = 371
DM_FB = 824
DM_BB = 1396

CRI=0.8                  # クリ率
CRI_DM=1.5+1.0+0.07      # クリダメ増
GRO_DM= 1.0+1.2          # グロダメ増

MaxStamina = 280         # かかしの最大スタミナ

$frand=Random.new()
def occ(q)
  $frand.rand(1.0) < q
end

# 攻撃の種類を決める
def at_type(prev)
  case prev
  when :start
    return :normal
  when :normal
    return :bb if occ(BB1)
    return :fb if occ(FB)
    return :normal
  when :fb
    return :bb if occ(BB2)
    return :fb if occ(FB)
    return :normal
  when :bb
    return :fb if occ(FB)
    return :normal
  end
end

DM_Hash={:normal => DM_N, :fb => DM_FB, :bb => DM_BB}
ST_Hash={:normal => ST_N, :fb => ST_FB, :bb => ST_BB}
TM_Hash={:normal => TM_N, :fb => TM_FB, :bb => TM_BB}


def sim (max_time)
  type=:start
  stamina=MaxStamina
  gro_time=0
  time=0
  
  while time < max_time
    type=at_type(type)

    dm = DM_Hash[type]
    dm *= CRI_DM if occ(CRI)

    if time <= gro_time then   # グロ中
      dm *= GRO_DM if gro
    else                       # グロ中でない
      stamina -= ST_Hash[type]
    end

    total+=dm
    time  +=TM_Hash[type]

    if stamina < 0 then
      stamina = MaxStamina
      gro_time = time + 5      # 5秒間グロ
    end
  end
end
    
sim(60)