Main Menu
  • Welcome to The RPG Maker Resource Kit.

Help Changing Script From XP To VX

Started by Selacius, October 06, 2008, 02:29:15 AM

0 Members and 1 Guest are viewing this topic.

Selacius

I am trying to take MOG's skill menu script from XP and move it over to VX. I've done pretty well for myself, except I am being stumped on one error. The error it gives me is "On line 98 of Windows_Selectable, undefined method `width' for nil:NilClass". Now I am completely unsure where in the script (MOG_Menu_Skill Nami) the error is coming from or how to solve it. This is the only issue I am having and want fixed. If you could take a look at it and if possible solve it, I would be greatful. Also if you could add an explanation of what was causing the error. I know that in solving this one I will probably lead into another error, but I would like to transfer this game over myself and just need help getting through this hurdle.
Thanks.

http://rapidshare.com/files/150999240/Ques...l_Demo.zip.html

For Those without VX:
[spoiler]
#_________________________________________________
# MOG_Menu Skill Nami V1.0
#_________________________________________________
# By Moghunter
#_________________________________________________
module MOG
  # Defini? de tempo de transi?.
  MSK_TT = 20
  # Tipo de transi?.
  MSK_TTT = "004-Blind04"
end
##############
# Game_Actor #
##############
class Game_Actor < Game_Battler
  def now_exp
    return @exp - @exp_list[@level]
  end
  def next_exp
    return @exp_list[@level+1] > 0 ? @exp_list[@level+1] - @exp_list[@level] : 0
  end
end
###############
# Window_Base #
###############
class Window_Base < Window
  def draw_lay(x,y)
    lay = Cache.menu("Menu_Status_OBJ")
    #lay = RPG::Cache.picture("MSK_Status")
    cw = lay.width
    ch = lay.height
    src_rect = Rect.new(0, 0, cw, ch)
    self.contents.blt(x , y - ch, lay, src_rect)
  end
  def draw_maphp3(actor, x, y)
    back = Cache.menu("MeterBack")
    cw = back.width
    ch = back.height
    src_rect = Rect.new(0, 0, cw, ch)
    self.contents.blt(x+65, y - ch +30, back, src_rect)
    meter = Cache.menu("HPMeter")
    cw = meter.width * actor.hp / actor.maxhp
    ch = meter.height
    src_rect = Rect.new(0, 0, cw, ch)
    self.contents.blt(x+65, y - ch +30, meter, src_rect)
    self.contents.font.color = Color.new(0,0,0,255)
    self.contents.draw_text(x + 66, y - 1, 100, 32, actor.hp.to_s + "/" + actor.maxhp.to_s, 1)
    self.contents.font.color = Color.new(250,255,255,255)
    self.contents.draw_text(x+65, y - 2, 100, 32, actor.hp.to_s + "/" + actor.maxhp.to_s, 1)
  end
  def draw_mapsp3(actor, x, y)
    back = Cache.menu("MeterBack")
    cw = back.width
    ch = back.height
    src_rect = Rect.new(0, 0, cw, ch)
    self.contents.blt(x+ 65 , y - ch +30, back, src_rect)
    meter = Cache.menu("MPMeter")
    cw = meter.width * actor.mp / actor.maxmp
    ch = meter.height
    src_rect = Rect.new(0, 0, cw, ch)
    self.contents.blt(x +65 , y - ch+ 30, meter, src_rect)
    self.contents.font.color = Color.new(0,0,0,255)
    self.contents.draw_text(x + 66, y - 1, 100, 32, actor.mp.to_s + "/" + actor.maxmp.to_s, 1)
    self.contents.font.color = Color.new(250,255,255,255)
    self.contents.draw_text(x + 65, y - 2, 100, 32, actor.mp.to_s + "/" + actor.maxmp.to_s, 1)
  end
  ####
  def draw_mexp2(actor, x, y)
    bitmap2 = Cache.menu("MeterBack")
    cw = bitmap2.width
    ch = bitmap2.height
    src_rect = Rect.new(0, 0, cw, ch)
    self.contents.blt(x + 60 , y - ch + 30, bitmap2, src_rect)
    rate = actor.now_exp.to_f / actor.next_exp
    bitmap = Cache.menu("EXPMeter")
    if actor.level < 99
      cw = bitmap.width * rate
    else
      cw = bitmap.width
    end
    ch = bitmap.height
    src_rect = Rect.new(0, 0, cw, ch)
    self.contents.blt(x + 60 , y - ch + 30, bitmap, src_rect)
    self.contents.font.color = Color.new(0,0,0,255)
    self.contents.draw_text(x + 55, y + 1, 84, 32, "Exp",0)
    self.contents.font.color = Color.new(255,255,255,255)
    self.contents.draw_text(x + 54, y, 84, 32, "Exp",0)
    self.contents.font.color = Color.new(0,0,0,255)
    self.contents.draw_text(x + 190, y - 125, 60, 32,"LV "+ actor.level.to_s, 1)
    self.contents.font.color = Color.new(255,255,255,255)
    self.contents.draw_text(x  +191, y - 124, 60, 32,"LV "+ actor.level.to_s, 1)
  end
  ####
