Wymagania Ekwipunku / Equipment Requirements [VX]

 

screen equipment requirements vx

 

Autor: Ayene [ Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie obsługi JavaScript. ]

Kompatybilność: rmvx icon RPG Maker VX

Krótki opis:

Skrypt umożliwia ustawienie wymagań dla broni i pancerza. Na przykład ekwipowanie bohatera w topór dwuręczny byłoby możliwe dopiero po osiągnięciu konkretnego poziomu lub posiadaniu odpowiedniej statystyki. Ponadto dodano opcję, dzięki której można wprowadzić wymóg posiadania odpowiedniej umiejętności.

Instrukcja:

By skorzystać ze skryptu w oknie 'Note' przy danym elemencie ekwipunku w Bazie Danych umieść tekst:

<wymagania LV, MAXHP, MAXMP, ATK, DEF, SPI, AGI>

gdzie:

LV - wymagany poziom postaci
MAXHP - maksymalne HP (max HP)
MAXMP - maksymalne MP (max MP)
ATK - atak (attack)
DEF - obrona (defence)
SPI - wola (spirit)
AGI - zręczność/zwinność (agility)

Przykład:

Jeśli chcesz, by postać mogła ekwipować broń na poziomie 6, dodatkowo pod warunkiem, że ma 120 max. HP, 40 ataku i 70 obrony, to w oknie 'Note' tej broni należy wpisać:

<wymagania 6, 120, 0, 40, 70, 0, 0>

Natomiast, gdy bohater ma mieć tylko odpowiednią zręczność:

<wymagania 0, 0, 0, 0, 0, 0, 50>

Aby dodać wymóg posiadania umiejętności, wystarczy w oknie notek wpisać:

<umiejetnosc_wymagana ID, ID, ...>

gdzie ID to id umiejętności w Bazie Danych.

Skrypt:

#===================================================================
# Wymagania broni i pancerza [VX] / Equipment Requirements [VX]
# by Ayene
# 27.01.2010 ver 1.2
# 04.03.2012 - dodano wymóg posiadania odpowiedniej umiejętności
# 10.08.2012 - poprawiono zmianę ekwipunku w Scene_Equip
# www.ultimateam.pl
#===================================================================
# Opis:
# Skrypt umożliwia ustawienie wymagań dla broni i pancerza.
# Na przykład ekwipowanie bohatera w topór dwuręczny byłoby możliwe
# dopiero po osiągnięciu konkretnego poziomu lub posiadaniu odpowiedniej
# statystyki. Ponadto dodano opcję, dzięki której można wprowadzić wymóg
# posiadania odpowiedniej umiejętności.
#
# Instrukcja:
# By skorzystać ze skryptu w oknie 'Note' przy danym elemencie ekwipunku
# w Bazie Danych umieść tekst <wymagania LV, MAXHP, MAXMP, ATK, DEF, SPI, AGI>,
# gdzie:
# LV - wymagany poziom postaci
# MAXHP - maksymalne HP (max HP)
# MAXMP - maksymalne MP (max MP)
# ATK - atak (attack)
# DEF - obrona (defence)
# SPI - wola (spirit)
# AGI - zręczność/zwinność (agility)
#
# Przykładowo:
# Jeśli chcesz, by postać mogła ekwipować broń na poziomie 6, dodatkowo
# pod warunkiem, że ma 120 max. HP, 40 ataku i 70 obrony
# to w oknie 'Note' tej broni należy wpisać:
# <wymagania 6, 120, 0, 40, 70, 0, 0>
#
# Natomiast, gdy bohater ma mieć tylko odpowiednią zręczność:
# <wymagania 0, 0, 0, 0, 0, 0, 50>
#
# Aby dodać wymóg posiadania umiejętności, wystarczy w oknie notek wpisać:
# <umiejetnosc_wymagana ID, ID, ...>
# gdzie ID to id umiejętności w Bazie Danych
#===================================================================
module AYENE
  module ItemSpec
    ITEM_SPEC = /<(?:WYMAGANIA|wymagania)\s*(\d+)\s*, \s*(\d+), \s*(\d+), \s*(\d+), \s*(\d+), \s*(\d+), \s*(\d+)>/i
    WEAPON_TEXT = "By założyć tę broń musisz mieć:"
    ARMOR_TEXT = "By założyć ten pancerz musisz mieć:"     
    ACC_TEXT = "By założyć ten przedmiot musisz mieć:"
    PARAM_NAMES = ["Poziom", "Żywotność", "Mana", "Atak", "Obrona", "Wola", "Zwinność", "Umiejętności:"]   
    SKILL_SPEC = /<(?:UMIEJETNOSC_WYMAGANA|umiejetnosc_wymagana)[ ]*(\d+(?:[ ]*,[ ]*\d+)*)>/i
    SHOW_SKILL_REC = true  # Czy wyświetlać, jakiej umiejętności brakuje?
  end
