職業固有バグ

ロードスには沢山のバグがあるけれど、ものによっては特定の職の人にしか知られていないバグもある。

マセのプルアップバグ

先週、PT中に教えて貰ったのはマセのプルアップ不発バグ。その名の通り、プルアップを打ったのにもかかわらずスキルが出ないというもの。

肝心な時に不発になれば、知らない人からは「えー、何で今プルアップしてくれないの?」みたいに思われかねない。

他に重要スキルの不発バグとしては、モンクのBSとパラのバッシュがある。こちらの方は他職にも割と知られているとは思うけれど…。BSの不発バグになると1,2分間BSない状態になったりして、いたたまれなくなる。パラさんはバッシュを優先するためにチェインを外すこともあるみたい。

モンクのエンゲ

プルアップと似たスキルで、モンクにはエンゲがある。自分の経験した限りでは、エンゲの不発は今まで一度もない。けれど、位置ずれは何度もあった。このせいで敵が思っていたのと違うところに来てしまう。このバグが起きてしまうと、はやり「えー、引っ張るのそこじゃないでしょ」みたいに思われてないかヒヤヒヤする。

プリ

プリにも実は、知らない人には下手プリに見られかねないようなバグが結構ある。これを書き出すとちょっと長くなりそうなのでまた後日。

金率調査

3月2日 (湖上の庭園)

45スカ 50体中 金0個
111プリ 50体中 金0個

3月3日 (湖上の庭園)

45スカ 50体中 金1個
111プリ 50体中 金0個

スカでやっと金が1個でた。思ってたよりだいぶ少ない。

金の出現率

金の出現率に関しては分からないことがたくさんある。

特に気になっているのは、

  • PT時とソロ時とで出現率に差があるのか?
  • 金出現率アップのOPを複数人が付けていた場合、その最大値が使われるのか?あるいは平均値か?合計値か?
  • ダンジョンとフィールドで出現率に差があるか?
  • そもそもデフォルトの出現率はどのくらいなのか?

という感じ。

出現率を調査したいと思った場合、素朴には敵を何百体か倒して、そのうち金がどのくらい出るかを測定する、という形になるけれどそんなに数えるのは大変だし数え間違いも起きそう。

依頼を使う

なので、数える手間と数え間違いの危険性を少しでも減らすために、デイリーの依頼を使うという方法を考えてみた。例の☆1モンスターを50体倒すというやつ。

あれで何体倒したかが確認できるので、自分は金の数だけ数えておけばよい。だいぶ楽。そして、50体倒したらポップで知らせてくれる。

この方法だと一日50体までしか確認できないけれど、これで何日かかけてコツコツやっていけば良さそう。

実験

それで、実際にやってみた結果がこちら。

1. 111プリでカノン北の街道 (金UP20%) (灰色ネーム)

50体中 金0回

2. 40スカで湖上の庭園 (金UP6%) (白ネーム)

50体中 金0回


すごい、100体倒して金0とか。金運なくてビックリした!

ブロー系のチェイン与ダメ内訳

以前モンクさんの与ダメを予想するプログラムを作った。

モンクDPS予想3 - お茶の国 プリ日記 ロードス島 調査兵団

このシミュレータを使う事で、通常放置時の与ダメの内訳も測定できる。

実際に計算してみると、こんな感じになった。
f:id:ochanikki:20190228234449p:plain

通常攻撃: 12.2%
FB: 34.3%
BB: 32.0%
FnB: 21.5%

このシミュレーションでは、訓練用の武器を使っているけれど、通常の武器に変えたとしても与ダメの比率は変わらないはず。

CT減

FBは即時発動、BBはCT1秒なのに対し、FnBはデフォルトのCTが5秒になっている。となると「CT減をたくさん積むとFnBの与ダメ比があがるんじゃないか」と予想できる。
例えば、そんな予想の検証も、このシミュレーションでできる。実際CT減を50%にして計算してみるとこうなった。

通常攻撃: 11.6%
FB: 32.6%
BB: 30.3%
FnB: 25.5%

たしかにFnBの比率が少し上がることが確認できる。

感想

いままで、与ダメの内訳を知ることはかなり困難だった。でもこのシミュレータを使うと、こんな感じに簡単に調べることが出来、そしてステの数値が変わったときに、内訳にどう影響するかも確認できる。

抜刀バグ2

先週、抜刀バグ関する日記を書いた。

抜刀バグ1 - お茶の国 プリ日記 ロードス島 調査兵団

蔵落ち

今日は、PT中に蔵落ちしたした人がいた場合、プリはどうするとよいのかを考えてみる。例えば、PTが2chで狩りをしていたとして、誰かが蔵落ちした場合、その人は1chに戻ってくる。なので、

復帰 → 敵に殴られる → コール → 2chに移動 → 抜刀バグ発生

という流れで、抜刀バグが発生してしまう。これに対処するには、二通りの考え方がある。一つは「抜刀バグを起こさせない」という方針で

復帰 → 敵に殴られる → 安全な場所に移動してタゲを切る → コール → 2chに移動

という感じ。タゲを切ってからchを移っているので抜刀バグが起きない。そしてもう一つは「抜刀バグになってもリログで解除」という方針で

復帰 → 敵に殴られる → コール → 2chに移動 → 抜刀バグ発生 → 安全な場所に移動 → リログ → コール → 2chに移動

という流れ。

文字にしてみると後者の方が大変に見えるけれど、実際の所そんなにかわらない。というのも「安全な場所に移動してタゲを切る」のに比べ単に「安全な場所に移動する」だけはずっと楽なので。

プリの対処

