메뉴

레벨업 시 자세한 정보 나오는 스크립트

by 아방스 posted Jan 20, 2009
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄






module LevelUpDisplayConfig
#--------------------------------------------------------------------------
# * General Configuration Options
#--------------------------------------------------------------------------
  #The windowskin file name, minus the extension
  WINDOWSKIN_NAME = 'Window'
  #The sound effect name that is played when the window is displayed
  LEVEL_UP_SE = 'Recovery'
  #The sound effect volume
  LEVEL_UP_SE_VOLUME = 80
  #Display the skill window?
  USE_SKILL_WINDOW = true
  #The title text used in the "New Skills" window (if not nil) 
  #For example, NEW_SKILL_TITLE_TEXT = 'Abilities'
  NEW_SKILL_TITLE_TEXT = nil
  #Show the actor's sprite?
  USE_SPRITE_GRAPHIC = true
  #Opacity of the main window
  WINDOW_OPACITY = 255 
#--------------------------------------------------------------------------
# * Stat Window Configuration
#--------------------------------------------------------------------------
  #The color of the actor's name in the window (gold by default)
  NAME_COLOR = Color.new(255,235,0)
  #The color of the actor's level in the window (gold by default)
  LEVEL_COLOR = Color.new(255,235,0)
  #The color of the actor's stat names in the window (gold by default)
  STAT_COLOR = Color.new(255,235,0)
  #The color of the actor's old stat values (white by default)
  OLD_STAT_COLOR = Color.new(255,255,255)
  #The color of the actor's new stat values, if a net gain (green by default)
  NEW_STAT_VAL_COLOR = Color.new(0,250,154)
  #The color of the actor's new stat values, if a net loss (red by default)
  STAT_VAL_LOSS_COLOR = Color.new(255, 0, 0)
#--------------------------------------------------------------------------
# * Skill Window Configuration
#--------------------------------------------------------------------------
  #The color of the text in the skills title window
  SKILL_TITLE_COLOR = Color.new(255,215,0)
  #The color of the new skills text in the skills window
  SKILL_WINDOW_FONT_COLOR = Color.new(240,248,255)
#--------------------------------------------------------------------------
#  * There is no need to modify the constants below
#--------------------------------------------------------------------------
STAT_WINDOW_WIDTH = 320
SKILL_WINDOW_WIDTH = 165
WINDOW_HEIGHT = 220
SUB_WINDOW_HEIGHT = 45

end
#==========================================================================
# * Game_Actor
#--------------------------------------------------------------------------
#   overrides -
#     * display_level_up (if DISPLAY_DEF_MESSAGE is set to false in config)
#==========================================================================
include LevelUpDisplayConfig
class Game_Actor < Game_Battler
 
  attr_reader :last_level
  attr_reader :last_hp
  attr_reader :last_mp
  attr_reader :last_atk
  attr_reader :last_def
  attr_reader :last_spi
  attr_reader :last_agi
  attr_reader :last_learned_skills
  #--------------------------------------------------------------------------
  # * Change Experience
  #     exp  : New experience
  #     show : Level up display flag
  #--------------------------------------------------------------------------
  alias :eds_old_change_exp :change_exp
  def change_exp(exp, show)
    #save off the old paramters   
    prev_skills = skills   
    @last_level = @level
    @last_hp = self.base_maxhp
    @last_mp = self.base_maxmp
    @last_atk = self.base_atk
    @last_def = self.base_def
    @last_spi = self.base_spi
    @last_agi = self.base_agi
    eds_old_change_exp(exp, show)
    @last_learned_skills =  skills - prev_skills
  end
 
  if USE_SKILL_WINDOW
   
    #--------------------------------------------------------------------------
    # * Show Level Up Message
    #     new_skills : Array of newly learned skills
    #--------------------------------------------------------------------------
    #   If we are not displaying the standard message when
    #   gaining a level, simply remove the loop that creates
    #   the learned skills message.  Continue to display
    #   the skills that were learned if we are not in battle.
    #--------------------------------------------------------------------------
    alias :eds_old_display_level_up :display_level_up
    def display_level_up(new_skills)
      if $game_temp.in_battle
        $game_message.new_page
        text = sprintf(Vocab::LevelUp, @name, Vocab::level, @level)
        $game_message.texts.push(text)   
      else
        eds_old_display_level_up(new_skills)
      end
    end
   
  end #skill window check
 
