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

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

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

■21256 / inTopicNo.1)  こう言う事を質問していいのか…
  
□投稿者/ うらら -(2008/11/12(Wed) 00:00:47) [ID:tsZPTFba]
    自作インクルードで、ブレイクアーツという物を
    完成させたのですが、もう少し記述しやすいというか
    動作を短縮したり出来ないだろうかと思っています。
    以下が内容です。

    #攻撃時に技に指定したブレイク属性レベルだけBPを増加し
    #指定されたブレイク耐性値を上回った敵をブレイク状態に。
    #この後、追加攻撃が発動。

    *攻撃 味方 敵:
    さっき使った武器[対象ユニットID] = 対象ユニット使用武器
    If Not BP Then
    Set BP
    EndIf
    Incr BP[相手ユニット] (10 + Info(Unit(対象ユニットID),武器,さっき使った武器[対象ユニットID],属性レベル,ブ))
    If BP[相手ユニット] > LIndex(Info(Unit(相手ユニットID),特殊能力データ,ブレイク値),2) Then
    SetSkill 対象パイロット アーツ発動 -1
    SetSkill 相手パイロット ブレイク状態 -1
    Else
    EndIf
    Exit

    #攻撃終了と同時にブレイクアーツを使ったキャラから
    #使用した武器と発動用特殊能力解除。

    *攻撃後 味方 敵:
    Unset さっき使った武器
    ClearSkill 対象パイロット アーツ発動
    Exit

    *破壊 敵:
    If Party(相手ユニットID) = 味方 Then
    Unset さっき使った武器
    ClearSkill 相手パイロット アーツ発動
    EndIf
    Exit

    #累積したブレイクポイントはターンチェンジと共に
    #リセットされる。

    *ターン 全 味方:
    UnSet BP
    ForEach 味方
    ClearSkill 対象パイロット ブレイク状態
    Next
    ForEach 敵
    ClearSkill 対象パイロット ブレイク状態
    Next
    Exit

    *ターン 全 敵:
    UnSet BP
    ForEach 味方
    ClearSkill 対象パイロット ブレイク状態
    Next
    ForEach 敵
    ClearSkill 対象パイロット ブレイク状態
    Next
    Exit

    一応シナリオサイドからも見やすいようにユニットに

    ブレイク値=非表示 15
    ブレイクポイント:15
    BP累積=BP累積 ブレイク累積値$(0 + BP[対象ユニット])

    といった表記も付けてあります。
    今の自分にはこれが精一杯と言うか、死ぬほど悩んでこんな感じ
    なのですが、ここはこう短縮できる〜とか、不要な命令が入っていたりとか
    しないでしょうか?
    どなたかご教授いただけると幸いです。

引用返信/返信 削除キー/
■21257 / inTopicNo.2)  Re[1]: こう言う事を質問していいのか…
□投稿者/ ガムニ -(2008/11/12(Wed) 12:07:02) [ID:00Rg6f7k]
    2008/11/12(Wed) 12:10:39 編集(投稿者)

    #編集内容:文の整形

    おはようございます、ガムニです。

    現状でも別段動作速度に困るような記述にも見えませんし速度の改善はパッとは思いつきませんが、
    一部のラベルはまとられるんじゃないかなと。

    まずブレイクアーツの仕様について確認したいことが何点か。

    #攻撃時に技に指定した「ブレイク属性レベル + 10」だけBPを増加し
    #指定されたブレイク耐性値を上回った敵をブレイク状態に。
    #この後、追加攻撃が発動。
    #攻撃の命中は問わずBPは上昇する。(命中の判定は面倒なので妥当な妥協点とは思います。)
    #中立、NPCは考慮しない

    記述を見た感じ正確にはこんな感じかと思いますが間違いないでしょうか?


    あと、完成したと仰られていますが動作チェックはしましたでしょうか。(してたらごめんなさい)
    SetSkillおよびClearSkillで指定するのはヘルプによるとパイロット名なので
    対象パイロット、相手パイロットの帰すパイロットIDでは動作しないかもしれません。
    ので、Pilot関数でパイロット名称を拾った方が良いかもしれません。
    (Pilot関数に渡す値はパイロットIDではなくユニットIDなことに注意)


    また、システム変数「対象ユニット」は1.6系で用いられた現在の「対象パイロット」と等価な変数です。
    現在サポートされているかは分かりませんし、されていても今後なくなる可能性もあるので
    対象パイロットなり対象ユニットIDなりに置き換えた方がいいでしょう。


    細かいところですが、変数さっき使った武器は使用後すぐ破棄されるようなので配列として記述しなくとも良いのではないでしょうか。


    これまた細かいところですが、
    If Not BP Then
    この条件分岐で調べたいことは「変数BPの値が1ではない」ではなく「変数BPが作成されているかどうか」かと思われるので、正確には
    If Not IsVarDefined(BP) Then
    ではないでしょうか。
    ※IsVarDefined():指定した名称の変数、または配列の要素が存在すれば 1 を 、存在しなければ 0 を返します。

    まあ、実際問題ターン初めの戦闘ではBPは0に成ってるはずなので動作自体は一緒ですが。


    それと、現状ではアーツが発動した状態で反撃で味方がやられた場合アーツ発動の特殊能力が残ったままになります。
    この辺の処理も考えた方が良いのではないでしょうか。


    前置きが長くなりましたが、まとめられる所は
    *ターン 全 味方
    *ターン 全 敵
    この二つです。

    上記二つのラベルはまったく同じ処理なので並べて記述してあげればいいと思います。
    また、敵味方全部調べるのであればForEach 全でまとめてしまって良いかと。
    (もし中立やNPCがマップ上に登場する可能性があるのならForEachは分けた方が無駄なループは無いです)

    んで、まとめるとこんな感じです。
    *ターン 全 味方:
    *ターン 全 敵:
    UnSet BP
    ForEach 全
     ClearSkill Pilot(対象ユニットID) ブレイク状態
    Next
    Exit
    #インデントは全角スペースを使っているので丸コピペ注意(動作確認もしてません)


    話は逸れますが、BP値の確認用にユニットコマンドを利用するという方法もあります。

    -*ユニットコマンド "BP累積値$(BP[対象ユニット?(置き換えたシステム変数で)]) 全:
    Talk システム
    BP累積値は$(BP[置き換えたID])です
    End
    Exit
    ※内容は適当です。

    長々と書きましたが制作頑張ってください。
    P.S.ヘルプは宝の山です。
