(RPG)ドロップテーブルの設計


18

この質問はMMOやディアブロのようなゲームに関係していると思います。

ドロップテーブルを実装するための通常のデザインは何ですか?そこでは、モンスターは割合に応じてさまざまな種類のアイテムをドロップできますか?私はアイテムタイプに「パーセント重量」の辞書を置くことが最も簡単な方法だと思いますが、新しいアイテムタイプを導入したい場合はこれを拡張するのは難しいです(たとえば、D2拡張にルーン文字と新しいクラスアイテムが含まれる場合)


4
新しいアイテムを追加するときにパーセンテージ辞書を拡張するのが難しいのはなぜですか?合計100%にするためにすべてのパーセンテージを必要としない場合(そして、モンスターが常に単一のアイテムをドロップしたい場合にのみ、これは私にはかなり奇妙です)を意味します問題。
10

1
Orc => {'dagger'、 'sword' 'armor'}と言うと、ルーンと言う新しいアイテムタイプがあります。各モンスタータイプに関連付けられているすべての辞書を直接更新する必要があります。もちろん、これは他の間接層が解決できないものではありません。質問は、そのレイヤーがどのように見えるかということです。
-Extrakun

辞書の更新が難しいと思う理由がわかりません。Pythonでは、たとえば、1つの辞書を新しい値で拡張するには、1つの方法で行います。難しさはどこにあると思いますか?
キロタン

2
Extrakun、以下の私の答えを見ると、「別の間接的な層」の質問に対する答えがあります。ドロップをフラットテーブルとして扱う代わりに、ネストされた式からドロップを構築できます。名前付きマクロ(関数など)を許可する場合、異なるテーブル間でドロップテーブルのチャンクを再利用できます。
10

2
ゲーム開発の「キャッチ」につまずいたばかりです。確かに、2日でゲームを作成できますが、コンテンツを追加してから5年間が経過します。そして、コンテンツの追加はすごいです。研削。
TorのValamo

回答:


22

私が取り組んでいたローグライクゲームでは、ドロップを生成するための非常に柔軟なデータ駆動型システムを実装しました。ここに文書化しました。ランダムに選択された多数のアイテムを選択するための、本質的に小さな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)

実際のプログラミング言語のように、ドロップ式を任意に深くネストできます。これにより、単純なテーブルベースのアプローチでは得られない構成可能性が得られます。

すべてのデータ駆動型システムと同様に、不可解なほど複雑なドロップを作成することで自分を圧倒できますが、それは私の目標を満たしています。

  1. コード外で完全にドロップされるものを指定できます。
  2. コアシステムをコードで簡単に実装できます。
  3. プレイヤーが目標指向の探索を行えるように、特定のモンスターがドロップするものを調整できます。(「ネックレスが必要です。ドワーフは落とす傾向があるので探します。」)

これを実装するC#コードはこちらです。


これは、これまで見たことのない実装の1つです。ありがとう!
Extrakun

12

Stendhalでは、戦利品テーブルはリストです。各エントリには、アイテムの名前、最小および最大数量、確率が含まれています。内部構造は、クリーチャーのWebページに表示されるものと非常に似ています。

私たちにとって重要なのは、世界に精通したゲームデザイナーがそのようなことを定義できることです。つまり、プログラムコードレベルで複雑なロジックを理解することはありません。したがって、プログラムコードにはクリーチャーとアイテムの定義はありませんが、それらをelves.xmlclub.xmlなどの.xmlファイルに移動しました。GUIエディターはありますが、ほとんどのゲームデザイナーは.xmlファイルを直接変更します。

クリーチャーとアイテムを簡単に拡張できるようにするために、ビルディングブロックシステムを使用します。「elf」または「archer elf」のプログラムクラスはありません。しかし、「co病者」、「パトロール」、「攻撃的」、「アーチャー」、「ヒーラー」などの行動関連のクラスがいくつかあります。設計者は、プログラムコードを記述することなく、これらの動作を選択する新しいクリーチャーを定義できます。たとえば、「アーチャーエルフ」を作成するには、弓でエルフスプライトを描き、「攻撃的」、「アーチャー」として定義します。次に、レベルおよび類似の属性を定義し、いくつかのエルフのアイテムを戦利品テーブルに追加します。

アイテムについても同様のアプローチがありますが、現在は1つの動作に制限されています。デザイナーは新しいアイテムを追加し、「ConsumableItem」、「KeyItem」、「AttackItem」、「Spell」、「Scroll」ロジックをプログラムする必要があります。


8

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の値を生成します。


3

表面的には、これは「重み付けランダム選択」問題と同じように見えます。

ランダムイベントを決定するアルゴリズム

各イベントに相対的な確率を割り当て、それらを加算し、その範囲内で乱数を選択して、どのイベントを希望するかを決定します。

パーセンテージを使用することを好む場合でも(これは同じシステムで、ちょうど100にスケーリングされます)、ものを追加するのがどれほど難しいかを過大評価しています。100%があり、その後20%を展開に追加する場合は、すべての値を(120/100)で割ると、合計100%に戻ります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.