UltimaForum

Skrypty [VX] - Wymagania broni i pancerza VX

Ayene - Czw 27 Sty, 2011 10:43
Temat postu: Wymagania broni i pancerza VX
~ Wymagania broni i pancerza 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.

04.03.2012 r.
Dodano opcję, dzięki której można wprowadzić wymóg posiadania odpowiedniej umiejętności.

Zalecane dokładne testy.

Autor skryptu
Ayene [yurika@o2.pl]

Kompatybilność
Tylko VX

Skrypt
Spoiler:

Kod:
#===================================================================
# 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


Demo
niepotrzebne

Screenshot
Spoiler:


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

Piszcie w razie problemów.

MrBoomGood - Pon 02 Maj, 2011 22:16

Super skrypt! Tego szukałem, i w końcu znalazłem! Wielki dzięki, jesteś wielka!!!
pokecath - Wto 03 Maj, 2011 11:00

Wielkie dzięki! :mrgreen:
Tony - Sro 18 Maj, 2011 18:32

Dobre
DeathFuj - Pią 09 Wrz, 2011 17:01
Temat postu: Działa
Działa wszysztko jest ;)[/scroll]
Narfann - Pon 24 Paź, 2011 19:23

Wszystko jest ok, ale jest mały problemik, jeśli np. nasz gracz ma zręczność 51 ( a wymagania są 50) po czym po przez zdarzenie zmienimy jego zręczność na 49 to broń nadal jest zdolna do użytku...
Ayene - Sro 26 Paź, 2011 12:11

Skrypt jedynie blokuje ekwipowanie. W przypadku, który opisujesz wystarczy sprawdzić, czy gracz spełnia wymagania i ewentualnie ściągnąć mu ekwipunek. Dodaj na końcu skryptu ten fragment:
Spoiler:

Kod:
#===================================================================
# Game_Interpreter
#===================================================================
class Game_Interpreter 
  def check_change_equip(actor)
    for equip in actor.equips
      unless equip.nil?
        if equip.spec_level > actor.level or
          equip.spec_atk > actor.atk or equip.spec_def > actor.def or
          equip.spec_spi > actor.spi or equip.spec_agi > actor.agi
          case equip
          when RPG::Weapon
            actor.change_equip(0, nil)
          when RPG::Armor
            actor.change_equip(equip.kind+1, nil)             
          end             
        end     
      end 
    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
    actor = $game_actors[@params[0]]
    if actor != nil
      check_change_equip(actor) 
    end   
  end
end


Zalecane testy. Nie wiem, czy przewidziałam wszelkie zmiany parametrów. Pozdrawiam.

AvenCrazy - Pią 28 Paź, 2011 15:53

Świetny skrypt, ale dodałbym taki bajer, że od razu pokazuje, jakie statystyki są wymagane do itemka. ;-)
Ayene - Pią 28 Paź, 2011 17:37

A jakieś sugestie, gdzie miałoby się coś takiego wyświetlać? :aww:
tracersgta - Pią 28 Paź, 2011 17:40

@AvenCrazy Możesz to po prostu napisać w opisie przedmiotu... Np. Długi żelazny miecz. Wymaga 20 siły i 10 zwinności. ;-)
AvenCrazy - Pią 28 Paź, 2011 23:26

Ayene, wraz z komunikatem, który się wyświetla, mogłoby to wygląda w ten sposób - "Nie potrafisz jeszcze korzystać z tej broni, brakuje ci x siły i y zręczności". Coś w ten deseń ;)

tracersgta, fakt, pomyślałem o tym, ale zdaje mi się, że im dłuższy jest opis, tym jest mniej estetyczny.

doa1996 - Pią 25 Lis, 2011 11:12

Fajny skrypt :D Działa mi w 100%
przemusiek25 - Nie 05 Lut, 2012 14:29

a można by tak dodać do skryptu ograniczenie względem Max HP i Max MP?
przemusiek25 - Wto 07 Lut, 2012 10:05

Jako iż nie pomogłaś mi Ayene, wykorzystałem swoją początkową wiedzę z tworzenia skryptów. I sam dodałem sobie wymagania.
Chyba nie masz nic przeciwko, dla zainteresowanych skrypt:
Spoiler:

Kod:
#===================================================================
# Wymagania broni i pancerza [VX]
# by Ayene
# Dodatkowo wymagania HP i MP by Przemusiek25
# 27.01.2010 ver 1.0
# 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.
#
# Instrukcja:
# By skorzystać ze skryptu w oknie 'Note' przy danym elemencie ekwipunku
# w Bazie Danych umieść tekst <wymagania LV, ATK, DEF, SPI, AGI, MAXHP, MAXMP>,
# gdzie:
# LV - wymagany poziom postaci
# ATK - atak (attack)
# DEF - obrona (defence)
# SPI - wola (spirit)
# AGI - zręczność/zwinność (agility)
# MAXHP - maksymalne HP (max. HP)
# MAXMP - maksymalne MP (max. MP)
#
# Przykładowo:
# Jeśli chcesz, by postać mogła ekwipować broń na poziomie 6, dodatkowo
# pod warunkiem, że ma 40 ataku i 70 obrony, oraz 60 Maksymalnego HP
# to w oknie 'Note' tej broni należy wpisać:
# <wymagania 6, 40, 70, 0, 0, 60, 0>
#
# Natomiast, gdy bohater ma mieć tylko odpowiednią zręczność:
# <wymagania 0, 0, 0, 0, 50, 0, 0>
#===================================================================
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 = "Nie potrafisz jeszcze korzystać z tej broni."
    ARMOR_TEXT = "Nie potrafisz jeszcze nosić tego pancerza."     
  end
