Original Source
- Original title: VXAce Hammy - FF9 Dialog System
- Original author: buddysievers
- Original date: November 18, 2025
- Source thread: https://forums.rpgmakerweb.com/threads/hammy-ff9-dialog-system.181068/
- Source forum path: Game Development Engines > Ruby Game System (RGSS) Scripts > RGSS3 Scripts (RMVX Ace)
Summary
Hammy - FF9 Dialog System v1.05 Authentic Final Fantasy IX speech bubble dialog with message chaining, fade effects, and bubble positioning Introduction This script provides an authentic Final Fantasy IX dialog system for RPG Maker VX Ace. It displays message windows as speech bubbles above or below characters, perfect for character dialogue, interactive conversations, and event-driven cutscenes.
Archived First Post
Authentic Final Fantasy IX speech bubble dialog with message chaining, fade effects, and bubble positioning
Introduction
This script provides an authentic Final Fantasy IX dialog system for RPG Maker VX Ace. It displays message windows as speech bubbles above or below characters, perfect for character dialogue, interactive conversations, and event-driven cutscenes.
The system supports escape codes for bubble positioning and arrow direction, automatic bubble placement above or below characters, message chaining for continuous dialogue, character fade-in effects, configurable text display speed and effect duration, compact spacing for empty lines, and integration with the Hammy FF9 Windowskin System for colored bubble arrows.
AI Disclaimer: Generative AI was used to refine the documentation and presentation of this script, as I am not a native English speaker. Additionally, AI was used for naming conventions in some places and for general beautification of the script.
Features
Core Dialog Features
- Speech bubble-style message windows above or below characters with arrow sprites
- Escape code-based bubble positioning with custom target, arrow direction, and position control
- Automatic bubble positioning based on available screen space
- Message chaining support for continuous dialogue sequences
- Character fade-in effects for text display
- Configurable text display speed and effect duration
- Compact spacing mode for empty lines (reduced line height)
Customization System
- Configurable dialog window display settings (line height, padding, compact spacing)
- Configurable bubble positioning offsets and arrow sprites
- Support for colored bubble arrow sprites via Hammy FF9 Windowskin System
- Enable/disable fade-in effects and adjust settings via script calls
Technical Features
- Automatic bubble positioning with boundary corrections
- Narrow window centering on bubble sprite when width < narrow_width
- Dynamic window sizing based on text content
- Pop-style messages require :C to advance, while default windows still support :B
- Pop message pause sprite automatically hidden when using bubble dialog
- RGSS3-compliant escape code processing and rendering
Screenshots
Configuration
Dialog Window Display Settings
LINE_HEIGHT
Height of each text line in pixels for dialog windows. Uses default font size by default, can be set to any integer value.
- Valid values: Any integer value
- Default: Font.default_size
Example
LINE_HEIGHT = 20
STANDARD_PADDING
Window padding size in pixels for dialog windows. Controls the internal spacing between window borders and content.
- Valid values: Any integer value
- Default: 12
Example
STANDARD_PADDING = 12
COMPACT_SPACING
Enable compact spacing for empty text lines. When true, empty text lines use reduced height for separation.
- Valid values: true or false
- Default: true
Example
COMPACT_SPACING = true
COMPACT_LINE_HEIGHT
Empty line height when compact spacing is enabled. Pixel height used for empty text lines when COMPACT_SPACING is true.
- Valid values: Any integer value
- Default: 6
Example
COMPACT_LINE_HEIGHT = 6
Message Effects Display Settings
FADE_DURATION
Default effect duration in frames for character fade-in. Controls how many frames it takes for characters to fully fade in.
- Valid values: Any integer value
- Default: 6
Example
FADE_DURATION = 6
FADE_SPEED
Default text display speed in characters per second. Controls how fast text characters appear on screen.
- Valid values: Any integer value
- Default: 30
Example
FADE_SPEED = 30
Bubble Positioning Settings
BUBBLE_POSITION
Hash containing all bubble positioning configuration.
- y_offset_below: Vertical offset for windows positioned below a target. Distance in pixels from character screen_y to window top when below.
- y_offset_above: Vertical gap for windows positioned above a target. Distance in pixels from the top of the target sprite to the bottom of the window. The sprite height is resolved dynamically.
- tag_y_offset_below: Vertical offset when arrow is below window. Distance in pixels from window bottom to arrow sprite position.
- tag_y_offset_above: Vertical offset when arrow is above window. Distance in pixels from window top to arrow sprite position.
- narrow_width: Threshold width for narrow window centering mode. Narrow windows center on arrow sprite rather than character.
- Valid values: Hash with defined symbol keys and integer values
- Default: { y_offset_below: 16, y_offset_above: 16, ... }
Example
BUBBLE_POSITION = {
y_offset_below: 16,
y_offset_above: 16,
tag_y_offset_below: -2,
tag_y_offset_above: -2,
narrow_width: 64
}
Default Bubble Arrow Sprite
BUBBLE_SPRITESHEET
Sprite filename for bubble arrow graphics.
Sprite Sheet Layout (64x64 pixels):
- (0-31, 0-31): up_left
- (32-63, 0-31): up_right
- (0-31, 32-63): down_left
- (32-63, 32-63): down_right
- Valid values: String containing filename without extension
- Default: 'BubbleTag'
Example
BUBBLE_SPRITESHEET = 'BubbleTag'
Colored Bubble Arrow Sprites
BUBBLE_ARROWS_COLORED
Hash mapping color themes to sprite filenames. Each sprite sheet uses the same 2x2 grid layout as the default.
- grey: Grey-themed arrow sprite sheet for grey windowskins.
- blue: Blue-themed arrow sprite sheet for blue windowskins.
- Valid values: Hash with Symbol keys and String values
- Default: { grey: 'BubbleTag_Grey', blue: 'BubbleTag_Blue' }
Example
BUBBLE_ARROWS_COLORED = {
grey: 'BubbleTag_Grey',
blue: 'BubbleTag_Blue'
}
Shadow Spritesheet
SHADOW_SPRITESHEET
Shadow sprite filename for bubble tag arrows. Shadow sprite sheet uses the same layout as the main bubble tag.
- Valid values: String containing filename without extension
- Default: 'BubbleTag_Shadow'
Example
SHADOW_SPRITESHEET = 'BubbleTag_Shadow'
Bubble Tag Shadow Settings
SHADOW_POSITION
Hash containing bubble tag shadow configuration.
- shadow_offset_x: Horizontal offset for shadow sprite in pixels. Positive values move shadow to the right.
- shadow_offset_y: Vertical offset for shadow sprite in pixels. Positive values move shadow downward.
- shadow_opacity: Opacity value for shadow sprite (0-255). Lower values create more transparent shadows.
- Valid values: Hash with defined symbol keys and integer values
- Default: { shadow_offset_x: 2, shadow_offset_y: 2, ... }
Example
SHADOW_POSITION = {
shadow_offset_x: 2,
shadow_offset_y: 2,
shadow_opacity: 128
}
Script Calls
Message Effects Configuration
$game_system.message_speed = n
Sets the default text display speed to n characters per second. Minimum value is 0 (no maximum limit).
$game_system.message_duration = n
Sets the default effect duration to n frames for character fade-in. Minimum value is 0 (no maximum limit).
$game_system.message_fading = true
Enables fade-in effects for text display. Characters fade in with effect (default).
$game_system.message_fading = false
Disables fade-in effects for text display. Uses standard RGSS3 letter-by-letter drawing without effects.
Examples
# Set text speed to 60 characters per second
$game_system.message_speed = 60
# Set effect duration to 12 frames
$game_system.message_duration = 12
# Disable fade-in effects
$game_system.message_fading = false
Escape Codes
This section explains proper escape code usage and bubble positioning for optimal dialog display results.
Insert escape codes directly into your message window text to control bubble positioning, text timing, database references, and special inline rendering. Escape codes can be placed anywhere in the message text and are processed before display.
Positioning Escape Code Usage
Insert these codes to control who the bubble targets and how it is positioned around the character.
- \bm[x] Set bubble target character
Sets the message window to position as a bubble above or below character x.- x = 0: Player character
- x > 0: Map event with that ID (1, 2, 3, ...)
- x < 0: Follower (party member) (-1, -2, -3, ...)
- \bmc[x] Set bubble target character (chained mode)
Same as \bm[x] but enables message chaining for continuous dialogue. Multiple consecutive "Show Text" commands will be merged into a single message window when this code is present.
This tag is intended to be used in the first message of a chained sequence. - \bmd[d] Force bubble arrow direction
Forces the arrow sprite direction. Must be used after \bm[x] or \bmc[x].- d = l or L: Left-pointing arrow
- d = r or R: Right-pointing arrow
- \bmp[p] Force bubble position
Forces the window position relative to the character. Must be used after \bm[x] or \bmc[x].- p = a or A: Above character
- p = b or B: Below character
Timing Escape Code Usage
Insert these codes to control text speed, effect duration, and pauses during message display.
- \sp[n] Change text display speed
Changes text display speed to n characters per second.- Setting n = 0 displays text instantly
- Resets to default when the message window closes
- \ed[n] Change effect duration
Changes effect duration to n frames for character fade-in.- Resets to default when the message window closes
- \a Disable instant text display
Disables instant text display with the confirm key, preventing the player from skipping directly to fully drawn text. - \. Wait 15 frames (quarter-second pause)
Adds a brief pause in text display. - \| Wait 60 frames (one-second pause)
Adds a longer pause in text display. - \w[n] Wait n frames
Waits for n frames during text display (1/60th of a second per frame).
Useful for custom-timed pauses inside a single message.
Database Escape Code Usage
Insert these codes to reference database entries directly in your text. Available in all windows that render text.
- \nc[n] Insert class name
Inserts the name of Class ID n from the database. - \ni[n] Insert item name
Inserts the name of Item ID n from the database. - \nw[n] Insert weapon name
Inserts the name of Weapon ID n from the database. - \na[n] Insert armor name
Inserts the name of Armor ID n from the database. - \ns[n] Insert skill name
Inserts the name of Skill ID n from the database. - \nt[n] Insert state name
Inserts the name of State ID n from the database. - \ii[n] Insert item icon and name
Inserts the icon and name for Item ID n. - \iw[n] Insert weapon icon and name
Inserts the icon and name for Weapon ID n. - \ia[n] Insert armor icon and name
Inserts the icon and name for Armor ID n. - \is[n] Insert skill icon and name
Inserts the icon and name for Skill ID n. - \it[n] Insert state icon and name
Inserts the icon and name for State ID n.
Special Escape Code Usage
Insert these codes for special rendering behavior such as inline pictures. Available in all windows that render text.
- \pic[filename] Draw picture
Draws the picture from Graphics/Pictures with the given filename at the current text position.
Examples
\bm[1]Hello there!
\bmc[1]First line of dialogue.
\bm[1]\bmd[l]Arrow points left.
\bm[1]\bmp[b]Window forced below character.
\sp[60]Fast text!
\ed[12]Slower fade effect.
\aText that can't be skipped.
Hello\. There!
Wait\| for it...
\w[60]Pause for a second.
\ni[1]Item ID 1's name appears here.
\ii[1]Item ID 1's icon and name appear here.
\pic[some_pic]Show picture with message.
Message Chaining
When using \bmc[x], multiple consecutive "Show Text" commands are automatically merged into a single bubble message window. This allows for longer dialogue sequences without manually managing long lines.
Chaining behavior
- A "Show Text" command whose text includes \bmc[x] merges its own text and any immediately following "Show Text" commands into one window
- Chaining stops when:
- A non-"Show Text" command is encountered
- A new message contains bubble positioning codes (\bm, \bmc, \bmd, \bmp)
- Face graphic, background, and position are taken from the first message in the chain
Bubble Positioning
When a bubble target is set via \bm[x] or \bmc[x], the window automatically:
- Positions itself above or below the character based on available screen space
- Centers horizontally on the character (or on the arrow sprite for narrow windows)
- Adjusts position to stay within screen bounds
- Displays an arrow sprite pointing to the character
For narrow windows (width < narrow_width), the window centers on the bubble arrow sprite rather than the character for better visual alignment.
Arrow direction is automatically determined by:
- Character facing direction (if facing left/right)
- Window position relative to the intended position
- Screen boundary constraints
You can override automatic behavior at any time using \bmd[] and \bmp[] escape codes.
Installation
- Copy the script to an open slot below ▼ Materials but above ▼ Main
- If using Hammy FF9 Windowskin System, place this script ABOVE the Windowskin System script
- If using Hammy Window Shadows, place this script ABOVE the Window Shadows script
- If using Hammy Window Headers, place this script ABOVE the Window Headers script
- If using Hammy FF9 Choice Window, place this script BELOW the Choice Window script
- Ensure your bubble arrow sprites are saved in Graphics/System with the names defined in the configuration section
- Recommended: Install Text Cache v1.04 by Mithran for optimal text rendering
Compatibility
This script is made strictly for RPG Maker VX Ace. It is highly unlikely that it will run with RPG Maker VX without adjusting.
License
MIT License - Free for commercial and non-commercial use.
Credits
This script includes code and concepts from:
- Jupiter Penguin's Message Effects script (Text fade effect)
- Yami's Pop Message script (Used as base for this script)
- Yanfly's Ace Message System script (Extended escape codes)
Why VX Ace?
You might wonder why I'm still making scripts for VX Ace instead of MV/MZ. The answer is simple: Ruby is pure beauty, while JavaScript is a terrible language. Ruby's elegant syntax, intuitive design, and expressive power make scripting a joy. JavaScript, on the other hand, is a chaotic mess of inconsistencies and quirks that I simply despise.
I work with RPG Maker VX Ace for my own game project, and I share the scripts I create with the community. If you're still using VX Ace, you're in good company!
Download
Script: Download from GitHub
Demo: Download from GitHub
Features Mentioned
- Core Dialog Features
- Speech bubble-style message windows above or below characters with arrow sprites
- Escape code-based bubble positioning with custom target, arrow direction, and position control
- Automatic bubble positioning based on available screen space
- Message chaining support for continuous dialogue sequences
- Character fade-in effects for text display
- Configurable text display speed and effect duration
- Compact spacing mode for empty lines (reduced line height)
- Customization System
- Configurable dialog window display settings (line height, padding, compact spacing)
- Configurable bubble positioning offsets and arrow sprites
- Support for colored bubble arrow sprites via Hammy FF9 Windowskin System
- Enable/disable fade-in effects and adjust settings via script calls
- Technical Features
- Automatic bubble positioning with boundary corrections
- Narrow window centering on bubble sprite when width < narrow_width
- Dynamic window sizing based on text content
- Pop-style messages require :C to advance, while default windows still support :B
Downloads / Referenced Files
Log in, then follow the RPG Maker Developers Group to see these download links.
Log in to downloadLicense / Terms Note
License MIT License - Free for commercial and non-commercial use. Credits This script includes code and concepts from:
Creator Claims / Removal
If you are the original creator and want this listing reassigned, edited, or removed, join BMMPlay and contact the moderators with proof that matches the original RPG Maker Web profile, linked GitHub, itch.io page, or another public creator identity.
Replies (0)
No replies yet.
Topic Summary
Loading summary...