silver-bullet/js/plugins/PictureMessage.js
2024-07-02 14:17:45 -05:00

2233 lines
62 KiB
JavaScript

//=============================================================================
// RPG Maker MZ - PictureMessage
//=============================================================================
/*:
* @target MZ
* @plugindesc Displays actor pictures on messages automatically.
* @author nz_prism
* @base ActorPictures
* @url https://github.com/nz-prism/RPG-Maker-MZ/blob/master/ActorPictures/js/plugins/PictureMessage.js
*
* @help PictureMessage.js
* ver 1.4.0
*
* [History]
* 07/03/2021 1.0.0 Released
* 07/05/2021 1.1.0 Added picture animation and inverse functionality
* 07/06/2021 1.1.1 Fixed easing direction did not reflect the mirror settings
* 07/10/2021 1.2.0 Added some commands and enabled picture states to be saved
* 07/12/2021 1.3.0 Enabled an actor picture is shown in battle
* 07/13/2021 1.3.1 Fixed battle picture issues on TPB
* 12/28/2021 1.3.2 Fixed the balloon icon position
* 02/14/2022 1.3.3 Changed the default balloon icon position
* 03/22/2022 1.3.4 Fixed a minor issue
* 05/20/2022 1.4.0 Added a plugin parameter to specify easing directions
*
* This plugin displays actor pictures on messages automatically.
* It requires ActorPictures.js. Configure pictures for each
* actor with ActorPictures.js first.
*
* To display actor pictures, input "\AP[nPOSITION]" into the
* name field for the message command. "n" represents Actor ID,
* whose picture will be displayed. "POSITION" represents the
* position where the picture stands. It can be specified by
* words, such as "L" or "Right". See below for the detail. For
* example, if you want to show the picture of the No. 1 actor
* at right, input \AP[1R]. When the game is running, these
* control characters will be replaced with the actor's name.
*
* You don't have to specify face images since they aren't
* displayed when the actor picture is displayed. However, if
* you specify a face image with its index, the index will be used
* as picture index for the actor. It's the same as the plugin
* command "Set Picture Index" of ActorPictures.js. See the
* description of ActorPictures.js for the detail. Since this face
* image will not be displayed, you don't have to prepare multiple
* face images for each actor.
* The displayed pictures reeflect damaged, stated and/or picture
* index in accordance with the actor condition.
*
* You can specify the coordinates of the picture display with the
* plugin parameters. Note the X axis is aligned with the center of
* the picture. If you have specified the center X for the picture
* with the plugin parameter "Picture Calibrations" of
* ActorPictures.js, that value will be used as the center.
* If a plugin parameter "Use Bottom as Y Axis Origin" is true, the
* bottom of the picture will be used as the Y Axis Origin. It's
* useful if the scale of the pictures are aligned. If not, set it
* false. If false, the Y axis will be decreased by the value for
* the plugin parameter "Offset Y" of ActorPictures.js.
*
* The actor pictures aren't erased automatically at the end of the
* messages. Use a plugin command "Erase Picture" to erase them.
* It can erase an individual picture or all the pictures at once.
*
* Pictures can be animated. If plugin parameters of ActorPictures.js
* are set, the pictures will be animated while they are displayed.
*
* If a plugin parameter "Show Picture on Battle Command" is true,
* when inputting the actor command, the actor picture will be shown.
* If a picture is already shown at the same position, the actor for
* the command will replace it.
*
*
* ■ Control Characters for the name field
* \AP[nPOSITION]
*
* Strings for POSITION (case-insensitive)
* Left: L, Left, 左
* Center: C, Center, 中
* Right: R, Right, 右
*
*
* This plugin is released under MIT license.
* https://opensource.org/licenses/mit-license.php
*
*
* @param bottomYOrigin
* @text Use Bottom as Y Axis Origin
* @desc If true, the bottom of the picture will be used as Y-axis origin. If false, the top will be the origin.
* @type boolean
* @default false
*
* @param defaultPictureSettings
* @text Default Picture Settings
* @desc The default settings for each picture.
*
* @param pictureCoordinates
* @parent defaultPictureSettings
* @text Coordinates
* @desc The coordinates for the pictures.
*
* @param leftPictureX
* @parent pictureCoordinates
* @text Left Picture X
* @desc The X axis for the left picture. The center of the picture will be the origin.
* @type number
* @default 120
* @min -100000
*
* @param leftPictureY
* @parent pictureCoordinates
* @text Left Picture Y
* @desc The Y axis for the left picture. Note the origin depends on "Use Bottom as Y Axis Origin".
* @type number
* @default 0
* @min -100000
*
* @param centerPictureX
* @parent pictureCoordinates
* @text Center Picture
* @desc The X axis for the center picture. The center of the picture will be the origin.
* @type number
* @default 408
* @min -100000
*
* @param centerPictureY
* @parent pictureCoordinates
* @text Center Picture Y
* @desc The Y axis for the center picture. Note the origin depends on "Use Bottom as Y Axis Origin".
* @type number
* @default 0
* @min -100000
*
* @param rightPictureX
* @parent pictureCoordinates
* @text Right Picture X
* @desc The X axis for the right picture. The center of the picture will be the origin.
* @type number
* @default 696
* @min -100000
*
* @param rightPictureY
* @parent pictureCoordinates
* @text Right Picture Y
* @desc The Y axis for the right picture. Note the origin depends on "Use Bottom as Y Axis Origin".
* @type number
* @default 0
* @min -100000
*
* @param pictureMirror
* @parent defaultPictureSettings
* @text Mirror
* @desc Settings to invert pictures.
*
* @param leftMirror
* @parent pictureMirror
* @text Left Picture Mirror
* @desc If true, the left picture will be inverted horizontally.
* @default true
* @type boolean
*
* @param centerMirror
* @parent pictureMirror
* @text Center Picture Mirror
* @desc If true, the center picture will be inverted horizontally.
* @default false
* @type boolean
*
* @param rightMirror
* @parent pictureMirror
* @text Right Picture Mirror
* @desc If true, the right picture will be inverted horizontally.
* @default false
* @type boolean
*
* @param easing
* @text Easing
* @desc The easing values for the appearance/disappearance of pictures.
*
* @param easingOffset
* @parent easing
* @text Easing Distance
* @desc The distance of easing.
* @type number
* @default 64
* @min 0
*
* @param easingFrames
* @parent easing
* @text Easing Frames
* @desc The duration of easing.
* @type number
* @default 30
* @min 1
*
* @param easingDirections
* @parent easing
* @text Easing Direction
* @desc The direction for easing.
*
* @param easingDirectionLeft
* @parent easingDirections
* @text Left Picture Easing Direction
* @desc The direction for the left picture to appear. When disappearing, it will be opposite.
* @default 1
* @type select
* @option Left to Right
* @value 1
* @option Right to Left
* @value -1
*
* @param easingDirectionCenter
* @parent easingDirections
* @text Center Picture Easing Direction
* @desc The direction for the center picture to appear. When disappearing, it will be opposite.
* @default -1
* @type select
* @option Left to Right
* @value 1
* @option Right to Left
* @value -1
*
* @param easingDirectionRight
* @parent easingDirections
* @text Right Picture Easing Direction
* @desc The direction for the right picture to appear. When disappearing, it will be opposite.
* @default -1
* @type select
* @option Left to Right
* @value 1
* @option Right to Left
* @value -1
*
* @param deactiveToneSettings
* @text Deactive Tone Settings
* @desc The tone settings for actors who aren't speaking.
*
* @param deactiveTone
* @parent deactiveToneSettings
* @text Deactive Speaker Tone
* @desc The tone for actors who aren't speaking.
* @type struct<rgbg>
* @default {"red":"0","green":"0","blue":"0","gray":"128"}
*
* @param deactiveFrames
* @parent deactiveToneSettings
* @text Deactive Frames
* @desc The duration of tone change.
* @type number
* @default 15
* @min 1
*
* @param showPictureOnBattleCommand
* @text Show Picture on Battle Command
* @desc If true, when inputting the battle actor command, the actor picture will be shown.
* @type boolean
* @default true
*
* @param battleCommandPicturePosition
* @parent showPictureOnBattleCommand
* @text Battle Command Picture Position
* @desc The position where the actor picture stands when inputting the battle actor command.
* @default 2
* @type select
* @option Left
* @value 0
* @option Center
* @value 1
* @option Right
* @value 2
*
*
* @command clearPictures
* @text Erase Pictures
* @desc Erases displayed pictures with easing.
*
* @arg targetPosition
* @text Erase Target
* @desc The target pictures.
* @default -1
* @type select
* @option All
* @value -1
* @option Left Picture
* @value 0
* @option Center Picture
* @value 1
* @option Right Picture
* @value 2
*
* @command activateAllPictures
* @text Activate All Pictures
* @desc Change tones for all the actor pictures into active tones.
*
* @command showPicture
* @text Show Picture
* @desc Show an actor picture.
*
* @arg position
* @text Position
* @desc The position where the picture stands.
* @default 0
* @type select
* @option Left
* @value 0
* @option Center
* @value 1
* @option Right
* @value 2
*
* @arg actorId
* @text Actor
* @desc The actor whose picture will be shown.
* @default 1
* @type actor
*
* @arg leaveX
* @text Leave X
* @desc Leave the x axis as it is.
* @type boolean
* @default true
*
* @arg targetX
* @parent leaveX
* @text Target X
* @desc The X axis to be moved to. Specify it if Leave X is false.
* @type number
* @default 0
* @min -100000
*
* @arg leaveY
* @text Leave Y
* @desc The Y axis to be moved to. Specify it if Leave Y is false.
* @type boolean
* @default true
*
* @arg targetY
* @parent leaveY
* @text Target Y
* @desc The Y axis to be moved to. Specify it if Leave Y is false.
* @type number
* @default 0
* @min -100000
*
* @arg scaleX
* @text Width Scale
* @desc The width scale in percentage. If it's negative value, the picture will be inverted horizontally.
* @type number
* @default 100
* @min -2000
* @max 2000
*
* @arg scaleY
* @text Height Scale
* @desc The height scale in percentage. If it's negative value, the picture will be inverted vertically.
* @type number
* @default 100
* @min -2000
* @max 2000
*
* @arg opacity
* @text Opacity
* @desc The opacity to be.
* @type number
* @default 255
* @min -255
* @max 255
*
* @arg blendMode
* @text Blend Mode
* @desc The blend mode with which the picture will be drawn.
* @default 0
* @type select
* @option Normal
* @value 0
* @option Additive
* @value 1
* @option Multiply
* @value 2
* @option Screen
* @value 3
*
* @command movePicture
* @text Move Picture
* @desc Moves an actor picture.
*
* @arg position
* @text Position
* @desc The position where the actor picture to be moved stands.
* @default 0
* @type select
* @option Left
* @value 0
* @option Center
* @value 1
* @option Right
* @value 2
*
* @arg easingType
* @text Easing Type
* @desc The type of easing.
* @default 0
* @type select
* @option Constant speed
* @value 0
* @option Slow start
* @value 1
* @option Slow end
* @value 2
* @option Slow start and end
* @value 3
*
* @arg leaveX
* @text Leave X
* @desc Leave the x axis as it is.
* @type boolean
* @default true
*
* @arg targetX
* @parent leaveX
* @text Target X
* @desc The X axis to be moved to. Specify it if Leave X is false.
* @type number
* @default 0
* @min -100000
*
* @arg leaveY
* @text Leave Y
* @desc The Y axis to be moved to. Specify it if Leave Y is false.
* @type boolean
* @default true
*
* @arg targetY
* @parent leaveY
* @text Target Y
* @desc The Y axis to be moved to. Specify it if Leave Y is false.
* @type number
* @default 0
* @min -100000
*
* @arg scaleX
* @text Width Scale
* @desc The width scale in percentage. If it's negative value, the picture will be inverted horizontally.
* @type number
* @default 100
* @min -2000
* @max 2000
*
* @arg scaleY
* @text Height Scale
* @desc The height scale in percentage. If it's negative value, the picture will be inverted vertically.
* @type number
* @default 100
* @min -2000
* @max 2000
*
* @arg opacity
* @text Opacity
* @desc The opacity to be.
* @type number
* @default 255
* @min -255
* @max 255
*
* @arg blendMode
* @text Blend Mode
* @desc The blend mode with which the picture will be drawn.
* @default 0
* @type select
* @option Normal
* @value 0
* @option Additive
* @value 1
* @option Multiply
* @value 2
* @option Screen
* @value 3
*
* @arg duration
* @text Duration
* @desc The duration for move.
* @type number
* @default 60
* @min 1
*
* @arg waitForCompletion
* @text Wait for Completion
* @desc It waits until the move ends.
* @type boolean
* @default false
*
* @command rotatePicture
* @text Rotate Picture
* @desc Rotates an actor picture.
*
* @arg targetMessagePicture
* @text Target Picture
* @desc The picture to be rotated.
* @default leftMessagePicture
* @type select
* @option Left Picture
* @value leftMessagePicture
* @option Center Picture
* @value centerMessagePicture
* @option Right Picture
* @value rightMessagePicture
*
* @arg speed
* @text Speed
* @desc The speed at which the picture rotation angle increments. Positive value represents counterclockwise.
* @default 0
* @type number
* @min -90
* @max 90
*
* @command tintPicture
* @text Tint Picture
* @desc Tints an actor picture.
*
* @arg targetMessagePicture
* @text Target Picture
* @desc The picture to be tinted.
* @default leftMessagePicture
* @type select
* @option Left Picture
* @value leftMessagePicture
* @option Center Picture
* @value centerMessagePicture
* @option Right Picture
* @value rightMessagePicture
*
* @arg tone
* @text Tone
* @desc The tone to be.
* @type struct<rgbg>
* @default {"red":"0","green":"0","blue":"0","gray":"0"}
*
* @arg duration
* @text Dration
* @desc The duration for tint.
* @type number
* @default 60
* @min 1
* @max 999
*
* @arg waitForCompletion
* @text Wait for Completion
* @desc It waits until the tint ends.
* @type boolean
* @default false
*
* @command initPicture
* @text Initialize Picture
* @desc Initializes the settings for an actor picture.
*
* @arg position
* @text Position
* @desc The position where the actor picture to be initialized stands.
* @default 0
* @type select
* @option Left
* @value 0
* @option Center
* @value 1
* @option Right
* @value 2
*
* @command showBalloon
* @text Show Balloon Icon
* @desc Shows a balloon icon for an actor picture.
*
* @arg targetMessagePicture
* @text Target Picture
* @desc The picture at which the balloon icon to be shown.
* @default leftMessagePicture
* @type select
* @option Left Picture
* @value leftMessagePicture
* @option Center Picture
* @value centerMessagePicture
* @option Right Picture
* @value rightMessagePicture
*
* @arg balloonId
* @text Balloon Icon
* @desc The balloon icon to be shown.
* @default 1
* @type select
* @option Exclamation
* @value 1
* @option Question
* @value 2
* @option Music Note
* @value 3
* @option Heart
* @value 4
* @option Anger
* @value 5
* @option Sweat
* @value 6
* @option Frustration
* @value 7
* @option Silence
* @value 8
* @option Light Bulb
* @value 9
* @option Zzz
* @value 10
* @option User-defined 1
* @value 11
* @option User-defined 2
* @value 12
* @option User-defined 3
* @value 13
* @option User-defined 4
* @value 14
* @option User-defined 5
* @value 15
*
* @arg offsetX
* @text Balloon Offset X
* @desc The offset value from the standard X axis.
* @type number
* @default 0
* @min -100000
*
* @arg offsetY
* @text Balloon Offset Y
* @desc The offset value from the standard Y axis.
* @type number
* @default 0
* @min -100000
*
* @arg scaleX
* @text Balloon Width Scale
* @desc The width scale for the balloon icon in percentage.
* @type number
* @default 200
* @min 10
*
* @arg scaleY
* @text Balloon Height Scale
* @desc The height scale for the balloon icon in percentage.
* @type number
* @default 200
* @min 10
*
* @command showAnimation
* @text Show Animation
* @desc Shows an animation for an actor picture.
*
* @arg targetMessagePicture
* @text Target Picture
* @desc The picture at which the animation to be shown.
* @default leftMessagePicture
* @type select
* @option Left Picture
* @value leftMessagePicture
* @option Center Picture
* @value centerMessagePicture
* @option Right Picture
* @value rightMessagePicture
*
* @arg animationId
* @text Animation
* @desc The animation to be shown.
* @type animation
* @default 1
*
* @arg mirror
* @text Animation Mirror
* @desc Inverts the animation horizontally.
* @type boolean
* @default false
*
*/
/*~struct~rgbg:
*
* @param red
* @text Red
* @desc The value of red.
* @type number
* @max 255
* @min -255
*
* @param green
* @text Green
* @desc The value of green.
* @type number
* @max 255
* @min -255
*
* @param blue
* @text Blue
* @desc The value of blue.
* @type number
* @max 255
* @min -255
*
* @param gray
* @text Gray
* @desc The value of gray.
* @type number
* @max 255
* @min 0
*
*/
/*:ja
* @target MZ
* @plugindesc 会話時に自動的に立ち絵を表示するプラグインです。
* @author nz_prism
* @base ActorPictures
* @url https://github.com/nz-prism/RPG-Maker-MZ/blob/master/ActorPictures/js/plugins/PictureMessage.js
*
* @help PictureMessage.js
* ver 1.4.0
*
* [バージョン履歴]
* 2021/07/03 1.0.0 リリース
* 2021/07/05 1.1.0 アニメーションへの対応、位置ごとの反転設定の追加
* 2021/07/06 1.1.1 イージングの方向が立ち絵反転設定を反映していなかった不具合
* を修正
* 2021/07/10 1.2.0 多数のプラグインコマンドを追加、立ち絵状態をセーブ可能に
* 2021/07/12 1.3.0 戦闘中コマンド入力時立ち絵表示機能を追加
* 2021/07/13 1.3.1 タイムプログレスバトル時の立ち絵表示の不具合を修正
* 2021/12/28 1.3.2 フキダシアイコンの位置がおかしかったのを修正
* 2022/02/14 1.3.3 フキダシアイコンのデフォルト表示位置を変更
* 2022/03/22 1.3.4 微バグを修正
* 2022/05/20 1.4.0 イージング方向を指定するためのプラグインパラメータを追加
*
* このプラグインを使用すると、会話時に自動的に立ち絵が表示されるようになりま
* す。ActorPictures.jsが前提プラグインとなります。使用にあたっては、まず
* はActorPictures.jsにて各アクターに立ち絵を設定してください。
*
* 立ち絵を表示させるには、メッセージの表示コマンドの「名前」欄に専用の制御文
* 字「\AP[n位置]」と入力してください。「n」はアクターIDを表し、そのアク
* ターに設定されている立ち絵が表示されます。「位置」は表示位置を表し、立ち絵
* の表示位置の指定となります。左・右・中央などの文言にて指定できます。詳細は
* 下記を参照してください。例えばアクターID 1番のアクターの立ち絵を右側に表
* 示させたい場合、\AP[1右]と入力してください。実際のゲーム中の名前ウィンド
* ウでは、この制御文字はそのアクターの名前に置き換えられます。
*
* 立ち絵表示時は顔グラフィックが表示されません。そのため顔グラフィックは通常
* は指定する必要がありませんが、立ち絵インデックスを変更したい場合に使用しま
* す。顔グラフィックのインデックスによってアクターの立ち絵インデックスが変更
* されます。これはActorPictures.jsのプラグインコマンド「立ち絵インデック
* スの設定」とまったく同じ効果です。詳細はActorPictures.jsの説明を参考に
* してください。なおここで使用する顔グラフィックは実際には表示されませんの
* で、アクターごとに専用の画像を用意する必要はありません。
* 表示される立ち絵はアクターの状態に応じてステート差分、ダメージ差分、立ち絵
* インデックス(表情や衣装差分等)を反映します。
*
* 立ち絵の表示座標はプラグインパラメータにて設定できます。X座標は、立ち絵のX
* 座標の中心位置を参照することに注意してください。基本的には画像の幅の半分の
* 値が中心位置になりますが、ActorPictures.jsのプラグインパラメータ「立ち
* 絵位置調整」にて中心X座標を指定している場合、それが中心位置として使用され
* ます。
* プラグインパラメータ「立ち絵Y座標原点を下にする」をオンにすると、画像の下
* 端がY座標の原点として使用されるようになります。これは、立ち絵素材のスケー
* ルが統一されている場合に便利な設定です。そうでない場合はオフにしてくださ
* い。オフにした場合、Y座標はActorPictures.jsのプラグインパラメータ「立ち
* 絵位置調整」の「Y座標オフセット」にて設定した値の分だけマイナスされます。
*
* 会話終了時、立ち絵は自動的に消えることはありません。イベントが終了しても残
* り続けます。立ち絵を非表示にするには、プラグインコマンド「立ち絵退場」を使
* 用してください。個別に退場させることも、全て一括で退場させることも可能です。
*
* 立ち絵のアニメーションにも対応しています。ActorPictures.jsのプラグイン
* パラメータ「立ち絵アニメ設定」にて設定した立ち絵は、表示されている間アニメ
* するようになります。
*
* プラグインパラメータ「戦闘コマンド入力時立ち絵表示」をオンにすると、戦闘中
* アクターコマンド入力時にそのアクターの立ち絵が表示されるようになります。同
* じ位置に立ち絵が表示されていた場合、その立ち絵と入れ替わります。
*
*
* ■ 名前欄に使用する制御文字
* \AP[n位置]
*
* 位置に使用可能な文字列(大文字と小文字の区別なし)
* 左側: L, Left, 左
* 中央: C, Center, 中
* 右側: R, Right, 右
*
*
* このプラグインはMITライセンスにてリリースされています。
* https://opensource.org/licenses/mit-license.php
*
*
* @param bottomYOrigin
* @text 立ち絵Y座標原点を下にする
* @desc オンにすると画像の下端が立ち絵のY座標原点になります。オフにすると上端が原点になります。
* @type boolean
* @default false
*
* @param defaultPictureSettings
* @text 立ち絵デフォルト設定
* @desc 各立ち絵のデフォルト設定です。
*
* @param pictureCoordinates
* @parent defaultPictureSettings
* @text 座標
* @desc 立ち絵の表示座標です。
*
* @param leftPictureX
* @parent pictureCoordinates
* @text 左立ち絵X座標
* @desc 左側に表示する立ち絵のX座標です。立ち絵の中心を原点として設定してください。
* @type number
* @default 120
* @min -100000
*
* @param leftPictureY
* @parent pictureCoordinates
* @text 左立ち絵Y座標
* @desc 左側に表示する立ち絵のY座標です。原点に注意して設定してください。
* @type number
* @default 0
* @min -100000
*
* @param centerPictureX
* @parent pictureCoordinates
* @text 中央立ち絵X座標
* @desc 中央に表示する立ち絵のX座標です。立ち絵の中心を原点として設定してください。
* @type number
* @default 408
* @min -100000
*
* @param centerPictureY
* @parent pictureCoordinates
* @text 中央立ち絵Y座標
* @desc 中央に表示する立ち絵のY座標です。原点に注意して設定してください。
* @type number
* @default 0
* @min -100000
*
* @param rightPictureX
* @parent pictureCoordinates
* @text 右立ち絵X座標
* @desc 右側に表示する立ち絵のX座標です。立ち絵の中心を原点として設定してください。
* @type number
* @default 696
* @min -100000
*
* @param rightPictureY
* @parent pictureCoordinates
* @text 右立ち絵Y座標
* @desc 右側に表示する立ち絵のY座標です。原点に注意して設定してください。
* @type number
* @default 0
* @min -100000
*
* @param pictureMirror
* @parent defaultPictureSettings
* @text 反転
* @desc 立ち絵を反転させるかどうかの設定です
*
* @param leftMirror
* @parent pictureMirror
* @text 左立ち絵反転
* @desc 左側の立ち絵を反転させるかどうかの設定です
* @default true
* @type boolean
*
* @param centerMirror
* @parent pictureMirror
* @text 中央立ち絵反転
* @desc 中央の立ち絵を反転させるかどうかの設定です
* @default false
* @type boolean
*
* @param rightMirror
* @parent pictureMirror
* @text 右立ち絵反転
* @desc 右側の立ち絵を反転させるかどうかの設定です
* @default false
* @type boolean
*
* @param easing
* @text イージング
* @desc 立ち絵の出入り時のイージングの設定です。
*
* @param easingOffset
* @parent easing
* @text イージング距離
* @desc イージングの距離です。
* @type number
* @default 64
* @min 0
*
* @param easingFrames
* @parent easing
* @text イージングフレーム数
* @desc イージングのフレーム数です。
* @type number
* @default 30
* @min 1
*
* @param easingDirections
* @parent easing
* @text イージング方向
* @desc イージングの方向です。
*
* @param easingDirectionLeft
* @parent easingDirections
* @text 左立ち絵イージング方向
* @desc 左立ち絵の出現時イージングの方向です。退場時は反対になります。
* @default 1
* @type select
* @option 左から右
* @value 1
* @option 右から左
* @value -1
*
* @param easingDirectionCenter
* @parent easingDirections
* @text 中央立ち絵イージング方向
* @desc 中央立ち絵の出現時イージングの方向です。退場時は反対になります。
* @default -1
* @type select
* @option 左から右
* @value 1
* @option 右から左
* @value -1
*
* @param easingDirectionRight
* @parent easingDirections
* @text 右立ち絵イージング方向
* @desc 右立ち絵の出現時イージングの方向です。退場時は反対になります。
* @default -1
* @type select
* @option 左から右
* @value 1
* @option 右から左
* @value -1
*
* @param deactiveToneSettings
* @text 非アクティブ話者色調設定
* @desc 話していないアクターの立ち絵にかかる色調の設定です。
*
* @param deactiveTone
* @parent deactiveToneSettings
* @text 非アクティブ話者色調
* @desc 話していないアクターの立ち絵にかかる色調です。
* @type struct<rgbg>
* @default {"red":"0","green":"0","blue":"0","gray":"128"}
*
* @param deactiveFrames
* @parent deactiveToneSettings
* @text 非アクティブ話者色調変化フレーム数
* @desc 話していないアクターの立ち絵にかかる色調変化のフレーム数です。
* @type number
* @default 15
* @min 1
*
* @param showPictureOnBattleCommand
* @text 戦闘コマンド入力時立ち絵表示
* @desc オンにすると戦闘中のアクターコマンド入力時、そのアクターの立ち絵が表示されます。
* @type boolean
* @default true
*
* @param battleCommandPicturePosition
* @parent showPictureOnBattleCommand
* @text 戦闘コマンド入力時立ち絵位置
* @desc 戦闘中のアクターコマンド入力時に表示されるアクターの立ち絵の位置です。
* @default 2
* @type select
* @option 左側
* @value 0
* @option 中央
* @value 1
* @option 右側
* @value 2
*
*
* @command clearPictures
* @text 立ち絵退場
* @desc 表示されている立ち絵をイージングしながら退場させます。
*
* @arg targetPosition
* @text 退場対象
* @desc 退場させる立ち絵です。
* @default -1
* @type select
* @option すべて
* @value -1
* @option 左側立ち絵
* @value 0
* @option 中央立ち絵
* @value 1
* @option 右側立ち絵
* @value 2
*
* @command activateAllPictures
* @text すべての立ち絵をアクティブ話者色調にする
* @desc 表示されているすべての立ち絵の色調をアクティブ状態にします。
*
* @command showPicture
* @text 立ち絵の表示
* @desc 立ち絵を表示させます。
*
* @arg position
* @text 立ち絵表示位置
* @desc 立ち絵を表示させる位置です。
* @default 0
* @type select
* @option 左側
* @value 0
* @option 中央
* @value 1
* @option 右側
* @value 2
*
* @arg actorId
* @text アクター
* @desc 立ち絵を表示させるアクターです。
* @default 1
* @type actor
*
* @arg leaveX
* @text X座標移動なし
* @desc X座標を現在の値のままにします。
* @type boolean
* @default true
*
* @arg targetX
* @parent leaveX
* @text 対象X座標
* @desc 移動先のX座標です。X座標移動なしがオフの場合に設定してください。
* @type number
* @default 0
* @min -100000
*
* @arg leaveY
* @text Y座標移動なし
* @desc Y座標を現在の値のままにします。
* @type boolean
* @default true
*
* @arg targetY
* @parent leaveY
* @text 対象Y座標
* @desc 移動先のY座標です。Y座標移動なしがオフの場合に設定してください。
* @type number
* @default 0
* @min -100000
*
* @arg scaleX
* @text 幅拡大率
* @desc 立ち絵の幅の拡大率(パーセント)です。マイナスにすると水平方向に反転します。
* @type number
* @default 100
* @min -2000
* @max 2000
*
* @arg scaleY
* @text 高さ拡大率
* @desc 立ち絵の高さの拡大率(パーセント)です。マイナスにすると垂直方向に反転します。
* @type number
* @default 100
* @min -2000
* @max 2000
*
* @arg opacity
* @text 不透明度
* @desc 変化後の不透明度です。
* @type number
* @default 255
* @min -255
* @max 255
*
* @arg blendMode
* @text 合成方法
* @desc 立ち絵の描画の合成方法です。
* @default 0
* @type select
* @option 通常
* @value 0
* @option 加算
* @value 1
* @option 乗算
* @value 2
* @option スクリーン
* @value 3
*
* @command movePicture
* @text 立ち絵の移動
* @desc 表示されている立ち絵を移動させます。
*
* @arg position
* @text 移動対象立ち絵
* @desc 移動させる立ち絵です。
* @default 0
* @type select
* @option 左側立ち絵
* @value 0
* @option 中央立ち絵
* @value 1
* @option 右側立ち絵
* @value 2
*
* @arg easingType
* @text イージングタイプ
* @desc イージングの種類です。
* @default 0
* @type select
* @option 一定速度
* @value 0
* @option ゆっくり始まる
* @value 1
* @option ゆっくり終わる
* @value 2
* @option ゆっくり始まってゆっくり終わる
* @value 3
*
* @arg leaveX
* @text X座標移動なし
* @desc X座標を現在の値のままにします。
* @type boolean
* @default false
*
* @arg targetX
* @parent leaveX
* @text 対象X座標
* @desc 移動先のX座標です。X座標移動なしがオフの場合に設定してください。
* @type number
* @default 0
* @min -100000
*
* @arg leaveY
* @text Y座標移動なし
* @desc Y座標を現在の値のままにします。
* @type boolean
* @default false
*
* @arg targetY
* @parent leaveY
* @text 対象Y座標
* @desc 移動先のY座標です。Y座標移動なしがオフの場合に設定してください。
* @type number
* @default 0
* @min -100000
*
* @arg scaleX
* @text 幅拡大率
* @desc 立ち絵の幅の拡大率(パーセント)です。マイナスにすると水平方向に反転します。
* @type number
* @default 100
* @min -2000
* @max 2000
*
* @arg scaleY
* @text 高さ拡大率
* @desc 立ち絵の高さの拡大率(パーセント)です。マイナスにすると垂直方向に反転します。
* @type number
* @default 100
* @min -2000
* @max 2000
*
* @arg opacity
* @text 不透明度
* @desc 変化後の不透明度です。
* @type number
* @default 255
* @min -255
* @max 255
*
* @arg blendMode
* @text 合成方法
* @desc 立ち絵の描画の合成方法です。
* @default 0
* @type select
* @option 通常
* @value 0
* @option 加算
* @value 1
* @option 乗算
* @value 2
* @option スクリーン
* @value 3
*
* @arg duration
* @text 時間
* @desc 持続フレームです。
* @type number
* @default 60
* @min 1
*
* @arg waitForCompletion
* @text 完了までウェイト
* @desc 効果が終わるまで待ちます。
* @type boolean
* @default false
*
* @command rotatePicture
* @text 立ち絵の回転
* @desc 立ち絵を回転させます。
*
* @arg targetMessagePicture
* @text 回転対象立ち絵
* @desc 回転させる立ち絵です。
* @default leftMessagePicture
* @type select
* @option 左側立ち絵
* @value leftMessagePicture
* @option 中央立ち絵
* @value centerMessagePicture
* @option 右側立ち絵
* @value rightMessagePicture
*
* @arg speed
* @text 速度
* @desc 立ち絵を回転させる角度の増減値です。正の値が反時計回りです。
* @default 0
* @type number
* @min -90
* @max 90
*
* @command tintPicture
* @text 立ち絵の色調変更
* @desc 立ち絵の色調を変更します。
*
* @arg targetMessagePicture
* @text 色調変更対象立ち絵
* @desc 色調変更させる立ち絵です。
* @default leftMessagePicture
* @type select
* @option 左側立ち絵
* @value leftMessagePicture
* @option 中央立ち絵
* @value centerMessagePicture
* @option 右側立ち絵
* @value rightMessagePicture
*
* @arg tone
* @text 色調
* @desc 変更する色調です。
* @type struct<rgbg>
* @default {"red":"0","green":"0","blue":"0","gray":"0"}
*
* @arg duration
* @text 時間
* @desc 色調を変更する時間です。
* @type number
* @default 60
* @min 1
* @max 999
*
* @arg waitForCompletion
* @text 完了までウェイト
* @desc 効果が終わるまで待ちます。
* @type boolean
* @default true
*
* @command initPicture
* @text 立ち絵の初期化
* @desc 立ち絵の表示設定を初期化します。
*
* @arg position
* @text 初期化対象立ち絵
* @desc 初期化させる立ち絵です。
* @default 0
* @type select
* @option 左側立ち絵
* @value 0
* @option 中央立ち絵
* @value 1
* @option 右側立ち絵
* @value 2
*
* @command showBalloon
* @text フキダシアイコンの表示
* @desc 立ち絵にフキダシアイコンを表示します。
*
* @arg targetMessagePicture
* @text 対象立ち絵
* @desc フキダシを表示する対象の立ち絵です。
* @default leftMessagePicture
* @type select
* @option 左側立ち絵
* @value leftMessagePicture
* @option 中央立ち絵
* @value centerMessagePicture
* @option 右側立ち絵
* @value rightMessagePicture
*
* @arg balloonId
* @text フキダシアイコンタイプ
* @desc 表示する吹き出しの種類です。
* @default 1
* @type select
* @option びっくり
* @value 1
* @option はてな
* @value 2
* @option 音符
* @value 3
* @option ハート
* @value 4
* @option 怒り
* @value 5
* @option 汗
* @value 6
* @option くしゃくしゃ
* @value 7
* @option 沈黙
* @value 8
* @option 電球
* @value 9
* @option Zzz
* @value 10
* @option ユーザー定義1
* @value 11
* @option ユーザー定義2
* @value 12
* @option ユーザー定義3
* @value 13
* @option ユーザー定義4
* @value 14
* @option ユーザー定義5
* @value 15
*
* @arg offsetX
* @text フキダシオフセットX
* @desc フキダシアイコンの基準X座標からのオフセット距離です。
* @type number
* @default 0
* @min -100000
*
* @arg offsetY
* @text フキダシオフセットY
* @desc フキダシアイコンの基準Y座標からのオフセット距離です。
* @type number
* @default 0
* @min -100000
*
* @arg scaleX
* @text フキダシ幅拡大率
* @desc フキダシアイコンの幅の拡大率(パーセント)です。マイナスにすると水平方向に反転します。
* @type number
* @default 200
* @min -100000
*
* @arg scaleY
* @text フキダシ高さ拡大率
* @desc フキダシアイコンの高さの拡大率(パーセント)です。マイナスにすると垂直方向に反転します。
* @type number
* @default 200
* @min -100000
*
* @command showAnimation
* @text アニメーションの表示
* @desc 立ち絵にアニメーションを表示します。
*
* @arg targetMessagePicture
* @text 対象立ち絵
* @desc アニメーションを表示する対象の立ち絵です。
* @default leftMessagePicture
* @type select
* @option 左側立ち絵
* @value leftMessagePicture
* @option 中央立ち絵
* @value centerMessagePicture
* @option 右側立ち絵
* @value rightMessagePicture
*
* @arg animationId
* @text アニメーション
* @desc 表示するアニメーションです。
* @type animation
* @default 1
*
* @arg mirror
* @text アニメーション反転
* @desc 表示するアニメーションを反転させます。
* @type boolean
* @default false
*
*/
/*~struct~rgbg:ja
*
* @param red
* @text 赤
* @desc 赤の値です。
* @type number
* @max 255
* @min -255
*
* @param green
* @text 緑
* @desc 緑の値です。
* @type number
* @max 255
* @min -255
*
* @param blue
* @text 青
* @desc 青の値です。
* @type number
* @max 255
* @min -255
*
* @param gray
* @text グレー
* @desc グレーの値です。
* @type number
* @max 255
* @min 0
*
*/
function Game_MessagePicture() {
this.initialize(...arguments);
}
Game_MessagePicture.prototype = Object.create(Game_Picture.prototype);
Game_MessagePicture.prototype.constructor = Game_MessagePicture;
(() => {
"use strict";
const PLUGIN_NAME = "PictureMessage";
const pluginParams = PluginManager.parameters(PLUGIN_NAME);
const PICTURE_MIRRORS = [
pluginParams.leftMirror === "true",
pluginParams.centerMirror === "true",
pluginParams.rightMirror === "true",
];
const BOTTOM_Y_ORIGIN = pluginParams.bottomYOrigin === "true";
const PICTURE_COORDINATES = [
{
x: Number(pluginParams.leftPictureX),
y: Number(pluginParams.leftPictureY),
},
{
x: Number(pluginParams.centerPictureX),
y: Number(pluginParams.centerPictureY),
},
{
x: Number(pluginParams.rightPictureX),
y: Number(pluginParams.rightPictureY),
},
];
const EASING_OFFSET = Number(pluginParams.easingOffset);
const EASING_FRAMES = Number(pluginParams.easingFrames);
const EASING_DIRECTIONS = [
Number(pluginParams.easingDirectionLeft),
Number(pluginParams.easingDirectionCenter),
Number(pluginParams.easingDirectionRight),
];
const DEACTIVE_TONE = Object.values(
JSON.parse(pluginParams.deactiveTone)
).map((s) => Number(s));
const DEACTIVE_FRAMES = Number(pluginParams.deactiveFrames);
const SHOW_PICTURE_ON_BATTLE_COMMAND =
pluginParams.showPictureOnBattleCommand === "true";
const BATTLE_COMMAND_PICTURE_POSITION = Number(
pluginParams.battleCommandPicturePosition
);
PluginManager.registerCommand(PLUGIN_NAME, "clearPictures", (args) => {
$gameScreen.clearSpeaker(Number(args.targetPosition));
});
PluginManager.registerCommand(PLUGIN_NAME, "activateAllPictures", (args) => {
$gameScreen.clearSpeakerIndex();
});
PluginManager.registerCommand(PLUGIN_NAME, "showPicture", function (args) {
const position = Number(args.position);
const picture = $gameScreen.messagePicture(position);
const actorId = Number(args.actorId);
const x = args.leaveX === "true" ? picture.x() : Number(args.targetX);
const y = args.leaveY === "true" ? picture.y() : Number(args.targetY);
let scaleX = Number(args.scaleX);
if (PICTURE_MIRRORS[position]) scaleX *= -1;
const scaleY = Number(args.scaleY);
const opacity = Number(args.opacity);
const blend = Number(args.blendMode);
$gameScreen.setSpeaker(position, actorId);
picture.movePosition(0, x, y, scaleX, scaleY, opacity, blend, 1, 0);
});
PluginManager.registerCommand(PLUGIN_NAME, "movePicture", function (args) {
const position = Number(args.position);
const picture = $gameScreen.messagePicture(position);
const x = args.leaveX === "true" ? picture.x() : Number(args.targetX);
const y = args.leaveY === "true" ? picture.y() : Number(args.targetY);
let scaleX = Number(args.scaleX);
if (PICTURE_MIRRORS[position]) scaleX *= -1;
const scaleY = Number(args.scaleY);
const opacity = Number(args.opacity);
const blend = Number(args.blendMode);
const duration = Number(args.duration);
picture.movePosition(
0,
x,
y,
scaleX,
scaleY,
opacity,
blend,
duration,
Number(args.easingType)
);
if (args.waitForCompletion === "true") this.wait(duration);
});
PluginManager.registerCommand(PLUGIN_NAME, "rotatePicture", (args) => {
$gameScreen.rotatePicture(args.targetMessagePicture, Number(args.speed));
});
PluginManager.registerCommand(PLUGIN_NAME, "tintPicture", function (args) {
const tone = Object.values(JSON.parse(args.tone)).map((s) => Number(s));
const duration = Number(args.duration);
$gameScreen.tintPicture(args.targetMessagePicture, tone, duration);
if (args.waitForCompletion === "true") this.wait(duration);
});
PluginManager.registerCommand(PLUGIN_NAME, "initPicture", (args) => {
const picture = $gameScreen.messagePicture(Number(args.position));
picture.applyDefaultBasic();
picture.initRotation();
});
PluginManager.registerCommand(PLUGIN_NAME, "showBalloon", (args) => {
const offsetX = Number(args.offsetX);
const offsetY = Number(args.offsetY);
const scaleX = Number(args.scaleX) / 100;
const scaleY = Number(args.scaleY) / 100;
$gameTemp.requestBalloon(
args.targetMessagePicture,
Number(args.balloonId),
offsetX,
offsetY,
scaleX,
scaleY
);
});
PluginManager.registerCommand(PLUGIN_NAME, "showAnimation", (args) => {
$gameTemp.requestAnimation(
[args.targetMessagePicture],
Number(args.animationId),
args.mirror === "true"
);
});
const _BattleManager_startActorInput = BattleManager.startActorInput;
BattleManager.startActorInput = function () {
_BattleManager_startActorInput.call(this);
if (SHOW_PICTURE_ON_BATTLE_COMMAND && this._currentActor) {
$gameScreen.setSpeaker(
BATTLE_COMMAND_PICTURE_POSITION,
this._currentActor.actorId()
);
}
};
const _BattleManager_finishActorInput = BattleManager.finishActorInput;
BattleManager.finishActorInput = function () {
_BattleManager_finishActorInput.call(this);
if (SHOW_PICTURE_ON_BATTLE_COMMAND)
$gameScreen.clearSpeaker(BATTLE_COMMAND_PICTURE_POSITION);
};
Game_Temp.prototype.requestBalloon = function (
target,
balloonId,
offsetX,
offsetY,
scaleX,
scaleY
) {
const request = {
target: target,
balloonId: balloonId,
offsetX: offsetX,
offsetY: offsetY,
scaleX: scaleX,
scaleY: scaleY,
};
this._balloonQueue.push(request);
if (target.startBalloon) target.startBalloon();
};
const _Game_Screen_prototype_clear = Game_Screen.prototype.clear;
Game_Screen.prototype.clear = function () {
_Game_Screen_prototype_clear.call(this);
this.clearMessagePictureSettings();
};
Game_Screen.prototype.clearMessagePictureSettings = function () {
this._messagePictures = [];
for (let i = 0; i < 3; i++) {
this._messagePictures[i] = new Game_MessagePicture(i);
}
this._speakers = [];
this._speakerIndex = -1;
};
Game_Screen.prototype.messagePicture = function (position) {
return this._messagePictures[position];
};
Game_Screen.prototype.speaker = function (position) {
return $gameActors.actor(this._speakers[position]);
};
Game_Screen.prototype.clearSpeakerIndex = function () {
this._speakerIndex = -1;
};
Game_Screen.prototype.speakerIndex = function () {
return this._speakerIndex;
};
Game_Screen.prototype.clearSpeaker = function (position = -1) {
if (position === -1) {
this._speakers = [];
} else {
this._speakers[position] = null;
}
};
Game_Screen.prototype.setSpeaker = function (position, actorId) {
this._speakers[position] = actorId;
this._speakerIndex = position;
};
const _Game_Screen_prototype_update = Game_Screen.prototype.update;
Game_Screen.prototype.update = function () {
_Game_Screen_prototype_update.call(this);
this.updateMessagePictures();
};
Game_Screen.prototype.updateMessagePictures = function () {
for (const picture of this._messagePictures) {
if (picture) picture.update();
}
};
const _Game_Screen_prototype_rotatePicture =
Game_Screen.prototype.rotatePicture;
Game_Screen.prototype.rotatePicture = function (pictureId, speed) {
switch (pictureId) {
case "leftMessagePicture":
this._messagePictures[0].rotate(speed);
break;
case "centerMessagePicture":
this._messagePictures[1].rotate(speed);
break;
case "rightMessagePicture":
this._messagePictures[2].rotate(speed);
break;
default:
return _Game_Screen_prototype_rotatePicture.apply(this, arguments);
}
};
const _Game_Screen_prototype_tintPicture = Game_Screen.prototype.tintPicture;
Game_Screen.prototype.tintPicture = function (pictureId, tone, duration) {
switch (pictureId) {
case "leftMessagePicture":
this._messagePictures[0].tint(tone, duration);
break;
case "centerMessagePicture":
this._messagePictures[1].tint(tone, duration);
break;
case "rightMessagePicture":
this._messagePictures[2].tint(tone, duration);
break;
default:
return _Game_Screen_prototype_tintPicture.apply(this, arguments);
}
};
const _Game_Message_prototype_setSpeakerName =
Game_Message.prototype.setSpeakerName;
Game_Message.prototype.setSpeakerName = function (speakerName) {
const reg = /\\AP\[(\d+)\s*(.+?)\]/;
const ary = reg.exec(speakerName);
let actorId;
let position = -1;
if (ary) {
actorId = Number(ary[1]);
switch (ary[2].toLowerCase()) {
case "l":
case "left":
case "左":
position = 0;
break;
case "r":
case "right":
case "右":
position = 2;
break;
default:
position = 1;
break;
}
}
if (actorId && position >= 0) {
const actor = $gameActors.actor(actorId);
let name = "";
if (actor) {
if (this._faceName) {
actor.setPictureIndex(this._faceIndex);
this._faceName = "";
}
$gameScreen.setSpeaker(position, actorId);
name = actor.name();
}
this._speakerName = speakerName.replace(reg, name);
} else {
_Game_Message_prototype_setSpeakerName.call(this, speakerName);
}
};
Game_MessagePicture.prototype.initialize = function (position) {
Game_Picture.prototype.initialize.call(this);
this.initPrimaryMembers(position);
this.initAnimation();
this.applyDefaultBasic();
};
Game_MessagePicture.prototype.initPrimaryMembers = function (position) {
this._position = position;
this._width = 1;
this._height = 1;
this._offsetY = 0;
this._changingName = "";
};
Game_MessagePicture.prototype.applyDefaultBasic = function () {
this._x = PICTURE_COORDINATES[this._position].x;
this._y = PICTURE_COORDINATES[this._position].y;
this._z = 5;
if (!BOTTOM_Y_ORIGIN) this._y -= this._offsetY;
this._scaleX = PICTURE_MIRRORS[this._position] ? -100 : 100;
this._scaleY = 100;
this._opacity = 255;
this._blendMode = 0;
this._tone = [0, 0, 0, 0];
this._originalX = this._x;
this._originalY = this._y;
this._originalOpacity = this._opacity;
this._originalTone = [0, 0, 0, 0];
};
Game_MessagePicture.prototype.initAnimation = function () {
this._hasAnimation = false;
this._pattern = 0;
this._animationCount = 0;
this._animationRepeatIndex = 0;
this._animationNumPattern = 1;
this._animationPatternCounts = [0];
this._animationNumRepeat = 1;
this._animationRepeatDurations = [0];
};
Game_MessagePicture.prototype.z = function () {
return this._z;
};
Game_MessagePicture.prototype.offsetY = function () {
return this._offsetY;
};
Game_MessagePicture.prototype.hasAnimation = function () {
return this._hasAnimation;
};
Game_MessagePicture.prototype.pattern = function () {
return this._pattern;
};
Game_MessagePicture.prototype.animationNumPattern = function () {
return this._animationNumPattern;
};
Game_MessagePicture.prototype.isSpeaking = function () {
return [this._position, -1].includes($gameScreen.speakerIndex());
};
Game_MessagePicture.prototype.setName = function (name) {
const offsetY = ImageManager.offsetY(name);
if (!BOTTOM_Y_ORIGIN) {
this._y += this._offsetY;
this._y -= offsetY;
this._originalY = this._y;
}
this._name = name;
this._width = ImageManager.pictureWidth(name);
this._height = ImageManager.pictureHeight(name);
this._offsetY = offsetY;
this.setupAnimation(name);
};
Game_MessagePicture.prototype.update = function () {
Game_Picture.prototype.update.call(this);
if (!this.isMoving()) {
this.updateSpeaker();
this.updateAnimation();
this.updateSpeaking();
}
};
Game_MessagePicture.prototype.updateSpeaker = function () {
const lastActorId = this._actorId;
const speaker = $gameScreen.speaker(this._position);
const speakerId = speaker ? speaker.actorId() : 0;
const pictureName = speaker ? speaker.pictureName() : "";
let actorChanged;
let easingCondition;
if (this._actorId !== speakerId) {
this._actorId = speakerId;
actorChanged = true;
} else {
actorChanged = false;
}
if (this._changingName) {
this.setName(this._changingName);
this._changingName = "";
easingCondition = 1;
} else {
if (this._name !== pictureName) {
if (actorChanged && lastActorId) {
this._changingName = pictureName;
} else {
this.setName(pictureName);
}
}
if (lastActorId) {
if (speaker) {
easingCondition = actorChanged ? -1 : 0;
} else {
easingCondition = -1;
}
} else {
if (speaker) {
easingCondition = 1;
} else {
easingCondition = 0;
}
}
}
switch (easingCondition) {
case 1:
this._x = this.easingOffsetX();
this._y = this.easingOffsetY();
this._opacity = 0;
this.appearWithEase(EASING_FRAMES);
break;
case -1:
this._originalX = this._x;
this._originalY = this._y;
this._originalOpacity = this._opacity;
this.disappearWithEase(EASING_FRAMES);
break;
}
};
Game_MessagePicture.prototype.updateSpeaking = function () {
const isSpeaking = this.isSpeaking();
if (this._isSpeaking !== isSpeaking) {
this._isSpeaking = isSpeaking;
if (isSpeaking) {
this._z = 6;
this.tint(this._originalTone, DEACTIVE_FRAMES);
} else {
this._z = 5;
this._originalTone = this._tone.clone();
this.tint(DEACTIVE_TONE, DEACTIVE_FRAMES);
}
}
};
Game_MessagePicture.prototype.updateAnimation = function () {
if (this._hasAnimation) {
this._animationCount += this._animationPatternCounts[this._pattern];
if (
this._animationCount >=
this._animationRepeatDurations[this._animationRepeatIndex]
) {
this._pattern = (this._pattern + 1) % this._animationNumPattern;
this._animationCount = 0;
if (this._pattern === 0) {
this._animationRepeatIndex++;
if (this._animationRepeatIndex >= this._animationNumRepeat)
this._animationRepeatIndex = 0;
}
}
}
};
Game_MessagePicture.prototype.setupAnimation = function (pictureName) {
if (ImageManager.hasPictureAnimation(pictureName)) {
this._hasAnimation = true;
this._pattern = 0;
this._animationCount = 0;
this._animationRepeatIndex = 0;
this._animationNumPattern = ImageManager.animationNumPattern(pictureName);
this._animationPatternCounts =
ImageManager.animationPatternCounts(pictureName);
this._animationNumRepeat = ImageManager.animationNumRepeat(pictureName);
this._animationRepeatDurations =
ImageManager.animationRepeatDurations(pictureName);
} else {
this.initAnimation();
}
};
Game_MessagePicture.prototype.movePosition = function (
origin,
x,
y,
scaleX,
scaleY,
opacity,
blendMode,
duration,
easingType
) {
this._originalX = x;
this._originalY = y;
this._originalOpacity = opacity;
this.move(
origin,
x,
y,
scaleX,
scaleY,
opacity,
blendMode,
duration,
easingType
);
};
Game_MessagePicture.prototype.isMoving = function () {
return this._duration > 0;
};
Game_MessagePicture.prototype.appearWithEase = function (duration = 30) {
this.move(
0,
this._originalX,
this._originalY,
this._scaleX,
this._scaleY,
this._originalOpacity,
this._blendMode,
duration,
2
);
};
Game_MessagePicture.prototype.disappearWithEase = function (duration = 30) {
this.move(
0,
this.easingOffsetX(),
this.easingOffsetY(),
this._scaleX,
this._scaleY,
0,
this._blendMode,
duration,
1
);
};
Game_MessagePicture.prototype.easingOffsetX = function () {
return this._x - EASING_DIRECTIONS[this._position] * EASING_OFFSET;
};
Game_MessagePicture.prototype.easingOffsetY = function () {
return this._y;
};
Game_MessagePicture.prototype.balloonX = function (mirror = false) {
return mirror ? this._x - this._width / 4 : this._x + this._width / 4;
};
Game_MessagePicture.prototype.balloonY = function () {
const height = this._height;
const offsetY = this._offsetY;
const y = BOTTOM_Y_ORIGIN ? this._y - height : this._y + offsetY;
return y + (height - this._offsetY) / 7;
};
const _Sprite_Balloon_prototype_setup = Sprite_Balloon.prototype.setup;
Sprite_Balloon.prototype.setup = function (
targetSprite,
balloonId,
offsetX,
offsetY,
scaleX,
scaleY
) {
_Sprite_Balloon_prototype_setup.call(this, targetSprite, balloonId);
this._offsetX = offsetX || 0;
this._offsetY = offsetY || 0;
this.scale.x = scaleX || 1;
this.scale.y = scaleY || 1;
this.z = 7;
};
const _Sprite_Balloon_prototype_updatePosition =
Sprite_Balloon.prototype.updatePosition;
Sprite_Balloon.prototype.updatePosition = function () {
if (this._target.balloonX && this._target.balloonY) {
if (this.scale.x < 0) {
this.x = this._target.balloonX(true) - this._offsetX;
} else {
this.x = this._target.balloonX(false) + this._offsetX;
}
this.y = this._target.balloonY() + this._offsetY;
} else {
_Sprite_Balloon_prototype_updatePosition.call(this);
}
};
const _Sprite_Animation_prototype_targetSpritePosition =
Sprite_Animation.prototype.targetSpritePosition;
Sprite_Animation.prototype.targetSpritePosition = function (sprite) {
if (sprite instanceof Sprite_MessagePicture) {
const point = new Point(0, sprite.offsetY() + sprite.height / 4);
if (this._animation.alignBottom) point.y = Graphics.height;
sprite.updateTransform();
return sprite.worldTransform.apply(point);
} else {
return _Sprite_Animation_prototype_targetSpritePosition.call(
this,
sprite
);
}
};
function Sprite_MessagePicture() {
this.initialize(...arguments);
}
Sprite_MessagePicture.prototype = Object.create(Sprite_Picture.prototype);
Sprite_MessagePicture.prototype.constructor = Sprite_MessagePicture;
Sprite_MessagePicture.prototype.initialize = function (position) {
Sprite_Clickable.prototype.initialize.call(this);
this._position = position;
this._pictureName = "";
this.update();
};
Sprite_MessagePicture.prototype.picture = function () {
return $gameScreen.messagePicture(this._position);
};
Sprite_MessagePicture.prototype.offsetY = function () {
return this.picture().offsetY();
};
Sprite_MessagePicture.prototype.balloonX = function (mirror = false) {
return this.picture().balloonX(mirror);
};
Sprite_MessagePicture.prototype.balloonY = function () {
return this.picture().balloonY();
};
Sprite_MessagePicture.prototype.update = function () {
Sprite_Clickable.prototype.update.call(this);
this.updateBitmap();
if (this.visible) {
this.updateFrame();
this.updateOrigin();
this.updatePosition();
this.updateScale();
this.updateTone();
this.updateOther();
}
};
Sprite_MessagePicture.prototype.updateFrame = function () {
const bitmap = this.bitmap;
const picture = this.picture();
if (bitmap && picture) {
const pw = bitmap.width / picture.animationNumPattern();
this.setFrame(pw * picture.pattern(), 0, pw, bitmap.height);
}
};
Sprite_MessagePicture.prototype.updateOrigin = function () {
const bitmap = this.bitmap;
if (bitmap) {
const width = bitmap.width;
const centerX = ImageManager.centerX(this._pictureName);
const cx = centerX > 0 ? centerX : width / 2;
this.anchor.x = cx / width;
this.anchor.y = BOTTOM_Y_ORIGIN ? 1 : 0;
}
};
Sprite_MessagePicture.prototype.updatePosition = function () {
const picture = this.picture();
this.x = Math.round(picture.x());
this.y = Math.round(picture.y());
this.z = Math.round(picture.z());
};
Spriteset_Base.prototype.createMessagePictureSprites = function () {
this._messagePictureSprites = [];
for (let i = 0; i < 3; i++) {
const sprite = new Sprite_MessagePicture(i);
this._messagePictureSprites[i] = sprite;
this._tilemap.addChild(sprite);
}
};
const _Spriteset_Map_prototype_createLowerLayer =
Spriteset_Map.prototype.createLowerLayer;
Spriteset_Map.prototype.createLowerLayer = function () {
_Spriteset_Map_prototype_createLowerLayer.call(this);
this.createMessagePictureSprites();
};
Spriteset_Map.prototype.createBalloon = function (request) {
const targetSprite = this.findTargetSprite(request.target);
if (targetSprite) {
const sprite = new Sprite_Balloon();
sprite.targetObject = request.target;
sprite.setup(
targetSprite,
request.balloonId,
request.offsetX,
request.offsetY,
request.scaleX,
request.scaleY
);
this._effectsContainer.addChild(sprite);
this._balloonSprites.push(sprite);
}
};
const _Spriteset_Map_prototype_findTargetSprite =
Spriteset_Map.prototype.findTargetSprite;
Spriteset_Map.prototype.findTargetSprite = function (target) {
switch (target) {
case "leftMessagePicture":
return this._messagePictureSprites[0];
case "centerMessagePicture":
return this._messagePictureSprites[1];
case "rightMessagePicture":
return this._messagePictureSprites[2];
default:
return _Spriteset_Map_prototype_findTargetSprite.call(this, target);
}
};
const _Spriteset_Battle_prototype_initialize =
Spriteset_Battle.prototype.initialize;
Spriteset_Battle.prototype.initialize = function () {
_Spriteset_Battle_prototype_initialize.call(this);
this._balloonSprites = [];
};
const _Spriteset_Battle_prototype_createLowerLayer =
Spriteset_Battle.prototype.createLowerLayer;
Spriteset_Battle.prototype.createLowerLayer = function () {
_Spriteset_Battle_prototype_createLowerLayer.call(this);
this.createTilemap();
this.createMessagePictureSprites();
};
Spriteset_Battle.prototype.createTilemap = function () {
const tilemap = new Tilemap();
this._battleField.addChild(tilemap);
this._tilemap = tilemap;
};
Spriteset_Battle.prototype.destroy = function (options) {
this.removeAllBalloons();
Spriteset_Base.prototype.destroy.call(this, options);
};
const _Spriteset_Battle_prototype_findTargetSprite =
Spriteset_Battle.prototype.findTargetSprite;
Spriteset_Battle.prototype.findTargetSprite = function (target) {
switch (target) {
case "leftMessagePicture":
return this._messagePictureSprites[0];
case "centerMessagePicture":
return this._messagePictureSprites[1];
case "rightMessagePicture":
return this._messagePictureSprites[2];
default:
return _Spriteset_Battle_prototype_findTargetSprite.call(this, target);
}
};
const _Spriteset_Battle_prototype_update = Spriteset_Battle.prototype.update;
Spriteset_Battle.prototype.update = function () {
_Spriteset_Battle_prototype_update.call(this);
this.updateBalloons();
};
Spriteset_Battle.prototype.updateBalloons = function () {
Spriteset_Map.prototype.updateBalloons.call(this);
};
Spriteset_Battle.prototype.processBalloonRequests = function () {
Spriteset_Map.prototype.processBalloonRequests.call(this);
};
Spriteset_Battle.prototype.createBalloon = function (request) {
Spriteset_Map.prototype.createBalloon.call(this, request);
};
Spriteset_Battle.prototype.removeBalloon = function (sprite) {
Spriteset_Map.prototype.removeBalloon.call(this, sprite);
};
Spriteset_Battle.prototype.removeAllBalloons = function () {
Spriteset_Map.prototype.removeAllBalloons.call(this);
};
})();