end

#===================================================================
# RPG::BaseItem
#===================================================================
class RPG::BaseItem
  def item_spec_ini
    @spec_level = 0
    @spec_atk = 0
    @spec_def = 0
    @spec_spi = 0
    @spec_agi = 0
    @spec_maxhp = 0
    @spec_maxmp = 0
    self.note.split(/[\r\n]+/).each { |line|
      case line
      when AYENE::ItemSpec::ITEM_SPEC       
        @spec_level = $1.to_i
        @spec_atk = $2.to_i
        @spec_def = $3.to_i
        @spec_spi = $4.to_i
        @spec_agi = $5.to_i
        @spec_maxhp = $6.to_i
        @spec_maxmp = $7.to_i
      end
    }
  end   
  def spec_level
    item_spec_ini if @spec_level == nil
    return @spec_level
  end 
  def spec_atk
    item_spec_ini if @spec_atk == nil
    return @spec_atk
  end
  def spec_def
    item_spec_ini if @spec_def == nil
    return @spec_def
  end
  def spec_spi
    item_spec_ini if @spec_spi == nil
    return @spec_spi
  end
  def spec_agi
    item_spec_ini if @spec_agi == nil
    return @spec_agi
  end
  def spec_maxhp
    item_spec_ini if @spec_maxhp == nil
    return @spec_maxhp
  end
  def spec_maxmp
    item_spec_ini if @spec_maxmp == nil
    return @spec_maxmp
  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
    return AYENE::ItemSpec::ARMOR_TEXT
  end
end

#===================================================================
# Scene_Equip
#===================================================================
class Scene_Equip < Scene_Base
  alias aye_itspec_sceq_start start
  alias aye_itspec_sceq_ter terminate
  alias aye_itspec_sceq_update update
 
  def start
    aye_itspec_sceq_start
    @frame = 0   
    @spec_window = Window_Help.new(22,180,500) 
    @spec_window.active = false
    @spec_window.visible = false
  end
 
  def terminate
    aye_itspec_sceq_ter
    @spec_window.dispose
  end
 
  def update     
    @spec_window.update
    if @spec_window.active
      update_spec_selection   
    end   
    aye_itspec_sceq_update
  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 !(@item.spec_level <= @actor.level and
        @item.spec_atk <= @actor.atk and @item.spec_def <= @actor.def and
        @item.spec_spi <= @actor.spi and @item.spec_agi <= @actor.agi and
        @item.spec_maxhp <= @actor.maxhp and @item.spec_maxmp <= @actor.maxmp)
        Sound.play_buzzer               
        @spec_window.set_text(@item.spec_text, 1)
        @spec_window.visible = true
        @spec_window.active = true       
        @item_window.active = false       
      else     
        Sound.play_equip
        @actor.change_equip(@equip_window.index, @item_window.item)
        @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 < 50 ? @frame += 1 : @frame = 0
    if @frame == 50
      @spec_window.visible = false
      @item_window.active = true
      @spec_window.active = false     
    end
  end
end

#===================================================================
# Window_Help
#===================================================================
class Window_Help < Window_Base
  def initialize(x=0, y=0, w=544, h=WLH + 32)
    super(x, y, w, h)
  end
end



[ Komentarz dodany przez: Ayene: Wto 07 Lut, 2012 10:52 ]
Brawa :klaszcze:

Weeto - Sob 03 Mar, 2012 11:03

Dało by się zmienić ten skrypt tak aby nałożyć broń trzeba mieć odpowiednie umiejętności
np. Długi żelazny miecz : wymagania Broń dwuręczna II ?

Ayene - Nie 04 Mar, 2012 20:10

Aktualizacja skryptu! Dodano m.in. opcję, dzięki której można wprowadzić wymóg posiadania odpowiedniej umiejętności.
Weeto - Pon 05 Mar, 2012 20:46

Bardzo ci dziękuje. Prosiłem o to bo wydawało mi się głupie by np. mieć krotki miecz który dodaje załóżmy 30 ataku (czyli siły ) wymagane jest 20 siły.
kolkav5 - Czw 21 Cze, 2012 11:04

Pomocne.
Praktyczne.
Łatwe.
Przydatne ITP.
Bardzo fajny!
:shock: :shock:


Powered by phpBB modified by Przemo © 2003 phpBB Group