Hey y'all
I'm trying to make a speech-bubble type message system work with SBS
The only one I found so far that does pretty much precisely what I wanted (bubble speech + functioning speech in combat) is Wachunga MMW
But I find that it conflicts with Enu/Atoa's SBS
This is the error message I'm getting
Looking for a fix, I found out someone else had a similar issue years ago, but it was left unresolved.
I'd be willing to switch for another message system entirely...
I actually attempted using another one, Custom Message Script by Hodgeelmf
While that one doesn't crash on entering a battle, it does crash when battle text would be displayed.
I thought of maybe figuring a way to temporarily disable it in gameplay
So, deactivate it before a fight that requires speech, using boring-default-speech, and then reactivate it
But my no-scripting-skills self couldn't figure how to do that without breaking anything.
I'm assuming the issues stem from the fact SBS uses non-default spritesets?... I'm not exactly a scripter, so I just stumble in the dark here. I figured maybe someone else could know how to actually fix this.
Is anyone able to help make this work?
Thank you for your patience.
I'm trying to make a speech-bubble type message system work with SBS
The only one I found so far that does pretty much precisely what I wanted (bubble speech + functioning speech in combat) is Wachunga MMW
Code:
#==============================================================================
# ** Multiple Message Windows
#------------------------------------------------------------------------------
# Wachunga
# 1.1
# 2006-11-10
# See [url=https://github.com/wachunga/rmxp-multiple-message-windows]https://github.com/wachunga/rmxp-multip ... ge-windows[/url] for details
#==============================================================================
#==============================================================================
# Settings
#==============================================================================
# filename of message tail used for speech bubbles
# must be in the Graphics/Windowskins/ folder
FILENAME_SPEECH_TAIL = "blue-speech_tail.png"
# note that gradient windowskins aren't ideal for tails
# filenames of message tail and windowskin used for thought bubbles
# must also be in the Graphics/Windowskins/ folder
FILENAME_THOUGHT_TAIL = "white-thought_tail.png"
FILENAME_THOUGHT_WINDOWSKIN = "white-windowskin.png"
# used for message.location
TOP = 8
BOTTOM = 2
LEFT = 4
RIGHT = 6
class Game_Message
# Any of the below can be changed by a Call Script event during gameplay.
# E.g. turn letter-by-letter mode off with: message.letter_by_letter = false
attr_accessor :move_during
attr_accessor :letter_by_letter
attr_accessor :text_speed
attr_accessor :skippable
attr_accessor :resize
attr_accessor :floating
attr_accessor :autocenter
attr_accessor :show_tail
attr_accessor :show_pause
attr_accessor :location
attr_accessor :font_name
attr_accessor :font_size
attr_accessor :font_color
attr_accessor :font_color_thought
def initialize
# whether or not messages appear one letter at a time
@letter_by_letter = true
# note: can also change within a single message with \L
# the default speed at which text appears in letter-by-letter mode
@text_speed = 1
# note: can also change within a single message with \S[n]
# whether or not players can skip to the end of (letter-by-letter) messages
@skippable = true
# whether or not messages are automatically resized based on the message
@resize = true
# whether or not message windows are positioned above
# characters/events by default, i.e. without needing \P every message
# (only works if resize messages enabled -- otherwise would look very odd)
@floating = true
# whether or not to automatically center lines within the message
@autocenter = true
# whether or not event-positioned messages have a tail (for speech bubbles)
# (only works if floating and resized messages enabled -- otherwise would
# look very odd indeed)
@show_tail = true
# whether or not to display "waiting for user input" pause graphic
# (probably want this disabled for speech bubbles)
@show_pause = false
# whether the player is permitted to move while messages are displayed
@move_during = true
# the default location for floating messages (relative to the event)
# note that an off-screen message will be "flipped" automatically
@location = TOP
# name of font to use for text (any TrueType from Windows/Fonts folder)
@font_name = Font.default_name
# note that you can use an array of fonts to specify multiple
# e.g. ['Verdana', 'MS PGothic']
# (if Verdana is not available, MS PGothic will be used instead)
# font size for text (default is 22)
@font_size = Font.default_size
# default font color (same 0-7 as for \c[n])
@font_color = 0
# font color used just for thought bubbles (\@)
@font_color_thought = 1
end
end
#------------------------------------------------------------------------------
class Window_Message < Window_Selectable
def initialize(msgindex)
super(80, 304, 480, 160)
self.contents = Bitmap.new(width - 32, height - 32)
self.visible = false
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
self.z = 9000 + msgindex * 5 # permits messages to overlap legibly
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
@fade_in = false
@fade_out = false
@contents_showing = false
@cursor_width = 0
self.active = false
self.index = -1
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
@msgindex = msgindex
@tail = Sprite.new
@tail.bitmap =
if @msgindex == 0
RPG::Cache.windowskin(FILENAME_SPEECH_TAIL)
else
# don't use cached version or else all tails
# are rotated when multiple are visible at once
Bitmap.new("Graphics/Windowskins/"+FILENAME_SPEECH_TAIL)
end
# keep track of orientation of tail bitmap
if @tail.bitmap.orientation == nil
@tail.bitmap.orientation = 0
end
# make origin the center, not top left corner
@tail.ox = @tail.bitmap.width/2
@tail.oy = @tail.bitmap.height/2
@tail.z = 9999
@tail.visible = false
@windowskin = $game_system.windowskin_name
@font_color = $game_system.message.font_color
@update_text = true
@letter_by_letter = $game_system.message.letter_by_letter
@text_speed = $game_system.message.text_speed
# id of character for speech bubbles
@float_id = nil
# location of box relative to speaker
@location = $game_system.message.location
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
end
def dispose
terminate_message
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
# have to check all windows before claiming that no window is showing
if $game_temp.message_text.compact.empty?
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
$game_temp.message_window_showing = false
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
end
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
if @input_number_window != nil
@input_number_window.dispose
end
super
end
def terminate_message
self.active = false
self.pause = false
self.index = -1
self.contents.clear
# Clear showing flag
@contents_showing = false
# Clear variables related to text, choices, and number input
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
@tail.visible = false
# note that these variables are now indexed arrays
$game_temp.message_text[@msgindex] = nil
# Call message callback
if $game_temp.message_proc[@msgindex] != nil
# make sure no message boxes are displaying
if $game_temp.message_text.compact.empty?
$game_temp.message_proc[@msgindex].call
end
$game_temp.message_proc[@msgindex] = nil
end
@update_text = true
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
$game_temp.choice_start = 99
$game_temp.choice_max = 0
$game_temp.choice_cancel_type = 0
$game_temp.choice_proc = nil
$game_temp.num_input_start = 99
$game_temp.num_input_variable_id = 0
$game_temp.num_input_digits_max = 0
# Open gold window
if @gold_window != nil
@gold_window.dispose
@gold_window = nil
end
end
def refresh
self.contents.clear
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
@x = @y = 0 # now instance variables
@float_id = nil
@location = $game_system.message.location
@windowskin = $game_system.windowskin_name
@font_color = $game_system.message.font_color
@line_widths = nil
@wait_for_input = false
@tail.bitmap =
if @msgindex == 0
RPG::Cache.windowskin(FILENAME_SPEECH_TAIL)
else
Bitmap.new("Graphics/Windowskins/"+FILENAME_SPEECH_TAIL)
end
RPG::Cache.windowskin(FILENAME_SPEECH_TAIL)
@tail.bitmap.orientation = 0 if @tail.bitmap.orientation == nil
@text_speed = $game_system.message.text_speed
@letter_by_letter = $game_system.message.letter_by_letter
@delay = @text_speed
@player_skip = false
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
@cursor_width = 0
# Indent if choice
if $game_temp.choice_start == 0
@x = 8
end
# If waiting for a message to be displayed
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
if $game_temp.message_text[@msgindex] != nil
@text = $game_temp.message_text[@msgindex] # now an instance variable
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
# Control text processing
begin
last_text = @text.clone
@text.gsub!(/\\[Vv][Aa][Rr]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
end until @text == last_text
@text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
$game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
end
# Change "\\\\" to "\000" for convenience
@text.gsub!(/\\\\/) { "\000" }
# Change "\\C" to "\001" and "\\G" to "\002"
@text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
@text.gsub!(/\\[Gg]/) { "\002" }
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
@text.gsub!(/\\[Nn]\[[Ee]([0-9]+)\]/) do
$data_enemies[$1.to_i] != nil ? $data_enemies[$1.to_i].name : ""
end
# Change "\\MAP" to map name
@text.gsub!(/\\[Mm][Aa][Pp]/) { $game_map.name }
# Change "\\L" to "\003" (toggle letter-by-letter)
@text.gsub!(/\\[Ll]/) { "\003" }
# Change "\\S" to "\004" (text speed)
@text.gsub!(/\\[Ss]\[([0-9]+)\]/) { "\004[#{$1}]" }
# Change "\\D" to "\005" (delay)
@text.gsub!(/\\[Dd]\[([0-9]+)\]/) { "\005[#{$1}]" }
# Change "\\!" to "\006" (self close)
@text.gsub!(/\\[!]/) { "\006" }
# Change "\\?" to "\007" (wait for user input)
@text.gsub!(/\\[?]/) { "\007" }
# Change "\\B" to "\010" (bold)
@text.gsub!(/\\[Bb]/) { "\010" }
# Change "\\I" to "\011" (italic)
@text.gsub!(/\\[Ii]/) { "\011" }
# Get rid of "\\@" (thought bubble)
if @text.gsub!(/\\[@]/, "") != nil
@windowskin = FILENAME_THOUGHT_WINDOWSKIN
@font_color = $game_system.message.font_color_thought
@tail.bitmap =
if @msgindex == 0
RPG::Cache.windowskin(FILENAME_THOUGHT_TAIL)
else
Bitmap.new("Graphics/Windowskins/"+FILENAME_THOUGHT_TAIL)
end
@tail.bitmap.orientation = 0 if @tail.bitmap.orientation == nil
end
# Get rid of "\\+" (multiple messages)
@text.gsub!(/\\[+]/, "")
# Get rid of "\\^", "\\v", "\\<", "\\>" (relative message location)
if @text.gsub!(/\\\^/, "") != nil
@location = 8
elsif @text.gsub!(/\\[Vv]/, "") != nil
@location = 2
elsif @text.gsub!(/\\[<]/, "") != nil
@location = 4
elsif @text.gsub!(/\\[>]/, "") != nil
@location = 6
end
# Get rid of "\\P" (position window to given character)
if @text.gsub!(/\\[Pp]\[([0-9]+)\]/, "") != nil
@float_id = $1.to_i
elsif @text.gsub!(/\\[Pp]\[([a-zA-Z])\]/, "") != nil and
$game_temp.in_battle
@float_id = $1.downcase
elsif @text.gsub!(/\\[Pp]/, "") != nil or
($game_system.message.floating and $game_system.message.resize) and
!$game_temp.in_battle
@float_id = $game_system.map_interpreter.event_id
end
if $game_system.message.resize or $game_system.message.autocenter
# calculate length of lines
text = @text.clone
temp_bitmap = Bitmap.new(1,1)
temp_bitmap.font.name = $game_system.message.font_name
temp_bitmap.font.size = $game_system.message.font_size
@line_widths = [0,0,0,0]
for i in 0..3
line = text.split(/\n/)[3-i]
if line == nil
next
end
line.gsub!(/[\001-\007](\[\w+\])?/, "")
line.chomp.split(//).each do |c|
case c
when "\000"
c = "\\"
when "\010"
# bold
temp_bitmap.font.bold = !temp_bitmap.font.bold
c = ''
when "\011"
# italics
temp_bitmap.font.italic = !temp_bitmap.font.italic
c = ''
end
@line_widths[3-i] += temp_bitmap.text_size(c).width
end
if (3-i) >= $game_temp.choice_start
# account for indenting
@line_widths[3-i] += 8 unless $game_system.message.autocenter
end
end
if $game_temp.num_input_variable_id > 0
# determine cursor_width as in Window_InputNumber
# (can't get from @input_number_window because it doesn't exist yet)
cursor_width = temp_bitmap.text_size("0").width + 8
# use this width to calculate line width (+8 for indent)
input_number_width = cursor_width*$game_temp.num_input_digits_max
input_number_width += 8 unless $game_system.message.autocenter
@line_widths[$game_temp.num_input_start] = input_number_width
end
temp_bitmap.dispose
end
resize
reposition if @float_id != nil
self.contents.font.name = $game_system.message.font_name
self.contents.font.size = $game_system.message.font_size
self.contents.font.color = text_color(@font_color)
self.windowskin = RPG::Cache.windowskin(@windowskin)
# autocenter first line if enabled
# (subsequent lines are done as "\n" is encountered)
if $game_system.message.autocenter and @text != ""
@x = (self.width-40)/2 - @line_widths[0]/2
end
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
end
end
#--------------------------------------------------------------------------
# * Resize Window
#--------------------------------------------------------------------------
def resize
if !$game_system.message.resize
# reset to defaults
self.width = 480
self.height = 160
self.contents = Bitmap.new(width - 32, height - 32)
self.x = 80 # undo any centering
return
end
max_x = @line_widths.max
max_y = 4
@line_widths.each do |line|
max_y -= 1 if line == 0 and max_y > 1
end
if $game_temp.choice_max > 0
# account for indenting
max_x += 8 unless $game_system.message.autocenter
end
self.width = max_x + 40
self.height = max_y * 32 + 32
self.contents = Bitmap.new(width - 32, height - 32)
self.x = 320 - (self.width/2) # center
end
#--------------------------------------------------------------------------
# * Reposition Window
#--------------------------------------------------------------------------
def reposition
if $game_temp.in_battle
if "abcd".include?(@float_id) # must be between a and d
@float_id = @float_id[0] - 97 # a = 0, b = 1, c = 2, d = 3
return if $scene.spriteset.actor_sprites[@float_id] == nil
sprite = $scene.spriteset.actor_sprites[@float_id]
else
@float_id -= 1 # account for, e.g., player entering 1 for index 0
return if $scene.spriteset.enemy_sprites[@float_id] == nil
sprite = $scene.spriteset.enemy_sprites[@float_id]
end
char_height = sprite.height
char_width = sprite.width
char_x = sprite.x
char_y = sprite.y - char_height/2
else # not in battle...
char = (@float_id == 0 ? $game_player : $game_map.events[@float_id])
if char == nil
# no such character
@float_id = nil
return
end
# close message (and stop event processing) if speaker is off-screen
if char.screen_x <= 0 or char.screen_x >= 640 or
char.screen_y <= 0 or char.screen_y > 480
terminate_message
$game_system.map_interpreter.command_115
return
end
char_height = RPG::Cache.character(char.character_name,0).height / 4
char_width = RPG::Cache.character(char.character_name,0).width / 4
# record coords of character's center
char_x = char.screen_x
char_y = char.screen_y - char_height/2
end
params = [char_height, char_width, char_x, char_y]
# position window and message tail
vars = new_position(params)
x = vars[0]
y = vars[1]
# check if any window locations need to be "flipped"
if @location == 4 and x < 0
# switch to right
@location = 6
vars = new_position(params)
x = vars[0]
if (x + self.width) > 640
# right is no good either...
if y >= 0
# switch to top
@location = 8
vars = new_position(params)
else
# switch to bottom
@location = 2
vars = new_position(params)
end
end
elsif @location == 6 and (x + self.width) > 640
# switch to left
@location = 4
vars = new_position(params)
x = vars[0]
if x < 0
# left is no good either...
if y >= 0
# switch to top
@location = 8
vars = new_position(params)
else
# switch to bottom
@location = 2
vars = new_position(params)
end
end
elsif @location == 8 and y < 0
# switch to bottom
@location = 2
vars = new_position(params)
y = vars[1]
if (y + self.height) > 480
# bottom is no good either...
# note: this will probably never occur given only 3 lines of text
x = vars[0]
if x >= 0
# switch to left
@location = 4
vars = new_position(params)
else
# switch to right
@location = 6
vars = new_position(params)
end
end
elsif @location == 2 and (y + self.height) > 480
# switch to top
@location = 8
vars = new_position(params)
y = vars[1]
if y < 0
# top is no good either...
# note: this will probably never occur given only 3 lines of text
x = vars[0]
if x >= 0
# switch to left
@location = 4
vars = new_position(params)
else
# switch to right
@location = 6
vars = new_position(params)
end
end
end
x = vars[0]
y = vars[1]
tail_x = vars[2]
tail_y = vars[3]
# adjust windows if near edge of screen
if x < 0
x = 0
elsif (x + self.width) > 640
x = 640 - self.width
end
if y < 0
y = 0
elsif (y + self.height) > 480
y = 480 - self.height
elsif $game_temp.in_battle and @location == 2 and (y > (320 - self.height))
# when in battle, prevent enemy messages from overlapping battle status
# (note that it could still happen from actor messages, though)
y = 320 - self.height
tail_y = y
end
# finalize positions
self.x = x
self.y = y
@tail.x = tail_x
@tail.y = tail_y
end
#--------------------------------------------------------------------------
# * Determine New Window Position
#--------------------------------------------------------------------------
def new_position(params)
char_height = params[0]
char_width = params[1]
char_x = params[2]
char_y = params[3]
if @location == 8
# top
x = char_x - self.width/2
y = char_y - char_height/2 - self.height - @tail.bitmap.height/2
@tail.bitmap.rotation(0)
tail_x = x + self.width/2
tail_y = y + self.height
elsif @location == 2
# bottom
x = char_x - self.width/2
y = char_y + char_height/2 + @tail.bitmap.height/2
@tail.bitmap.rotation(180)
tail_x = x + self.width/2
tail_y = y
elsif @location == 4
# left
x = char_x - char_width/2 - self.width - @tail.bitmap.width/2
y = char_y - self.height/2
@tail.bitmap.rotation(270)
tail_x = x + self.width
tail_y = y + self.height/2
elsif @location == 6
# right
x = char_x + char_width/2 + @tail.bitmap.width/2
y = char_y - self.height/2
@tail.bitmap.rotation(90)
tail_x = x
tail_y = y + self.height/2
end
return [x,y,tail_x,tail_y]
end
#--------------------------------------------------------------------------
# * Update Text
#--------------------------------------------------------------------------
def update_text
if @text != nil
# Get 1 text character in c (loop until unable to get text)
while ((c = @text.slice!(/./m)) != nil)
# If \\
if c == "\000"
# Return to original text
c = "\\"
end
# If \C[n]
if c == "\001"
# Change text color
@text.sub!(/\[([0-9]+)\]/, "")
color = $1.to_i
if color >= 0 and color <= 7
self.contents.font.color = text_color(color)
end
# go to next text
next
end
# If \G
if c == "\002"
# Make gold window
if @gold_window == nil
@gold_window = Window_Gold.new
@gold_window.x = 560 - @gold_window.width
if $game_temp.in_battle
@gold_window.y = 192
else
@gold_window.y = self.y >= 128 ? 32 : 384
end
@gold_window.opacity = self.opacity
@gold_window.back_opacity = self.back_opacity
end
# go to next text
next
end
# If \L
if c == "\003"
# toggle letter-by-letter mode
@letter_by_letter = !@letter_by_letter
# go to next text
next
end
# If \S[n]
if c == "\004"
@text.sub!(/\[([0-9]+)\]/, "")
speed = $1.to_i
if speed >= 0
@text_speed = speed
# reset player skip after text speed change
@player_skip = false
end
return
end
# If \D[n]
if c == "\005"
@text.sub!(/\[([0-9]+)\]/, "")
delay = $1.to_i
if delay >= 0
@delay += delay
# reset player skip after delay
@player_skip = false
end
return
end
# If \!
if c == "\006"
# close message and return from method
terminate_message
return
end
# If \?
if c == "\007"
@wait_for_input = true
return
end
if c == "\010"
# bold
self.contents.font.bold = !self.contents.font.bold
end
if c == "\011"
# italics
self.contents.font.italic = !self.contents.font.italic
end
# If new line text
if c == "\n"
# Update cursor width if choice
if @y >= $game_temp.choice_start
width = $game_system.message.autocenter ? @line_widths[@y]+8 : @x
@cursor_width = [@cursor_width, width].max
end
# Add 1 to y
@y += 1
if $game_system.message.autocenter and @text != ""
@x = (self.width-40)/2 - @line_widths[@y]/2
else
@x = 0
# Indent if choice
if @y >= $game_temp.choice_start
@x = 8
end
end
# go to next text
next
end
# Draw text
self.contents.draw_text(4 + @x, 32 * @y, 40, 32, c)
# Add x to drawn text width
@x += self.contents.text_size( c ).width
# add text speed to time to display next character
@delay += @text_speed unless !@letter_by_letter or @player_skip
return if @letter_by_letter and !@player_skip
end
end
# If choice
if $game_temp.choice_max > 0
@item_max = $game_temp.choice_max
self.active = true
self.index = 0
end
# If number input
if $game_temp.num_input_variable_id > 0
digits_max = $game_temp.num_input_digits_max
number = $game_variables[$game_temp.num_input_variable_id]
@input_number_window = Window_InputNumber.new(digits_max)
@input_number_window.number = number
@input_number_window.x =
if $game_system.message.autocenter
offset = (self.width-40)/2-@line_widths[$game_temp.num_input_start]/2
self.x + offset + 4
else
self.x + 8
end
@input_number_window.y = self.y + $game_temp.num_input_start * 32
end
@update_text = false
end
#--------------------------------------------------------------------------
# * Set Window Position and Opacity Level
#--------------------------------------------------------------------------
def reset_window
if $game_temp.in_battle
self.y = 16
else
case $game_system.message_position
when 0 # up
self.y = 16
when 1 # middle
self.y = 160
when 2 # down
self.y = 304
end
end
if $game_system.message_frame == 0
self.opacity = 255
else
self.opacity = 0
end
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
# transparent speech bubbles don't look right, so keep opacity at 255
# self.back_opacity = 160
@tail.opacity = 255
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
end
def update
super
# If fade in
if @fade_in
self.contents_opacity += 24
if @input_number_window != nil
@input_number_window.contents_opacity += 24
end
if self.contents_opacity == 255
@fade_in = false
end
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
# return
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
end
# If inputting number
if @input_number_window != nil
@input_number_window.update
# Confirm
if Input.trigger?(Input::C)
$game_system.se_play($data_system.decision_se)
$game_variables[$game_temp.num_input_variable_id] =
@input_number_window.number
$game_map.need_refresh = true
# Dispose of number input window
@input_number_window.dispose
@input_number_window = nil
terminate_message
end
return
end
# If message is being displayed
if @contents_showing
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
# Confirm or cancel finishes waiting for input or message
if Input.trigger?(Input::C) or Input.trigger?(Input::B)
if @wait_for_input
@wait_for_input = false
self.pause = false
elsif $game_system.message.skippable
@player_skip = true
end
end
if need_reposition?
reposition # update message position for character/screen movement
if @contents_showing == false
# i.e. if char moved off screen
return
end
end
if @update_text and !@wait_for_input
if @delay == 0
update_text
else
@delay -= 1
end
return
end
# If choice isn't being displayed, show pause sign
if !self.pause and ($game_temp.choice_max == 0 or @wait_for_input)
self.pause = true unless !$game_system.message.show_pause
end
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
# Cancel
if Input.trigger?(Input::B)
if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0
$game_system.se_play($data_system.cancel_se)
$game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)
terminate_message
end
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
# personal preference: cancel button should also continue
terminate_message
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
end
# Confirm
if Input.trigger?(Input::C)
if $game_temp.choice_max > 0
$game_system.se_play($data_system.decision_se)
$game_temp.choice_proc.call(self.index)
end
terminate_message
end
return
end
# If display wait message or choice exists when not fading out
if @fade_out == false and $game_temp.message_text[@msgindex] != nil
@contents_showing = true
$game_temp.message_window_showing = true
reset_window
refresh
Graphics.frame_reset
self.visible = true
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
if show_message_tail?
@tail.visible = true
elsif @tail.visible
@tail.visible = false
end
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
self.contents_opacity = 0
if @input_number_window != nil
@input_number_window.contents_opacity = 0
end
@fade_in = true
return
end
# If message which should be displayed is not shown, but window is visible
if self.visible
@fade_out = true
self.opacity -= 48
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
@tail.opacity -= 48 if @tail.opacity > 0
if need_reposition?
reposition # update message position for character/screen movement
end
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
if self.opacity == 0
self.visible = false
@fade_out = false
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
@tail.visible = false if @tail.visible
# have to check all windows before claiming that no window is showing
if $game_temp.message_text.compact.empty?
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
$game_temp.message_window_showing = false
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
end
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
end
return
end
end
#--------------------------------------------------------------------------
# * Repositioning Determination
#--------------------------------------------------------------------------
def need_reposition?
if !$game_temp.in_battle and $game_system.message.floating and
$game_system.message.resize and @float_id != nil
if $game_system.message.move_during and @float_id == 0 and
(($game_player.last_real_x != $game_player.real_x) or
($game_player.last_real_y != $game_player.real_y))
# player with floating message moved
# (note that relying on moving? leads to "jumpy" message boxes)
return true
elsif ($game_map.last_display_y != $game_map.display_y) or
($game_map.last_display_x != $game_map.display_x)
# player movement or scroll event caused the screen to scroll
return true
else
char = $game_map.events[@float_id]
if char != nil and
((char.last_real_x != char.real_x) or
(char.last_real_y != char.real_y))
# character moved
return true
end
end
end
return false
end
#--------------------------------------------------------------------------
# * Show Message Tail Determination
#--------------------------------------------------------------------------
def show_message_tail?
if $game_system.message.show_tail and $game_system.message.floating and
$game_system.message.resize and $game_system.message_frame == 0 and
@float_id != nil
return true
end
return false
end
def update_cursor_rect
if @index >= 0
n = $game_temp.choice_start + @index
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
if $game_system.message.autocenter
x = 4 + (self.width-40)/2 - @cursor_width/2
else
x = 8
end
self.cursor_rect.set(x, n * 32, @cursor_width, 32)
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
else
self.cursor_rect.empty
end
end
end
#------------------------------------------------------------------------------
class Game_Character
attr_reader :last_real_x # last map x-coordinate
attr_reader :last_real_y # last map y-coordinate
alias wachunga_game_char_update update
def update
@last_real_x = @real_x
@last_real_y = @real_y
wachunga_game_char_update
end
end
#------------------------------------------------------------------------------
class Game_Player < Game_Character
alias wachunga_mmw_game_player_update update
def update
# The conditions are changed so the player can move around while messages
# are showing (if move_during is true), but not if user is making a
# choice or inputting a number
# Note that this check overrides the default one (later in the method)
# because it is more general
unless moving? or
@move_route_forcing or
($game_system.map_interpreter.running? and
!$game_temp.message_window_showing) or
($game_temp.message_window_showing and
!$game_system.message.move_during) or
($game_temp.choice_max > 0 or $game_temp.num_input_digits_max > 0)
case Input.dir4
when 2
move_down
when 4
move_left
when 6
move_right
when 8
move_up
end
end
wachunga_mmw_game_player_update
end
end
#------------------------------------------------------------------------------
class Game_Temp
alias wachunga_mmw_game_temp_initialize initialize
def initialize
wachunga_mmw_game_temp_initialize
@message_text = []
@message_proc = []
end
end
#------------------------------------------------------------------------------
class Sprite_Battler < RPG::Sprite
# necessary for positioning messages relative to battlers
attr_reader :height
attr_reader :width
end
#------------------------------------------------------------------------------
class Scene_Battle
# necessary for accessing actor/enemy sprites in battle
attr_reader :spriteset
end
#------------------------------------------------------------------------------
class Spriteset_Battle
# necessary for accessing actor/enemy sprites in battle
attr_reader :actor_sprites
attr_reader :enemy_sprites
end
#------------------------------------------------------------------------------
class Scene_Map
# can't alias these methods unfortunately
# (SDK would help compatibility a little)
def main
# Make sprite set
@spriteset = Spriteset_Map.new
# Make message window
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
@message_window = []
@message_window[0] = Window_Message.new(0)
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
# Transition run
Graphics.transition
# Main loop
loop do
# Update game screen
Graphics.update
# Update input information
Input.update
# Frame update
update
# Abort loop if screen is changed
if $scene != self
break
end
end
# Prepare for transition
Graphics.freeze
# Dispose of sprite set
@spriteset.dispose
# Dispose of message window
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
for mw in @message_window
mw.dispose
end
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
# If switching to title screen
if $scene.is_a?(Scene_Title)
# Fade out screen
Graphics.transition
Graphics.freeze
end
end
def update
# Loop
loop do
# Update map, interpreter, and player order
# (this update order is important for when conditions are fulfilled
# to run any event, and the player isn't provided the opportunity to
# move in an instant)
$game_map.update
$game_system.map_interpreter.update
$game_player.update
# Update system (timer), screen
$game_system.update
$game_screen.update
# Abort loop if player isn't place moving
unless $game_temp.player_transferring
break
end
# Run place move
transfer_player
# Abort loop if transition processing
if $game_temp.transition_processing
break
end
end
# Update sprite set
@spriteset.update
# Update message window
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
for mw in @message_window
mw.update
end
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
# If game over
if $game_temp.gameover
# Switch to game over screen
$scene = Scene_Gameover.new
return
end
# If returning to title screen
if $game_temp.to_title
# Change to title screen
$scene = Scene_Title.new
return
end
# If transition processing
if $game_temp.transition_processing
# Clear transition processing flag
$game_temp.transition_processing = false
# Execute transition
if $game_temp.transition_name == ""
Graphics.transition(20)
else
Graphics.transition(40, "Graphics/Transitions/" +
$game_temp.transition_name)
end
end
# If showing message window
if $game_temp.message_window_showing
return
end
# If encounter list isn't empty, and encounter count is 0
if $game_player.encounter_count == 0 and $game_map.encounter_list != []
# If event is running or encounter is not forbidden
unless $game_system.map_interpreter.running? or
$game_system.encounter_disabled
# Confirm troop
n = rand($game_map.encounter_list.size)
troop_id = $game_map.encounter_list[n]
# If troop is valid
if $data_troops[troop_id] != nil
# Set battle calling flag
$game_temp.battle_calling = true
$game_temp.battle_troop_id = troop_id
$game_temp.battle_can_escape = true
$game_temp.battle_can_lose = false
$game_temp.battle_proc = nil
end
end
end
# If B button was pressed
if Input.trigger?(Input::B)
# If event is running, or menu is not forbidden
unless $game_system.map_interpreter.running? or
$game_system.menu_disabled
# Set menu calling flag or beep flag
$game_temp.menu_calling = true
$game_temp.menu_beep = true
end
end
# If debug mode is ON and F9 key was pressed
if $DEBUG and Input.press?(Input::F9)
# Set debug calling flag
$game_temp.debug_calling = true
end
# If player is not moving
unless $game_player.moving?
# Run calling of each screen
if $game_temp.battle_calling
call_battle
elsif $game_temp.shop_calling
call_shop
elsif $game_temp.name_calling
call_name
elsif $game_temp.menu_calling
call_menu
elsif $game_temp.save_calling
call_save
elsif $game_temp.debug_calling
call_debug
end
end
end
#--------------------------------------------------------------------------
# * New Message Window Addition
#--------------------------------------------------------------------------
def new_message_window(index)
if @message_window[index] != nil
# clear message windows at and after this index
last_index = @message_window.size - 1
last_index.downto(index) do |i|
if @message_window[i] != nil
@message_window[i].dispose
@message_window[i] = nil
end
end
@message_window.compact!
end
@message_window.push(Window_Message.new(index))
end
end
#------------------------------------------------------------------------------
class Scene_Battle
# can't alias these methods unfortunately
# (SDK would help compatibility a little)
def main
# Initialize each kind of temporary battle data
$game_temp.in_battle = true
$game_temp.battle_turn = 0
$game_temp.battle_event_flags.clear
$game_temp.battle_abort = false
$game_temp.battle_main_phase = false
$game_temp.battleback_name = $game_map.battleback_name
$game_temp.forcing_battler = nil
# Initialize battle event interpreter
$game_system.battle_interpreter.setup(nil, 0)
# Prepare troop
@troop_id = $game_temp.battle_troop_id
$game_troop.setup(@troop_id)
# Make actor command window
s1 = $data_system.words.attack
s2 = $data_system.words.skill
s3 = $data_system.words.guard
s4 = $data_system.words.item
@actor_command_window = Window_Command.new(160, [s1, s2, s3, s4])
@actor_command_window.y = 160
@actor_command_window.back_opacity = 160
@actor_command_window.active = false
@actor_command_window.visible = false
# Make other windows
@party_command_window = Window_PartyCommand.new
@help_window = Window_Help.new
@help_window.back_opacity = 160
@help_window.visible = false
@status_window = Window_BattleStatus.new
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
@message_window = []
@message_window[0] = Window_Message.new(0)
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
# Make sprite set
@spriteset = Spriteset_Battle.new
# Initialize wait count
@wait_count = 0
# Execute transition
if $data_system.battle_transition == ""
Graphics.transition(20)
else
Graphics.transition(40, "Graphics/Transitions/" +
$data_system.battle_transition)
end
# Start pre-battle phase
start_phase1
# Main loop
loop do
# Update game screen
Graphics.update
# Update input information
Input.update
# Frame update
update
# Abort loop if screen is changed
if $scene != self
break
end
end
# Refresh map
$game_map.refresh
# Prepare for transition
Graphics.freeze
# Dispose of windows
@actor_command_window.dispose
@party_command_window.dispose
@help_window.dispose
@status_window.dispose
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
for mw in @message_window
mw.dispose
end
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
if @skill_window != nil
@skill_window.dispose
end
if @item_window != nil
@item_window.dispose
end
if @result_window != nil
@result_window.dispose
end
# Dispose of sprite set
@spriteset.dispose
# If switching to title screen
if $scene.is_a?(Scene_Title)
# Fade out screen
Graphics.transition
Graphics.freeze
end
# If switching from battle test to any screen other than game over screen
if $BTEST and not $scene.is_a?(Scene_Gameover)
$scene = nil
end
end
def update
# If battle event is running
if $game_system.battle_interpreter.running?
# Update interpreter
$game_system.battle_interpreter.update
# If a battler which is forcing actions doesn't exist
if $game_temp.forcing_battler == nil
# If battle event has finished running
unless $game_system.battle_interpreter.running?
# Rerun battle event set up if battle continues
unless judge
setup_battle_event
end
end
# If not after battle phase
if @phase != 5
# Refresh status window
@status_window.refresh
end
end
end
# Update system (timer) and screen
$game_system.update
$game_screen.update
# If timer has reached 0
if $game_system.timer_working and $game_system.timer == 0
# Abort battle
$game_temp.battle_abort = true
end
# Update windows
@help_window.update
@party_command_window.update
@actor_command_window.update
@status_window.update
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
for mw in @message_window
mw.update
end
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
# Update sprite set
@spriteset.update
# If transition is processing
if $game_temp.transition_processing
# Clear transition processing flag
$game_temp.transition_processing = false
# Execute transition
if $game_temp.transition_name == ""
Graphics.transition(20)
else
Graphics.transition(40, "Graphics/Transitions/" +
$game_temp.transition_name)
end
end
# If message window is showing
if $game_temp.message_window_showing
return
end
# If effect is showing
if @spriteset.effect?
return
end
# If game over
if $game_temp.gameover
# Switch to game over screen
$scene = Scene_Gameover.new
return
end
# If returning to title screen
if $game_temp.to_title
# Switch to title screen
$scene = Scene_Title.new
return
end
# If battle is aborted
if $game_temp.battle_abort
# Return to BGM used before battle started
$game_system.bgm_play($game_temp.map_bgm)
# Battle ends
battle_end(1)
return
end
# If waiting
if @wait_count > 0
# Decrease wait count
@wait_count -= 1
return
end
# If battler forcing an action doesn't exist,
# and battle event is running
if $game_temp.forcing_battler == nil and
$game_system.battle_interpreter.running?
return
end
# Branch according to phase
case @phase
when 1 # pre-battle phase
update_phase1
when 2 # party command phase
update_phase2
when 3 # actor command phase
update_phase3
when 4 # main phase
update_phase4
when 5 # after battle phase
update_phase5
end
end
#--------------------------------------------------------------------------
# * New Message Window Addition
#--------------------------------------------------------------------------
def new_message_window(index)
if @message_window[index] != nil
# clear message windows at and after this index
last_index = @message_window.size - 1
last_index.downto(index) do |i|
if @message_window[i] != nil
@message_window[i].dispose
@message_window[i] = nil
end
end
@message_window.compact!
end
@message_window.push(Window_Message.new(index))
end
end
#------------------------------------------------------------------------------
class Game_System
attr_reader :message
alias wachunga_mmw_game_system_init initialize
def initialize
wachunga_mmw_game_system_init
@message = Game_Message.new
end
end
#------------------------------------------------------------------------------
class Interpreter
attr_reader :event_id
alias wachunga_mmw_interp_setup setup
def setup(list, event_id)
wachunga_mmw_interp_setup(list, event_id)
# index of window for the message
@msgindex = 0
# whether multiple messages are displaying
@multi_message = false
end
def setup_choices(parameters)
# Set choice item count to choice_max
$game_temp.choice_max = parameters[0].size
# Set choice to message_text
for text in parameters[0]
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
# just add index for array
$game_temp.message_text[@msgindex] += text + "\n"
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
end
# Set cancel processing
$game_temp.choice_cancel_type = parameters[1]
# Set callback
current_indent = @list[@index].indent
$game_temp.choice_proc = Proc.new { |n| @branch[current_indent] = n }
end
#--------------------------------------------------------------------------
# * Show Text
#--------------------------------------------------------------------------
def command_101
# If other text has been set to message_text
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
if $game_temp.message_text[@msgindex] != nil
if @multi_message
@msgindex += 1
$scene.new_message_window(@msgindex)
else
# End
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
return false
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
end
end
@msgindex = 0 if !@multi_message
@multi_message = false
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
# Set message end waiting flag and callback
@message_waiting = true
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
# just adding indexes
$game_temp.message_proc[@msgindex] = Proc.new { @message_waiting = false }
# Set message text on first line
$game_temp.message_text[@msgindex] = @list[@index].parameters[0] + "\n"
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
line_count = 1
# Loop
loop do
# If next event command text is on the second line or after
if @list[@index+1].code == 401
# Add the second line or after to message_text
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
# just adding index
$game_temp.message_text[@msgindex]+=@list[@index+1].parameters[0]+"\n"
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
line_count += 1
# If event command is not on the second line or after
else
# If next event command is show choices
if @list[@index+1].code == 102
# If choices fit on screen
if @list[@index+1].parameters[0].size <= 4 - line_count
# Advance index
@index += 1
# Choices setup
$game_temp.choice_start = line_count
setup_choices(@list[@index].parameters)
end
# If next event command is input number
elsif @list[@index+1].code == 103
# If number input window fits on screen
if line_count < 4
# Advance index
@index += 1
# Number input setup
$game_temp.num_input_start = line_count
$game_temp.num_input_variable_id = @list[@index].parameters[0]
$game_temp.num_input_digits_max = @list[@index].parameters[1]
end
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
# start multimessage if next line is "Show Text" starting with "\\+"
elsif @list[@index+1].code == 101
if @list[@index+1].parameters[0][0..1]=="\\+"
@multi_message = true
@message_waiting = false
end
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
end
# Continue
return true
end
# Advance index
@index += 1
end
end
#--------------------------------------------------------------------------
# * Show Choices
#--------------------------------------------------------------------------
def command_102
# If text has been set to message_text
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
# just adding index
if $game_temp.message_text[@msgindex] != nil
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
# End
return false
end
# Set message end waiting flag and callback
@message_waiting = true
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
# adding more indexes
$game_temp.message_proc[@msgindex] = Proc.new { @message_waiting = false }
# Choices setup
$game_temp.message_text[@msgindex] = ""
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
$game_temp.choice_start = 0
setup_choices(@parameters)
# Continue
return true
end
#--------------------------------------------------------------------------
# * Input Number
#--------------------------------------------------------------------------
def command_103
# If text has been set to message_text
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
# just adding index
if $game_temp.message_text[@msgindex] != nil
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
# End
return false
end
# Set message end waiting flag and callback
@message_waiting = true
#------------------------------------------------------------------------------
# Begin Multiple Message Windows Edit
#------------------------------------------------------------------------------
# adding more indexes
$game_temp.message_proc[@msgindex] = Proc.new { @message_waiting = false }
# Number input setup
$game_temp.message_text[@msgindex] = ""
#------------------------------------------------------------------------------
# End Multiple Message Windows Edit
#------------------------------------------------------------------------------
$game_temp.num_input_start = 0
$game_temp.num_input_variable_id = @parameters[0]
$game_temp.num_input_digits_max = @parameters[1]
# Continue
return true
end
#--------------------------------------------------------------------------
# * Script
#--------------------------------------------------------------------------
# Fix for RMXP bug: call script boxes that return false hang the game
# See, e.g., [url=http://rmxp.org/forums/showthread.php?p=106639]http://rmxp.org/forums/showthread.php?p=106639[/url]
#--------------------------------------------------------------------------
def command_355
# Set first line to script
script = @list[@index].parameters[0] + "\n"
# Loop
loop do
# If next event command is second line of script or after
if @list[@index+1].code == 655
# Add second line or after to script
script += @list[@index+1].parameters[0] + "\n"
# If event command is not second line or after
else
# Abort loop
break
end
# Advance index
@index += 1
end
# Evaluation
result = eval(script)
# If return value is false
if result == false
# End
#------------------------------------------------------------------------------
# Begin Edit
#------------------------------------------------------------------------------
#return false
#------------------------------------------------------------------------------
# End Edit
#------------------------------------------------------------------------------
end
# Continue
return true
end
def message
$game_system.message
end
end
#------------------------------------------------------------------------------
class Game_Map
attr_accessor :last_display_x # last display x-coord * 128
attr_accessor :last_display_y # last display y-coord * 128
alias wachunga_mmw_game_map_update update
def update
@last_display_x = @display_x
@last_display_y = @display_y
wachunga_mmw_game_map_update
end
def name
return load_data('Data/MapInfos.rxdata')[@map_id].name
end
end
#------------------------------------------------------------------------------
class Bitmap
attr_accessor :orientation
#--------------------------------------------------------------------------
# * Rotation Calculation
#--------------------------------------------------------------------------
def rotation(target)
return if not [0, 90, 180, 270].include?(target) # invalid orientation
if @rotation != target
degrees = target - @orientation
if degrees < 0
degrees += 360
end
rotate(degrees)
end
end
#--------------------------------------------------------------------------
# * Rotate Square (Clockwise)
#--------------------------------------------------------------------------
def rotate(degrees = 90)
# method originally by SephirothSpawn
# would just use Sprite.angle but its rotation is buggy
# (see [url=http://www.rmxp.org/forums/showthread.php?t=12044]http://www.rmxp.org/forums/showthread.php?t=12044[/url])
return if not [90, 180, 270].include?(degrees)
copy = self.clone
if degrees == 90
# Passes Through all Pixels on Dummy Bitmap
for i in 0...self.height
for j in 0...self.width
self.set_pixel(width - i - 1, j, copy.get_pixel(j, i))
end
end
elsif degrees == 180
for i in 0...self.height
for j in 0...self.width
self.set_pixel(width - j - 1, height - i - 1, copy.get_pixel(j, i))
end
end
elsif degrees == 270
for i in 0...self.height
for j in 0...self.width
self.set_pixel(i, height - j - 1, copy.get_pixel(j, i))
end
end
end
@orientation = (@orientation + degrees) % 360
end
end
But I find that it conflicts with Enu/Atoa's SBS
Code:
#==============================================================================
# Sideview Battle System Configurations Version 2.2xp
#==============================================================================
# Original Script by:
# Enu ([url=http://rpgex.sakura.ne.jp/home/]http://rpgex.sakura.ne.jp/home/[/url])
# Conversion to XP by:
# Atoa
# Original translation versions by:
# Kylock
# Translation continued by:
# Mr. Bubble
# XP version Translation by:
# cairn
# Special thanks:
# Shu (for translation help)
# Moonlight (for her passionate bug support for this script)
# NightWalker (for his community support for this script)
# XRXS (for the script of damage gravity, which was modified and
# used as the system's base of damage exibition)
# Squall (for the FF styled damage script, which was modified
# and added to the damage exibition system)
# KGC (for the STBreaker script, which was the base for the
# attribute limit system)
# Herena Isaberu (for her support in XP version bug fixes)
# Enu (for making an awesome battle system)
#==============================================================================
#==============================================================================
# ■ module N01
#------------------------------------------------------------------------------
# Sideview Battle System Config
#==============================================================================
module N01
#--------------------------------------------------------------------------
# ● Settings
#--------------------------------------------------------------------------
# Battle member starting positions
# X Y X Y X Y X Y
ACTOR_POSITION = [[230,280],[130,290],[180,200],[220,270]]
# Maximum party members that can fight at the same time.
# Remember to add/remove coordinates in ACTOR_POSITION if you adjust
# the MAX_MEMBER value.
MAX_MEMBER = 4
# Delay time after a battler completes an action in frames.
ACTION_WAIT = 6
# Delay time before enemy collapse (defeat of enemy) animation in frames.
COLLAPSE_WAIT = 6
# Delay before victory is processed in frames.
WIN_WAIT = 30
# Animation ID for any unarmed attack.
NO_WEAPON = 4
# Damage modifications when using two weapons. Values are percentages.
# 1st Wpn, 2nd Wpn
TWO_SWORDS_STYLE = [100,50]
# Auto-Life State: Revivial Animation ID
RESURRECTION = 25
# POP Window indicator words. For no word results, use "".
POP_MISS = "Miss" # Attack missed
POP_EVA = "Evade" # Attack avoided
POP_CRI = "Crit" # Attack scored a critical hit
# Set to false to remove shadow under actors
SHADOW = false
# true: Use actor's walking graphic.
# false: Don't use actor's walking graphic.
# If false, battler file with "_1" is required since walking file is not used.
# "_1" and subsequent files ("_2", "_3", etc.) should be uniform in size.
WALK_ANIME = false
# Number of frames in a battler animation file. (horizontal frames)
ANIME_PATTERN = 4
# Number of types of battler animation file. (vertical frames)
ANIME_KIND = 1
#==============================================================================
# ■ Single Action Engine
#------------------------------------------------------------------------------
# These are utilized by sequenced actions and have no utility alone.
#==============================================================================
# A single-action cannot be used by itself unless it is used as part of a
# sequence.
ANIME = {
#--------------------------------------------------------------------------
# ● Battler Animations
#--------------------------------------------------------------------------
# No. - Battler graphic file used.
# 0: Normal Battler Graphic. In the case of Actors, 0 refers to
# default walking graphic.
# n: "Character Name + _n", where n refers to the file number
# extension. An example file would be "$Ralph_1". These
# files are placed in the Characters folder.
# Use "1" for non-standard battler, like Minkoff's.
#
# Row - Vertical position (row) of cells in battler graphic file. (0~3)
# Speed - Refresh rate of animation. Lower numbers are faster.
# Loop - [0: "Round-Trip" Loop] Example: 1 2 3 2 1 2 3 2 1 ...
# [1: "One-Way" Loop] Example: 1 2 3 1 2 3 1 2 3 ...
# [2: One Loop, no repeat] Example: 1 2 3 .
# Wait - Time, in frames, before animation loops again.
# Does not apply if Loop=2
# Fixed - Defines loop behavior or specific fixed cell display.
# -2: Reverse Loop Animation
# -1: Normal Loop Animation
# 0: No Loop Animation
# 0~3: Fixed cell display. Refers to cell on character sprite
# sheet starting where 0 = left-most cell.
# Z - Set battler's Z priority.
# Shadow - Set true to display battler shadow during animation; false to hide.
# Weapon - Weapon animation to play with battler animation. For no weapon
# animation, use "".
# Action Name No. Row Speed Loop Wait Fixed Z Shadow Weapon
"WAIT" => [ 1, 0, 15, 1, 0, -1, 0, true,"" ],
"WAIT(FIXED)" => [ 1, 0, 10, 1, 0, -1, 0, true,"" ],
"RIGHT(FIXED)" => [ 1, 0, 10, 1, 0, -1, 0, true,"" ],
"DAMAGE" => [ 1, 0, 4, 1, 0, 0, 0, true,"" ],
"ATTACK_FAIL" => [ 1, 0, 10, 1, 0, 1, 0, true,"" ],
"MOVE_TO" => [ 1, 0, 10, 1, 0, -1, 0, true,"" ],
"MOVE_AWAY" => [ 1, 0, 8, 1, 0, -1, 0, true,"" ],
"ABOVE_DISPLAY" => [ 1, 0, 2, 1, 0, -1, 600, true,"" ],
"WPN_SWING_V" => [ 1, 0, 10, 1, 0, -1, 2, true,"VERT_SWING"],
"WPN_SWING_VL" => [ 1, 0, 10, 1, 0, -1, 2, true,"VERT_SWINGL"],
"WPN_SWING_VS" => [ 1, 0, 10, 1, 0, -1, 2, true,"VERT_SWING"],
"WPN_SWING_UNDER" => [ 1, 0, 10, 1, 0, -1, 2, true,"UNDER_SWING"],
"WPN_SWING_OVER" => [ 1, 0, 10, 1, 0, -1, 2, true,"OVER_SWING"],
"WPN_RAISED" => [ 1, 0, 10, 1, 0, -1, 2, true,"RAISED"],
#--------------------------------------------------------------------------
# ● Weapon Animations
#--------------------------------------------------------------------------
# Weapon Animations can only be used with Battler Animations as seen
# and defined above.
#
# Xa - Distance weapon sprite is moved on the X-axis.
# Ya - Distance weapon sprite is moved on the Y-axis. Please note that
# the Y-axis is inverted. This means negative values move up, positive
# values move down.
# Za - If true, weapon sprite is displayed over battler sprite.
# If false, weapon sprite is displayed behind battler sprite.
# A1 - Starting angle of weapon sprite rotation. Negative numbers will
# result in counter-clockwise rotation.
# A2 - Ending angle of weapon sprite rotation. Rotation will stop here.
# Or - Rotation Origin - [0: Center] [1: Upper Left] [2: Upper Right]
# [3:Bottom Left] [4:Bottom Right]
# Inv - Invert - If true, horizontally inverts weapon sprite.
# Xs - X scale - Stretches weapon sprite horizontally by a factor of X.
# Values may be decimals. (0.6, 0.9, etc.)
# Ys - Y scale - Stretches weapon sprite vertically by a factor of Y.
# Values may be decimals. (0.6, 0.9, etc.)
# Xp - X pitch - For adjusting the X axis. This number changes the initial
# X coordinate.
# Yp - Y pitch - For adjusting the Y axis. This number changes the initial
# Y coordinate.
# Weapon2 - If set to true, Two Weapon Style's Weapon 2 sprite will be used
# instead.
# Action Name Xa Ya Za A1 A2 Or Inv Xs Ys Xp Yp Weapon2
"VERT_SWING" => [ 6, 8,false,-135, 45, 4,false, 1, 1, -6, -12,false],
"VERT_SWINGL" => [ 6, 8,false,-135, 45, 4,false, 1, 1, -6, -12, true],
"UNDER_SWING" => [ 6, 8,false, 270, 45, 4,false, 1, 1, -6, -12,false],
"OVER_SWING" => [ 6, 8,false, 45,-100, 4,false, 1, 1, -6, -12,false],
"RAISED" => [ 6, -4,false, 90, -45, 4,false, 1, 1, -6, -12,false],
#--------------------------------------------------------------------------
# ● Battler Movements
#--------------------------------------------------------------------------
# Origin - Defines the origin of movement based on an (x,y) coordinate plane.
# 1 unit = 1 pixel
# [0: Battler's Current Position]
# [1: Battler's Selected Target]
# [2: Screen; (0,0) is at upper-left of screen]
# [3: Battle Start Position]
# X - X-axis pixels from origin.
# Y - Y-axis pixels from origin. Please note that the Y-axis is
# inverted. This means negative values move up, positive values move down.
# Time - Travel time. Larger numbers are slower. The distance is
# divided by one frame of movement.
# Accel - Positive values accelerates frames. Negative values decelerates.
# Jump - Negative values produce a jumping arc. Positive values produce
# a reverse arc. [0: No jump]
# Animation - Battler Animation utilized during movement.
# Origin X Y Time Accel Jump Animation
"NO_MOVE" => [ 0, 0, 0, 1, 0, 0, "WAIT(FIXED)"],
"START_POSITION" => [ 0, 54, 0, 1, 0, 0, "MOVE_TO"],
"BEFORE_MOVE" => [ 3, 32, 0, 18, -1, 0, "MOVE_TO"],
"AFTER_MOVE" => [ 0, -32, 0, 8, -1, 0, "MOVE_TO"],
"4_MAN_ATTACK_1" => [ 2, 564, 186, 12, -1, 0, "MOVE_TO"],
"4_MAN_ATTACK_2" => [ 2, 564, 212, 12, -1, 0, "MOVE_TO"],
"4_MAN_ATTACK_3" => [ 2, 504, 174, 12, -1, 0, "MOVE_TO"],
"4_MAN_ATTACK_4" => [ 2, 504, 254, 12, -1, 0, "MOVE_TO"],
"DEAL_DAMAGE" => [ 0, 32, 0, 4, -1, 0, "DAMAGE"],
"EXTRUDE" => [ 0, 12, 0, 1, 1, 0, "DAMAGE"],
"FLEE_SUCCESS" => [ 0, -300, 0,300, 1, 0, "MOVE_AWAY"],
"FLEE_FAIL" => [ 0, -48, 0, 16, 1, 0, "MOVE_AWAY"],
"VICTORY_JUMP" => [ 0, 0, 0, 20, 0, -5, "MOVE_TO"],
"MOVING_TARGET" => [ 0, 0, 0, 18, -1, 0, "MOVE_TO"],
"MOVING_TARGET_FAST" => [ 0, 0, -12, 8, 0, -2, "MOVE_TO"],
"PREV_MOVING_TARGET" => [ 0, 24, 0, 12, -1, 0, "MOVE_TO"],
"PREV_MOVING_TARGET_FAST" => [ 0, 24, 0, 1, 0, 0, "MOVE_TO"],
"MOVING_TARGET_RIGHT" => [ 0, 96, 32, 16, -1, 0, "MOVE_TO"],
"MOVING_TARGET_LEFT" => [ 0, 96, -32, 16, -1, 0, "MOVE_TO"],
"JUMP_TO" => [ 0, -32, 0, 8, -1, -4, "MOVE_TO"],
"JUMP_AWAY" => [ 0, 32, 0, 8, -1, -4, "MOVE_AWAY"],
"JUMP_TO_TARGET" => [ 0, 12, -12, 12, -1, -6, "MOVE_TO"],
"THROW_ALLY" => [ 0, -24, 0, 16, 0, -2, "MOVE_TO"],
"TRAMPLE" => [ 0, 12, -32, 12, -1, -6, "ABOVE_DISPLAY"],
"PREV_JUMP_ATTACK" => [ 0, -32, 0, 12, -1, -2, "WPN_SWING_V"],
"PREV_STEP_ATTACK" => [ 0, 12, 0, 12, -1, -5, "WPN_SWING_VS"],
"REAR_SWEEP_ATTACK" => [ 0, 12, 0, 16, 0, -3, "WPN_SWING_V"],
"JUMP_FIELD_ATTACK" => [ 0, 0, 0, 16, 0, -5, "WPN_SWING_V"],
"DASH_ATTACK" => [ 0, -96, 0, 16, 2, 0, "WPN_SWING_V"],
"RIGHT_DASH_ATTACK" => [ 0, -96, 32, 16, 2, 0, "WPN_SWING_V"],
"LEFT_DASH_ATTACK" => [ 0, -96, -32, 16, 2, 0, "WPN_SWING_V"],
"RIGHT_DASH_ATTACK2" => [ 0,-128, 48, 16, 2, 0, "WPN_SWING_V"],
"LEFT_DASH_ATTACK2" => [ 0,-128, -48, 16, 2, 0, "WPN_SWING_V"],
#--------------------------------------------------------------------------
# ● Battler Float Animations
#--------------------------------------------------------------------------
# These types of single-actions defines the movement of battlers from their
# own shadows. Please note that it is not possible to move horizontally
# while floating from a shadow.
#
# Type - Always "float".
# A - Starting float height. Negative values move up.
# Positive values move down.
# B - Ending float height. This height is maintained until another action.
# Time - Duration of movement from point A to point B
# Animation - Specifies the Battler Animation to be used.
# Type A B Time Animation
"FLOAT_" => ["float", -22, -20, 2, "WAIT(FIXED)"],
"FLOAT_2" => ["float", -20, -18, 2, "WAIT(FIXED)"],
"FLOAT_3" => ["float", -18, -20, 2, "WAIT(FIXED)"],
"FLOAT_4" => ["float", -20, -22, 2, "WAIT(FIXED)"],
"JUMP_STOP" => ["float", 0, -80, 4, "WAIT(FIXED)"],
"JUMP_LAND" => ["float", -80, 0, 4, "WAIT(FIXED)"],
"LIFT" => ["float", 0, -30, 4, "WAIT(FIXED)"],
#--------------------------------------------------------------------------
# ● Battler Position Reset
#--------------------------------------------------------------------------
# These types of single-actions define when a battler's turn is over and
# will reset the battler back to its starting coordinates. This type of
# single-action is required in all sequences.
#
# Please note that after a sequence has used this type of single-action,
# no more damage can be done by the battler since its turn is over.
#
# Type - Always "reset"
# Time - Time it takes to return to starting coordinates. Movement speed
# fluctuates depending on distance from start coordinates.
# Accel - Positive values accelerate. Negative values decelerate.
# Jump - Negative values produce a jumping arc. Positive values produce
# a reverse arc. [0: No jump]
# Animation - Specifies the Battler Animation to be used.
# Type Time Accel Jump Animation
"COORD_RESET" => ["reset", 16, 0, 0, "MOVE_TO"],
"FLEE_RESET" => ["reset", 16, 0, 0, "MOVE_AWAY"],
#--------------------------------------------------------------------------
# ● Forced Battler Actions
#--------------------------------------------------------------------------
# These types of single-actions allow forced control of other battlers
# that you define.
#
# Type - Specifies action type. "SINGLE" or "SEQUENCE"
#
# Object - The battler that will execute the action defined under Action
# Name. 0 is for selected target, and any other number is a State
# number (1~999), and affects all battlers with the State on them.
# By adding a - (minus sign) followed by a Skill ID number (1~999),
# it will define the actors that know the specified skill, besides
# the original actor.
# If you want to designate an actor by their index ID number,
# add 1000 to their index ID number. If the system cannot designate
# the index number(such as if actor is dead or ran away), it will
# select the nearest one starting from 0. If a response fails,
# the action will be canceled. (Example: Ylva's actor ID is 4. A
# value of 1004 would define Ylva as the Object.)
#
# Reset Type - Specifies method of returning the battler to its original
# location.
# Action Name - Specifies action used. If Type is SINGLE, then Action Name
# must be a single-action function. If Type is SEQUENCE,
# the Action Name must an action sequence name.
# Type Object Reset Type Action Name
"LIGHT_BLOWBACK" => ["SINGLE", 0, "COORD_RESET", "EXTRUDE"],
"RIGHT_TURN" => ["SINGLE", 0, "COORD_RESET", "CLOCKWISE_TURN"],
"DROP_DOWN" => ["SINGLE", 0, "COORD_RESET", "Y_SHRINK"],
"IMPACT_1" => ["SINGLE", 0, "COORD_RESET", "OBJ_TO_SELF"],
"LIFT_ALLY" => ["SINGLE", 0, "", "LIFT"],
"ULRIKA_ATTACK" => ["SEQUENCE", 18, "COORD_RESET", "ULRIKA_ATTACK_1"],
"4_MAN_ATK_1" => ["SEQUENCE", -101, "COORD_RESET", "4_MAN_ATTACK_1"],
"4_MAN_ATK_2" => ["SEQUENCE", -102, "COORD_RESET", "4_MAN_ATTACK_2"],
"4_MAN_ATK_3" => ["SEQUENCE", -103, "COORD_RESET", "4_MAN_ATTACK_3"],
"ALLY_FLING" => ["SEQUENCE", 1000, "COORD_RESET", "THROW"],
#--------------------------------------------------------------------------
# ● Target Modification
#--------------------------------------------------------------------------
# Changes battler's target in battle. Original target will still be stored.
# Current battler is the only battler capable of causing damage.
#
# Type - Always "target"
#
# Object - The battler that will have its target modified. 0 is selected
# target, any other number is a State ID number (1~999), and
# changes all battlers with that state on them to target the new
# designated target.
# If you want to designate an actor by their index ID number,
# add 1000 to their index ID number. If the system cannot designate
# the index number(such as if actor is dead or ran away), it will
# select the nearest one starting from 0. If a response fails,
# the action will be canceled. (Example: Ylva's actor ID is 4. A
# value of 1004 would define Ylva as the Object.)
#
# Target - New Target. [0=Self] [1=Self's Target]
# [2=Self's Target After Modification]
# [3=Reset to Previous Target (if 2 was used)]
# Target Mod name Type Object Target
"REAL_TARGET" => ["target", 0, 0],
"TWO_UNIFIED_TARGETS" => ["target", 18, 1],
"FOUR_UNIFIED_TARGETS" => ["target", 19, 1],
"ALLY_TO_THROW" => ["target", 1000, 2],
"THROW_TARGET" => ["target", 1000, 3],
#--------------------------------------------------------------------------
# ● Skill Linking
#--------------------------------------------------------------------------
# Linking to the next skill will stop any current action. Linking to the
# next skill will also require and consume MP/HP cost of that skill.
#
# Type - Always "der"
# Chance - Chance, in percent, to link to the defined skill ID. (0~100)
# Link - true: actor does not require Skill ID learned to link.
# false: actor requires Skill ID learned.
# Skill ID - ID of the skill that will be linked to.
# Action Name Type Chance Link Skill ID
"LINK_SKILL_91" => ["der", 100, true, 91],
"LINK_SKILL_92" => ["der", 100, true, 92],
#--------------------------------------------------------------------------
# ● Action Conditions
#--------------------------------------------------------------------------
# If the condition is not met, all current actions are canceled.
#
# A: Type - always "nece"
# B: Object - Object that Condition refers to. [0=Self] [1=Target]
# [2=All Enemies] [3=All Allies]
# C: Content - [0=State] [1=Parameter] [2=Switch] [3=Variable] [4=Skill]
#
# D: Condition - This value is determined by the value you set for Content.
# [0] State: State ID
# [1] Parameter: [0=Current HP] [1=Current MP] [2=ATK] [3=DEX] [4=AGI] [5=INT]
# [2] Switch: Game Switch Number
# [3] Variable: Game Variable Number
# [4] Skill: Skill ID
#
# E: Supplement - Supplement for the Condition as defined above.
# [0] State: Amount required. If number is positive, the condition is how
# many have the state, while a negative number are those who
# don't have the state.
# [1] Parameter: If Object is more than one battler, average is used.
# Success if Parameter is greater than value. If Value
# is negative, then success if lower.
# [2] Switch: [true: Switch ON succeeds] [false: Switch OFF succeeds]
# [3] Variable: Game variable value used to determine if condition is met. If
# supplement value is positive, Game Variable must have more
# than the defined amount to succeed. If supplement value has a
# minus symbol (-) attached, Game Variable must have less than
# the defined amount to succeed. (Ex: -250 means the Game
# Variable must have a value less than 250 to succeed.)
# [4] Skill: Required amount of battlers that have the specified skill
# ID learned.
# Type Obj Cont Cond Supplement
# A B C D E
"2_MAN_ATK_COND" => ["nece", 3, 0, 18, 1],
"4_MAN_ATK_COND" => ["nece", 3, 0, 19, 3],
"FLOAT_STATE" => ["nece", 0, 0, 17, 1],
"CAT_STATE" => ["nece", 0, 0, 20, 1],
#--------------------------------------------------------------------------
# ● Battler Rotation
#--------------------------------------------------------------------------
# Rotates battler image. Weapon Animations are not automatically adjusted
# for Battler Rotation like with Invert settings.
#
# Type - always "angle"
# Time - Duration duration of rotation animation in frames.
# Start - Starting angle. 0-360 degrees. Can be negative.
# End - Ending Angle. 0-360 degrees. Can be negative.
# Return - true: End of rotation is the same as end of duration.
# false: Rotation animation as defined.
# Type Time Start End Return
"FALLEN" => ["angle", 1, -90, -90,false],
"CLOCKWISE_TURN" => ["angle", 48, 0,-360,false],
"COUNTERCLOCKWISE_TURN" => ["angle", 6, 0, 360,false],
#--------------------------------------------------------------------------
# ● Battler Zoom
#--------------------------------------------------------------------------
# Stretch and shrink battler sprites with these single-actions.
#
# Type - always "zoom"
# Time - Duration of zoom animation in frames.
# X - X scale - Stretches battler sprite horizontally by a factor of X.
# 1.0 is normal size, 0.5 is half size.
# Y - Y scale - Stretches battler sprite vertically by a factor of Y.
# 1.0 would be normal size, 0.5 would be half size.
# Return - true: End of rotation is the same as end of duration.
# false: Zoom animation as defined.
# Battler zoom is still temporary.
# Type Time X Y Return
"X_SHRINK" => ["zoom", 16, 0.5, 1.0, true],
"Y_SHRINK" => ["zoom", 16, 1.0, 0.5, true],
#--------------------------------------------------------------------------
# ● Damage and Database-Assigned Animations
#--------------------------------------------------------------------------
# These single-actions deal with animations, particularly with those assigned
# in the Database for Weapons, Skills and Items. These are what causes
# any damage/healing/state/etc. application from Weapons, Skills and Items.
#
# A difference between "anime" and "m_a" single-actions is that
# "anime" triggered animations will move with the Object on the screen. The
# Z-axis of animations will always be over battler sprites. If "OBJ_ANIM"
# is added at the beginning of the name, it will be both damage and defined
# animation.
#
# Type - always "anime"
# ID - (-1): Uses assigned animation from game Database.
# (-2): Uses equipped Weapon animation as assigned in the Database.
# (1~999): Database Animation ID.
# Object - [0=Self] [1=Target]
# Invert - If set to true, the animation is inverted horizontally.
# Wait - true: Sequence will not continue until animation is completed.
# false: Sequence will continue regardless of animation length.
# Weapon2 - true: If wielding two weapons, damage and animation will be
# based off Weapon 2.
# Type ID Object Invert Wait Weapon2
"OBJ_ANIM" => ["anime", -1, 1, false,false, false],
"OBJ_ANIM_WEIGHT" => ["anime", -1, 1, false, true, false],
"OBJ_ANIM_WEAPON" => ["anime", -2, 1, false,false, false],
"OBJ_ANIM_L" => ["anime", -1, 1, false,false, true],
"HIT_ANIM" => ["anime", 14, 1, false,false, false],
"KILL_HIT_ANIM" => ["anime", 67, 1, false,false, false],
#--------------------------------------------------------------------------
# ● Movement and Display of Animations
#--------------------------------------------------------------------------
# These single-actions provide motion options for animations used for
# effects such as long-ranged attacks and projectiles. Weapon sprites
# may also substitute animations.
#
# A difference between "m_a" and "anime" single-actions is that "m_a"
# animations will stay where the Object was even if the Object moved.
#
# Type - always "m_a"
# ID - 1~999: Database Animation ID
# 0: No animation displayed.
# Object - Animation's target. [0=Target] [1=Enemy's Area]
# [2=Party's Area] [4=Self]
# Pass - [0: Animation stops when it reaches the Object.]
# [1: Animation passes through the Object and continues.]
# Time - Duration of animation travel time and display. Larger values
# decrease travel speed. Increase this value if the animation
# being played is cut short.
# Arc - Trajectory - Positive values produce a low arc.
# Negative values produce a high arc.
# [0: No Arc]
# Xp - X Pitch - This value adjusts the initial X coordinate of the
# animation. Enemy calculation will be automatically inverted.
# Yp - Y Pitch - This value adjusts the initial X coordinate of the
# animation.
# Start - Defines origin of animation movement.
# [0=Self] [1=Target] [2=No Movement]
# Z-axis - true: Animation will be over the battler sprite.
# false: Animation will be behind battler sprite.
# Weapon - Insert only "Throwing Weapon Rotation" and
# "Throwing Skill Rotation" actions. For no weapon sprite, use "".
# Type ID Object Pass Time Arc Xp Yp Start Z Weapon
"START_MAGIC_ANIM" => ["m_a", 2, 4, 0, 50, 0, 0, 0, 2,false,""],
"OBJ_TO_SELF" => ["m_a", 51, 0, 0, 18, 0, 0, 0, 1,false,""],
"START_WEAPON_THROW"=> ["m_a", 0, 0, 0, 16, -24, 0, 0, 0,false,"WPN_ROTATION"],
"END_WEAPON_THROW" => ["m_a", 0, 0, 0, 16, 24, 0, 0, 1,false,"WPN_ROTATION"],
"STAND_CAST" => ["m_a",100, 1, 0, 50, 0, 0, 0, 2, true,""],
#--------------------------------------------------------------------------
# ● Throwing Weapon Rotation
#--------------------------------------------------------------------------
# These are used to rotate weapon sprites that are "thrown" with Movement of
# Animation single-actions. These must be used while the sprite is in flight.
# You may assign a different weapon graphic to be thrown in this
# configuration script under Throwing Weapon Graphic Settings.
#
# Start - Starting angle in degrees (0-360)
# End - Ending angle in degrees. (0-360)
# Time - Duration, in frames, of a single rotation. Rotation will continue
# until the animation is complete.
# Start Angle Time
"WPN_ROTATION" => [ 0, 360, 8],
#--------------------------------------------------------------------------
# ● Throwing Skill Rotation
#--------------------------------------------------------------------------
# Different from Throwing Weapon Rotation. These single-actions are used to
# rotate weapon sprites that are "thrown" with Movement of Animation single
# actions. These are specifically used with skills. You may assign a different weapon graphic to be
# thrown in this configuration script under Throwing Weapon Graphic Settings.
#
# Start - Starting angle in degrees (0-360)
# End - Ending angle in degrees. (0-360)
# Time - Duration, in frames, of a single rotation. Rotation will continue
# until the animation is complete.
# Type - Always "skill".
# Weapon Action Name Start End Time Type
"WPN_THROW" => [ 0, 360, 8, "skill"],
#--------------------------------------------------------------------------
# ● Status Balloon Animation
#--------------------------------------------------------------------------
# Uses Balloon.png in the System folder.
#
# Type - Always "balloon"
# Row - Determines row from the Balloon.png (0~9)
# Loop - Balloon loop behavior. Balloon disappears when loop is
# complete. [0="One-Way" Loop] [1="Round-Trip" Loop]
# Emote Name Type Row Loop
"STATUS-NORMAL" => ["balloon", 6, 1],
"STATUS-CRITICAL" => ["balloon", 5, 1],
"STATUS-SLEEP" => ["balloon", 9, 1],
#--------------------------------------------------------------------------
# ● Sound Effect Actions
#--------------------------------------------------------------------------
# Type1 - always "sound"
# Type2 - ["se","bgm","bgs"]
# Pitch - Value between 50 and 150.
# Vol - Volume - Value between 0 and 100.
# Filename - Name of the sound to be played.
# Type1 Type2 Pitch Vol Filename
"062-Swing01" => ["sound", "se", 80, 100, "062-Swing01"],
#--------------------------------------------------------------------------
# ● Game Speed Modifier
#--------------------------------------------------------------------------
# Type - always "fps"
# Speed - Speed in Frames Per Second. 40 is normal frame rate.
# Use with care as this function modifies FPS directly and will conversly
# affect any active timers or time systems.
# Type Speed
"FPS_SLOW" => ["fps", 20],
"FPS_NORMAL" => ["fps", 40],
#--------------------------------------------------------------------------
# ● State Granting Effects
#--------------------------------------------------------------------------
# Type - always "sta+"
# Object - [0=Self] [1=Target] [2=All Enemies] [3=All Allies]
# [4=All Allies (excluding user)]
# State ID - State ID to be granted.
# Type Object State ID
"2_MAN_TECH_GRANT" => ["sta+", 0, 18],
"4_MAN_TECH_GRANT" => ["sta+", 0, 19],
"CATFORM_GRANT" => ["sta+", 0, 20],
#--------------------------------------------------------------------------
# ● State Removal Effects
#--------------------------------------------------------------------------
# Type - always "sta-"
# Object - [0=Self] [1=Target] [2=All Enemies] [3=All Allies]
# [4=All Allies (excluding user)]
# State ID - State ID to be removed.
# Type Object State ID
"2_MAN_TECH_REVOKE" => ["sta-", 3, 18],
"4_MAN_TECH_REVOKE" => ["sta-", 3, 19],
#--------------------------------------------------------------------------
# ● Battler Transformation Effects
#--------------------------------------------------------------------------
# Type - always "change"
# Reset - true: Battler sprite reverts back to default file after battle.
# false: Transformation is permanent after battle.
# Filename - Battler graphics file that will be transformed to.
# Type Reset Filename
"TRANSFORM_CAT" => ["change", true,"007-Fighter07"],
"TRANSFORM_CANCEL" => ["change", true,"040-Mage08"],
#--------------------------------------------------------------------------
# ● Cut-In Image Effects
#--------------------------------------------------------------------------
# Only one image can be displayed at a time.
#
# X1 - Image's starting X-coordinate.
# Y1 - Starting Y-coordinate.
# X2 - Ending X-coordinate.
# Y2 - Ending Y-coordinate.
# Time - Length of time from start to end. Higher value is slower.
# Z-axis - true: Image appears over BattleStatus Window.
# false: Image appears behind BattleStatus Window.
# Filename - File name from .Graphics\Pictures folder.
# Type X1 Y1 X2 Y2 Time Z-axis Filename
"CUT_IN_START" => ["pic",-280, 48, 0, 64, 14, false,"016-Thief01"],
"CUT_IN_END" => ["pic", 0, 48, 640, 64, 12, false,"016-Thief01"],
#--------------------------------------------------------------------------
# ● Game Switch Settings
#--------------------------------------------------------------------------
# Type - Always "switch"
# Switch - Switch number from the game database.
# ON/OFF - [true:Switch ON] [false:Switch OFF]
#
# Type Switch ON/OFF
"GAME_SWITCH_1_ON" => ["switch", 1, true],
#--------------------------------------------------------------------------
# ● Game Variable Settings
#--------------------------------------------------------------------------
# Type - Always "variable"
# Var - Variable Number from the game database.
# Oper - [0=Set] [1=Add] [2=Sub] [3=Mul] [4=Div] [5=Mod]
# X - value of the operation.
#
# Type Var Oper X
"GAME_VAR_1_+1" => ["variable", 1, 1, 1],
#--------------------------------------------------------------------------
# ● Script Operation Settings
#--------------------------------------------------------------------------
# Type - Always "script"
#
# Inserts a simple script code into the action sequence. In the sample,
# where it says p=1 can be replaced with any script. Character strings
# and anything beyond functions will not work. (?)
# Type
"TEST_SCRIPT" => ["script", "
p = 1
"],
#--------------------------------------------------------------------------
# ● Special Modifiers - DO NOT CHANGE THESE NAMES
#--------------------------------------------------------------------------
# Clear image - Clears images such as Cut-in graphics.
# Afterimage ON - Activates Afterimage of battler.
# Afterimage OFF - Deactivates Afterimage.
# Invert - Invert animation. Use Invert again in a sequence to cancel
# because "COORD_RESET" does not reset Invert.
# Don't Wait - Any actions after Don't Wait is applied are done instantly.
# Apply "Don't Wait" again in a sequence to trigger off.
# Can Collapse - Triggers collapse of battler when HP is 0.
# Required in every damage sequence.
# Two Wpn Only - The single-action following Two Wpn Only will only execute
# if the actor is wielding two weapons. If the actor is not,
# the single-action will be skipped and will move on to the next.
# One Wpn Only - The single-action following One Wpn Only will only execute
# if the actor is wielding one weapon. If the actor is not,
# the single-action will be skipped and will move on to the next.
# Process Skill - The Return marker for individual processing of a skill.
# Process Skill End - The End marker for individual processing of a skill.
# Start Pos Change - Changes the Start Position to wherever the battler
# currently is on screen.
# Start Pos Return - Returns battler to original Start Position.
# Cancel Action - Trigger the "end" of battler's turn which will cause the
# the next battler's turn to execute.
# This includes the function of Can Collapse, and no
# additional damage can be dealt by the battler after this.
# End - This is used when no action is automatically recognized.
#
# Note: If you wish to understand how Process Skill and Process Skill End
# functions, please examine the "SKILL_ALL" sequence in this Config
# and use the Float All skill provided in the demo to see how it works.
"Clear image" => ["Clear image"],
"Afterimage ON" => ["Afterimage ON"],
"Afterimage OFF" => ["Afterimage OFF"],
"Invert" => ["Invert"],
"Don't Wait" => ["Don't Wait"],
"Can Collapse" => ["Can Collapse"],
"Two Wpn Only" => ["Two Wpn Only"],
"One Wpn Only" => ["One Wpn Only"],
"Process Skill" => ["Process Skill"],
"Process Skill End" => ["Process Skill End"],
"Start Pos Change" => ["Start Pos Change"],
"Start Pos Return" => ["Start Pos Return"],
"Cancel Action" => ["Cancel Action"],
"End" => ["End"]
#--------------------------------------------------------------------------
# ● About Wait
#--------------------------------------------------------------------------
# When there is only a numerical value as a single-action name, it will be
# considered a delay, in frames, before the Action Sequence continues.
# (i.e. "10", "42") Because of this, single-action function names for the
# effects defined above cannot be entirely numerical. Any Battler Animations
# that have been prompted will persist when Waiting.
}
#==============================================================================
# ■ Action Sequence
#------------------------------------------------------------------------------
# Action sequences are made of the single-action functions defined above.
#==============================================================================
# Action Sequences defined here can be used for Actor/Enemy actions below.
# Sequences are processed left to right in order.
ACTION = {
#------------------------------- Basic Actions --------------------------------
"BATTLE_START" => ["START_POSITION","COORD_RESET"],
"WAIT" => ["WAIT"],
"WAIT-CRITICAL" => ["NO_MOVE","WAIT(FIXED)","STATUS-CRITICAL","22"],
"WAIT-NORMAL" => ["NO_MOVE","WAIT(FIXED)","STATUS-NORMAL","22"],
"WAIT-SLEEP" => ["NO_MOVE","WAIT(FIXED)","STATUS-SLEEP","22"],
"WAIT-FLOAT" => ["WAIT(FIXED)","6","FLOAT_","4",
"FLOAT_2","4","FLOAT_3","4",
"FLOAT_4","4"],
"DEAD" => ["FALLEN","ATTACK_FAIL"],
"DAMAGE" => ["DEAL_DAMAGE","COORD_RESET"],
"FLEE" => ["FLEE_SUCCESS"],
"ENEMY_FLEE" => ["FLEE_SUCCESS","COORD_RESET"],
"FLEE_FAIL" => ["FLEE_FAIL","WAIT(FIXED)","8","COORD_RESET"],
"COMMAND_INPUT" => ["BEFORE_MOVE"],
"COMMAND_SELECT" => ["COORD_RESET"],
"GUARD_ATTACK" => ["WAIT(FIXED)","4","FLOAT_STATE","FLOAT_",
"2","FLOAT_2","2","FLOAT_3","2",
"FLOAT_4","2"],
"EVADE_ATTACK" => ["JUMP_AWAY","JUMP_AWAY","WAIT(FIXED)","16",
"COORD_RESET"],
"ENEMY_EVADE_ATTACK" => ["JUMP_AWAY","WAIT(FIXED)","16","COORD_RESET"],
"VICTORY" => ["WAIT(FIXED)","16","RIGHT(FIXED)","VICTORY_JUMP",
"WAIT(FIXED)","Don't Wait","CAT_STATE",
"START_MAGIC_ANIM","TRANSFORM_CANCEL","WAIT(FIXED)","Don't Wait"],
"RESET_POSITION" => ["COORD_RESET"],
#---------------------- "Forced Action" Sequences --------------------------
"ULRIKA_ATTACK_1" => ["2","MOVING_TARGET_LEFT","WAIT(FIXED)",
"START_MAGIC_ANIM","WPN_SWING_UNDER","WPN_RAISED",
"48","RIGHT_DASH_ATTACK","64","FLEE_RESET"],
"4_MAN_ATTACK_1" => ["2","4_MAN_ATTACK_2","WAIT(FIXED)","START_MAGIC_ANIM",
"WPN_SWING_UNDER","WPN_RAISED","90",
"LEFT_DASH_ATTACK","96","FLEE_RESET"],
"4_MAN_ATTACK_2" => ["2","4_MAN_ATTACK_3","WAIT(FIXED)","START_MAGIC_ANIM",
"WPN_SWING_UNDER","WPN_RAISED","60","RIGHT_DASH_ATTACK2","RIGHT_TURN",
"OBJ_ANIM","128","FLEE_RESET"],
"4_MAN_ATTACK_3" => ["2","4_MAN_ATTACK_4","WAIT(FIXED)","START_MAGIC_ANIM",
"WPN_SWING_UNDER","WPN_RAISED","34","LEFT_DASH_ATTACK2","RIGHT_TURN",
"OBJ_ANIM","144","FLEE_RESET"],
"THROW" => ["CLOCKWISE_TURN","4","MOVING_TARGET_FAST","JUMP_AWAY","4",
"WAIT(FIXED)","JUMP_AWAY","WAIT(FIXED)","32"],
#---------------------- Basic Action Oriented ------------------------------
"NORMAL_ATTACK" => ["PREV_MOVING_TARGET","WPN_SWING_V","OBJ_ANIM_WEIGHT",
"12","WPN_SWING_VL","OBJ_ANIM_L","Two Wpn Only","16",
"Can Collapse","FLEE_RESET"],
"ENEMY_UNARMED_ATK" => ["PREV_MOVING_TARGET","WPN_SWING_V","OBJ_ANIM_WEIGHT",
"Can Collapse","FLEE_RESET"],
"SKILL_USE" => ["BEFORE_MOVE","WAIT(FIXED)","START_MAGIC_ANIM",
"WPN_SWING_UNDER","WPN_RAISED","WPN_SWING_V",
"OBJ_ANIM_WEIGHT","Can Collapse","24","COORD_RESET"],
"SKILL_ALL" => ["BEFORE_MOVE","START_MAGIC_ANIM","WPN_SWING_UNDER","WPN_RAISED",
"Process Skill","WPN_SWING_V","OBJ_ANIM","24",
"Process Skill End","Can Collapse","COORD_RESET"],
"ITEM_USE" => ["PREV_MOVING_TARGET","WAIT(FIXED)","24","OBJ_ANIM_WEIGHT",
"Can Collapse","COORD_RESET"],
#------------------------------ Skill Sequences -------------------------------
"MULTI_ATTACK" => ["Afterimage ON","PREV_STEP_ATTACK","WPN_SWING_VL","OBJ_ANIM_WEAPON",
"WAIT(FIXED)","16","OBJ_ANIM_WEAPON","WPN_SWING_UNDER",
"WPN_SWING_OVER","4","JUMP_FIELD_ATTACK","WPN_SWING_VL",
"OBJ_ANIM_WEAPON","WAIT(FIXED)","16","OBJ_ANIM_WEAPON",
"Invert","WPN_SWING_V","WPN_SWING_VL","12","Invert",
"JUMP_FIELD_ATTACK","WPN_SWING_VL","OBJ_ANIM_WEAPON",
"JUMP_AWAY","JUMP_AWAY","WAIT(FIXED)",
"OBJ_ANIM_WEAPON","DASH_ATTACK","WPN_SWING_VL","Can Collapse",
"Afterimage OFF","16","FLEE_RESET"],
"MULTI_ATTACK_RAND" => ["PREV_STEP_ATTACK","WPN_SWING_VL","OBJ_ANIM_WEAPON","WAIT(FIXED)","16",
"PREV_STEP_ATTACK","WPN_SWING_VL","OBJ_ANIM_WEAPON","WAIT(FIXED)","16",
"PREV_STEP_ATTACK","WPN_SWING_VL","OBJ_ANIM_WEAPON","WAIT(FIXED)","16",
"PREV_STEP_ATTACK","WPN_SWING_VL","OBJ_ANIM_WEAPON","Can Collapse","COORD_RESET"],
"RAPID_MULTI_ATTACK" => ["PREV_MOVING_TARGET","WPN_SWING_V","LIGHT_BLOWBACK","OBJ_ANIM_WEAPON",
"PREV_MOVING_TARGET_FAST","WPN_SWING_V","LIGHT_BLOWBACK","WPN_SWING_VL","OBJ_ANIM_WEAPON",
"PREV_MOVING_TARGET_FAST","WPN_SWING_V","LIGHT_BLOWBACK","WPN_SWING_VL","OBJ_ANIM_WEAPON",
"PREV_MOVING_TARGET_FAST","WPN_SWING_V","LIGHT_BLOWBACK","WPN_SWING_VL","OBJ_ANIM_WEAPON",
"PREV_MOVING_TARGET_FAST","WPN_SWING_V","LIGHT_BLOWBACK","WPN_SWING_VL","OBJ_ANIM_WEAPON",
"PREV_MOVING_TARGET_FAST","WPN_SWING_V","LIGHT_BLOWBACK","WPN_SWING_VL","OBJ_ANIM_WEAPON",
"Can Collapse","12","COORD_RESET"],
"2-MAN_ATTACK" => ["2_MAN_ATK_COND","TWO_UNIFIED_TARGETS","ULRIKA_ATTACK",
"MOVING_TARGET_RIGHT","WAIT(FIXED)","START_MAGIC_ANIM","WPN_SWING_UNDER",
"WPN_RAISED","48","KILL_HIT_ANIM","LEFT_DASH_ATTACK","64","OBJ_ANIM",
"Can Collapse","FLEE_RESET","2_MAN_TECH_REVOKE"],
"2-MAN_ATTACK_ASSIST"=> ["2_MAN_TECH_GRANT"],
"4-MAN_ATTACK" => ["4_MAN_ATK_COND","FOUR_UNIFIED_TARGETS","4_MAN_ATK_1",
"4_MAN_ATK_2","4_MAN_ATK_3","4_MAN_ATTACK_1","WAIT(FIXED)",
"START_MAGIC_ANIM","WPN_SWING_UNDER","WPN_RAISED","90",
"KILL_HIT_ANIM","RIGHT_DASH_ATTACK","64","OBJ_ANIM_WEIGHT",
"Can Collapse","FLEE_RESET","4_MAN_TECH_REVOKE"],
"4-MAN_ATTACK_ASSIST"=> ["4_MAN_TECH_GRANT"],
"THROW_WEAPON" => ["BEFORE_MOVE","WPN_SWING_V","062-Swing01","WAIT(FIXED)",
"START_WEAPON_THROW","12","OBJ_ANIM_WEAPON","Can Collapse",
"END_WEAPON_THROW","COORD_RESET"],
"MULTI_SHOCK" => ["JUMP_TO","JUMP_STOP","Process Skill",
"REAL_TARGET","WPN_SWING_V","IMPACT_1","8",
"OBJ_ANIM_WEAPON","Process Skill End","Can Collapse",
"JUMP_LAND","COORD_RESET"],
"SHOCK_WAVE" => ["REAL_TARGET","WPN_SWING_V","IMPACT_1","20",
"OBJ_ANIM_WEIGHT","Can Collapse"],
"SKILL_90_SEQUENCE" => ["PREV_MOVING_TARGET","OBJ_ANIM","WPN_SWING_V",
"16","LINK_SKILL_91","COORD_RESET"],
"SKILL_91_SEQUENCE" => ["FLEE_FAIL","START_MAGIC_ANIM","WPN_SWING_UNDER","WPN_RAISED",
"8","OBJ_ANIM","LINK_SKILL_92","COORD_RESET"],
"CUT_IN" => ["WAIT(FIXED)","START_MAGIC_ANIM","CUT_IN_START",
"75","CUT_IN_END","8","PREV_MOVING_TARGET",
"WPN_SWING_V","OBJ_ANIM_WEIGHT","Can Collapse",
"Clear image","FLEE_RESET"],
"STOMP" => ["JUMP_TO_TARGET","HIT_ANIM","DROP_DOWN","JUMP_AWAY",
"TRAMPLE","HIT_ANIM","DROP_DOWN","JUMP_AWAY",
"TRAMPLE","OBJ_ANIM","DROP_DOWN","JUMP_AWAY",
"JUMP_AWAY","Can Collapse","WAIT(FIXED)","8","FLEE_RESET"],
"ALL_ATTACK_1" => ["BEFORE_MOVE","WAIT(FIXED)","START_MAGIC_ANIM","WPN_SWING_UNDER",
"WPN_RAISED","STAND_CAST","WPN_SWING_V","48",
"OBJ_ANIM_WEIGHT","Can Collapse","COORD_RESET"],
"TRANSFORM_CAT" => ["JUMP_TO","WAIT(FIXED)","START_MAGIC_ANIM","32",
"TRANSFORM_CAT","WAIT(FIXED)","CATFORM_GRANT","32","JUMP_AWAY"],
"THROW_FRIEND" => ["ALLY_TO_THROW","MOVING_TARGET","LIFT_ALLY","4",
"062-Swing01","THROW_TARGET","ALLY_FLING",
"THROW_ALLY","WAIT(FIXED)","OBJ_ANIM","COORD_RESET",
"WAIT(FIXED)","32"],
#-------------------------------------------------------------------------------
"End" => ["End"]}
end
#==============================================================================
# ■ Game_Actor
#------------------------------------------------------------------------------
# Actor Basic Action Settings
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● Actor Unarmed Attack Animation Sequence
#--------------------------------------------------------------------------
# when 1 <- Actor ID number
# return "NORMAL_ATTACK" <- Corresponding action sequence name.
def non_weapon
case @actor_id
when 1 # Actor ID
return "NORMAL_ATTACK"
end
# Default action sequence for all unassigned Actor IDs.
return "NORMAL_ATTACK"
end
#--------------------------------------------------------------------------
# ● Actor Wait/Idle Animation
#--------------------------------------------------------------------------
def normal
case @actor_id
when 1
return "WAIT"
end
# Default action sequence for all unassigned Actor IDs.
return "WAIT"
end
#--------------------------------------------------------------------------
# ● Actor Critical (1/4th HP) Animation
#--------------------------------------------------------------------------
def pinch
case @actor_id
when 1
return "WAIT-CRITICAL"
end
# Default action sequence for all unassigned Actor IDs.
return "WAIT-CRITICAL"
end
#--------------------------------------------------------------------------
# ● Actor Guarding Animation
#--------------------------------------------------------------------------
def defence
case @actor_id
when 1
return "GUARD_ATTACK"
end
# Default action sequence for all unassigned Actor IDs.
return "GUARD_ATTACK"
end
#--------------------------------------------------------------------------
# ● Actor Damage Taken Animation
#--------------------------------------------------------------------------
def damage_hit
case @actor_id
when 1
return "DAMAGE"
end
# Default action sequence for all unassigned Actor IDs.
return "DAMAGE"
end
#--------------------------------------------------------------------------
# ● Actor Evasion Animation
#--------------------------------------------------------------------------
def evasion
case @actor_id
when 1
return "EVADE_ATTACK"
end
# Default action sequence for all unassigned Actor IDs.
return "EVADE_ATTACK"
end
#--------------------------------------------------------------------------
# ● Actor Command Input Animation
#--------------------------------------------------------------------------
def command_b
case @actor_id
when 1
return "COMMAND_INPUT"
end
# Default action sequence for all unassigned Actor IDs.
return "COMMAND_INPUT"
end
#--------------------------------------------------------------------------
# ● Actor Command Selected Animation
#--------------------------------------------------------------------------
def command_a
case @actor_id
when 1
return "COMMAND_SELECT"
end
# Default action sequence for all unassigned Actor IDs.
return "COMMAND_SELECT"
end
#--------------------------------------------------------------------------
# ● Actor Flee Success Animation
#--------------------------------------------------------------------------
def run_success
case @actor_id
when 1
return "FLEE"
end
# Default action sequence for all unassigned Actor IDs.
return "FLEE"
end
#--------------------------------------------------------------------------
# ● Actor Flee Failure Animation
#--------------------------------------------------------------------------
def run_ng
case @actor_id
when 1
return "FLEE_FAIL"
end
# Default action sequence for all unassigned Actor IDs.
return "FLEE_FAIL"
end
#--------------------------------------------------------------------------
# ● Actor Victory Animation
#--------------------------------------------------------------------------
def win
case @actor_id
when 1
return "VICTORY"
end
# Default action sequence for all unassigned Actor IDs.
return "VICTORY"
end
#--------------------------------------------------------------------------
# ● Actor Battle Start Animation
#--------------------------------------------------------------------------
def first_action
case @actor_id
when 1
return "BATTLE_START"
end
# Default action sequence for all unassigned Actor IDs.
return "BATTLE_START"
end
#--------------------------------------------------------------------------
# ● Actor Return Action when actions are interuptted/canceled
#--------------------------------------------------------------------------
def recover_action
case @actor_id
when 1
return "RESET_POSITION"
end
# Default action sequence for all unassigned Actor IDs.
return "RESET_POSITION"
end
#--------------------------------------------------------------------------
# ● Actor Shadow
#--------------------------------------------------------------------------
# return "shadow01" <- Image file name in .Graphics\Characters
# return "" <- No shadow used.
def shadow
case @actor_id
when 1
return "shadow00"
end
# Default shadow for all unassigned Actor IDs.
return "shadow00"
end
#--------------------------------------------------------------------------
# ● Actor Shadow Adjustment
#--------------------------------------------------------------------------
# return [ X-Coordinate, Y-Coordinate]
def shadow_plus
case @actor_id
when 1
return [ 0, 4]
end
# Default shadow positioning for all unassigned Actor IDs.
return [ 0, 4]
end
end
#==============================================================================
# ■ Game_Enemy
#------------------------------------------------------------------------------
# Enemy Basic Action Settings
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ● Enemy Unarmed Attack Animation Sequence
#--------------------------------------------------------------------------
# when 1 <- EnemyID#
# return "ENEMY_UNARMED_ATK" <- Corresponding action sequence name.
def base_action
case @enemy_id
when 1
return "ENEMY_UNARMED_ATK"
end
# Default action sequence for all unassigned Enemy IDs.
return "ENEMY_UNARMED_ATK"
end
#--------------------------------------------------------------------------
# ● Enemy Wait/Idle Animation
#--------------------------------------------------------------------------
def normal
case @enemy_id
when 1
return "WAIT"
end
# Default action sequence for all unassigned Enemy IDs.
return "WAIT"
end
#--------------------------------------------------------------------------
# ● Enemy Critical (1/4th HP) Animation
#--------------------------------------------------------------------------
def pinch
case @enemy_id
when 1
return "WAIT"
end
# Default action sequence for all unassigned Enemy IDs.
return "WAIT"
end
#--------------------------------------------------------------------------
# ● Enemy Guarding Animation
#--------------------------------------------------------------------------
def defence
case @enemy_id
when 1
return "GUARD_ATTACK"
end
# Default action sequence for all unassigned Enemy IDs.
return "GUARD_ATTACK"
end
#--------------------------------------------------------------------------
# ● Enemy Damage Taken Animation
#--------------------------------------------------------------------------
def damage_hit
case @enemy_id
when 1
return "DAMAGE"
end
# Default action sequence for all unassigned Enemy IDs.
return "DAMAGE"
end
#--------------------------------------------------------------------------
# ● Enemy Evasion Animation
#--------------------------------------------------------------------------
def evasion
case @enemy_id
when 1
return "ENEMY_EVADE_ATTACK"
end
# Default action sequence for all unassigned Enemy IDs.
return "ENEMY_EVADE_ATTACK"
end
#--------------------------------------------------------------------------
# ● Enemy Flee Animation
#--------------------------------------------------------------------------
def run_success
case @enemy_id
when 1
return "ENEMY_FLEE"
end
# Default action sequence for all unassigned Enemy IDs.
return "ENEMY_FLEE"
end
#--------------------------------------------------------------------------
# ● Enemy Battle Start Animation
#--------------------------------------------------------------------------
def first_action
case @enemy_id
when 1
return "BATTLE_START"
end
# Default action sequence for all unassigned Enemy IDs.
return "BATTLE_START"
end
#--------------------------------------------------------------------------
# ● Enemy Return Action when action is interuptted/discontinued
#--------------------------------------------------------------------------
def recover_action
case @enemy_id
when 1
return "RESET_POSITION"
end
# Default action sequence for all unassigned Enemy IDs.
return "RESET_POSITION"
end
#--------------------------------------------------------------------------
# ● Enemy Shadow
#--------------------------------------------------------------------------
# return "shadow01" <- Image file name in .Graphics\Characters
# return "" <- No shadow used.
def shadow
case @enemy_id
when 1
return "shadow01"
when 30
return ""
end
# Default shadow for all unassigned Enemy IDs.
return "shadow01"
end
#--------------------------------------------------------------------------
# ● Enemy Shadow Adjustment
#--------------------------------------------------------------------------
# return [ X-Coordinate, Y-Coordinate]
def shadow_plus
case @enemy_id
when 1
return [ 0, -8]
end
# Default shadow positioning for all unassigned Enemy IDs.
return [ 0, 0]
end
#--------------------------------------------------------------------------
# ● Enemy Equipped Weapon
#--------------------------------------------------------------------------
# return 0 (Unarmed/No weapon equipped.)
# return 1 (Weapon ID number. (1~999))
def weapon
case @enemy_id
when 1 # Enemy ID
return 0 # Weapon ID
end
# Default weapon for all unassigned Enemy IDs.
return 0
end
#--------------------------------------------------------------------------
# ● Enemy Screen Positioning Adjustment
#--------------------------------------------------------------------------
# return [ 0, 0] <- [X-coordinate、Y-coordinate]
def position_plus
case @enemy_id
when 1
return [0, 0]
end
# Default positioning for all unassigned Enemy IDs.
return [ 0, 0]
end
#--------------------------------------------------------------------------
# ● Enemy Collapse Animation Settings
#--------------------------------------------------------------------------
# return 1 (Enemy sprite stays on screen after death.)
# return 2 (Enemy disappears from the battle like normal.)
# return 3 (Special collapse animation.) <- Good for bosses.
def collapse_type
case @enemy_id
when 1
return 2
when 30
return 3
end
# Default collapse for all unassigned Enemy IDs.
return 2
end
#--------------------------------------------------------------------------
# ● Enemy Multiple Action Settings
#--------------------------------------------------------------------------
# Maximum Actions, Probability, Speed Adjustment
# return [ 2, 100, 100]
#
# Maximum Actions - Maximum number of actions enemy may execute in a turn.
# Probability - % value. Chance for a successive action.
# Speed Adjustment - % value that decreases enemy's speed after
# each successive action.
def action_time
case @enemy_id
when 1
return [ 1, 100, 100]
end
# Default action for all unassigned Enemy IDs.
return [ 1, 100, 100]
end
#--------------------------------------------------------------------------
# ● Enemy Animated Battler Settings
#--------------------------------------------------------------------------
# return true - Enemy battler uses same animation frames as actors.
# return false - Default enemy battler.
# [Settings]
# 1.Enemy animated battler file must be in .Graphics\Characters folder.
# 2.Enemy battler file names must match between .Graphics\Characters and
# .Graphics/Battlers folders.
def anime_on
case @enemy_id
when 1
return false
end
# Default setting for all unassigned Enemy IDs.
return false
end
#--------------------------------------------------------------------------
# ● Enemy Invert Settings
#--------------------------------------------------------------------------
# return false <- Normal
# return true <- Inverts enemy image
def action_mirror
case @enemy_id
when 1
return false
end
# Default setting for all unassigned Enemy IDs.
return false
end
end
#==============================================================================
# ■ module RPG
#------------------------------------------------------------------------------
# State Action Settings
#==============================================================================
class RPG::State
#--------------------------------------------------------------------------
# ● State Affliction Wait Animation Settings
#--------------------------------------------------------------------------
# when 1 <- State ID number
# return "DEAD" <- Action sequence when afflicted by specified state.
def base_action
case @id
when 1 # Incapacitated(HP0). Has the highest priority.
return "DEAD"
when 2,3,4,5,7
return "WAIT-NORMAL"
when 6
return "WAIT-SLEEP"
when 17
return "WAIT-FLOAT"
end
# Default action sequence for all unassigned State IDs.
return "WAIT"
end
#--------------------------------------------------------------------------
# ● State Enhancement Extension Settings
#--------------------------------------------------------------------------
# Note about REFLECT and NULL states:
# An item/skill is considered physical if "Physical Attack" is
# checked under "Options" in your Database. Otherwise, it is magical.
#
# "AUTOLIFE/50" - Automatically revives when Incapacitated.
# Value after "/" is % of MAXHP restored when revived.
# "MAGREFLECT/39" - Reflects magical skills to the original caster.
# Value after "/" is Animation ID when triggered.
# "MAGNULL/39" - Nullify magical skills and effects.
# Value after "/" is Animation ID when triggered.
# "PHYREFLECT/39" - Reflects physical skills to the original caster.
# Value after "/" is Animation ID when triggered.
# "PHYNULL/39" - Nullify physical skills and effects.
# Value after "/" is Animation ID when triggered.
# "COSTABSORB" - Absorbs the MP (or HP) cost of an incoming skill when
# affected. This will not appear as POP Damage. This
# function is similar to Celes' "Runic" from FF6.
# "ZEROTURNLIFT" - State is lifted at the end of turn regardless.
# "EXCEPTENEMY" - Enemies will not use animation sequence assigned
# under State Affliction Wait Animation Settings when
# afflicted. (Actors still will.)
# "NOPOP" - State name will not appear as POP Damage.
# "HIDEICON" - State icon will not appear in the BattleStatus Window.
# "NOSTATEANIME" - State's caster and enemies will not use animation
# sequence assigned under State Affliction Wait Animation
# Settings when afflicted.
# "SLIPDAMAGE" - Apply slip damage. Assign values under Slip Damage Settings.
# "REGENERATION" - Apply regeneration. Assign values under Slip Damage Settings.
# "NONE" - No extension. Used as a default.
def extension
case @id
when 1 # Incapacitated State. Has highest priority.
return ["NOPOP","EXCEPTENEMY"]
when 2 # Poison
return ["SLIPDAMAGE"]
when 18 # 2-Man Tech
return ["ZEROTURNLIFT","HIDEICON"]
when 19 # 4-Man Tech
return ["ZEROTURNLIFT","HIDEICON"]
when 20 # Cat Transformation
return ["HIDEICON","NOSTATEANIME"]
end
# Default extension for unassigned State IDs.
return ["NONE"]
end
#--------------------------------------------------------------------------
# ● Slip Damage Settings
#--------------------------------------------------------------------------
# Also includes regeneration options.
#
# when 1 <- State ID. Slip Damage only applies if "SLIPDAMAGE" is assigned above.
# Multiple settings may be applied. Ex)[["hp",0,5,true],["mp",0,5,true]]
#
# Type, Constant, %, POP?, Allow Death
# return [["hp", 0, 10, true, true]]
#
# Type – "hp" or "mp".
# Constant – Set a constant value to apply each turn.
# Positive values are damage. Negative values are recovery.
# % - Set a percentage value to apply each turn based on MAX HP/MP.
# Positive values are damage. Negative values are recovery.
# POP? - Determines whether or not you want slip damage value to
# appear as POP Damage.
# Allow Death - true: Slip damage can kill.
# false: Slip damage will not kill. (Battler will be left at 1 HP)
def slip_extension
case @id
when 2 # Poison
return [["hp", 0, 10, true, true]]
end
return []
end
end
#==============================================================================
# ■ module RPG
#------------------------------------------------------------------------------
# Weapon Action Settings
#==============================================================================
class RPG::Weapon
#--------------------------------------------------------------------------
# ● Weapon Animation Sequence Settings
#--------------------------------------------------------------------------
# Assigns a specific animation sequence when using a weapon.
#
# when 1 <- Weapon ID number
# return "NORMAL_ATTACK" <- Action sequence for assigned Weapon ID.
def base_action
case @id
when 1
return "NORMAL_ATTACK"
end
# Default action sequence for unassigned Weapon IDs.
return "NORMAL_ATTACK"
end
#--------------------------------------------------------------------------
# ● Weapon Graphic Assignment Settings
#--------------------------------------------------------------------------
# Allows use of a seperate weapon graphic besides the one assigned
# from Iconset.png
#
# return "001-Weapon01" <- Weapon image file name. If "", none is used.
# File must be in the .Graphics\Characters folder
# of your project.
def graphic
case @id
when 1
return ""
end
# Default weapon graphic for unassigned Weapon IDs.
return ""
end
#--------------------------------------------------------------------------
# ● Throwing Weapon Graphic Settings
#--------------------------------------------------------------------------
# Allows use of a seperate throwing weapon graphic besides the one assigned
# from Iconset.png. This is useful for arrows when you don't want the bow
# to be thrown.
#
# return "001-Weapon01" <- Weapon image file name. If "", none is used.
# File must be in the .Graphics\Characters folder
# of your project.
def flying_graphic
case @id
when 1
return ""
end
# Default throwing weapon graphic for unassigned Weapon IDs.
return ""
end
end
#==============================================================================
# ■ module RPG
#------------------------------------------------------------------------------
# Skill Action Settings
#==============================================================================
class RPG::Skill
#--------------------------------------------------------------------------
# ● Skill ID Sequence Assignments
#--------------------------------------------------------------------------
# Assign a skill ID from the Database to execute a defined action sequence.
# Only action sequence names can be assigned. Single-action names cannot
# be directly assigned here.
def base_action
case @id
when 84
return "THROW_WEAPON"
when 85
return "MULTI_ATTACK"
when 86
return "RAPID_MULTI_ATTACK"
when 87
return "MULTI_SHOCK"
when 88
return "SHOCK_WAVE"
when 89
return "MULTI_ATTACK_RAND"
when 90
return "SKILL_90_SEQUENCE"
when 91
return "SKILL_91_SEQUENCE"
when 92
return "NORMAL_ATTACK"
when 93
return "CUT_IN"
when 94
return "STOMP"
when 95
return "ALL_ATTACK_1"
when 96
return "SKILL_ALL"
when 97
return "TRANSFORM_CAT"
when 98
return "2-MAN_ATTACK"
when 99
return "2-MAN_ATTACK_ASSIST"
when 100
return "4-MAN_ATTACK"
when 101
return "4-MAN_ATTACK_ASSIST"
when 102
return "4-MAN_ATTACK_ASSIST"
when 103
return "4-MAN_ATTACK_ASSIST"
when 104
return "THROW_FRIEND"
end
# Default action sequence for unassigned Skill IDs.
return "NORMAL_ATTACK" if self.atk_f > 0
return "SKILL_USE"
end
#--------------------------------------------------------------------------
# ● Skill Enhancement Extension Settings
#--------------------------------------------------------------------------
# Multiple extensions may be applied to a skill ID.
# If "CONSUMEHP" is applied along with any other extensions that deal with
# MP in a forumla, it will be HP instead.
# This script WILL have compatibility issues with KGC_MPCostAlter.
#
# "NOEVADE" -Cannot be evaded regardless.
# "CONSUMEHP" -Consumes HP instead of MP.
# "%COSTMAX" -Consumes % of MAXMP. Example: Actor MAXMP500,
# 10 set in Database, MP50 cost.
# "%COSTNOW" -Consumes % of current MP.
# "IGNOREREFLECT" -Ignores damage reflection states.
# "%DAMAGEMAX/30" -Changes damage formula of skill to:
# damage = ENEMY MAX HP * [Integer] / 100
# [Integer] is the number you apply after "/".
# "%DAMAGENOW/30" -Changes damage formula of skill to:
# damage = ENEMY CURRENT HP * [Integer] / 100
# [Integer] is the number you apply after "/".
# "COSTPOWER" -Changes damage formula of skill to:
# damage = base damage * cost / MAX MP
# The more the skill costs, the more damage it will do.
# "HPNOWPOWER" -Changes damage formula of skill to:
# damage = base damage * CURRENT HP / MAX HP
# The less current HP you have, the less damage.
# "MPNOWPOWER" -Changes damage formula of skill to:
# damage = base damage * CURRENT MP / MAX MP
# The less current MP you have, the less damage.
# "NOHALFMPCOST" -"Half MP Cost" from armor options will not apply.
# "HELPHIDE" -Help window when casting will not appear.
# "TARGETALL" -Will affect all enemies and allies simultaneously.
# "RANDOMTARGET" -Target is chosen at random.
# "OTHERS" -Skill will not affect caster.
# "NOOVERKILL" -Damage will not be applied after the target reaches zero HP.
# "NOFLASH" -Battler will not flash when taking action.
# "FAST" -Battler will be the first to take action in the turn
# "SLOW" -Battler will be the last to take action in the turn
# "SPDAMAGE" -Damage is dealt to the target's SP instead of HP.
# "%DMGABSORB/50" -Part of the damage is converted into HP/SP to the user
# of the skill. Recovered % is the number after "/".
# "NONE" -No extension. Used as a default.
def extension
case @id
when 81
return ["SPDAMAGE"]
when 86
return ["NOOVERKILL"]
when 89
return ["RANDOMTARGET"]
when 94
return ["NOOVERKILL"]
when 96
return ["TARGETALL"]
when 98
return ["NOOVERKILL"]
when 99
return ["HELPHIDE","NOFLASH","FAST"]
when 100
return ["NOOVERKILL"]
when 101
return ["HELPHIDE","NOFLASH","FAST"]
when 102
return ["HELPHIDE","NOFLASH","FAST"]
when 103
return ["HELPHIDE","NOFLASH","FAST"]
end
# Default extensions for unassigned Skill IDs.
return ["NONE"]
end
#--------------------------------------------------------------------------
# ● Skill Throwing Weapon Graphic Settings
#--------------------------------------------------------------------------
# - Allows use of a seperate throwing weapon graphic besides the one assigned
# from Iconset.png. This section is specifically for skills.
#
# return "001-Weapon01" <- Weapon image file name. If "", none is used.
# File must be in the .Graphics\Characters folder
# of your project.
def flying_graphic
case @id
when 1
return ""
end
# Default throwing skill graphic for unassigned Weapon IDs.
return ""
end
end
#==============================================================================
# ■ module RPG
#------------------------------------------------------------------------------
# Item Action Settings
#==============================================================================
class RPG::Item
#--------------------------------------------------------------------------
# ● Item ID Sequence Assignment
#--------------------------------------------------------------------------
def base_action
case @id
when 1
return "ITEM_USE"
end
# Default action sequence for unassigned Item IDs.
return "ITEM_USE"
end
#--------------------------------------------------------------------------
# ● Item Enhancement Extension Settings
#--------------------------------------------------------------------------
# "NOEVADE" -Cannot be evaded regardless.
# "IGNOREREFLECT" -Ignores damage reflection states.
# "HELPHIDE" -Help window when casting will not appear.
# "TARGETALL" -Will affect all enemies and allies simultaneously.
# "RANDOMTARGET" -Target is chosen at random.
# "OTHERS" -Item will not affect caster.
# "NOOVERKILL" -Damage will not be applied after the target reaches zero HP.
# "NOFLASH" -Battler will not flash when taking action.
# "FAST" -Battler will be the first to take action in the turn
# "SLOW" -Battler will be the last to take action in the turn
# "NONE" -No extension. Used as a default.
def extension
case @id
when 1
return ["NONE"]
end
# Default extensions for unassigned Item IDs.
return ["NONE"]
end
end
Code:
#==============================================================================
# Sideview Battle System XP Configurations Version 2.2xp
#==============================================================================
# These configurations are exclusive for the RPG Maker XP
# These are new configuration constants used so the script can work on RMXP
# These are essential for the script to work well and smoothly
# These were separated from the previous configuration to allow you
# to use the whole configurations already settled for RMVX.
# To avoid conflicts with the script's basic configuration,
# it is recomended to place this script below the other configuration
# Some requested functions present in other script were added here
# as basic functions of the script, to avoid incompatibility.
#==============================================================================
module N01
# Character Animation Repeat
NEW_PATTERN_REPEAT = true
# true = XP style, the frames will follow this sequence: 1, 2, 3, 4, 1, 2, 3...
# false = VX style, the frames will follow this sequence: 1, 2, 3, 2, 1, 2, 3...
# Choose the Damage Alogarithm
DAMAGE_ALGORITHM_TYPE = 1
# 0 = Default XP Style, no changes
# 1 = Default XP Modified, def/mdef reduces damage in % ( 10 def = 1% )
# 2 = Default VX, Vitality replaces Dexterity, the status Attack, P.Def and
# M.Def are totally ignored. (Edit the menus script to remove these status)
# 3 = Customized, an mix of XP e VX alogarithm, Vitality replaces Dexterity
# Names of the status Evasion and Vitality (Vitality is only used if
# DAMAGE_ALGORITHM_TYPE > 1
STAT_EVA = "Evasion"
STAT_VIT = "Vitality"
# Define here the character's attack power when unarmed.
UNARMED_ATTACK = 10
# Define here the character's attack animation when unarmed.
UNARMED_ANIM = 4
# No animated battler, remaining the same way as the enemies.
# Only let it as true if you want a battle system with completely not animated
# allies.
NO_ANIM_BATTLER = false
# Show status effects balloons on the battles?
BALLOON_ANIM = true
# Show effects' animations on the battles?
STATE_ANIM = true
# EXP division by the number of members on party
EXP_SHARE = true
# Cursor position on the target
# 0 = customizable
# 1 = below the target
# 2 = above the target (adjusts self to the target's height)
CURSOR_TYPE = 1
# Readjust the cursor's position.
CURSOR_POSITION = [ 0, 0]
# Command Window Position
COMMAND_WINDOW_POSITION = [440, 128]
# Show Battler Name window?
BATTLER_NAME_WINDOW = false
# Effects' icons configuration
# Icons must have the same name of effect plus "_st"
# Ex.: Status Venom, must have an icon named "Venom_st"
Icon_max = 5 # Maximum amount of showed icons
Icon_X = 24 # X size of the icon (width)
Icon_Y = 24 # Y size of the icon (height)
X_Adjust = 0 # Readjustment of the X position
Y_Adjust = 0 # Readjustment of the Y position
# State Cycle times
STATE_CYCLE_TIME = 4
# Damage Exhibition configuration
# Red Green Blue
HP_DMG_COLOR = [255, 255, 255] # HP damage color
HP_REC_COLOR = [176, 255, 144] # HP cure color
SP_DMG_COLOR = [144, 96, 255] # SP damage color
SP_REC_COLOR = [255, 144, 255] # SP cure color
CRT_DMG_COLOR = [255, 144, 96] # Critical damage color
CRT_TXT_COLOR = [255, 96, 0] # Critical damage text color
DAMAGE_FONT = "Arial Black" # Damage exhibition font
DMG_F_SIZE = 32 # Size of the damage exhibition font
DMG_DURATION = 40 # Duration, in frames, that the damage stays on screen
CRITIC_TEXT = true # Show text when critical damage is delt?
CRITIC_FLASH = false # Flash effect when critical damage is dealt?
MULTI_POP = false # Style in which the damage is shown true = normal / false = FF styled
POP_MOVE = false # Moviment for damage exhibition?
DMG_SPACE = 12 # Space between the damage digits
DMG_X_MOVE = 2 # X movement of the damage (only if POP_MOVE = true)
DMG_Y_MOVE = 6 # Y movement of the damage
DMG_GRAVITY = 0.98 # Gravity effect, affects on the heeight the damage "jumps"
# Configurations of the Battle Window
STATUS_OPACITY = 160 # Opacity of the Battle Window
MENU_OPACITY = 160 # Opacity of the Item/Skills window
HELP_OPACITY = 160 # Opacity of the Help Window
COMMAND_OPACITY = 160 # Opacity of the Commands Window
HIDE_WINDOW = true # Hide status window when selecting items/skills?
# Name of the sound file used when a dodge occurs.
# This file must be on the Audio/SE folder of your project
EVASION_EFFECT = "015-Jump01"
# Message shown when a flee attempt succeeds
ESCAPE_SUCCESS = "Ran away!!"
# Message shown when a flee attempt fails
ESCAPE_FAIL = "They're too fast!"
# Allow Ambushes to occur?
BACK_ATTACK = true
# Define here the Ambush occurance rate
BACK_ATTACK_RATE = 10
# Define the message shown when an Ambush occurs
BACK_ATTACK_ALERT = "They got us!"
# Invert the character's position when an ambush occurs?
BACK_ATTACK_MIRROR = false
# Invert the battle background when an Ambush occurs?
BACK_ATTACK_BATTLE_BACK_MIRROR = false
# Here you can configurate the system (itens, skills, switchs) to protect
# the character from Ambushes. The item must be equiped, the skill must be
# learned, and switches must be ON so the Ambush protection works.
# Only one of the 3 need to match the requirements to work.
# In other words, the item can be equiped, but the skill not learned and the
# switch OFF for the item's effect to take place.
# For one item/skill/switch only: = [1]
# For multiple: = [1,2]
# Weapons' ID's
NON_BACK_ATTACK_WEAPONS = []
# Shields' ID's
NON_BACK_ATTACK_ARMOR1 = []
# Helmets' ID's
NON_BACK_ATTACK_ARMOR2 = []
# Armors' ID's
NON_BACK_ATTACK_ARMOR3 = []
# Accesories' ID's
NON_BACK_ATTACK_ARMOR4 = []
# Skills' ID's
NON_BACK_ATTACK_SKILLS = []
# Number of the Switch - when ON, the chance for Ambushes is zero
NO_BACK_ATTACK_SWITCH = []
# Number of the Switch - when ON, the chance for Ambushes is 100%
BACK_ATTACK_SWITCH = []
# Allow Preemptive Attacks to occur?
PREEMPTIVE = true
# Define here the occurance rate of Preemptive Attacks
PREEMPTIVE_RATE = 10
# Define here the message shown when a Preemptive Attack occurs
PREEMPTIVE_ALERT = "Surprised the enemy!"
# Here you can configurate the system (itens, skills, switchs) to increase
# the occurance of Preemptive Attacks. The item must be equiped, the skill must
# be learned, and switches must be ON so the Ambush protection works.
# Only one of the 3 need to match the requirements to work.
# In other words, the item can be equiped, but the skill not learned and the
# switch OFF for the item's effect to take place.
# For one item/skill/switch only: = [1]
# For multiple: = [1,2]
# Weapons' ID's
PREEMPTIVE_WEAPONS = []
# Shields' ID's
PREEMPTIVE_ARMOR1 = []
# Helmets' ID's
PREEMPTIVE_ARMOR2 = []
# Armors' ID's
PREEMPTIVE_ARMOR3 = []
# Accesories' ID's
PREEMPTIVE_ARMOR4 = []
# Skills' ID's
PREEMPTIVE_SKILLS = []
# Number of the Switch - when ON, the chance for Preemptive Attacks is zero
NO_PREEMPTIVE_SWITCH = []
# Number of the Switch - when ON, the chance for Preemptive Attacks is 100%
PREEMPTIVE_SWITCH = []
end
Code:
#==============================================================================
# Sideview Battle System Version 2.2xp
#==============================================================================
#==============================================================================
# ■ Sprite_Battler
#==============================================================================
class Sprite_Battler < RPG::Sprite
#--------------------------------------------------------------------------
APPEAR = 3
DISAPPEAR = 4
COLLAPSE = 5
#--------------------------------------------------------------------------
include N01
#--------------------------------------------------------------------------
def initialize(viewport, battler = nil)
super(viewport)
@battler = battler
@battler_visible = false
@effect_type = 0
@effect_duration = 0
@move_x = 0
@move_y = 0
@move_z = 0
@distanse_x = 0
@distanse_y = 0
@moving_x = 0
@moving_y = 0
@move_speed_x = 0
@move_speed_y = 0
@move_speed_plus_x = 0
@move_speed_plus_y = 0
@move_boost_x = 0
@move_boost_y = 0
@jump_time = 0
@jump_time_plus = 0
@jump_up = 0
@jump_down = 0
@jump_size = 0
@float_time = 0
@float_up = 0
@jump_plus = 0
@angle = 0
@angling = 0
@angle_time = 0
@angle_reset = 0
@zoom_x = 0
@zoom_y = 0
@zooming_x = 0
@zooming_y = 0
@zoom_time = 0
@zoom_reset = 0
@target_battler = []
@now_targets = []
@pattern = 0
@pattern_back = false
@wait = 0
@unloop_wait = 0
@action = []
@anime_kind = 0
@anime_speed = 0
@frame = 0
@anime_loop = 0
@anime_end = false
@anime_freeze = false
@anime_freeze_kind = false
@anime_moving = false
@base_width = ANIME_PATTERN
@base_height = ANIME_KIND
@join = false
@width = 0
@height = 0
@picture_time = 0
@individual_targets = []
@balloon_duration = 65
@reverse = false
return @battler_visible = false if @battler == nil
@anime_flug = true if @battler.actor? && !NO_ANIM_BATTLER
@anime_flug = true if !@battler.actor? && @battler.anime_on
@weapon_R = Sprite_Weapon.new(viewport,@battler) if @anime_flug
make_battler
end
#--------------------------------------------------------------------------
def make_battler
@battler.base_position
@battler_hue = @battler.battler_hue
if @anime_flug
@battler_name = @battler.battler_name if !@battler.actor?
@battler_name = @battler.character_name if @battler.actor?
@battler_hue = @battler.character_hue if @battler.actor?
self.mirror = true if !@battler.actor? && @battler.action_mirror
self.mirror = false if !@battler.actor? && @battler.action_mirror and $back_attack
self.bitmap = RPG::Cache.character(@battler_name, @battler_hue) if WALK_ANIME
begin
self.bitmap = RPG::Cache.character(@battler_name + "_1", @battler_hue) unless WALK_ANIME
rescue
self.bitmap = RPG::Cache.character(@battler_name, @battler_hue) unless WALK_ANIME
end
@width = self.bitmap.width / @base_width
@height = self.bitmap.height / @base_height
@sx = @pattern * @width
@sy = @anime_kind * @height
self.src_rect.set(@sx, @sy, @width, @height)
else
@battler_name = @battler.battler_name
self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
@width = bitmap.width
@height = bitmap.height
end
unless @back_attack_flug
if self.mirror && $back_attack
self.mirror = false
elsif $back_attack
self.mirror = true
end
@back_attack_flug = true
end
@battler.reset_coordinate
self.ox = @width / 2
self.oy = @height * 2 / 3
update_move
@move_anime = Sprite_MoveAnime.new(viewport,battler)
@picture = Sprite.new
make_shadow if SHADOW
end
#--------------------------------------------------------------------------
def update_battler_graphic
return if @graphic_change or !WALK_ANIME or @anime_freeze or @battler.dead?
if @battler.actor? and @anime_flug
@battler.base_position
@battler_name = @battler.character_name if @battler.actor?
@battler_hue = @battler.character_hue if @battler.actor?
self.bitmap = RPG::Cache.character(@battler_name, @battler_hue)if WALK_ANIME
begin
self.bitmap = RPG::Cache.character(@battler_name + "_1", @battler_hue) unless WALK_ANIME
rescue
self.bitmap = RPG::Cache.character(@battler_name, @battler_hue) unless WALK_ANIME
end
@width = self.bitmap.width / @base_width
@height = self.bitmap.height / @base_height
@sx = @pattern * @width
@sy = @anime_kind * @height
self.src_rect.set(@sx, @sy, @width, @height)
self.ox = @width / 2
self.oy = @height * 2 / 3
end
unless @back_attack_flug
if self.mirror && $back_attack
self.mirror = false
elsif $back_attack
self.mirror = true
end
@back_attack_flug = true
end
end
#--------------------------------------------------------------------------
def make_shadow
@shadow.dispose if @shadow != nil
@battler_hue = @battler.battler_hue
@shadow = Sprite.new(viewport)
@shadow.z = 200
@shadow.visible = false
@shadow.bitmap = RPG::Cache.character(@battler.shadow, @battler_hue)
@shadow_height = @shadow.bitmap.height
@shadow_plus_x = @battler.shadow_plus[0] - @width / 2
@shadow_plus_y = @battler.shadow_plus[1]
@shadow.zoom_x = @width * 1.0 / @shadow.bitmap.width
update_shadow
@skip_shadow = true
end
#--------------------------------------------------------------------------
def dispose
self.bitmap.dispose if self.bitmap != nil
@weapon_R.dispose if @weapon_R != nil
@move_anime.dispose if @move_anime != nil
@picture.dispose if @picture != nil
@shadow.dispose if @shadow != nil
@balloon.dispose if @balloon != nil
mirage_off
super
end
#--------------------------------------------------------------------------
def damage_action(action)
if action[0] == "absorb"
action[0] = nil
now_hp = @battler.hp
now_sp = @battler.sp
@battler.hp += action[3] if action[2] == "hp"
@battler.sp += action[3] if action[2] == "sp"
@battler.damage = now_hp - @battler.hp if action[2] == "hp"
@battler.damage = now_sp - @battler.sp if action[2] == "sp"
@battler.sp_damage = true if @battler.damage != 0 && action[2] == "sp"
action[2] = false
end
unless @battler.evaded or @battler.missed or action[0] == nil
@battler.animation_id = action[0]
@battler.animation_hit = true
@battler.anime_mirror = action[1]
end
dmg = @battler.damage
dmg = 0 unless dmg.is_a?(Numeric)
start_action(@battler.damage_hit) if dmg > 0 && action[2]
if @battler.evaded or @battler.missed
start_action(@battler.evasion) if action[2]
Audio.se_play("Audio/SE/" + EVASION_EFFECT) if action[2]
end
damage_pop
end
#--------------------------------------------------------------------------
def damage_pop
damage(@battler.damage, @battler.critical, @battler.sp_damage)
@battler.damage = nil
@battler.sp_damage = false
@battler.critical = false
@battler.damage_pop = false
end
#--------------------------------------------------------------------------
def first_action
action = @battler.first_action unless @battler.restriction == 4
action = $data_states[@battler.state_id].base_action if @battler.states[0] != nil && @battler.restriction == 4
start_action(action)
@skip_shadow = false
end
#--------------------------------------------------------------------------
def start_action(kind)
reset
stand_by
@action = ACTION[kind].dup
active = @action.shift
@action.push("End")
@active_action = ANIME[active]
@wait = active.to_i if @active_action == nil
action
end
#--------------------------------------------------------------------------
def start_one_action(kind,back)
reset
stand_by
@action = [back]
@action.push("End")
@active_action = ANIME[kind]
action
end
#--------------------------------------------------------------------------
def next_action
return @wait -= 1 if @wait > 0
return if @anime_end == false
return @unloop_wait -= 1 if @unloop_wait > 0
active = @action.shift
@active_action = ANIME[active]
@wait = active.to_i if @active_action == nil
action
end
#--------------------------------------------------------------------------
def stand_by
@repeat_action = @battler.normal
@repeat_action = @battler.pinch if @battler.hp <= @battler.maxhp / 4
@repeat_action = @battler.defence if @battler.guarding?
unless @battler.state_id == nil
for state in @battler.battler_states.reverse
next if state.extension.include?("NOSTATEANIME")
next if @battler.is_a?(Game_Enemy) && state.extension.include?("EXCEPTENEMY")
@repeat_action = state.base_action
end
end
end
#--------------------------------------------------------------------------
def push_stand_by
action = @battler.normal
action = @battler.pinch if @battler.hp <= @battler.maxhp / 4
action = @battler.defence if @battler.guarding?
for state in @battler.battler_states.reverse
next if state.extension.include?("NOSTATEANIME")
next if @battler.is_a?(Game_Enemy) && state.extension.include?("EXCEPTENEMY")
action = state.base_action
end
@repeat_action = action
@action.delete("End")
act = ACTION[action].dup
for i in 0...act.size
@action.push(act[i])
end
@action.push("End")
@anime_end = true
@angle = self.angle = 0
end
#--------------------------------------------------------------------------
def reset
self.zoom_x = self.zoom_y = 1
self.oy = @height * 2 / 3
@angle = self.angle = 0
@anime_end = true
@non_repeat = false
@anime_freeze = false
@unloop_wait = 0
end
#--------------------------------------------------------------------------
def jump_reset
@battler.jump = @jump_time = @jump_time_plus = @jump_up = @jump_down = 0
@jump_size = @jump_plus = @float_time = @float_up = 0
end
#--------------------------------------------------------------------------
def get_target(target)
return if @battler.individual
@target_battler = target
end
#--------------------------------------------------------------------------
def send_action(action)
@battler.play = 0
@battler.play = action if @battler.active
end
#--------------------------------------------------------------------------
def battler_join
if @battler.exist? && !@battler_visible
return if !@battler.exist? and @battler.is_a?(Game_Enemy)
if @battler.revival && @anime_flug
return @battler.revival = false
elsif @battler.revival && !@anime_flug
@battler.revival = false
return self.visible = true
end
@anime_flug = true if @battler.actor? && !NO_ANIM_BATTLER
@anime_flug = true if !@battler.actor? && @battler.anime_on
make_battler
first_action if !@battler.actor?
end
first_action if @battler.actor? and !@battler_visible
end
#--------------------------------------------------------------------------
def update
super
return self.bitmap = nil && loop_animation(nil) if @battler == nil
battler_join
next_action
update_battler_graphic
update_anime_pattern
update_target
update_force_action
update_move
update_shadow if @shadow != nil
@weapon_R.update if @weapon_action
update_float if @float_time > 0
update_angle if @angle_time > 0
update_zoom if @zoom_time > 0
update_mirage if @mirage_flug
update_picture if @picture_time > 0
update_move_anime if @anime_moving
update_balloon if @balloon_duration <= 64
damage_pop if @battler.damage_pop
setup_new_effect
update_effect
update_battler_bitmap
end
#--------------------------------------------------------------------------
def update_anime_pattern
return @frame -= 1 if @frame != 0
@weapon_R.action if @weapon_action && @weapon_R != nil
if NEW_PATTERN_REPEAT
if @pattern_back
if @anime_loop == 0
if @reverse
@pattern -= 1
@pattern = (@pattern < 0 ? @base_width - 1 : @pattern)
if @pattern == -1
@pattern_back = false
@anime_end = true
end
else
@pattern += 1
@pattern = (@pattern > @base_width - 1 ? 0 : @pattern)
if @pattern == @base_width
@pattern_back = false
@anime_end = true
end
end
else
@anime_end = true
if @anime_loop == 1
@pattern = 0 if !@reverse
@pattern = @base_width - 1 if @reverse
@pattern_back = false
end
end
else
if @reverse
@pattern -= 1
@pattern = (@pattern < 0 ? @base_width - 1 : @pattern)
@pattern_back = true if @pattern == 0
else
@pattern += 1
@pattern = (@pattern > @base_width - 1 ? 0 : @pattern)
@pattern_back = true if @pattern == @base_width - 1
end
end
else
if @pattern_back
if @anime_loop == 0
if @reverse
@pattern += 1
if @pattern == @base_width - 1
@pattern_back = false
@anime_end = true
end
else
@pattern -= 1
if @pattern == 0
@pattern_back = false
@anime_end = true
end
end
else
@anime_end = true
if @anime_loop == 1
@pattern = 0 if !@reverse
@pattern = @base_width - 1 if @reverse
@pattern_back = false
end
end
else
if @reverse
@pattern -= 1
@pattern_back = true if @pattern == 0
else
@pattern += 1
@pattern_back = true if @pattern == @base_width - 1
end
end
end
@frame = @anime_speed
return if @anime_freeze
return unless @anime_flug
@sx = @pattern * @width
@sy = @anime_kind * @height
self.src_rect.set(@sx, @sy, @width, @height)
end
#--------------------------------------------------------------------------
def update_target
return if @battler.force_target == 0
return if @battler.individual
@target_battler = @battler.force_target[1]
@battler.force_target = 0
end
#--------------------------------------------------------------------------
def update_force_action
action = @battler.force_action
return if action == 0
@battler.force_action = 0
return if @battler.active
return collapse_action if action[0] == "N01collapse"
return start_one_action(action[2],action[1]) if action[0] == "SINGLE"
start_action(action[2])
return if action[1] == ""
@action.delete("End")
@action.push(action[1])
@action.push("End")
end
#--------------------------------------------------------------------------
def update_move
if @move_speed_plus_x > 0
@move_x += @moving_x
@battler.move_x = @move_x
@move_speed_plus_x -= 1
elsif @move_speed_x > 0
if @move_boost_x != 0
@moving_x += @move_boost_x
end
@move_x += @moving_x
@battler.move_x = @move_x
@move_speed_x -= 1
end
if @move_speed_plus_y > 0
@move_y += @moving_y
@battler.move_y = @move_y
@move_speed_plus_y -= 1
elsif @move_speed_y > 0
if @move_boost_y != 0
@moving_y += @move_boost_y
end
@move_y += @moving_y
@battler.move_y = @move_y
@move_speed_y -= 1
end
if @jump_up != 0
@jump_plus += @jump_up
@battler.jump = @jump_plus
@jump_up = @jump_up / 2
@jump_time -= 1
if @jump_time == 0 or @jump_up == @jump_sign
@jump_down = @jump_up * 2 * @jump_sign * @jump_sign2
@jump_time_plus += @jump_time * 2
@jump_up = 0
return
end
end
if @jump_down != 0
if @jump_time_plus != 0
@jump_time_plus -= 1
elsif @jump_down != @jump_size
@jump_plus += @jump_down
@battler.jump = @jump_plus
@jump_down = @jump_down * 2
if @jump_down == @jump_size
if @jump_flug
@jump_flug = false
else
@jump_plus += @jump_down
@battler.jump = @jump_plus
@jump_down = @jump_size = 0
end
end
end
end
self.x = @battler.position_x
self.y = @battler.position_y
self.z = @battler.position_z
end
#--------------------------------------------------------------------------
def update_shadow
@shadow.opacity = self.opacity
@shadow.x = self.x + @shadow_plus_x
@shadow.y = self.y + @shadow_plus_y - @jump_plus
end
#--------------------------------------------------------------------------
def update_float
@float_time -= 1
@jump_plus += @float_up
@battler.jump = @jump_plus
end
#--------------------------------------------------------------------------
def update_angle
@angle += @angling
self.angle = @angle
@angle_time -= 1
return @angle = 0 if @angle_time == 0
self.angle = 0 if @angle_reset
end
#--------------------------------------------------------------------------
def update_zoom
@zoom_x += @zooming_x
@zoom_y += @zooming_y
self.zoom_x = @zoom_x
self.zoom_y = @zoom_y
@zoom_time -= 1
return if @zoom_time != 0
@zoom_x = @zoom_y = 0
self.oy = @height
self.zoom_x = self.zoom_y = 1 if @zoom_reset
end
#--------------------------------------------------------------------------
def update_mirage
mirage(@mirage0) if @mirage_count == 1
mirage(@mirage1) if @mirage_count == 3
mirage(@mirage2) if @mirage_count == 5
@mirage_count += 1
@mirage_count = 0 if @mirage_count == 6
end
#--------------------------------------------------------------------------
def update_picture
@picture_time -= 1
@picture.x += @moving_pic_x
@picture.y += @moving_pic_y
end
#--------------------------------------------------------------------------
def update_move_anime
@move_anime.update
@anime_moving = false if @move_anime.finish?
@move_anime.action_reset if @move_anime.finish?
end
#--------------------------------------------------------------------------
def setup_new_effect
if @battler.blink
blink_on
else
blink_off
end
if @battler.white_flash
whiten
@battler.white_flash = false
end
effects_update
if not @battler_visible and @battler.exist?
@effect_type = APPEAR
@effect_duration = 16
@battler_visible = true
end
if @battler_visible and @battler.hidden
@effect_type = DISAPPEAR
@effect_duration = 32
@battler_visible = false
end
if @battler.collapse
@effect_type = COLLAPSE
@effect_duration = 48
@battler.collapse = false
@battler_visible = false
end
if @battler_visible && @battler.animation_id != 0
animation = $data_animations[@battler.animation_id]
@battler.animation_hit = true unless @battler.evaded or @battler.missed
animation(animation, @battler.animation_hit)
if @active_battler.is_a?(Game_Enemy)
if @battler.actor? and @battler.anime_mirror
@battler.anime_mirror = false
elsif @battler.actor? and !@battler.anime_mirror
@battler.anime_mirror = true
end
end
animation_mirror(@battler.anime_mirror)
@battler.animation_id = 0
@battler.anime_mirror = false
end
end
#--------------------------------------------------------------------------
def effects_update
if @battler.damage == nil and @battler.state_animation_id != @state_animation_id and STATE_ANIM and @battler_visible
@state_animation_id = @battler.state_animation_id == nil ? 0 : @battler.state_animation_id
loop_animation($data_animations[@state_animation_id])
end
end
#--------------------------------------------------------------------------
def update_effect
if @effect_duration > 0
@effect_duration -= 1
case @effect_type
when APPEAR
update_appear
when DISAPPEAR
update_disappear
when COLLAPSE
update_collapse
end
end
end
#--------------------------------------------------------------------------
def update_whiten
self.blend_type = 0
self.color.set(255, 255, 255, 128)
self.opacity = 255
self.color.alpha = 128 - (16 - @effect_duration) * 10
end
#--------------------------------------------------------------------------
def update_appear
self.blend_type = 0
self.color.set(0, 0, 0, 0)
self.opacity = (16 - @effect_duration) * 16
end
#--------------------------------------------------------------------------
def update_disappear
self.blend_type = 0
self.color.set(0, 0, 0, 0)
self.opacity = 256 - (32 - @effect_duration) * 10
end
#--------------------------------------------------------------------------
def update_collapse
normal_collapse if @collapse_type == 2
boss_collapse if @collapse_type == 3
end
#--------------------------------------------------------------------------
def update_balloon
@balloon_duration -= 1 if @balloon_duration > 0 && !@balloon_back
@balloon_duration += 1 if @balloon_back
if @balloon_duration == 64
@balloon_back = false
@balloon.visible = false
elsif @balloon_duration == 0
@balloon.visible = false if @balloon_loop == 0
@balloon_back = true if @balloon_loop == 1
end
@balloon.x = self.x
@balloon.y = self.y
@balloon.z = self.y
@balloon.opacity = self.opacity
sx = 7 * 32 if @balloon_duration < 12
sx = (7 - (@balloon_duration - 12) / 8) * 32 unless @balloon_duration < 12
@balloon.src_rect.set(sx, @balloon_id * 32, 32, 32)
@balloon.visible = false if @battler.dead?
end
#--------------------------------------------------------------------------
def update_battler_bitmap
return if @graphic_change
return if @battler.actor?
if @battler.battler_name != @battler_name or @battler.battler_hue != @battler_hue
@battler_name = @battler.battler_name
@battler_hue = @battler.battler_hue
make_battler
self.opacity = 0 if @battler.dead? or @battler.hidden
end
end
#--------------------------------------------------------------------------
def action
return if @active_action == nil
action = @active_action[0]
return mirroring if action == "Invert"
return angling if action == "angle"
return zooming if action == "zoom"
return mirage_on if action == "Afterimage ON"
return mirage_off if action == "Afterimage OFF"
return picture if action == "pic"
return @picture.visible = false && @picture_time = 0 if action == "Clear image"
return graphics_change if action == "change"
return battle_anime if action == "anime"
return balloon_anime if action == "balloon"
return sound if action == "sound"
return $game_switches[@active_action[1]] = @active_action[2] if action == "switch"
return variable if action == "variable"
return two_swords if action == "Two Wpn Only"
return non_two_swords if action == "One Wpn Only"
return necessary if action == "nece"
return derivating if action == "der"
return individual_action if action == "Process Skill"
return individual_action_end if action == "Process Skill End"
return non_repeat if action == "Don't Wait"
return @battler.change_base_position(self.x, self.y) if action == "Start Pos Change"
return @battler.base_position if action == "Start Pos Return"
return change_target if action == "target"
return send_action(action) if action == "Can Collapse"
return send_action(action) if action == "Cancel Action"
return state_on if action == "sta+"
return state_off if action == "sta-"
return Graphics.frame_rate = @active_action[1] if action == "fps"
return floating if action == "float"
return eval(@active_action[1]) if action == "script"
return force_action if @active_action.size == 4
return reseting if @active_action.size == 5
return moving if @active_action.size == 7
return battler_anime if @active_action.size == 9
return moving_anime if @active_action.size == 11
return anime_finish if action == "End"
end
#--------------------------------------------------------------------------
def mirroring
if self.mirror
self.mirror = false
@weapon_R.mirroring if @anime_flug
else
self.mirror = true
@weapon_R.mirroring if @anime_flug
end
end
#--------------------------------------------------------------------------
def angling
jump_reset
@angle_time = @active_action[1]
start_angle = @active_action[2]
end_angle = @active_action[3]
@angle_reset = @active_action[4]
start_angle *= -1 if $back_attack
end_angle *= -1 if $back_attack
start_angle *= -1 if @battler.is_a?(Game_Enemy)
end_angle *= -1 if @battler.is_a?(Game_Enemy)
if @angle_time <= 0
self.angle = end_angle
return @angle_time = 0
end
@angling = (end_angle - start_angle) / @angle_time
@angle = (end_angle - start_angle) % @angle_time + start_angle
end
#--------------------------------------------------------------------------
def zooming
jump_reset
@zoom_time = @active_action[1]
zoom_x = @active_action[2] - 1
zoom_y = @active_action[3] - 1
@zoom_reset = @active_action[4]
@zoom_x = @zoom_y = 1
return @zoom_time = 0 if @zoom_time <= 0
@zooming_x = zoom_x / @zoom_time
@zooming_y = zoom_y / @zoom_time
end
#--------------------------------------------------------------------------
def mirage_on
return if @battler.dead?
@mirage0 = Sprite.new(self.viewport)
@mirage1 = Sprite.new(self.viewport)
@mirage2 = Sprite.new(self.viewport)
@mirage_flug = true
@mirage_count = 0
end
#--------------------------------------------------------------------------
def mirage(body)
body.bitmap = self.bitmap.dup
body.x = self.x
body.y = self.y
body.ox = self.ox
body.oy = self.oy
body.z = self.z
body.mirror = self.mirror
body.angle = @angle
body.opacity = 160
body.zoom_x = self.zoom_x
body.zoom_y = self.zoom_y
body.src_rect.set(@sx, @sy, @width, @height) if @anime_flug
body.src_rect.set(0, 0, @width, @height) unless @anime_flug
end
#--------------------------------------------------------------------------
def mirage_off
@mirage_flug = false
@mirage0.dispose if @mirage0 != nil
@mirage1.dispose if @mirage1 != nil
@mirage2.dispose if @mirage2 != nil
end
#--------------------------------------------------------------------------
def picture
pic_x = @active_action[1]
pic_y = @active_action[2]
pic_end_x = @active_action[3]
pic_end_y = @active_action[4]
@picture_time = @active_action[5]
@moving_pic_x = (pic_end_x - pic_x)/ @picture_time
@moving_pic_y = (pic_end_y - pic_y)/ @picture_time
plus_x = (pic_end_x - pic_x)% @picture_time
plus_y = (pic_end_y - pic_y)% @picture_time
@picture.bitmap = RPG::Cache.picture(@active_action[7])
@picture.x = pic_x + plus_x
@picture.y = pic_y + plus_y
@picture.z = 1
@picture.z = 1900
@picture.z = 3000 if @active_action[6]
@picture.visible = true
end
#--------------------------------------------------------------------------
def graphics_change
return if @battler.is_a?(Game_Enemy)
@battler_name = @active_action[2]
@bitmap = RPG::Cache.character(@battler_name , @battler_hue) if WALK_ANIME
@bitmap = RPG::Cache.character(@battler_name + "_1", @battler_hue) unless WALK_ANIME
@width = @bitmap.width / @base_width
@height = @bitmap.height / @base_height
@battler.graphic_change(@active_action[2]) unless @active_action[1]
@graphic_change = true
end
#--------------------------------------------------------------------------
def battle_anime
return if @active_action[5] && !@battler.actor?
return if @active_action[5] && @battler.weapons[1] == nil
if @battler.actor?
return if !@active_action[5] && @battler.weapons[0] == nil && @battler.weapons[1] != nil
end
anime_id = @active_action[1]
if $back_attack
mirror = true if @active_action[3] == false
mirror = false if @active_action[3]
end
if anime_id < 0
if @battler.current_action.kind == 1 && anime_id != -2
anime_id = $data_skills[@battler.current_action.skill_id].animation2_id
elsif @battler.current_action.kind == 2 && anime_id != -2
anime_id = $data_items[@battler.current_action.item_id].animation2_id
else
anime_id = NO_WEAPON
if @battler.actor?
weapon_id = @battler.weapon_id
anime_id = UNARMED_ANIM
anime_id = battler.weapons[0].animation2_id if battler.weapons[0] != nil
anime_id = battler.weapons[1].animation2_id if @active_action[5]
else
weapon_id = @battler.weapon
anime_id = $data_weapons[weapon_id].animation2_id if weapon_id != 0
end
end
@wait = $data_animations[anime_id].frame_max if $data_animations[anime_id] != nil && @active_action[4]
waitflug = true
damage_action = [anime_id, mirror, true]
return @battler.play = ["OBJ_ANIM",damage_action] if @battler.active
end
if @active_action[2] == 0 && $data_animations[anime_id] != nil
@battler.animation_id = anime_id
@battler.animation_hit = true
@battler.anime_mirror = mirror
elsif $data_animations[anime_id] != nil
for target in @target_battler
target.animation_id = anime_id
target.anime_mirror = mirror
end
end
@wait = $data_animations[anime_id].frame_max if $data_animations[anime_id] != nil && @active_action[4] && !waitflug
end
#--------------------------------------------------------------------------
def sound
pitch = @active_action[2]
vol = @active_action[3]
name = @active_action[4]
case @active_action[1]
when "se"
Audio.se_play("Audio/SE/" + name, vol, pitch)
when "bgm"
if @active_action[4] == ""
now_bgm = RPG::BGM.last
name = now_bgm.name
end
Audio.bgm_play("Audio/BGM/" + name, vol, pitch)
when "bgs"
if @active_action[4] == ""
now_bgs = RPG::BGS.last
name = now_bgs.name
end
Audio.bgs_play("Audio/BGS/" + name, vol, pitch)
end
end
#--------------------------------------------------------------------------
def balloon_anime
return if self.opacity == 0
if @balloon == nil
@balloon = Sprite.new
@balloon.bitmap = RPG::Cache.picture("Balloon")
@balloon.ox = @width / 16
@balloon.oy = 320 / 10 + @height / 3
end
@balloon_id = @active_action[1]
@balloon_loop = @active_action[2]
@balloon_duration = 64
@balloon_back = false
update_balloon
@balloon.visible = true
@balloon.visible = false unless BALLOON_ANIM
end
#--------------------------------------------------------------------------
def variable
operand = @active_action[3]
case @active_action[2]
when 0
$game_variables[@active_action[1]] = operand
when 1
$game_variables[@active_action[1]] += operand
when 2
$game_variables[@active_action[1]] -= operand
when 3
$game_variables[@active_action[1]] *= operand
when 4
$game_variables[@active_action[1]] /= operand
when 5
$game_variables[@active_action[1]] %= operand
end
end
#--------------------------------------------------------------------------
def two_swords
return @action.shift unless @battler.actor?
return @action.shift if @battler.weapons[1] == nil
active = @action.shift
@active_action = ANIME[active]
@wait = active.to_i if @active_action == nil
action
end
#--------------------------------------------------------------------------
def non_two_swords
return unless @battler.actor?
return @action.shift if @battler.weapons[1] != nil
active = @action.shift
@active_action = ANIME[active]
@wait = active.to_i if @active_action == nil
action
end
#--------------------------------------------------------------------------
def necessary
nece1 = @active_action[3]
nece2 = @active_action[4]
case @active_action[1]
when 0
target = [$game_party.actors[@battler.index]] if @battler.actor?
target = [$game_troop.enemies[@battler.index]] if @battler.is_a?(Game_Enemy)
when 1
target = @target_battler
when 2
target = $game_troop.enemies
when 3
target = $game_party.actors
end
return start_action(@battler.recover_action) if target.size == 0
case @active_action[2]
when 0
state_on = true if nece2 > 0
state_member = nece2.abs
if nece2 == 0
state_member = $game_party.actors.size if @battler.actor?
state_member = $game_troop.enemies.size if @battler.is_a?(Game_Enemy)
end
for member in target
state_member -= 1 if member.state?(nece1)
end
if state_member == 0 && state_on
return
elsif state_member == nece2.abs
return if state_on == nil
end
when 1
num_over = true if nece2 > 0
num = 0
for member in target
case nece1
when 0
num += member.hp
when 1
num += member.mp
when 2
num += member.atk
when 3
num += member.dex
when 4
num += member.agi
when 5
num += member.int
end
end
num = num / target.size
if num > nece2.abs && num_over
return
elsif num < nece2.abs
return if num_over == nil
end
when 2
if $game_switches[nece1]
return if nece2
else
return unless nece2
end
when 3
if nece2 > 0
return if $game_variables[nece1] > nece2
else
return unless $game_variables[nece1] > nece2.abs
end
when 4
skill_member = nece2.abs
for member in target
skill_member -= 1 if member.skill_learn?(nece1)
return if skill_member == 0
end
end
return @action = ["End"] if @non_repeat
action = @battler.recover_action
action = @battler.defence if @battler.guarding?
return start_action(action)
end
#--------------------------------------------------------------------------
def derivating
return unless @active_action[2] && !@battler.skill_learn?(@active_action[3])
return if rand(100) > @active_action[1]
@battler.derivation = @active_action[3]
@action = ["End"]
end
#--------------------------------------------------------------------------
def individual_action
@battler.individual = true
@individual_act = @action.dup
send_action(["Individual"])
@individual_targets = @target_battler.dup
@target_battler = [@individual_targets.shift]
end
#--------------------------------------------------------------------------
def individual_action_end
return @battler.individual = false if @individual_targets.size == 0
@action = @individual_act.dup
@target_battler = [@individual_targets.shift]
end
#--------------------------------------------------------------------------
def non_repeat
@repeat_action = []
@non_repeat = true
anime_finish
end
#--------------------------------------------------------------------------
def change_target
return @target_battler = @now_targets.dup if @active_action[2] == 3
target = [@battler] if @active_action[2] == 0
target = @target_battler.dup if @active_action[2] != 0
if @active_action[2] == 2
@now_targets = @target_battler.dup
@target_battler = []
end
if @active_action[1] >= 1000
members = $game_party.actors if @battler.actor?
members = $game_troop.enemies unless @battler.actor?
index = @active_action[1] - 1000
if index < members.size
if members[index].exist? && @battler.index != index
members[index].force_target = ["N01target_change", target]
@target_battler = [members[index]] if @active_action[2] == 2
change = true
else
for member in members
next if @battler.index == member.index
next unless member.exist?
member.force_target = ["N01target_change", target]
@target_battler = [member] if @active_action[2] == 2
break change = true
end
end
end
elsif @active_action[1] > 0
for member in $game_party.actors + $game_troop.enemies
if member.state?(@active_action[1])
member.force_target = ["N01target_change", target]
@target_battler.push(member) if @active_action[2] == 2
change = true
end
end
elsif @active_action[1] < 0
skill_id = @active_action[1].abs
for actor in $game_party.actors
if actor.skill_learn?(skill_id)
actor.force_target = ["N01target_change", target]
@target_battler.push(target) if @active_action[2] == 2
change = true
end
end
else
for member in @target_battler
member.force_target = ["N01target_change", target]
@target_battler.push(member) if @active_action[2] == 2
change = true
end
end
return if change
return @action = ["End"] if @non_repeat
return start_action(@battler.recover_action)
end
#--------------------------------------------------------------------------
def state_on
state_id = @active_action[2]
case @active_action[1]
when 0
@battler.add_state(state_id)
when 1
if @target_battler != nil
for target in @target_battler
target.add_state(state_id)
end
end
when 2
for target in $game_troop.enemies
target.add_state(state_id)
end
when 3
for target in $game_party.actors
target.add_state(state_id)
end
when 4
for target in $game_party.actors
if target.index != @battler.index
target.add_state(state_id)
end
end
end
start_action(@battler.recover_action) unless @battler.movable?
end
#--------------------------------------------------------------------------
def state_off
state_id = @active_action[2]
case @active_action[1]
when 0
@battler.remove_state(state_id)
when 1
if @target_battler != nil
for target in @target_battler
target.remove_state(state_id)
end
end
when 2
for target in $game_troop.enemies
target.remove_state(state_id)
end
when 3
for target in $game_party.actors
target.remove_state(state_id)
end
when 4
for target in $game_party.actors
if target.index != @battler.index
target.remove_state(state_id)
end
end
end
end
#--------------------------------------------------------------------------
def floating
jump_reset
@jump_plus = @active_action[1]
float_end = @active_action[2]
@float_time = @active_action[3]
@float_up = (float_end - @jump_plus)/ @float_time
@wait = @float_time
if @anime_flug
move_anime = ANIME[@active_action[4]]
if move_anime != nil
@active_action = move_anime
battler_anime
@anime_end = true
end
end
@battler.jump = @jump_plus
end
#--------------------------------------------------------------------------
def force_action
kind = @active_action[0]
rebirth = @active_action[2]
play = @active_action[3]
action = [kind,rebirth,play]
if @active_action[1] >= 1000
members = $game_party.actors if @battler.actor?
members = $game_troop.enemies unless @battler.actor?
index = @active_action[1] - 1000
if index < members.size
if members[index].exist? && @battler.index != index
return members[index].force_action = action
else
for target in members
next if @battler.index == target.index
next unless target.exist?
force = true
break target.force_action = action
end
end
end
return if force
return @action = ["End"] if @non_repeat
return start_action(@battler.recover_action)
elsif @active_action[1] == 0
for target in @target_battler
target.force_action = action if target != nil
end
elsif @active_action[1] > 0
for target in $game_party.actors + $game_troop.enemies
target.force_action = action if target.state?(@active_action[1])
end
elsif @active_action[1] < 0
return if @battler.is_a?(Game_Enemy)
for actor in $game_party.actors
unless actor.id == @battler.id
actor.force_action = action if actor.skill_id_learn?(@active_action[1].abs)
end
end
end
end
#--------------------------------------------------------------------------
def reseting
jump_reset
self.angle = 0
@distanse_x = @move_x * -1
@distanse_y = @move_y * -1
@move_speed_x = @active_action[1]
@move_speed_y = @move_speed_x
@move_boost_x = @active_action[2]
@move_boost_y = @move_boost_x
@jump = @active_action[3]
move_distance
if @anime_flug
move_anime = ANIME[@active_action[4]]
if move_anime != nil
@active_action = move_anime
battler_anime
end
@anime_end = true
end
end
#--------------------------------------------------------------------------
def moving
jump_reset
xx = @active_action[1]
xx *= -1 if $back_attack
case @active_action[0]
when 0
@distanse_x = xx
@distanse_y = @active_action[2]
when 1
if @target_battler == nil
@distanse_x = xx
@distanse_y = @active_action[2]
else
target_x = 0
target_y = 0
time = 0
for i in 0...@target_battler.size
if @target_battler[i] != nil
time += 1
target_x += @target_battler[i].position_x
target_y += @target_battler[i].position_y
end
end
if time == 0
@distanse_x = xx
@distanse_y = @active_action[2]
else
target_x = target_x / time
target_y = target_y / time
@distanse_y = target_y - self.y + @active_action[2]
if @battler.actor?
@distanse_x = target_x - self.x + xx
else
@distanse_x = self.x - target_x + xx
end
end
end
when 2
if @battler.actor?
@distanse_x = xx - self.x
@distanse_x = 640 + xx - self.x if $back_attack
else
@distanse_x = self.x - xx
@distanse_x = self.x - (Graphics.width + xx) if $back_attack
end
@distanse_y = @active_action[2] - self.y
when 3
if @battler.actor?
@distanse_x = xx + @battler.base_position_x - self.x
else
@distanse_x = xx + self.x - @battler.base_position_x
end
@distanse_y = @active_action[2] + @battler.base_position_y - @battler.position_y
end
@move_speed_x = @active_action[3]
@move_speed_y = @active_action[3]
@move_boost_x = @active_action[4]
@move_boost_y = @active_action[4]
@jump = @active_action[5]
@jump_plus = 0
move_distance
if @anime_flug
move_anime = ANIME[@active_action[6]]
if move_anime != nil
@active_action = move_anime
battler_anime
end
@anime_end = true
end
end
#--------------------------------------------------------------------------
def move_distance
if @move_speed_x == 0
@moving_x = 0
@moving_y = 0
else
@moving_x = @distanse_x / @move_speed_x
@moving_y = @distanse_y / @move_speed_y
over_x = @distanse_x % @move_speed_x
over_y = @distanse_y % @move_speed_y
@move_x += over_x
@move_y += over_y
@battler.move_x = @move_x
@battler.move_y = @move_y
@distanse_x -= over_x
@distanse_y -= over_y
end
if @distanse_x == 0
@move_speed_x = 0
end
if @distanse_y == 0
@move_speed_y = 0
end
boost_x = @moving_x
move_x = 0
if @move_boost_x > 0 && @distanse_x != 0
if @distanse_x == 0
@move_boost_x = 0
elsif @distanse_x < 0
@move_boost_x *= -1
end
for i in 0...@move_speed_x
boost_x += @move_boost_x
move_x += boost_x
over_distance = @distanse_x - move_x
if @distanse_x > 0 && over_distance < 0
@move_speed_x = i
break
elsif @distanse_x < 0 && over_distance > 0
@move_speed_x = i
break
end
end
before = over_distance + boost_x
@move_speed_plus_x = (before / @moving_x).abs
@move_x += before % @moving_x
@battler.move_x = @move_x
elsif @move_boost_x < 0 && @distanse_x != 0
if @distanse_x == 0
@move_boost_x = 0
elsif @distanse_x < 0
@move_boost_x *= -1
end
for i in 0...@move_speed_x
boost_x += @move_boost_x
move_x += boost_x
lost_distance = @distanse_x - move_x
before = lost_distance
if @distanse_x > 0 && boost_x < 0
@move_speed_x = i - 1
before = lost_distance + boost_x
break
elsif @distanse_x < 0 && boost_x > 0
@move_speed_x= i - 1
before = lost_distance + boost_x
break
end
end
plus = before / @moving_x
@move_speed_plus_x = plus.abs
@move_x += before % @moving_x
@battler.move_x = @move_x
end
boost_y = @moving_y
move_y = 0
if @move_boost_y > 0 && @distanse_y != 0
if @distanse_y == 0
@move_boost_y = 0
elsif @distanse_y < 0
@move_boost_y *= -1
end
for i in 0...@move_speed_y
boost_y += @move_boost_y
move_y += boost_y
over_distance = @distanse_y - move_y
if @distanse_y > 0 && over_distance < 0
@move_speed_y = i
break
elsif @distanse_y < 0 && over_distance > 0
@move_speed_y = i
break
end
end
before = over_distance + boost_y
@move_speed_plus_y = (before / @moving_y).abs
@move_y += before % @moving_y
@battler.move_y = @move_y
elsif @move_boost_y < 0 && @distanse_y != 0
if @distanse_y == 0
@move_boost_y = 0
elsif @distanse_y < 0
@move_boost_y *= -1
end
for i in 0...@move_speed_y
boost_y += @move_boost_y
move_y += boost_y
lost_distance = @distanse_y - move_y
before = lost_distance
if @distanse_y > 0 && boost_y < 0
@move_speed_y = i
before = lost_distance + boost_y
break
elsif @distanse_y < 0 && boost_y > 0
@move_speed_y = i
before = lost_distance + boost_y
break
end
end
plus = before / @moving_y
@move_speed_plus_y = plus.abs
@move_y += before % @moving_y
@battler.move_y = @move_y
end
x = @move_speed_plus_x + @move_speed_x
y = @move_speed_plus_y + @move_speed_y
if x > y
end_time = x
else
end_time = y
end
@wait = end_time
if @jump != 0
if @wait == 0
@wait = @active_action[3]
end
@jump_time = @wait / 2
@jump_time_plus = @wait % 2
@jump_sign = 0
@jump_sign2 = 0
if @jump < 0
@jump_sign = -1
@jump_sign2 = 1
@jump = @jump * -1
else
@jump_sign = 1
@jump_sign2 = -1
end
@jump_up = 2 ** @jump * @jump_sign
if @jump_time == 0
@jump_up = 0
elsif @jump_time != 1
@jump_size = @jump_up * @jump_sign * @jump_sign2
else
@jump_size = @jump_up * 2 * @jump_sign * @jump_sign2
@jump_flug = true
end
end
end
#--------------------------------------------------------------------------
def battler_anime
@anime_kind = @active_action[1]
@anime_speed = @active_action[2]
@anime_loop = @active_action[3]
@unloop_wait = @active_action[4]
@anime_end = true
@reverse = false
if @weapon_R != nil && @active_action[8] != ""
weapon_kind = ANIME[@active_action[8]]
two_swords_flug = weapon_kind[11]
return if two_swords_flug && !@battler.actor?
return if two_swords_flug && @battler.weapons[1] == nil && @battler.actor?
if @battler.actor? && @battler.weapons[0] == nil && !two_swords_flug
@weapon_R.action_reset
elsif @battler.actor? && @battler.weapons[1] == nil && two_swords_flug
@weapon_R.action_reset
elsif !@battler.actor? && @battler.weapon == 0
@weapon_R.action_reset
else
@weapon_R.action_reset
if @active_action[5] != -1
@weapon_R.freeze(@active_action[5])
end
@weapon_R.weapon_graphics unless two_swords_flug
@weapon_R.weapon_graphics(true) if two_swords_flug
@weapon_R.weapon_action(@active_action[8],@anime_loop)
@weapon_action = true
@weapon_R.action
end
elsif @weapon_R != nil
@weapon_R.action_reset
end
@anime_end = false
if @active_action[5] != -1 && @active_action[5] != -2
@anime_freeze = true
@anime_end = true
elsif @active_action[5] == -2
@anime_freeze = false
@reverse = true
@pattern = @base_width - 1
if @weapon_action && @weapon_R != nil
@weapon_R.action
@weapon_R.update
end
else
@anime_freeze = false
@pattern = 0
if @weapon_action && @weapon_R != nil
@weapon_R.action
@weapon_R.update
end
end
@pattern_back = false
@frame = @anime_speed
@battler.move_z = @active_action[6]
if @shadow != nil
@shadow.visible = true if @active_action[7]
@shadow.visible = false unless @active_action[7]
@shadow.visible = false if @skip_shadow
end
file_name = ""
unless @active_action[0] == 0
file_name = "_" + @active_action[0].to_s
end
return unless @anime_flug
begin
self.bitmap = RPG::Cache.character(@battler_name + file_name, @battler_hue)
rescue
self.bitmap = RPG::Cache.character(@battler_name, @battler_hue)
end
@sx = @pattern * @width
@sy = @anime_kind * @height
@sx = @active_action[5] * @width if @anime_freeze
self.src_rect.set(@sx, @sy, @width, @height)
end
#--------------------------------------------------------------------------
def moving_anime
@move_anime.action_reset if @anime_moving
@anime_moving = true
mirror = false
mirror = true if $back_attack
id = @active_action[1]
target = @active_action[2]
x = y = mem = 0
if target == 0
if @target_battler == nil
x = self.x
y = self.y
else
if @target_battler[0] == nil
x = self.x
y = self.y
else
x = @target_battler[0].position_x
y = @target_battler[0].position_y
end
end
elsif target == 1
if @battler.actor?
for target in $game_troop.enemies
x += target.position_x
y += target.position_y
mem += 1
end
x = x / mem
y = y / mem
else
for target in $game_party.actors
x += target.position_x
y += target.position_y
mem += 1
end
x = x / mem
y = y / mem
end
elsif target == 2
if @battler.actor?
for target in $game_party.actors
x += target.position_x
y += target.position_y
mem += 1
end
x = x / mem
y = y / mem
else
for target in $game_troop.enemies
x += target.position_x
y += target.position_y
mem += 1
end
x = x / mem
y = y / mem
end
else
x = self.x
y = self.y
end
plus_x = @active_action[6]
plus_y = @active_action[7]
plus_x *= -1 if @battler.is_a?(Game_Enemy)
distanse_x = x - self.x - plus_x
distanse_y = y - self.y - plus_y
type = @active_action[3]
speed = @active_action[4]
orbit = @active_action[5]
if @active_action[8] == 0
@move_anime.base_x = self.x + plus_x
@move_anime.base_y = self.y + plus_y
elsif @active_action[8] == 1
@move_anime.base_x = x + plus_x
@move_anime.base_y = y + plus_y
distanse_y = distanse_y * -1
distanse_x = distanse_x * -1
else
@move_anime.base_x = x
@move_anime.base_y = y
distanse_x = distanse_y = 0
end
if @active_action[10] == ""
weapon = ""
elsif @anime_flug != true
weapon = ""
else
if @battler.actor?
battler = $game_party.actors[@battler.index]
weapon_id = battler.weapon_id
else
battler = $game_troop.enemies[@battler.index]
weapon_id = battler.weapon
end
weapon_act = ANIME[@active_action[10]].dup if @active_action[10] != ""
if weapon_id != 0 && weapon_act.size == 3
weapon_file = $data_weapons[weapon_id].flying_graphic
if weapon_file == ""
weapon_name = $data_weapons[weapon_id].graphic
icon_weapon = false
if weapon_name == ""
weapon_name = $data_weapons[weapon_id].icon_name
icon_weapon = true
end
else
icon_weapon = false
weapon_name = weapon_file
end
weapon = @active_action[10]
elsif weapon_act.size == 3
weapon = ""
elsif weapon_act != nil && $data_skills[@active_battler.current_action.skill_id] != nil
icon_weapon = false
weapon_name = $data_skills[@battler.current_action.skill.id].flying_graphic
weapon = @active_action[10]
end
end
@move_anime.z = 1
@move_anime.z = 1000 if @active_action[9]
@move_anime.anime_action(id,mirror,distanse_x,distanse_y,type,speed,orbit,weapon,weapon_name,icon_weapon)
end
#--------------------------------------------------------------------------
def anime_finish
return individual_action_end if @individual_targets.size != 0
send_action(@active_action[0]) if @battler.active
mirage_off if @mirage_flug
start_action(@repeat_action) unless @non_repeat
end
#--------------------------------------------------------------------------
def collapse_action
@non_repeat = true
@effect_type = COLLAPSE
@collapse_type = @battler.collapse_type unless @battler.actor?
@battler_visible = false unless @battler.actor?
@effect_duration = COLLAPSE_WAIT + 32 if @collapse_type == 2
@effect_duration = 360 if @collapse_type == 3
end
#--------------------------------------------------------------------------
def normal_collapse
if @effect_duration == 31
$game_system.se_play($data_system.enemy_collapse_se)
self.blend_type = 1
self.color.set(255, 64, 64, 255)
end
self.opacity = 256 - (48 - @effect_duration) * 6 if @effect_duration <= 31
end
#--------------------------------------------------------------------------
def boss_collapse
if @effect_duration == 320
Audio.se_play("Audio/SE/124-Thunder02", 100, 80)
self.flash(Color.new(255, 255, 255), 60)
viewport.flash(Color.new(255, 255, 255), 20)
end
if @effect_duration == 290
Audio.se_play("Audio/SE/124-Thunder02", 100, 80)
self.flash(Color.new(255, 255, 255), 60)
viewport.flash(Color.new(255, 255, 255), 20)
end
if @effect_duration == 250
Audio.se_play("Audio/SE/049-Explosion02",100, 50)
reset
self.blend_type = 1
self.color.set(255, 128, 128, 128)
end
if @effect_duration < 250
self.src_rect.set(0, @effect_duration - 250, @width, @height - @shadow.bitmap.height / 2)
self.x += 10 if @effect_duration % 2 == 0
self.opacity = @effect_duration - 20
return if @effect_duration < 100
Audio.se_play("Audio/SE/049-Explosion02",100, 50) if @effect_duration % 80 == 0
end
end
end
Code:
#==============================================================================
# Sideview Battle System Version 2.2xp
#==============================================================================
#==============================================================================
# ■ Atoa Module
#==============================================================================
$atoa_script = {} if $atoa_script.nil?
$atoa_script["SBS Tankentai"] = true
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
include N01
#--------------------------------------------------------------------------
attr_accessor :spriteset
#--------------------------------------------------------------------------
def main
fix_weapon_init
start
create_viewport
process_transition
update_battle
terminate
fix_weapon_end
end
#--------------------------------------------------------------------------
def start
@battle_start = true
$game_temp.in_battle = true
$game_temp.battle_turn = 0
$game_temp.battle_event_flags.clear
$game_temp.battle_abort = false
$game_temp.battle_main_phase = false
$game_temp.battleback_name = $game_map.battleback_name
$game_temp.forcing_battler = nil
$game_system.battle_interpreter.setup(nil, 0)
@troop_id = $game_temp.battle_troop_id
$game_troop.setup(@troop_id)
for enemy in $game_troop.enemies
enemy.true_immortal = enemy.immortal
end
end
#--------------------------------------------------------------------------
def create_viewport
s1 = $data_system.words.attack
s2 = $data_system.words.skill
s3 = $data_system.words.guard
s4 = $data_system.words.item
@actor_command_window = Window_Command.new(160, [s1, s2, s3, s4])
@actor_command_window.y = 160
@actor_command_window.back_opacity = 160
@actor_command_window.active = false
@actor_command_window.visible = false
@party_command_window = Window_PartyCommand.new
@help_window = Window_Help.new
@help_window.back_opacity = 160
@help_window.visible = false
@active_battler_window = Window_NameCommand.new(@active_battler, 240, 64)
@active_battler_window.visible = false
@status_window = Window_BattleStatus.new
@message_window = Window_Message.new
@spriteset = Spriteset_Battle.new
@wait_count, @escape_ratio = 0, 50
end
#--------------------------------------------------------------------------
def process_transition
if $data_system.battle_transition == ""
Graphics.transition(20)
else
Graphics.transition(40, "Graphics/Transitions/" + $data_system.battle_transition)
end
start_phase1
end
#--------------------------------------------------------------------------
def update_battle
loop do
Graphics.update
Input.update
update
break if $scene != self
end
end
#--------------------------------------------------------------------------
def terminate
$game_map.refresh
Graphics.freeze
@actor_command_window.dispose
@party_command_window.dispose
@help_window.dispose
@status_window.dispose
@message_window.dispose
@skill_window.dispose if @skill_window != nil
@item_window.dispose if @item_window != nil
@result_window.dispose if @result_window != nil
@spriteset.dispose
if $scene.is_a?(Scene_Title)
Graphics.transition
Graphics.freeze
end
$scene = nil if $BTEST and not $scene.is_a?(Scene_Gameover)
end
#--------------------------------------------------------------------------
def fix_weapon_init
for member in $game_party.actors
if member.weapons[0] == nil and member.weapons[1] != nil
weapon_to_equip = member.armor1_id
member.equip(1, 0)
member.equip(0, weapon_to_equip)
member.two_swords_change = true
end
end
end
#--------------------------------------------------------------------------
def fix_weapon_end
for member in $game_party.actors
if member.two_swords_change
weapon_to_re_equip = member.weapon_id
member.equip(0, 0)
member.equip(1, weapon_to_re_equip)
member.two_swords_change = false
end
end
end
#--------------------------------------------------------------------------
def update_basic
Graphics.update
Input.update
$game_system.update
$game_screen.update
@spriteset.update
end
#--------------------------------------------------------------------------
def update_effects
for battler in $game_party.actors + $game_troop.enemies
if battler.exist?
battler_sprite = @spriteset.actor_sprites[battler.index] if battler.actor?
battler_sprite = @spriteset.enemy_sprites[battler.index] if battler.is_a?(Game_Enemy)
battler_sprite.effects_update
end
end
end
#--------------------------------------------------------------------------
def wait(duration)
for i in 0...duration
update_basic
end
end
#--------------------------------------------------------------------------
def pop_help(obj)
@help_window.set_text(obj, 1)
loop do
update_basic
break @help_window.visible = false if Input.trigger?(Input::C)
end
end
#--------------------------------------------------------------------------
alias start_phase1_n01 start_phase1
def start_phase1
for member in $game_party.actors + $game_troop.enemies
member.dead_anim = member.dead? ? true : false
@spriteset.set_stand_by_action(member.actor?, member.index) unless member.dead_anim
end
start_phase1_n01
$clear_enemies_actions = false
if $preemptive
pop_help(PREEMPTIVE_ALERT)
$clear_enemies_actions = true
end
@battle_start = false unless $back_attack
return unless $back_attack
pop_help(BACK_ATTACK_ALERT)
@battle_start = false
$game_party.clear_actions
start_phase4
end
#--------------------------------------------------------------------------
alias start_phase4_n01 start_phase4
def start_phase4
start_phase4_n01
@active_battler_window.visible = false
if $clear_enemies_actions
$clear_enemies_actions = false
$game_troop.clear_actions
end
end
#--------------------------------------------------------------------------
def judge
if $game_party.all_dead? or $game_party.actors.size == 0
if $game_temp.battle_can_lose
$game_system.bgm_play($game_temp.map_bgm)
battle_end(2)
return true
end
$game_temp.gameover = true
return true
end
for enemy in $game_troop.enemies
return false if enemy.exist?
end
process_victory
return true
end
#--------------------------------------------------------------------------
def update_phase2_escape
enemies_agi = enemies_number = 0
for enemy in $game_troop.enemies
if enemy.exist?
enemies_agi += enemy.agi
enemies_number += 1
end
end
enemies_agi /= [enemies_number, 1].max
actors_agi = actors_number = 0
for actor in $game_party.actors
if actor.exist?
actors_agi += actor.agi
actors_number += 1
end
end
actors_agi /= [actors_number, 1].max
@success = rand(100) < @escape_ratio * actors_agi / enemies_agi
@party_command_window.visible = false
@party_command_window.active = false
wait(2)
if @success
$game_system.se_play($data_system.escape_se)
for actor in $game_party.actors
unless actor.dead?
@spriteset.set_action(true, actor.index, actor.run_success)
end
end
pop_help(ESCAPE_SUCCESS)
$game_system.bgm_play($game_temp.map_bgm)
battle_end(1)
else
@escape_ratio += 5
$game_party.clear_actions
$game_system.se_play($data_system.escape_se)
for actor in $game_party.actors
unless actor.dead?
@spriteset.set_action(true, actor.index,actor.run_ng)
end
end
pop_help(ESCAPE_FAIL)
start_phase4
end
end
#--------------------------------------------------------------------------
def process_victory
for enemy in $game_troop.enemies
break boss_wait = true if enemy.collapse_type == 3
end
wait(440) if boss_wait
wait(WIN_WAIT) unless boss_wait
for actor in $game_party.actors
unless actor.restriction == 4
@spriteset.set_action(true, actor.index,actor.win)
end
end
start_phase5
end
#--------------------------------------------------------------------------
def start_phase5
@phase = 5
$game_system.me_play($game_system.battle_end_me)
$game_system.bgm_play($game_temp.map_bgm)
treasures = []
for enemy in $game_troop.enemies
gold = gold.nil? ? enemy.gold : gold + enemy.gold
treasures << treasure_drop(enemy) unless enemy.hidden
end
exp = gain_exp
treasures = treasures.compact
$game_party.gain_gold(gold)
for item in treasures
case item
when RPG::Item
$game_party.gain_item(item.id, 1)
when RPG::Weapon
$game_party.gain_weapon(item.id, 1)
when RPG::Armor
$game_party.gain_armor(item.id, 1)
end
end
@result_window = Window_BattleResult.new(exp, gold, treasures)
@result_window.add_multi_drops if $atoa_script['Multi Drop']
@phase5_wait_count = 100
end
#--------------------------------------------------------------------------
def treasure_drop(enemy)
if rand(100) < enemy.treasure_prob
treasure = $data_items[enemy.item_id] if enemy.item_id > 0
treasure = $data_weapons[enemy.weapon_id] if enemy.weapon_id > 0
treasure = $data_armors[enemy.armor_id] if enemy.armor_id > 0
end
return treasure
end
#--------------------------------------------------------------------------
def gain_exp
exp = exp_gained
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
if actor.cant_get_exp? == false
last_level = actor.level
actor.exp += exp
if actor.level > last_level
@status_window.level_up(i)
end
end
end
return exp
end
#--------------------------------------------------------------------------
def exp_gained
for enemy in $game_troop.enemies
exp = exp.nil? ? enemy.exp : exp + enemy.exp
end
if EXP_SHARE
actor_number = 0
for actor in $game_party.actors
actor_number += 1 unless actor.cant_get_exp?
end
exp = exp / [actor_number, 1].max
end
return exp
end
#--------------------------------------------------------------------------
alias acbs_update_phase5 update_phase5
def update_phase5
@result_window.update
acbs_update_phase5
end
#--------------------------------------------------------------------------
alias phase3_next_actor_n01 phase3_next_actor
def phase3_next_actor
if @active_battler != nil && @active_battler.inputable?
@spriteset.set_action(true, @actor_index, @active_battler.command_a)
end
@wait_count = 32 if @actor_index == $game_party.actors.size-1
phase3_next_actor_n01
if @active_battler != nil && @active_battler.inputable?
@spriteset.set_action(true, @actor_index,@active_battler.command_b)
end
end
#--------------------------------------------------------------------------
alias phase3_prior_actor_n01 phase3_prior_actor
def phase3_prior_actor
if @active_battler != nil && @active_battler.inputable?
@active_battler.current_action.clear
@spriteset.set_action(true, @actor_index,@active_battler.command_a)
end
phase3_prior_actor_n01
if @active_battler != nil && @active_battler.inputable?
@active_battler.current_action.clear
@spriteset.set_action(true, @actor_index,@active_battler.command_b)
end
end
#--------------------------------------------------------------------------
alias start_phase2_n01 start_phase2
def start_phase2
@active_battler_window.visible = false
start_phase2_n01
end
#--------------------------------------------------------------------------
alias phase3_setup_command_window_n01 phase3_setup_command_window
def phase3_setup_command_window
phase3_setup_command_window_n01
@actor_command_window.x = COMMAND_WINDOW_POSITION[0]
@actor_command_window.y = COMMAND_WINDOW_POSITION[1]
@actor_command_window.z = 2000
@actor_command_window.index = 0
@actor_command_window.back_opacity = COMMAND_OPACITY
@active_battler_window.refresh(@active_battler)
@active_battler_window.visible = true if BATTLER_NAME_WINDOW
end
#--------------------------------------------------------------------------
alias acbs_update_phase3_basic_command_scenebattle update_phase3_basic_command
def update_phase3_basic_command
if Input.trigger?(Input::C)
case @actor_command_window.commands[@actor_command_window.index]
when $data_system.words.attack
$game_system.se_play($data_system.decision_se)
@active_battler.current_action.kind = 0
@active_battler.current_action.basic = 0
@actor_command_window.active = false
@actor_command_window.visible = false
start_enemy_select
return
when $data_system.words.item
$game_system.se_play($data_system.decision_se)
@active_battler.current_action.kind = 2
start_item_select
return
when $data_system.words.guard
$game_system.se_play($data_system.decision_se)
@active_battler.current_action.kind = 0
@active_battler.current_action.basic = 1
phase3_next_actor
return
end
end
acbs_update_phase3_basic_command_scenebattle
end
#--------------------------------------------------------------------------
def now_action(battler = @active_battler)
return if battler.nil?
@now_action = nil
case battler.current_action.kind
when 0
@now_action = $data_weapons[battler.weapon_id] if battler.current_action.basic == 0
when 1
@now_action = $data_skills[battler.current_action.skill_id]
when 2
@now_action = $data_items[battler.current_action.item_id]
end
end
#--------------------------------------------------------------------------
def start_enemy_select
now_action
@enemy_arrow = Arrow_Enemy.new(@spriteset.viewport2)
@enemy_arrow.help_window = @help_window
@actor_command_window.active = false
@actor_command_window.visible = false
@active_battler_window.visible = false
@status_window.visible = true
end
#--------------------------------------------------------------------------
alias start_actor_select_n01 start_actor_select
def start_actor_select
now_action
start_actor_select_n01
@status_window.visible = true
@active_battler_window.visible = false
@actor_arrow.input_right if @now_action.extension.include?("OTHERS")
end
#--------------------------------------------------------------------------
alias update_phase3_actor_select_n01 update_phase3_actor_select
def update_phase3_actor_select
@actor_arrow.input_update_target if @now_action.extension.include?("OTHERS") and @actor_arrow.index == @active_battler.index
update_phase3_actor_select_n01
end
#--------------------------------------------------------------------------
alias update_phase3_n01 update_phase3
def update_phase3
if @enemy_arrow_all != nil
update_phase3_select_all_enemies
return
elsif @actor_arrow_all != nil
update_phase3_select_all_actors
return
elsif @battler_arrow_all != nil
update_phase3_select_all_battlers
return
end
update_phase3_n01
end
#--------------------------------------------------------------------------
alias update_phase3_skill_select_n01 update_phase3_skill_select
def update_phase3_skill_select
@status_window.visible = false if HIDE_WINDOW
if Input.trigger?(Input::C)
@skill = @skill_window.skill
if @skill == nil or not @active_battler.skill_can_use?(@skill.id)
$game_system.se_play($data_system.buzzer_se)
return
end
@active_battler.current_action.skill_id = @skill.id
@skill_window.visible = false
if @skill.extension.include?("TARGETALL")
$game_system.se_play($data_system.decision_se)
start_select_all_battlers
return
end
if (@skill.extension.include?("RANDOMTARGET") and @skill.scope <= 2) or @skill.scope == 2
$game_system.se_play($data_system.decision_se)
start_select_all_enemies
return
end
if (@skill.extension.include?("RANDOMTARGET") and @skill.scope > 2) or @skill.scope == 4
$game_system.se_play($data_system.decision_se)
start_select_all_actors
return
end
end
update_phase3_skill_select_n01
end
#--------------------------------------------------------------------------
alias update_phase3_item_select_n01 update_phase3_item_select
def update_phase3_item_select
@status_window.visible = false if HIDE_WINDOW
if Input.trigger?(Input::C)
@item = @item_window.item
if @item == nil or not $game_party.item_can_use?(@item.id)
$game_system.se_play($data_system.buzzer_se)
return
end
@active_battler.current_action.item_id = @item.id
@item_window.visible = false
if @item.extension.include?("TARGETALL")
$game_system.se_play($data_system.decision_se)
start_select_all_battlers
return
end
if @item.extension.include?("RANDOMTARGET") and @item.scope <= 2 or @item.scope == 2
$game_system.se_play($data_system.decision_se)
start_select_all_enemies
return
end
if (@item.extension.include?("RANDOMTARGET") and @item.scope > 2) or @item.scope == 4
$game_system.se_play($data_system.decision_se)
start_select_all_actors
return
end
end
update_phase3_item_select_n01
end
#--------------------------------------------------------------------------
def update_phase3_select_all_enemies
@enemy_arrow_all.update_multi_arrow
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
end_select_all_enemies
return
end
if Input.trigger?(Input::C)
$game_system.se_play($data_system.decision_se)
if @skill_window != nil
end_skill_select
end
if @item_window != nil
end_item_select
end
end_select_all_enemies
phase3_next_actor
return
end
end
#--------------------------------------------------------------------------
def update_phase3_select_all_actors
@actor_arrow_all.update_multi_arrow
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
end_select_all_actors
return
end
if Input.trigger?(Input::C)
$game_system.se_play($data_system.decision_se)
if @skill_window != nil
end_skill_select
end
if @item_window != nil
end_item_select
end
end_select_all_actors
phase3_next_actor
return
end
end
#--------------------------------------------------------------------------
def update_phase3_select_all_battlers
@battler_arrow_all.update_multi_arrow
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
end_select_all_battlers
return
end
if Input.trigger?(Input::C)
$game_system.se_play($data_system.decision_se)
if @skill_window != nil
end_skill_select
end
if @item_window != nil
end_item_select
end
end_select_all_battlers
phase3_next_actor
return
end
end
#--------------------------------------------------------------------------
def start_select_all_enemies
now_action
@status_window.visible = true
@active_battler_window.visible = false
@enemy_arrow_all = Arrow_Enemy_All.new(@spriteset.viewport2)
end
#--------------------------------------------------------------------------
def start_select_all_actors
now_action
@status_window.visible = true
@active_battler_window.visible = false
@actor_arrow_all = Arrow_Actor_All.new(@spriteset.viewport2)
end
#--------------------------------------------------------------------------
def start_select_all_battlers
now_action
@status_window.visible = true
@active_battler_window.visible = false
@battler_arrow_all = Arrow_Battler_All.new(@spriteset.viewport2)
end
#--------------------------------------------------------------------------
def end_select_all_actors
@actor_arrow_all.dispose_multi_arrow
@actor_arrow_all = nil
@active_battler_window.visible = true if @actor_command_window.index == 0 and BATTLER_NAME_WINDOW
end
#--------------------------------------------------------------------------
def end_select_all_enemies
@enemy_arrow_all.dispose_multi_arrow
@enemy_arrow_all = nil
@active_battler_window.visible = true if @actor_command_window.index == 0 and BATTLER_NAME_WINDOW
end
#--------------------------------------------------------------------------
def end_select_all_battlers
@battler_arrow_all.dispose_multi_arrow
@battler_arrow_all = nil
@active_battler_window.visible = true if @actor_command_window.index == 0 and BATTLER_NAME_WINDOW
end
#--------------------------------------------------------------------------
alias end_enemy_select_n01 end_enemy_select
def end_enemy_select
end_enemy_select_n01
@active_battler_window.visible = true if @actor_command_window.index == 0 and BATTLER_NAME_WINDOW
end
#--------------------------------------------------------------------------
alias start_skill_select_n01 start_skill_select
def start_skill_select
start_skill_select_n01
@status_window.visible = false if HIDE_WINDOW
@active_battler_window.visible = false
end
#--------------------------------------------------------------------------
alias end_skill_select_n01 end_skill_select
def end_skill_select
end_skill_select_n01
@status_window.visible = true
@active_battler_window.visible = true if BATTLER_NAME_WINDOW
end
#--------------------------------------------------------------------------
alias start_item_select_n01 start_item_select
def start_item_select
start_item_select_n01
@status_window.visible = false if HIDE_WINDOW
@active_battler_window.visible = false
end
#--------------------------------------------------------------------------
alias end_item_select_n01 end_item_select
def end_item_select
end_item_select_n01
@status_window.visible = true
@active_battler_window.visible = true if BATTLER_NAME_WINDOW
end
#--------------------------------------------------------------------------
alias make_action_orders_n01 make_action_orders
def make_action_orders
make_action_orders_n01
for battler in @action_battlers
skill_id = battler.current_action.skill_id
item_id = battler.current_action.item_id
next if battler.current_action.kind == 0
extension = $data_skills[skill_id].extension if skill_id != 0
extension = $data_items[item_id].extension if item_id != 0
battler.current_action.speed = 9999 if extension.include?("FAST")
battler.current_action.speed = -1 if extension.include?("SLOW")
end
@action_battlers.sort! {|a,b|
b.current_action.speed - a.current_action.speed }
for enemy in $game_troop.enemies
if enemy.action_time[0] != 1
action_time = 0
for i in 1...enemy.action_time[0]
action_time += 1 if rand(100) < enemy.action_time[1]
end
enemy.act_time = action_time
action_time.times do
enemy_order_time(enemy)
action_time -= 1
break if action_time == 0
end
enemy.adj_speed = nil
end
end
end
#--------------------------------------------------------------------------
def enemy_order_time(enemy)
enemy.make_action_speed2(enemy.action_time[2])
select_time = 0
for member in @action_battlers
select_time += 1
break @action_battlers.push(enemy) if member.current_action.speed < enemy.adj_speed
break @action_battlers.push(enemy) if select_time == @action_battlers.size
end
end
#--------------------------------------------------------------------------
def update_phase4_step1
return if @spriteset.effect?
return @wait_count -= 1 if @wait_count > 0
@help_window.visible = false
return if judge
if $game_temp.forcing_battler == nil
setup_battle_event
return if $game_system.battle_interpreter.running?
end
if $game_temp.forcing_battler != nil
@action_battlers.delete($game_temp.forcing_battler)
@action_battlers.unshift($game_temp.forcing_battler)
end
if @action_battlers.size == 0
turn_ending
start_phase2
return
end
@animation1_id = 0
@animation2_id = 0
@common_event_id = 0
@active_battler = @action_battlers.shift
return if @active_battler.index == nil
@active_battler.remove_states_auto
@status_window.refresh
@phase4_step = 2
end
#--------------------------------------------------------------------------
def turn_ending
for member in $game_party.actors + $game_troop.enemies
member.current_action.clear
next unless member.exist?
member.slip_damage = false
actor = member.actor?
for state in member.battler_states
member.remove_state(state.id) if state.extension.include?("ZEROTURNLIFT")
end
damage = 0
for state in member.battler_states
next unless state.extension.include?("SLIPDAMAGE")
for ext in state.slip_extension
if ext[0] == "hp"
base_damage = ext[1] + member.maxhp * ext[2] / 100
damage += base_damage + base_damage * (rand(5) - rand(5)) / 100
slip_pop = ext[3]
slip_dead = ext[4]
slip_damage_flug = true
member.slip_damage = true
end
end
end
if member.slip_damage && member.exist? && !slip_damage_flug
damage += member.apply_variance(member.maxhp / 10, 10)
slip_dead = false
slip_pop = true
slip_damage_flug = true
member.slip_damage = true
end
damage = member.hp - 1 if damage >= member.hp && slip_dead = false
member.hp -= damage
member.damage = damage if damage > 0
member.perform_collapse if member.dead? && member.slip_damage
@spriteset.set_damage_pop(actor, member.index, damage) if slip_pop
@spriteset.set_stand_by_action(actor, member.index) if member.hp <= 0 and not member.dead_anim
member.dead_anim = member.dead? ? true : false
end
@status_window.refresh
wait(DMG_DURATION / 2) if slip_damage_flug
slip_damage_flug = false
for member in $game_party.actors + $game_troop.enemies
next unless member.exist?
actor = member.actor?
damage = 0
for state in member.battler_states
next unless state.extension.include?("SLIPDAMAGE")
for ext in state.slip_extension
if ext[0] == "mp"
base_damage = ext[1] + member.maxsp * ext[2] / 100
damage += base_damage + base_damage * (rand(5) - rand(5)) / 100
slip_pop = ext[3]
slip_damage_flug = true
end
end
member.sp_damage = true
member.sp -= damage
member.damage = damage if damage > 0
@spriteset.set_damage_pop(actor, member.index, damage) if slip_pop
end
end
@status_window.refresh
wait(DMG_DURATION / 2) if slip_damage_flug
for member in $game_party.actors + $game_troop.enemies
next unless member.exist?
actor = member.actor?
damage = 0
for state in member.battler_states
next unless state.extension.include?("REGENERATION")
for ext in state.slip_extension
if ext[0] == "hp"
base_damage = ext[1] + member.maxhp * ext[2] / 100
damage += base_damage + base_damage * (rand(5) - rand(5)) / 100
slip_pop = ext[3]
slip_damage_flug = true
end
end
member.hp -= damage
member.damage = damage if damage < 0
@spriteset.set_damage_pop(actor, member.index, damage) if slip_pop
end
end
@status_window.refresh
wait(DMG_DURATION / 2) if slip_damage_flug
for member in $game_party.actors + $game_troop.enemies
next unless member.exist?
actor = member.actor?
damage = 0
for state in member.battler_states
next unless state.extension.include?("REGENERATION")
for ext in state.slip_extension
if ext[0] == "mp"
base_damage = ext[1] + member.maxhp * ext[2] / 100
damage += base_damage + base_damage * (rand(5) - rand(5)) / 100
slip_pop = ext[3]
slip_damage_flug = true
end
end
member.sp_damage = true
member.sp -= damage
member.damage = damage if damage < 0
@spriteset.set_damage_pop(actor, member.index, damage) if slip_pop
end
end
@status_window.refresh
wait(DMG_DURATION / 2) if slip_damage_flug
end
#--------------------------------------------------------------------------
alias update_phase4_step2_n01 update_phase4_step2
def update_phase4_step2
for member in $game_party.actors + $game_troop.enemies
member.dead_anim = member.dead? ? true : false
end
if @active_battler.current_action.kind != 0
obj = $data_skills[@active_battler.current_action.skill_id] if @active_battler.current_action.kind == 1
obj = $data_items[@active_battler.current_action.item_id] if @active_battler.current_action.kind == 2
@active_battler.white_flash = false if obj != nil &&obj.extension.include?("NOFLASH")
end
@active_battler.active = true
update_phase4_step2_n01
if @active_battler != nil && @active_battler.derivation != 0
@active_battler.current_action.kind = 1
@active_battler.current_action.skill_id = @active_battler.derivation
@action_battlers.unshift(@active_battler)
end
if @active_battler != nil && !@active_battler.actor? && @active_battler.act_time != 0
@active_battler.make_action
@active_battler.act_time -= 1
end
update_phase4_step6
end
#--------------------------------------------------------------------------
alias update_phase4_step6_n01 update_phase4_step6
def update_phase4_step6
update_phase4_step6_n01
@active_battler.active = false if @active_battler != nil
end
#--------------------------------------------------------------------------
def make_basic_action_result
if @active_battler.current_action.basic == 0
execute_action_attack
return
end
if @active_battler.current_action.basic == 1
@help_window.set_text("#{@active_battler.name} defends", 1)
@help_window.visible = true
@active_battler.active = false
@active_battler.defense_pose = true
@spriteset.set_stand_by_action(@active_battler.actor?, @active_battler.index)
wait(45)
@help_window.visible = false
return
end
if @active_battler.is_a?(Game_Enemy) and @active_battler.current_action.basic == 2
@spriteset.set_action(false, @active_battler.index, @active_battler.run_success)
$game_system.se_play($data_system.escape_se)
@active_battler.escape
pop_help("#{@active_battler.name} escaped...")
return
end
if @active_battler.current_action.basic == 3
@active_battler.active = false
$game_temp.forcing_battler = nil
@phase4_step = 1
return
end
end
#--------------------------------------------------------------------------
def execute_action_attack
if @active_battler.actor?
if @active_battler.weapon_id == 0
action = @active_battler.non_weapon
immortaling
else
action = $data_weapons[@active_battler.weapon_id].base_action
if $data_weapons[@active_battler.weapon_id].plus_state_set.include?(1)
for member in $game_party.actors + $game_troop.enemies
next if member.immortal
next if member.dead?
member.dying = true
end
else
immortaling
end
end
else
if @active_battler.weapon == 0
action = @active_battler.base_action
immortaling
else
action = $data_weapons[@active_battler.weapon].base_action
if $data_weapons[@active_battler.weapon].plus_state_set.include?(1)
for member in $game_party.actors + $game_troop.enemies
next if member.immortal
next if member.dead?
member.dying = true
end
else
immortaling
end
end
end
target_decision
@spriteset.set_action(@active_battler.actor?, @active_battler.index, action)
playing_action
end
#--------------------------------------------------------------------------
def make_attack_targets
@target_battlers = []
if @active_battler.is_a?(Game_Enemy)
if @active_battler.restriction == 3
target = $game_troop.random_target_enemy
elsif @active_battler.restriction == 2
target = $game_party.random_target_actor
else
index = @active_battler.current_action.target_index
target = $game_party.smooth_target_actor(index)
end
end
if @active_battler.actor?
if @active_battler.restriction == 3
target = $game_party.random_target_actor
elsif @active_battler.restriction == 2
target = $game_troop.random_target_enemy
else
index = @active_battler.current_action.target_index
target = $game_troop.smooth_target_enemy(index)
end
end
@target_battlers = [target]
return @target_battlers
end
#--------------------------------------------------------------------------
def make_skill_action_result
skill = $data_skills[@active_battler.current_action.skill_id]
if skill.plus_state_set.include?(1)
for member in $game_party.actors + $game_troop.enemies
next if member.immortal
next if member.dead?
member.dying = true
end
else
immortaling
end
return unless @active_battler.skill_can_use?(skill.id)
target_decision(skill)
@active_battler.consum_skill_cost(skill)
@status_window.refresh
@spriteset.set_action(@active_battler.actor?, @active_battler.index, skill.base_action)
@help_window.set_text(skill.name, 1) unless skill.extension.include?("HELPHIDE")
playing_action
@common_event_id = skill.common_event_id
end
#--------------------------------------------------------------------------
def make_item_action_result
item = $data_items[@active_battler.current_action.item_id]
unless $game_party.item_can_use?(item.id)
@phase4_step = 1
return
end
if @item.consumable
$game_party.lose_item(item.id, 1)
end
immortaling
target_decision(item)
@spriteset.set_action(@active_battler.actor?, @active_battler.index, item.base_action)
@help_window.set_text(item.name, 1) unless item.extension.include?("HELPHIDE")
playing_action
@common_event_id = item.common_event_id
end
#--------------------------------------------------------------------------
def target_decision(obj = nil)
if obj != nil
set_target_battlers(obj.scope)
if obj.extension.include?("TARGETALL")
@target_battlers = []
if obj.scope != 5 or obj.scope != 6
for target in $game_troop.enemies + $game_party.actors
@target_battlers.push(target) if target.exist?
end
else
for target in $game_troop.enemies + $game_party.actors
@target_battlers.push(target) if target != nil && target.hp0?
end
end
end
@target_battlers.delete(@active_battler) if obj.extension.include?("OTHERS")
if obj.extension.include?("RANDOMTARGET")
randum_targets = @target_battlers.dup
@target_battlers = [randum_targets[rand(randum_targets.size)]]
end
else
@target_battlers = make_attack_targets
end
if @target_battlers.size == 0
action = @active_battler.recover_action
@spriteset.set_action(@active_battler.actor?, @active_battler.index, action)
end
@spriteset.set_target(@active_battler.actor?, @active_battler.index, @target_battlers)
end
#--------------------------------------------------------------------------
def playing_action
loop do
update_basic
update_effects
action = @active_battler.play
next if action == 0
@active_battler.play = 0
if action[0] == "Individual"
individual
elsif action == "Can Collapse"
unimmortaling
elsif action == "Cancel Action"
break action_end
elsif action == "End"
break action_end
elsif action[0] == "OBJ_ANIM"
damage_action(action[1])
end
end
end
#--------------------------------------------------------------------------
def individual
@individual_target = @target_battlers
@stand_by_target = @target_battlers.dup
end
#--------------------------------------------------------------------------
def immortaling
for member in $game_party.actors + $game_troop.enemies
member.immortal = true unless member.dead?
end
end
#--------------------------------------------------------------------------
def unimmortaling
return if @active_battler.individual
for member in $game_party.actors + $game_troop.enemies
member.immortal = false
member.add_state(1) if member.dead?
if member.dead? and not member.dead_anim
member.perform_collapse
@spriteset.set_stand_by_action(member.actor?, member.index)
end
member.dead_anim = member.dead? ? true : false
next unless member.dead?
resurrection(member)
end
update_basic
@status_window.refresh
end
#--------------------------------------------------------------------------
def resurrection(target)
for state in target.battler_states
for ext in state.extension
name = ext.split('')
next unless name[0] == "A"
wait(25)
name = name.join
name.slice!("AUTOLIFE/")
target.hp = target.maxhp * name.to_i / 100
target.remove_state(1)
target.remove_state(state.id)
target.animation_id = RESURRECTION
target.animation_hit = true
target.anime_mirror = true if $back_attack
@status_window.refresh
wait($data_animations[RESURRECTION].frame_max * 2)
end
end
end
#--------------------------------------------------------------------------
def magic_reflection(target, obj)
return if obj != nil and $data_skills[@active_battler.current_action.skill_id].int_f == 0
for state in target.battler_states
for ext in state.extension
name = ext.split('')
next unless name[0] == "M"
if name[3] == "R"
name = name.join
name.slice!("MAGREFLECT/")
target.animation_id = name.to_i
target.animation_hit = true
target.anime_mirror = true if $back_attack
@reflection = true
else
name = name.join
name.slice!("MAGNULL/")
target.animation_id = name.to_i
target.animation_hit = true
target.anime_mirror = true if $back_attack
@invalid = true
end
end
end
end
#--------------------------------------------------------------------------
def physics_reflection(target, obj)
return if obj != nil && $data_skills[@active_battler.current_action.skill_id].str_f == 0
for state in target.battler_states
for ext in state.extension
name = ext.split('')
next unless name[0] == "P"
if name[3] == "R"
name = name.join
name.slice!("PHYREFLECT/")
target.animation_id = name.to_i
target.animation_hit = true
target.anime_mirror = true if $back_attack
@reflection = true
else
name = name.join
name.slice!("PHYNULL/")
target.animation_id = name.to_i
target.animation_hit = true
target.anime_mirror = true if $back_attack
@invalid = true
end
end
end
end
#--------------------------------------------------------------------------
def absorb_cost(target, obj)
for state in target.battler_states
if state.extension.include?("COSTABSORB")
cost = @active_battler.calc_sp_cost(@active_battler, obj)
return target.hp += cost if obj.extension.include?("HPCONSUME")
return target.mp += cost
end
end
end
#--------------------------------------------------------------------------
def absorb_attack(obj, target, index, actor)
for ext in obj.extension
return if target.evaded or target.missed or target.damage == 0 or target.damage == nil
name = ext.split('')
next unless name[3] == "G" and name[1] == "D"
name = name.join
name.slice!("%DMGABSORB/")
kind = "hp" unless target.sp_damage
kind = "sp" if target.sp_damage
absorb = target.damage * name.to_i / 100
@wide_attack = true if obj.scope == 2 or obj.scope == 4 or obj.scope == 6 or obj.extension.include?("TARGETALL")
if @wide_attack && @absorb == nil && @target_battlers.size != 1
@absorb = absorb
@absorb_target_size = @target_battlers.size - 2
elsif @absorb != nil && @absorb_target_size > 0
@absorb += absorb
@absorb_target_size -= 1
elsif @absorb != nil
@absorb += absorb
absorb_action = ["absorb", nil, kind, @absorb]
@spriteset.set_damage_action(actor, index, absorb_action)
@absorb = nil
@absorb_target_size = nil
@active_battler.perform_collapse
else
absorb_action = ["absorb", nil, kind, absorb]
@spriteset.set_damage_action(actor, index, absorb_action)
@active_battler.perform_collapse
end
end
end
#--------------------------------------------------------------------------
def action_end
@individual_target = nil
@help_window.visible = false if @help_window != nil && @help_window.visible
@active_battler.active = false
unimmortaling
for member in $game_troop.enemies
member.non_dead = false if member.non_dead
end
if @active_battler.reflex != nil
if @active_battler.current_action.kind == 1
obj = $data_skills[@active_battler.current_action.skill_id]
@active_battler.perfect_skill_effect(@active_battler, obj)
elsif @active_battler.current_action.kind == 2
obj = $data_items[@active_battler.current_action.item_id]
@active_battler.item_effect(@active_battler, obj)
else
@active_battler.perfect_attack_effect(@active_battler)
end
pop_damage(@active_battler, obj, @active_battler.reflex)
@active_battler.perform_collapse
@active_battler.reflex = nil
wait(COLLAPSE_WAIT)
end
if @active_battler.derivation != 0
@active_battler.current_action.skill_id = @active_battler.derivation
@active_battler.current_action.kind = 1
@active_battler.derivation = 0
@action_battlers.unshift(@active_battler)
else
@spriteset.set_stand_by_action(@active_battler.actor?, @active_battler.index)
wait(ACTION_WAIT + 20)
end
end
#--------------------------------------------------------------------------
def damage_action(action)
@target_battlers = [@individual_target.shift] if @active_battler.individual
if @active_battler.current_action.kind == 1
obj = $data_skills[@active_battler.current_action.skill_id]
for target in @target_battlers
return if target == nil
if obj.scope == 5 or obj.scope == 6
return unless target.dead?
else
return if target.dead?
end
if target.hp == 0 && obj.scope != 5 && obj.scope != 6
target.perfect_skill_effect(@active_battler, obj)
elsif obj.extension.include?("NOEVADE")
target.perfect_skill_effect(@active_battler, obj)
else
magic_reflection(target, obj) unless obj.extension.include?("IGNOREREFLECT")
physics_reflection(target, obj) unless obj.extension.include?("IGNOREREFLECT")
target.skill_effect(@active_battler, obj) unless @reflection or @invalid
end
pop_damage(target, obj, action) unless @reflection or @invalid
absorb_cost(target, obj)
@active_battler.reflex = action if @reflection
@reflection = false
@invalid = false
end
elsif @active_battler.current_action.kind == 2
obj = $data_items[@active_battler.current_action.item_id]
for target in @target_battlers
return if target == nil
if obj.scope == 5 or obj.scope == 6
return unless target.dead?
else
return if target.dead?
end
target.revival = true if obj.scope == 5 or obj.scope == 6
target.item_effect(obj)
pop_damage(target, obj, action)
end
else
for target in @target_battlers
return if target == nil or target.dead?
physics_reflection(target, nil)
target.perfect_attack_effect(@active_battler) if target.hp <= 0
target.attack_effect(@active_battler) unless target.hp <= 0 unless @reflection or @invalid
pop_damage(target, obj, action) unless @reflection or @invalid
@active_battler.reflex = action if @reflection
@reflection = false
@invalid = false
end
end
return if obj == nil
target_decision(obj) if obj.extension.include?("RANDOMTARGET")
end
#--------------------------------------------------------------------------
def pop_damage(target, obj, action)
index = @active_battler.index
actor = @active_battler.actor?
if obj != nil && obj.extension.size != 0
absorb_attack(obj, target, index, actor)
action[2] = false if obj.extension.include?("NOOVERKILL")
end
@spriteset.set_damage_action(target.actor?, target.index, action)
@status_window.refresh
end
end
#==============================================================================
# ■ Scene_Map
#==============================================================================
class Scene_Map
#--------------------------------------------------------------------------
include N01
#--------------------------------------------------------------------------
alias call_battle_n01 call_battle
#--------------------------------------------------------------------------
def call_battle
$back_attack = $preemptive = false
preemptive_or_back_attack
call_battle_n01
end
#--------------------------------------------------------------------------
def preemptive_or_back_attack
enemies_agi = 0
for enemy in $game_troop.enemies
enemies_agi += enemy.agi
end
enemies_agi /= [$game_troop.enemies.size, 1].max
actors_agi = 0
for actor in $game_party.actors
actors_agi += actor.agi
end
actors_agi /= [$game_party.actors.size, 1].max
preemptive_plus
if actors_agi >= enemies_agi
percent_preemptive = PREEMPTIVE_RATE * ($preemptive_plus ? 3 : 1)
percent_back_attack = BACK_ATTACK_RATE / 2
else
percent_preemptive = (PREEMPTIVE_RATE / 2) * ($preemptive_plus ? 3 : 1)
percent_back_attack = BACK_ATTACK_RATE
end
if rand(100) < percent_preemptive
$preemptive = true
elsif rand(100) < percent_back_attack
$back_attack = true
end
special_back_attack_conditions
special_preemptive_conditions
$preemptive = false if $back_attack or !PREEMPTIVE
$back_attack = false if !BACK_ATTACK
end
#--------------------------------------------------------------------------
def special_back_attack_conditions
for i in 0...BACK_ATTACK_SWITCH.size
return $back_attack = true if $game_switches[BACK_ATTACK_SWITCH[i]]
end
for i in 0...NO_BACK_ATTACK_SWITCH.size
return $back_attack = false if $game_switches[NON_BACK_ATTACK_SWITCH[i]]
end
for actor in $game_party.actors
return $back_attack = false if NON_BACK_ATTACK_WEAPONS.include?(actor.weapon_id)
return $back_attack = false if NON_BACK_ATTACK_ARMOR1.include?(actor.armor1_id)
return $back_attack = false if NON_BACK_ATTACK_ARMOR2.include?(actor.armor2_id)
return $back_attack = false if NON_BACK_ATTACK_ARMOR3.include?(actor.armor3_id)
return $back_attack = false if NON_BACK_ATTACK_ARMOR4.include?(actor.armor4_id)
for i in 0...NON_BACK_ATTACK_SKILLS.size
return $back_attack = false if actor.skill_id_learn?(NON_BACK_ATTACK_SKILLS[i])
end
end
end
#--------------------------------------------------------------------------
def special_preemptive_conditions
for i in 0...PREEMPTIVE_SWITCH.size
return $preemptive = true if $game_switches[PREEMPTIVE_SWITCH[i]]
end
for i in 0...NO_PREEMPTIVE_SWITCH.size
return $preemptive = false if $game_switches[NON_PREEMPTIVE_SWITCH[i]]
end
end
#--------------------------------------------------------------------------
def preemptive_plus
$preemptive_plus = false
for actor in $game_party.actors
return $preemptive_plus = true if PREEMPTIVE_WEAPONS.include?(actor.weapon_id)
return $preemptive_plus = true if PREEMPTIVE_ARMOR1.include?(actor.armor1_id)
return $preemptive_plus = true if PREEMPTIVE_ARMOR2.include?(actor.armor2_id)
return $preemptive_plus = true if PREEMPTIVE_ARMOR3.include?(actor.armor3_id)
return $preemptive_plus = true if PREEMPTIVE_ARMOR4.include?(actor.armor4_id)
for i in 0...PREEMPTIVE_SKILLS.size
return $preemptive_plus = true if actor.skill_id_learn?(PREEMPTIVE_SKILLS[i])
end
end
end
end
#==============================================================================
# ■ Spriteset_Battle
#==============================================================================
class Spriteset_Battle
#--------------------------------------------------------------------------
attr_reader :viewport1
attr_reader :viewport2
attr_accessor :actor_sprites
attr_accessor :enemy_sprites
#--------------------------------------------------------------------------
include N01
#--------------------------------------------------------------------------
def initialize
@viewport1 = Viewport.new(0, 0, 640, 480)
@viewport2 = Viewport.new(0, 0, 640, 480)
@viewport3 = Viewport.new(0, 0, 640, 480)
@viewport4 = Viewport.new(0, 0, 640, 480)
@viewport2.z = 101
@viewport3.z = 200
@viewport4.z = 5000
@battleback_sprite = Sprite.new(@viewport1)
@battleback_sprite.mirror = true if $back_attack && BACK_ATTACK_BATTLE_BACK_MIRROR
@enemy_sprites = []
for enemy in $game_troop.enemies
@enemy_sprites.push(Sprite_Battler.new(@viewport2, enemy))
end
@actor_sprites = []
for i in 0...$game_party.actors.size
@actor_sprites.push(Sprite_Battler.new(@viewport2, $game_party.actors[i]))
end
@weather = RPG::Weather.new(@viewport1)
@picture_sprites = []
for i in 51..100
@picture_sprites.push(Sprite_Picture.new(@viewport3, $game_screen.pictures[i]))
end
@timer_sprite = Sprite_Timer.new
update
end
#--------------------------------------------------------------------------
def update
if $game_party.actors.size > @actor_sprites.size
for i in @actor_sprites.size...$game_party.actors.size
@actor_sprites.push(Sprite_Battler.new(@viewport2, $game_party.actors[i]))
end
elsif @actor_sprites.size > $game_party.actors.size
for i in 0...@actor_sprites.size
@actor_sprites[i].dispose
end
@actor_sprites = []
for i in 0...$game_party.actors.size
@actor_sprites.push(Sprite_Battler.new(@viewport2, $game_party.actors[i]))
end
end
for i in 0...$game_party.actors.size
@actor_sprites[i].battler = $game_party.actors[i]
end
if @battleback_name != $game_temp.battleback_name
@battleback_name = $game_temp.battleback_name
if @battleback_sprite.bitmap != nil
@battleback_sprite.bitmap.dispose
end
@battleback_sprite.bitmap = RPG::Cache.battleback(@battleback_name)
@battleback_sprite.src_rect.set(0, 0, 640, 480)
end
for sprite in @enemy_sprites + @actor_sprites
sprite.update
end
@weather.type = $game_screen.weather_type
@weather.max = $game_screen.weather_max
@weather.update
for sprite in @picture_sprites
sprite.update
end
@timer_sprite.update
@viewport1.tone = $game_screen.tone
@viewport1.ox = $game_screen.shake
@viewport2.tone = $game_screen.tone
@viewport2.ox = $game_screen.shake
@viewport4.color = $game_screen.flash_color
@viewport1.update
@viewport2.update
@viewport4.update
end
#--------------------------------------------------------------------------
def set_damage_action(actor, index, action)
return if index.nil?
@actor_sprites[index].damage_action(action) if actor
@enemy_sprites[index].damage_action(action) unless actor
end
#--------------------------------------------------------------------------
def set_damage_pop(actor, index, damage)
return if index.nil?
@actor_sprites[index].damage_pop if actor
@enemy_sprites[index].damage_pop unless actor
end
#--------------------------------------------------------------------------
def set_target(actor, index, target)
return if index.nil?
@actor_sprites[index].get_target(target) if actor
@enemy_sprites[index].get_target(target) unless actor
end
#--------------------------------------------------------------------------
def set_action(actor, index, kind)
return if index.nil?
@actor_sprites[index].start_action(kind) if actor
@enemy_sprites[index].start_action(kind) unless actor
end
#--------------------------------------------------------------------------
def set_stand_by_action(actor, index)
return if index.nil?
@actor_sprites[index].push_stand_by if actor
@enemy_sprites[index].push_stand_by unless actor
end
end
#==============================================================================
# ■ Sprite_MoveAnime
#==============================================================================
class Sprite_MoveAnime < RPG::Sprite
#--------------------------------------------------------------------------
attr_accessor :battler
attr_accessor :base_x
attr_accessor :base_y
#--------------------------------------------------------------------------
def initialize(viewport,battler = nil)
super(viewport)
@battler = battler
self.visible = false
@base_x = 0
@base_y = 0
@move_x = 0
@move_y = 0
@moving_x = 0
@moving_y = 0
@orbit = 0
@orbit_plus = 0
@orbit_time = 0
@through = false
@finish = false
@time = 0
@angle = 0
@angling = 0
end
#--------------------------------------------------------------------------
def anime_action(id,mirror,distanse_x,distanse_y,type,speed,orbit,weapon,icon_index,icon_weapon)
@time = speed
@moving_x = distanse_x / speed
@moving_y = distanse_y / speed
@through = true if type == 1
@orbit_plus = orbit
@orbit_time = @time
if weapon != ""
action = ANIME[weapon].dup
@angle = action[0]
end_angle = action[1]
time = action[2]
@angling = (end_angle - @angle)/ time
self.angle = @angle
self.mirror = mirror
if icon_weapon
self.bitmap = RPG::Cache.icon(icon_index)
self.ox = 12
self.oy = 12
else
self.bitmap = RPG::Cache.character(icon_index, 0)
self.ox = self.bitmap.width / 2
self.oy = self.bitmap.height / 2
end
self.visible = true
self.z = 1000
end
self.x = @base_x + @move_x
self.y = @base_y + @move_y + @orbit
if id != 0 && !icon_weapon
animation($data_animations[id],true)
elsif id != 0 && icon_weapon
loop_animation($data_animations[id])
end
end
#--------------------------------------------------------------------------
def action_reset
@moving_x = @moving_y = @move_x = @move_y = @base_x = @base_y = @orbit = 0
@orbit_time = @angling = @angle = 0
@through = self.visible = @finish = false
dispose_animation
end
#--------------------------------------------------------------------------
def finish?
return @finish
end
#--------------------------------------------------------------------------
def update
super
@time -= 1
if @time >= 0
@move_x += @moving_x
@move_y += @moving_y
if @time < @orbit_time / 2
@orbit_plus = @orbit_plus * 5 / 4
elsif @time == @orbit_time / 2
@orbit_plus *= -1
else
@orbit_plus = @orbit_plus * 2 / 3
end
@orbit += @orbit_plus
end
@time = 100 if @time < 0 && @through
@finish = true if @time < 0 && !@through
self.x = @base_x + @move_x
self.y = @base_y + @move_y + @orbit
if self.x < -200 or self.x > 840 or self.y < -200 or self.y > 680
@finish = true
end
if self.visible
@angle += @angling
self.angle = @angle
end
end
end
#==============================================================================
# ■ Sprite_Weapon
#==============================================================================
class Sprite_Weapon < RPG::Sprite
#--------------------------------------------------------------------------
include N01
#--------------------------------------------------------------------------
attr_accessor :battler
#--------------------------------------------------------------------------
def initialize(viewport,battler = nil)
super(viewport)
@battler = battler
@action = []
@move_x = 0
@move_y = 0
@move_z = 0
@plus_x = 0
@plus_y = 0
@angle = 0
@zoom_x = 1
@zoom_y = 1
@moving_x = 0
@moving_y = 0
@angling = 0
@zooming_x = 1
@zooming_y = 1
@freeze = -1
@mirroring = false
@time = ANIME_PATTERN + 1
weapon_graphics
end
#--------------------------------------------------------------------------
def dispose
self.bitmap.dispose if self.bitmap != nil
super
end
#--------------------------------------------------------------------------
def weapon_graphics(left = false)
if @battler.actor?
weapon = @battler.weapons[0] unless left
weapon = @battler.weapons[1] if left
else
weapon = $data_weapons[@battler.weapon]
@mirroring = true if @battler.action_mirror
end
return if weapon == nil
if weapon.graphic == ""
self.bitmap = RPG::Cache.icon(weapon.icon_name)
@weapon_width = @weapon_height = 24
else
self.bitmap = RPG::Cache.icon(weapon.graphic)
@weapon_width = self.bitmap.width
@weapon_height = self.bitmap.height
end
end
#--------------------------------------------------------------------------
def freeze(action)
@freeze = action
end
#--------------------------------------------------------------------------
def weapon_action(action,loop)
if action == ""
self.visible = false
elsif @weapon_id == 0
self.visible = false
else
@action = ANIME[action]
act0 = @action[0]
act1 = @action[1]
act2 = @action[2]
act3 = @action[3]
act4 = @action[4]
act5 = @action[5]
act6 = @action[6]
act7 = @action[7]
act8 = @action[8]
act9 = @action[9]
act10 = @action[10]
if @mirroring
act0 *= -1
act3 *= -1
act4 *= -1
act9 *= -1
end
if $back_attack && BACK_ATTACK
act0 *= -1
act3 *= -1
act4 *= -1
act9 *= -1
end
time = ANIME_PATTERN
if act2
self.z = @battler.position_z + 1
else
self.z = @battler.position_z - 1
end
if act6
if self.mirror
self.mirror = false
else
self.mirror = true
end
end
if @mirroring
if self.mirror
self.mirror = false
else
self.mirror = true
end
end
if $back_attack && BACK_ATTACK
if self.mirror
self.mirror = false
else
self.mirror = true
end
end
@moving_x = act0 / time
@moving_y = act1 / time
@angle = act3
self.angle = @angle
@angling = (act4 - act3)/ time
@angle += (act4 - act3) % time
@zooming_x = (1 - act7) / time
@zooming_y = (1 - act8) / time
if self.mirror
case act5
when 1
act5 = 2
when 2
act5 = 1
when 3
act5 = 4
when 4
act5 = 3
end
end
case act5
when 0
self.ox = @weapon_width / 2
self.oy = @weapon_height / 2
when 1
self.ox = 0
self.oy = 0
when 2
self.ox = @weapon_width
self.oy = 0
when 3
self.ox = 0
self.oy = @weapon_height
when 4
self.ox = @weapon_width
self.oy = @weapon_height
end
@plus_x = act9
@plus_y = act10
@loop = true if loop == 0
@angle -= @angling
@zoom_x -= @zooming_x
@zoom_y -= @zooming_y
@move_x -= @moving_x
@move_y -= @moving_y
@move_z = 1000 if act2
if @freeze != -1
for i in 0..@freeze + 1
@angle += @angling
@zoom_x += @zooming_x
@zoom_y += @zooming_y
@move_x += @moving_x
@move_y += @moving_y
end
@angling = 0
@zooming_x = 0
@zooming_y = 0
@moving_x = 0
@moving_y = 0
end
self.visible = true
end
end
#--------------------------------------------------------------------------
def action_reset
@moving_x = @moving_y = @move_x = @move_y = @plus_x = @plus_y = 0
@angling = @zooming_x = @zooming_y = @angle = self.angle = @move_z = 0
@zoom_x = @zoom_y = self.zoom_x = self.zoom_y = 1
self.mirror = self.visible = @loop = false
@freeze = -1
@action = []
@time = ANIME_PATTERN + 1
end
#--------------------------------------------------------------------------
def action_loop
@angling *= -1
@zooming_x *= -1
@zooming_y *= -1
@moving_x *= -1
@moving_y *= -1
end
#--------------------------------------------------------------------------
def mirroring
return @mirroring = false if @mirroring
@mirroring = true
end
#--------------------------------------------------------------------------
def action
return if @time <= 0
@time -= 1
@angle += @angling
@zoom_x += @zooming_x
@zoom_y += @zooming_y
@move_x += @moving_x
@move_y += @moving_y
if @loop && @time == 0
@time = ANIME_PATTERN + 1
action_loop
end
end
#--------------------------------------------------------------------------
def update
super
self.angle = @angle
self.zoom_x = @zoom_x
self.zoom_y = @zoom_y
self.x = @battler.position_x + @move_x + @plus_x
self.y = @battler.position_y + @move_y + @plus_y
self.z = @battler.position_z + @move_z - 1
end
end
#==============================================================================
# Game_Party
#==============================================================================
class Game_Party
#--------------------------------------------------------------------------
include N01
#--------------------------------------------------------------------------
def add_actor(actor_id)
actor = $game_actors[actor_id]
if @actors.size < MAX_MEMBER and not @actors.include?(actor)
@actors.push(actor)
$game_player.refresh
end
end
end
#==============================================================================
# ■ RPG::Weapon
#==============================================================================
class RPG::Weapon
#--------------------------------------------------------------------------
def magic?
return false
end
end
#==============================================================================
# ■ RPG::Skill
#==============================================================================
class RPG::Skill
#--------------------------------------------------------------------------
def magic?
return @atk_f == 0 ? true : false
end
end
#==============================================================================
# ■ RPG::Item
#==============================================================================
class RPG::Item
#--------------------------------------------------------------------------
def magic?
return false
end
end
#==============================================================================
# ■ RPG::Cache
#==============================================================================
module RPG::Cache
def self.faces(filename, hue = 0)
self.load_bitmap('Graphics/Faces/', filename, hue)
end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
include N01
#--------------------------------------------------------------------------
attr_accessor :sp_damage
attr_accessor :collapse
attr_accessor :move_x
attr_accessor :move_y
attr_accessor :move_z
attr_accessor :jump
attr_accessor :active
attr_accessor :non_dead
attr_accessor :slip_damage
attr_accessor :derivation
attr_accessor :individual
attr_accessor :play
attr_accessor :force_action
attr_accessor :force_target
attr_accessor :revival
attr_accessor :reflex
attr_accessor :absorb
attr_accessor :anime_mirror
attr_accessor :dying
attr_accessor :state_animation_id
attr_accessor :dead_anim
attr_accessor :missed
attr_accessor :evaded
attr_accessor :true_immortal
attr_accessor :defense_pose
attr_reader :base_position_x
attr_reader :base_position_y
attr_reader :base_height
#--------------------------------------------------------------------------
alias initialize_n01 initialize
def initialize
initialize_n01
@move_x = @move_y = @move_z = @plus_y = @jump = @derivation = @act_time = 0
@force_action = @force_target = @base_position_x = @base_position_y = 0
@absorb = @play = @now_state = @state_frame = @state_animation_id = 0
@active = @non_dead = @individual = @slip_damage = @revival = false
@collapse = @sp_damage = @anime_mirror = @dying = false
@evaded = @missed = false
@anim_states = []
end
#--------------------------------------------------------------------------
def state_id
return @states[@states.size - 1]
end
#--------------------------------------------------------------------------
def in_danger
return @hp <= self.maxhp / 4
end
#--------------------------------------------------------------------------
def battler_states
bat_states = []
for i in self.states
bat_states.push($data_states[i])
end
return bat_states
end
#--------------------------------------------------------------------------
def apply_variance(damage, variance)
if damage != 0
amp = [damage.abs * variance / 100, 0].max
damage += rand(amp+1) + rand(amp+1) - amp
end
return damage
end
#--------------------------------------------------------------------------
def state_animation_id
return 0 if @states.empty?
return 0 if @states.include?(1)
@state_frame -= 1 if @state_frame > 0
return @state_animation_id if @state_frame > 0
if @anim_states.empty?
for state in @states
@anim_states << state if $data_states[state].animation_id > 0
end
end
now_state = @anim_states.shift
return 0 if now_state.nil?
@state_animation_id = $data_states[now_state].animation_id
return 0 if $data_animations[@state_animation_id].nil?
@state_frame = $data_animations[@state_animation_id].frame_max * STATE_CYCLE_TIME * 2
return @state_animation_id
end
#--------------------------------------------------------------------------
def skill_can_use?(skill_id)
skill = $data_skills[skill_id]
if skill.extension.include?("CONSUMEHP")
return false if calc_sp_cost(self, skill) >= self.hp
else
return false if calc_sp_cost(self, skill) > self.sp
end
return false if dead?
return false if skill.atk_f == 0 and self.restriction == 1
occasion = skill.occasion
return (occasion == 0 or occasion == 1) if $game_temp.in_battle
return (occasion == 0 or occasion == 2)
end
#--------------------------------------------------------------------------
def calc_sp_cost(user, skill)
cost = skill.sp_cost
if skill.extension.include?("%COSTMAX")
return user.maxhp * cost / 100 if skill.extension.include?("CONSUMEHP")
return user.maxsp * cost / 100
elsif skill.extension.include?("%COSTNOW")
return user.hp * cost / 100 if skill.extension.include?("CONSUMEHP")
return user.sp * cost / 100
end
return cost
end
#--------------------------------------------------------------------------
def consum_skill_cost(skill)
return false unless skill_can_use?(skill.id)
cost = calc_sp_cost(self, skill)
return self.hp -= cost if skill.extension.include?("CONSUMEHP")
return self.sp -= cost
end
#--------------------------------------------------------------------------
def attack_effect(attacker)
self.critical = @evaded = @missed = false
hit_result = (rand(100) < attacker.hit)
set_attack_result(attacker) if hit_result
weapon = attacker.actor? ? $data_weapons[attacker.weapon_id] : nil
if hit_result
set_attack_state_change(attacker)
else
self.critical = false
@missed = true
end
self.damage = POP_EVA if @evaded
self.damage = POP_MISS if @missed
return true
end
#--------------------------------------------------------------------------
def perfect_attack_effect(attacker)
self.critical = @evaded = @missed = false
set_attack_result(attacker)
weapon = attacker.actor? ? $data_weapons[attacker.weapon_id] : nil
set_attack_state_change(attacker)
return true
end
#--------------------------------------------------------------------------
def set_attack_result(attacker)
set_attack_damage_value(attacker)
if self.damage > 0
self.damage /= 2 if self.guarding?
set_attack_critical(attacker)
set_critical_damage(attacker) if self.critical
end
apply_variance(15) if self.damage.abs > 0
set_attack_hit_value(attacker)
end
#--------------------------------------------------------------------------
def set_attack_damage_value(attacker)
case DAMAGE_ALGORITHM_TYPE
when 0
atk = [attacker.atk - (self.pdef / 2), 0].max
str = [20 + attacker.str, 0].max
when 1
atk = [attacker.atk - ((attacker.atk * self.pdef) / 1000), 0].max
str = [20 + attacker.str, 0].max
when 2
atk = 20
str = [(attacker.str * 4) - (self.dex * 2) , 0].max
when 3
atk = [(10 + attacker.atk) - (self.pdef / 2), 0].max
str = [(20 + attacker.str) - (self.dex / 2), 0].max
end
self.damage = atk * str / 20
self.damage = 1 if self.damage == 0 and (rand(100) > 40)
self.damage *= elements_correct(attacker.element_set)
self.damage /= 100
end
#--------------------------------------------------------------------------
def apply_variance(variance)
amp = [self.damage.abs * variance / 100, 1].max
self.damage += rand(amp + 1) + rand(amp + 1) - amp
end
#--------------------------------------------------------------------------
def set_attack_hit_value(attacker)
atk_hit = DAMAGE_ALGORITHM_TYPE > 1 ? attacker.agi : attacker.dex
eva = (8 * self.agi / atk_hit) + self.eva
hit = self.damage < 0 ? 100 : 100 - eva
hit = self.cant_evade? ? 100 : hit
hit_result = (rand(100) < hit)
@evaded = true unless hit_result
end
#--------------------------------------------------------------------------
def set_attack_critical(attacker)
atk_crt = DAMAGE_ALGORITHM_TYPE > 1 ? attacker.agi : attacker.dex
self.critical = rand(100) < 5 * atk_crt / self.agi
end
#--------------------------------------------------------------------------
def set_critical_damage(attacker)
self.damage += self.damage
end
#--------------------------------------------------------------------------
def set_attack_state_change(attacker)
remove_states_shock
effective = apply_damage(attacker)
@state_changed = false
states_plus(attacker.plus_state_set)
states_minus(attacker.minus_state_set)
return effective
end
#--------------------------------------------------------------------------
def skill_effect(user, skill)
self.critical = @evaded = @missed = false
if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
return false
end
effective = false
effective |= skill.common_event_id > 0
hit = skill.hit
hit *= set_skill_hit(user, skill)
hit_result = (rand(100) < hit)
effective |= hit < 100
effective |= set_skill_result(user, skill, effective) if hit_result
if hit_result
effective |= set_skill_state_change(user, skill, effective)
else
@missed = true unless @evaded
end
self.damage = nil unless $game_temp.in_battle
self.damage = POP_EVA if @evaded
self.damage = POP_MISS if @missed
return effective
end
#--------------------------------------------------------------------------
def perfect_skill_effect(user, skill)
self.critical = @evaded = @missed = false
if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
return false
end
effective = false
effective |= skill.common_event_id > 0
effective |= set_skill_result(user, skill, effective)
effective |= set_skill_state_change(user, skill, effective)
self.damage = nil unless $game_temp.in_battle
return effective
end
#--------------------------------------------------------------------------
def set_skill_hit(user, skill)
if skill.magic?
return 1
else
return user.hit / 100
end
end
#--------------------------------------------------------------------------
def set_skill_result(user, skill, effective)
set_skill_damage_value(user, skill)
if self.damage > 0
self.damage /= 2 if self.guarding?
end
apply_variance(skill.variance) if skill.variance > 0 and self.damage.abs > 0
effective |= set_skill_hit_value(user, skill, effective)
return effective
end
#--------------------------------------------------------------------------
def set_skill_damage_value(user, skill)
power = set_skill_power(user, skill)
if power > 0
case DAMAGE_ALGORITHM_TYPE
when 0,3
power -= (self.pdef * skill.pdef_f) / 200
power -= (self.mdef * skill.mdef_f) / 200
when 1
power -= (power * (self.pdef * skill.pdef_f)) / 100000
power -= (power * (self.mdef * skill.mdef_f)) / 100000
when 2
power -= ((self.dex * 2 * skill.pdef_f) / 100)
power -= ((self.int * 1 * skill.mdef_f) / 100)
end
power = [power, 0].max
end
rate = set_skill_rate(user, skill) unless DAMAGE_ALGORITHM_TYPE == 2
rate = [rate, 0].max
self.damage = power * rate / 20
self.damage *= elements_correct(skill.element_set)
self.damage /= 100
end
#--------------------------------------------------------------------------
def set_skill_power(user, skill)
case DAMAGE_ALGORITHM_TYPE
when 0,1,3
power = skill.power + ((user.atk * skill.atk_f) / 100)
when 2
user_str = (user.str * 4 * skill.str_f / 100)
user_int = (user.int * 2 * skill.int_f / 100)
if skill.power > 0
power = skill.power + user_str + user_int
else
power = skill.power - user_str - user_int
end
end
return power
end
#--------------------------------------------------------------------------
def set_skill_rate(user, skill)
case DAMAGE_ALGORITHM_TYPE
when 0,1,2
rate = 20
when 3
rate = 40
rate -= (self.dex / 2 * skill.pdef_f / 200)
rate -= ((self.dex + self.int)/ 4 * skill.mdef_f / 200)
end
rate += (user.str * skill.str_f / 100)
rate += (user.dex * skill.dex_f / 100)
rate += (user.agi * skill.agi_f / 100)
rate += (user.int * skill.int_f / 100)
return rate
end
#--------------------------------------------------------------------------
def set_skill_hit_value(user, skill, effective)
atk_hit = DAMAGE_ALGORITHM_TYPE > 1 ? user.agi : user.dex
eva = 8 * self.agi / atk_hit + self.eva
hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
hit = self.cant_evade? ? 100 : hit
hit_result = (rand(100) < hit)
@evaded = true unless hit_result
effective |= hit < 100
return effective
end
#--------------------------------------------------------------------------
def set_skill_state_change(user, skill, effective = false)
if skill.power != 0 and not skill.magic?
remove_states_shock
effective = true
end
effective |= apply_damage(user)
@state_changed = false
effective |= states_plus(skill.plus_state_set)
effective |= states_minus(skill.minus_state_set)
if skill.power == 0
self.damage = ""
@missed = true unless @state_changed
end
return effective
end
#--------------------------------------------------------------------------
def apply_damage(user)
return true if @evaded or @missed or not self.damage.is_a?(Numeric)
if self.sp_damage
last_sp = self.sp
self.sp -= self.damage
effective = self.sp != last_sp
else
last_hp = self.hp
self.hp -= self.damage
effective = self.hp != last_hp
end
return effective
end
#--------------------------------------------------------------------------
def item_effect(item)
self.critical = @evaded = @missed = false
if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
((item.scope == 5 or item.scope == 6) and self.hp >= 1)
return false
end
effective = false
effective |= item.common_event_id > 0
hit_result = (rand(100) < item.hit)
@missed = true unless hit_result
effective |= item.hit < 100
if hit_result == true
effective |= make_item_damage_value(item)
else
@missed = true
end
self.damage = nil unless $game_temp.in_battle
self.damage = POP_MISS if @missed
return effective
end
#--------------------------------------------------------------------------
def perfect_item_effect(item)
self.critical = @evaded = @missed = false
if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
((item.scope == 5 or item.scope == 6) and self.hp >= 1)
return false
end
effective = false
effective |= item.common_event_id > 0
effective |= item.hit < 100
effective |= make_item_damage_value(item)
self.damage = nil unless $game_temp.in_battle
self.damage = POP_MISS if @missed
return effective
end
#--------------------------------------------------------------------------
def make_item_damage_value(item)
recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp
recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp
if recover_hp < 0
recover_hp += self.pdef * item.pdef_f / 20
recover_hp += self.mdef * item.mdef_f / 20
recover_hp = [recover_hp, 0].min
end
recover_hp *= elements_correct(item.element_set)
recover_hp /= 100
recover_sp *= elements_correct(item.element_set)
recover_sp /= 100
if item.variance > 0 and recover_hp.abs > 0
amp = [recover_hp.abs * item.variance / 100, 1].max
recover_hp += rand(amp+1) + rand(amp+1) - amp
end
if item.variance > 0 and recover_sp.abs > 0
amp = [recover_sp.abs * item.variance / 100, 1].max
recover_sp += rand(amp+1) + rand(amp+1) - amp
end
recover_hp /= 2 if recover_hp < 0 and self.guarding?
self.damage = -recover_hp
last_hp = self.hp
last_sp = self.sp
self.hp += recover_hp
self.sp += recover_sp
effective |= self.hp != last_hp
effective |= self.sp != last_sp
@state_changed = false
effective |= states_plus(item.plus_state_set)
effective |= states_minus(item.minus_state_set)
if item.parameter_type > 0 and item.parameter_points != 0
case item.parameter_type
when 1
@maxhp_plus += item.parameter_points
when 2
@maxsp_plus += item.parameter_points
when 3
@str_plus += item.parameter_points
when 4
@dex_plus += item.parameter_points
when 5
@agi_plus += item.parameter_points
when 6
@int_plus += item.parameter_points
end
effective = true
end
if item.recover_hp_rate == 0 and item.recover_hp == 0
self.damage = ""
if item.recover_sp_rate == 0 and item.recover_sp == 0 and
(item.parameter_type == 0 or item.parameter_points == 0)
unless @state_changed
@missed = true
end
end
end
return effective
end
#--------------------------------------------------------------------------
alias skill_effect_n01 skill_effect
def skill_effect(user, skill)
now_hp = self.hp
if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
return false
end
effective = skill_effect_n01(user, skill)
return if effective == false
check_extension(skill)
if @ratio_maxdamage != nil
self.damage = self.maxhp * @ratio_maxdamage / 100 unless @sp_damage
self.damage = self.maxsp * @ratio_maxdamage / 100 if @sp_damage
end
if @ratio_nowdamage != nil
self.damage = self.hp * @ratio_nowdamage / 100 unless @sp_damage
self.damage = self.sp * @ratio_nowdamage / 100 if @sp_damage
end
if @cost_damage
cost = calc_sp_cost(user, skill)
if skill.extension.include?("CONSUMEHP")
self.damage = self.damage * cost / user.maxhp
else
self.damage = self.damage * cost / user.maxsp
end
end
self.damage = self.damage * user.hp / user.maxhp if @nowhp_damage
self.damage = self.damage * user.sp / user.maxsp if @nowsp_damage
if @sp_damage
self.hp = now_hp
self.sp -= self.damage
elsif @extension
self.hp = now_hp
self.hp -= self.damage
end
return true
end
#--------------------------------------------------------------------------
alias perfect_skill_effect_n01 perfect_skill_effect
def perfect_skill_effect(user, skill)
now_hp = self.hp
if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
return false
end
effective = perfect_skill_effect_n01(user, skill)
return if effective == false
check_extension(skill)
if @ratio_maxdamage != nil
self.damage = self.maxhp * @ratio_maxdamage / 100 unless @sp_damage
self.damage = self.maxsp * @ratio_maxdamage / 100 if @sp_damage
end
if @ratio_nowdamage != nil
self.damage = self.hp * @ratio_nowdamage / 100 unless @sp_damage
self.damage = self.sp * @ratio_nowdamage / 100 if @sp_damage
end
if @cost_damage
cost = calc_sp_cost(user, skill)
if skill.extension.include?("CONSUMEHP")
self.damage = self.damage * cost / user.maxhp
else
self.damage = self.damage * cost / user.maxsp
end
end
self.damage = self.damage * user.hp / user.maxhp if @nowhp_damage
self.damage = self.damage * user.sp / user.maxsp if @nowsp_damage
if @sp_damage
self.hp = now_hp
self.sp -= self.damage
elsif @extension
self.hp = now_hp
self.hp -= self.damage
end
return true
end
#--------------------------------------------------------------------------
def check_extension(skill)
@extension = false
@sp_damage = false
@cost_damage = false
@nowhp_damage = false
@nowsp_damage = false
@ratio_maxdamage = nil
@ratio_nowdamage = nil
for ext in skill.extension
break if self.damage == "Errou!" or self.damage == "" or self.damage == 0
if ext == "SPDAMAGE"
next @sp_damage = true
elsif ext == "COSTPOWER"
@extension = true
next @cost_damage = true
elsif ext == "HPNOWPOWER"
@extension = true
next @nowhp_damage = true
elsif ext == "MPNOWPOWER"
@extension = true
next @nowsp_damage = true
else
name = ext.split('')
if name[7] == "M"
name = name.join
name.slice!("%DAMAGEMAX/")
@extension = true
next @ratio_maxdamage = name.to_i
elsif name[7] == "N"
name = name.join
name.slice!("%DAMAGENOW/")
@extension = true
next @ratio_nowdamage = name.to_i
end
end
end
end
#--------------------------------------------------------------------------
def change_base_position(x, y)
@base_position_x = x
@base_position_y = y
end
#--------------------------------------------------------------------------
def reset_coordinate
@move_x = @move_y = @move_z = @jump = @derivation = 0
@active = @non_dead = @individual = false
end
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
attr_reader :armor5_id
attr_reader :armor6_id
attr_reader :armor7_id
attr_accessor :actor_height
attr_accessor :two_swords_change
#--------------------------------------------------------------------------
include N01
#--------------------------------------------------------------------------
def actor?
return true
end
#--------------------------------------------------------------------------
def weapons
return [$data_weapons[@weapon_id]]
end
#--------------------------------------------------------------------------
def armors
result = []
result << $data_armors[@armor1_id]
result << $data_armors[@armor2_id]
result << $data_armors[@armor3_id]
result << $data_armors[@armor4_id]
return result
end
#--------------------------------------------------------------------------
def equips
return weapons + armors
end
#--------------------------------------------------------------------------
def skill_id_learn?(skill_id)
return @skills.include?(skill_id)
end
#--------------------------------------------------------------------------
def exp=(exp)
@exp = [exp, 0].max
while @exp >= @exp_list[@level+1] and @exp_list[@level+1] > 0
@level += 1
for j in $data_classes[@class_id].learnings
if j.level == @level
learn_skill(j.skill_id)
end
end
end
while @exp < @exp_list[@level]
@level -= 1
end
@hp = [@hp, self.maxhp].min
@sp = [@sp, self.maxsp].min
end
#--------------------------------------------------------------------------
def base_atk
n = 0
for item in weapons.compact do n += item.atk end
n = UNARMED_ATTACK if weapons[0] == nil and weapons[1] == nil
return n
end
#--------------------------------------------------------------------------
def base_pdef
n = 0
for item in equips.compact do n += item.pdef end
return n
end
#--------------------------------------------------------------------------
def base_mdef
n = 0
for item in equips.compact do n += item.mdef end
return n
end
#--------------------------------------------------------------------------
def base_eva
n = 0
for item in armors.compact do n += item.eva end
return n
end
#--------------------------------------------------------------------------
def graphic_change(character_name)
@character_name = character_name
end
#--------------------------------------------------------------------------
def perform_collapse
$game_system.se_play($data_system.actor_collapse_se) if $game_temp.in_battle and dead?
end
#--------------------------------------------------------------------------
def base_position
base = ACTOR_POSITION[self.index]
@base_position_x = base[0]
@base_position_y = base[1]
@base_position_x = 640 - base[0] if $back_attack and BACK_ATTACK_MIRROR
end
#--------------------------------------------------------------------------
def actor_height
@base_height = 0 if CURSOR_TYPE != 1
@base_height = 72 if CURSOR_TYPE == 1
return @base_height
end
#--------------------------------------------------------------------------
def position_x
return 0 if self.index == nil
return @base_position_x + @move_x
end
#--------------------------------------------------------------------------
def position_y
return 0 if self.index == nil
return @base_position_y + @move_y + @jump
end
#--------------------------------------------------------------------------
def position_z
return 0 if self.index == nil
return position_y + @move_z - @jump + 200
end
end
#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
include N01
#--------------------------------------------------------------------------
attr_accessor :adj_speed
attr_accessor :act_time
#--------------------------------------------------------------------------
def actor?
return false
end
#--------------------------------------------------------------------------
def make_action_speed2(adj)
@adj_speed = @current_action.speed if @adj_speed == nil
@adj_speed = @adj_speed * adj / 100
end
#--------------------------------------------------------------------------
def perform_collapse
@force_action = ["N01collapse"] if $game_temp.in_battle and dead?
end
#--------------------------------------------------------------------------
def element_set2
return []
end
#--------------------------------------------------------------------------
def base_position
return if self.index == nil
bitmap = Bitmap.new("Graphics/Battlers/" + @battler_name) if !self.anime_on
bitmap = Bitmap.new("Graphics/Characters/" + @battler_name) if self.anime_on && WALK_ANIME
bitmap = Bitmap.new("Graphics/Characters/" + @battler_name + "_1") if self.anime_on && !WALK_ANIME
height = bitmap.height
@base_position_x = self.screen_x + self.position_plus[0]
@base_position_y = self.screen_y + self.position_plus[1] - height / 3 + 32
@base_position_x = 640 - self.screen_x - self.position_plus[0] if $back_attack and BACK_ATTACK_MIRROR
@base_height = 0 if CURSOR_TYPE == 0
@base_height = height / 3 + 64 if CURSOR_TYPE == 1 if !self.anime_on
@base_height = height /12 + 64 if CURSOR_TYPE == 1 if self.anime_on
@base_height = -(height / 3) if CURSOR_TYPE == 2 if !self.anime_on
@base_height = -(height /12) if CURSOR_TYPE == 2 if self.anime_on
bitmap.dispose
end
#--------------------------------------------------------------------------
def enemy_height
return @base_height
end
#--------------------------------------------------------------------------
def position_x
return @base_position_x - @move_x
end
#--------------------------------------------------------------------------
def position_y
return @base_position_y + @move_y + @jump
end
#--------------------------------------------------------------------------
def position_z
return position_y + @move_z - @jump + 200
end
end
#==============================================================================
# Arrow_Base
#==============================================================================
class Arrow_Base < Sprite
#--------------------------------------------------------------------------
include N01
#--------------------------------------------------------------------------
def update_multi_arrow
return if @arrows == nil or @arrows == []
for i in [email=0...@arrows.size]0...@arrows.size[/email]
@blink_count = (@blink_count + 1) % 40
if @blink_count < 20
@arrows[i].src_rect.set(128, 96, 32, 32) if @arrows[i] != nil
else
@arrows[i].src_rect.set(160, 96, 32, 32) if @arrows[i] != nil
end
end
end
#--------------------------------------------------------------------------
def dispose_multi_arrow
for i in [email=0...@arrows.size]0...@arrows.size[/email]
@arrows[i].dispose if @arrows[i] != nil
end
end
end
#==============================================================================
# Arrow_Enemy_All
#==============================================================================
class Arrow_Enemy_All < Arrow_Base
#--------------------------------------------------------------------------
def initialize(viewport)
super(viewport)
@arrows = []
for battler in $game_troop.enemies
if battler.exist?
@arrows[battler.index] = Arrow_Enemy.new(viewport)
@arrows[battler.index].index = battler.index
end
end
end
#--------------------------------------------------------------------------
def update_multi_arrow
super
for i in [email=0...@arrows.size]0...@arrows.size[/email]
enemy = $game_troop.enemies[i]
if enemy != nil && @arrows[i] != nil && @arrows[i].enemy != nil
@arrows[i].x = @arrows[i].enemy.position_x + CURSOR_POSITION[0]
@arrows[i].y = @arrows[i].enemy.position_y + CURSOR_POSITION[1] + enemy.enemy_height
end
end
end
end
#==============================================================================
# Arrow_Actor_All
#==============================================================================
class Arrow_Actor_All < Arrow_Base
#--------------------------------------------------------------------------
def initialize(viewport)
super(viewport)
@arrows = []
for battler in $game_party.actors
if battler.exist?
@arrows[battler.index] = Arrow_Actor.new(viewport)
@arrows[battler.index].index = battler.index
end
end
end
#--------------------------------------------------------------------------
def update_multi_arrow
super
for i in [email=0...@arrows.size]0...@arrows.size[/email]
actor = $game_party.actors[i]
if actor != nil && @arrows[i] != nil && @arrows[i].actor != nil
@arrows[i].x = @arrows[i].actor.position_x + CURSOR_POSITION[0]
@arrows[i].y = @arrows[i].actor.position_y + CURSOR_POSITION[1] + actor.actor_height
end
end
end
end
#==============================================================================
# Arrow_Battler_All
#==============================================================================
class Arrow_Battler_All < Arrow_Base
#--------------------------------------------------------------------------
def initialize(viewport)
super(viewport)
@arrows = []
s = 0
for battler in $game_party.actors + $game_troop.enemies
@arrows[s] = Arrow_Actor.new(viewport) if battler.actor?
@arrows[s] = Arrow_Enemy.new(viewport) if battler.is_a?(Game_Enemy)
@arrows[s].index = battler.index
s += 1
end
end
#--------------------------------------------------------------------------
def update_multi_arrow
super
s = 0
for i in [email=0...@arrows.size]0...@arrows.size[/email]
if @arrows[i].is_a?(Arrow_Actor)
actor = $game_party.actors[i]
if @arrows[i].actor != nil
@arrows[i].x = @arrows[i].actor.position_x + CURSOR_POSITION[0]
@arrows[i].y = @arrows[i].actor.position_y + CURSOR_POSITION[1] + actor.actor_height
s += 1
end
elsif @arrows[i].is_a?(Arrow_Enemy)
enemy = $game_troop.enemies[i - s]
if @arrows[i].enemy != nil or @arrows[i] != nil
@arrows[i].x = @arrows[i].enemy.position_x + CURSOR_POSITION[0]
@arrows[i].y = @arrows[i].enemy.position_y + CURSOR_POSITION[1] + enemy.enemy_height
end
end
end
end
end
#==============================================================================
# ■ Arrow_Enemy
#==============================================================================
class Arrow_Enemy < Arrow_Base
#--------------------------------------------------------------------------
def update
super
$game_troop.enemies.size.times do
break if self.enemy.exist?
@index += 1
@index %= $game_troop.enemies.size
end
if Input.repeat?(Input::RIGHT)
cursor_up if $back_attack
cursor_down unless $back_attack
end
if Input.repeat?(Input::LEFT)
cursor_up unless $back_attack
cursor_down if $back_attack
end
if Input.repeat?(Input::UP)
cursor_down
end
if Input.repeat?(Input::DOWN)
cursor_up
end
if self.enemy != nil
self.x = self.enemy.position_x + CURSOR_POSITION[0]
self.y = self.enemy.position_y + CURSOR_POSITION[1] + enemy.enemy_height
end
end
#--------------------------------------------------------------------------
def cursor_up
$game_system.se_play($data_system.cursor_se)
$game_troop.enemies.size.times do
@index += $game_troop.enemies.size - 1
@index %= $game_troop.enemies.size
break if self.enemy.exist?
end
end
#--------------------------------------------------------------------------
def cursor_down
$game_system.se_play($data_system.cursor_se)
$game_troop.enemies.size.times do
@index += 1
@index %= $game_troop.enemies.size
break if self.enemy.exist?
end
end
end
#==============================================================================
# ■ Arrow_Actor
#==============================================================================
class Arrow_Actor < Arrow_Base
#--------------------------------------------------------------------------
def update
super
if Input.repeat?(Input::RIGHT)
cursor_up if $back_attack
cursor_down unless $back_attack
end
if Input.repeat?(Input::LEFT)
cursor_up unless $back_attack
cursor_down if $back_attack
end
if Input.repeat?(Input::UP)
cursor_up
end
if Input.repeat?(Input::DOWN)
cursor_down
end
if self.actor != nil
self.x = self.actor.position_x + CURSOR_POSITION[0]
self.y = self.actor.position_y + CURSOR_POSITION[1] + actor.actor_height
end
end
#--------------------------------------------------------------------------
def cursor_up
$game_system.se_play($data_system.cursor_se)
@index += $game_party.actors.size - 1
@index %= $game_party.actors.size
end
#--------------------------------------------------------------------------
def cursor_down
$game_system.se_play($data_system.cursor_se)
@index += 1
@index %= $game_party.actors.size
end
#--------------------------------------------------------------------------
def input_right
@index += 1
@index %= $game_party.actors.size
end
#--------------------------------------------------------------------------
def input_update_target
if Input.repeat?(Input::RIGHT)
if @index == self.actor.index
cursor_up if $back_attack
cursor_down unless $back_attack
end
end
if Input.repeat?(Input::LEFT)
if @index == self.actor.index
cursor_up unless $back_attack
cursor_down if $back_attack
end
end
if Input.repeat?(Input::UP)
cursor_up if @index == self.actor.index
end
if Input.repeat?(Input::DOWN)
cursor_down if @index == self.actor.index
end
if self.actor != nil
self.x = self.actor.screen_x
self.y = self.actor.screen_y
end
end
end
#==============================================================================
# ■ Game_Troop
#==============================================================================
class Game_Troop
def clear_actions
for enemies in @enemies
enemies.current_action.clear
end
end
end
#==============================================================================
# ■ Window_Command
#==============================================================================
class Window_Command < Window_Selectable
#--------------------------------------------------------------------------
attr_accessor :commands
end
#==============================================================================
# ■ Window_Base
#==============================================================================
class Window_Base < Window
#--------------------------------------------------------------------------
include N01
#--------------------------------------------------------------------------
def draw_actor_state(actor, x, y, width = 0)
status_icon = []
for i in actor.states
if $data_states[i].rating >= 1
begin
status_icon.push(RPG::Cache.icon($data_states[i].name + "_st"))
break if status_icon.size > (Icon_max - 1)
rescue
end
end
end
for icon in status_icon
self.contents.blt(x + X_Adjust, y + Y_Adjust + 4, icon, Rect.new(0, 0, Icon_X, Icon_Y), 255)
x += Icon_X + 2
end
end
#--------------------------------------------------------------------------
def draw_actor_parameter(actor, x, y, type)
case type
when 0
parameter_name = $data_system.words.atk
parameter_value = actor.atk
when 1
parameter_name = $data_system.words.pdef
parameter_value = actor.pdef
when 2
parameter_name = $data_system.words.mdef
parameter_value = actor.mdef
when 3
parameter_name = $data_system.words.str
parameter_value = actor.str
when 4
parameter_name = (DAMAGE_ALGORITHM_TYPE == 0 ? STAT_VIT : $data_system.words.dex)
parameter_value = actor.dex
when 5
parameter_name = $data_system.words.agi
parameter_value = actor.agi
when 6
parameter_name = $data_system.words.int
parameter_value = actor.int
when 7
parameter_name = STAT_EVA
parameter_value = actor.eva
end
self.contents.font.color = system_color
self.contents.draw_text(x, y, 120, 32, parameter_name)
self.contents.font.color = normal_color
self.contents.draw_text(x + 120, y, 36, 32, parameter_value.to_s, 2)
end
end
#==============================================================================
# ■ Window_Help
#==============================================================================
class Window_Help < Window_Base
#--------------------------------------------------------------------------
def initialize
super(0, 0, 640, 64)
self.contents = Bitmap.new(width - 32, height - 32)
self.z = 2000 if $game_temp.in_battle
self.back_opacity = HELP_OPACITY if $game_temp.in_battle
end
#--------------------------------------------------------------------------
def set_text_update(text, align = 0)
self.contents.clear
self.contents.font.color = normal_color
self.contents.draw_text(4, 0, self.width - 40, 32, text, align)
@text = text
@align = align
@actor = nil
self.visible = true
end
#--------------------------------------------------------------------------
def set_enemy(enemy)
text = enemy.name
set_text_update(text, 1)
text_width = self.contents.text_size(text).width
x = (text_width + self.width)/2
status_icon = []
for i in enemy.states
if $data_states[i].rating >= 1
begin
status_icon.push(RPG::Cache.icon($data_states[i].name + "_st"))
break if status_icon.size > (Icon_max - 1)
rescue
end
end
end
for icon in status_icon
self.contents.blt(x + X_Adjust, y + Y_Adjust + 4, icon, Rect.new(0, 0, Icon_X, Icon_Y), 255)
x += Icon_X + 2
end
end
end
#==============================================================================
# ■ Window_Skill
#==============================================================================
class Window_Skill < Window_Selectable
#--------------------------------------------------------------------------
def initialize(actor)
super(0, 128, 640, 352)
@actor = actor
@column_max = 2
refresh
self.index = 0
if $game_temp.in_battle
self.y = 320
self.height = 160
self.z = 2100
self.back_opacity = MENU_OPACITY
end
end
#--------------------------------------------------------------------------
def draw_item(index)
skill = @data[index]
if @actor.skill_can_use?(skill.id)
self.contents.font.color = normal_color
else
self.contents.font.color = disabled_color
end
x = 4 + index % 2 * (288 + 32)
y = index / 2 * 32
rect = Rect.new(x, y, self.width / @column_max - 32, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
bitmap = RPG::Cache.icon(skill.icon_name)
opacity = self.contents.font.color == normal_color ? 255 : 128
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
self.contents.draw_text(x + 28, y, 204, 32, skill.name, 0)
cost = @actor.calc_sp_cost(@actor, skill)
self.contents.draw_text(x + 232, y, 48, 32, cost.to_s, 2)
end
end
#==============================================================================
# ■ Window_Item
#==============================================================================
class Window_Item < Window_Selectable
#--------------------------------------------------------------------------
def initialize
super(0, 64, 640, 416)
@column_max = 2
refresh
self.index = 0
if $game_temp.in_battle
self.y = 320
self.height = 160
self.z = 2100
self.back_opacity = MENU_OPACITY
end
end
end
#==============================================================================
# ■ Window_PartyCommand
#==============================================================================
class Window_PartyCommand < Window_Selectable
#--------------------------------------------------------------------------
alias initialize_n01 initialize
#--------------------------------------------------------------------------
def initialize
initialize_n01
self.z = 2000
end
end
#==============================================================================
# ■ Window_BattleStatus
#==============================================================================
class Window_BattleStatus < Window_Base
#--------------------------------------------------------------------------
def initialize
super(0, 320, 640, 160)
self.contents = Bitmap.new(width - 32, height - 32)
@level_up_flags = []
for i in 0...$game_party.actors.size
@level_up_flags.push(false)
end
self.z = 2000
self.opacity = STATUS_OPACITY
refresh
end
#--------------------------------------------------------------------------
def update
super
end
end
#==============================================================================
# ■ Window_NameCommand
#==============================================================================
class Window_BattleResult < Window_Base
#--------------------------------------------------------------------------
def initialize(exp, gold, treasures)
@exp = exp
@gold = gold
@treasures = treasures
super(160, 0, 320, @treasures.size * 32 + 64)
self.contents = Bitmap.new(width - 32, height - 32)
self.y = 160 - height / 2
self.back_opacity = 160
self.z = 2000
self.visible = false
refresh
end
end
#==============================================================================
# ■ Window_NameCommand
#==============================================================================
class Window_NameCommand < Window_Base
#--------------------------------------------------------------------------
def initialize(actor, x, y)
super(x, y, 160, 64)
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.font.name = Font.default_name
self.z = 2000
self.back_opacity = COMMAND_OPACITY
refresh(actor)
end
#--------------------------------------------------------------------------
def refresh(actor)
self.contents.clear
self.contents.font.color = normal_color
self.contents.draw_text(0, 0, 128, 32, actor.name, 1) if actor != nil
end
end
#==============================================================================
# ■ RPG::Sprite
#==============================================================================
class RPG::Sprite < ::Sprite
#--------------------------------------------------------------------------
include N01
#--------------------------------------------------------------------------
def initialize(viewport = nil)
super(viewport)
@_whiten_duration = 0
@_appear_duration = 0
@_escape_duration = 0
@_collapse_duration = 0
@_damage_duration = 0
@_animation_duration = 0
@_blink = false
@_damage_durations = []
@time = 0
end
#--------------------------------------------------------------------------
def appear
end
#--------------------------------------------------------------------------
def escape
end
#--------------------------------------------------------------------------
def collapse
end
#--------------------------------------------------------------------------
def damage(value, critical, sp_damage = nil)
dispose_damage(0...@_damage_durations.size)
@_damage_sprites = []
if value.is_a?(Numeric)
damage_string = value.abs.to_s
else
damage_string = value.to_s
end
@damage_size = 1 if !MULTI_POP
@damage_size = damage_string.size if MULTI_POP
for i in 0...@damage_size
letter = damage_string[i..i] if MULTI_POP
letter = damage_string if !MULTI_POP
bitmap = Bitmap.new(160, 48)
bitmap.font.name = DAMAGE_FONT
bitmap.font.size = DMG_F_SIZE
bitmap.font.color.set(0, 0, 0)
bitmap.draw_text(-1, 12-1,160, 36, letter, 1)
bitmap.draw_text(+1, 12-1,160, 36, letter, 1)
bitmap.draw_text(-1, 12+1,160, 36, letter, 1)
bitmap.draw_text(+1, 12+1,160, 36, letter, 1)
if value.is_a?(Numeric) and value < 0
bitmap.font.color.set(HP_REC_COLOR[0],HP_REC_COLOR[1],HP_REC_COLOR[2]) if !sp_damage
bitmap.font.color.set(SP_REC_COLOR[0],SP_REC_COLOR[1],SP_REC_COLOR[2]) if sp_damage
else
bitmap.font.color.set(HP_DMG_COLOR[0],HP_DMG_COLOR[1],HP_DMG_COLOR[2]) if !sp_damage
bitmap.font.color.set(SP_DMG_COLOR[0],SP_DMG_COLOR[1],SP_DMG_COLOR[2]) if sp_damage
bitmap.font.color.set(CRT_DMG_COLOR[0],CRT_DMG_COLOR[1],CRT_DMG_COLOR[2]) if critical
end
bitmap.draw_text(0, 12,160, 36, letter, 1)
if critical and CRITIC_TEXT and i == 0
x_pop = (MULTI_POP ? (damage_string.size - 1) * (DMG_SPACE / 2) : 0)
bitmap.font.size = ((DMG_F_SIZE * 2) / 3).to_i
bitmap.font.color.set(0, 0, 0)
bitmap.draw_text(-1 + x_pop, -1, 160, 20, POP_CRI, 1)
bitmap.draw_text(+1 + x_pop, -1, 160, 20, POP_CRI, 1)
bitmap.draw_text(-1 + x_pop, +1, 160, 20, POP_CRI, 1)
bitmap.draw_text(+1 + x_pop, +1, 160, 20, POP_CRI, 1)
bitmap.font.color.set(CRT_TXT_COLOR[0],CRT_TXT_COLOR[1],CRT_TXT_COLOR[2]) if critical
bitmap.draw_text(0 + x_pop, 0, 160, 20, POP_CRI, 1)
end
if critical and CRITIC_FLASH
$game_screen.start_flash(Color.new(255, 255, 255, 255),10)
end
@_damage_sprites[i] = ::Sprite.new(self.viewport)
@_damage_sprites[i].bitmap = bitmap
@_damage_sprites[i].ox = 80
@_damage_sprites[i].oy = 20
@_damage_sprites[i].x = self.x + i * DMG_SPACE
@_damage_sprites[i].y = self.y - self.oy / 2
@_damage_sprites[i].z = DMG_DURATION + 3000 + i * 2
end
end
#--------------------------------------------------------------------------
def dispose
dispose_damage(0...@_damage_durations.size)
dispose_animation
dispose_loop_animation
if @damage_sprites != nil
for damage_sprite in @damage_sprites
damage_sprite.dispose
end
end
super
end
#--------------------------------------------------------------------------
def update
super
@damage_sprites = [] if @damage_sprites.nil?
@damage_durations = [] if @damage_durations.nil?
if @_damage_sprites != nil
for sprite in @_damage_sprites
if sprite != nil and sprite.visible
x = DMG_X_MOVE
y = DMG_Y_MOVE
d = sprite.z - 3000
m = self.mirror
@damage_sprites.push(Sprite_Damage.new(sprite, x, y, d, m))
sprite.visible = false
end
end
end
for damage_sprite in @damage_sprites
damage_sprite.update
end
for i in 0...@damage_sprites.size
@damage_sprites[i] = nil if @damage_sprites[i].disposed?
end
@damage_sprites.compact!
if @_whiten_duration > 0
@_whiten_duration -= 1
self.color.alpha = 128 - (16 - @_whiten_duration) * 10
end
if @_animation != nil and (Graphics.frame_count % 2 == 0)
@_animation_duration -= 1
update_animation
end
if @_loop_animation != nil and (Graphics.frame_count % 2 == 0)
update_loop_animation
@_loop_animation_index += 1
@_loop_animation_index %= @_loop_animation.frame_max
end
if @_blink
@_blink_count = (@_blink_count + 1) % 32
if @_blink_count < 16
alpha = (16 - @_blink_count) * 6
else
alpha = (@_blink_count - 16) * 6
end
self.color.set(255, 255, 255, alpha)
end
@@_animations.clear
end
#--------------------------------------------------------------------------
def dispose_damage(index)
return if @_damage_sprites == nil
if @_damage_sprites[index].is_a?(::Sprite) and @_damage_sprites[index].bitmap != nil
@_damage_sprites[index].bitmap.dispose
@_damage_sprites[index].dispose
@_damage_durations[index] = 0
end
end
#--------------------------------------------------------------------------
def dispose_animation
if @_animation_sprites != nil
sprite = @_animation_sprites[0]
if sprite != nil
@@_reference_count[sprite.bitmap] -= 1
if @@_reference_count[sprite.bitmap] == 0
sprite.bitmap.dispose
end
end
for sprite in @_animation_sprites
sprite.dispose
end
@_animation_sprites = nil
@_animation = nil
end
@mirror = false
end
#--------------------------------------------------------------------------
def animation_mirror(mirror_effect)
@mirror = mirror_effect
end
#--------------------------------------------------------------------------
def animation_set_sprites(sprites, cell_data, position)
for i in 0..15
sprite = sprites[i]
pattern = cell_data[i, 0]
if sprite == nil or pattern == nil or pattern == -1
sprite.visible = false if sprite != nil
next
end
sprite.visible = true
sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192)
if position == 3
if self.viewport != nil
sprite.x = self.viewport.rect.width / 2
sprite.y = self.viewport.rect.height - 160
else
sprite.x = 320
sprite.y = 240
end
else
sprite.x = self.x - self.ox + self.src_rect.width / 2
sprite.y = self.y - self.oy + self.src_rect.height / 2
sprite.y -= self.src_rect.height / 4 if position == 0
sprite.y += self.src_rect.height / 4 if position == 2
end
sprite.x += cell_data[i, 1]
sprite.y += cell_data[i, 2]
sprite.z = 2000
if @mirror
sprite.ox = 88
else
sprite.ox = 104
end
sprite.oy = 96
sprite.zoom_x = cell_data[i, 3] / 100.0
sprite.zoom_y = cell_data[i, 3] / 100.0
sprite.angle = cell_data[i, 4]
sprite.mirror = (cell_data[i, 5] == 1)
if @mirror
if sprite.mirror
sprite.mirror = false
else
sprite.mirror = true
end
end
sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
sprite.blend_type = cell_data[i, 7]
end
end
end
#==============================================================================
# ■ Sprite_Damage
#==============================================================================
class Sprite_Damage < Sprite
#--------------------------------------------------------------------------
include N01
#--------------------------------------------------------------------------
def initialize(sprite, init_x_speed, init_y_speed, duration, mirror)
super(nil)
self.bitmap = sprite.bitmap.dup unless sprite.bitmap.nil?
self.opacity = 255
self.x = sprite.x
self.y = sprite.y
self.z = 3000
self.ox = sprite.ox
self.oy = sprite.oy
@damage_mirror = mirror
@now_x_speed = init_x_speed
@now_y_speed = init_y_speed
@potential_x_energy = 0.0
@potential_y_energy = 0.0
@duration = duration
end
#--------------------------------------------------------------------------
def update
@duration -= 1
return unless @duration <= DMG_DURATION
super
n = self.oy + @now_y_speed
if n <= 0
@now_y_speed *= -1
@now_y_speed /= 2
@now_x_speed /= 2
end
self.oy = [n, 0].max
@potential_y_energy += DMG_GRAVITY
speed = @potential_y_energy.floor
@now_y_speed -= speed
@potential_y_energy -= speed
@potential_x_energy += @now_x_speed if @damage_mirror if POP_MOVE
@potential_x_energy -= @now_x_speed if !@damage_mirror if POP_MOVE
speed = @potential_x_energy.floor
self.ox += speed
@potential_x_energy -= speed
case @duration
when 1..10
self.opacity -= 25
when 0
self.dispose
end
end
end
This is the error message I'm getting
Looking for a fix, I found out someone else had a similar issue years ago, but it was left unresolved.
I'd be willing to switch for another message system entirely...
I actually attempted using another one, Custom Message Script by Hodgeelmf
Code:
#==============================================================================
# ** Custom Message Script by Hodgeelmf **
#
# Version 1.4
#
# Version History
# 1.0.0 - Basic functionality
# 1.1.0 - Fixed issue with bubble size and bolded text
# Modified gold window
# Added /q function
# 1.2.0 - Added Icon display
# Added Face Graphics
# Fixed Gold command iteration error (This is what formerly broke
# the script)
# Added use of Windowskin Graphic
# Fixed sub window termination to be more natural
# 1.3.0 - Added thought indicater option
# Added emotion colors
# 1.4.0 - Fixed glitch when switching from Windowskin to Bubble mode
# Added function to disable bubble bouncing
# 1.4.1 - Fixed text drawing issue when choices displayed without
# preceding message text
# Created \nc command
#
# **************UPDATE NOTE*******************
# This script displays all choices immediately after the text
# which precedes them. I have added a command to prevent this
# should you elect to do so:
#
# \nc
#
# I see no reason to turn this into a toggle currently unless
# there were significant push for it
#
#
# Necessary updates
#
# -Add other various functions like display hp, quest, etc.
#
#==============================================================================
=begin
Welcome to the Custom Message script!
Installation instructions:
1. Install this script above Main, preferrably directly above
2. Download attached graphics (message_bubble and pointer2)
and place in Graphics/Pictures
3. That's it!
Message commands:
\e[x] Display message over a map event
By default, bubble messages display over the player's sprite. Values
outside of the map events range will display over the player as well.
\c[x] Change message text color (0-8)
\n[x] Insert actor name
\v[x] Insert variable value
\b Toggle bold text
\w[x] Wait control (0-999)
Wait values are determined by frame. 40 FPS is the script rate.
\p Pause control
Forces the player to press enter before continuing.
\q Forced ending
Forces the message winddow to close once the character is encountered.
Typically best to use directly after a wait timer.
\f Force position
Forces a specific position for the message bubble.
0 - Upper right of the sprite
1 - Upper left of the sprite
2 - Lower right of the sprite
3 - Lower left of the sprite
\g Displays gold window
Fades in the gold window to the bottom right corner of the screen. To keep
it displayed after current message, add \g into the next master message.
\i[x] Display icon
Displays an icon from the "Icons" folder. A constant array, Icons, is
compiled at runtime to store imported icon names in addition to RTP.
\z[x] Display face graphic (found in Graphics/Faces - you may have to create this
folder)
Displays a face graphic on the left of the message. Currently this script
only supports images with one face (as opposed to a whole faceset).
\t Thought Bubble
Uses thought indicater (ie two dots instead of mouth opening style)
\m[x] Mood Coloring
Changes bubble color to indicate speakers/thinkers mood (0-4)
\nc Do not Display Choices
Keeps choices from being appended to the text preceding them
\h[x] Display Hp
Not functioning at this point
\s[x] Sub window controls (explained below)
Master - the message which controls sub windows
Sub - any message that displays as a part of a master
1. The master message always has a higher z value than any sub messages
2. Sub message must immediately follow the master message and be in
consecutive order (ex. sub 0 must be the next event command after
the master message, sub 1 must be the next event command after
sub 0, etc.)
3. Sub messagge numbers do not reset after a master message. For
example, if the first master messsage contains two sub messages,
the second master message with sub messages must begin with sub
message number 3, and so on.
4. Use \s[x] where x is the number of the sub message to indicate that
a particular message is a sub message
5. Call sub messages in a master message with \s[x] where x is the
number of the sub message.
6. There is no limit to the number of sub messages, but since text is
drawn one letter at a time, too many messages may cause lag.
***NOTE***
If any of these commands seem bulky, it is because there is a glitch in
the run script command in the event editor which does not allow for
single lines changing global variables to function properly.
Script commands (from the Event Editor):
1. Choose message style (bubble, windowskin or invisible)
***** If you do not have the correct images in Graphics/Pictures
***** the script will automatically change to WINDOWSKIN mode and
***** change the default text color to white
$game_system.message_text_mode = x
TEXT_MODE_BUBBLE
TEXT_MODE_INVISIBLE
TEXT_MODE_WINDOWSKIN
2. Enable or disable bubble bouncing (only applies when in TEXT_MODE_BUBBLE)
$game_system.message_bubble_bounce = x
BUBBLE_BOUNCE_ON
BUBBLE_BOUNCE_OFF
2. Change position of invisible text
$game_system.invisible_position = x
INVISIBLE_POSITION_TOP
INVISIBLE_POSITION_MIDDLE
INVISIBLE_POSITION_BOTTOM
INVISIBLE_POSITION_BOOK(arbitrary value from one of my projects)
3. Change outline text options
$game_system.message_text_outline = x
TEXT_NORMAL
TEXT_OUTLINE
4. Change text speed
$game_system.message_text_speed = x
TEXT_SPEED_SLOW
TEXT_SPEED_MEDIUM
TEXT_SPEED_FAST
5. Change text skip rate (one letter per frame up to all at once)
$game_system.message_text_skip = x
TEXT_SKIP_NORMAL (1)
TEXT_SKIP_DOUBLE (2)
TEXT_SKIP_TRIPLE (3)
TEXT_SKIP_FULL
5. Change text size
$game_system.message_text_size = x
TEXT_SIZE_SMALL
TEXT_SIZE_MEDIUM
TEXT_SIZE_LARGE
TEXT_SIZE_JUMBO
6. Change text font
$game_system.message_text_font = x
TEXT_FONT_DEFAULT
TEXT_FONT_CORSIVA
7. Color Constants
TEXT_COLOR_BLACK
TEXT_COLOR_WHITE
8. Face Graphic Functions
$game_system.face_graphic_type = x
9. Face Graphic Constants
FACE_GRAPHIC_FULL - typically a bust which looks better offset to the left
and extending abovve the bubble
FACE_GRAPHIC_BOX - traditional boxed in face graphics which need to be
encased by the bubble to look correct
10. Global Methods (for ease of access)
message(string) - place in script box in event processing
***** Only place this command once per Event Script Box *****
You may wish to have dialogue or entries that are longer than three
lines. This global method allows you to supply a string to
$game_temp.message_text manually. The best way to do so is to store
a message in a variable and pass it to the method. In this example
script there is a Game_Messages class which has public methods that
assign a message to a variable. For full games, it would be better
to create a text file to load from. The best formatter to use is
%q (ex @message = %q(lots of text...can be multiple lines). The
%q formatter mimicks the event dialogue box text editing format
so you can use single "\" characters instead of using "\\" or not
being able to use special characters at all.
default_color(x) - set message default color
Input either a number 0 through 8 or a Color object.
face(string) - set default face graphic
Use this method to supply a default face graphic for messages. This graphic
has secondary priority to one explicitly declared in a message, so is useful
for largely unbroken monologues.
clear_face - clears the default face graphic
small_text
medium_text - Shortcut methods to change $game_system.message_text_size
large_text
jumbo_text
slow_text
fast_text - Shortcut methods to change $game_system.messge_text_speed
Enjoy! And remember to credit!
=end
#========================================================================
# Game_Messages
# You can easily create messages to display of any length using this
# Class or a similar one of your creation.
#========================================================================
class Game_Messages
# This message is obviously far too long for a bubble message, but it looks
# quite good with a darkened screen tone
# When loaded into a global variable, these class methods can be called to
# the event editor with two lines of code. For your own projects, you will
# probably want a more sophisticated heirarchy.
def message_1
@message = %q(\c[0]\bMessage commands:\b
\c[6]\b\\e[x]\c[0] Display message over a map event\b
By default, bubble messages display over the player's sprite. Values
outside of the map events range will display over the player as well.
\c[6]\b\\c[x]\c[0] Change message text color (0-8)\b
\c[6]\b\\n[x]\c[0] Insert actor name\b
\c[6]\b\\v[x]\c[0] Insert variable value\b
\c[6]\b\\\\b\c[0] Toggle bold text\b
\c[6]\b\\w[x]\c[0] Wait control (0-999)\b
Wait values are determined by frame. 40 FPS is the script rate.
\c[6]\b\\\\p\c[0] Pause control\b
Forces the player to press enter before continuing.
\c[6]\b\\\\q\c[0] Forced ending\b
Forces the message winddow to close once the character is encountered.
Typically best to use directly after a wait timer.
\c[6]\b\\\\f[x]\c[0] Force position\b
Forces a specific position for the message bubble.
\b0\b - Upper right of the sprite
\b1\b - Upper left of the sprite
\b2\b - Lower right of the sprite
\b3\b - Lower left of the sprite
\c[6]\b\\\\g\c[0] Displays gold window\b
Fades in the gold window to the bottom right corner of the screen. To keep
it displayed after current message, add \\\\g into the next master message.
\c[6]\b\\\\i[x]\c[0] Displays an icon from Graphics/Icons\b
\c[6]\b\\\\z[x]\c[0] Displays a face graphic from Graphics/Faces\b
References an array compiled at runtime from Graphics/Faces. You will have
to create this folder and manually install files.
\c[6]\b\\\\s[x]\c[0] Sub window controls\b (see documentation for full instructions))
end
def message_2
@message = %q( \c[6]\b$game_system Properties\b\c[0]
Change these properties in the Event Editor by using the Script command. Begin with
$game_system, then add a "." followed by the property you wish to alter. In the
Script command you will need to use two lines. For example:
$game_system.message_text_speed =\
TEXT_SPEED_FAST
The properties are listed below with available values to the right. For full
documentation, refer to the script instructions.
\c[6]\bmessage_text_mode\b\c[0] TEXT_MODE_INVISIBLE,TEXT_MODE_BUBBLE,TEXT_MODE_WINDOWSKIN
\c[6]\binvisible_position\b\c[0] INVISIBLE_POSITION_TOP,INVISIBLE_POSITION_MIDDLE,
INVISIBLE_POSITION_BOTTOM
\c[6]\bmessage_text_outline\b\c[0] TEXT_NORMAL,TEXT_OUTLINE
\c[6]\bmessage_text_speed\b\c[0] TEXT_SPEED_SLOW,TEXT_SPEED_MEDIUM,TEXT_SPEED_FAST
\c[6]\bmessage_text_size\b\c[0] TEXT_SIZE_SMALL,TEXT_SIZE_MEDIUM,TEXT_SIZE_LARGE,
TEXT_SIZE_JUMBO
\c[6]\bmessage_text_font\b\c[0] TEXT_FONT_DEFAULT, whatever constant you would
like to create
\c[6]\bmessage_text_skip\b\c[0] TEXT_SKIP_NORMAL,TEXT_SKIP_DOUBLE,TEXT_SKIP_TRIPLE,
TEXT_SKIP_QUAD,
TEXT_SKIP_QUIN,TEXT_SKIP_FULL
\c[6]\bmessage_skip_disabled\b\c[0] true,false
\c[6]\bface_graphic_type\b\c[0] FACE_GRAPHIC_BOX,FACE_GRAPHIC_FULL
\c[6]\bface_graphic_name\b\c[0] file name of graphic - without folders
\c[6]\bdefault_color\b\c[0] any Color object
\c[6]\bmessage_text_outline_color\b\c[0] any Color object)
end
end
#========================================================================
# Global Variables - simplest way to create communication between
# Interpreter and Window_Message
#========================================================================
$separate_choices = false
#========================================================================
# Constant Declaration
#========================================================================
# Stores the class methods for quick custom message access
$game_messages = Game_Messages.new
BUBBLE_BOUNCE_ON = 1
BUBBLE_BOUNCE_OFF = 0
BUBBLE_UPPER_LEFT = Rect.new(0,0,13,10)
BUBBLE_LOWER_LEFT = Rect.new(0,10,13,9)
BUBBLE_UPPER_RIGHT = Rect.new(13,0,12,10)
BUBBLE_LOWER_RIGHT = Rect.new(13,10,12,9)
SKIN_UPPER_LEFT = Rect.new(128,0,10,10)
SKIN_LOWER_LEFT = Rect.new(128,54,10,10)
SKIN_UPPER_RIGHT = Rect.new(182,0,10,10)
SKIN_LOWER_RIGHT = Rect.new(182,54,10,10)
TEXT_MODE_BUBBLE = 0
TEXT_MODE_INVISIBLE = 1
TEXT_MODE_WINDOWSKIN = 2
INVISIBLE_POSITION_TOP = [320,0]
INVISIBLE_POSITION_MIDDLE = [320,240]
INVISIBLE_POSITION_BOTTOM = [320,480]
INVISIBLE_POSITION_BOOK = [460,35]
TEXT_NORMAL = 0
TEXT_OUTLINE = 1
TEXT_SPEED_SLOW = 2
TEXT_SPEED_MEDIUM = 1
TEXT_SPEED_FAST = 0
TEXT_SKIP_NORMAL = 1
TEXT_SKIP_DOUBLE = 2
TEXT_SKIP_TRIPLE = 3
TEXT_SKIP_QUAD = 4
TEXT_SKIP_QUIN = 5
TEXT_SKIP_FULL = 6
TEXT_SIZE_SMALL = 14
TEXT_SIZE_MEDIUM = 16
TEXT_SIZE_LARGE = 18
TEXT_SIZE_JUMBO = 28
# Remember to set a common default or fallback font since some users won't have
# them all
TEXT_FONT_DEFAULT = "Arial"
TEXT_FONT_CORSIVA = ["Monotype Corsiva", "Arial"]
TEXT_FONT_BOLI = ["MV Boli", "Arial"]
TEXT_FONT_COMICSANS = ["Comic Sans MS", "Arial"]
TEXT_COLOR_BLACK = Color.new(0,0,0)
TEXT_COLOR_WHITE = Color.new(250,250,250)
FACE_GRAPHIC_FULL = 0
FACE_GRAPHIC_BOX = 1
# Compile Icon array
# RTP icons are best stored manually
Icons = ['001-Weapon01','002-Weapon02','003-Weapon03','004-Weapon04'\
,'005-Weapon05','006-Weapon06','007-Weapon07','008-Weapon08'\
,'009-Shield01','010-Head01','011-Head02','012-Head03','013-Body01'\
,'014-Body02','015-Body03','016-Accessory01','017-Accessory02'\
,'018-Accessory03','019-Accessory04','020-Accessory05'\
,'021-Potion01','022-Potion02','023-Potion03','024-Potion04'\
,'025-Herb01','026-Herb02','027-Herb03','028-Herb04'\
,'029-Key01','030-Key02','031-Key03','032-Item01'\
,'033-Item02','034-Item03','035-Item04','036-Item05'\
,'037-Item06','038-Item07','039-Item08','040-Item09'\
,'041-Item10','042-Item11','043-Item12','044-Skill01'\
,'045-Skill02','046-Skill03','047-Skill04','048-Skill05'\
,'049-Skill06','050-Skill07']
# All icons in the icon folder are dynamically added at runtime
ICON_FOLDER_PATH = Dir::getwd + "/Graphics/Icons/"
dir = Dir.new(ICON_FOLDER_PATH)
dir.each { |file|
if file != "." && file != ".."
Icons.push file
end
}
# Compile Face array
if File.directory? Dir::getwd + "/Graphics/Faces/"
Faces = []
FACE_FOLDER_PATH = Dir::getwd + "/Graphics/Faces/"
dir = Dir.new(FACE_FOLDER_PATH)
dir.each { |file|
if file != "." && file != ".."
Faces.push file
end
}
end
#========================================================================
# Global Methods
# Use these methods to quickly modify basic settings or set text
# to $game_temp.message_text manually
#========================================================================
def message(text)
$game_system.map_interpreter.message_waiting = true
$game_temp.message_proc = Proc.new { @message_waiting = false }
$game_temp.message_text = text
end
def default_color(color)
# If an integer passed to the method
if color.class == Fixnum
case color
when 0
$game_system.default_color = TEXT_COLOR_BLACK
when 1
$game_system.default_color = Color.new(128, 128, 255, 255)
when 2
$game_system.default_color = Color.new(255, 128, 128, 255)
when 3
$game_system.default_color = Color.new(128, 255, 128, 255)
when 4
$game_system.default_color = Color.new(128, 255, 255, 255)
when 5
$game_system.default_color = Color.new(255, 128, 255, 255)
when 6
$game_system.default_color = Color.new(255, 255, 128, 255)
when 7
$game_system.default_color = Color.new(192, 192, 192, 255)
when 8
$game_system.default_color = TEXT_COLOR_WHITE
else
$game_system.default_color = TEXT_COLOR_BLACK
end
# If a Color class value is passed to the method
elsif color.class == Color
$game_sytem.default_color = color
end
return true
end
def mood_color(color)
case color
when 0
return Color.new(70,130,180,190)
when 1
return Color.new(178,34,34,190)
when 2
return Color.new(238,174,238,190)
when 3
return Color.new(139,136,120,180)
when 4
return Color.new(255,215,0,190)
end
end
def face(name)
$game_system.face_graphic_name = name
end
def clear_face
$game_system.face_graphic_name = nil
end
def small_text
$game_system.message_text_size == TEXT_SIZE_SMALL
end
def medium_text
$game_system.message_text_size == TEXT_SIZE_MEDIUM
end
def large_text
$game_system.message_text_size == TEXT_SIZE_LARGE
end
def jumbo_text
$game_system.message_text_size == TEXT_SIZE_JUMBO
end
def slow_text
$game_system.message_text_speed == TEXT_SPEED_SLOW
end
def fast_text
$game_system.message_text_speed == TEXT_SPEED_FAST
end
#========================================================================
# Game Temp
#
# @current_event - tracks the current game event for ease of access
#========================================================================
class Game_Temp
attr_accessor :current_event
attr_accessor :consecutive_gold_window
alias old_initialize initialize
def initialize
old_initialize
@current_event = nil
@consecutive_gold_window = false
end
end
#========================================================================
# Game System
#
# Stores message text options
# Use $game_system to view and change values
#========================================================================
class Game_System
attr_accessor :message_text_mode
attr_accessor :message_bubble_bounce
attr_accessor :invisible_position
attr_accessor :message_text_outline
attr_accessor :message_text_speed
attr_accessor :message_text_size
attr_accessor :message_text_font
attr_accessor :message_skip_disabled
attr_accessor :face_graphic_type
attr_accessor :face_graphic_name
attr_accessor :message_text_skip
attr_accessor :default_color
attr_accessor :message_text_outline_color
alias old_initialize initialize
def initialize
old_initialize
@message_text_mode = TEXT_MODE_BUBBLE
@message_bubble_bounce = BUBBLE_BOUNCE_ON
@invisible_position = INVISIBLE_POSITION_TOP
@message_text_outline = TEXT_NORMAL
@message_text_speed = TEXT_SPEED_FAST
@message_text_size = TEXT_SIZE_SMALL
@message_text_font = TEXT_FONT_DEFAULT
@message_text_skip = TEXT_SKIP_NORMAL
@message_skip_disabled = false
@face_graphic_type = FACE_GRAPHIC_BOX
@face_graphic_name = nil
@default_color = TEXT_COLOR_BLACK
@message_text_outline_color = TEXT_COLOR_WHITE
end
end
#========================================================================
# Game Player
#
# The only change is in the condition --if Input.trigger?(Input::C)--
# The change allows for $game_temp.message text to be manually
# altered and still function properly
#========================================================================
class Game_Player
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
# Remember whether or not moving in local variables
last_moving = moving?
# If moving, event running, move route forcing, and message window
# display are all not occurring
unless moving? or $game_system.map_interpreter.running? or
@move_route_forcing or $game_temp.message_window_showing
# Move player in the direction the directional button is being pressed
case Input.dir4
when 2
move_down
when 4
move_left
when 6
move_right
when 8
move_up
end
end
# Remember coordinates in local variables
last_real_x = @real_x
last_real_y = @real_y
super
# If character moves down and is positioned lower than the center
# of the screen
if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
# Scroll map down
$game_map.scroll_down(@real_y - last_real_y)
end
# If character moves left and is positioned more let on-screen than
# center
if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
# Scroll map left
$game_map.scroll_left(last_real_x - @real_x)
end
# If character moves right and is positioned more right on-screen than
# center
if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
# Scroll map right
$game_map.scroll_right(@real_x - last_real_x)
end
# If character moves up and is positioned higher than the center
# of the screen
if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
# Scroll map up
$game_map.scroll_up(last_real_y - @real_y)
end
# If not moving
unless moving?
# If player was moving last time
if last_moving
# Event determinant is via touch of same position event
result = check_event_trigger_here([1,2])
# If event which started does not exist
if result == false
# Disregard if debug mode is ON and ctrl key was pressed
unless $DEBUG and Input.press?(Input::CTRL)
# Encounter countdown
if @encounter_count > 0
@encounter_count -= 1
end
end
end
end
#-----------------------------------------------------------------
# Allows messages to display without interruption when directly
# assigned to $game_temp.message_text
#-----------------------------------------------------------------
# If C button was pressed
if Input.trigger?(Input::C) && $game_temp.message_text == nil
# Same position and front event determinant
check_event_trigger_here([0])
check_event_trigger_there([0,1,2])
end
end
end
end
#========================================================================
# Interpreter
#
# Edit forces the interpreter to wait to update until all messages
# currently on screen have finished writing
#========================================================================
class Interpreter
attr_accessor :list
attr_accessor :index
attr_accessor :message_waiting
alias old_update update
def update
#if $scene.message_window != nil && $scene.message_window.finished != nil
if $game_temp.message_text != nil
return
else
old_update
$game_temp.current_event = @event_id
end
end
def command_101
# If other text has been set to message_text
if $game_temp.message_text != nil
# End
return false
end
# Check for consecutive gold window calls
temp_index = @index+1
loop do
case @list[temp_index].code
when 401
temp_index += 1
when 101
break
else
break
end
end
# Search for consecutive message window with /g formatter
text = nil
# Iterate through max possible message size
for i in 0...3
# Check for existence of list element before checking code
if @list[temp_index+i] != nil
# Search for /g
if @list[temp_index+i].code == 101 or @list[temp_index+i].code == 401
text = @list[temp_index+i].parameters[0].slice(/\\[Gg]/)
if text != nil
# Allows for gold window to continue after first message
$game_temp.consecutive_gold_window = true
break
end
end
end
end
# Turns consecutive flag off if need be
if $game_temp.consecutive_gold_window == true && text == nil
$game_temp.consecutive_gold_window = false
end
# Set message end waiting flag and callback
@message_waiting = true
$game_temp.message_proc = Proc.new { @message_waiting = false }
# Set message text on first line
$game_temp.message_text = @list[@index].parameters[0] + "\n"
line_count = 1
# Loop
loop do
# If next event command text is on the second line or after
if @list[@index+1].code == 401
# Add the second line or after to message_text
$game_temp.message_text += @list[@index+1].parameters[0] + "\n"
line_count += 1
# If event command is not on the second line or after
else
# If next event command is show choices
if @list[@index+1].code == 102
# Make sure choice appellation is allowed
for choice in @list[@index+1].parameters[0]
if choice.slice(/\\[Nn][Cc]/)
$separate_choices = true
break
end
end
if $separate_choices == true
return
end
# Advance index
@index += 1
# Choices setup
$game_temp.choice_start = line_count
#Insert 5 spaces for indenting choices
for i in 0...@list[@index].parameters[0].size
if @list[@index].parameters[0][i].slice(0,5) != ' '
@list[@index].parameters[0][i].insert(0,' ')
end
end
setup_choices(@list[@index].parameters)
# If next event command is input number
elsif @list[@index+1].code == 103
# If number input window fits on screen
if line_count < 4
# Advance index
@index += 1
# Number input setup
$game_temp.num_input_start = line_count
$game_temp.num_input_variable_id = @list[@index].parameters[0]
$game_temp.num_input_digits_max = @list[@index].parameters[1]
end
end
# Continue
return true
end
# Advance index
@index += 1
end
end
end
#========================================================================
# Spriteset Map
#
# Edit allows access to the character_sprites variable
# Use $game_map.character_sprites to access
#========================================================================
class Spriteset_Map
attr_accessor :character_sprites
end
class Scene_Map
attr_accessor :spriteset
attr_accessor :message_window
end
#========================================================================
# Window Base
#
# Edit allows for color 8 (black)
#========================================================================
class Window_Base < Window
#--------------------------------------------------------------------------
# * Get Text Color
# n : text color number (0-7)
#--------------------------------------------------------------------------
def text_color(n)
case n
when 0
return Color.new(250, 250, 250, 255)
when 1
return Color.new(45, 45, 255, 255)
when 2
return Color.new(255, 45, 45, 255)
when 3
return Color.new(45, 255, 45, 255)
when 4
return Color.new(45, 215, 215, 255)
when 5
return Color.new(255, 45, 255, 255)
when 6
return Color.new(230, 230, 15, 255)
when 7
return Color.new(125, 125, 125, 255)
when 8
return Color.new(0, 0, 0)
else
normal_color
end
end
end
#==============================================================================
# ** Window_Gold
#------------------------------------------------------------------------------
# The gold window has been modified to use an icon and some outlined text
#==============================================================================
class Window_Gold_New < Window_Base
def initialize
@current_gold = $game_party.gold
@icon = Sprite.new
@icon.opacity = 0
@icon.bitmap = Bitmap.new('Graphics/Icons/032-Item01')
@icon.ox = @icon.bitmap.width/2
@icon.oy = @icon.bitmap.height/2
@icon.x,@icon.y = 624,460
draw_gold
end
def update
refresh
@icon.opacity += 12 if @icon.opacity < 192
@gold.opacity += 12 if @gold.opacity < 192
end
def refresh
if @current_gold != $game_party.gold
@current_gold = $game_party.gold
@gold.bitmap.clear
draw_gold
end
end
def draw_gold
@gold = Sprite.new
@gold.opacity = 0
@gold.bitmap = Bitmap.new(100,32)
@gold.ox,@gold.oy = @gold.bitmap.width/2,@gold.bitmap.height/2
@gold.x = 560
@gold.y = 465
@gold.z = 50
@gold.bitmap.font.size = 18
@gold.bitmap.font.bold = true
@gold.bitmap.font.color = text_color(8)
@gold.bitmap.draw_text(22,0,75,30,$game_party.gold.to_s,2)
@gold.bitmap.draw_text(22,2,75,30,$game_party.gold.to_s,2)
@gold.bitmap.draw_text(21,1,75,30,$game_party.gold.to_s,2)
@gold.bitmap.draw_text(23,1,75,30,$game_party.gold.to_s,2)
@gold.bitmap.font.color = text_color(6)
@gold.bitmap.draw_text(22,1,75,30,@current_gold.to_s,2)
end
def fade_out
@icon.opacity -= 48
@gold.opacity -= 48
end
def dispose
@icon.bitmap.dispose
@icon.dispose
@gold.bitmap.dispose
@gold.dispose
end
end
#==============================================================================
# ** Window_InputNumber
#------------------------------------------------------------------------------
# This window is for inputting numbers, and is used within the
# message window.
#==============================================================================
class Window_InputNumber < Window_Base
attr_accessor :x
attr_accessor :y
#--------------------------------------------------------------------------
# * Object Initialization
# digits_max : digit count
#--------------------------------------------------------------------------
def initialize(digits_max,x=0,y=0,indent=0)
@digits_max = digits_max
@number = 0
@x = x
@y = y
@indent = indent
@count = 0
@move_right = true
# Calculate character width for drawing and tracking cursor movement
dummy_bitmap = Bitmap.new(32, 32)
dummy_bitmap.font.size = $game_system.message_text_size
dummy_bitmap.font.name = $game_system.message_text_font
@width = (dummy_bitmap.text_size('0').width\
+ dummy_bitmap.text_size(' ').width)
@x = @x - (@width*@digits_max)
dummy_bitmap.dispose
@index = 0
# Create number display bitmap
@number_window = Sprite.new
@number_window.x = @x
@number_window.y = @y
@number_window.z = 15
@number_window.bitmap = Bitmap.new(@width*@digits_max, 40)
@number_window.bitmap.font.color = TEXT_COLOR_BLACK
@number_window.bitmap.font.size = $game_system.message_text_size
@number_window.bitmap.font.name = $game_system.message_text_font
# Create the cursor to track input position
create_cursor
end
#--------------------------------------------------------------------------
# * Get Number
#--------------------------------------------------------------------------
def number
return @number
end
#--------------------------------------------------------------------------
# * Set Number
# number : new number
#--------------------------------------------------------------------------
def number=(number)
@number = [[number, 0].max, 10 ** @digits_max - 1].min
refresh
end
#--------------------------------------------------------------------------
# * Create Cursor
#--------------------------------------------------------------------------
def create_cursor
@cursor = Sprite.new
@cursor.bitmap = Bitmap.new(32,5)
@cursor.x = @number_window.x
@cursor.y = @number_window.y\
+ @number_window.bitmap.text_size('0').height + 3
@cursor.z = 16
@cursor.opacity = 185
width = @number_window.bitmap.text_size('0').width + 2
@cursor.bitmap.fill_rect(0,0,width,2,text_color(1))
end
#--------------------------------------------------------------------------
# * Cursor Update
#--------------------------------------------------------------------------
def update_cursor
@count += 1
if @count % 10 == 0
if @move_right == true
@cursor.x += 1
else
@cursor.x -= 1
end
if @count == 20
if @move_right == true
@move_right = false
else
@move_right = true
end
@count = 0
end
end
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
update_position
# If up or down directional button was pressed
if Input.repeat?(Input::UP) or Input.repeat?(Input::DOWN)
$game_system.se_play($data_system.cursor_se)
# Get current place number and change it to 0
place = 10 ** (@digits_max - 1 - @index)
n = @number / place % 10
@number -= n * place
# If up add 1, if down substract 1
n = (n + 1) % 10 if Input.repeat?(Input::UP)
n = (n + 9) % 10 if Input.repeat?(Input::DOWN)
# Reset current place number
@number += n * place
refresh
end
# Cursor right
if Input.repeat?(Input::RIGHT)
if @digits_max >= 2
$game_system.se_play($data_system.cursor_se)
@index = (@index + 1) % @digits_max
@cursor.x += @width
if @index == 0
@cursor.x = @number_window.x
end
end
end
# Cursor left
if Input.repeat?(Input::LEFT)
if @digits_max >= 2
$game_system.se_play($data_system.cursor_se)
@index = (@index + @digits_max - 1) % @digits_max
@cursor.x -= @width
if @index == @digits_max - 1
@cursor.x += @width * @digits_max
end
end
end
update_cursor
end
#--------------------------------------------------------------------------
# * Dispose
#--------------------------------------------------------------------------
def dispose
@number_window.bitmap.clear
@number_window = nil
@cursor.bitmap.clear
@cursor = nil
end
#--------------------------------------------------------------------------
# * Update Position for Bubble Movement
#--------------------------------------------------------------------------
def update_position
if @number_window.x != @x
@number_window.x = @x
@cursor.x = @number_window.x + (@index * @width)
end
if @number_window.y != @y
@number_window.y = @y
@cursor.y = @number_window.y\
+ @number_window.bitmap.text_size('0').height + 3
end
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
@number_window.bitmap.clear
s = sprintf("%0*d", @digits_max, @number)
for i in 0...@digits_max
@number_window.bitmap.draw_text(i * @width, 0, 32, 32, s[i,1])
end
end
end
#========================================================================
# Window Message
#
# Controls message displayed from the show text event command
#
# This modified version also allows for a message to be displayed
# from a script. Simply change $game_temp.message_text to
# whatever text you want to display. Remember that outside
# of the message entry box in the event commands, you will have
# to manuall insert the newline character "\n".)
#========================================================================
class Window_Message < Window_Base
attr_accessor :contents_showing
attr_accessor :finished
attr_accessor :fade_in
attr_accessor :fade_out
attr_accessor :message
attr_accessor :enter_pressed
#--------------------------------------------------------------------------
# * Object Initialization
#
# Prepare message variables, then wait for re_initialize
#--------------------------------------------------------------------------
def initialize(sub=false, text=nil)
# Bubble message variables
@enter_pressed = false
@text_height = 0
@fade_in = false
@event = 0
@contents_showing = false
@finished = nil
@position = ''
@active = false
@lines = 0
@up = 0
@count = 0
@cursor_count = 0
@cursor_move_right = nil
@wait = 0
@wait_add = 0
@pause = false
@index = 0
@sub = sub
@face = nil
@face_extension_x = 0
@face_extension_y = 0
@thought = false
@bubble_color = nil
@hp = nil
if @sub == false
@sub_number = nil
@sub_windows = []
end
@indent = false
@text = text
end
#--------------------------------------------------------------------------
# * Re_Initialize
#
# Call when actual text processing occurs
#--------------------------------------------------------------------------
def re_initialize
if $game_temp.message_text != nil
# Prevent improper cursor indention on choices
@indent = false
if $game_system.face_graphic_name != nil
@face = $game_system.face_graphic_name
else
@face = nil
end
@face_extension_x = 0
@face_extension_y = 0
temp = Sprite.new
temp = Bitmap.new(32,32)
# Set @text to whatever text will display
# For sub messages this will already be set
if @text == nil
@text = $game_temp.message_text
end
# Change \ escaped characters to character codes for processing
prep_text
# Determine number of lines in the message
@lines = 0
@text.each_line {|line|
@lines += 1
}
temp_text = @text.clone
# Get rid of any non displayed elements to determine the
# appropriate message box size
def get_digits(integer)
if integer < 10
return 1
elsif integer >= 10
return 2
elsif integer >= 100
return 3
end
end
while temp_text.slice(/\001\[([0-9]+)\]/)
temp_text.slice!(/\001\[([0-9]+)\]/)
end
while temp_text.slice(/\002/)
temp_text.slice!(/\002/)
end
while temp_text.slice(/\004\[([0-9]+)\]/)
temp_text.slice!(/\004\[([0-9]+)\]/)
end
while temp_text.slice(/\005\[([0-9]+)\]/) != nil
temp_text.slice!(/\005\[([0-9]+)\]/)
end
while temp_text.slice(/\006/)
temp_text.slice!(/\006/)
end
while temp_text.slice(/\007\[([0-9]+)\]/)
temp_text.slice!(/\007\[([0-9]+)\]/)
end
while temp_text.slice(/\011/) != nil
temp_text.slice!(/\011/)
end
while temp_text.slice(/\015\[([0-9]+)\]/)
temp_text.slice!(/\015\[([0-9]+)\]/)
@face = Faces[$1.to_i]
end
# Make sure @thought is false unless specified true
@thought = false
while temp_text.slice(/\017/)
temp_text.slice!(/\017/)
@thought = true
@text.slice!(/\017/)
end
# Change @bubble_color to keep default color unless specified other color
@bubble_color = nil
while temp_text.slice(/\018\[([0-9]+)\]/)
temp_text.slice!(/\018\[([0-9]+)\]/)
@bubble_color = mood_color($1.to_i)
@text.slice!(/\018\[([0-9]+)\]/)
end
# Determine message bubble size
bitmap = Sprite.new
bitmap.bitmap = Bitmap.new(32,32)
bitmap.bitmap.font.name = $game_system.message_text_font
bitmap.bitmap.font.size = $game_system.message_text_size
@text_rect = Rect.new(0,0,0,0)
@line_width = []
i = 0
temp_text.each_line {|line|
temp = bitmap.bitmap.text_size(line)
@line_width[i] = temp.width
if temp.width > @text_rect.width
@text_rect.width = temp.width
end
@text_height = temp.height
i += 1
}
# Add space for number input if necessary
if $game_temp.num_input_variable_id > 0 && @sub == false
@lines += 1
end
@text_rect.height = @text_height * @lines
total_size = 0
longest_line = 0
current_line_height = @text_height
@line_height_correction = [0,0,0,0]
line = 0
skip = 0
for i in 0...temp_text.size
# Check for bold toggling and icon insertion
if temp_text[i] == 3
bitmap.bitmap.font.bold == false ? bitmap.bitmap.font.bold = true : bitmap.bitmap.font.bold = false
end
# Check for icon insertion and add 24 pixels to this line's width
if temp_text[i] == 12
# Add sufficient width for an icon to be inserted in the text
total_size += 24
# Adjust the height of the text box if necessary
if current_line_height < 24
current_line_height = 24
@text_rect.height += (24 - @text_height)
@line_height_correction[line] = (24 - @text_height)
end
# Set variable to skip over icon text in sizing operations
skip = 4
end
# Check for face graphic
if temp_text[i] == 13
temp_text.slice(/\015\[([0-9]+)\]/)
skip = 4
@face = Faces[$1.to_i]
end
# Check for new line character
if temp_text[i] == 10
total_size = 0
current_line_height = @text_height
line += 1
end
# Do not size characters relating to an icon
if skip == 0
total_size += bitmap.bitmap.text_size(temp_text.slice(i,1)).width
else
skip -= 1
end
# Make sure longest line sets the bubble width value
longest_line = total_size if total_size > longest_line
end
# Insert facce graphic name if none explicit in message and
# one is stored in $game_system
if $game_system.face_graphic_name != nil && temp_text.slice(/\015\[([0-9]+)\]/) == nil
@face = $game_system.face_graphic_name
end
# Account for face graphic in message box graphic
if @face != nil
determine_face_extension
else
@face_extension_x = 0
@face_extension_y = 0
end
if $game_system.face_graphic_type == FACE_GRAPHIC_FULL
@text_rect.width = longest_line
else
@text_rect.width = longest_line + @face_extension_x
end
# Set start values for text drawing
@x=@y=0
# Determine message position and create the message bubble
#(only if $game_system.message_text_mode == TEXT_MODE_BUBBLE
if $game_system.message_text_mode != TEXT_MODE_INVISIBLE
# Check for existence of necessary Bubble files if mode is set to Bubble
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
# Correct text mode if files do not exist
if File.exist?("Graphics/Pictures/Message_Bubble.png") == false || \
File.exist?("Graphics/Pictures/Pointer2.png") == false
$game_system.message_text_mode = TEXT_MODE_WINDOWSKIN
default_color(8)
end
end
determine_position
create_bubble
else
@bubble_correction_y = 0
@message_box = Sprite.new
@message_box.bitmap = Bitmap.new(@text_rect.width+25, @text_rect.height+26)
@message_box.ox = @message_box.bitmap.width/2
@message_box.oy = @message_box.bitmap.height/2
@message_box.x = $game_system.invisible_position[0]
@message_box.y = $game_system.invisible_position[1]
if @message_box.y - @message_box.bitmap.height/2 < 0
@message_box.y += @message_box.bitmap.height/2
elsif @message_box.y + @message_box.bitmap.height/2 > 480
@message_box.y -= @message_box.bitmap.height/2
end
end
# Create message sprite for drawing actual text
@message = Sprite.new
@message.x = @message_box.x
@message.y = @message_box.y
if @sub == false
@message.z += 1
end
@message.ox = @message_box.ox
@message.oy = @message_box.oy
@message.bitmap = \
Bitmap.new(@message_box.bitmap.width,@message_box.bitmap.height)
@message.bitmap.font.size = $game_system.message_text_size
@message.bitmap.font.color = TEXT_COLOR_BLACK
@speed = $game_system.message_text_speed
@text_color = $game_system.default_color
end
end
#--------------------------------------------------------------------------
# * Dispose
#--------------------------------------------------------------------------
def dispose
terminate_message
$game_temp.message_window_showing = false
if @input_number_window != nil
@input_number_window.dispose
end
end
#--------------------------------------------------------------------------
# * Subs Finished?
#
# Checks to see if all sub messages have finished writing
#--------------------------------------------------------------------------
def subs_finished?
abort_flag = true
count = 0
for sub in @sub_windows
count += 1 if (sub.finished == true && sub.enter_pressed == false)
if sub.finished && sub.enter_pressed
sub.enter_pressed = false
end
end
abort_flag = false if count == @sub_windows.size
if abort_flag == true
return false
else
return true
end
end
#--------------------------------------------------------------------------
# * Erase Subs
#
# Erases any existing subb messages
#--------------------------------------------------------------------------
def erase_subs
if @sub_windows != nil
for sub in @sub_windows
sub.fade_out = true
end
end
end
#--------------------------------------------------------------------------
# * Terminate Message
#--------------------------------------------------------------------------
def terminate_message
# Call message callback
if @message != nil
@message_box.bitmap.clear
@message.z -= 1
@message.bitmap.clear
end
if @cursor != nil
@cursor.bitmap.clear
@cursor.dispose
@cursor = nil
end
if $game_temp.message_proc != nil
$game_temp.message_proc.call
end
# Clear variables related to text, choices, and number input
$game_temp.message_text = nil
$game_temp.message_proc = nil
$game_temp.choice_start = 99
$game_temp.choice_max = 0
$game_temp.choice_cancel_type = 0
$game_temp.choice_proc = nil
$game_temp.num_input_start = 99
$game_temp.num_input_variable_id = 0
$game_temp.num_input_digits_max = 0
# Dispose of gold window
if @gold_window != nil && $game_temp.consecutive_gold_window == false
@gold_window.dispose
@gold_window = nil
end
@contents_showing = false
@finished = nil
@active = false
$game_temp.message_window_showing = false
@text = nil
if @sub == false
erase_subs
temp = subs_finished?
if temp == true
for i in 0...@sub_windows.size
@sub_windows[i] = nil
end
@sub_windows = []
end
end
@sub_number = nil
end
#--------------------------------------------------------------------------
# * Draw_Message
#--------------------------------------------------------------------------
def draw_message
if @pause == true
return
end
if @text == nil
return
end
# Indent if choice and following message text
index = $game_system.map_interpreter.index - 2
code = $game_system.map_interpreter.list[index].code
# Check for choice following a line of text
if @y == $game_temp.choice_start && (code == 101 || code == 401) \
&& @indent == false && $separate_choices == false
@indent = true
#@x = 16 + @face_extension_x
end
if @wait == 0
# Set correction for icon insertion
y_correction = 0
for i in 0..@y
if @line_height_correction[i] != nil
y_correction += @line_height_correction[i]
end
end
# Set offset value dependant on text mode
if $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
offset = 10
elsif $game_system.message_text_mode == TEXT_MODE_BUBBLE
offset = 13
else
offset = 0
end
y = @text_y + (@text_height * @y) + @bubble_correction_y + y_correction
# Insert face graphic if included
if @text.slice!(/\015\[([0-9]+)\]/) || @face != nil
draw_face
end
# Check for formatting options character from text
@c = @text[0,1].slice(/./m)
case @c
# If \\
when "\000"
# Return to original text
@c = "\\"
@text.sub!("\000") {"\\"}
return
# If \C[n]
when "\001"
# Change text color
@text.sub!(/\[([0-9]+)\]/, "")
color = $1.to_i
if color >= 0 and color <= 8
@message.bitmap.font.color = text_color(color)
@text_color = text_color(color)
end
@text.slice!("\001")
# go to next text
return
# If \G
when "\002"
# Make gold window
if @gold_window == nil
@gold_window = Window_Gold_New.new
#@gold_window.x = 560 - @gold_window.width
if $game_temp.in_battle
# @gold_window.y = 192
else
# @gold_window.y = 0
end
#@gold_window.opacity = @message.opacity
#@gold_window.back_opacity = 200
end
@text.slice!("\002")
# go to next text
return
# If \B
when "\003"
if @message.bitmap.font.bold == false
@message.bitmap.font.bold = true
else
@message.bitmap.font.bold = false
end
@text.slice!("\003")
return
# If sub window is being called
when "\004"
@text.slice!("\004")
@text.sub!(/\[([0-9]+)\]/, "")
if @sub == false
@sub_number = $1
event_key = $game_temp.current_event
# Find the cooresponding slave window
# Must immediately follow master window and be
# in consecutive order
num = 0
index = 0
if $game_system.map_interpreter.list[$game_system.map_interpreter.index].code == 101 \
&& num != @sub_number.to_i
for i in $game_system.map_interpreter.index\
...$game_system.map_interpreter.list.size
if $game_system.map_interpreter.list[i].code == 101
num = $game_system.map_interpreter.list[i].parameters[0].slice(/\\[Ss]\[([0-9]+)\]/)
num = num.slice(/([0-9]+)/).to_i if num!= nil
if num != nil
if num != @sub_number.to_i
num += 1
end
index = i
end
if num == @sub_number.to_i
break
end
end
end
else
index = $game_system.map_interpreter.index
end
$game_system.map_interpreter.index = index
# Save original index value for later
original_index = $game_system.map_interpreter.index
lines = 1
if $game_system.map_interpreter.list[index].code == 101
# Loop until the cooresponding \s[x] character is found
loop do
# Break if there is nothing more to sort through
if $game_system.map_interpreter.list[index] == nil
break
end
# Check the \s[x] for a match with the initial match in master message
temp = $game_system.map_interpreter.list[index].parameters.clone
number = temp[0].slice(/\\[Ss]\[([0-9]+)\]/)
if number != nil
number = number.slice(/[0-9]+/)
end
# If the proper match is found, create sub window
if number == @sub_number
# Create message text for sub message
# Make sure sub message begins at first line
while $game_system.map_interpreter.list[index].code != 101
index -= 1
end
text = $game_system.map_interpreter.list[index].parameters[0].clone
if $game_system.map_interpreter.list[index+1].code == 401
text = text + "\n"
lines += 1
end
# Continue to add text if there is something to be added
if $game_system.map_interpreter.list[index+1].code == 401
# Loop until all sub message text is added
loop do
index += 1
text = text + $game_system.map_interpreter.list[index].parameters[0].clone
if $game_system.map_interpreter.list[index+1].code == 401
text = text + "\n"
lines += 1
else
break
end
end
end
# If last sub window, set event index
if @text.slice("\004") == nil
$game_system.map_interpreter.index = index + 1
end
# Create actual sub window object and place it into
# @sub_windows array for update and disposal
sub = Window_Message.new(true,text)
@sub_windows.push sub
break
else
index += 1
end
end # end loop
return
end # end if code == 101
end
# When \w[x]
when "\005"
@text.slice!(/\005\[([0-9]+)\]/)
@wait_add = $1.to_i
@wait += @wait_add
@wait_add = 0
return
# When \p
when "\006"
@text.slice!("\006")
if @enter_pressed == false
@pause = true
end
return
# When \q
when "\011"
terminate_message
return
# When \i[x]
when "\014"
@text.slice!(/\014\[([0-9]+)\]/)
icon = Sprite.new
icon.opacity = 0
icon.bitmap = Bitmap.new("Graphics/Icons/#{Icons[$1.to_i]}")
true_y = @text_y + (@y * @text_height) + y_correction #+ y + @face_extension_y - (@text_rect.height + 25)
@message.bitmap.blt(offset+@x+@face_extension_x,true_y,icon.bitmap,Rect.new(0,0,24,24))
@x += 24
# When \h[x]
when "\016"
@text.slice!(/\016\[([0-9]+)\]/)
@hp = $game_party.actors[$1.to_i].hp
end
# Get 1 character from text
@c = @text.slice!(/./m)
if @c == nil
@finished = true
if $game_temp.choice_max > 0
@cursor_move_right = true
@index = 0
create_cursor
$separate_choices = false
elsif $game_temp.num_input_variable_id > 0 && @sub == false
digits_max = $game_temp.num_input_digits_max
number = $game_variables[$game_temp.num_input_variable_id]
x = @message.x + @message.bitmap.width/2 - 13
y = @message.y - @message.bitmap.height/2\
+ @text_height * (@y) + @bubble_correction_y
@input_number_window = Window_InputNumber.new(digits_max,x,y,@face_extension_x)
@input_number_window.number = number
end
return
end
# If new line text
if @c == "\n"
# Add 1 to y
@y += 1
@x = 0
# Indent if choice
if @y >= $game_temp.choice_start
@x = 0
end
# go to next text
return
end
# Draw text
@message.bitmap.font.name = $game_system.message_text_font
# Set exact y value for drawing
if @face_extension_y != 0
true_y = y + @face_extension_y - (@text_rect.height + 25)
else
true_y = y
end
true_y = @text_y + @y*@text_height + y_correction
if $game_system.message_text_outline == TEXT_OUTLINE
if $game_system.message_text_outline == TEXT_OUTLINE
@message.bitmap.font.color = $game_system.message_text_outline_color
elsif @message.bitmap.font.color != $game_system.default_color
@message.bitmap.font.color = $game_system.default_color
end
# Correct character writing position for lower case "f"
# due to Monotype Corsiva text writing glitch
temp = @x
if @c == 'f' && $game_system.message_text_font == TEXT_FONT_CORSIVA
@x -= 2
end
@message.bitmap.draw_text(offset+@x+@face_extension_x+1,true_y,40,32,@c)
@message.bitmap.draw_text(offset+@x+@face_extension_x-1,true_y,40,32,@c)
@message.bitmap.draw_text(offset+@x+@face_extension_x,true_y+1,40,32,@c)
@message.bitmap.draw_text(offset+@x+@face_extension_x,true_y-1,40,32,@c)
# Correct any change made to @x so that text is written
# in the proper place
if @x != temp
@x = temp
end
end
@message.bitmap.font.color = @text_color
# Correct character writing position for lower case "f"
# due to Monotype Corsiva text writing glitch
temp = @x
if @c == 'f' && $game_system.message_text_font == TEXT_FONT_CORSIVA
@x -= 2
end
@message.bitmap.draw_text(offset+@x+@face_extension_x,true_y,40,32,@c)
# Correct any change made to @x so that text is written
# in the proper place
if @x != temp && $game_system.message_text_font == TEXT_FONT_CORSIVA
@x = temp
end
# Add x to drawn text width
@x += @message.bitmap.text_size(@c).width
@wait = $game_system.message_text_speed
@wait_add = 0
else
@wait -= 1
end
end
#--------------------------------------------------------------------------
# * Determine Face Extension
# This method determines how much distance needs to be added to the
# face graphic
#--------------------------------------------------------------------------
def determine_face_extension
sprite = Sprite.new
sprite.opacity = 0
sprite.bitmap = Bitmap.new("Graphics/Faces/#{@face}")
# Set extension value in horizontal direction
if @face != nil
@face_extension_x = sprite.bitmap.width
if $game_system.face_graphic_type == FACE_GRAPHIC_BOX
@face_extension_x += 5
end
if sprite.bitmap.height > @text_rect.height
@face_extension_y = sprite.bitmap.height - @text_rect.height
end
end
sprite.bitmap.dispose
sprite = nil
end
#--------------------------------------------------------------------------
# * Draw Face Graphics
#--------------------------------------------------------------------------
def draw_face
sprite = Sprite.new
sprite.opacity = 0
sprite.bitmap = Bitmap.new("Graphics/Faces/#{@face}")
rect = Rect.new(0,0,sprite.bitmap.width,sprite.bitmap.height)
if $game_system.face_graphic_type == FACE_GRAPHIC_FULL
@message.bitmap.blt(0,0,sprite.bitmap,rect)
else
y = @text_y + 10
@message.bitmap.blt(13,y,sprite.bitmap,rect)
end
sprite.bitmap.dispose
sprite = nil
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
if @pause == false
if Input.trigger?(Input::C) && $game_system.message_skip_disabled == false
@enter_pressed = true
until @c == nil || @text == nil
draw_message
end
@enter_pressed = false if @sub == false
else
if $game_system.message_text_skip != TEXT_SKIP_FULL
count = $game_system.message_text_skip
for i in 0...count
draw_message if (@c != nil || @text != nil)
end
else
if @c == nil && @text != nil
draw_message
end
until @c == nil || @text == nil
draw_message
end
end
end
else
if Input.trigger?(Input::C)
temp = subs_finished?
if temp == true
erase_subs
@pause = false
end
end
draw_message
end
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
# Update sub messages if they exist
if @sub_windows != nil
for i in 0...@sub_windows.size
@sub_windows[i].update
end
end
# Update gold window if it exists
if @gold_window != nil
@gold_window.update
end
# Update bubble graphic
if @active == true && ($game_system.message_text_mode == TEXT_MODE_BUBBLE \
|| $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN)
update_bubble
end
# If fade in
if @fade_in
if $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
max_opacity = 192
else
max_opacity = 255
end
@message_box.opacity += 24
if @input_number_window != nil
@input_number_window.contents_opacity += 24
end
if @message_box.opacity == max_opacity
@fade_in = false
end
return
end
# If fade out
if @fade_out
@message_box.opacity -= 48
@message.opacity -= 48
if @cursor != nil
@cursor.opacity -= 48
end
if @input_number_window != nil
@input_number_window.contents_opacity -= 24
end
if @gold_window != nil && $game_temp.consecutive_gold_window == false
@gold_window.fade_out
end
if @message_box.opacity == 0 && @message.opacity == 0
@fade_out = false
terminate_message if @sub == false
end
return
end
# If inputting number
if @input_number_window != nil
@input_number_window.update
# Confirm
if Input.trigger?(Input::C)
$game_system.se_play($data_system.decision_se)
$game_variables[$game_temp.num_input_variable_id] =
@input_number_window.number
$game_map.need_refresh = true
# Dispose of number input window
@input_number_window.dispose
@input_number_window = nil
if @sub_windows != nil
temp = subs_finished?
if temp == true
@fade_out = true
erase_subs
end
end
end
return
end
# If message is being displayed
if @contents_showing && @finished == true
# If choice isn't being displayed, show pause sign
if $game_temp.choice_max == 0
@active = true
else
update_cursor
end
# Cancel
if Input.trigger?(Input::B)
if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0
$game_system.se_play($data_system.cancel_se)
$game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)
terminate_message
end
end
# Confirm
if Input.trigger?(Input::C)
if $game_temp.choice_max > 0
$game_system.se_play($data_system.decision_se)
$game_temp.choice_proc.call(@index)
end
if @sub_windows != nil
temp = subs_finished?
if temp == true
@fade_out = true
erase_subs
end
end
end
return
end
# If display wait message or choice exists when not fading out
if $game_temp.message_text != nil && @finished == nil
@contents_showing = true
$game_temp.message_window_showing = true
@finished = false
re_initialize
Graphics.frame_reset
if @input_number_window != nil
@input_number_window.contents_opacity = 0
end
@fade_in = true
return
elsif @finished == false
refresh
return
end
end
#--------------------------------------------------------------------------
# Create Message Bubble
#--------------------------------------------------------------------------
# Remember! The bubble will currently display based on the src_rect of
# the $character_sprite bitmap...need to work on this...
def create_bubble # Text can be multiple lines
sprites = $scene.spriteset.character_sprites
@event_x = sprites[@event].x
@event_y = sprites[@event].y
# Draw bubble bitmap to blt from
bubble = Sprite.new
if @position.include?('Flipped_Down')
@bubble_correction_y = 7
else
@bubble_correction_y = 0
end
# Set basic x and y values for bubble drawing
# If a face graphic will be drawn
if @face != nil
# If face graphic drawn outside bubble
if $game_system.face_graphic_type == FACE_GRAPHIC_FULL
base_y = (@face_extension_y + @text_rect.height) - (@text_rect.height + 20)
# If bubble is flipped horizontally
if @position.include?('Mirror')
base_x = 0
else
base_x = @face_extension_x
end
# If bubble is not flipped vertically
if not @position.include?('Flipped_Down')
base_y -= 6
end
base_height = @text_rect.height
height_extension = @face_extension_y
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
width_extension = @face_extension_x + 25
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
width_extension = @face_extension_x + 20
end
# If face graphic drawn inside bubble
else
base_x = 0
base_y = @bubble_correction_y
base_height = @face_extension_y + @text_rect.height
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
width_extension = 25
height_extension = 20 + 6
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
width_extension = 20
height_extension = 20
end
end
else
base_x = 0
base_y = @bubble_correction_y
base_height = @text_rect.height
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
height_extension = 20 + 7
width_extension = 25
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
height_extension = 20
width_extension = 20
end
end
base_width = @text_rect.width
# Set text drawing starting coordinates
@text_y = base_y
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
bubble.bitmap = Bitmap.new("Graphics/Pictures/Message_Bubble")
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
bubble.bitmap = Bitmap.new("Graphics/Windowskins/"+$data_system.windowskin_name)
end
# Make the bubble bitmap the appropriate size
@message_box = Sprite.new
true_width = base_width + width_extension
true_height = base_height + height_extension
@message_box.bitmap = Bitmap.new(true_width,true_height)
@message_box.ox = @message_box.bitmap.width/2
@message_box.oy = @message_box.bitmap.height/2
@message_box.x = sprites[@event].x\
+ @message_box.bitmap.width/2\
+ sprites[@event].src_rect.width/2 - 15
if $game_system.face_graphic_type == FACE_GRAPHIC_FULL
@message_box.x -= @face_extension_x
end
@message_box.y = sprites[@event].y\
- ((sprites[@event].src_rect.height/3)*2)\
- @message_box.oy
if $game_system.face_graphic_type == FACE_GRAPHIC_FULL \
&& @position.include?('Flipped_Down')
@message_box.y -= @face_extension_y
end
if @sub == false
@message_box.z += 1
end
# Set rectangles for graphic block transfers
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
upper_left = BUBBLE_UPPER_LEFT
lower_left = BUBBLE_LOWER_LEFT
upper_right = BUBBLE_UPPER_RIGHT
lower_right = BUBBLE_LOWER_RIGHT
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
background = Rect.new(base_x+1,base_y+1,base_width+20-2,base_height+20-2)
source_rect = Rect.new(0,0,128,128)
@message_box.bitmap.stretch_blt(background,bubble.bitmap,source_rect)
upper_left = SKIN_UPPER_LEFT
lower_left = SKIN_LOWER_LEFT
upper_right = SKIN_UPPER_RIGHT
lower_right = SKIN_LOWER_RIGHT
end
# Blt the upper left quadrant of the bubble
rect = Rect.new(0,0,13,10)
@message_box.bitmap.blt(base_x,base_y,bubble.bitmap,upper_left)
# Blt the lower left quadrant of the bubble
rect.set(0,10,13,9)
y = base_y + base_height + lower_left.height
@message_box.bitmap.blt(base_x,y,bubble.bitmap,lower_left)
# Blt the upper right quadrant of the bubble
rect.set(13,0,12,10)
x = base_x + base_width + upper_right.width
@message_box.bitmap.blt(x,base_y,bubble.bitmap,upper_right)
# Blt the lower right quadrant of the bubble
rect.set(13,10,12,9)
x = base_x + base_width + lower_right.width
y = base_y + base_height + upper_right.height
@message_box.bitmap.blt(x,y,bubble.bitmap,lower_right)
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
# Fill in the left side gap
rect.set(0,8,13,1)
x = base_x
y = base_y + upper_left.height
rect2 = Rect.new(x,y,13,base_height)
@message_box.bitmap.stretch_blt(rect2,bubble.bitmap,rect)
# Fill in the right side gap
rect.set(13,8,12,1)
x = base_x + base_width + upper_right.width
y = base_y + upper_right.height
rect2 = Rect.new(x,y,13,base_height)
@message_box.bitmap.stretch_blt(rect2,bubble.bitmap,rect)
# Fill in the middle gap
x = base_x + upper_left.width - 1
y = base_y
width = base_width
height = base_height + upper_left.height + lower_left.height
rect.set(x,y,1,height)
rect2.set(x,y,base_width,height)
@message_box.bitmap.stretch_blt(rect2,@message_box.bitmap,rect)
# Place character pointer either below or above bubble
if @position.include?('Flipped_Down')
if @thought == false
rect.set(15,19,10,8)
else
rect.set(25,8,10,8)
end
x = base_x + 9
y = base_y - @bubble_correction_y
@message_box.bitmap.blt(x,y,bubble.bitmap,rect)
@message_box.y = sprites[@event].y\
- ((sprites[@event].src_rect.height/3)*2)\
+ @message_box.oy - @face_extension_y#- (offset_y-@text_rect.height-20)
else
if @thought == false
rect.set(0,19,10,8)
else
rect.set(25,0,10,8)
end
x = base_x + 9
y = base_y + base_height + 17
@message_box.bitmap.blt(x,y,bubble.bitmap,rect)
end
if @position.include?('Mirror')
@message_box.mirror = true
@message_box.x = sprites[@event].x\
- sprites[@event].src_rect.width/2\
- @message_box.bitmap.width/2 + 15 + base_x #+offset_x
end
# Fill in rim of a windowskin box
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
# Top rim
dest_rect = Rect.new(base_x+10,base_y,base_width,10)
source_rect = Rect.new(148,0,24,10)
@message_box.bitmap.stretch_blt(dest_rect,bubble.bitmap,source_rect)
# Bottom rim
dest_rect = Rect.new(base_x+10,base_y+base_height+20-10,base_width,10)
source_rect = Rect.new(148,54,24,10)
@message_box.bitmap.stretch_blt(dest_rect,bubble.bitmap,source_rect)
# Left rim
dest_rect = Rect.new(base_x,base_y+10,10,base_height)
source_rect = Rect.new(128,10,10,44)
@message_box.bitmap.stretch_blt(dest_rect,bubble.bitmap,source_rect)
# Right rim
dest_rect = Rect.new(base_x+base_width+20-10,base_y+10,10,base_height)
source_rect = Rect.new(182,10,10,44)
@message_box.bitmap.stretch_blt(dest_rect,bubble.bitmap,source_rect)
end
# Prepare bubble for up/down animation
@up = true
@message_box.opacity = 0
@fade_in = true
# Dispose of the blted bubble
bubble.bitmap.dispose
bubble = nil
@contents_showing = true
@active = true
if @bubble_color.class == Color
@message_box.color = @bubble_color
end
end
#--------------------------------------------------------------------------
# * Determine Bubble Position
#--------------------------------------------------------------------------
def determine_position(no_text=false)
sprites = $scene.spriteset.character_sprites
@position = ''
# Check upper screen boundary
temp = @text_rect.height + 25 + sprites[@event].src_rect.height
if sprites[@event].y - temp < 0
@position += 'Flipped_Down'
end
temp = @text_rect.width + 45
if sprites[@event].x\
+ sprites[@event].src_rect.width/2 + temp > 640
@position += 'Mirror'
end
if no_text == false
if @text.slice(/\007\[([0-9]+)\]/)
#c = @text.slice(/[0-9]+/).to_i
@text.slice!(/\007\[([0-9]+)\]/)
c = $1.to_i
@position = ''
if c == 0
@position = ''
elsif c == 1
@position = 'Flipped_Down'
elsif c == 2
@position = 'Mirror'
elsif c == 3
@position = 'Flipped_Down Mirror'
end
end
end
end
#--------------------------------------------------------------------------
# * Bubble Graphic Update
#--------------------------------------------------------------------------
def update_bubble
# Create an easier to use access point to the screen sprites
sprites = $scene.spriteset.character_sprites
# Bounce bubble
if $game_system.message_text_mode == TEXT_MODE_BUBBLE \
&& $game_system.message_bubble_bounce == BUBBLE_BOUNCE_ON
@count += 1
if @count % 10 == 0 && @up == true
@message_box.y -= 1
if @input_number_window != nil
@input_number_window.y -= 1
end
if @cursor != nil
@cursor.y -= 1
end
if @count == 20
@count = 0
@up = false
end
elsif @count % 10 == 0 && @up == false
@message_box.y += 1
if @input_number_window != nil
@input_number_window.y += 1
end
if @cursor != nil
@cursor.y += 1
end
if @count == 20
@count = 0
@up = true
end
end
end
x = @event_x
y = @event_y
@event_x = sprites[@event].x
@event_y = sprites[@event].y
if @event_x != x || @event_y != y
if @event_x != x
@message_box.x = @message_box.x + (@event_x - x)
if @input_number_window != nil
@input_number_window.x = @input_number_window.x + (@event_x-x)
end
if @cursor != nil
@cursor.x = @cursor.x + (@event_x - x)
end
end
if @event_y - @face_extension_y != y
@message_box.y = @message_box.y + (@event_y - y)
if @input_number_window != nil
@input_number_window.y = @input_number_window.y + (@event_y-y)
end
if @cursor != nil
@cursor.y = @cursor.y + (@event_y - y)
end
end
change = false
# Check upper screen boundary
temp = @message_box.y - @message_box.bitmap.height/2
if temp < 0 && (@position.include?('Flipped_Down') == false)
change = true
end
# Check lower screen boundary
temp = @message_box.y + @message_box.bitmap.height/2
if temp > 480
change = true
end
# Check right screen boundary
temp = @message_box.x + @message_box.bitmap.width/2
if temp > 640
change = true
end
# Check left screen boundary
temp = @message_box.x - @message_box.bitmap.width/2
if temp < 0
change = true
end
if change == true
@message_box.bitmap.clear
determine_position(true)
create_bubble
if @cursor != nil
reset_cursor
end
if @position.include?('Flipped_Down')
get_text
end
@message_box.z -= 1
end
end
@message.y = @message_box.y
@message.x = @message_box.x
end
#--------------------------------------------------------------------------
# * Get Message Text
#--------------------------------------------------------------------------
def get_text
index = $game_system.map_interpreter.index - 1
until $game_system.map_interpreter.list[index].code == 101
index -= 1
end
old_text = @text.clone
@text = ""
@lines.times do
if $game_system.map_interpreter.list[index].code == 102 \
|| $game_system.map_interpreter.list[index].code == 402
for i in 0...$game_system.map_interpreter.list[index].parameters.size
if $game_system.map_interpreter.list[index].parameters[0][i].class == String
@text = @text + $game_system.map_interpreter.list[index].parameters[0][i].clone + "\n"
end
end
else
@text = @text + $game_system.map_interpreter.list[index].parameters[0].clone + "\n"
end
index += 1
end
prep_text
@message.bitmap.clear
@x = 0
@x += 10 if $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
@y = 0
begin
draw_message
end until @text == old_text
end
#--------------------------------------------------------------------------
# * Prepare Text for processing
#--------------------------------------------------------------------------
def prep_text
# Determine what event the message will be over
if @text.slice!(/\\[Ee]\[([0-9]+)\]/) == nil
@event = -1 # Default to over player
else
@event = $1.to_i - 1
end
# Control text processing
begin
@last_text = @text.clone
@text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
end until @text == @last_text
@text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
$game_actors[$1.to_i] != nil ? "#{$game_actors[$1.to_i].name}" : ""
end
# Change "\\\\" to "\000" for convenience
@text.gsub!(/\\\\/) { "\000" }
# Change "\\C" to "\001" and "\\G" to "\002"
# and "\\B" to "\003" and "\\S" to "\004"
# and "\\W" to "\005" and "\\p" to "\006"
# and "\\F" to "\007" and "\\q" to "\011"
# and "\\I" to "\014 and "\\z" to "\015"
# and "\\T" to "\017 and "\\m" to "\018"
while @text.slice(/\\[Cc]\[([0-9]+)\]/) != nil
@text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
end
@text.gsub!(/\\[Gg]/) { "\002" }
@text.gsub!(/\\[Bb]/) { "\003" }
@text.gsub!(/\\[Ss]/) { "\004" }
while @text.slice(/\\[Ww]\[([0-9]+)\]/) != nil
@text.gsub!(/\\[Ww]\[([0-9]+)\]/) { "\005[#{$1}]" }
end
while @text.slice(/\\[Pp]/) != nil
@text.gsub!(/\\[Pp]/) { "\006" }
end
while @text.slice(/\\[Ii]/) != nil
@text.gsub!(/\\[Ii]\[([0-9]+)\]/) { "\014[#{$1}]" }
end
while @text.slice(/\\[Zz]/) != nil
# Check for face directory existence
if File.directory? Dir::getwd + "/Graphics/Faces/"
@text.slice(/\\[Zz]\[([0-9]+)\]/)
# Check for file existence
if Faces[$1.to_i] != nil
@text.gsub!(/\\[Zz]\[([0-9]+)\]/) { "\015[#{$1}]" }
else
@text.gsub!(/\\[Zz]\[([0-9]+)\]/) { "" }
end
else
@text.gsub!(/\\[Zz]\[([0-9]+)\]/) { "" }
end
end
while @text.slice(/\\[Hh]/) != nil
@text.gsub!(/\\[Hh]\[([0-9]+)\]/) { "\016[#{$1}]" }
end
@text.gsub!(/\\[Ff]/) { "\007" }
@text.gsub!(/\\[Qq]/) { "\011" }
@text.gsub!(/\\[Tt]/) { "\017" }
while @text.slice(/\\[Mm]\[([0-9]+)]/)
@text.gsub!(/\\[Mm]\[([0-9]+)]/) { "\018[#{$1}]" }
end
@text.slice!(/\\[Nn][Cc]/)
end
#--------------------------------------------------------------------------
# * Create cursor graphic
#--------------------------------------------------------------------------
def create_cursor
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
@cursor = Sprite.new
@cursor.bitmap = Bitmap.new("Graphics/Pictures/Pointer2")
@cursor.ox = @cursor.bitmap.width
if $separate_choices == false
indent = @message.bitmap.text_size(" ").width
else
indent = @message.bitmap.text_size(" ").width
end
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
template = Sprite.new
template.opacity = 0
template.bitmap = Bitmap.new("Graphics/Windowskins/"+$data_system.windowskin_name)
source_rect = Rect.new(128,64,32,32)
# Set width of the cursor rectangle
width = @line_width[@lines-$game_temp.choice_max+@index]
# Correct for added spaces in choices following main text
width -= @message.bitmap.text_size(' ').width if @indent == true
dest_rect = Rect.new(0,0,width,@text_height)
if @cursor == nil
@cursor = Sprite.new
else
@cursor.bitmap.clear
@cursor.bitmap.dispose
end
@cursor.opacity = 255
@cursor.bitmap = Bitmap.new(width,@text_height)
# Upper left
source_rect = Rect.new(128,64,3,3)
@cursor.bitmap.blt(0,0,template.bitmap,source_rect)
# Upper right
source_rect = Rect.new(157,64,3,3)
@cursor.bitmap.blt(width-3,0,template.bitmap,source_rect)
# Lower left
source_rect = Rect.new(128,93,3,3)
@cursor.bitmap.blt(0,@text_height-3,template.bitmap,source_rect)
# Lower right
source_rect = Rect.new(157,93,3,3)
@cursor.bitmap.blt(width-3,@text_height-3,template.bitmap,source_rect)
# Top fill in
source_rect = Rect.new(131,64,26,3)
dest_rect = Rect.new(3,0,width-6,3)
@cursor.bitmap.stretch_blt(dest_rect,template.bitmap,source_rect)
# Bottom fill in
source_rect = Rect.new(131,93,26,3)
dest_rect = Rect.new(3,@text_height-3,width-6,3)
@cursor.bitmap.stretch_blt(dest_rect,template.bitmap,source_rect)
# Left fill in
source_rect = Rect.new(128,67,3,@text_height-6)
dest_rect = Rect.new(0,3,3,@text_height-6)
@cursor.bitmap.stretch_blt(dest_rect,template.bitmap,source_rect)
# Right fill in
source_rect = Rect.new(157,67,3,@text_height-6)
dest_rect = Rect.new(width-3,3,3,@text_height-6)
@cursor.bitmap.stretch_blt(dest_rect,template.bitmap,source_rect)
# Center fill in
source_rect = Rect.new(131,67,26,26)
dest_rect = Rect.new(3,3,width-6,@text_height-6)
@cursor.bitmap.stretch_blt(dest_rect,template.bitmap,source_rect)
@cursor.ox = 0
template.bitmap.clear
template = nil
indent = @message.bitmap.text_size(" ").width
end
@cursor.oy = @cursor.bitmap.height/2
if @indent == true
@cursor.x = @message.x - @message.ox + 14 + @face_extension_x + indent
else
@cursor.x = @message.x - @message.ox + @face_extension_x + indent
end
y_correction = 0
@line_height_correction.each { |number|
y_correction += number
}
@cursor.y = @message.y - @message.oy + @bubble_correction_y \
+ 10 + @text_height/2 + ((@lines-$game_temp.choice_max+@index)*@text_height)\
+ y_correction
@cursor.z += 5
# More accurately place windowskin rectangle
if $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
@cursor.y -= 1
end
# Correct for bad sizing of bitmap draw_text method
if $game_system.message_text_size == TEXT_SIZE_LARGE
@cursor.y -= 2
elsif
$game_system.message_text_size == TEXT_SIZE_JUMBO
@cursor.y -= 6
end
end
#--------------------------------------------------------------------------
# * Reset cursor graphic
#--------------------------------------------------------------------------
def reset_cursor
@cursor.x = @message_box.x - @message_box.ox + 16
@cursor.y = @message_box.y - @message_box.oy\
+ ((@lines-$game_temp.choice_max + 1)*@text_height)\
+ @bubble_correction_y
end
#--------------------------------------------------------------------------
# * Update cursor graphic
#--------------------------------------------------------------------------
def update_cursor
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
modulus = 10
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
modulus = 3
end
@cursor_count += 1
if @cursor_count % modulus == 0 && @cursor_move_right == true
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
@cursor.x += 1
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
@cursor.opacity -= 10
end
if @cursor_count == modulus * 5
@cursor_count = 0
@cursor_move_right = false
end
elsif @cursor_count % modulus == 0 && @cursor_move_right == false
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
@cursor.x -= 1
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
@cursor.opacity += 10
end
if @cursor_count == modulus * 5
@cursor_count = 0
@cursor_move_right = true
end
end
if Input.trigger?(Input::UP)
if @index != 0
@cursor.y -= @text_height
@index -= 1
else
@cursor.y += @text_height * ($game_temp.choice_max-1)
@index = $game_temp.choice_max-1
end
if $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
create_cursor
end
elsif Input.trigger?(Input::DOWN)
if @index != $game_temp.choice_max-1
@cursor.y += @text_height
@index += 1
else
@cursor.y -= @text_height * ($game_temp.choice_max-1)
@index = 0
end
if $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
create_cursor
end
end
end
end
I thought of maybe figuring a way to temporarily disable it in gameplay
So, deactivate it before a fight that requires speech, using boring-default-speech, and then reactivate it
But my no-scripting-skills self couldn't figure how to do that without breaking anything.
I'm assuming the issues stem from the fact SBS uses non-default spritesets?... I'm not exactly a scripter, so I just stumble in the dark here. I figured maybe someone else could know how to actually fix this.
Is anyone able to help make this work?
Thank you for your patience.