2014/10/22
■ [ヴィーヤウトゥムノ] 銅のクリーピングコイン/Creeping copper coins (Umber '$')
=== Num:85 Lev:4 Rar:2 Spd:-10 Hp:7d8 Ac:24 Exp:9 それはコインの塊だ。 それは通常地下 4 階で出現し、ゆっくりと動いている。この自然界のモンスター を倒すことは 1 レベルのキャラクタにとって 約12.00 ポイントの経験となる。 それは AC24 の防御力と 7d8 の体力がある。それはドアを打ち破ることができ る。それは冷血動物である。それは毒の耐性を持っている。それは経験を積む と、銀のクリーピングコインに進化する。それは混乱しないし、眠らされない。 それは侵入者を幾分注意深く見ており、 30 フィート先から侵入者に気付くこと がある。それは一つか二つの財宝を持っていることがある。それは 1d7 のダメー ジで殴って攻撃し、 2d5 のダメージで触って毒をくらわす。
アッキ=ニンジャ『ウルウェン』
相変わらず思い出は仕事しねえな、おい。
鬼畜大佐『ロムンクァリィ』
なんで、どうやって銀に進化するのかも、理解に苦しむね(ペチペチ)
■ [変愚蛮怒/スポイラー]breath_shape()関数によるブレスの範囲指定
引数として、
- path_g(ブレス中心直線経路配列)
- dist(ブレス中心直線経路のマス数)
- pgrids(ブレスが影響を及ぼしたマスの数を返す参照先)
- gx/gy(ブレスが影響を及ぼしたマスの座標配列を返す参照先)
- gm(影響を及ぼすと判定された際のブレス発射元からの距離を返す参照先)
- pgm_rad(影響を及ぼした最大範囲を返す参照先)
- rad(目標中心範囲)
- y1/x1(ブレス発射地点)
- y2/x2(ブレス目標地点)
- typ(効果属性ID)
を持つ。
- ブレス範囲は、目標地点からの距離を基準として0から順に走査され、その値は変数bdisに代入される。
- mdisに(ブレス発射地点から目標までの中心距離)+目標中心範囲を代入する。
- bdisを0からmdisまで順にインクリメントしながら以下の処理を繰り返す。
- distが0(ブレス発射地点)でない限り、中心直線経路に入ったマスを一つえらび、そのマスがbdis以下であった場合、by/by(中間地点)として更新する。中心直線経路のマスカウント数をpath_nとして開始値0からカウントする
- bradの値は rad * (path_n + (rad^2/dist)) / (dist + (rad^2/dist))で算出
- この中間地点から半径brad(中間範囲)内を走査して、フロア範囲外座標でなく、ブレス発射地点がbdisと一致するもののみをブレス範囲に加える。
- また効果属性を確認し、LITE(閃光)/LITE_WEAK(弱い光)の場合は視界内に収まっていないマス(los()関数基準)を、DISINTEGRATE(分解)の場合は分解範囲になっていないマス(in_disintegration_range関数基準)を、それ以外の属性では射撃範囲になっていないマスを(projectable()関数基準)を除外する
- distが0(ブレス発射地点)でない限り、中心直線経路に入ったマスを一つえらび、そのマスがbdis以下であった場合、by/by(中間地点)として更新する。中心直線経路のマスカウント数をpath_nとして開始値0からカウントする
このままでは無茶苦茶分かりづらいと思うので、実例を見せる。ゲームプレイ中にブレスが吐かれた際の描画アニメの流れがそのままbdisの値を0からmdisへインクリメントする順に描写したものになっているので、これをみれば一目瞭然である。
ということで
デバッグモードでHFO子をLv1のまま竜窟の深層に放り込んで、ウォーターZのブレスの餌食にした。おう、あく浴びろよ、死ねよ。
今回の場合、 rad=2 / dist=7である。
bdis=0 / path_n=0(ノーカウント) / brad=0(初期値)
ウォーターZ自身も当然範囲に巻き込まれるが、後でダメージ処理自体がキャンセルされるので問題ない
bdis=1 / path_n=0 / brad=2*(0+4/7)/(7+4/7)=0
bdis=2 / path_n=1 / brad=2*(1+4/7)/(7+4/7)=0
bdis=3 / path_n=2 / brad=2*(2+4/7)/(7+4/7)=0
bdis=4 / path_n=3 / brad=2*(3+4/7)/(7+4/7)=0
ここまでは全くビームと変わらない
bdis=5 / path_n=4 / brad=2*(4+4/7)/(7+4/7)=1
ここで初めてbrad=1中心曲線経路から1マス以内かつ、ウォーターハウンドからの距離がbdis=4の地点が範囲に加算される。
bdis=6 / path_n=5 / brad=2*(5+4/7)/(7+4/7)=1
bdis=7 / path_n=6 / brad=2*(6+4/7)/(7+4/7)=1
bdis=8 / path_n=7 / brad=2*(7+4/7)/(7+4/7)=2
ここではじめてpath_nがカンストし、範囲bradは2になる。
bdis=9 / path_n=7 / brad=2*(7+4/7)/(7+4/7)=2
HFO子から見て右に2マス、下に1マスの位置がブレスに収まらないのは、 HFO子からの距離は2ではあるが、ウォーターZから見れば10になってしまうから、と思われる。(変愚の整数距離計算関数distance()はニュートン・ラプソン法を用いている)
ち~ん(笑)
敵モンスターはブレスやボール系魔法については、友軍が巻き込まれることを一切躊躇しない。
まとめ
以上、単純に言えばブレスの範囲は発射元から目標を垂線+それと直行する直径を一辺とした二等辺三角形+くっついた半円のアイスクリーム的形状に近い形に見える。
しかし実際は三角形の辺がbradの微妙な計算で怪しげな曲線を描いていたり、距離を整数で計算しているためにかなりカオスなことになっていることが判明した。もうめんどい。