Friday, April 21, 2017

開設

とりあえず開設してみましたが、他に良い場所あれば移動もアリということで。:D

50 comments:

  1. <クエスト雑記1>
    「基本構造」
    クエストの構造なんですが
    シンプルなクエスト
    ●Start
    <トリガー条件はクエストが持つ>
    メモ:この場合Gameは条件を定期的に監視できる必要あり
    <他のクエ内からスタートを掛けられる>
    メモ:入れ子構造が出来るので、適当にやるとスパゲティプログラム見たくグチャグチャになる可能性あり(放置クエ、ゴミ回収処理については別途)
    <自分でストップも掛けられる>

    ●Stageを持つ
    <単純な進行度の数値化でOK>
    TES4のクエを見て分かったのですがStageはステージ整数値になってまして、これ良いなと思いました。上限は整数型の表現範囲になりますね
    多くは開始時にStage10あたりにセットされてます。
    例えば、Stage40になってる場合は、そのステージに記載されてる事以外がGameシステム側からは評価されません。
    そのステージ内でSetStage50にしたり、SetStage60にしたり出来ます。
    Stage40 →Stage50→stage55→Stage70と
    Stage40→Stage60→Stage70とかってパスが可能になってまして。
    進行度が若い数値のものは評価対象にならなくなるみたいで上手いなと思いました。
    TESではGame内からコンソールコマンドでGetStage クエスト名 ってやると数値が表示されるんです。

    まあ、ルナドンの様に同型の小クエストをマルチで発行する場合
    クエスト名がユニークにならなので、親玉クエは実体化したときにユニークな固有のIDを持つ必要が出てくるんですが、その話は別にしましょう。

    ●Stop END
    Startのところでも書いたようにStop Questがクエ内でも発行可能だし
    別のクエや別の仕組みからもStop可能。

    さて、問題はクエスト関係者として生成されたり、アサインされるオブジェクトの管理ですね。

    ルナドンの場合、NPCが選ばれてアサインされますね。
    LD2で面白いのは一緒に旅してたNPC、国王のナサライトさんとか白のジェラブロウ、護衛して街まで来て分かれたはずなのに。
    その後チョイと離れたダンジョンで虜囚となってて偶然の再会とかあるわけです。プレイヤーがクエスト受けてなくても居るんです。
    これ実は私大好きな要素なんですがTESでは絶対に起きません(笑)

    えーと長くなったので一旦これで終わります
    ダラダラ書いてスイマセン

    ReplyDelete
  2. まず現状では、scripted eventを作るにはスクリプトを直接書く形しかないので、少なくともNPCとの直接対話とかは、データ記述的にできるようにしないとですね。
    あとは、イベントで使うキャラやアイテムやダンジョンの生成・管理とかも、そういう風にできるのかどうか。

    Oblivion CSEは何か参考資料になる感じですか?

    ReplyDelete
    Replies
    1. CSEのいいところはDataファイルを指定して(簡単なMODが良いと思う)アクティブ化させると、そのMODがイジってるものだけ緑で表示されるので、見に行きやすい感じですね。
      NPCを選ぶとDialogとか見えます。
      そのNPC固有のダイアログと、その発生条件などを確認してみると
      こうやってんのかーってなると思う

      Delete
    2. チラッと見た感じ膨大すぎて、何かオススメありますか?:D
      けっこうガシガシとスクリプト書いてるんだなあという感はあるかも。使うデータ(のコンテンツタイプとインデックスだと思いますが)は全部システムに予め(起動時かな)登録するような感じですかね。

      Delete
    3. Quest Of the Weekが良いです
      小クエスト集なので
      URLはhttp://www.nexusmods.com/oblivion/mods/36336/
      ESP一個だけでいいです

      Delete
    4. TES4はESPはTES4の起動時に全部読み込みますね
      本数制限があるんですが、そのせいだと思う。
      ESPの中に何本でもクエスト突っ込めます
      TES内のdataとして見るとクエスト自体は所詮テキストの集合体なので容量的には小さいすね。
      小さなスクリプトは1クエに20ぐらいかな
      オブジェクトにつけたり。
      キャラにつけたり、クエスト進行につけたり。
      クエストレベルには1個スクリプトがあって
      そこで宣言された変数は同一ESPであれば別のクエストからも参照できます、.的な感じ。
      これが便利です。

      Delete
    5. あ、GT LTをつかったら消えた(笑)タグだと思いやがったのか
      変数は questName.VariableName でESP内全体から参照できるんです。つまりクエストレベルスクリプトってのはESP内ではグローバルな変数でスタティックに確保されるってことだと思う

      Delete
    6. ひとつのイベントスクリプトで、オブジェクト用・キャラ用とスクリプトを分けるんですね。この辺はまあ書き方の問題かなぁ。小分けにした方が管理しやすいですね。最近プログラミングの本を読んで、「そんなにユニット小分けにして良いんだ!」て思いました。

      ld25の場合、イベントスクリプトはNew GameかLoadの時に全部読み込みます(クエストローカルな変数のI/Oの関係もあって)。
      あるクエストスクリプトの変数に、他のクエストスクリプトからアクセスすることも出来ます。他のESPの変数にアクセスできるイメージ。Luaなので、書く側が知ってさえいれば、隠蔽できない(笑)

      Delete
    7. そうでしたLuaがつなぎやってるんでしたね
      オブジェクトにOnActivateなどのイベントにスクリプトを括り付けてる感じかな。
      クエストには1個、クエストスクリプトが存在してます。
      他のものは、イベントマネージャがスクリプトを読んで処理してる感じ。

      TES4は動作が重くなることがあるんですけど。
      グラではなくスクリプト処理が重なると重くなります。読まれたことをGame内で動かすときにラグい感じになります。
      このあたり最近のGameはメモリーをバンバン使ってるんで良いんですがXPの時代のなので。

      Delete
    8. スクリプトで使うアイテムがある場合、スクリプトのどこかでアイテムインスタンスを生成するコードを書いて、そのアイテムインスタンスのEventScriptパラメータに、スクリプト名を記録します。
      そうすると、そのアイテムが売却された場合には、EventScriptで指定されたスクリプトの、OnSell()がコールされます。キャッチするかどうかはスクリプト次第で。

      キャラクターも同様にEventScriptパラを持っていて、この場合はコールバックの他に、Genericな処理を一部スキップするようにしてます(勝手にどこかに行ってしまわないように)。
      上のクエストターゲットへのアサインの話で聞こうと思ってたんですが、EventScriptパラを設定されてるインスタンスが、自動生成依頼や他のクエストスクリプトの、ターゲットに設定されても良いってことですよね。これは全部拒否するようにしてたので、キャラやアイテムのインスタンスに、これらを許可するかどうかのパラメータを持たせるようにしようと思います。

      Delete
    9. チョイとビクーリしたんですが
      私の書き込み11時23分で
      ネティエさん11時44分とか時刻が3時間か4時間ずれてんですが
      タイが2時間だからそれより西ってーとインドぐらいっすかね?
      基準時刻がインド?
      バンガロールにサーバーがあるとか、アハハハ

      OnSellはアイテムが売り買い時に発行されるんですね。
      インベントリに入ったタイミングとか
      使用したタイミングとかも作れます?
      スイマセン実装の方について疎くて。
      ちょっとこれからアクセスできなくて夜に帰ってきますんでレスは11時過ぎになります。

      Delete
    10. ほんとだ(笑)このブログのタイムゾーンの設定がおかしいのかも。

      ARPGと違うので「使用したタイミング」というのは、いくつかに分ける必要があるかもしれません。大まかには、戦闘中か街か野外かダンジョンか、NPCとの対話ウィンドウ上でなのか、とか。
      そのコールバックの用途(プレイヤーへのフィードバックの有無とか)によるというか、シーン別に用意する必要がある場合は、それ毎に用意できます。キャラクター行動関係だと、主体がPCなのかNPCなのかで、別のコールバック関数にするような実装もやってます。
      実装は結構なんでも可能だと思うので、逆にアイデアをいただけると嬉しいです。:D

      Delete
    11. インベントリに入る時にクエスト進行処理のキックはできますよね。
      後、クエストアイテムや人がクエストの進行でとあるセル(部屋とか)に配置さている。そこに侵入したときにアイテムに何か設定を掛けるだけでトリガー掛けることとかも可能なんですかね?

      Delete
    12. ああ、プレイヤーなりなんなりが侵入したときにです

      Delete
    13. アイテムやキャラクターそのものは、それ自身の場所の情報を持っていないので、場所でトリガーを掛ける必要があるかなあ。
      キャラの侵入だとOnEntering~()系で、Town, Dungeon, Shopや、DungeonRegion(), WorldRegion()とかで。
      アイテムだったら、アイテムを持っているインベントリがあるかどうかをチェックする。(キャラや店やダンジョン、ダンジョンの宝箱、モンスター等々のインベントリを走査)
      人であれば、その人が所属しているパーティが居るか、その人が居る街・店等があるかどうか。

      "インベントリに入る時"は簡単にできます。

      Delete
    14. OnEntering~()で、スクリプト側で処理するって書きましたが、そういう処理をシステム側でやって、「その人が居るダンジョンに入った」とか「そのアイテムが入っている宝箱があるDungeonRegionに入った」というコールバックを作れば良さそうですね。

      あと、ダンジョン内のNPC冒険者パーティは簡易処理で動くので、OnEnteringDungeonRegion()はPCがダンジョンに居る時だけになります。
      ダンジョンそのものへの入退出は処理できます。

      自動生成ダンジョンの場合、具体的なマップの生成は、PCが入った時に初めてされるというのと、(けっこうラグが出たのでそうしました)
      また、マップがある場合でも、経路探索がけっこう重いので、ダンジョン内のNPC冒険者パーティは簡易処理です。

      Delete
    15. そうですね、実装しやすい方法で全然OKだと思います
      要はシナリオとしてどのタイミングでシナリオ進行ができるかだけなので。まあ、シナリオの状態遷移と固有のイベント発生のタイミングがどうとれるんだろうってことで。

      ●ダンジョンは自動生成なんですか?
      その場合、キーアイテムやボスなどなど要素の配置はどんな感じなのでしょう。
      ●ダンジョン内はある程度区別できるんですかね?
      入口付近、最終エリア、真ん中らへんの区別のことです

      Delete
    16. ダンジョンは、恒久的に存在する固定ダンジョンと、アドホックで生成されるものがあります。

      クエストスクリプトから後者の非固定の方を使う場合、自動生成か自前で用意しておくか、になります。

      自動生成の場合、アイテム配置やモンスター配置は、候補地マップを地形にレイヤーする形で生成して、そこに適当に配置される感じです。
      それらしい場所に「ボス座標」「入口座標」も設定されます。
      併せてDungeonRegionマップも生成されるので、入口エリアとボスエリアなんかは、判定を作れると思います。「真ん中らへん」は、区別するのはちょっと難しいですねぇ。

      そういうフローを作り込みたい場合は、手動で予めマップを用意するのが良いです。リージョンマップも手動で設定できるので、そのリージョン番号の場所に入ったらスクリプトで何かするような。
      ダンジョンエディタで、前述の「アイテム・モンスターの候補地マップ」「ボス座標」「入口座標」も手動で設定できます。

      Delete
    17. 恒久的なダンジョンはLD2みたいなものですね。
      再利用可能でLD2だとクエを発生させるたびに敵と宝と人が配置される(虜囚と倒すべきタゲ)

      アドホックは一回限りで自動生成ロジックで作られるってことですよね? LD1はその形を取ってる代わりにクエ毎に生成されるパターンが決まってました。

      嬉しいですねクエの最終ダンジョンは固定を使わせて、それに至る情報やアイテムを幾つかのアドホックにばらまく

      Delete
    18. "自動生成の場合、アイテム配置やモンスター配置は、候補地マップを地形にレイヤーする形で生成して、そこに適当に配置される感じです" LD2もボスの場所とかは幾つか決まって、そこから選択されたのでイメージとしてはそんな感じですか。

      ダンジョンは入口付近とゴール近くだけで演出可能だと思う

      Delete
    19. CSEの起動とESP MODの覗き方
      動画にしました
      https://www.youtube.com/watch?v=COJJQkHuEjA&feature
      自分のブログにも貼っておきます

      Delete
    20. ありがとうございます。あとで、見てみますね。適当に前に入れてた顔グラMODを入れたりしたら、オブリ本体がまともに動かなくなったので、やり直さないと(笑)

      退治とか奪回とかの、ダンジョンを使う生成依頼は、恒久的な方を使うかアドホックな方を使うかを選んで、後者の場合はダンジョンを作るわけですが、依頼が終わる(達成・期限切れ)と、「破棄可能」フラグを立てます。で、誰も使ってなければ、適当なタイミングでガベージコレクションするような処理になってます。
      これも、イベントスクリプトで作ったダンジョン(EventScriptパラが空ではないダンジョン)に関しては、「破棄可能」にするかどうかを、スクリプトに委ねることになると思います。
      (そのスクリプトで作ったものでなくても、世界に存在しているアドホックなダンジョンのEventScriptパラメータに、スクリプト名をセットしてしまえば、その辺のコントロール権を奪うこともできます)

      ダンジョンエディタにも、自動生成機能は入れてるので、マップ描くのが面倒ってだけなら、その機能で作ってエクスポートして使うのも良いかな。リージョン番号だけメモしておいて。

      Delete
    21. ダンジョン内のアイテムやモンスターの配置は、配置マップに基づいて自動でやらせることもできるし、1個1個(あるいは大事なものだけとか)手動で設定することもできます。
      「ボス座標」というのも、自動配置ルーチン向けにあるだけなので、手動で好きなとこに置くのもアリです。

      こういう仕様の説明は、別の記事も立てた方が良いですね。

      Delete
    22. ええ、もう少し何でもごった煮で進めて
      整理した方が良いなのときにで良いかも
      というか私が最新版をDLしたら質問減りますかね?

      Delete
    23. "世界に存在しているアドホックなダンジョンのEventScriptパラメータに、スクリプト名をセットしてしまえば、その辺のコントロール権を奪うこともできます)"

      これ面白いですね
      前に受けてたアイテムを持って来いクエストの対象は
      実は、こういう曰く付きだったんだみたいな転換も
      可能性としてあり得るんだ(まあ、辻褄とつなぎが難しそうだけど)

      Delete
    24. >実は、こういう曰く付きだったんだみたいな
      必ず、何かの依頼対象であったことがあるアドホックダンジョンから選定するようにするとかですかね。

      最新版をアップロードしました。( https://drive.google.com/folderview?id=0ByNp3ge_nz6bbGtNTGhNV3BFdTA&usp=sharing )
      仕様とか実装の仕方とかは、遊んでみても、わかりにくいかと思いますね~。
      でも、戦闘シーンのテストと、魔法の設計(Partyメニュー>Show Magic Designer)が出来るようになってるので、良かったら見てみてください。:D

      野外フィールドに居る状態でF4を押すと、適当に敵が選ばれて、戦闘に入れます。

      Delete
  3. 私の思い描いてるものをつらつらと書いていきますね
    前に色々書こうと思って経験不足で困ってしまったのですが
    幸いTES4のCSEでMODをぐちゃぐちゃ解析したり自分でもシンプルなのを作ってイメージを持ったものを元に書きつらねます。

    何ってんのか分からんぜとか
    そうじゃなくてシナリオだせやゴルァでもなんでもレスしてください

    ReplyDelete
  4. CSEの覗き方2
    https://www.youtube.com/watch?v=giB9INRN9O4
    QotWのシーズン1のESPでもう少し話を続けました。
    前回とまあまま重なってる部分も多いですが
    ObjectViewを覗きに言ってるのと、レンダリングウィンドウもチョイと見に行ってみてます。

    ReplyDelete
    Replies
    1. だいぶデータ定義が見えてきました。ありがとうございます。:D
      ConditionチェックとResult処理は、それぞれデータ毎にユニークなLuaコードを書いて、書いた関数そのものを会話データにアサインできそうです(たぶん)。

      アイテム等のデータにも、スクリプト用の固定IDを付けると、いろいろ丸く収まるんだなあ。勉強になります。:)

      Delete
    2. まあ、ネティエさn頭いいからポイントの把握が速いんでしょうね
      私はMODを覗いてみて「どうしてこうやってんだろ」とか解らない部分もあったり分かるのに時間掛かったり。

      それでCSEを使ってMODを作ったりしてたときに気になったことがあります。
      例えば、バニラにとある像に触れると起動するスクリプトがあるんですが、それを直接改変すると、他のMODもそれを改変してると喧嘩になってしまうんですよね。

      その時思ったのはOnActivateで呼び出すスクリプトをスタックさせられれば、追加クエのイベント処理を足すだけで良いのになあと。

      Delete
    3. コピーしたものを改変するんではなくて、オリジナルの改変を使いまわすということですか?

      Delete
    4. ええ、上書きする場合はOverride指定、追加する場合はAddon指定みたいに書けると良いかなと思ったんだけど。
      CSEの操作動画で説明してみました
      https://youtu.be/abo7cImRASc
      が説明してる間に自分でそれは難しい要求だなと一人で納得してたりします。
      スイマセンにまとまってなくて

      Delete
    5. あー、継承みたいな。確かに難しいかなあ。
      オブリよりもスクリプトの単位が大きいので、やりにくいというか。ひとつのクエストに対して、ひとつの「全コールバックを受け取るレシーバー」スクリプトがあって、そこから処理を分配するという感じなので。

      この辺は基本、ユニークなスクリプトファイルを用意するべきだと思ってるので、定型的な処理は別のユニットに分けたり、グローバルな標準ライブラリ的なのを作る方が好み(というか簡単)かなぁ。オブジェクト指向は全然わからない(笑)

      Delete
    6. ノクターナル神像に触れると進行するスクリプトクエストAと、同じく神像に触れると進行するスクリプトクエストBが、それぞれ「ノクターナル神像に触れ」たかどうかの判定をするという、
      「とりあえずDuplicateしちゃえ」なノリなので、褒められたもんじゃないと思いますが(笑)

      Delete
    7. ユニークなスクリプトファイルを用意するべきだと思ってるので、定型的な処理は別のユニットに分けたり、グローバルな標準ライブラリ的なのを作る方が好み(というか簡単)

      ●ナルホド、考えてみたらクエストでグループ化されてて
      アクティブなクエの評価全部呼ばれるなら良いですね

      Delete
    8. でも、オブリでやってる方式の方が、いろいろ簡単になるんだなあ、というのが分かりますね。"なるほど、流石"てなりました。
      たぶん、クエストアイテムAにスクリプトがアサインされてるとすると、クエストアイテムAに何か発生した時にだけ、指定されたスクリプトにコールバックされるんですよね。

      自分の採ってる方法だと、例えば、同クエストのクエストアイテムBが売却された時にも同じスクリプトにコールバックが起きるので、スクリプトに操作対象がAの場合、Bの場合、と分岐を書かないといけない。
      ただしこの方が、スクリプトを読んだ時に、何をしてるのか流れが解りやすいと思うので、良し悪しかも知れませんが。
      うーん、勉強になります。

      Delete
  5. <クエスト雑記2>
    ●放置クエとかクエストチェインとか

    本当は次は会話、噂について書こうと思ってたんですけど
    テンタティブに生成された放置ダンジョンを回収する話もあったし
    「あれ、どうすると良いのかなー」とか思ったので。

    ルナドンライクな無限自動生成クエストデザイン側から利用する場合同利用できるんだろうって話を書きたくなった。

    無論、忘れ去られたダンジョンの回収はネティエさんのデザインで決まることなので、そこはおまかせするとして。

    プレイヤーが請け負って期限切れ、とか断った的な状況を想定します。
    これは自分的にはワクワクする要素です。
    少なくとも従来のcRPGでは出会ったことないです。
    ルナドン的なクエで簡単に思いつくのは
    放置
    再利用側新クエ:情報が必要な虜囚の開放(これなら放置クエに合致)
    (再利用ない場合は、どこかで家屋系アジトを生成する予定)
    こういう感じであれば上手く合成できるんだろうか?

    ReplyDelete
    Replies
    1. 未解決依頼を利用するの良いですね。:D

      当初は、起こった「出来事」を回収する、というのをLD2タイプの一般生成依頼でやろうとしていて、依頼のテンプレデータの発生条件に、要求出来事タイプ(強盗が何個あったらとか)を指定できるようにしたりしてました。結局それはあまり良くなかったので止めたんですが。(データ的にプリセットを組むのではなくて、これこそスクリプトでユニークな処理をする必要があったんですね、たぶん。)

      再利用でクライアントなりターゲットなりになる、行動主体が、
      1.未解決依頼を再利用可能だと判断して
      2.実際に利用するように行動する
      というプロセスをコーディングすると良い感じになる気がしています。
      1は新クエの文脈・背景に沿った発生・進行条件の設定。
      2は単に自分の好みですが、物資の調達とか依頼の発行とか場所の移動などの行動をさせることで、情報が発生する効果(システムが作るジェネリックな情報)と、行動主体の次の一手にタイムラグ(ゲーム内時間の)が作れるので面白いかなという感じです。

      Delete
  6. シナリオ<本探し>
    金庸のカンフー小説だと秘伝書をめぐる争いってのがある。
    それは完全な仕込みで作れば良いのかもしれない。

    実はTESの楽しみの一つが入手難な本、シリーズ物を探し歩く。
    ただこれには問題があって、UESPでも調べないと偶然出会うの無理。

    シリーズ物の本の1冊を入手した場合、INTやSkillなどの判定でこれは集めると何か価値がある(つまりクエスト付き)と気づく。
    一般人との会話選択肢に自分が持ってる本について、たとえば聖コリウス記Vol.1とかを持ってたら「聖コリウス記」とかが出て来る。
    シリーズの他の本場所などの情報が得られるみたいな。
    そんなシナリオは好きかも

    ReplyDelete
    Replies
    1. 開始トリガーに能力値を使うんですね。壁画の欠片とか考古学系でもイケそう。

      PLのゲーム内知識も上手く使える形に出来ると良いですよね。アタリをつけて行動できるように。
      それでいて情報源をある程度ランダマイズ出来るような(これはReplayabilityが欲しいというだけ)。

      Delete
    2. 「Replayabilityこそ命」って感じてしまう私が居ます(笑)

      Delete
  7. Dialog:クエストとfaction設定について
    動的生成可能なクエストテンプレート
    (ある程度汎用性があってシステム側が選んで発生させる感じのもの)
    を考える場合
    Dialogはファクション員かどうか、そのランクなどで書いておけると良いんじゃないかなと思う。

    ランクは詳細には分けずに「一般構成員クラス」のダイアログ
    「幹部クラス」のダイアログ(詳細な情報)
    勿論、それ以外に個別で指定されてそいつしか言わないセリフもあるけど

    ReplyDelete
    Replies
    1. Factionに限らず、ある要素だけ汎用すぎない感じにしたい、てのはありそうですね。
      根っこは汎用性高めにして、必要になったら、要素ごとに簡易に定義できるインターフェース(定義や判定関数)を上層に作る、という感じで上手くできればなあと思ってます。

      テキスト系のデータ(TESで言う、TopicやConversation)の実装について、新記事で書いてみました。

      Delete
    2. Factionのランクって、通常どのくらいの数の段階が必要だと思いますか?

      どのランクまでが「一般構成員クラス」で、どこから「幹部クラス」なのか、システムには解らないので、Faction自体にそれを決めるテーブルか何かを用意する必要がありますね。

      Delete
    3. 「一般」「幹部」「リーダー」の3段階で、
      Factionのデータとしては、最高ランクが整数値でいくつなのか決めて、そこから3段階評価で自動判定とかでも。

      Delete
  8. ええ、Faction内のランクを通常は1,2,3で振っていく感じで
    スペシャルな人が5みたいな(伝説のジジイ用 笑)

    ReplyDelete
    Replies
    1. なるほど。すると、指定された範囲の整数値を、5段階評価する機能があるので、3+2段階で良いかなあ。

      questTopicの登録と選定表示まで書いてみてます。
      https://twitter.com/netie_ld25/status/858209031055228928
      ここに、会話相手のFactionIDと、Rankフィルターも追加しようかなあ。Rankフィルターは、5ケタ(上記の段階)のフラグで("less than or equal"とか指定させるのが面倒なので)。

      Delete
    2. あー、全部を自動評価しようかと思ったけど、スクリプトでコントロールするFactionに関しては、やはりランク値の評価テーブルを用意することも出来た方が良いですね。
      伝説のジジイは例外処理で。

      Delete