end
#==========================================================================
# * Window_LevelUpdate
#--------------------------------------------------------------------------
#   The main window that appears in battle when a level is gained.
#   Displays stat info, faceset, and (optionally) the actor sprite.
#==========================================================================
class Window_LevelUpdate < Window_Base
 
  def initialize(actor)
    w = STAT_WINDOW_WIDTH
    h = WINDOW_HEIGHT
    if USE_SKILL_WINDOW
      super(272 - (w / 2) - (SKILL_WINDOW_WIDTH / 2), 50, w, h)
    else
      super(272 - (w / 2), 50, w, h)
    end
    self.windowskin = Cache.system(WINDOWSKIN_NAME)
    self.back_opacity = WINDOW_OPACITY
    self.z = 9997
    @actor = actor
    @animation_index = 0
    @arrow = Cache.picture('level_up_arrow')   
    @y_offset = 12  #give some room under level display
    #begin drawing new level and old stat text
    @col_one_offset = 0
    #Draw old stats
    @col_two_offset = @col_one_offset + 60   
    #begin drawing Faceset/sprite and skills gained
    @col_four_offset = 0
    #begin drawing Faceset/sprite graphics
    @col_five_offset = 190
    #play the sound effect
    RPG::SE.new(LEVEL_UP_SE, LEVEL_UP_SE_VOLUME).play
    #calculates the offet for drawing level info
    calc_level_offsets         
    setup_name_window
    draw_stat_names
    draw_old_stat_values 
    draw_arrows     
    draw_new_stat_values
    draw_actor_rep
    update   
  end
  #--------------------------------------------------------------------------
  # * Create and display the name window
  #--------------------------------------------------------------------------
  def setup_name_window
    @name_window = Window_Base.new(self.x + 20, self.y - 30 , fit_to_text(@actor.name), SUB_WINDOW_HEIGHT)
    @name_window.z = 9998
    @name_window.windowskin = Cache.system(WINDOWSKIN_NAME)
    @name_window.back_opacity = 255
    @name_sprite = Sprite.new
    @name_sprite.bitmap = Bitmap.new(@name_window.width, @name_window.height)
    @name_sprite.bitmap.font.color = NAME_COLOR
    @name_sprite.x = @name_window.x + 15
    @name_sprite.y = @name_window.y - 10
    @name_sprite.z = 9999
    @name_sprite.bitmap.draw_text(0, 0, @name_sprite.bitmap.width, 60, @actor.name)
  end
  #--------------------------------------------------------------------------
  # * Draws the level and stat text (not the values themselves)
  #--------------------------------------------------------------------------
  def draw_stat_names   
    self.contents.font.color = LEVEL_COLOR
    self.contents.draw_text(@col_one_offset, 0, 60, WLH, "Lv.")
    self.contents.font.color = STAT_COLOR                                             
    self.contents.draw_text(@col_one_offset, y_incr, 60, WLH, Vocab.hp)   
    self.contents.draw_text(@col_one_offset, y_incr, 60, WLH, Vocab.mp)
    self.contents.draw_text(@col_one_offset, y_incr, 60, WLH, Vocab.atk)
    self.contents.draw_text(@col_one_offset, y_incr, 60, WLH, Vocab.def)
    self.contents.draw_text(@col_one_offset, y_incr, 60, WLH, Vocab.spi)
    self.contents.draw_text(@col_one_offset, y_incr, 60, WLH, Vocab.agi)
    #reset the font color
    self.contents.font.color = Font.default_color 
    #reset the y_offset to 12
    y_incr_reset
  end
  #--------------------------------------------------------------------------
  # * Draws the old level and stat values
  #--------------------------------------------------------------------------
  def draw_old_stat_values
    self.contents.font.color = OLD_STAT_COLOR
    self.contents.draw_text(@col_level_old_offset, 0, 60, WLH, @actor.last_level)
    self.contents.draw_text(@col_two_offset, y_incr, 60, WLH, @actor.last_hp)
    self.contents.draw_text(@col_two_offset, y_incr, 60, WLH, @actor.last_mp)
    self.contents.draw_text(@col_two_offset, y_incr, 60, WLH, @actor.last_atk)
    self.contents.draw_text(@col_two_offset, y_incr, 60, WLH, @actor.last_def)
    self.contents.draw_text(@col_two_offset, y_incr, 60, WLH, @actor.last_spi)
    self.contents.draw_text(@col_two_offset, y_incr, 60, WLH, @actor.last_agi)
    #reset the font color
    self.contents.font.color = Font.default_color
    #reset the y_offset to 12
    y_incr_reset
  end
  #--------------------------------------------------------------------------
  # * Draws the arrows
  #--------------------------------------------------------------------------
  def draw_arrows
    if @actor.last_hp - 100 < 0
      @col_three_offset = @col_two_offset + 30   
    elsif @actor.last_hp - 1000 < 0
      @col_three_offset = @col_two_offset + 40
    else
      @col_three_offset = @col_two_offset + 50
    end   
    draw_arrow(@col_level_arrow_offset, 6)     #level
    draw_arrow(@col_three_offset, y_incr + 6)  #hp
    draw_arrow(@col_three_offset, y_incr + 6)  #mp
    draw_arrow(@col_three_offset, y_incr + 6)  #atk
    draw_arrow(@col_three_offset, y_incr + 6)  #def
    draw_arrow(@col_three_offset, y_incr + 6)  #spi
    draw_arrow(@col_three_offset, y_incr + 6)  #agi
    calc_col_four_offset(@col_three_offset)
    #reset the y_offset to 12
    y_incr_reset
  end
  #--------------------------------------------------------------------------
  # * Draws the new level and stat values
  #--------------------------------------------------------------------------
  def draw_new_stat_values     
    draw_new_stat(@col_level_new_offset, 0, 60, WLH, @actor.last_level, @actor.level)   
    draw_new_stat(@col_four_offset, y_incr, 60, WLH, @actor.last_hp, @actor.maxhp)
    draw_new_stat(@col_four_offset, y_incr, 60, WLH, @actor.last_mp, @actor.maxmp)
    draw_new_stat(@col_four_offset, y_incr, 60, WLH, @actor.last_atk, @actor.base_atk)
    draw_new_stat(@col_four_offset, y_incr, 60, WLH, @actor.last_def, @actor.base_def)
    draw_new_stat(@col_four_offset, y_incr, 60, WLH, @actor.last_spi, @actor.base_spi)
    draw_new_stat(@col_four_offset, y_incr, 60, WLH, @actor.last_agi, @actor.base_agi)
    self.contents.font.color = Font.default_color 
    #reset the y_offset to 12
    y_incr_reset
  end
 
  def draw_new_stat(x, y, w, h, prev_val, val)
    if val > prev_val      #gain
      self.contents.font.color = NEW_STAT_VAL_COLOR
    elsif val == prev_val  #no change
      self.contents.font.color = OLD_STAT_COLOR
    else                   #loss
      self.contents.font.color = STAT_VAL_LOSS_COLOR
    end   
    self.contents.draw_text(x, y, w, h, val)   
  end
  #--------------------------------------------------------------------------
  # * Draws the faceset and optionally the actor sprite
  #--------------------------------------------------------------------------
  def draw_actor_rep
    draw_actor_face(@actor, @col_five_offset, 0)
    if (USE_SPRITE_GRAPHIC)
      x_pos = @col_five_offset + ((self.width - @col_five_offset) / 2) - 18
      draw_character(@actor.character_name, @actor.character_index, x_pos, 160)
    end
  end
  #--------------------------------------------------------------------------
  # * Draws an arrow
  #--------------------------------------------------------------------------
  def draw_arrow(x, y)
    src_rect = Rect.new(0, 0, @arrow.width, @arrow.height)
    self.contents.blt(x, y, @arrow, src_rect)
  end
  #--------------------------------------------------------------------------
  # * figures out the spacing for the level text display
  #--------------------------------------------------------------------------
  def calc_level_offsets
    @col_level_old_offset = @col_one_offset + 30   
    if @actor.last_level < 10
      @col_level_arrow_offset = @col_level_old_offset + 20
    else
      @col_level_arrow_offset = @col_level_old_offset + 30
    end   
    @col_level_new_offset = @col_level_arrow_offset + 26
  end
  #--------------------------------------------------------------------------
  # * Increments the y counter
  #--------------------------------------------------------------------------
  def y_incr
    @y_offset += WLH
    return @y_offset
  end
  #--------------------------------------------------------------------------
  # * Resets the y counter
  #--------------------------------------------------------------------------
  def y_incr_reset
    @y_offset = 12
  end
  #--------------------------------------------------------------------------
  # * calculate where to draw col four text (new stat values)
  #--------------------------------------------------------------------------
  def calc_col_four_offset(col_three) 
    @col_four_offset = col_three + 22
  end
  #--------------------------------------------------------------------------
  # * Fit the window width to the text
  #--------------------------------------------------------------------------
  def fit_to_text(text)
    w = self.contents.text_size(text).width + 32
    return w > 90 ? w : 90
  end
  #--------------------------------------------------------------------------
  # * Update the child window position
  #--------------------------------------------------------------------------
  def update_child_window_pos
    @name_window.x = self.x + 20
    @name_window.y = self.y - 30 
    @name_sprite.x = @name_window.x + 15
    @name_sprite.y = @name_window.y - 10 
  end
  #--------------------------------------------------------------------------
  # * Destroy the sprite!
  #--------------------------------------------------------------------------
  def dispose
    super
    @name_window.dispose
    @name_sprite.dispose
  end
 
