トップ «前の日記(2014/10/22) 最新 次の日記(2014/10/24)» 編集

SikabaneWorksが関係するコンテンツ(主に*band系ローグライク)の開発近況・補足から全く個人的な雑記まで。

[WEB:屍の見える丘公園]| [RSS]

Angband | Badiashimshe | C# | CRAUZEL | D'angband/小説草稿 | D'angband/開発 | DarkSouls | Demon'sSouls | DungeonCrawl | ElvenUteruses | Haskell | Hengband | J9シリーズ | LEGO | LineDrawing | MISC | MTG | Mac | Math | Moria | R-18 | Roguelike | Rough | RoughSketch | Ruby | SDL | UNIX | VMware | WarHammer | Zangband | アタシラヂョウヲウ | イラスト | ガジェット | ゲーム | ゲーム紹介 | ゲーム製作技術 | ゲーム論 | スケッチ | ツクール | テクノロジー | ニコニコ動画 | ファルコム | ファンタジー | マリオ | ヴィーヤウトゥムノ | 別記事追加予定 | 変愚蛮怒 | 変愚蛮怒/スポイラー | 変愚蛮怒/元ネタ探訪 | 変愚蛮怒/攻略 | 変愚蛮怒/開発 | 宗教 | 情報 | 政治 | 文字コード | 日ペ昔話 | 東方ワンドロ | 東方外法漢女 | 歴史 | 漫画製作 | 版権絵 | 画像処理 | 翻訳 | 自然言語 | 艦隊これくしょん | 落書き | 言語解析 | 読書 | 超人ロック | 追記予定 | 通信 | 阿片窟 | 馬鹿馬鹿蛮怒/開発 | 魔法少女まどか☆マギカ | 魚類版深夜の真剣お絵描き60分一本勝負


2014/10/23

[ヴィーヤウトゥムノ] リッチ/Lich (White 'L')

=== Num:518  Lev:34  Rar:3  Spd:+0  Hp:300  Ac:60  Exp:800
それはローブに身を包んだ骸骨のようだ。それは邪悪な力を広範囲に渡って放射
している。
それは通常地下 34 階で出現し、普通の速さで動いている。この邪悪なるアンデ
ッドのモンスターを倒すことは 1 レベルのキャラクタにとって 約9066.67 ポイ
ントの経験となる。それは的確に魔法を使うことができ、魔力吸収、脳攻撃、致
命傷+呪い、恐怖、目くらまし、減速、麻痺、ショートテレポート、テレポート
バック、テレポートアウェイの呪文を唱えることがある(確率:1/4)。それは AC60
の防御力と 300 の体力がある。それはドアを開け、ドアを打ち破ることができ
る。それは冷血動物である。それには明るい光でダメージを与えられる。それは
冷気と毒と地獄の耐性を持っている。それは経験を積むと、窖の怪物に進化す
る。それは混乱しないし、眠らされない。それは侵入者を見過ごしがちであるが、
200 フィート先から侵入者に気付くことがある。それは一つか二つのアイテムや
財宝を持っていることがある。それは触って経験値を減少(40d6+)させ、触って充
填魔力を吸収し、 2d8 のダメージで触って器用さを減少させ、 2d8 のダメージ
で触って器用さを減少させる。

0

Urwen

アッキ=ニンジャ『ウルウェン』
『リッチ』それは、ソーサラー達の永遠の憧れ。
だが、その頂点に立てるのはほんの一握り…(Lich M@ster)

Romunqualy

鬼畜大佐『ロムンクァリィ』
ここまでたどり着けた奴の業ってのはどんなもんであれ、
愛おしくてならないわ。ああ^~。

[変愚蛮怒/スポイラー] project_p()及びproject_m()関数周辺による範囲魔法の距離に応じたダメージ減衰について

プレイヤーへの魔法攻撃ダメージを処理するproject_p()関数とモンスターへの魔法攻撃ダメージを処理するproject_m()関数は双方とも、通常のダメージ量damと、減衰距離rを引数に持っている。