end
#######################
# Window_SkillStatus2 #
#######################
class Window_SkillStatus2 < Window_Base
  def initialize(actor)
    super(350, 75, 290, 340)
    self.contents = Bitmap.new(width - 32, height - 32)
    @actor = actor
    self.opacity = 0
    refresh
  end
  def refresh
    self.contents.clear
    draw_lay(0,300)
    draw_actor_face(@actor, 50, 140)
    draw_actor_name(@actor, 15, 10)
    draw_actor_state(@actor, 120, 140)
    draw_maphp3(@actor, 5, 195)
    draw_mapsp3(@actor, 5, 240)
    draw_mexp2(@actor, -30, 135)
  end
end
#################
# Window_Skill2 #
#################
class Window_Skill2 < Window_Selectable
  def initialize(actor)
    super(0, 95, 335, 290)
    @actor = actor
    @column_max = 1
    refresh
    self.index = 0
  end
  def skill
    return @data[self.index]
  end
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    for i in 0...@actor.skills.size
      skill = $data_skills[@actor.skills]
      if skill != nil
        @data.push(skill)
      end
    end
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    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
    self.contents.font.name = "Georgia"
    x = index % 1 * (288)
    y = index / 1 * 32
    width = self.width + 32 / @column_max - 32
    rect = Rect.new(x, y, width, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = 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)
    self.contents.draw_text(x + 232, y, 48, 32, skill.mp_cost.to_s, 2)
    self.contents.font.color = Color.new(200,200,0,255)
    self.contents.draw_text(x + 170, y, 48, 32, "MP", 2)
  end
  def update_help
    @help_window.set_text(self.skill == nil ? "" : self.skill.description)
  end
end

