Войти на сайт
×
ТЕМА: Chest
Chest 15 года 1 мес. назад #28791
|
Скрипт: Chest
Вервия: 1.0 Автор : Sirius Хочу представить вам первый мой серьезный скрипт. Хотя сделать его было непросто, особенно для такого новичка в ргсс как я, но все же скрипт ничего существенного не добавляет. А добавляет он всего навсего систему сундуков. Да! Теперь в rmkVX можно создавать сундуки наподобие Невервинтера, Морровинда и т.д. Из сундука можно брать вещи, в сундук можно класть вещи, да и еще немного вкусностей. Каких? Ну например золото в сундуке будет браться все сразу, хоть его будет 300, хоть 500 монет. Или, к примеру, можно сделать условие, если в сундуке будет определенный предмет произойдет то-то и то-то... Скрин: Скрипт вставлять в чистый лист, выше Main. Скрипт: ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] #==========================================================================
# Скрипт СУНДУК Автор: Sirius (Светлый) aka Naruto (GDSA~ПВЫФ)
# Версия: 1.0
# Скрипт добавляет в игру хранилища предметов:
# сундуки, ящики, шкафы, NPC и т.д.
#--------------------------------------------------------------------------
# Другими словами, взаимодействие с сундуками происходит в двустороннем
# режиме. Как в BaldursGate, Neverwinter, Morrowind и т.п.
# Из сундука можно как брать предметы, так и класть в него.
# Добавленна возможность класть в сундук большие суммы золота.
# При выборе предмета вы перемещаете ОДИН предмет. А вот золото
# перемещается все сразу.
#--------------------------------------------------------------------------
# Для открытия сундука вставьте код ==> $scene=Scene_Chest.new(X,Y)
# Где X ID карты а У ID эвента Пример: $scene=Scene_Chest.new(10,36)
# где 10 ID карты а 36 ID эвента
#--------------------------------------------------------------------------
# Для добавления предметов в сундук используйте следующий код для каждого
# предмета : $chest[[X,Y,Z]]=[A,B,C] Где X ID карты, Y ID эвента, а Z
# номер этого предмета в сундуке. Далее, А это тип предмета 0 - Item,
# 1 - Weapon, 2 - Armor, B это ID предмета, и, наконец, С это количество
# этого предмета.
# Например, давайте создадим сундук с двумя предметами:
# $chest[[1,4,1]]=[0,1,10]
# $chest[[1,4,2]]=[1,8,1]
# $scene=Scene_Chest.new(1,4)
# Как вы уже догадались, мы создали сундук на карте с ID 1 и в Эвенте с ID 4
# первый предмет простой, с ID 1 в количестве 10 штук, второй это оружие
# с ID 8 в количестве одной штуки.
#--------------------------------------------------------------------------
# Теперь я расскажу про то, как создать золото:
# 1. Что делать необязательно:
# Создайте обычный предмет (Область действия: нет Доступность: никогда)
# Назовите его "Золото" и вставьте описание для золота.
# 2. Что делать обязательно:
# Внесите ID этого предмета в переменную $chest_gold Например:
# $chest_gold = [22,23]
# И количество монет укажите в заметках (Note)
# Данные=>База данных=>Вещи=>Заметки
#===========================================================================
$chest = {} #Это глобальная переменная Сундука
$ch_key = [ ] #массив для проверки на наличие ключевых предметов в сундуках.
$chest_gold = [ ] # Здесь указывайте ID предметов, являющихся золотом
class Scene_Chest < Scene_Base
#--------------------------------------------------------------------------
# * Object Initialization
# event :ID Эвента
# map_id:ID карты
#--------------------------------------------------------------------------
def initialize( map_id, event_id)
@event_id = event_id
@map_id = map_id
@k = 0
@n = 0
@temp = 0
@item = 0
@array = []
@val = nil
end
def start
super
create_menu_background
@help_window = Window_Help.new
@Window_Chest = Window_Chest.new(@event_id)
@Window_Actor = Window_Actor.new
@Window_Chest_cont = Window_Chest_cont.new(@map_id, @event_id)
@Window_Chest_cont.help_window = @help_window
@Window_Actors_cont = Window_Actors_cont.new
@Window_Chest_cont.active = true
@Window_Actors_cont.active = false
create_choise_window
hide_choise_window
end
#--------------------------------------------------------------------------
# * Return to Original Screen
#--------------------------------------------------------------------------
def return_scene
$scene = Scene_Map.new
end
#--------------------------------------------------------------------------
# * Termination Processing
#--------------------------------------------------------------------------
def terminate
super
dispose_menu_background
@help_window.dispose
@Window_Chest.dispose
@Window_Actor.dispose
@Window_Chest_cont.dispose
@Window_Actors_cont.dispose
@Window_choise.dispose
end
#--------------------------------------------------------------------------
# * Update Frame
#--------------------------------------------------------------------------
def update
super
update_menu_background
@help_window.update
@Window_Chest_cont.update
@Window_Actors_cont.update
@Window_choise.update
if @Window_Chest_cont.active
@Window_Chest_cont.help_window = @help_window
update_chest_item_selection
elsif @Window_Actors_cont.active
@Window_Actors_cont.help_window = @help_window
update_party_item_selection
elsif @Window_choise.active
update_choise_selection
end
end
#--------------------------------------------------------------------------
# * Update Chest Item Selection
#--------------------------------------------------------------------------
def update_chest_item_selection
if Input.trigger?(Input::B)
Sound.play_cancel
@Window_choise.visible = true
@Window_choise.active = true
@Window_Chest_cont.active = false
elsif Input.trigger?(Input::C)
@item = @Window_Chest_cont.item
chest_lose_item
end
end
#--------------------------------------------------------------------------
# * Update Party Item Selection
#--------------------------------------------------------------------------
def update_party_item_selection
if Input.trigger?(Input::B)
Sound.play_cancel
@Window_choise.visible = true
@Window_choise.active = true
@Window_Actors_cont.active = false
elsif Input.trigger?(Input::C)
@item = @Window_Actors_cont.item
chest_gain_item
end
end
#--------------------------------------------------------------------------
# * Создание окна выбора
#--------------------------------------------------------------------------
def create_choise_window
c1 = "Забрать"
c2 = "Положить"
@Window_choise = Window_choise.new([c1, c2])
@Window_choise.index = 0
end
#--------------------------------------------------------------------------
# * Update Choise Selection
#--------------------------------------------------------------------------
def update_choise_selection
if Input.trigger?(Input::B)
Sound.play_cancel
$scene = Scene_Map.new
elsif Input.trigger?(Input::C)
Sound.play_decision
case @Window_choise.index
when 0 # @Window_Chest_cont.active = true
@Window_Chest_cont.active = true
hide_choise_window
when 1 # @Window_Actors_cont.active = true
@Window_Actors_cont.active = true
hide_choise_window
end
end
end
#--------------------------------------------------------------------------
# * Hide Choise Window
#--------------------------------------------------------------------------
def hide_choise_window
@Window_choise.active = false
@Window_choise.visible = false
end
#--------------------------------------------------------------------------
# * Взятие предмета из сундука
#--------------------------------------------------------------------------
def chest_lose_item
# p $chest.values
# p $chest.keys
if @item != nil
$game_party.last_item_id = @item.id
$game_party.gain_item(@item, 1)
Sound.play_equip
for i in 0..$chest_items.size-1
if $chest_items[i] == @item
@n = i + 1
end
end
@k = [@map_id, @event_id, @n]
@temp = $chest[@k]
if @temp[2] <= 1
@array = []
$chest.delete(@k)
$chest.each_key{|key| if key[0]==@map_id and key[1]==@event_id and key[2] > @n then @array.push(key[2]) end}
for i in @array.sort
@key = [@map_id, @event_id, i]
@new_key = [@map_id, @event_id, i-1]
@value = $chest[@key]
$chest[@new_key] = @value
$chest.delete(@key)
end
else
@temp[2]-=1
$chest[@k] = @temp
end
@Window_Actors_cont.refresh
@Window_Chest_cont.refresh
end
end
#--------------------------------------------------------------------------
# * Перенос предмета в сундук
#--------------------------------------------------------------------------
def chest_gain_item
if @item != nil
$game_party.last_item_id = @item.id
$game_party.lose_item(@item, 1)
Sound.play_equip
@val = nil
for i in 0..$chest_items.size-1
if $chest_items[i] == @item
@temp_kv = [@map_id, @event_id, i+1]
@val = $chest[@temp_kv]
end
end
@array = []
if @val == nil
$chest.each_key{|key| if key[0]==@map_id and key[1]==@event_id then @array.push(key[2]) end}
unless @array.empty?
@temp = [@map_id, @event_id, @array.max+1]
else
@temp = [@map_id, @event_id, 1]
end
if $data_items.include?(@item)
@type = 0
elsif $data_weapons.include?(@item)
@type = 1
elsif $data_armors.include?(@item)
@type = 2
end
$chest[@temp] = [@type, @item.id, 1]
else
@val[2]+=1
$chest[@temp_kv] = @val
end
@Window_Actors_cont.refresh
@Window_Chest_cont.refresh
end
end
end
#----------------------------------------------------------------------
#**ОКНО С ИМЕНЕМ ЭВЕНТА
#----------------------------------------------------------------------
class Window_Chest < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
# event :ID Эвента
#--------------------------------------------------------------------------
def initialize (event)
@event =$game_map.events[event]
# @cn = @event.character_name
# @ci = @event.character_index
super(0, 56, 544, 56)
refresh
end
def refresh
# self.contents.clear
self.contents.draw_text(0, 0, 500, 24, @event.event_name, 1)
# draw_character(@cn, @ci, 100, 30)
end
end
#--------------------------------------------------------------------------
# * Содержание сундука
#--------------------------------------------------------------------------
class Window_Chest_cont < Window_Selectable
#--------------------------------------------------------------------------
# * Object Initialization
# x : window x-coordinate
# y : window y-coordinate
# width : window width
# height : window height
#--------------------------------------------------------------------------
def initialize( map_id, event_id)
@map_id = map_id # ID Карты
@event_id = event_id # ID Эвента
@chest_last_item_id = 0 # Номер последнего предмета
$chest_items =[]
super(0, 112, 544, 124)
@column_max = 2
self.index = 0
refresh
end
#--------------------------------------------------------------------------
# * Создание массива предметов
#--------------------------------------------------------------------------
def create_chest_item
$chest_items =[] # Массив предметов в сундуке
@numbers_hash ={} # Хэш количества предметов(Ключи сами предметы)
@chest_ietm_number = [] # Массив, последовательности предметов в сундуке
$chest.each_key {|k| if k[0]==@map_id && k[1]==@event_id then @chest_ietm_number.push(k[2]) end}
@m = @chest_ietm_number.max # @m максимальный номер предмета в сундуке (не ID!)
for i in @chest_ietm_number.sort
@t = [@map_id, @event_id, i]
@temp = $chest[@t] # @temp временная переменная
unless @temp == nil
case @temp.at(0)
when 0
$chest_items.push($data_items[@temp[1]])
@numbers_hash [$data_items[@temp[1]]] = @temp[2]
if i == @m
@chest_last_item_id = $data_items[@temp[1]].id
end
when 1
$chest_items.push($data_weapons[@temp[1]])
@numbers_hash [$data_weapons[@temp[1]]] = @temp[2]
if i == @m
@chest_last_item_id = $data_weapons[@temp[1]].id
end
when 2
$chest_items.push($data_armors[@temp[1]])
@numbers_hash [$data_armors[@temp[1]]] = @temp[2]
if i == @m
@chest_last_item_id = $data_armors[@temp[1]].id
end
end
end
end
end
#--------------------------------------------------------------------------
# * Get Item
#--------------------------------------------------------------------------
def item
return @data[self.index]
end
#--------------------------------------------------------------------------
# * Whether or not to include in item list
# item : item
#--------------------------------------------------------------------------
def include?(item)
return false if item == nil
return true
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
create_chest_item
@data = []
for item in $chest_items
next unless include?(item)
@data.push(item)
if item.is_a?(RPG::Item) and item.id == @chest_last_item_id
self.index = @data.size - 1
end
end
@data.push(nil) if include?(nil)
@item_max = @data.size
create_contents
for i in 0...@item_max
draw_item(i)
end
end
#--------------------------------------------------------------------------
# * Draw Item
# index : item number
#--------------------------------------------------------------------------
def draw_item(index)
rect = item_rect(index)
self.contents.clear_rect(rect)
item = @data[index]
if item != nil
number = @numbers_hash[item]
enabled = true
rect.width -= 4
draw_item_name(item, rect.x, rect.y, enabled)
if $chest_gold.include?(item.id)
self.contents.draw_text(rect, sprintf(":%2d", item.note.to_i), 2)
else
self.contents.draw_text(rect, sprintf(":%2d", number), 2)
end
end
end
#--------------------------------------------------------------------------
# * Update Help Text
#--------------------------------------------------------------------------
def update_help
@help_window.set_text(item == nil ? "" : item.description)
end
end
#----------------------------------------------------------------------
#**ОКНО С ИМЕНЕМ ПЕРВОГО ЧЛЕНА ГРУППЫ
#----------------------------------------------------------------------
class Window_Actor < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(0, 236, 544, 56)
@name= $game_party.members[0].name
# @actor = $game_player.main_actor.name
refresh
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
# self.contents.clear
# draw_actor_name(@actor, 4, 0)
self.contents.draw_text(0, 0, 500, 24, @name, 1)
end
end
#--------------------------------------------------------------------------
# * Содержание инвентаря
#--------------------------------------------------------------------------
class Window_Actors_cont < Window_Selectable
#--------------------------------------------------------------------------
# * Object Initialization
# x : window x-coordinate
# y : window y-coordinate
# width : window width
# height : window height
#--------------------------------------------------------------------------
def initialize
super(0, 292, 544, 124)
@column_max = 2
self.index = 0
refresh
end
#--------------------------------------------------------------------------
# * Get Item
#--------------------------------------------------------------------------
def item
return @data[self.index]
end
#--------------------------------------------------------------------------
# * Whether or not to include in item list
# item : item
#--------------------------------------------------------------------------
def include?(item)
return false if item == nil
if $game_temp.in_battle
return false unless item.is_a?(RPG::Item)
end
return true
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
@data = []
for item in $game_party.items
next unless include?(item)
@data.push(item)
if item.is_a?(RPG::Item) and item.id == $game_party.last_item_id
self.index = @data.size - 1
end
end
@data.push(nil) if include?(nil)
@item_max = @data.size
create_contents
for i in 0...@item_max
draw_item(i)
end
end
#--------------------------------------------------------------------------
# * Draw Item
# index : item number
#--------------------------------------------------------------------------
def draw_item(index)
rect = item_rect(index)
self.contents.clear_rect(rect)
item = @data[index]
if item != nil
number = $game_party.item_number(item)
enabled = true
rect.width -= 4
draw_item_name(item, rect.x, rect.y, enabled)
self.contents.draw_text(rect, sprintf(":%2d", number), 2)
end
end
#--------------------------------------------------------------------------
# * Update Help Text
#--------------------------------------------------------------------------
def update_help
@help_window.set_text(item == nil ? "" : item.description)
end
end
#--------------------------------------------------------------------------
# * Окно выбора
#--------------------------------------------------------------------------
class Window_choise < Window_Selectable
def initialize(commands, column_max = 1, row_max = 0, spacing = 32)
super(178,158, 200, 2 * WLH + 32, spacing)
@commands = commands
@item_max = 2
@column_max = 1
refresh
self.index = 0
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
for i in 0...@item_max
draw_item(i)
end
end
#--------------------------------------------------------------------------
# * Draw Item
# index : item number
# enabled : enabled flag. When false, draw semi-transparently.
#--------------------------------------------------------------------------
def draw_item(index, enabled = true)
rect = item_rect(index)
rect.x += 4
rect.width -= 8
self.contents.clear_rect(rect)
self.contents.font.color = normal_color
self.contents.font.color.alpha = enabled ? 255 : 128
self.contents.draw_text(rect, @commands[index],1)
end
end
#--------------------------------------------------------------------------
# Добавляет Метод Event_name
#--------------------------------------------------------------------------
class Game_Event < Game_Character
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :trigger # trigger
attr_reader :list # list of event commands
attr_reader :starting # starting flag
attr_reader :event_name # Имя эвента
#--------------------------------------------------------------------------
# * Object Initialization
# map_id : map ID
# event : event (RPG::Event)
#--------------------------------------------------------------------------
alias initialize_A initialize
def initialize(map_id, event)
super()
@map_id = map_id
@event = event
@id = @event.id
@erased = false
@starting = false
@through = true
moveto(@event.x, @event.y) # Move to initial position
refresh
@event_name = event.name # Event_name
end
end
#==============================================================================
# ** Game_Party
#------------------------------------------------------------------------------
# This class handles the party. It includes information on amount of gold
# and items. The instance of this class is referenced by $game_party.
#==============================================================================
class Game_Party < Game_Unit
#--------------------------------------------------------------------------
# * Gain Items (or lose)
# item : Item
# n : Number
# include_equip : Include equipped items
#--------------------------------------------------------------------------
alias gain_item_new gain_item
def gain_item(item, n, include_equip = false)
if $chest_gold.include?(item.id) # Если true то предмет является
$game_party.gain_gold(item.note.to_i) # золотом, и перечисляется
else # сразу в золото группы
number = item_number(item)
case item
when RPG::Item
@items[item.id] = [[number + n, 0].max, 99].min
when RPG::Weapon
@weapons[item.id] = [[number + n, 0].max, 99].min
when RPG::Armor
@armors[item.id] = [[number + n, 0].max, 99].min
end
n += number
if include_equip and n < 0
for actor in members
while n < 0 and actor.equips.include?(item)
actor.discard_equip(item)
n += 1
end
end
end
end
end
end
#==============================================================================
# ** Scene_File
#------------------------------------------------------------------------------
# Добавляем переменную $chest в методы сохранения и загрузки
# теперь при перезагрузке сундуки будут "помнить" что в них лежало
#==============================================================================
class Scene_File < Scene_Base
#--------------------------------------------------------------------------
# * Write Save Data
# file : write file object (opened)
#--------------------------------------------------------------------------
alias write_save_data_new write_save_data
def write_save_data(file)
characters = []
for actor in $game_party.members
characters.push([actor.character_name, actor.character_index])
end
$game_system.save_count += 1
$game_system.version_id = $data_system.version_id
@last_bgm = RPG::BGM::last
@last_bgs = RPG::BGS::last
Marshal.dump(characters, file)
Marshal.dump(Graphics.frame_count, file)
Marshal.dump(@last_bgm, file)
Marshal.dump(@last_bgs, file)
Marshal.dump($game_system, file)
Marshal.dump($game_message, file)
Marshal.dump($game_switches, file)
Marshal.dump($game_variables, file)
Marshal.dump($game_self_switches, file)
Marshal.dump($game_actors, file)
Marshal.dump($game_party, file)
Marshal.dump($game_troop, file)
Marshal.dump($game_map, file)
Marshal.dump($game_player, file)
Marshal.dump($chest, file)
end
#--------------------------------------------------------------------------
# * Read Save Data
# file : file object for reading (opened)
#--------------------------------------------------------------------------
alias read_save_data_new read_save_data
def read_save_data(file)
characters = Marshal.load(file)
Graphics.frame_count = Marshal.load(file)
@last_bgm = Marshal.load(file)
@last_bgs = Marshal.load(file)
$game_system = Marshal.load(file)
$game_message = Marshal.load(file)
$game_switches = Marshal.load(file)
$game_variables = Marshal.load(file)
$game_self_switches = Marshal.load(file)
$game_actors = Marshal.load(file)
$game_party = Marshal.load(file)
$game_troop = Marshal.load(file)
$game_map = Marshal.load(file)
$game_player = Marshal.load(file)
$chest = Marshal.load(file)
if $game_system.version_id != $data_system.version_id
$game_map.setup($game_map.map_id)
$game_player.center($game_player.x, $game_player.y)
end
end
end Немного о работе скрипта (Описание, в любом случае, есть в самом скрипте)Все данные о предметах и сундуках сохраняются в переменную $chest. Это хэш где ключем служит массив и значение тоже массив. И на последок выкладываю небольшую сценку-демку, демонстрирующую возможности скрипта.(Просьба к администрации,по возможности перенести демку на сайт, ибо не знаю сколько она на народе будет доступна...) ДЕМО В заключение скажу: Так как я новичек в ргсс, некоторые блоки кода могут иметь нерациональную структуру, возможно они решаются намного проще. Если так скажите мне об этом.
Вложения:
|
Последнее редактирование: 15 года 1 мес. назад от Sirius.
Администратор запретил публиковать записи гостям.
|
Chest 15 года 3 нед. назад #28933
|
# Для добавления предметов в сундук используйте следующий код для каждого Ох и суров же ты!# предмета : $chestX,Y,Z=[A,B,C] Где X ID карты, Y ID эвента, а Z # номер этого предмета в сундуке. Но, если опустить очень жуткую систему добавления предметов (и чуть менее жуткую систему вызова) - не плохо для первого скрипта. Да и выглядит весьма симпатично. Так держать! P.S. VX так и толкает на скриптописание, не правда ли? |
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто. В Ничто ты войди, во тьму, и пойми: Пока ты во тьме, не может она быть Ничем - ведь там ты.
Администратор запретил публиковать записи гостям.
|
Модераторы: NeKotZima
Время создания страницы: 0.291 секунд