end
#============================================================================
# * Window_SkillUpdate
#----------------------------------------------------------------------------
#   The learned skill window
#============================================================================
class Window_SkillUpdate < Window_Base
 
  def initialize(actor, parent_x, parent_y, parent_width)
    x = parent_x + parent_width
    h = WINDOW_HEIGHT
    w = SKILL_WINDOW_WIDTH
    super(x, parent_y, w, h)
    self.windowskin = Cache.system(WINDOWSKIN_NAME)
    self.back_opacity = WINDOW_OPACITY
    self.contents.font.color = SKILL_WINDOW_FONT_COLOR
    self.z = 9997
    @actor = actor
    @skills = []
    setup_title_window
    populate_skill_list
  end
  #--------------------------------------------------------------------------
  # * create the title window
  #--------------------------------------------------------------------------
  def setup_title_window
    #check to see if custom text is defined
    if NEW_SKILL_TITLE_TEXT == nil
      skill_title_text = sprintf("New %ss", Vocab.skill)
    else
      skill_title_text = NEW_SKILL_TITLE_TEXT
    end
    middle_parent = self.x + (self.width / 2)
    w = fit_to_text(skill_title_text)
    h = SUB_WINDOW_HEIGHT
    x = middle_parent - (w / 2)
    y = self.y - 30
    @title_window = Window_Base.new(x, y, w, h)   
    @title_window.z = 9998
    @title_window.windowskin = Cache.system(WINDOWSKIN_NAME)
    @title_window.back_opacity = 255
    @title_sprite = Sprite.new
    @title_sprite.bitmap = Bitmap.new(@title_window.width, @title_window.height)
    @title_sprite.bitmap.font.color = SKILL_TITLE_COLOR
    @title_sprite.x = @title_window.x + 15
    @title_sprite.y = @title_window.y + 4
    @title_sprite.z = 9999
    @title_sprite.bitmap.draw_text(0, 0, @title_sprite.bitmap.width, 32, skill_title_text)
  end
  #--------------------------------------------------------------------------
  # * My edit of draw_item_name.
  #   Necessary because the default one changes the font color.
  #--------------------------------------------------------------------------
  def draw_my_item_name(item, x, y, enabled = true)
     if item != nil
      draw_icon(item.icon_index, x, y, enabled)     
      self.contents.font.color.alpha = enabled ? 255 : 128
      self.contents.draw_text(x + 24, y, 172, WLH, item.name)
    end
  end
  #--------------------------------------------------------------------------
  # * draw all of the skills that were learned
  #--------------------------------------------------------------------------
  def populate_skill_list
    skills = @actor.last_learned_skills
    y = 0
    for skill in skills
      draw_my_item_name(skill, 0, y)
      y += 32
    end
  end
  #--------------------------------------------------------------------------
  # * Fit the window width to the text
  #--------------------------------------------------------------------------
  def fit_to_text(text)   
    return self.contents.text_size(text).width + 32
  end
  #--------------------------------------------------------------------------
  # * Kill the sprite!
  #--------------------------------------------------------------------------
  alias :eds_old_dispose :dispose
  def dispose   
    eds_old_dispose
    @title_window.dispose
    @title_sprite.dispose
  end
 
end
#============================================================================
# * Scene_Battle
#----------------------------------------------------------------------------
#   overrides -
#     * display_level_up
#============================================================================
class Scene_Battle < Scene_Base
 
  #--------------------------------------------------------------------------
  # * Display Level Up
  #--------------------------------------------------------------------------
  def display_level_up
    #patch for KGC Equip Learn Skill script
    if $imported != nil and $imported["EquipLearnSkill"]
      display_master_equipment_skill
    end
    exp = $game_troop.exp_total
    for actor in $game_party.existing_members
      last_level = actor.level
      last_skills = actor.skills
      actor.gain_exp(exp, true)     
      if actor.level > last_level
        win = Window_LevelUpdate.new(actor) 
        #if we are using the skill window and the skills have changed...
        if USE_SKILL_WINDOW && last_skills.length != actor.skills.length         
          s_win = Window_SkillUpdate.new(actor, win.x, win.y, win.width)       
          wait_for_message
          s_win.dispose if USE_SKILL_WINDOW
        else
          #move the window back to center screen and update the name window
          win.x = 272 - (win.width / 2)
          win.update_child_window_pos
          wait_for_message 
        end     
        win.dispose     
      end
    end
  end
 
end