この質問はMMOやディアブロのようなゲームに関係していると思います。
ドロップテーブルを実装するための通常のデザインは何ですか?そこでは、モンスターは割合に応じてさまざまな種類のアイテムをドロップできますか?私はアイテムタイプに「パーセント重量」の辞書を置くことが最も簡単な方法だと思いますが、新しいアイテムタイプを導入したい場合はこれを拡張するのは難しいです(たとえば、D2拡張にルーン文字と新しいクラスアイテムが含まれる場合)
この質問はMMOやディアブロのようなゲームに関係していると思います。
ドロップテーブルを実装するための通常のデザインは何ですか?そこでは、モンスターは割合に応じてさまざまな種類のアイテムをドロップできますか?私はアイテムタイプに「パーセント重量」の辞書を置くことが最も簡単な方法だと思いますが、新しいアイテムタイプを導入したい場合はこれを拡張するのは難しいです(たとえば、D2拡張にルーン文字と新しいクラスアイテムが含まれる場合)
回答:
私が取り組んでいたローグライクゲームでは、ドロップを生成するための非常に柔軟なデータ駆動型システムを実装しました。ここに文書化しました。ランダムに選択された多数のアイテムを選択するための、本質的に小さなDSLです。
単純なドロップは次のようになります。
1-10 copper coin
1から10の間のランダムな数の銅のコインを落とすだけです。ブランチを追加すると物事はより柔軟になります:
one of
turquoise stone (50%)
onyx stone (25%)
malachite stone (15%)
jade stone (10%)
「1つ」は、指定された確率に基づいて子ブランチの1つを選択し、それを評価します。ドロップは、複数のアイテムをドロップできます。
any of
turquoise stone (50%)
onyx stone (25%)
malachite stone (15%)
jade stone (10%)
これは、すべてのサブブランチを評価し、確率に対するロールがパスした場合にそれらをドロップします。ダンジョンとプレイヤーのレベルに基づいてアイテムを選択するためのブランチもいくつかあります。
これらは複雑になる可能性があるため、ブランチ式を展開し、複数のドロップで再利用できる、本質的には名前付きマクロを定義することもできます。たとえば、すべてのドワーフが同じ種類の戦利品をドロップした場合、巨大なドロップテーブルをコピーして貼り付ける代わりに、そのための単一のマクロを作成し、それらのすべてのモンスタータイプで使用できます。
:: ancient dragon
glyph = D
groups = dragon
drops
(coins)
2-3(1:8) one of
(any-weapon)
(any-armor)
ここでは、(coins)
、(any-weapon)
、および(any-armor)
すべてのマクロ呼び出しは以下のとおりです。
(any-armor)
one of
(shield)
(helm)
(boots)
(gloves)
(cloak)
(robe)
(soft-armor)
(hard-armor)
次のようなものを呼び出します:
(cloak)
one near level
cloak (10)
velvet cloak (20)
fur-lined cloak (50)
実際のプログラミング言語のように、ドロップ式を任意に深くネストできます。これにより、単純なテーブルベースのアプローチでは得られない構成可能性が得られます。
すべてのデータ駆動型システムと同様に、不可解なほど複雑なドロップを作成することで自分を圧倒できますが、それは私の目標を満たしています。
これを実装するC#コードはこちらです。
Stendhalでは、戦利品テーブルはリストです。各エントリには、アイテムの名前、最小および最大数量、確率が含まれています。内部構造は、クリーチャーのWebページに表示されるものと非常に似ています。
私たちにとって重要なのは、世界に精通したゲームデザイナーがそのようなことを定義できることです。つまり、プログラムコードレベルで複雑なロジックを理解することはありません。したがって、プログラムコードにはクリーチャーとアイテムの定義はありませんが、それらをelves.xmlやclub.xmlなどの.xmlファイルに移動しました。GUIエディターはありますが、ほとんどのゲームデザイナーは.xmlファイルを直接変更します。
クリーチャーとアイテムを簡単に拡張できるようにするために、ビルディングブロックシステムを使用します。「elf」または「archer elf」のプログラムクラスはありません。しかし、「co病者」、「パトロール」、「攻撃的」、「アーチャー」、「ヒーラー」などの行動関連のクラスがいくつかあります。設計者は、プログラムコードを記述することなく、これらの動作を選択する新しいクリーチャーを定義できます。たとえば、「アーチャーエルフ」を作成するには、弓でエルフスプライトを描き、「攻撃的」、「アーチャー」として定義します。次に、レベルおよび類似の属性を定義し、いくつかのエルフのアイテムを戦利品テーブルに追加します。
アイテムについても同様のアプローチがありますが、現在は1つの動作に制限されています。デザイナーは新しいアイテムを追加し、「ConsumableItem」、「KeyItem」、「AttackItem」、「Spell」、「Scroll」ロジックをプログラムする必要があります。
D&D卓上ゲームには、戦利品タイプの概念があります。ほとんどのモンスターは1つ以上のテーブルからドロップし、これらのテーブルは拡張で更新するものになります。モンスターは「65%共通、10%宝石、15%アート、10%ツール」をドロップしますが、これらの各テーブルの内容を更新します。
例えば、宝石には「1宝石(25%)2宝石(50%)5宝石(75%)100宝石」を返すランダムな範囲のスロットが含まれています。特別なルーン宝石を追加する場合は、表を「1 gem(25%)2 gem(50%)5 gem(75%)100 gem(95%)1 runegem」に更新します。
ただし、一方で、既にパーセンテージの重み付けをしている場合は、拡張内のすべてのモンスターテーブルを更新するだけではどうですか?確かにこのようなテーブルは、テクスチャやメッシュに比べて小さなペイロードです。また、パーセンテージを最大100まで維持する必要もありません。これは、最初に行った仮定に過ぎず、ランダム値を生成する前に実際の合計を集計できます。重み付けが合計で120になる場合、1〜100ではなく1〜120の値を生成します。
表面的には、これは「重み付けランダム選択」問題と同じように見えます。
各イベントに相対的な確率を割り当て、それらを加算し、その範囲内で乱数を選択して、どのイベントを希望するかを決定します。
パーセンテージを使用することを好む場合でも(これは同じシステムで、ちょうど100にスケーリングされます)、ものを追加するのがどれほど難しいかを過大評価しています。100%があり、その後20%を展開に追加する場合は、すべての値を(120/100)で割ると、合計100%に戻ります。