引用返信/返信 削除キー/
■21258 / inTopicNo.3)  Re[1]: こう言う事を質問していいのか…
□投稿者/ 中箱 -(2008/11/12(Wed) 12:52:42) [ID:1E558AWX]
    2008/11/12(Wed) 13:21:48 編集(投稿者)
    2008/11/12(Wed) 13:18:23 編集(投稿者)

    <pre><pre>記事タイトルは、「自作インクルードの記述を改善して欲しい」
    …みたいな感じでしょうか、この場合。

    内容に沿ったタイトルが望ましいです。



    ユニット能力の
    >ブレイク値=非表示 15
    ですが、
    ダミー能力にもレベル指定できるので、個人的にはそっちを利用する方が好きです。

    ということで勝手ながらここでは
     ブレイク値Lv15=非表示
    を用いることにします。
    とりあえずの利点としてはリスト関数を使う必要がなくなるぐらいで、
    こちらの方を使うべきだ、とまで言うつもりはありませんが。


    #ここから================

    *攻撃 味方 敵:

    #さっき使った武器[対象ユニットID] = 対象ユニット使用武器
      //・「さっき使った武器[]」は攻撃前に一つだけSetされ、攻撃終了後にUnsetされます。
      // また、「さっき使った武器[]」のインデックスは利用されていません。
      // ですから、この場合は配列を使う必要はないでしょう。
      //・…と言うか、「さっき使った武器」という変数自体必要無い気が…
      //カットで

    #If Not BP Then
    # Set BP
    #EndIf
      // SRCの場合、配列を使う前にSetしておく必要は無いです。

    #Incr BP[相手ユニット] (10 + Info(Unit(対象ユニットID),武器,さっき使った武器[対象ユニットID],属性レベル,ブ))
      //・前回も指摘しましたが、「相手ユニット」ではなくて「相手ユニットID」か「相手パイロット」が正式です。
      //・Info関数は、データ区分を指定するようにした方が確実です。基本的には大丈夫だとは思いますが。
      //・>データにはデータの名称を指定します。(中略)ユニットの場合にはユニットIDも指定可能です。
      // とヘルプにありますので、Unit関数は使わず対象ユニットIDをそのまま入れます。
      //・ さっき使った武器[対象ユニットID]=対象ユニット使用武器
      // なのですから、置き換えてしまいます。
    Incr BP[相手ユニットID] (10 + Info(ユニット,対象ユニットID,武器,対象ユニット使用武器,属性レベル,ブ))
    ##配列の使いどころですね。


    #If BP[相手ユニット] > LIndex(Info(Unit(相手ユニットID),特殊能力データ,ブレイク値),2) Then
      //・ブレイク値の設定方法を変えたので右辺が変わります。
      //・ブレイク値=非表示 15 を用いるのなら右辺は
      //  LIndex(Info(ユニット,相手ユニットID,特殊能力データ,ブレイク値),2)
      // となるかと。
    If BP[相手ユニットID] > Info(ユニット,相手ユニットID,特殊能力レベル,ブレイク値) Then

     SetSkill 対象パイロット アーツ発動 -1
     SetSkill 相手パイロット ブレイク状態 -1
      //対象パイロットで問題ないです。ヘルプのSetSkill項に書いてありますし。

    #Else
      //何もしないならElseは不要です

    EndIf
    Exit


    #攻撃終了と同時にブレイクアーツを使ったキャラから
    #使用した武器と発動用特殊能力解除。

    *攻撃後 味方 敵:
    #Unset さっき使った武器
      //・この変数(配列)自体使わなくしたので削ります

    ClearSkill 対象パイロット アーツ発動
    Exit

    *破壊 敵:
    If Party(相手ユニットID) = 味方 Then
    #Unset さっき使った武器
      //ここも
    ClearSkill 相手パイロット アーツ発動
    EndIf
    Exit

      //・ClearSkill処理は味方が破壊されてしまった場合にも対応させておいたほうが良いでしょう。
      // どこかで解除しないとインターミッションにまで残ってしまい、次のマップに影響が出てしまうかもしれません。
    *破壊 味方:
    If Party(対象ユニットID) = 味方 Then
     ClearSkill 対象パイロット アーツ発動
    EndIf
    Exit



    #累積したブレイクポイントはターンチェンジと共に
    #リセットされる。

    #*ターン 全 味方:
      //・味方ターン、敵ターン全く同じ処理なのでまとめてしまいましょう。
      //  *ターン 全 全
      //
      // もしくは、横着ですが
      //  *ターン 全 味方:
      //  *ターン 全 敵:
      // ↑のようなラベルの使い方については、
      // サンプルシナリオの「決戦!宇宙怪獣1話.eve」内にて、"横着なラベル"として紹介されています。
      // どちらが良いかは…この場合は好みで良さそうな気がします。
    *ターン 全 全:

    UnSet BP
    #ForEach 味方
    # ClearSkill 対象パイロット ブレイク状態
    #Next
      //・味方は「アーツ発動」、ですよね?
      //・アーツ発動がSetSkillされるのは攻撃直前で、攻撃後には必ずClearSkillされるのですから
      // ターンが変わった時にSetSkillされていることは起こらないはずです。削れるでしょう
      // 念のため処理を入れておいたほうが安全かもしれませんが。
      //・処理を入れる場合は、下のようにSkill関数でチェックしてから、必要な分だけClearSkillをする事を薦めます。

    ForEach 敵

    # ClearSkill 対象パイロット ブレイク状態
      //・速度優先なら、SetSkillされているかどうかをSkill関数で調べてからClearSkillをした方が速くなります。
      // *攻撃後ラベルのように、ClearSkillする回数があまり多くなければ大した影響は出ませんが、
      // 陣営全員に行うなら、チェックした上で必要な場合のみClearSkill、としておいた方が良いでしょう。何体いるか分かりませんし
     If Skill(対象パイロット,ブレイク状態) <> 0 then
      ClearSkill 対象パイロット ブレイク状態
     EndIf

    Next
    Exit


    #ここまで================



    正直読み辛いので、上のコメント部分を削除すると

    #ここから================
    *攻撃 味方 敵:
    Incr BP[相手ユニットID] (10 + Info(ユニット,対象ユニットID,武器,対象ユニット使用武器,属性レベル,ブ))
    If BP[相手ユニットID] > Info(ユニット,相手ユニットID,特殊能力レベル,ブレイク値) Then
     SetSkill 対象パイロット アーツ発動 -1
     SetSkill 相手パイロット ブレイク状態 -1
    EndIf
    Exit


    #攻撃終了と同時にブレイクアーツを使ったキャラから
    #使用した武器と発動用特殊能力解除。

    *攻撃後 味方 敵:
    ClearSkill 対象パイロット アーツ発動
    Exit

    *破壊 敵:
    If Party(相手ユニットID) = 味方 Then
     ClearSkill 相手パイロット アーツ発動
    EndIf
    Exit

    *破壊 味方:
    If Party(対象ユニットID) = 味方 Then
     ClearSkill 対象パイロット アーツ発動
    EndIf
    Exit



    #累積したブレイクポイントはターンチェンジと共に
    #リセットされる。

    *ターン 全 全:
    UnSet BP
    ForEach 敵
     If Skill(対象パイロット,ブレイク状態) <> 0 then
      ClearSkill 対象パイロット ブレイク状態
     EndIf
    Next
    Exit

    #ここまで================

    動作確認はしていませんが、私が弄るとすればこんな感じでしょうか。</pre></pre>
引用返信/返信 削除キー/
■21259 / inTopicNo.4)  Re[2]: こう言う事を質問していいのか…
□投稿者/ うらら -(2008/11/12(Wed) 19:06:55) [ID:tsZPTFba]
    ご丁寧な返信ありがとうございます

    ガムニさん>
    動作チェックに関してですが、完成という書き方が悪かったというか
    とりあえず、動作したというのが正解でした。
    紛らわしくてすいません。

    やっぱりまだまだ粗が目立つと言うか無駄が多いというか
    自分の理解が浅いのが良くわかりました。

解決済み!
引用返信/返信 削除キー/



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

このトピックに書きこむ

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

Pass/

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

- Child Tree -
- Antispam Version -