ここで、視点をプリの側に移して考えてみる。上に挙げた二つの方針で、プリのコールのタイミングが大分変ってくる。前者は復帰後少し時間をおいてからコール、後者なら復帰後すぐにコールという感じ。そして、火力さん達の間では復帰後の対処法の好みが人それぞれだったりする。なので、火力のニーズに完全に答えるプリには、火力一人一人がそれぞれどちらを好んでいるかを把握し、それに応じたタイミングでコールすることが求められる。

…という事は分かっているのだけれど、正直自分にとって、それは高度過ぎて出来る範囲を超えてしまっている。なので、自分の場合は、上に書いた様なことは気にせず、単純に「復帰後即コール」に統一している。復帰後即コールを嫌がる火力さんが居るのは分かっているのだけれど、それについてはごめんなさい。

課金装備 (2018/12/26 - 1/30)

2018/12/26 - 1/30の間に新しく出た課金装備のまとめ。

課金装備 (2019/1/30 - 3/6)の分はこちら
課金装備 (2019/1/30 - 3/6) - お茶の国 プリ日記 ロードス島 調査兵団

シーダの可憐な箱 (1/23 - 1/30)

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

妖精の加護 (U1/U2 装身具)

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

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

フレイムセスタス (U1 腕)

レベル50制限 (UOP付与可能)

OP1[固定] クリ率 +18%
OP2[固定] 最終ダメ +18%
OP3[ランダムで1種] クリダメ +23% or 命中率 +18% or 攻撃速度 +23%

U2化時
OP1[固定] クリ率 +28%
OP2[固定] 最終ダメ +23%
OP3[ランダムで1種] クリダメ +28% or 命中率 +23% or 攻撃速度 +28%

ヴェラの可憐な箱 (1/9 - 1/23)

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

自戒の甲羅 (U1 装身具)

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

U2化時
OP1[固定] クリ率 +25%
OP2[ランダムで1種] 被ダメ(物理) -20% or -30%
OP3[ランダムで1種] 被ダメ(魔法) -20% or -30%
OP4[ランダムで1種] チェインダメ I or II or III +55%

サラの神秘的な箱 (2018/12/26 - 1/9)

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

ロード・トゥ・ロード (U2 頭)

レベル60制限 (UOP付与可能)
OP1[固定] CT減 30%
OP2[固定] クリ率 +40%
OP3[固定] 被ダメ(物理) -20%
OP4[固定] クリダメ制限 +20%

昨日のプログラムの検証

昨日の日記で総与ダメを予想するプログラムを書いた。今日はその信頼性を検証してみたい。まず、プログラムを実行してみた結果がこちら。
f:id:ochanikki:20190225231051p:plain
横軸が総与ダメで、縦軸が頻度。グラフを見た感じでは44万ぐらいが平均で、39万 - 49万に大体収まるかな、と見て取れる。

実測

では、同じ条件で実際に叩いてみるとどうなるのか試してみたい。こうなった。

461,759
529,244
476,803
413,791
475,024

fmfm。52万のやつが少しはみ出た感はあるけど、大体いい感じかなと思う。
このプログラムによる予想は割と上手くいってると言っていいかも。

今後

現状、訓練用の武器を使っているけれど、これを通常の武器に変えるのはそれほど難しくないと思っている。

それから、今はチェインにブロー系のものを使っているけれど、これを他の系統(あるいは混合)にも対応したいと思っている。

その場合、重要になってくるのがチェインスキルの占有時間。言い換えれば、そのスキルが発動した時にそのスキルのモーションが何秒間続くのかという値。

実は、この値を調べるのには結構苦労していて、今みたいに動画にとって、コマ送りで数えるというやり方は手間がかかる上に、鯖遅延の影響を受けてしまって、正確性が落ちる。かといって他に方法も浮かばないし…。

モンクDPS予想3

既に、何回かDPS予想プログラムを載せているけれど、今回やっとファーストブロー(以下、FB)、ブラスティングブロー(以下、BB)、フィニッシュブロー(以下、FnB)の全部を付けた状態でのプログラムが完成。FnBにはデフォルトで5秒間のCTがあるので、その辺をきちんと扱うのが難しかった。

N=10000                  # 実験回数

FB=0.45*(1.21+0.05)      # FB発動率
BB=0.05*(1.21+0.05)      # BB発動率
FnB=0.05*(1.21+0.05)     # FnB発動率

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

ST_N  = (2+1)*1.3*1.3    # 通常スタ攻
ST_FB = (4+1)*1.3        # FBスタ攻
ST_BB = (6+1)*1.3        # BBスタ攻
ST_FnB= (8+1)*1.3        # FnBスタ攻

TM_N  = 1.04             # 通常攻撃の時間
TM_FB = 0.53             # FBの時間
TM_BB = 0.53             # BBの時間
TM_FnB= 0.53             # FnBの時間

CT_FnB= 5*0.8            # FnBのCT

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, :fnb => DM_FnB}
ST_Hash={:normal => ST_N, :fb => ST_FB, :bb => ST_BB, :fnb => ST_FnB}
TM_Hash={:normal => TM_N, :fb => TM_FB, :bb => TM_BB, :fnb => TM_FnB}

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

# 攻撃の種類を決める
def at_type(prev, time, fnb_ct)
  fnb = time >= fnb_ct    # FnBのCTが終わっているか
  case prev
  when :normal
    return :fnb if fnb && occ(FnB)
    return :bb if occ(BB)
    return :fb if occ(FB)
  when :fb
    return :fnb if fnb && occ(FnB)
    return :bb if occ(BB+0.45)
    return :fb if occ(FB)
  when :bb
    return :fnb if fnb && occ(FnB+0.30)
    return :fb if occ(FB)
  when :fnb
    return :bb if occ(BB)
    return :fb if occ(FB)
  end
  return :normal
end

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

    fnb_ct = time+CT_FnB if type==:fnb
    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

まだプログラムを書いてみただけなので検証はまた後日。