SRC質問掲示板Mk2
(現在 過去ログ83 を表示中)

HOME HELP 新規作成 新着記事 トピック表示 検索 掲示板新着情報RSS配信新着情報 過去ログ

[ 最新記事及び返信フォームをトピックトップへ ]

■15323 / inTopicNo.1)  敵味方入り乱れての行動
  
□投稿者/ ティガー -(2004/10/11(Mon) 18:28:37) [ID:KttdMiTY]
    こんにちは、敵味方の行動順を運動性によって
    高いものから行動できるようにしたのですが
    何か物足りないような気がしまして‥‥どなたか意見お願いします。
    長くなりますが、乗せさせてもらいます。
    ちなみに差が多きすぎると最大二回余分に動けるようにしました。

    以下インクルード
    *プロローグ:
    現ターン行動者 = 0
    最初のターン = 1
    Exit

    *ターン 全 味方:
    生存者数 = 0
    行動順番数 = 1
    ForEach 全
    Incr 生存者数
    Next
    ForEach ユニット名 In ユニット一覧(運動性)
     行動順番[行動順番数] = ユニット名
    Incr 行動順番数
    Next
    If 最初のターン = 0 Then
    Incr 現ターン行動者
    Else
    現ターン行動者 = 1
    EndIf
    If Not (生存者数 < 現ターン行動者) Then
    If Not (現ターン行動者 = 1) Then
    Incr ターン数 -1
    Incr 総ターン数 -1
    EndIf
    EndIf
    If (現ターン行動者 > 生存者数) Then
    現ターン行動者 = 1
    EndIf
    行動するキャラ = 行動順番[現ターン行動者]
    ForEach 全
    If 最初のターン = 0 Then
    If Not (対象ユニットID = 行動するキャラ) Then
    Finish
    EndIf
    Else
    Finish
    EndIf
    Next
    If (現ターン行動者 = 1) Then
    ForEach 全
    二回行動終了[対象ユニットID] = 0
    Next
    EndIf
     行動順処理数 = Info(行動するキャラ, 運動性)
    Center 行動するキャラ
    ForEach 全
     行動数値 = ((行動順処理数 - (Info(対象ユニットID, 運動性))) * -1)
    If 最初のターン = 0 Then
    If (行動順処理数 <= 行動数値) Then
    If Not (二回行動終了[対象ユニットID] = 1) Then
    Action(対象ユニットID) = Action(対象ユニットID) + 1
    二回行動終了[対象ユニットID] = 1
    If (Party(対象ユニットID) = 味方) Then
    Center 対象ユニットID
    EndIf
    EndIf
      If ((行動順処理数 * 2) <= 行動数値) Then
    If Not (二回行動終了[対象ユニットID] = 2) Then
    If (二回行動終了[対象ユニットID] = 1) Then
    Action(対象ユニットID) = Action(対象ユニットID) + 1
    二回行動終了[対象ユニットID] = 2
    If (Party(対象ユニットID) = 味方) Then
    Center 対象ユニットID
    EndIf
    Else
    Action(対象ユニットID) = Action(対象ユニットID) + 2
    二回行動終了[対象ユニットID] = 2
    If (Party(対象ユニットID) = 味方) Then
    Center 対象ユニットID
    EndIf
    EndIf
    EndIf
      EndIf
    EndIf
    EndIf
    Next
    If 最初のターン = 1 Then
    最初のターン = 0
    現ターン行動者 = 0
    EndIf
    Exit

    *ターン 全 敵:
    *ターン 全 中立:
    *ターン 全 NPC:
    ForEach 全
    If Not (対象ユニットID = 行動するキャラ) Then
    Finish
    EndIf
    Next
    ForEach 全
     行動数値 = ((行動順処理数 - (Info(対象ユニットID, 運動性))) * -1)
    If (行動順処理数 <= 行動数値) Then
    If Not (二回行動終了[対象ユニットID] = 1) Then
    Action(対象ユニットID) = Action(対象ユニットID) + 1
    二回行動終了[対象ユニットID] = 1
    EndIf
      If ((行動順処理数 * 2) <= 行動数値) Then
    If Not (二回行動終了[対象ユニットID] = 2) Then
    If (二回行動終了[対象ユニットID] = 1) Then
    Action(対象ユニットID) = Action(対象ユニットID) + 1
    二回行動終了[対象ユニットID] = 2
    Else
    Action(対象ユニットID) = Action(対象ユニットID) + 2
    二回行動終了[対象ユニットID] = 2
    EndIf
    EndIf
      EndIf
    EndIf
    Next
    Exit