end

#===================================================================
# RPG::BaseItem
#===================================================================
class RPG::BaseItem
  attr_accessor :spec_params   
  def item_spec_ini
    @spec_params = {}
    (0..6).each{|i| @spec_params[i] = 0}
    @spec_params[7] = []
    self.note.split(/[\r\n]+/).each { |line|
      case line
      when AYENE::ItemSpec::ITEM_SPEC
        @spec_params[0] = $1.to_i
        @spec_params[1] = $2.to_i
        @spec_params[2] = $3.to_i
        @spec_params[3] = $4.to_i
        @spec_params[4] = $5.to_i
        @spec_params[5] = $6.to_i
        @spec_params[6] = $7.to_i
      end
    }
    self.note.split(/[\r\n]+/).each { |line|
      case line
      when AYENE::ItemSpec::SKILL_SPEC
        $1.scan(/\d+/).each { |num|
          skill_id = num.to_i
          @spec_params[7].push(skill_id) if $data_skills[skill_id] != nil
        }
      end
    }
  end
end

#===================================================================
# RPG::Weapon
#===================================================================
class RPG::Weapon < RPG::BaseItem
  def spec_text
    return AYENE::ItemSpec::WEAPON_TEXT
  end
end

#===================================================================
# RPG::Armor
#===================================================================
class RPG::Armor < RPG::BaseItem
  def spec_text
    case kind
    when 3
      return AYENE::ItemSpec::ACC_TEXT
    else
      return AYENE::ItemSpec::ARMOR_TEXT
    end   
  end
end

#===================================================================
# Game_Actor
#===================================================================
class Game_Actor < Game_Battler
  def equip_allowed?(item)
    return true if (item.spec_params[0] <= level && item.spec_params[1] <= base_maxhp &&
          item.spec_params[2] <= base_maxmp && item.spec_params[3] <= base_atk &&
          item.spec_params[4] <= base_def && item.spec_params[5] <= base_spi &&
          item.spec_params[6] <= base_agi) && equip_skill_allowed?(item)
    return false
  end
 
  def equip_skill_allowed?(item)   
    item.spec_params[7].each{|skill_id|
      return false if !skill_learn?($data_skills[skill_id])   
    }
    return true
  end
end

#===================================================================
# Game_Interpreter
#===================================================================
class Game_Interpreter
   
  def check_change_equip(actor)
    for i in 0..4
      item = actor.equips[i]
      actor.change_equip(i, nil) if !item.nil? && !actor.equip_allowed?(item)
    end
  end
 
  alias aye_command_315 command_315
  def command_315
    aye_command_315
    iterate_actor_id(@params[0]) do |actor|
      check_change_equip(actor)   
    end   
  end

  alias aye_command_316 command_316
  def command_316
    aye_command_316
    iterate_actor_id(@params[0]) do |actor|
      check_change_equip(actor)   
    end
  end   

  alias aye_command_317 command_317
  def command_317
    aye_command_317
    iterate_actor_id(@params[0]) do |actor|
      check_change_equip(actor)   
    end
  end
end

