#==============================================================================
# ** Sprite Reflection
#------------------------------------------------------------------------------
# Based on Sprite Mirror
# modified by JmsPlDnl
# rewritten entirely by Rataime
# New Edits by DerVVulfman
# February 12, 2008
#------------------------------------------------------------------------------
#
# Introduction:
# This system allows you and events to have their image reflected on various
# tagged surfaces.
#
#------------------------------------------------------------------------------
#
# Revisions to note:
#
# 1) Added formatted headers and comments throughout the script.
# 2) Compatability with Near Fantastica's Squad Movement systems.
# 3) Compatability with Ccoa's Caterpillar system.
# 4) Compatability with Trickster's Caterpillar system.
# 5) Added the REFLECT_TAG value into the configurables
#
#==============================================================================
#========================================================================
# ** C O N F I G U R A T I O N S Y S T E M ** #
#========================================================================
# Caterpillar Systems
CATERPILLAR_COMPATIBLE = false # Toggle for Fukuyama's original
SQUAD_MOVE_COMPATIBLE = false # Toggle for Near Fantastica's SBABS
CCOA_CATER_COMPATIBLE = false # Toggle for Ccoa's Caterpillar
TRICKSTER_CATER_COMPATIBLE = false # Toggle for Trickster's Caterpillar
# Reflection Specific Systems
REFLECT_TAG = 7 # Terrain tag used by reflective tiles
#========================================================================
# **** E N D O F C O N F I G U R A T I O N S Y S T E M **** #
#========================================================================
#==============================================================================
# ** Game_Party
#------------------------------------------------------------------------------
# This class handles the party. It includes information on amount of gold
# and items. Refer to "$game_party" for the instance of this class.
#==============================================================================
class Game_Party
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :characters
end
#==============================================================================
# ** Sprite_Reflection
#------------------------------------------------------------------------------
# This sprite is used to position character reflection relative to map position.
# It observes the Game_Character class and automatically changes sprite
# conditions.
#==============================================================================
class Sprite_Reflection < RPG::Sprite
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_accessor :character
#--------------------------------------------------------------------------
# * Object Initialization
# viewport : viewport
# character : character (Game_Character)
# self_angle : id
#--------------------------------------------------------------------------
def initialize(viewport=nil, character=nil, self_angle = 180)
super(viewport)
@character = character
@self_angle = self_angle
self.opacity = 0
@reflected = false
@former = false
@moving = false
if $game_map.terrain_tag(@character.real_x / 128,
@character.real_y / 128 + 1) == REFLECT_TAG
@reflected = true
@former = true
end
update
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
# If tile ID, file name, or hue are different from current ones
if @tile_id != @character.tile_id or
@character_name != @character.character_name or
@character_hue != @character.character_hue
# Remember tile ID, file name, and hue
@tile_id = @character.tile_id
@character_name = @character.character_name
@character_hue = @character.character_hue
# If tile ID value is valid
if @tile_id >= 384
self.bitmap = RPG::Cache.tile($game_map.tileset_name,
@tile_id, @character.character_hue)
self.src_rect.set(0, 0, 32, 32)
self.ox = 16
self.oy = 32
# If tile ID value is invalid
else
self.bitmap = RPG::Cache.character(@character.character_name,
@character.character_hue)
@cw = bitmap.width / 4
@ch = bitmap.height / 4
self.ox = @cw / 2
self.oy = @ch
end
end
# Set visible situation
self.visible = (not @character.transparent)
# If graphic is character
if @tile_id == 0
sx = (@character.pattern) * @cw
sy = (@character.direction - 2) / 2 * @ch
sy = ( 4 - 2) / 2 * @ch if @character.direction == 6
sy = ( 6 - 2) / 2 * @ch if @character.direction== 4
if @character.direction != 4 and @character.direction != 6
sy = (@character.direction - 2) / 2 * @ch
end
end
# Set sprite coordinates
self.x = @character.screen_x
self.y = @character.screen_y-5
@moving =! (@character.real_x % 128 == 0 and @character.real_y % 128 == 0)
@d = @character.direction
@rect = [sx, sy, @cw, @ch]
if !(@moving)
if $game_map.terrain_tag(@character.real_x / 128,
@character.real_y / 128 + 1) == REFLECT_TAG
@reflected=true
@former=true
else
@reflected=false
@former=false
end
else
case @d
when 2
if $game_map.terrain_tag(@character.real_x / 128,
@character.real_y / 128 + 2) == REFLECT_TAG
@reflected=true
if @former == false
@offset = (@character.screen_y % 32) * @ch / 32
@rect = [sx, sy, @cw, @offset]
self.y = @character.screen_y - 5
end
else
@reflected = false
end
when 4
if $game_map.terrain_tag(@character.real_x / 128,
@character.real_y / 128 + 1) != REFLECT_TAG
@offset = ((@character.screen_x - @cw / 2) % 32) * @cw / 32
@rect = [sx, sy, @offset, @ch]
self.x = @character.screen_x
else
@reflected = true
if @former == false
@offset = ((@character.screen_x - @cw / 2) % 32) * @cw / 32
@rect = [sx + @offset, sy, @cw - @offset, @ch]
self.x = @character.screen_x - @offset
end
end
when 6
if $game_map.terrain_tag(@character.real_x / 128 + 1,
@character.real_y / 128 + 1) != REFLECT_TAG
@offset = ((@character.screen_x - @cw / 2) % 32) * @cw / 32
@rect = [sx + @offset, sy, @cw - @offset, @ch]
self.x = @character.screen_x - @offset
else
@reflected = true
if @former == false
@offset = ((@character.screen_x - @cw / 2) % 32) * @cw / 32
@rect = [sx, sy, @offset, @ch]
self.x = @character.screen_x
end
end
when 8
if $game_map.terrain_tag(@character.real_x / 128, @character.real_y / 128 + 2) == REFLECT_TAG
@reflected=true
if $game_map.terrain_tag(@character.real_x / 128, @character.real_y / 128 + 1) != REFLECT_TAG
@offset = (@character.screen_y%32)*@ch/32
@rect=[sx, sy, @cw, @offset]
self.y=@character.screen_y-5
end
else
@reflected=false
end
end
end
if @reflected
self.opacity=128
else
@rect=[sx, sy, @cw, @ch]
self.opacity=0
end
if $game_map.terrain_tag((@character.real_x + 64) / 128, @character.real_y / 128 + 2) != REFLECT_TAG
if $game_map.terrain_tag((@character.real_x + 64) / 128, @character.real_y / 128 + 2) != REFLECT_TAG
@rect[1]= @rect[1]+@ch/2
@rect[3]= @rect[3]/2
self.y = self.y - @ch/2
else
@reflected=false
end
end
self.src_rect.set(@rect[0],@rect[1],@rect[2],@rect[3])
@character.is_a?(Game_Player) ? self.z = 9 : self.z = 5
# Set opacity level, blend method, and bush depth
self.blend_type = @character.blend_type
self.bush_depth = @character.bush_depth
# Animation
if @character.animation_id != 0
animation = $data_animations[@character.animation_id]
animation(animation, true)
@character.animation_id = 0
end
self.angle = @self_angle
end
end
#==============================================================================
# ** Sprite_Character
#------------------------------------------------------------------------------
# This sprite is used to display the character.It observes the Game_Character
# class and automatically changes sprite conditions.
#==============================================================================
class Sprite_Character < RPG::Sprite
#--------------------------------------------------------------------------
# * Alias Listings
#--------------------------------------------------------------------------
alias reflect_initialize initialize
alias reflect_update update
#--------------------------------------------------------------------------
# * Object Initialization
# viewport : viewport
# character : character (Game_Character)
#--------------------------------------------------------------------------
def initialize(viewport, character = nil)
@character = character
@reflection = []
super(viewport)
if (character.is_a?(Game_Event) and character.list != nil and
character.list[0].code == 108 and
character.list[0].parameters == ["r"])
@reflection.push(Sprite_Reflection.new(viewport,@character))
end
if (character.is_a?(Game_Event) and character.list != nil and
character.list[0].code == 108 and
character.list[0].parameters == ["hero_r"])
@reflection.push(Sprite_Reflection.new(viewport,$game_player))
#===================================================
# * Compatibility with Caterpillar Functions
#===================================================
if CATERPILLAR_COMPATIBLE and $game_party.characters != nil
for member in $game_party.characters
@reflection.push(Sprite_Reflection.new(viewport, member))
end
end
if SQUAD_MOVE_COMPATIBLE and $game_allies.values != nil
for member in $game_allies.values
@reflection.push(Sprite_Reflection.new(viewport, member))
end
end
if CCOA_CATER_COMPATIBLE and $game_train.actors != nil
for member in $game_train.actors
@reflection.push(Sprite_Reflection.new(viewport, member))
end
end
if TRICKSTER_CATER_COMPATIBLE and $game_party.followers != nil
for member in $game_party.followers
@reflection.push(Sprite_Reflection.new(viewport, member))
end
end
#===================================================
# ** End of the compatibility
#===================================================
end
# Perform the original call
reflect_initialize(viewport, @character)
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
reflect_update
if @reflection != nil
for reflect in @reflection
reflect.update
end
end
end
end