引用返信/返信 削除キー/
■15325 / inTopicNo.2)  Re[1]: 敵味方入り乱れての行動
□投稿者/ TomTom -(2004/10/11(Mon) 20:26:24) [ID:bHkXC2pw]
    TomTomです。

    なかなか楽しげですね。こういう事をやりたい、という人は今までも居ましたが、実際に作った人は初めてかも。

    ただ、動作速度の遅さが少し気になってしまいます。
    その一番の原因と思われるのが

    >ForEach ユニット名 In ユニット一覧(運動性)
    > 行動順番[行動順番数] = ユニット名
    >Incr 行動順番数
    >Next

    この部分です。
    ForEachのユニット一覧は、出撃していないキャラも含めてデータを返してくるので、運動性の早いキャラが多く未出撃のままでいると、そのキャラの数だけターンが回り、「行動順ではないキャラをFinishする処理」を行ってしまいます。
    とんでもなく時間がかかるわけですね。

    そこで、次のように変更します。

    ForEach ユニット名 In ユニット一覧(運動性)
     If (Status(ユニット名) = "出撃") Or (Status(ユニット名) = "格納") Then
      Incr 生存者数
      行動順番[生存者数] = ユニット名
     EndIf
    Next

    ユニットがマップ上または母艦に格納されているかどうかを判断して、対象になったユニットだけを「行動順番」に入力していきます。
    ついでに、先ほどの処理の前にあった「生存者数カウント」の処理と統合しました。

    また、Finishの処理をする際に「ForEach 全」で実行していますが、これを「ForEach フェイズ」に変更すると、味方フェイズなら味方だけ、敵フェイズなら敵だけをFinishするので、処理時間を稼げるでしょう。

    あと、このようなシステムの場合、マップコマンドで行動順が確認できればいいかなー、とか思います。

    とりあえず、気がついた点はこのくらいでしょうか。引き続き、製作がんばってください。


    余談ですが、WindowsXP SP2搭載の我が家のPCでは、最初の状態ではとてもではないですけどプレイする気になる速度ではありませんでした。上記のように修正して、どうにか遊べるというレベルでしょうか。
    別の場所のSP2が入っていないPCでは最初のものでもどうにか遊べるレベルだったのですが。
    ……おのれ、マイクロソフト(笑)
引用返信/返信 削除キー/
■15328 / inTopicNo.3)  Re[1]: 敵味方入り乱れての行動
□投稿者/ 龍神 -(2004/10/11(Mon) 21:02:57) [ID:2zcPZSPZ]
http://ryuzintei.hp.infoseek.co.jp/
    こんばんわ、龍神です.
    とても魅力的なシステムですね.

    テストプレイした感想を述べさせていただきます.

    現状のシステムだと、味方のユニットが一体行動した時点で、マップコマンドの「ターン終了」をする必要があります.
    この時、次に行動するユニットが味方ユニットだった場合、敵・中立・NPCフェイズをただ無駄に通りすぎるだけです.
    ですから、行動終了ラベルを用いて、次に行動するユニットが同じ陣営のユニットだった場合、SP「覚醒」などを適用させることにより、同フェイズにて行動させるようにしたほうがよりよいと思います.

    又、二回行動、三回行動を決定させるところの処理ですが、これだと非常に分かりづらいと思います.
    Switchを用いれば、よりスマートに表現できると思います.

    後、やはりマップコマンドの「ターン終了」を事あるたびに押すのは億劫なので、以前私が提案した、敵の思考パターンの実装も行ったほうが良いと思います.
    別にそうこったものではなく、「一番近い敵を攻撃する」といった単純なもので十分だと思います・・・.

    尚、掲載されたインクルードを、コメント分とインデント付きで以下の場所に上げておきました.
    インクルードの各個所の動作をコメント分に書かれているように、理解しているのですが、合っていますでしょうか? 汗
    http://ryuzintei.hp.infoseek.co.jp/RyuZinInc.txt

    以上です. お役に立てれば、幸いです.
引用返信/返信 削除キー/
■15333 / inTopicNo.4)  Re[2]: 敵味方入り乱れての行動
□投稿者/ ティガー -(2004/10/12(Tue) 01:31:13) [ID:KttdMiTY]
    TomTomさん、龍神さんとてもわかりやすく的をいた指摘
    有難うございました。速度の見直しなど修正いたします。
    龍神さんの意見の(ターン終了)の件ですけど
    やはりもう一度挑戦してみようと思います。

    あと、追加でユニットコマンドで次の行動者を
    表示出来るようにしたいと思います

    ご意見有難うございました