そしてソース上の計算処理

dam = (dam + r) / (r + 1)

により÷(距離+1)、ただし小数点切り上げという形でダメージが減衰する。

この減衰距離rがどのような条件の時に、どのような値が代入されるかをたどることで、ボール、ブレス各種の範囲攻撃魔法の減衰量がどうなるかを確認できる。

そこを遡った結果、非常に冗長なproject()関数中のプレイヤー、モンスターそれぞれの処理ブロック内でeffective_dist変数が宣言されており、これが最終的にproject_p()、project_m()のrとして代入されることを確認できた。

以上、それぞれのブロック内でeffective_distにどのような値が入るかをたどった。

モンスター向けブロック内のeffective_dist

  • ブレス処理以外の場合は各範囲走査処理で得られたgm(効果中心からの距離)を変数distに代入されたものがさらにそのままeffective_distに代入される。つまりボルト、ビームならば常に0、ボールならば中心からの距離になる。
  • ブレス処理の場合は別途、dist_to_line()関数により、中心直線からの距離をeffective_dist()に代入する。
  • プレイヤーに騎乗されたペットならば以下の処理を施す。
    • 魔法がプレイヤーに与えることを想定したもの(PROJECT_PLAYER)で、ビーム(PROJECT_BEAM)でなく反射可能(PROJECT_REFLECTABLE)でなく、なおかつ近接打撃の追加効果(PROJECT_AIMED)でもない場合はeffective_distに+1
    • 魔法がプレイヤーに与えることを想定したものでない場合さらに以下の判定を行う。
      • PROJECT_AIMEDであった場合はこれ以上減衰しない。
      • PROJECT_BEAMかPROJECT_REFLECTABLEならば、1/2の確率でこれ以上減衰しない。残り1/2の確率で、プレイヤー全てダメージを流すことにして、ダメージ処理そのものをスキップする。その際にPROJECT_PLAYERフラグを付加して後のプレイヤー向けブロックに託す。
      • 以上のいずれでもなければeffective_distに+1

プレイヤー向けブロック内のeffective_dist

  • ブレス処理以外の場合は各範囲走査処理で得られたgm(効果中心からの距離)を変数distに代入されたものがさらにそのままeffective_distに代入される。つまりボルト、ビームならば常に0、ボールならば中心からの距離になる。
  • ブレス処理の場合は別途、dist_to_line()関数により、中心直線からの距離をeffective_dist()に代入する。
  • プレイヤーがペットに騎乗中である場合以下の処理を施す。
    • PROJECT_PLAYERフラグ付きでプレイヤーに直撃するならばこれ以上減衰しない。
    • PROJECT_BEAM、PROJECT_REFLECTABLE、PROJECT_AIMEDのいずれかを持っていればこれ以上減衰しない
    • 上記いずれのフラグも持っていなければeffective_distに+1

結論

  • ボルト系はいわずもがなペット騎乗時以外は単体に直撃。
  • ビーム系魔法はどの範囲で当たっても減衰なしでそのままダメージが入る。
  • ボール系は炸裂した中心距離からの距離に応じて×1、×(1/2)、×(1/3)と減衰していく。
  • ブレス系は中心直線からの距離に応じて×1、×(1/2)、×(1/3)と減衰していく。
  • プレイヤーがペットに騎乗していた場合、打撃による付随効果でなく、ビームでなく、反射可能でもない攻撃の場合、ペットも攻撃を浴びてくれることで、距離1分の減衰が発生する場合がある。全部をペットが肩代わりしてくれることはないし、一切なしで直撃する可能性も1/2の確率で存在する。

ということでいいはず。

余談

一部の特殊な攻撃範囲を持つ鏡魔法(封魔結界)などは、常にproject_m()関数のみを呼んでモンスターのみにダメージを与え、しかも減衰距離rは常に0としている。これらはproject()関数を参照せず、全く独立して実装されているので注意。