2013/02/18
■ [変愚蛮怒/スポイラー]fill_treasure()関数の処理の流れ(変愚蛮怒 Ver2.1.2 rev3303)
fill_treasure()関数はランダムVault生成時にその部屋内をアイテムとモンスターで埋め尽くす大盤振る舞いの関数である。
static void fill_treasure(int x1, int x2, int y1, int y2, int difficulty)
以下の(x1,y1)-(x2,y2)の矩形範囲に、難易度に従ったアイテムの生成を行う。difficultの値は各タイプのランダムVault毎に以下の通りになっている。
ランダムVaultタイプ | 難易度 |
"Bubble Vault" | 1d5 |
"Room Vault" | 1d5+5 |
"Cave Vault" | 1d5 |
"Maze Vault" | 1d5 |
"Mini Checker Board Vault" | 10 |
"Castle Vault" | 1d3 |
"Target Vault" | 1d3+3 |
"Elemental Vault" | 1d5 |
以上を踏まえた上で、以下の処理を行う。
fill_treasure()
- size値を部屋の縦+横の長さで定める。
- 矩形範囲内の各位置に以下の処理を行う。
- そのマスに配置されるモンスターorアイテムを定めるvalue値を (部屋中央からの距離)*100/size+1d10-難易度で算出。
- ただし1d100-難易度*3>50を満たした場合value値を20で固定。
- そのマスがCAVE_FLOORフラグをもつか、FF_PLACEとFF_DROPを併せ持っていた場合、value値に応じて以下の配置を行う。
- value < 0ならば、生成階+40のモンスターと生成階+20のGOODなアイテム
- 0 <= value < 5ならば生成階+20のモンスターと生成階+10のGOODなアイテム
- 5 <= value < 10ならば生成階+9のモンスター。
- 10 <= value < 17ならば何も配置しない。
- 17 <= value < 23ならば25%で生成階相応の通常アイテム、75%でトラップ
- 23 <= value < 30ならば生成階+5のモンスターとトラップ
- 30 <= value < 40ならば50%で生成階+3にモンスター、50%で生成階+7の通常アイテム
- 40 <= value < 50ならばトラップ
- 50 <= valueならば20%で生成階相応のモンスター、40%でトラップ、20%で生成階相応のアイテム、20%でなにもなし。
以上の処理を踏まえるに、ランダムVaultはどういう種別であれ、value値<5付近が見込める中央付近に一番おいしいアイテムが存在し得るようだ。逆にいうと、中央の数マス付近が壁や配置不能地形であった場合は刺激も恩恵もほとんどなく、トラップ処理だけの徒労に終わる可能性が多いと踏んだ方がいい。
筆者は、かなり昔に"Target Vault"とおぼしき、ほとんど十字路のような形状のランダムVaultに遭遇したことがある。中央にいた『サンタクロース』無事を平らげることが出来た上、中央5つに配置されたアイテムの内3つがアーティファクトという大当たりだった。この生成処理を裏付けるものとしてはかなり面白い例だったと思う。