解決済み!
引用返信/返信 削除キー/
■15334 / inTopicNo.5)  Re[2]: 敵味方入り乱れての行動
□投稿者/ ティガー -(2004/10/12(Tue) 01:31:52) [ID:KttdMiTY]
    TomTomさん、龍神さんとてもわかりやすく的をいた指摘
    有難うございました。速度の見直しなど修正いたします。
    龍神さんの意見の(ターン終了)の件ですけど
    やはりもう一度挑戦してみようと思います。

    あと、追加でユニットコマンドで次の行動者を
    表示出来るようにしたいと思います

    ご意見有難うございました



解決済み!
引用返信/返信 削除キー/
■15337 / inTopicNo.6)  Re[2]: 敵味方入り乱れての行動
□投稿者/ TomTom -(2004/10/12(Tue) 09:47:14) [ID:CLm6zLb9]
    TomTomです。

    解決済みになっちゃいましたが、ちょっと横槍をー。

    >後、やはりマップコマンドの「ターン終了」を事あるたびに押すのは億劫なので、以前私が提案した、敵の思考パターンの実装も行ったほうが良いと思います.
    >別にそうこったものではなく、「一番近い敵を攻撃する」といった単純なもので十分だと思います・・・.

    これ、容易に他人に「試してみては?」といえるほど簡単なものではないかと。
    「ターン終了」を押さずに済むには、Do〜Loop内でユニット一つ一つの行動を制御しなければならないわけですが、当然その間、通常のユニットコマンド・マップコマンドなどの処理は受け付けません。
    ですから、移動(移動できる場所を自前の処理で計算しなければなりません)や攻撃・アビリティなどの選択、特殊能力などのデータ一覧の照会etc……。
    要するに、ほぼ全ての処理を自前で用意しなければならなくなります。SRC上で新しいシミュレーションゲームを作るようなものですね。状態異常やチャージのような特殊な処理も考えると、(私には、ですが)手を付けられません。

    ということで、多少面倒ではあるものの「ターン終了」で行動を次に送る、というティガーさんの処理は正解だと思います。(処理のインクルードも楽ですし)
    既にこれだけのものが出来ているなら、「強制的にフェイズを終了するコマンド」をリクエストする方向に進んでもバチは当らないんじゃないでしょうか。

引用返信/返信 削除キー/
■15341 / inTopicNo.7)  Re[3]: 敵味方入り乱れての行動
□投稿者/ 龍神 -(2004/10/13(Wed) 08:26:09) [ID:2zcPZSPZ]
http://ryuzintei.hp.infoseek.co.jp/
    No15337に返信(TomTomさんの記事)

    ご意見のほう、ありがとうございます.

    > 「ターン終了」を押さずに済むには、Do〜Loop内でユニット一つ一つの行動を制御しなければならないわけですが、当然その間、通常のユニットコマンド・マップコマンドなどの処理は受け付けません。
    > ですから、移動(移動できる場所を自前の処理で計算しなければなりません)や攻撃・アビリティなどの選択、特殊能力などのデータ一覧の照会etc……。
    > 要するに、ほぼ全ての処理を自前で用意しなければならなくなります。

    確かに、その通りですね. 汗
    「行動終了」ラベルを用いて、味方の行動は、通常のSRCのものを使って処理すればよいと考えていたのですが、そうすると、マップコマンドが開けて、「ターン終了」が押せちゃうんですよね・・・.

    > ということで、多少面倒ではあるものの「ターン終了」で行動を次に送る、というティガーさんの処理は正解だと思います。(処理のインクルードも楽ですし)
    > 既にこれだけのものが出来ているなら、「強制的にフェイズを終了するコマンド」をリクエストする方向に進んでもバチは当らないんじゃないでしょうか。

    はい、フェイズ終了コマンドの実装リクエストは、私も考えました. (先の記事に書いておくべきでした. すみません.)
    ただ、リクエストだと、いつ実装されるかがわからないので、システムの完成に目処がつかないため、実装してみては? と提案いたしました.

    膨大な作業量になることを提案してしまいました. 汗
    迂闊でした. ティガー様、申し訳ありません.
引用返信/返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Pass/

HOME HELP 新規作成 新着記事 トピック表示 検索 掲示板新着情報RSS配信新着情報 過去ログ

- Child Tree -
- Antispam Version -