###############
# Scene_Skill #
###############
class Scene_Skill
  def initialize(actor_index = 0, equip_index = 0)
    @actor_index = actor_index
  end
  def main
    @actor = $game_party.members[@actor_index]
    @msk_lay = Sprite.new
    @msk_lay.bitmap = Cache.menu("Menu_Status_Layout")
    @msk_lay.z = 100
    @msk_back1 = Plane.new
    @msk_back1.bitmap = Cache.menu("Background")
    @msk_back1.z = 10
    @help_window = Window_Help.new
    @help_window.y = 500
    @status_window = Window_SkillStatus2.new(@actor)
    @status_window.z = 110
    @status_window.x = 640
    @skill_window = Window_Skill2.new(@actor)
    @skill_window.help_window = @help_window
    @skill_window.help_window.y = 500
    @target_window = Window_Target.new
    @target_window.x = 304
    @target_window.visible = false
    @target_window.active = false
    @skill_window.opacity = 0
    @help_window.opacity = 0
    @target_window.opacity = 190
    Graphics.transition(10, "Graphics/System/BattleStart", 80)     
    #Graphics.transition(MOG::MSK_TT, "Graphics/Transitions/" MOG::MSK_TTT,80)
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    for i in 0..30
      @status_window.x = 25
      Graphics.update
    end
    Graphics.freeze
    @help_window.dispose
    @status_window.dispose
    @skill_window.dispose
    @target_window.dispose
    @msk_lay.dispose
    @msk_back1.dispose
  end
  def update
    @help_window.update
    @status_window.update
    @skill_window.update
    @target_window.update
    @msk_back1.ox = 1
    @msk_back1.oy = 1
    if @status_window.x > 350
      @status_window.x -= 15
    elsif @status_window.x 425
      @skill_window.help_window.y -= 5
    elsif @skill_window.help_window.y = 3
      @skill_window.active = false
      @target_window.visible = true
      @target_window.active = true
      if @skill.scope == 4 || @skill.scope == 6
        @target_window.index = -1
      elsif @skill.scope == 7
        @target_window.index = @actor_index - 10
      else
        @target_window.index = 0
      end
    else
      if @skill.common_event_id > 0
        $game_temp.common_event_id = @skill.common_event_id
        $game_system.se_play(@skill.menu_se)
        @actor.mp -= @skill.mp_cost
        @status_window.refresh
        @skill_window.refresh
        @target_window.refresh
        $scene = Scene_Map.new
        return
      end
    end
    return
    end
    if Input.trigger?(Input::R) or Input.trigger?(Input::RIGHT)
      $game_system.se_play($data_system.cursor_se)
      @actor_index = 1
      @actor_index %= $game_party.actors.size
      $scene = Scene_Skill.new(@actor_index)
      return
    end
    if Input.trigger?(Input::L) or Input.trigger?(Input::LEFT)
      $game_system.se_play($data_system.cursor_se)
      @actor_index = $game_party.actors.size - 1
      @actor_index %= $game_party.actors.size
      $scene = Scene_Skill.new(@actor_index)
      return
    end
  end
  def update_target
    if Input.trigger?(Input::X)
      $game_system.se_play($data_system.cancel_se)
      @skill_window.active = true
      @target_window.visible = false
      @target_window.active = false
      return
    end
    if Input.trigger?(Input::C)
      unless @actor.skill_can_use?(@skill.id)
      $game_system.se_play($data_system.buzzer_se)
      return
    end
    if @target_window.index == -1
      used = false
      for i in $game_party.actors
        used |= i.skill_effect(@actor, @skill)
      end
    end
    if @target_window.index = 0
      target = $game_party.actors[@target_window.index]
      used = target.skill_effect(@actor, @skill)
    end
    if used
      $game_system.se_play(@skill.menu_se)
      @actor.sp -= @skill.sp_cost
      @status_window.refresh
      @skill_window.refresh
      @target_window.refresh
      if $game_party.all_dead?
        $scene = Scene_Gameover.new
        return
      end
    if @skill.common_event_id > 0
      $game_temp.common_event_id = @skill.common_event_id
      $scene = Scene_Map.new
      return
    end
  end
  unless used
    $game_system.se_play($data_system.buzzer_se)
  end
  return
  end
  end
[/spoiler]

modern algebra

The link doesn't work :(

My initial guess is that self.contents has not been defined.?

Selacius

Hey Modern, A few of us figured out wat was going on, it was some if statement that was throwing the error, kinda wierd. But anyways, I figured that the script doesn't actually add any functionality to the skill menu, but just rearranges some windows, so I could instead of trying to convert this script, I can just try to rearrange the existing skill script from VX.

modern algebra

Mmm, yeah - my guess was that the if contents.width ... condition was throwing the error as a result of contents being nil at the time the method was run. Anyway, I'm glad you figured it out and good luck with the project.

Selacius

Actually it was this line which caused the error, found in the Window_Skill2 portion: if @item_max > 0

modern algebra

Yes, it caused the error because you define self.contents in that condition. If there is a case, where @item_max is not > 0, then self.contents would remain undefined. Thus, when the item_rect method is called in the course of updating the window,  there is no self.contents defined and that is why you get the error occurring in Window_Selectable.

Removing the condition @item_max > 0 made it so that self.contents would be defined even when @item_max was 0 and thus no error would occur under that circumstance.