#===================================================================
# Window_Help
#===================================================================
class Window_Equip_Help < Window_Base
  def initialize(item, data, actor, skill)   
    if skill.empty? or !AYENE::ItemSpec::SHOW_SKILL_REC
      height = (data.size+1) / 2 * WLH + WLH + 32
    else
      height = (data.size+1) / 2 * WLH + WLH + 32 + WLH * [skill.size, 7].min
    end     
    super(42, 180 - height/2, 460, height)
    self.back_opacity = 255
    self.contents.font.color = crisis_color
    self.contents.draw_text(4, 0, self.width - 40, WLH, item.spec_text, 1)
    x = 10
    y = WLH   
    data.each_with_index{|array, i|   
      self.contents.font.color = system_color
      self.contents.draw_text(x+i%2*240, y+i/2*WLH, 200, WLH, AYENE::ItemSpec::PARAM_NAMES[array[0]].to_s, 0)     
      self.contents.font.color = normal_color
      self.contents.draw_text(x+120+i%2*240, y+i/2*WLH, 40, WLH, array[1].to_s, 2)
    }
    if !skill.empty? and AYENE::ItemSpec::SHOW_SKILL_REC
      size = (data.size+1)/2*WLH
      self.contents.font.color = system_color
      self.contents.draw_text(x, y+size, 200, WLH, AYENE::ItemSpec::PARAM_NAMES[7].to_s, 0)   
      self.contents.font.color = normal_color
      skill.each_with_index{|id, i|     
        self.contents.draw_text(x+140, y+size+WLH*i, 200, WLH, "- #{$data_skills[id].name}", 0)       
      }
    end
  end
end

#===================================================================
# Window_EquipItem
#===================================================================
class Window_EquipItem < Window_Item
  def enable?(item)
    return @actor.equip_allowed?(item)
  end
end

#===================================================================
# Scene_Title
#===================================================================
class Scene_Title < Scene_Base
  alias aye_sctit_loaddata load_database
  def load_database
    aye_sctit_loaddata
    for group in [$data_weapons, $data_armors]
      for obj in group
        next if obj.nil?
        obj.item_spec_ini
      end
    end
  end
end

#===================================================================
# Scene_Equip
#===================================================================
class Scene_Equip < Scene_Base
  alias aye_itspec_sceq_update update
 
  def update       
    if @spec_window != nil
      update_spec_selection
    else
      aye_itspec_sceq_update
    end     
  end
 
  def update_item_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      @equip_window.active = true
      @item_window.active = false
      @item_window.index = -1
    elsif Input.trigger?(Input::C)   
      @item = @item_window.item
      if @item != nil and !@actor.equip_allowed?(@item)
        Sound.play_buzzer
        @item_window.active = false     
        show_spec_window           
      else     
        Sound.play_equip
        @actor.change_equip(@equip_window.index, @item_window.item)
        for i in 0..4
          item = @actor.equips[i]
          @actor.change_equip(i, nil) if !item.nil? && !@actor.equip_allowed?(item)
        end
        @equip_window.active = true
        @item_window.active = false
        @item_window.index = -1
        @equip_window.refresh
        for item_window in @item_windows
          item_window.refresh
        end
      end     
    end
  end
 
  def update_spec_selection
    @frame < 200 ? @frame += 1 : @frame = 0
    if @frame == 200 or Input.trigger?(Input::C) or Input.trigger?(Input::B)
      @spec_window.dispose
      @spec_window = nil     
      @item_window.active = true     
    end
  end
 
  def show_spec_window
    @frame = 0
    data = []
    @item.spec_params.each {|type, value|           
      data.push([type, value]) if value > 0 if type < 7   
    }
    data.sort!{|a,b| a[0] <=> b[0]}   
    skill = @item.spec_params[7]   
    @spec_window = Window_Equip_Help.new(@item, data, @actor, skill)       
  end
end

Dodatkowe informacje:

1. Wklej skrypt nad "Main" w Edytorze Skryptu.
2. Reszta instrukcji znajduje się w treści skryptu.