设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 197|回复: 0
打印 上一主题 下一主题

[搬运汉化] 求大佬改一下这个近身战插件吧?

[复制链接]

Lv4.逐梦者

梦石
0
星屑
7513
在线时间
1116 小时
注册时间
2006-7-18
帖子
579
跳转到指定楼层
1
发表于 2024-10-1 11:40:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
100星屑
B站一个大佬汉化的,网上找了一个较新的版本,移植了汉化内容
这个插件很简单,用起来没YEP那么繁琐。
而且可以做到移动到敌人面前后,不会返回原位,
可以站在敌人面前,继续后面的操作,做到人物在战场上一会打这个一会那个,到处走动攻击的效果。
不过有个缺点就是拿着远程武器时也会跑到敌人面前,
大佬能不能加一个判断语句,角色拿着远程武器时就不会执行代码跑到敌人面前,而是原地不动原地攻击。


JAVASCRIPT 代码复制下载
  1. //=============================================================================
  2. // DirectlyAttackEffect.js
  3. // ----------------------------------------------------------------------------
  4. // (C)2016 Triacontane
  5. // This software is released under the MIT License.
  6. // [url]http://opensource.org/licenses/mit-license.php[/url]
  7. // ----------------------------------------------------------------------------
  8. // Version
  9. // 1.5.0 2020/07/19 攻撃する瞬間に発動者にアニメーション表示できる機能を追加
  10. // 1.4.5 2019/11/10 Torigoya_ReplaceDeadMemberPlus.jsと併用時、入れ替わったアクターが瞬間表示される競合を修正
  11. // 1.4.4 2019/10/10 反撃拡張プラグインと併用し、かつ戦闘行動の強制による反撃が無効な設定で自分自身の攻撃に反撃するとエラーになる競合の修正
  12. // 1.4.3 2019/09/23 演出対象をアクターもしくは敵キャラのみに限定した場合はアニメ演出も実行されないよう修正
  13. // 1.4.2 2019/05/19 BattlerGraphicExtend.jsと併用したとき、<DAEVanish>の設定が一部機能しない競合を修正
  14. // 1.4.1 2019/05/09 座標の中心移動機能でX軸だけでなくY軸についても中心移動できるよう修正
  15. // 1.4.0 2018/11/21 残像の表示可否をアクター、敵キャラごとにスイッチで制御できる機能を追加
  16. // 1.3.0 2018/06/03 攻撃中バトラーを消去する機能を追加
  17. // 1.2.2 2018/04/07 AnimatedSVEnemies.jsとの競合を解消
  18. // 1.2.1 2018/03/31 直接エフェクト行動後、アクターのターンが回ってきたとき選択中に一歩前進しなくなる問題を修正
  19. // 1.2.0 2018/01/16 スキル実行時の移動中にSVモーションを適用できる機能を追加
  20. // 1.1.4 2017/06/04 残像を使用する設定で複数のキャラクターに対して連続でアニメーションを再生すると処理落ちする問題を修正
  21. // 1.1.3 2017/06/04 StateRolling.jsとの競合を解消
  22. // 1.1.2 2017/05/18 高速で戦闘を進めた場合に、たまにダメージが敵キャラの後ろに隠れてしまうことがある問題を修正
  23. // 1.1.1 2016/11/13 設定次第で、戦闘終了後にセーブできなくなる場合がある不具合を修正
  24. // 1.1.0 2016/10/05 常時残像を有効にする設定の追加
  25. //                  BattlerGraphicExtend.jsとの連携を強化
  26. // 1.0.0 2016/09/01 初版
  27. // ----------------------------------------------------------------------------
  28. // [Blog]   : [url]https://triacontane.blogspot.jp/[/url]
  29. // [Twitter]: [url]https://twitter.com/triacontane/[/url]
  30. // [GitHub] : [url]https://github.com/triacontane/[/url]
  31. //=============================================================================
  32.  
  33. /*:
  34.  * @plugindesc 战斗近身攻击系统[v1.5.0]
  35.  * @author triacontane 汉化:硕明云书
  36.  * @target MVZ @url [url]https://github.com/triacontane/RPGMakerMV/tree/mz_master[/url] @author triacontane
  37.  *
  38.  * @param Duration
  39.  * @text 持续时间
  40.  * @desc 在移动到另一方之前乘以帧数的默认值。 如果未在备注栏中指定,则参考此值
  41.  * @default 12
  42.  *
  43.  * @param Altitude
  44.  * @text 高度
  45.  * @desc 向对手做抛物线运动时的高度默认值。 如果未在备注栏中指定,则以该值为参考。
  46.  * @default 10
  47.  *
  48.  * @param ValidActor
  49.  * @text 攻击方向应用于角色
  50.  * @desc 将直接攻击方向应用于角色;如果关闭,则不会应用。
  51.  * @default true
  52.  * @type boolean
  53.  *
  54.  * @param ValidEnemy
  55.  * @text 攻击方向应用于敌方角色
  56.  * @desc 将直接攻击方向应用于敌方角色;如果关闭,则不会应用。
  57.  * @default true
  58.  * @type boolean
  59.  *
  60.  * @param NoAfterimage
  61.  * @text 禁用残影
  62.  * @desc 打开它将禁用残影显示。 这是一种冲突和性能措施。
  63.  * @default false
  64.  * @type boolean
  65.  *
  66.  * @param AlwaysAfterimage
  67.  * @text 始终显示残影
  68.  * @desc 如果打开,战斗中将始终显示残影。 这样可以更方便地与其他插件配合使用。
  69.  * @default false
  70.  * @type boolean
  71.  *
  72.  * @param ActorAfterimageSwitch
  73.  * @text 显示残影开关
  74.  * @desc 只有当指定编号的开关打开时,才会在玩家身上显示残影。 如果0未指定,则始终显示。
  75.  * @default 0
  76.  * @type switch
  77.  *
  78.  * @param EnemyAfterimageSwitch
  79.  * @text 敌方残影开关
  80.  * @desc 只有当指定数字的开关处于打开状态时,敌方才会显示残影。 如果未指定,则始终显示。
  81.  * @default 0
  82.  * @type switch
  83.  *
  84.  * @help 执行技能时,先靠近目标,然后再执行技能。
  85.  * 执行以下附加功能。
  86.  *
  87.  * 抛物线平移
  88.  * 直接指定坐标移动
  89.  * 战斗动画显示
  90.  * 残影显示
  91.  *
  92.  * 对于那些不使用 YEP 动作序列的人,主要是由于冲突或其他原因。
  93.  * 在技能的备注栏中注明以下内容。
  94.  *
  95.  * <DAE攻撃:12,10,0,0,0>    # 12为帧数显示的过渡时间,10为跳跃的高度
  96.  * <DAEAttack:12,10,0,0,0>  # 同上
  97.  * <DAE帰投:18,25>          # 技能执行后返回初始位置  18为过渡的帧数 25为高度
  98.  * <DAEReturn:18,25>        # 同上
  99.  * <DAE姿隠し>              # 移动过程中隐藏
  100.  * <DAEHidden>              # 同上
  101.  * <DAE残像>                # 移动时显示残影
  102.  * <DAEAfterimage>          # 同上
  103.  * <DAE帰投なし>            # 激活后不会返回原位
  104.  * <DAENoReturn>            # 同上
  105.  * <DAEアニメ:1>            # 玩家自身播放 ID 为 [1] 的动画
  106.  * <DAEAnimation:1>         # 同上
  107.  * <DAE対象者アニメ:1>      # 在対方播放 ID [1] 的动画
  108.  * <DAETargetAnimation:1>   # 同上
  109.  * <DAE絶対位置:320,240>    # 移动到坐标 [320,240]
  110.  * <DAEAbsolutePos:320,240> # 同上
  111.  * <DAE相対位置:30,10>      # 移动到距离主体 [30, 10] 的位置
  112.  * <DAERelativePos:30,10>   # 同上
  113.  * <DAE自己相対位置:5,0>    # 从自身移动到位置 [5, 0]
  114.  * <DAESelfRelativePos:5,0> # 同上
  115.  * <DAE瞬間移動:320,240>    # 瞬间移动到坐标 [320, 240]
  116.  * <DAETeleport:320,240>    # 同上
  117.  * <DAEアクターのみ>        # 方向只有在玩家执行时才会被激活
  118.  * <DAEActorOnly>           # 同上
  119.  * <DAE敵キャラのみ>        # 该方向只有在敌方角色执行时才有效。
  120.  * <DAEEnemyOnly>           # 同上
  121.  * <DAE武器:1>              # 攻击时的动作变成 "攻击:武器类型 [1]"
  122.  * <DAEWeapon:1>            # 同上
  123.  * <DAEモーション:dead>     # 攻击时的动作是 "阵亡"
  124.  * <DAEMotion:dead>         # 同上
  125.  * <DAE開始モーション:dead> # 攻击开始时的动作是 "阵亡"
  126.  * <DAEStartMotion:dead>    # 同上
  127.  * <DAE終了モーション:dead> # 攻击结束时的动作会变成 "阵亡"
  128.  * <DAEEndMotion:dead>      # 同上
  129.  * <DAEVanish>              # 在攻击行动中,战斗员是隐藏的
  130.  * <DAE消滅>                # 同上
  131.  *
  132.  * ※运动类型说明如下
  133.  *
  134.  * 备注栏的详细信息
  135.  * <DAE攻撃:[帧数],[高度],[Z坐标],[X中心移動],[Y中心移動]>
  136.  * 在指定帧数内移动到目标位置,然后再执行技能。
  137.  * 如果设置了高度,它将以抛物线轨迹移动。
  138.  * 如果设置 Z 坐标,目标将移动到比原点更高的位置。
  139.  * 如果将 [1] 设为中心移动,则会移动到目标的中心而不是其前方。
  140.  *
  141.  * <DAE帰投:[帧数],[高度],[Z座標]>
  142.  * 在技能执行后返回初始位置。
  143.  * 如果未指定,它将以与攻击相同的帧数和高度返回。
  144.  * 如果在攻击中指定了 Z 坐标,除非指定为 0,否则它将保持在空中。
  145.  *
  146.  * <DAE帰投なし>
  147.  * 执行技能后不再返回。
  148.  * 只指定特殊技能,因为它们会永远停留在该位置。
  149.  *
  150.  * <DAEアニメ:[アニメーションID]>
  151.  * 在主体上播放 ID 为 [1] 的动画。
  152.  * 播放时间为动作开始前。
  153.  * 如果指定了只播放音效的动画,则可以播放任何音效。
  154.  *
  155.  * <DAE絶対位置:[X座標],[Y座標]>
  156.  * 移动的目的地将位于屏幕上的指定坐标处,与目标无关。
  157.  * 由敌方角色使用时,X 坐标会反转。
  158.  *
  159.  * <DAE相対位置:[X座標],[Y座標]>
  160.  * 目的地从目标的前方按指定坐标移动。
  161.  *
  162.  * <DAE自己相対位置:[X座標],[Y座標]>
  163.  * 目的地会根据指定的坐标从自身坐标移位。
  164.  *
  165.  * <DAE瞬間移動:[X座標],[Y座標]>
  166.  * 立即移动到指定位置,然后开始向目标移动。
  167.  *
  168.  * <DAE武器:[武器タイプID]>
  169.  * 使用指定的武器类型 ID 执行技能,与装备的武器无关。
  170.  * 如果没有指定武器类型 ID(<DAE 武器>),则使用装备的武器执行技能。
  171.  *
  172.  * <DAEモーション:[モーション名称]>
  173.  * 将用于执行技能的动作更改为指定的动作。
  174.  * 动作名称如下。 (符合"[SV] 战斗角色")。
  175.  *
  176.  * walk     歩行
  177.  * wait     待机
  178.  * chant    詠唱
  179.  * guard    防御
  180.  * damage   受伤
  181.  * evade    回避
  182.  * thrust   攻击(推进)
  183.  * swing    攻击(挥拳)
  184.  * missile  攻击方式(飞行武器)
  185.  * skill    技能
  186.  * spell    魔法
  187.  * item     物品
  188.  * escape   逃走
  189.  * victory  勝利
  190.  * dying    瀕死
  191.  * abnormal 状态异常
  192.  * sleep    睡眠
  193.  * dead     阵亡
  194.  *
  195.  * <DAE開始モーション:[モーション名称]>
  196.  * 将技能开始时的动作更改为指定的动作。
  197.  *
  198.  * <DAE終了モーション:[モーション名称]>
  199.  * 将技能末端移动过程中的动作更改为指定动作。
  200.  *
  201.  * 该插件没有插件命令。
  202.  * 使用条款:
  203.  * 可在未经作者许可的情况下修改和重新发布,对使用形式(商业、18 岁以下限制使用等)没有限制。
  204.  * 不受限制。
  205.  * 此插件现在属于您。
  206.  * 本插件根据 MIT 许可发布。
  207.  */
  208.  
  209. /*:ja
  210.  * @plugindesc 直接攻撃演出プラグイン
  211.  * @target MZ @url [url]https://github.com/triacontane/RPGMakerMV/tree/mz_master[/url] @author トリアコンタン
  212.  *
  213.  * @param フレーム数
  214.  * @desc 相手の元に移動するまでに掛けるフレーム数のデフォルト値です。メモ欄で指定がないとこの値が参照されます。
  215.  * @default 12
  216.  *
  217.  * @param 高度
  218.  * @desc 相手の元に放物線移動する際の高度のデフォルト値です。メモ欄で指定がないとこの値が参照されます。
  219.  * @default 10
  220.  *
  221.  * @param アクターに適用
  222.  * @desc 直接攻撃演出をアクターに適用します。OFFにすると適用されません。
  223.  * @default true
  224.  * @type boolean
  225.  *
  226.  * @param 敵キャラに適用
  227.  * @desc 直接攻撃演出を敵キャラに適用します。OFFにすると適用されません。
  228.  * @default true
  229.  * @type boolean
  230.  *
  231.  * @param 残像不使用
  232.  * @desc ONにすると残像表示が無効になります。競合やパフォーマンス対策になります。
  233.  * @default false
  234.  * @type boolean
  235.  *
  236.  * @param 常時残像使用
  237.  * @desc ONにすると戦闘中は常に残像が表示されます。他のプラグインとの連携がしやすくなります。
  238.  * @default false
  239.  * @type boolean
  240.  *
  241.  * @param アクター残像スイッチID
  242.  * @desc 指定した番号のスイッチがONのときだけアクターに残像が表示されます。指定しない場合は常に表示されます。
  243.  * @default 0
  244.  * @type switch
  245.  *
  246.  * @param 敵キャラ残像スイッチID
  247.  * @desc 指定した番号のスイッチがONのときだけ敵キャラに残像が表示されます。指定しない場合は常に表示されます。
  248.  * @default 0
  249.  * @type switch
  250.  *
  251.  * @help スキル実行時にターゲットまで近寄ってから実行します。
  252.  * 追加で以下の機能を実装します。
  253.  *
  254.  * ・放物線移動
  255.  * ・座標直接指定移動
  256.  * ・戦闘アニメーション表示
  257.  * ・残像表示
  258.  *
  259.  * 主に競合等の理由でYEPアクションシーケンスを使用しない方向けです。
  260.  * スキルのメモ欄に以下の通り指定してください。
  261.  *
  262.  * <DAE攻撃:12,10,0,0,0>    # 12フレーム、高度10で対象まで移動
  263.  * <DAEAttack:12,10,0,0,0>  # 同上
  264.  * <DAE帰投:18,25>          # 18フレーム、高度25で元に位置に戻る
  265.  * <DAEReturn:18,25>        # 同上
  266.  * <DAE姿隠し>              # 移動する際にバトラーの姿を隠します。
  267.  * <DAEHidden>              # 同上
  268.  * <DAE残像>                # 移動する際にバトラーの残像を表示します。
  269.  * <DAEAfterimage>          # 同上
  270.  * <DAE帰投なし>            # 発動後に元の位置に戻らなくなります。
  271.  * <DAENoReturn>            # 同上
  272.  * <DAEアニメ:1>            # 発動者にID[1]のアニメーションを再生します。
  273.  * <DAEAnimation:1>         # 同上
  274.  * <DAE攻撃アニメ:1>        # 攻撃する瞬間、発動者にID[1]のアニメーションを再生します。
  275.  * <DAEAttackAnimation:1>   # 同上
  276.  * <DAE対象者アニメ:1>      # 対象者にID[1]のアニメーションを再生します。
  277.  * <DAETargetAnimation:1>   # 同上
  278.  * <DAE絶対位置:320,240>    # 座標[320, 240]に移動します。
  279.  * <DAEAbsolutePos:320,240> # 同上
  280.  * <DAE相対位置:30,10>      # 対象者から[30, 10]の位置に移動します。
  281.  * <DAERelativePos:30,10>   # 同上
  282.  * <DAE自己相対位置:5,0>    # 自分自身から[5, 0]の位置に移動します。
  283.  * <DAESelfRelativePos:5,0> # 同上
  284.  * <DAE瞬間移動:320,240>    # 座標[320, 240]に瞬間移動します。
  285.  * <DAETeleport:320,240>    # 同上
  286.  * <DAEアクターのみ>        # アクターが実行したときのみ演出が有効になります。
  287.  * <DAEActorOnly>           # 同上
  288.  * <DAE敵キャラのみ>        # 敵キャラが実行したときのみ演出が有効になります。
  289.  * <DAEEnemyOnly>           # 同上
  290.  * <DAE武器:1>              # 攻撃時のモーションが「攻撃:武器タイプ[1]」になります。
  291.  * <DAEWeapon:1>            # 同上
  292.  * <DAEモーション:dead>     # 攻撃時のモーションが「戦闘不能」になります。
  293.  * <DAEMotion:dead>         # 同上
  294.  * <DAE開始モーション:dead> # 攻撃開始時のモーションが「戦闘不能」になります。
  295.  * <DAEStartMotion:dead>    # 同上
  296.  * <DAE終了モーション:dead> # 攻撃終了時のモーションが「戦闘不能」になります。
  297.  * <DAEEndMotion:dead>      # 同上
  298.  * <DAEVanish>              # 攻撃動作中、バトラーが非表示になります。
  299.  * <DAE消滅>                # 同上
  300.  *
  301.  * ※モーションの種類については後述
  302.  *
  303.  * メモ欄詳細
  304.  * <DAE攻撃:[フレーム数],[高度],[Z座標],[X中心移動],[Y中心移動]>
  305.  * 指定したフレーム数で対象まで移動してからスキルを実行します。
  306.  * 高度を設定すると放物線移動するようになります。
  307.  * Z座標を指定すると本来の地点より高い場所に移動します。
  308.  * 中心移動に[1]を設定すると、相手の正面ではなく中心に移動します。
  309.  *
  310.  * <DAE帰投:[フレーム数],[高度],[Z座標]>
  311.  * スキル実行後に元の位置に戻ります。
  312.  * 指定しなかった場合、攻撃と同じフレーム数、高度で戻ります。
  313.  * 攻撃でZ座標を指定した場合は、0を指定しないと宙に浮いたままです。
  314.  *
  315.  * <DAE帰投なし>
  316.  * スキル実行後に帰投しなくなります。
  317.  * ずっとその位置に留まるので、特殊なスキルのみ指定します。
  318.  *
  319.  * <DAEアニメ:[アニメーションID]>
  320.  * 対象者にID[1]のアニメーションを再生します。
  321.  * 再生されるタイミングは、移動開始する直前です。
  322.  * 効果音のみのアニメーションを指定すれば、任意の効果音を再生できます。
  323.  *
  324.  * <DAE絶対位置:[X座標],[Y座標]>
  325.  * 移動先がターゲットとは無関係に、画面上の指定座標になります。
  326.  * 敵キャラが使用する場合、X座標が反転します。
  327.  *
  328.  * <DAE相対位置:[X座標],[Y座標]>
  329.  * 移動先がターゲットの正面から指定した座標分ずれた位置になります。
  330.  *
  331.  * <DAE自己相対位置:[X座標],[Y座標]>
  332.  * 移動先が自分自身の座標から指定した座標分ずれた位置になります。
  333.  *
  334.  * <DAE瞬間移動:[X座標],[Y座標]>
  335.  * 即座に指定位置に移動してから、ターゲットへの移動を開始します。
  336.  *
  337.  * <DAE武器:[武器タイプID]>
  338.  * 装備武器とは無関係に指定した武器タイプIDでスキルを実行します。
  339.  * 武器タイプIDを指定しない(<DAE武器>)と装備武器で実行します。
  340.  *
  341.  * <DAEモーション:[モーション名称]>
  342.  * スキル実行時のモーションを指定したものに変更します。
  343.  * モーション名称は以下の通りです。(「[SV]戦闘キャラ」に準拠)
  344.  *
  345.  * walk     歩行
  346.  * wait     待機
  347.  * chant    詠唱
  348.  * guard    防御
  349.  * damage   ダメージ
  350.  * evade    回避
  351.  * thrust   攻撃(突き)
  352.  * swing    攻撃(振り)
  353.  * missile  攻撃(飛び道具)
  354.  * skill    スキル
  355.  * spell    魔法
  356.  * item     アイテム
  357.  * escape   逃走
  358.  * victory  勝利
  359.  * dying    瀕死
  360.  * abnormal 状態異常
  361.  * sleep    睡眠
  362.  * dead     戦闘不能
  363.  *
  364.  * <DAE開始モーション:[モーション名称]>
  365.  * スキル開始の移動中のモーションを指定したものに変更します。
  366.  *
  367.  * <DAE終了モーション:[モーション名称]>
  368.  * スキル終了の移動中のモーションを指定したものに変更します。
  369.  *
  370.  * このプラグインにはプラグインコマンドはありません。
  371.  *
  372.  * 利用規約:
  373.  *  作者に無断で改変、再配布が可能で、利用形態(商用、18禁利用等)
  374.  *  についても制限はありません。
  375.  *  このプラグインはもうあなたのものです。
  376.  */
  377.  
  378. /**
  379.  * アクターの残像を表示するスプライトです。
  380.  * @constructor
  381.  */
  382. function Sprite_AfterimageActor() {
  383.     this.initialize.apply(this, arguments);
  384. }
  385.  
  386. /**
  387.  * 敵キャラの残像を表示するスプライトです。
  388.  * @constructor
  389.  */
  390. function Sprite_AfterimageEnemy() {
  391.     this.initialize.apply(this, arguments);
  392. }
  393.  
  394. /**
  395.  * ダミースプライトです。
  396.  * @constructor
  397.  */
  398. function Sprite_Dummy() {
  399.     this.initialize.apply(this, arguments);
  400. }
  401.  
  402. (function() {
  403.     'use strict';
  404.     var pluginName    = 'DirectlyAttackEffect';
  405.     var metaTagPrefix = 'DAE';
  406.  
  407.     var getParamOther = function(paramNames) {
  408.         if (!Array.isArray(paramNames)) paramNames = [paramNames];
  409.         for (var i = 0; i < paramNames.length; i++) {
  410.             var name = PluginManager.parameters(pluginName)[paramNames[i]];
  411.             if (name) return name;
  412.         }
  413.         return null;
  414.     };
  415.  
  416.     var getParamNumber = function(paramNames, min, max) {
  417.         var value = getParamOther(paramNames);
  418.         if (arguments.length < 2) min = -Infinity;
  419.         if (arguments.length < 3) max = Infinity;
  420.         return (parseInt(value, 10) || 0).clamp(min, max);
  421.     };
  422.  
  423.     var getParamBoolean = function(paramNames) {
  424.         var value = (getParamOther(paramNames) || '').toUpperCase();
  425.         return value === 'ON' || value === 'TRUE';
  426.     };
  427.  
  428.     var getArgNumber = function(arg, min, max) {
  429.         if (arguments.length < 2) min = -Infinity;
  430.         if (arguments.length < 3) max = Infinity;
  431.         return (parseInt(convertEscapeCharacters(arg), 10) || 0).clamp(min, max);
  432.     };
  433.  
  434.     var getArgArrayString = function(args, upperFlg) {
  435.         var values = getArgString(args, upperFlg).split(',');
  436.         if (values[0] === '') values = [];
  437.         for (var i = 0; i < values.length; i++) values[i] = values[i].trim();
  438.         return values;
  439.     };
  440.  
  441.     var getArgArrayNumber = function(args, min, max) {
  442.         var values = getArgArrayString(args, false);
  443.         if (arguments.length < 2) min = -Infinity;
  444.         if (arguments.length < 3) max = Infinity;
  445.         for (var i = 0; i < values.length; i++) values[i] = (parseInt(values[i], 10) || 0).clamp(min, max);
  446.         return values;
  447.     };
  448.  
  449.     var getArgArrayEval = function(args, min, max) {
  450.         var values = getArgArrayString(args, false);
  451.         if (arguments.length < 2) min = -Infinity;
  452.         if (arguments.length < 3) max = Infinity;
  453.         for (var i = 0; i < values.length; i++) values[i] = eval(values[i]).clamp(min, max);
  454.         return values;
  455.     };
  456.  
  457.     var getArgString = function(arg, upperFlg) {
  458.         arg = convertEscapeCharacters(arg);
  459.         return upperFlg ? arg.toUpperCase() : arg;
  460.     };
  461.  
  462.     var convertEscapeCharacters = function(text) {
  463.         if (text == null || text === true) text = '';
  464.         var windowLayer = SceneManager._scene._windowLayer;
  465.         return windowLayer ? windowLayer.children[0].convertEscapeCharacters(text) : text;
  466.     };
  467.  
  468.     var getMetaValue = function(object, name) {
  469.         var metaTagName = metaTagPrefix + (name ? name : '');
  470.         return object.meta.hasOwnProperty(metaTagName) ? object.meta[metaTagName] : undefined;
  471.     };
  472.  
  473.     var getMetaValues = function(object, names) {
  474.         if (!Array.isArray(names)) return getMetaValue(object, names);
  475.         for (var i = 0, n = names.length; i < n; i++) {
  476.             var value = getMetaValue(object, names[i]);
  477.             if (value !== undefined) return value;
  478.         }
  479.         return undefined;
  480.     };
  481.  
  482.     //=============================================================================
  483.     // パラメータの取得と整形
  484.     //=============================================================================
  485.     var paramAltitude              = getParamNumber(['Altitude', '高度'], 0);
  486.     var paramDuration              = getParamNumber(['Duration', 'フレーム数'], 1);
  487.     var paramValidActor            = getParamBoolean(['ValidActor', 'アクターに適用']);
  488.     var paramValidEnemy            = getParamBoolean(['ValidEnemy', '敵キャラに適用']);
  489.     var paramNoAfterimage          = getParamBoolean(['NoAfterimage', '残像不使用']);
  490.     var paramAlwaysAfterimage      = getParamBoolean(['AlwaysAfterimage', '常時残像使用']);
  491.     var paramActorAfterimageSwitch = getParamNumber(['ActorAfterimageSwitch', 'アクター残像スイッチID'], 0);
  492.     var paramEnemyAfterimageSwitch = getParamNumber(['EnemyAfterimageSwitch', '敵キャラ残像スイッチID'], 0);
  493.  
  494.     //=============================================================================
  495.     // Game_Battler
  496.     //  対象に接近する演出をリクエストします。
  497.     //=============================================================================
  498.     var _Game_Battler_initMembers      = Game_Battler.prototype.initMembers;
  499.     Game_Battler.prototype.initMembers = function() {
  500.         _Game_Battler_initMembers.apply(this, arguments);
  501.         this.initDirectlyAttack();
  502.     };
  503.  
  504.     Game_Battler.prototype.initDirectlyAttack = function() {
  505.         this._directlyAttackInfo     = null;
  506.         this._directlyReturnInfo     = null;
  507.         this._directlyAdditionalInfo = null;
  508.         this._vanish                 = false;
  509.     };
  510.  
  511.     Game_Battler.prototype.setDirectlyAttack = function(target, action) {
  512.         var attackArgs = getMetaValues(action.item(), ['Attack', '攻撃']);
  513.         if (attackArgs) {
  514.             this._directlyAttackInfo = this.makeDirectlyInfo(target, getArgArrayNumber(attackArgs));
  515.         } else {
  516.             this._directlyAttackInfo = null;
  517.         }
  518.         var returnArgs = getMetaValues(action.item(), ['Return', '帰投']);
  519.         if (returnArgs) {
  520.             this._directlyReturnInfo = this.makeDirectlyInfo(target, getArgArrayNumber(returnArgs));
  521.         } else {
  522.             this._directlyReturnInfo = this._directlyAttackInfo;
  523.         }
  524.         this.setDirectlyAttackAdditionalInfo(action.item());
  525.     };
  526.  
  527.     Game_Battler.prototype.setDirectlyAttackAdditionalInfo = function(item) {
  528.         if (!this.isValidDirectlyAttack(item)) {
  529.             this._directlyAttackInfo = null;
  530.             return;
  531.         }
  532.         var info   = {};
  533.         var hidden = getMetaValues(item, ['姿隠し', 'Hidden']);
  534.         if (hidden) info.hidden = true;
  535.         var afterimage = getMetaValues(item, ['残像', 'Afterimage']);
  536.         if (afterimage) info.afterimage = true;
  537.         var absPos = getMetaValues(item, ['絶対位置', 'AbsolutePos']);
  538.         if (absPos) info.absolutePosition = getArgArrayEval(absPos);
  539.         var relPos = getMetaValues(item, ['相対位置', 'RelativePos']);
  540.         if (relPos) info.relativePosition = getArgArrayEval(relPos);
  541.         var selfRelPos = getMetaValues(item, ['自己相対位置', 'SelfRelativePos']);
  542.         if (selfRelPos) info.selfRelativePosition = getArgArrayEval(selfRelPos);
  543.         var telPos = getMetaValues(item, ['瞬間移動', 'Teleport']);
  544.         if (telPos) info.teleportPosition = getArgArrayEval(telPos);
  545.         var noReturn = getMetaValues(item, ['帰投なし', 'NoReturn']);
  546.         if (noReturn) info.noReturn = true;
  547.         var subjectAnimationId = getMetaValues(item, ['アニメ', 'Animation']);
  548.         if (subjectAnimationId) info.subjectAnimationId = getArgNumber(subjectAnimationId, 1);
  549.         var attackAnimationId = getMetaValues(item, ['攻撃アニメ', 'AttackAnimation']);
  550.         if (attackAnimationId) info.attackAnimationId = getArgNumber(attackAnimationId, 1);
  551.         var targetAnimationId = getMetaValues(item, ['対象者アニメ', 'TargetAnimation']);
  552.         if (targetAnimationId) info.targetAnimationId = getArgNumber(targetAnimationId, 1);
  553.         this._directlyAdditionalInfo = info;
  554.         this._vanish                 = getMetaValues(item, ['消滅', 'Vanish']);
  555.     };
  556.  
  557.     Game_Actor.prototype.isValidDirectlyAttack = function(item) {
  558.         var enemyOnly = getMetaValues(item, ['敵キャラのみ', 'EnemyOnly']);
  559.         return !enemyOnly && paramValidActor;
  560.     };
  561.  
  562.     Game_Enemy.prototype.isValidDirectlyAttack = function(item) {
  563.         var actorOnly = getMetaValues(item, ['アクターのみ', 'ActorOnly']);
  564.         return !actorOnly && paramValidEnemy;
  565.     };
  566.  
  567.     Game_Battler.prototype.makeDirectlyInfo = function(target, args) {
  568.         var directlyAttack         = {};
  569.         directlyAttack.target      = target;
  570.         directlyAttack.duration    = args[0] !== undefined ? args[0] : paramDuration;
  571.         directlyAttack.altitude    = args[1] !== undefined ? args[1] : paramAltitude;
  572.         directlyAttack.z           = args[2] !== undefined ? args[2] : 0;
  573.         directlyAttack.moveCenter  = !!args[3];
  574.         directlyAttack.moveCenterY = !!args[4];
  575.         return directlyAttack;
  576.     };
  577.  
  578.     Game_Battler.prototype.getDirectoryAttack = function() {
  579.         return this._directlyAttackInfo;
  580.     };
  581.  
  582.     Game_Battler.prototype.getDirectoryReturn = function() {
  583.         return this._directlyReturnInfo;
  584.     };
  585.  
  586.     Game_Battler.prototype.getDirectoryAddition = function() {
  587.         return this._directlyAdditionalInfo;
  588.     };
  589.  
  590.     Game_Battler.prototype.hasDirectoryAttack = function() {
  591.         return !!this._directlyAttackInfo;
  592.     };
  593.  
  594.     var _Game_Battler_performActionStart      = Game_Battler.prototype.performActionStart;
  595.     Game_Battler.prototype.performActionStart = function(action) {
  596.         _Game_Battler_performActionStart.apply(this, arguments);
  597.         if (this.hasDirectoryAttack()) {
  598.             this._directlyAttack = true;
  599.         }
  600.     };
  601.  
  602.     var _Game_Battler_performActionEnd      = Game_Battler.prototype.performActionEnd;
  603.     Game_Battler.prototype.performActionEnd = function() {
  604.         _Game_Battler_performActionEnd.apply(this, arguments);
  605.         if (this.hasDirectoryAttack()) {
  606.             this._directlyReturn = true;
  607.         }
  608.     };
  609.  
  610.     Game_Battler.prototype.isDirectlyAttackRequested = function() {
  611.         return this._directlyAttack;
  612.     };
  613.  
  614.     Game_Battler.prototype.isDirectlyReturnRequested = function() {
  615.         return this._directlyReturn;
  616.     };
  617.  
  618.     Game_Battler.prototype.resetDirectlyAttackRequest = function() {
  619.         this._directlyAttack = false;
  620.     };
  621.  
  622.     Game_Battler.prototype.resetDirectlyReturnRequest = function() {
  623.         this._directlyReturn = false;
  624.     };
  625.  
  626.     var _Game_Battler_onTurnEnd      = Game_Battler.prototype.onTurnEnd;
  627.     Game_Battler.prototype.onTurnEnd = function() {
  628.         _Game_Battler_onTurnEnd.apply(this, arguments);
  629.         this.initDirectlyAttack();
  630.     };
  631.  
  632.     Game_Battler.prototype.isVanish = function() {
  633.         return this._vanish;
  634.     };
  635.  
  636.     Game_Battler.prototype.resetVanish = function() {
  637.         this._vanish = false;
  638.     };
  639.  
  640.     //=============================================================================
  641.     // Game_Actor
  642.     //  攻撃モーションをスキルごとに設定します。
  643.     //=============================================================================
  644.     var _Game_Actor_performActionStart      = Game_Actor.prototype.performActionStart;
  645.     Game_Actor.prototype.performActionStart = function(action) {
  646.         _Game_Actor_performActionStart.apply(this, arguments);
  647.         this._actionForMotion = action;
  648.         this.requestCustomMotion(['開始モーション', 'StartMotion']);
  649.     };
  650.  
  651.     var _Game_Actor_performActionEnd      = Game_Actor.prototype.performActionEnd;
  652.     Game_Actor.prototype.performActionEnd = function() {
  653.         _Game_Actor_performActionEnd.apply(this, arguments);
  654.         this.requestCustomMotion(['終了モーション', 'EndMotion']);
  655.         this._actionForMotion = null;
  656.     };
  657.  
  658.     var _Game_Actor_performAction      = Game_Actor.prototype.performAction;
  659.     Game_Actor.prototype.performAction = function(action) {
  660.         if (paramValidActor) {
  661.             if (this.requestCustomMotion(['モーション', 'Motion'])) {
  662.                 return;
  663.             }
  664.             var attackMotion = getMetaValues(action.item(), ['武器', 'Weapon']);
  665.             if (attackMotion) {
  666.                 if (attackMotion !== true) {
  667.                     this._motionWeapon = {wtypeId: getArgNumber(attackMotion)};
  668.                 }
  669.                 this.performAttack();
  670.                 this._motionWeapon = null;
  671.                 return;
  672.             }
  673.         }
  674.         _Game_Actor_performAction.apply(this, arguments);
  675.     };
  676.  
  677.     var _Game_Actor_weapons      = Game_Actor.prototype.weapons;
  678.     Game_Actor.prototype.weapons = function() {
  679.         if (this._motionWeapon) {
  680.             return [this._motionWeapon];
  681.         } else {
  682.             return _Game_Actor_weapons.apply(this, arguments);
  683.         }
  684.     };
  685.  
  686.     Game_Actor.prototype.requestCustomMotion = function(tagNames) {
  687.         if (!this._actionForMotion) {
  688.             return false;
  689.         }
  690.         var customMotion = getMetaValues(this._actionForMotion.item(), tagNames);
  691.         if (customMotion) {
  692.             this.requestMotion(getArgString(customMotion).toLowerCase());
  693.         }
  694.         return !!customMotion;
  695.     };
  696.  
  697.     //=============================================================================
  698.     // Game_Enemy
  699.     //  直接攻撃演出の可否を判定します。
  700.     //=============================================================================
  701.     // for AnimatedSVEnemies.js
  702.     Game_Enemy.prototype.requestCustomMotion = function(tagNames) {
  703.         // do nothing
  704.     };
  705.  
  706.     //=============================================================================
  707.     // BattleManager
  708.     //  戦闘終了後に直接攻撃用の参照を破棄します。
  709.     //=============================================================================
  710.     var _BattleManager_endAction = BattleManager.endBattle;
  711.     BattleManager.endBattle      = function(result) {
  712.         _BattleManager_endAction.apply(this, arguments);
  713.         $gameParty.battleMembers().forEach(function(member) {
  714.             member.initDirectlyAttack();
  715.         });
  716.     };
  717.  
  718.     //=============================================================================
  719.     // Window_BattleLog
  720.     //  ターゲットへの直接攻撃演出を追加定義します。
  721.     //=============================================================================
  722.     var _Window_BattleLog_updateWaitMode      = Window_BattleLog.prototype.updateWaitMode;
  723.     Window_BattleLog.prototype.updateWaitMode = function() {
  724.         var waiting = false;
  725.         switch (this._waitMode) {
  726.             case 'animation':
  727.                 waiting = this._spriteset.isAnimationPlaying();
  728.                 break;
  729.         }
  730.         if (!waiting) {
  731.             waiting = _Window_BattleLog_updateWaitMode.apply(this, arguments);
  732.         }
  733.         return waiting;
  734.     };
  735.  
  736.     Window_BattleLog.prototype.waitForAnimation = function() {
  737.         this.setWaitMode('animation');
  738.     };
  739.  
  740.     var _Window_BattleLog_startAction      = Window_BattleLog.prototype.startAction;
  741.     Window_BattleLog.prototype.startAction = function(subject, action, targets) {
  742.         var target = (targets[0] && subject.opponentsUnit() !== targets[0].opponentsUnit() ? targets[0] : null);
  743.         subject.setDirectlyAttack(target, action);
  744.         this.startActionAnimation(subject, targets);
  745.         _Window_BattleLog_startAction.apply(this, arguments);
  746.     };
  747.  
  748.     Window_BattleLog.prototype.startActionAnimation = function(subject, targets) {
  749.         var attackInfo = subject.getDirectoryAddition();
  750.         if (!attackInfo) return;
  751.         if (attackInfo.subjectAnimationId > 0) {
  752.             this.push('showAnimation', subject, [subject], attackInfo.subjectAnimationId);
  753.             this.push('waitForAnimation');
  754.         }
  755.         if (attackInfo.targetAnimationId > 0) {
  756.             this.push('showAnimation', subject, targets, attackInfo.targetAnimationId);
  757.             this.push('waitForAnimation');
  758.         }
  759.     };
  760.  
  761.     var _Window_BattleLog_performActionStart      = Window_BattleLog.prototype.performActionStart;
  762.     Window_BattleLog.prototype.performActionStart = function(subject, action) {
  763.         _Window_BattleLog_performActionStart.apply(this, arguments);
  764.         this.push('waitForMovement');
  765.     };
  766.  
  767.     var _Window_BattleLog_performActionEnd      = Window_BattleLog.prototype.performActionEnd;
  768.     Window_BattleLog.prototype.performActionEnd = function(subject) {
  769.         _Window_BattleLog_performActionEnd.apply(this, arguments);
  770.         this.push('waitForMovement');
  771.     };
  772.  
  773.     var _Window_BattleLog_performAction = Window_BattleLog.prototype.performAction;
  774.     Window_BattleLog.prototype.performAction = function(subject, action) {
  775.         _Window_BattleLog_performAction.apply(this, arguments);
  776.         var attackInfo = subject.getDirectoryAddition();
  777.         if (attackInfo && attackInfo.attackAnimationId > 0) {
  778.             this.showAnimation(subject, [subject], attackInfo.attackAnimationId);
  779.             this.waitForAnimation();
  780.         }
  781.     };
  782.  
  783.     //=============================================================================
  784.     // Sprite_Battler
  785.     //  ターゲットへの直接攻撃演出を追加定義します。
  786.     //=============================================================================
  787.     Sprite_Battler.prototype.isAfterImage = function() {
  788.         return false;
  789.     };
  790.  
  791.     Sprite_Battler.prototype.createAfterimageSprites = function() {
  792.         if (paramNoAfterimage) return;
  793.         var numbers = this.getAfterimageNumbers();
  794.         for (var i = 0; i < numbers; i++) {
  795.             this.createAfterimageSprite(i);
  796.         }
  797.     };
  798.  
  799.     Sprite_Battler.prototype.setSpriteSet = function(spriteSet) {
  800.         this._spriteSet = spriteSet;
  801.     };
  802.  
  803.     Sprite_Battler.prototype.createAfterimageSprite = function(index) {
  804.         var sprite = this.getObjectSpriteAfterimage();
  805.         sprite.setAfterimageIndex(index);
  806.         sprite.visible = false;
  807.         sprite.setOriginalSprite(this);
  808.         this._afterimageSprites.push(sprite);
  809.         this.parent.addChildAt(sprite, this.parent.getChildIndex(this) - index);
  810.     };
  811.  
  812.     Sprite_Battler.prototype.getObjectSpriteAfterimage = function() {
  813.         return this instanceof Sprite_Actor ? new Sprite_AfterimageActor(this._battler) :
  814.             new Sprite_AfterimageEnemy(this._battler);
  815.     };
  816.  
  817.     var _Sprite_Battler_initMembers      = Sprite_Battler.prototype.initMembers;
  818.     Sprite_Battler.prototype.initMembers = function() {
  819.         _Sprite_Battler_initMembers.apply(this, arguments);
  820.         this._attackX                  = 0;
  821.         this._attackY                  = 0;
  822.         this._attackZ                  = 0;
  823.         this._afterimageSprites        = [];
  824.         this._afterimageLocus          = [];
  825.         this._afterimageViaibleCounter = 0;
  826.         this.setVisibleAfterImage(false);
  827.     };
  828.  
  829.     Sprite_Battler.prototype.setVisibleAfterImage = function(value) {
  830.         this._visibleAfterimage = (value || paramAlwaysAfterimage) && this.isValidAfterImageSwitch();
  831.     };
  832.  
  833.     var _Sprite_Battler_setBattler      = Sprite_Battler.prototype.setBattler;
  834.     Sprite_Battler.prototype.setBattler = function(battler) {
  835.         if (!this.isAfterImage()) {
  836.             _Sprite_Battler_setBattler.apply(this, arguments);
  837.         } else {
  838.             this._battler = battler;
  839.         }
  840.         this._afterimageSprites.forEach(function(sprite) {
  841.             sprite.setBattler(battler);
  842.         });
  843.     };
  844.  
  845.     var _Sprite_Battler_update      = Sprite_Battler.prototype.update;
  846.     Sprite_Battler.prototype.update = function() {
  847.         _Sprite_Battler_update.apply(this, arguments);
  848.         if (this._battler) {
  849.             this.updateDirectly();
  850.         }
  851.     };
  852.  
  853.     Sprite_Battler.prototype.setPriorityMostFront = function() {
  854.         if (!this.isAfterImage()) {
  855.             this._afterimageSprites.forEach(function(sprite) {
  856.                 sprite.setPriorityMostFront();
  857.             });
  858.         }
  859.         var frontIndex = this.parent.children.length - 1;
  860.         this.parent.children.some(function(sprite, index) {
  861.             if (sprite instanceof Sprite_Damage || sprite instanceof Sprite_Animation) {
  862.                 frontIndex = index - 1;
  863.                 return true;
  864.             }
  865.             return false;
  866.         });
  867.         this.parent.setChildIndex(this, frontIndex);
  868.     };
  869.  
  870.     Sprite_Battler.prototype.updateDirectly = function() {
  871.         if (this._battler.isDirectlyAttackRequested()) {
  872.             this._battler.resetDirectlyAttackRequest();
  873.             this._targetSprite     = this.getActionTargetSprite();
  874.             var attackInfo         = this._battler.getDirectoryAttack();
  875.             this._attackMoveCenter = attackInfo.moveCenter;
  876.             this._attackMoveCenterY = attackInfo.moveCenterY;
  877.             var position           = this.getDirectoryPosition();
  878.             this.startAttackMotion(position.x, position.y, attackInfo, false);
  879.         }
  880.         if (this._battler.isDirectlyReturnRequested()) {
  881.             this._battler.resetDirectlyReturnRequest();
  882.             var returnInfo = this._battler.getDirectoryReturn();
  883.             if (!this._noReturn) {
  884.                 this.startReturnMotion(returnInfo);
  885.             }
  886.             this._noReturn = false;
  887.         }
  888.         this.updateDirectlyOpacity();
  889.     };
  890.  
  891.     Sprite_Battler.prototype.updateDirectlyOpacity = function() {
  892.         if (this._battler.isVanish()) {
  893.             this.opacity = 0;
  894.         } else if (this.isAttackMotionHidden()) {
  895.             this.getMainSprite().opacity = this.getAttackMotionOpacity();
  896.         }
  897.     };
  898.  
  899.     Sprite_Battler.prototype.getDirectoryPosition = function() {
  900.         var target = this._targetSprite;
  901.         var x      = (target ? target.x - this.getNoAttackX() + this.getDirectoryPositionShiftX() : 0);
  902.         var y      = (target ? target.y - this.getNoAttackY() + this.getDirectoryPositionShiftY() : 0);
  903.         return {x: x, y: y};
  904.     };
  905.  
  906.     Sprite_Battler.prototype.getDirectoryPositionShiftX = function() {
  907.         return 0;
  908.     };
  909.  
  910.     Sprite_Battler.prototype.getDirectoryPositionShiftY = function() {
  911.         return 0;
  912.     };
  913.  
  914.     Sprite_Battler.prototype.getBattler = function() {
  915.         return this._battler;
  916.     };
  917.  
  918.     Sprite_Battler.prototype.getActionTargetSprite = function() {
  919.         var spriteSet = this.parent.parent.parent;
  920.         return spriteSet.getBattlerSprite(this._battler.getDirectoryAttack().target);
  921.     };
  922.  
  923.     Sprite_Battler.prototype.startAttackMotion = function(x, y, attackInfo, returnFlg) {
  924.         if (this.isPlayingAttackMotion()) return;
  925.         var additionalInfo = this._battler.getDirectoryAddition();
  926.         this._returnMotion = returnFlg;
  927.         if (!returnFlg) {
  928.             var newPos          = this.shiftAttackMotion(x, y, additionalInfo);
  929.             this._targetAttackX = newPos.x;
  930.             this._targetAttackY = newPos.y;
  931.         } else {
  932.             this._targetAttackX = x;
  933.             this._targetAttackY = y;
  934.         }
  935.         this._targetAttackZ      = attackInfo.z;
  936.         this._attackDuration     = attackInfo.duration;
  937.         this._attackDurationTime = this._attackDuration;
  938.         this._attackAltitude     = attackInfo.altitude;
  939.         this._noReturn           = additionalInfo.noReturn;
  940.         this._originalOpacity    = (additionalInfo.hidden ? this.opacity : null);
  941.         if (attackInfo.duration === 0) {
  942.             this._attackX = this._targetAttackX;
  943.             this._attackY = this._targetAttackY;
  944.             this._attackZ = this._targetAttackZ;
  945.         } else {
  946.             this.setPriorityMostFront();
  947.             if (additionalInfo.afterimage && !paramNoAfterimage && !this._battler.isVanish()) {
  948.                 this.setVisibleAfterImage(true);
  949.             }
  950.         }
  951.     };
  952.  
  953.     Sprite_Battler.prototype.shiftAttackMotion = function(x, y, additionalInfo) {
  954.         var absPos = additionalInfo.absolutePosition;
  955.         if (absPos) {
  956.             x = this.getEnemyReverseX(absPos[0] || 0) - this.getNoAttackX();
  957.             y = (absPos[1] || 0) - this.getNoAttackY();
  958.         }
  959.         var selfRelPos = additionalInfo.selfRelativePosition;
  960.         if (selfRelPos) {
  961.             x = (selfRelPos[0] || 0) * (this.isEnemySprite() ? -1 : 1);
  962.             y = (selfRelPos[1] || 0);
  963.         }
  964.         var relPos = additionalInfo.relativePosition;
  965.         if (relPos) {
  966.             x = relPos[0] ? x + relPos[0] * (this.isEnemySprite() ? -1 : 1) : x;
  967.             y = relPos[1] ? y + relPos[1] : y;
  968.         }
  969.         var telPos = additionalInfo.teleportPosition;
  970.         if (telPos) {
  971.             this._attackX = this.getEnemyReverseX(absPos[0] || 0) - this.getNoAttackX();
  972.             this._attackY = (absPos[1] || 0) - this.getNoAttackY();
  973.         }
  974.         return {x: x, y: y};
  975.     };
  976.  
  977.     Sprite_Battler.prototype.startReturnMotion = function(returnInfo) {
  978.         this.startAttackMotion(0, 0, returnInfo, true);
  979.     };
  980.  
  981.     var _Sprite_Battler_updateMove      = Sprite_Battler.prototype.updateMove;
  982.     Sprite_Battler.prototype.updateMove = function() {
  983.         _Sprite_Battler_updateMove.apply(this, arguments);
  984.         this.updateAttackMotion();
  985.     };
  986.  
  987.     Sprite_Battler.prototype.updateAttackMotion = function() {
  988.         if (!this._attackDuration) {
  989.             return;
  990.         }
  991.         var d         = this._attackDuration;
  992.         this._attackX = (this._attackX * (d - 1) + this._targetAttackX) / d;
  993.         this._attackY = (this._attackY * (d - 1) + this._targetAttackY) / d;
  994.         this._attackZ = (this._attackZ * (d - 1) + this._targetAttackZ) / d;
  995.         this._attackDuration--;
  996.         if (this._attackDuration === 0) {
  997.             this.onAttackMotionEnd();
  998.         }
  999.     };
  1000.  
  1001.     Sprite_Battler.prototype.onAttackMotionEnd = function() {
  1002.         this.onMoveEnd();
  1003.         if (this._attackX === 0 && this._attackY === 0) {
  1004.             this._spriteSet.resetBattlerOrder();
  1005.         }
  1006.         this._attackEndFrame = Graphics.frameCount;
  1007.         this.setVisibleAfterImage(false);
  1008.         if (this._battler.isVanish() && this._returnMotion) {
  1009.             this.opacity = 255;
  1010.             this._battler.resetVanish();
  1011.         }
  1012.     };
  1013.  
  1014.     Sprite_Battler.prototype.getAttackMotionOpacity = function() {
  1015.         var t = this._attackDurationTime;
  1016.         var d = this._attackDuration;
  1017.         return this._originalOpacity * Math.pow(this.getDaTimeLine(d, t), 4);
  1018.     };
  1019.  
  1020.     var _Sprite_Battler_updatePosition      = Sprite_Battler.prototype.updatePosition;
  1021.     Sprite_Battler.prototype.updatePosition = function() {
  1022.         _Sprite_Battler_updatePosition.apply(this, arguments);
  1023.  
  1024.         this.x += this._attackX;
  1025.         this.y += this._attackY - this.getAttackAltitude();
  1026.         if (this.isVisibleAfterimage()) {
  1027.             this.updateAfterimages();
  1028.         } else if (this._afterimageLocus.length > 0) {
  1029.             this._afterimageLocus = [];
  1030.         }
  1031.     };
  1032.  
  1033.     Sprite_Battler.prototype.updateAfterimages = function() {
  1034.         this._afterimageLocus.unshift([this.getRealX(), this.getRealY()]);
  1035.         var interval = this.getAfterimageInterval();
  1036.         var numbers  = this.getAfterimageNumbers();
  1037.         var counter  = this._afterimageViaibleCounter;
  1038.         if (this._afterimageLocus.length % interval === 0 && counter < numbers && this._visibleAfterimage) {
  1039.             this._afterimageSprites[counter].visible = true;
  1040.             this._afterimageViaibleCounter++;
  1041.         }
  1042.         for (var i = 0; i < this._afterimageSprites.length; i++) {
  1043.             this.updateAfterimage(this._afterimageSprites[i]);
  1044.         }
  1045.         if (this._afterimageLocus.length > interval * numbers) {
  1046.             this._afterimageLocus.pop();
  1047.         }
  1048.     };
  1049.  
  1050.     Sprite_Battler.prototype.getRealX = function() {
  1051.         return this.x;
  1052.     };
  1053.  
  1054.     Sprite_Battler.prototype.getRealY = function() {
  1055.         return this.y;
  1056.     };
  1057.  
  1058.     Sprite_Battler.prototype.updateAfterimage = function(afterimage) {
  1059.         if (!afterimage.visible) return;
  1060.         var afterimageIndex = afterimage.getAfterimageIndex();
  1061.         var interval        = this.getAfterimageInterval();
  1062.         var frameDelay      = Math.min(afterimageIndex * interval, this._afterimageLocus.length - 1);
  1063.         var x               = this._afterimageLocus[frameDelay][0];
  1064.         var y               = this._afterimageLocus[frameDelay][1];
  1065.         if (!this._visibleAfterimage && Graphics.frameCount - this._attackEndFrame > frameDelay && afterimage.visible) {
  1066.             afterimage.visible = false;
  1067.             this._afterimageViaibleCounter--;
  1068.         }
  1069.         afterimage.move(x, y);
  1070.     };
  1071.  
  1072.     Sprite_Battler.prototype.getAfterimageInterval = function() {
  1073.         return this._attackDurationTime > 60 ? 4 : 2;
  1074.     };
  1075.  
  1076.     Sprite_Battler.prototype.getAfterimageNumbers = function() {
  1077.         return this._attackDurationTime > 60 ? 6 : 8;
  1078.     };
  1079.  
  1080.     Sprite_Battler.prototype.isVisibleAfterimage = function() {
  1081.         return !this.isAfterImage() && (this._visibleAfterimage || this._afterimageViaibleCounter > 0) &&
  1082.             this._afterimageSprites.length > 0;
  1083.     };
  1084.  
  1085.     Sprite_Battler.prototype.getAttackAltitude = function() {
  1086.         var t = this._attackDurationTime;
  1087.         var d = this._attackDuration;
  1088.         return (this.isPlayingAttackMotion() ? this._calcAltitude(1, t) - this._calcAltitude(d, t) : 0) + this._attackZ;
  1089.     };
  1090.  
  1091.     Sprite_Battler.prototype._calcAltitude = function(d, t) {
  1092.         var altitude = Math.floor(Math.pow(this.getDaTimeLine(d, t) * this._attackAltitude, 2));
  1093.         if (this._attackAltitude < 0) altitude *= -1;
  1094.         return altitude;
  1095.     };
  1096.  
  1097.     Sprite_Battler.prototype.getDaTimeLine = function(d, t) {
  1098.         return ((d - (t / 2)) / (t / 2));
  1099.     };
  1100.  
  1101.     var _Sprite_Battler_isMoving      = Sprite_Battler.prototype.isMoving;
  1102.     Sprite_Battler.prototype.isMoving = function() {
  1103.         return _Sprite_Battler_isMoving.apply(this, arguments) || this.isPlayingAttackMotion();
  1104.     };
  1105.  
  1106.     Sprite_Battler.prototype.isPlayingAttackMotion = function() {
  1107.         return this._attackDuration > 0;
  1108.     };
  1109.  
  1110.     Sprite_Battler.prototype.isAttackMotionHidden = function() {
  1111.         return !!this._originalOpacity;
  1112.     };
  1113.  
  1114.     Sprite_Battler.prototype.isEnemySprite = function() {
  1115.         return this._battler.isEnemy();
  1116.     };
  1117.  
  1118.     Sprite_Battler.prototype.getNoAttackX = function() {
  1119.         return this.x - this._attackX;
  1120.     };
  1121.  
  1122.     Sprite_Battler.prototype.getNoAttackY = function() {
  1123.         return this.y - this._attackY + this._attackZ;
  1124.     };
  1125.  
  1126.     Sprite_Battler.prototype.getEnemyReverseX = function(x) {
  1127.         return x;
  1128.     };
  1129.  
  1130.     // for YEP_BattleEngineCore.js
  1131.     Sprite_Battler.prototype.moveForward = function() {
  1132.         // do nothing
  1133.     };
  1134.  
  1135.     Sprite_Battler.prototype.isValidAfterImageSwitch = function() {
  1136.         return true;
  1137.     };
  1138.  
  1139.     //=============================================================================
  1140.     // Sprite_Actor
  1141.     //  ターゲットへの直接攻撃演出を追加定義します。
  1142.     //=============================================================================
  1143.     var _Sprite_Actor_updatePosition      = Sprite_Actor.prototype.hasOwnProperty('updatePosition') ?
  1144.         Sprite_Actor.prototype.updatePosition : null;
  1145.     Sprite_Actor.prototype.updatePosition = function() {
  1146.         if (_Sprite_Actor_updatePosition) {
  1147.             _Sprite_Actor_updatePosition.apply(this, arguments);
  1148.         } else {
  1149.             Sprite_Battler.prototype.updatePosition.call(this);
  1150.         }
  1151.         var altitude = this.getAttackAltitude();
  1152.         if (altitude >= 0) {
  1153.             this._shadowSprite.y       = this.getAttackAltitude();
  1154.             this._shadowSprite.opacity = 255 - this._shadowSprite.y / 2;
  1155.         }
  1156.     };
  1157.  
  1158.     Sprite_Actor.prototype.getDirectoryPositionShiftX = function() {
  1159.         if (this._attackMoveCenter) {
  1160.             return Sprite_Battler.prototype.getDirectoryPositionShiftX.apply(this, arguments);
  1161.         }
  1162.         var targetSprite = this._targetSprite;
  1163.         return this.anchor.x * this.width + (1 - targetSprite.anchor.x) * targetSprite.width + 16;
  1164.     };
  1165.  
  1166.     Sprite_Actor.prototype.getDirectoryPositionShiftY = function() {
  1167.         if (!this._attackMoveCenterY) {
  1168.             return Sprite_Battler.prototype.getDirectoryPositionShiftY.apply(this, arguments);
  1169.         }
  1170.         var targetSprite = this._targetSprite;
  1171.         return -targetSprite.height / 2;
  1172.     };
  1173.  
  1174.     var _Sprite_Actor_stepForward      = Sprite_Actor.prototype.stepForward;
  1175.     Sprite_Actor.prototype.stepForward = function() {
  1176.         if (this._battler.hasDirectoryAttack()) return;
  1177.         _Sprite_Actor_stepForward.apply(this, arguments);
  1178.     };
  1179.  
  1180.     Sprite_Actor.prototype.getRealX = function() {
  1181.         return Sprite_Battler.prototype.getRealX.apply(this, arguments) + this._mainSprite.x;
  1182.     };
  1183.  
  1184.     Sprite_Actor.prototype.getRealY = function() {
  1185.         return Sprite_Battler.prototype.getRealY.apply(this, arguments) + this._mainSprite.y * this.scale.y;
  1186.     };
  1187.  
  1188.     Sprite_Actor.prototype.getMainSprite = function() {
  1189.         return this._mainSprite;
  1190.     };
  1191.  
  1192.     Sprite_Actor.prototype.getMotionInfo = function() {
  1193.         return {motion: this._motion, pattern: this._pattern};
  1194.     };
  1195.  
  1196.     Sprite_Actor.prototype.isValidAfterImageSwitch = function() {
  1197.         return paramActorAfterimageSwitch <= 0 || $gameSwitches.value(paramActorAfterimageSwitch);
  1198.     };
  1199.  
  1200.     //=============================================================================
  1201.     // Sprite_Enemy
  1202.     //  ターゲットへの直接攻撃演出を追加定義します。
  1203.     //=============================================================================
  1204.     Sprite_Enemy.prototype.getDirectoryPositionShiftX = function() {
  1205.         if (this._attackMoveCenter) {
  1206.             return Sprite_Battler.prototype.getDirectoryPositionShiftX.apply(this, arguments);
  1207.         }
  1208.         var targetSprite = this._targetSprite;
  1209.         return -((1 - this.anchor.x) * this.width + targetSprite.anchor.x * targetSprite.width + 16);
  1210.     };
  1211.  
  1212.     Sprite_Enemy.prototype.getEnemyReverseX = function(x) {
  1213.         return Graphics.width - Sprite_Battler.prototype.getEnemyReverseX.apply(this, arguments);
  1214.     };
  1215.  
  1216.     Sprite_Enemy.prototype.getMainSprite = function() {
  1217.         return this;
  1218.     };
  1219.  
  1220.     Sprite_Enemy.prototype.isValidAfterImageSwitch = function() {
  1221.         return paramEnemyAfterimageSwitch <= 0 || $gameSwitches.value(paramEnemyAfterimageSwitch);
  1222.     };
  1223.  
  1224.     //=============================================================================
  1225.     // Sprite_AfterimageActor
  1226.     //  アクターの残像クラス
  1227.     //=============================================================================
  1228.     Sprite_AfterimageActor.prototype             = Object.create(Sprite_Actor.prototype);
  1229.     Sprite_AfterimageActor.prototype.constructor = Sprite_AfterimageActor;
  1230.  
  1231.     Sprite_AfterimageActor.prototype.updatePosition = function() {};
  1232.  
  1233.     Sprite_AfterimageActor.prototype.setBattler = function(battler) {
  1234.         this._battler = battler;
  1235.         var changed = (battler !== this._actor);
  1236.         if (changed) {
  1237.             this._actor = battler;
  1238.             if (battler) {
  1239.                 this.setActorHome(battler.index());
  1240.             }
  1241.             this.startEntryMotion();
  1242.             this._stateSprite.setup(battler);
  1243.         }
  1244.     };
  1245.  
  1246.     Sprite_AfterimageActor.prototype.createShadowSprite = function() {
  1247.         this._shadowSprite = new Sprite_Dummy();
  1248.     };
  1249.  
  1250.     Sprite_AfterimageActor.prototype.createStateSprite = function() {
  1251.         this._stateSprite     = new Sprite_Dummy();
  1252.         this._stateIconSprite = new Sprite_Dummy();
  1253.     };
  1254.  
  1255.     Sprite_AfterimageActor.prototype.createWeaponSprite = function() {
  1256.         this._weaponSprite = new Sprite_Dummy();
  1257.     };
  1258.  
  1259.     Sprite_AfterimageActor.prototype.setAfterimageIndex = function(index) {
  1260.         this._afterimageIndex = index;
  1261.         var numbers           = this.getAfterimageNumbers();
  1262.         this._opacityRate     = (numbers - index) / numbers;
  1263.     };
  1264.  
  1265.     Sprite_AfterimageActor.prototype.getAfterimageIndex = function() {
  1266.         return this._afterimageIndex;
  1267.     };
  1268.  
  1269.     Sprite_AfterimageActor.prototype.update = function() {
  1270.         if (this._battler) {
  1271.             this.updateMain();
  1272.             this.updateProperty();
  1273.             this.updateMotion();
  1274.         } else {
  1275.             this.bitmap = null;
  1276.         }
  1277.     };
  1278.  
  1279.     Sprite_AfterimageActor.prototype.updateMotion = function() {
  1280.         var motionInfo = this._originalSprite.getMotionInfo();
  1281.         this._motion   = motionInfo.motion;
  1282.         this._pattern  = motionInfo.pattern;
  1283.     };
  1284.  
  1285.     Sprite_AfterimageActor.prototype.updateProperty = function() {
  1286.         if (paramAlwaysAfterimage) {
  1287.             this.visible = (this.x !== this._originalSprite.getRealX() || this.y !== this._originalSprite.getRealY());
  1288.         }
  1289.         if (!this.visible) return;
  1290.         this.scale.x   = this._originalSprite.scale.x;
  1291.         this.scale.y   = this._originalSprite.scale.y;
  1292.         this.opacity   = this._originalMainSprite.opacity * this._opacityRate;
  1293.         this.blendMode = this._originalMainSprite.blendMode;
  1294.         this.setColorTone(this._originalMainSprite.getColorTone());
  1295.         this.setBlendColor(this._originalMainSprite.getBlendColor());
  1296.     };
  1297.  
  1298.     Sprite_AfterimageActor.prototype.setOriginalSprite = function(originalSprite) {
  1299.         this._originalSprite     = originalSprite;
  1300.         this._originalMainSprite = originalSprite.getMainSprite();
  1301.     };
  1302.  
  1303.     Sprite_AfterimageActor.prototype.isAfterImage = function() {
  1304.         return true;
  1305.     };
  1306.  
  1307.     //=============================================================================
  1308.     // Sprite_AfterimageEnemy
  1309.     //  敵キャラの残像クラス
  1310.     //=============================================================================
  1311.     Sprite_AfterimageEnemy.prototype             = Object.create(Sprite_Enemy.prototype);
  1312.     Sprite_AfterimageEnemy.prototype.constructor = Sprite_AfterimageEnemy;
  1313.  
  1314.     Sprite_AfterimageEnemy.prototype.updatePosition = function() {};
  1315.  
  1316.     Sprite_AfterimageEnemy.prototype.createStateIconSprite = function() {
  1317.         this._stateIconSprite = new Sprite_Dummy();
  1318.     };
  1319.  
  1320.     Sprite_AfterimageEnemy.prototype.isAfterImage = function() {
  1321.         return true;
  1322.     };
  1323.  
  1324.     Sprite_AfterimageEnemy.prototype.update             = Sprite_AfterimageActor.prototype.update;
  1325.     Sprite_AfterimageEnemy.prototype.updateProperty     = Sprite_AfterimageActor.prototype.updateProperty;
  1326.     Sprite_AfterimageEnemy.prototype.setOriginalSprite  = Sprite_AfterimageActor.prototype.setOriginalSprite;
  1327.     Sprite_AfterimageEnemy.prototype.setAfterimageIndex = Sprite_AfterimageActor.prototype.setAfterimageIndex;
  1328.     Sprite_AfterimageEnemy.prototype.getAfterimageIndex = Sprite_AfterimageActor.prototype.getAfterimageIndex;
  1329.     Sprite_AfterimageEnemy.prototype.updateMotion       = function() {};
  1330.  
  1331.     //=============================================================================
  1332.     // Sprite_Dummy
  1333.     //  ダミースプライト
  1334.     //=============================================================================
  1335.     Sprite_Dummy.prototype.initialize = function() {};
  1336.  
  1337.     Sprite_Dummy.prototype.constructor = Sprite_Dummy;
  1338.  
  1339.     Sprite_Dummy.prototype.setup = function() {};
  1340.  
  1341.     //=============================================================================
  1342.     // Spriteset_Battle
  1343.     //  バトラースプライトを取得可能にします。
  1344.     //=============================================================================
  1345.     Spriteset_Battle.prototype.getBattlerSprite = function(battler) {
  1346.         if (!battler) return null;
  1347.         var sprites = (battler.isActor() ? this._actorSprites : this._enemySprites);
  1348.         return sprites.filter(function(sprite) {
  1349.             return sprite.getBattler() === battler;
  1350.         })[0];
  1351.     };
  1352.  
  1353.     var _Spriteset_Battle_createEnemies      = Spriteset_Battle.prototype.createEnemies;
  1354.     Spriteset_Battle.prototype.createEnemies = function() {
  1355.         _Spriteset_Battle_createEnemies.apply(this, arguments);
  1356.         this.iterateEnemySprites(this.createBattlerAfterimage.bind(this));
  1357.     };
  1358.  
  1359.     var _Spriteset_Battle_createActors      = Spriteset_Battle.prototype.createActors;
  1360.     Spriteset_Battle.prototype.createActors = function() {
  1361.         _Spriteset_Battle_createActors.apply(this, arguments);
  1362.         this.iterateActorSprites(this.createBattlerAfterimage.bind(this));
  1363.     };
  1364.  
  1365.     Spriteset_Battle.prototype.createBattlerAfterimage = function(sprite) {
  1366.         sprite.createAfterimageSprites();
  1367.         sprite.setSpriteSet(this);
  1368.     };
  1369.  
  1370.     Spriteset_Battle.prototype.resetBattlerOrder = function() {
  1371.         this.iterateActorSprites(this.setBattlerPriorityMostFront);
  1372.         this.iterateEnemySprites(this.setBattlerPriorityMostFront);
  1373.     };
  1374.  
  1375.     Spriteset_Battle.prototype.setBattlerPriorityMostFront = function(sprite, playingOnly) {
  1376.         if (!playingOnly || sprite.isPlayingAttackMotion()) sprite.setPriorityMostFront();
  1377.     };
  1378.  
  1379.     var _Spriteset_Battle_updateZCoordinates      = Spriteset_Battle.prototype.updateZCoordinates;
  1380.     Spriteset_Battle.prototype.updateZCoordinates = function() {
  1381.         _Spriteset_Battle_updateZCoordinates.apply(this, arguments);
  1382.         this.iterateEnemySprites(this.setBattlerPriorityMostFront, true);
  1383.         this.iterateActorSprites(this.setBattlerPriorityMostFront, true);
  1384.     };
  1385.  
  1386.     Spriteset_Battle.prototype.iterateActorSprites = function(callBack, extend) {
  1387.         this.iterateBattlerSprites(this._actorSprites, callBack, extend);
  1388.     };
  1389.  
  1390.     Spriteset_Battle.prototype.iterateEnemySprites = function(callBack, extend) {
  1391.         this.iterateBattlerSprites(this._enemySprites, callBack, extend);
  1392.     };
  1393.  
  1394.     Spriteset_Battle.prototype.iterateBattlerSprites = function(sprites, callBack, extend) {
  1395.         for (var i = 0, n = sprites.length; i < n; i++) {
  1396.             callBack.call(this, sprites[i], extend);
  1397.         }
  1398.     };
  1399. })();

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-25 03:02

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表