The RPG Maker Resource Kit

RMRK RPG Maker Creation => VX => VX Scripts Database => Topic started by: Xzygon on December 26, 2010, 02:43:46 AM

Title: Equips change Skill MP Cost (Couldn't think of a better name.)
Post by: Xzygon on December 26, 2010, 02:43:46 AM
Introduction
What this script does is, if you put <mp1> in the notebox of a weapon or armor, it'll make all skills (By default) use up only 1 MP, just like in Final Fantasy.
I based this off FlipelyFlip's MP cost 1 script, but his was pretty chunky, so I made my own based on that.


Script
NOTE: Uses Vampyr Kernel, can be found here.
#==============================================================================
# Vampyr Kernel 1.6 - 08/09/2010
#==============================================================================
# This module is necessary to activate and enhance compatibility of all Vampyr's Scripts
#------------------------------------------------------------------------------
module Vampyr_Kernel
 
  @print = false
 
  @scripts = {}
  @warnings = {}
 
  def self.register(script, version, date)
    @scripts[script] = [version, date]
  end
 
  def self.enabled?(script, version=nil)
    if @scripts.has_key?(script)
      if version.nil?
        return true
      elsif @scripts[script][0] >= version
        return true
      else
        if $TEST and @warnings[script] == nil and @print
          print "'#{script}' is obsolete.\r\nSome functions won't work correctly"
          @warnings[script] = ["is obsolete"]
          self.write_log
        end
        return false
      end
    else
      if $TEST and @warnings[script] == nil and @print
        print "Unable to find script '#{script}' or it is placed in wrong place.\r\nSome functions won't work correctly"
        @warnings[script] = ["Unable to find"]
        self.write_log
      end
      return false
    end
  end
 
  def self.show_scripts(alert=true)
    list = "Vampyr Scripts [#{@scripts.size}]:\r\n\r\n"
    @scripts.each { |key, value| list += "#{key.gsub("Vampyr ", "")}  #{value[0]}  #{value[1]}\r\n" }
    list += "\r\nWarnings:\r\n" if @warnings != {}
    @warnings.each { |key, value| list += "#{key} #{value}\r\n" }
    return print list if alert
    return list
  end
 
  def self.write_log
    file = File.new("Vampyr_Log-#{Time.now.strftime("%m_%d_%Y")}.txt", "wb")
    file.write(self.show_scripts(false))
    file.close
  end
 
end

#------------------------------------------------------------------------------
class Object
 
  def check(param)
    self.each_line { |i| return true if i =~ /#{param}/i }
    return false
  end
 
  def read(param, onfail=nil)   
    self.each_line { |i| return i.gsub("#{param} = ", "").chomp if i =~ /#{param} = /i }
    return onfail
  end
 
  def to_b
    return true if self =~ /true/i
    return true if self.to_i > 0
    return false
  end
 
  def getw
    bitmap = Bitmap.new(1, 1)
    width = bitmap.text_size(self.to_s).width
    bitmap.dispose
    return width
  end
 
  def to_rgb
    x = self.delete("#").scan(/../).map { |i| i.to_i(16) }
    return Color.new(x[0].to_f, x[1].to_f, x[2].to_f)
  end
 
  def number?
    return true unless self.scan(/\d/).empty?
    return false
  end
 
  def transform
    return self.to_i if self.number?
    return self.to_s
  end
 
end

#------------------------------------------------------------------------------
class Color
 
  def self.index(i)
    return Cache.system("Window").get_pixel(64+(i%8)*8, 96+(i/8)*8)
  end
 
  def self.get(x, y)
    return Cache.system("Window").get_pixel(x, y)
  end
 
end

#------------------------------------------------------------------------------
class Sprite
 
  def draw_icon(index, x, y, o=255)
    bitmap = Cache.system("Iconset")
    rect = Rect.new(index%16*24, index/16*24, 24, 24)
    self.bitmap.blt(x, y, bitmap, rect, o)
  end
 
  def draw_face(actor, x, y)
    char_name = actor.character_name
    char_index = actor.character_index
    bitmap = Cache.character(char_name)
    sign = char_name[/^[\!\$]./]
    if sign != nil and sign.include?('$')
      cw = bitmap.width / 3
      ch = bitmap.height / 4
    else
      cw = bitmap.width / 12
      ch = bitmap.height / 8
    end
    src_rect = Rect.new((char_index%4*3+1)*cw, (char_index/4*4)*ch, cw, 20)
    self.bitmap.blt(x, y+6, bitmap, src_rect)
  end
 
end

#------------------------------------------------------------------------------
class Bitmap
 
  def draw_outlined_text(*args)
    if args[0].is_a?(Rect)
      x = args[0].x
      y = args[0].y
      w = args[0].width
      h = args[0].height
      s = args[1]
      a = (args[2].nil? ? 0 : args[2])
    else
      x = args[0]; y = args[1]
      w = args[2]; h = args[3]
      s = args[4]
      a = (args[5].nil? ? 0 : args[5])
    end
    font.shadow = false
    color = font.color.clone
    font.color = Color.new(0,0,0)
    draw_text(x-1, y-1, w, h, s, a)
    draw_text(x+1, y-1, w, h, s, a)
    draw_text(x-1, y+1, w, h, s, a)
    draw_text(x+1, y+1, w, h, s, a)
    font.color = color
    draw_text(x, y, w, h, s, a)
  end
 
  def draw_icon(index, x, y, enabled=true)
    bitmap = Cache.system("Iconset")
    rect = Rect.new(index%16*24, index/16*24, 24, 24)
    blt(x, y, bitmap, rect, enabled ? 255 : 128)
  end
 
end

#------------------------------------------------------------------------------
class Game_Map
 
  def in_range?(object)
    return true if object.is_a?(Game_Event) and object.comment_exists?("Force Update")
    return false if object.real_x < (@display_x-(256*3))
    return false if object.real_x > (@display_x+((Graphics.width/32*256)+(256*3)))
    return false if object.real_y < (@display_y-(256*3))
    return false if object.real_y > (@display_y+((Graphics.height/32*256)+(256*3)))
    return true
  end
 
  def update_events
    for event in @events.values
      if in_range?(event) or event.trigger == 3 or
        event.trigger == 4 or event.comment_exists?("Forse Update")
        event.update
      end
    end
    for common_event in @common_events.values
      common_event.update
    end
  end
 
  def name
    return load_data("Data/MapInfos.rvdata")[@map_id].name
  end
 
  def map
    return @map
  end
 
end

#------------------------------------------------------------------------------
class Game_Character
 
  attr_accessor :character_name
  attr_accessor :character_index
  attr_accessor :move_type
  attr_accessor :move_route
  attr_accessor :direction_fix
  attr_accessor :walk_anime
  attr_accessor :step_anime
  attr_accessor :through
  attr_accessor :pattern
  attr_accessor :direction
  attr_accessor :bush_depth
  attr_accessor :blend_type
  attr_accessor :opacity
  attr_accessor :move_speed
  attr_accessor :priority_type
  attr_accessor :width
  attr_accessor :height
  attr_accessor :draw
  attr_accessor :destroy
 
  def in_range?(target, range)
    x = (@x - target.x) * (@x - target.x)
    y = (@y - target.y) * (@y - target.y)
    return true if (x + y) <= (range * range)
    return false
  end
 
  def in_front?(target)
    return true if @direction == 2 and @x == target.x and (@y+1) == target.y
    return true if @direction == 4 and (@x-1) == target.x and @y == target.y
    return true if @direction == 6 and (@x+1) == target.x and @y == target.y
    return true if @direction == 8 and @x == target.x and (@y-1) == target.y
    return false
  end
 
  def in_direction?(target)
    return true if @direction == 2 and target.y >= @y and target.x == @x
    return true if @direction == 4 and target.x <= @x and target.y == @y
    return true if @direction == 6 and target.x >= @x and target.y == @y
    return true if @direction == 8 and target.y <= @y and target.x == @x
    return false
  end
 
  def in_behind?(target)
    return true if @direction == 2 and @x == target.x and @y < target.y
    return true if @direction == 4 and @x > target.x and @y == target.y
    return true if @direction == 6 and @x < target.x and @y == target.y
    return true if @direction == 8 and @x == target.x and @y > target.y
    return false
  end
 
  def in_beside?(target)
    return true if target.direction == 2 and @direction == 4 and target.x == (@x-1) and target.y == @y
    return true if target.direction == 2 and @direction == 6 and target.x == (@x+1) and target.y == @y
    return true if target.direction == 4 and @direction == 2 and target.x == @x and target.y == (@y+1)
    return true if target.direction == 4 and @direction == 8 and target.x == @x and target.y == (@y-1)
    return true if target.direction == 6 and @direction == 2 and target.x == @x and target.y == (@y+1)
    return true if target.direction == 6 and @direction == 8 and target.x == @x and target.y == (@y-1)
    return true if target.direction == 8 and @direction == 4 and target.x == (@x-1) and target.y == @y
    return true if target.direction == 8 and @direction == 6 and target.x == (@x+1) and target.y == @y
    return false
  end
 
  def face_to_face?(target)
    return true if @direction == 2 and target.direction == 8
    return true if @direction == 4 and target.direction == 6
    return true if @direction == 6 and target.direction == 4
    return true if @direction == 8 and target.direction == 2
    return false
  end
 
  def step_back
    old_speed = @move_speed
    old_frequency = @move_frequency
    @move_speed = 6
    @move_frequency = 5
    move_backward
    @move_speed = old_speed
    @move_frequency = old_frequency
  end
 
  def over?(target)
    return true if @x == target.x and @y == target.y
    return false
  end
 
  def jump_to(x, y)
    xx = (x < @x ? -(@x-x) : x > @x ? x-@x : 0)
    yy = (y < @y ? -(@y-y) : y > @y ? y-@y : 0)
    jump(xx, yy)
  end
 
  def move_toward(*params)
    if params[0].is_a?(Numeric)
      x = params[0]
      y = params[1]
    else
      x = params[0].x
      y = params[0].y
    end
    sx = distance_x(x)
    sy = distance_y(y)
    if sx != 0 or sy != 0
      if sx.abs > sy.abs
        sx > 0 ? move_left : move_right
        if @move_failed and sy != 0
          sy > 0 ? move_up : move_down
        end
      else
        sy > 0 ? move_up : move_down
        if @move_failed and sx != 0
          sx > 0 ? move_left : move_right
        end
      end
    end
  end
 
  def move_type_toward(target)
    case rand(6)
      when 0..3; move_toward(target)
      when 4;    move_random
      when 5;    move_forward
    end
  end
 
  def move_away_from(*params)
    if params[0].is_a?(Numeric)
      x = params[0]
      y = params[1]
    else
      x = params[0].x
      y = params[0].y
    end
    sx = distance_x(x)
    sy = distance_y(y)
    if sx != 0 or sy != 0
      if sx.abs > sy.abs
        sx > 0 ? move_right : move_left
        if @move_failed and sy != 0
          sy > 0 ? move_down : move_up
        end
      else
        sy > 0 ? move_down : move_up
        if @move_failed and sx != 0
          sx > 0 ? move_right : move_left
        end
      end
    end
  end
 
  def move_type_away_from(target)
    case rand(6)
      when 0..3; move_away_from(target)
      when 4;    move_random
      when 5;    move_forward
    end
  end
 
  def turn_toward(*params)
    if params[0].is_a?(Numeric)
      x = params[0]
      y = params[1]
    else
      x = params[0].x
      y = params[0].y
    end
    sx = distance_x(x)
    sy = distance_y(y)
    if sx.abs > sy.abs
      sx > 0 ? turn_left : turn_right
    elsif sx.abs < sy.abs
      sy > 0 ? turn_up : turn_down
    end
  end
 
  def distance_x(x)
    sx = @x - x
    if $game_map.loop_horizontal?
      if sx.abs > $game_map.width / 2
        sx -= $game_map.width
      end
    end
    return sx
  end
 
  def distance_y(y)
    sy = @y - y
    if $game_map.loop_vertical?
      if sy.abs > $game_map.height / 2
        sy -= $game_map.height
      end
    end
    return sy
  end
 
  def animation_id=(i)
    @animation_id = (i < 0 ? 1 : i)
  end
 
  def check_event_trigger_touch(x, y)
  end
 
end

#------------------------------------------------------------------------------
class Game_Event < Game_Character
 
  attr_reader :id
 
  def name
    return @event.name
  end
 
  def check_comment(param)
    return nil if @list == nil or @list.size <= 0
    for item in @list
      next unless item.code == 108 or item.code == 408
      if item.parameters[0] =~ /#{param} (.*)/i
        return $1.to_s
      end
    end
    return nil
  end
 
  def comment_exists?(param)
    return false if @list == nil or @list.size <= 0
    for item in @list
      if item.code == 108 or item.code == 408
        if item.parameters[0] =~ /#{param}/i
          return true
        end
      end
    end
    return false
  end
 
end

#------------------------------------------------------------------------------
class Game_Interpreter
 
  def id
    return @original_event_id.to_i
  end
 
  def self_event
    return $game_map.events[id]
  end
 
  def selfswitch(switch, status=nil, event_id=@id)
    key = [$game_map.map_id, event_id, switch]
    if status == nil
      $game_self_switches[key] = !$game_self_switches[key]
    else
      $game_self_switches[key] = status
    end
    $game_map.need_refresh = true
  end
 
end

#------------------------------------------------------------------------------
class Sprite_Base
 
  alias vampyr_kernel_spbase_update update
 
  def update
    vampyr_kernel_spbase_update
    update_animation_fixed
  end
 
  def update_animation_fixed
    return if @animation == nil
    if @animation.position == 3
      if viewport == nil
        @animation_ox = Graphics.width / 2
        @animation_oy = Graphics.height / 2
      else
        @animation_ox = viewport.rect.width / 2
        @animation_oy = viewport.rect.height / 2
      end
    else
      @animation_ox = x - ox + width / 2
      @animation_oy = y - oy + height / 2
      if @animation.position == 0
        @animation_oy -= height / 2
      elsif @animation.position == 2
        @animation_oy += height / 2
      end
    end
  end
 
end

#------------------------------------------------------------------------------
class Sprite_Character < Sprite_Base
 
  alias vampyr_kernel_spchar_update_bitmap update_bitmap
 
  def update_bitmap
    vampyr_kernel_spchar_update_bitmap
    @character.width = @cw if @character.width != @cw
    @character.height = @ch if @character.height != @ch
  end
 
end

#------------------------------------------------------------------------------
Win32API.new("kernel32", "SetPriorityClass", "pi", "i").call(-1, 0x80)h



Actual MP Cost Change script (Uses the Kernel)
#This script makes it so that if put <mp1> in the notebox of a weapon or armor, the MP cost of any skill will be reduced to the amount below.

MPchange = 1 #Change this number to change the mp amount skills are reduced to.

module RPG
  class BaseItem
    def mp1?
      self.note.check("<mp1>") #I kept it <mp1> to tribute FlipelyFlip's original.
    end
  end
end

class Game_Actor
  def calc_mp_cost(skill)
    if equips.compact.any? {|equips| equips.mp1?}
      if skill.mp_cost == 0
        return skill.mp_cost
      else
        return MPchange
      end
    elsif half_mp_cost
      return skill.mp_cost / 2
    else
      return skill.mp_cost
    end
  end
end


Standalone script, uses FlipelyFlip's module.
MP1 = 2

module Flip
  def self.check_note_tags(obj, tag)
    obj.note.each_line { |notetag|
    case notetag
    when tag
      return true
    end
    }
    return false
  end
end


module RPG
  class BaseItem
    def mp1?
      if @mp1.nil?
        txt = Flip.check_note_tags(self, /<(?:mp1)>/i)
        @mp1 = txt
      end
      return @mp1
      end
  end
end

class Game_Actor
  def calc_mp_cost(skill)
    if equips.compact.any? {|equips| equips.mp1?}
      if skill.mp_cost == 0
        return skill.mp_cost
      else
        return MP1
      end
    elsif half_mp_cost
      return skill.mp_cost / 2
    else
      return skill.mp_cost
    end
  end
end



Credits
-FlipelyFlip
-Vlad, for the Kernel script.
-Xzygon
Title: Re: Equips change Skill MP Cost (Couldn't think of a better name.)
Post by: modern algebra on December 26, 2010, 03:18:06 AM
There is no "check" method for String object. Are you relying on some other script for that method? If so, you should identify what it is and link to it; otherwise the script will throw errors for people without that script.

Otherwise it is a nice little script.
Title: Re: Equips change Skill MP Cost (Couldn't think of a better name.)
Post by: Xzygon on December 26, 2010, 08:09:33 AM
Err, whoops, I didn't realize it was relying on another script. Sorry about that. (I keep doing that with my scripts, I always forget to thoroughly check it...)
Title: Re: Equips change Skill MP Cost (Couldn't think of a better name.)
Post by: hiromu656 on December 31, 2010, 07:20:03 AM
So, is there a way to make it so that certain items make the MP cost a number different than other armors? For instance, can you make a shirt that make the MP cost for the skills 10, and a robe that makes it 2? I'm just kinda confused and I'm thinking that the script makes the changes the same on each item it affects (Unless that's what it does).