Przerobienie Skryptu - Dragon - 13-08-13 18:42
Witam. Nie znam się na pisaniu skryptów więc zapytam was :) Czy jest ktoś kto podejmie się zadania przerobienia skryptu ? Jeśli tak, czytaj dalej. Chodzi tutaj o to by dodać do "Wymagań" jeszcze jedną małą rzecz :) chciałbym, aby to była zmienna.
Przykład :
zmienna \v[0001] == 1 - Jeśli spełnia to można (teraz uwaga ładne słowo) ekwipować dany przedmiot.
Pozdrawiam Dragon
Kod:
#===================================================================
# Wymagania broni i pancerza [VXAce]
# by Ayene
# 08.01.2012 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, MDEF, AGI, LUCK>,
# gdzie:
# LV - wymagany poziom postaci (level)
# ATK - atak (attack)
# DEF - obrona (defence)
# SPI - wola (spirit)
# MDEF - obrona magiczna (magical defence)
# AGI - zręczność/zwinność (agility)
# LUCK - szczęście (luck)
#
# Przykład:
# Jeśli chcesz, by postać mogła ekwipować broń na poziomie 6, dodatkowo
# pod warunkiem, że ma 40 ataku i 70 obrony, to w oknie 'Note' tej broni
# należy wpisać:
# <wymagania 6, 40, 70, 0, 0, 0, 0>
#
# Natomiast, gdy bohater ma mieć tylko odpowiednią zręczność:
# <wymagania 0, 0, 0, 0, 0, 50, 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."
ACC_TEXT = "Nie możesz jeszcze nosić tego przedmiotu."
end
end
module DataManager
#--------------------------------------------------------------------------
# alias method: load_database
#--------------------------------------------------------------------------
class << DataManager
alias aye_dataman_loaddata load_database
end
def self.load_database
aye_dataman_loaddata
for group in [$data_weapons, $data_armors]
for obj in group
next if obj.nil?
obj.item_spec_ini
end
end
end
end
#===================================================================
# RPG::BaseItem
#===================================================================
class RPG::EquipItem < RPG::BaseItem
attr_accessor :spec_params
def item_spec_ini
@spec_params = {}
(0..6).each{|i| @spec_params[i] = 0}
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
}
end
end
#===================================================================
# RPG::Weapon
#===================================================================
class RPG::Weapon < RPG::EquipItem
def spec_text
return AYENE::ItemSpec::WEAPON_TEXT
end
end
#===================================================================
# RPG::Armor
#===================================================================
class RPG::Armor < RPG::EquipItem
def spec_text
case etype_id
when 4
return AYENE::ItemSpec::ACC_TEXT
else
return AYENE::ItemSpec::ARMOR_TEXT
end
end
end
#===================================================================
# Scene_Equip
#===================================================================
class Scene_Equip < Scene_MenuBase
alias aye_itspec_sceq_start start
alias aye_itspec_sceq_ter terminate
alias aye_itspec_sceq_update update
def start
@frame = 0
@spec_window = Window_Help2.new(22,180,500)
@spec_window.deactivate
@spec_window.hide
aye_itspec_sceq_start
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 on_item_ok
item = @item_window.item
if item != nil and !@actor.equip_allowed?(item)
Sound.play_buzzer
@spec_window.set_text(item.spec_text)
@spec_window.show
@spec_window.activate
@item_window.deactivate
else
Sound.play_equip
@actor.change_equip(@slot_window.index, item)
@slot_window.activate
@slot_window.refresh
@item_window.unselect
@item_window.refresh
end
end
def update_spec_selection
@frame < 50 ? @frame += 1 : @frame = 0
if @frame == 50
@spec_window.hide
@item_window.activate
@spec_window.deactivate
end
end
end
#===================================================================
# Game_Actor
#===================================================================
class Game_Actor < Game_Battler
def optimize_equipments
clear_equipments
equip_slots.size.times do |i|
next if !equip_change_ok?(i)
items = $game_party.equip_items.select do |item|
item.etype_id == equip_slots[i] &&
equippable?(item) && item.performance >= 0 &&
equip_allowed?(item)
end
change_equip(i, items.max_by {|item| item.performance})
end
end
def equip_allowed?(item)
return true if (item.spec_params[0] <= level && item.spec_params[1] <= param(2) &&
item.spec_params[2] <= param(3) && item.spec_params[3] <= param(4) &&
item.spec_params[4] <= param(5) && item.spec_params[5] <= param(6) &&
item.spec_params[6] <= param(7))
return false
end
end
#===================================================================
# Window_Help
#===================================================================
class Window_Help2 < Window_Help
def initialize(x, y, width)
super(1)
self.x = x
self.y = y
self.z = 1000
self.width = width
create_contents
end
def set_text(text)
if text != @text
draw_text(0, 0, contents_width, contents_height, text, 1)
@text = text
end
end
end
#===================================================================
# Game_Interpreter
#===================================================================
class Game_Interpreter
def check_change_equip(actor)
actor.equips.each_with_index do |item, 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_var(@params[0], @params[1]) do |actor|
check_change_equip(actor)
end
end
alias aye_command_316 command_316
def command_316
aye_command_316
iterate_actor_var(@params[0], @params[1]) do |actor|
check_change_equip(actor)
end
end
alias aye_command_317 command_317
def command_317
aye_command_317
iterate_actor_var(@params[0], @params[1]) do |actor|
check_change_equip(actor)
end
end
end
RE: Przerobienie Skryptu - Ayene - 13-08-13 19:14
Nie za bardzo rozumiem. Ekwipować jaki przedmiot? W jaki sposób chcesz przypisać zmienną do przedmiotu? Czy miałaby być dodatkowym warunkiem, czy wyłącznym? Innymi słowy, czy gdy zmienna będzie wynosić 1, to od razu przedmiot można założyć?
RE: Przerobienie Skryptu - Dragon - 13-08-13 19:21
Tak dokładnie ma być to dodatkowy warunek. Zmienna będzie zmieniać swoją wartość więc dobrze by było gdyby warunek przyjmował równe lub większe
RE: Przerobienie Skryptu - Ayene - 13-08-13 20:39
Więc znajdź fragment:
Kod:
return true if (item.spec_params[0] <= level && item.spec_params[1] <= param(2) &&
item.spec_params[2] <= param(3) && item.spec_params[3] <= param(4) &&
item.spec_params[4] <= param(5) && item.spec_params[5] <= param(6) &&
item.spec_params[6] <= param(7))
i zamień go na:
Kod:
return true if (item.spec_params[0] <= level && item.spec_params[1] <= param(2) &&
item.spec_params[2] <= param(3) && item.spec_params[3] <= param(4) &&
item.spec_params[4] <= param(5) && item.spec_params[5] <= param(6) &&
item.spec_params[6] <= param(7) && $game_variables[1] >= 1)
RE: Przerobienie Skryptu - Dragon - 14-08-13 08:00
Ok, a jak teraz zdefiniować warunek w przedmiocie ? Jakiś Note ?
RE: Przerobienie Skryptu - Ayene - 14-08-13 10:30
No to właśnie o to pytałam wcześniej. Wyjaśnij dokładnie, co chcesz zrobić z tą zmienną. Po co Ci notatki, co chcesz w nich deklarować?
RE: Przerobienie Skryptu - Dragon - 14-08-13 11:01
Droga koleżanko :) Skrypt polega na tym, że dodaje nam do gry wymagania ekwipowania broni i pancerza, z przedmiotami (item) to nie działa. Definiuje się wszystko w Note przy broni,lub pancerzu :
# Przykład:
# Jeśli chcesz, by postać mogła ekwipować broń na poziomie 6, dodatkowo
# pod warunkiem, że ma 40 ataku i 70 obrony, to w oknie 'Note' tej broni
# należy wpisać:
# <wymagania 6, 40, 70, 0, 0, 0, 0>
Ja chce by do tych wymagań dodać zmienną, którą również będzie się uwzględniać w note danej broni lub zbroi :) Podchodzimy do NPC on daje nam przedmiot, którego nie możemy ekwpować. Przedmiot ten ma zapisane w Note coś takiego :
<wymagania 1, 0, 0, 0, 0, 0, 0, 1> Gdzie ostatnia cyfra to wartośc zmiennej \v[XXXX]
Po wykonaniu zadania zmienna \v[XXXX] zmienia wartość na 1 i wtedy możemy nosić Broń
Mam nadzieję, że teraz zrozumiałaś :)
RE: Przerobienie Skryptu - Ayene - 14-08-13 11:33
Działanie skryptu rozumiem, bo sama jestem jego autorką
Ale teraz sposób konfigurowania, jaki chciałeś mieć, wyjaśniłeś, więc przeróbka będzie prosta.
Zamień cały skrypt na poniższy:
Kod:
#===================================================================
# Wymagania broni i pancerza [VXAce]
# by Ayene
# 08.01.2012 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, MDEF, AGI, LUCK, VAR>,
# gdzie:
# LV - wymagany poziom postaci (level)
# ATK - atak (attack)
# DEF - obrona (defence)
# SPI - wola (spirit)
# MDEF - obrona magiczna (magical defence)
# AGI - zręczność/zwinność (agility)
# LUCK - szczęście (luck)
# VAR - zmienna (variable)
#
# Przykład:
# Jeśli chcesz, by postać mogła ekwipować broń na poziomie 6, dodatkowo
# pod warunkiem, że ma 40 ataku i 70 obrony oraz że zmienna 1 jest większa od 1
# to w oknie 'Note' tej broni należy wpisać:
# <wymagania 6, 40, 70, 0, 0, 0, 0, 1>
#
# Natomiast, gdy bohater ma mieć tylko odpowiednią zręczność:
# <wymagania 0, 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+), \s*(\d+)>/i
WEAPON_TEXT = "Nie potrafisz jeszcze korzystać z tej broni."
ARMOR_TEXT = "Nie potrafisz jeszcze nosić tego pancerza."
ACC_TEXT = "Nie możesz jeszcze nosić tego przedmiotu."
end
end
module DataManager
#--------------------------------------------------------------------------
# alias method: load_database
#--------------------------------------------------------------------------
class << DataManager
alias aye_dataman_loaddata load_database
end
def self.load_database
aye_dataman_loaddata
for group in [$data_weapons, $data_armors]
for obj in group
next if obj.nil?
obj.item_spec_ini
end
end
end
end
#===================================================================
# RPG::BaseItem
#===================================================================
class RPG::EquipItem < RPG::BaseItem
attr_accessor :spec_params
def item_spec_ini
@spec_params = {}
(0..7).each{|i| @spec_params[i] = 0}
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
@spec_params[7] = $8.to_i
end
}
end
end
#===================================================================
# RPG::Weapon
#===================================================================
class RPG::Weapon < RPG::EquipItem
def spec_text
return AYENE::ItemSpec::WEAPON_TEXT
end
end
#===================================================================
# RPG::Armor
#===================================================================
class RPG::Armor < RPG::EquipItem
def spec_text
case etype_id
when 4
return AYENE::ItemSpec::ACC_TEXT
else
return AYENE::ItemSpec::ARMOR_TEXT
end
end
end
#===================================================================
# Scene_Equip
#===================================================================
class Scene_Equip < Scene_MenuBase
alias aye_itspec_sceq_start start
alias aye_itspec_sceq_ter terminate
alias aye_itspec_sceq_update update
def start
@frame = 0
@spec_window = Window_Help2.new(22,180,500)
@spec_window.deactivate
@spec_window.hide
aye_itspec_sceq_start
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 on_item_ok
item = @item_window.item
if item != nil and !@actor.equip_allowed?(item)
Sound.play_buzzer
@spec_window.set_text(item.spec_text)
@spec_window.show
@spec_window.activate
@item_window.deactivate
else
Sound.play_equip
@actor.change_equip(@slot_window.index, item)
@slot_window.activate
@slot_window.refresh
@item_window.unselect
@item_window.refresh
end
end
def update_spec_selection
@frame < 50 ? @frame += 1 : @frame = 0
if @frame == 50
@spec_window.hide
@item_window.activate
@spec_window.deactivate
end
end
end
#===================================================================
# Game_Actor
#===================================================================
class Game_Actor < Game_Battler
def optimize_equipments
clear_equipments
equip_slots.size.times do |i|
next if !equip_change_ok?(i)
items = $game_party.equip_items.select do |item|
item.etype_id == equip_slots[i] &&
equippable?(item) && item.performance >= 0 &&
equip_allowed?(item)
end
change_equip(i, items.max_by {|item| item.performance})
end
end
def equip_allowed?(item)
return true if (item.spec_params[0] <= level && item.spec_params[1] <= param(2) &&
item.spec_params[2] <= param(3) && item.spec_params[3] <= param(4) &&
item.spec_params[4] <= param(5) && item.spec_params[5] <= param(6) &&
item.spec_params[6] <= param(7) && (item.spec_params[7] == 0 or $game_variables[item.spec_params[7]] >= 1))
return false
end
end
#===================================================================
# Window_Help
#===================================================================
class Window_Help2 < Window_Help
def initialize(x, y, width)
super(1)
self.x = x
self.y = y
self.z = 1000
self.width = width
create_contents
end
def set_text(text)
if text != @text
contents.clear
draw_text(0, 0, contents_width, contents_height, text, 1)
@text = text
end
end
end
#===================================================================
# Game_Interpreter
#===================================================================
class Game_Interpreter
def check_change_equip(actor)
actor.equips.each_with_index do |item, 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_var(@params[0], @params[1]) do |actor|
check_change_equip(actor)
end
end
alias aye_command_316 command_316
def command_316
aye_command_316
iterate_actor_var(@params[0], @params[1]) do |actor|
check_change_equip(actor)
end
end
alias aye_command_317 command_317
def command_317
aye_command_317
iterate_actor_var(@params[0], @params[1]) do |actor|
check_change_equip(actor)
end
end
end
RE: Przerobienie Skryptu - Dragon - 14-08-13 12:34
Dziękuję :* idę się bawić w RPG Maker :) Dziękuję koleżanko.
|