-
caveman
-
-
Вне сайта
-
Архитектор Миров
-
- Сообщений: 1274
- Спасибо получено: 1307
-
-
|
Два скрипта, приведенные ниже, позволят добавить окна детального просмотра оружия, брони и скиллов игры, из меню, из списков, соответственно, оружия, брони и скиллов.
Выглядит это как-то так:
Отличие окна скиллов в информации и того, что вместо картинки (которые в первом случае должны быть в папке Graphics\Items\ и называться типа a10.png - для брони; w3.png - для оружия), на том же месте показывается анимация скилла.
Описание прописывается в Notes оружия/брони/скилла.
Собственно, скрипты:
1) Оружие и броня
#----------------------------------------------------------------------------
# * [ACE] ItemInfo Window
#----------------------------------------------------------------------------
# * Автор - caveman
# * Специально для http://rpg-maker.info
# * Версия: 1.1 RU
# * Релиз: 31/12/2013
#
# * Описание:
# * Окно подробного описания предмета
# *
# * Изменения:
# * Версия 1.1 - необязательность картинки; фикс размеров от разрешения;
# * расположение инфы, теги # Инфо <iinfo> # Дроп <idrop>, # Требуется уровень <ilvl>
#----------------------------------------------------------------------------
#----------------------------------------------------------------------------
# Настройки цветов
#----------------------------------------------------------------------------
module ItemInfo
ITEM_NAME_COLOR = Color.new(152,204,255)
ITEM_DESCR_COLOR = Color.new(255,255,255)
IMG_BORDER_COLOR = Color.new(255,255,255)
STAT_NAME_COLOR = Color.new(255,255,255)
STAT_VALUE_PLUS_COLOR = Color.new(152,204,255)
STAT_VALUE_MINUS_COLOR = Color.new(255,70,60)
RGX_INFO = /<iinfo>(.*?)<\/iinfo>/im
RGX_DROP = /<idrop>(.*?)<\/idrop>/im
RGX_LVL = /<ilvl>(.*?)<\/ilvl>/im
end
class Window_ItemInfo < Window_Base
def initialize()
pad = standard_padding
@window_rect = Rect.new(0,0,Graphics.width,Graphics.height)
@img_rect = Rect.new(32, 32, 96, 96)
@name_rect = Rect.new(0, 0, Graphics.width, 32)
@state_rect = Rect.new(160, 32, 352, 192)
@desc_rect = Rect.new(16, 224,
Graphics.width - 32 - pad*2, Graphics.height - 240 - pad)
super(@window_rect.x, @window_rect.y, @window_rect.width, @window_rect.height)
self.opacity = 256
self.contents_opacity = 256
self.visible = false
self.active = false
@item = nil
@handler = {}
refresh
end
def dispose
end
def refresh
contents.clear
draw_img
draw_name
draw_stats
draw_descr
end
def draw_img
if @item != nil
prefix = @item.is_a?(RPG::Weapon) ? "w" : "a"
filename = sprintf("Graphics/Items/%s%d", prefix, @item.id)
if FileTest.exist?(sprintf("%s.png", filename))
bmp = Cache.load_bitmap("Graphics/Items/", sprintf("%s%d", prefix, @item.id))
else
bmp = Bitmap.new(96,96)
iconset = Cache.system("Iconset")
rect = Rect.new(@item.icon_index % 16 * 24, @item.icon_index / 16 * 24, 24, 24)
bmp.stretch_blt(Rect.new(24,24,48,48), iconset, rect)
end
#clr = ItemInfo::IMG_BORDER_COLOR
#contents.fill_rect(@img_rect.x, @img_rect.y, 2, @img_rect.height, clr)
#contents.fill_rect(@img_rect.x, @img_rect.y, @img_rect.width, 2, clr)
#contents.fill_rect(@img_rect.x + @img_rect.width - 2, @img_rect.y,
# 2, @img_rect.height, clr)
#contents.fill_rect(@img_rect.x, @img_rect.y + @img_rect.height - 2,
# @img_rect.width, 2, clr)
contents.blt(@img_rect.x, @img_rect.y, bmp, bmp.rect)
end
end
def draw_name
if @item != nil
contents.font.size = 32
contents.font.color = ItemInfo::ITEM_NAME_COLOR
contents.draw_text(@name_rect, @item.name, 1)
end
end
def draw_stats
if @item != nil
contents.font.size = 24
cur_y = @state_rect.y
for i in 0..7
cur_x = i % 2 == 0 ? @state_rect.x : @state_rect.x + @state_rect.width/2
contents.font.color = ItemInfo::STAT_NAME_COLOR
text = $data_system.terms.params[i] + ":"
contents.draw_text(cur_x, cur_y, contents.text_size(text).width + 4,
28, text)
cur_x += contents.text_size(text).width + 4
if @item.params[i] >= 0
text = "+"
contents.font.color = ItemInfo::STAT_VALUE_PLUS_COLOR
elsif
text = ""
contents.font.color = ItemInfo::STAT_VALUE_MINUS_COLOR
end
text += @item.params[i].to_s
contents.draw_text(cur_x, cur_y, contents.text_size(text).width + 4,
28, text)
cur_y += 28 if i % 2 == 1
end
addon_stats(cur_y)
end
end
def addon_stats(cur_y)
end
def draw_descr
contents.fill_rect(@desc_rect.x, @desc_rect.y, @desc_rect.width, 2,
text_color(7))
if @item != nil
contents.font.color = ItemInfo::ITEM_DESCR_COLOR
results = @item.note.scan(ItemInfo::RGX_INFO)
results.each do |res|
draw_text_ex(@desc_rect.x, @desc_rect.y + 4, res[0].to_s)
end
end
end
def process_character(c, text, pos)
case c
when "\n" # New line
process_new_line(text, pos)
when "\f" # New page
process_new_page(text, pos)
when "\e" # Control character
process_escape_character(obtain_escape_code(text), text, pos)
when " " # Space
txt = text.dup
word = txt.slice(/\A(.+?)\s|\z/)
text_width = text_size(word).width + 4
if text_width + pos[:x] > Graphics.width - 2 * standard_padding - 16
process_new_line(text, pos)
else
process_normal_character(c, pos)
end
else # Normal character
process_normal_character(c, pos)
end
end
def set_item(item)
@item = item
refresh
end
def update
if self.active
super
return process_cancel if Input.trigger?(:B)
end
end
def process_cancel
Sound.play_cancel
Input.update
deactivate
@handler[:cancel].call
end
def set_handler(symbol, method)
@handler[symbol] = method
end
end
class Scene_Item
alias iteminfo_start start
def start
@iteminfo_window = Window_ItemInfo.new
@iteminfo_window.set_handler(:cancel, method(:on_iteminfo_cancel))
iteminfo_start
end
def on_iteminfo_cancel
hide_sub_window(@iteminfo_window)
end
def determine_item
if item.is_a?(RPG::Weapon) || item.is_a?(RPG::Armor)
@iteminfo_window.set_item(item)
show_sub_window(@iteminfo_window)
return
end
if item.for_friend?
show_sub_window(@actor_window)
@actor_window.select_for_item(item)
else
use_item
activate_item_window
end
end
end
class Window_ItemList
def enable?(item)
item.is_a?(RPG::Weapon) || item.is_a?(RPG::Armor) || $game_party.usable?(item)
end
end
# addon
class Window_ItemInfo
def addon_stats(cur_y)
cur_x = @state_rect.x
results = @item.note.scan(ItemInfo::RGX_DROP)
results.each do |res|
text = "Дроп:"
contents.font.color = ItemInfo::STAT_NAME_COLOR
contents.draw_text(cur_x, cur_y, contents.text_size(text).width + 4, 28, text)
contents.font.color = ItemInfo::STAT_VALUE_PLUS_COLOR
cur_x += contents.text_size(text).width + 4
contents.draw_text(cur_x, cur_y, contents.text_size(res[0].to_s).width + 4,
28, res[0].to_s)
end
cur_x = @state_rect.x + @state_rect.width/2
results = @item.note.scan(ItemInfo::RGX_LVL)
results.each do |res|
text = "Треб. ур:"
contents.font.color = ItemInfo::STAT_NAME_COLOR
contents.draw_text(cur_x, cur_y, contents.text_size(text).width + 4, 28, text)
contents.font.color = ItemInfo::STAT_VALUE_PLUS_COLOR
cur_x += contents.text_size(text).width + 4
contents.draw_text(cur_x, cur_y, contents.text_size(res[0].to_s).width + 4,
28, res[0].to_s)
end
end
end
2) Скиллы
#----------------------------------------------------------------------------
# * [ACE] SkillInfo Window
#----------------------------------------------------------------------------
# * Автор - caveman
# * Специально для http://rpg-maker.info
# * Версия: 1.0 RU
# * Релиз: 31/12/2013
#
# * Описание:
# * Окно подробного описания скилла
# *
#----------------------------------------------------------------------------
module SkillInfo
SKILL_NAME_COLOR = Color.new(152,204,255)
SKILL_DESCR_COLOR = Color.new(255,255,255)
STAT_NAME_COLOR = Color.new(255,255,255)
STAT_VALUE_COLOR = Color.new(152,204,255)
CRITICAL_COLOR = Color.new(255,10,10)
RGX_INFO = /<iinfo>(.*?)<\/iinfo>/im
end
#==============================================================================
# ** Sprite_Base
#------------------------------------------------------------------------------
# A sprite class with animation display processing added.
#==============================================================================
class Sprite_Skill < Sprite
#--------------------------------------------------------------------------
# * Class Variable
#--------------------------------------------------------------------------
@@ani_checker = []
@@ani_spr_checker = []
@@_reference_count = {}
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize(rect, viewport = nil)
super(viewport)
@use_sprite = true # Sprite use flag
@ani_duration = 0 # Remaining time of animation
@rect = rect # rectangle of anim
end
#--------------------------------------------------------------------------
# * Free
#--------------------------------------------------------------------------
def dispose
super
dispose_animation
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
update_animation
@@ani_checker.clear
@@ani_spr_checker.clear
end
#--------------------------------------------------------------------------
# * Determine if animation is being displayed
#--------------------------------------------------------------------------
def animation?
@animation != nil
end
#--------------------------------------------------------------------------
# * Start Animation
#--------------------------------------------------------------------------
def start_animation(animation, mirror = false)
dispose_animation
@animation = animation
if @animation
@ani_mirror = mirror
set_animation_rate
@ani_duration = @animation.frame_max * @ani_rate + 1
load_animation_bitmap
make_animation_sprites
set_animation_origin
end
end
#--------------------------------------------------------------------------
# * Set Animation Speed
#--------------------------------------------------------------------------
def set_animation_rate
@ani_rate = 4 # Fixed value by default
end
#--------------------------------------------------------------------------
# * Read (Load) Animation Graphics
#--------------------------------------------------------------------------
def load_animation_bitmap
animation1_name = @animation.animation1_name
animation1_hue = @animation.animation1_hue
animation2_name = @animation.animation2_name
animation2_hue = @animation.animation2_hue
@ani_bitmap1 = Cache.animation(animation1_name, animation1_hue)
@ani_bitmap2 = Cache.animation(animation2_name, animation2_hue)
if @@_reference_count.include?(@ani_bitmap1)
@@_reference_count[@ani_bitmap1] += 1
else
@@_reference_count[@ani_bitmap1] = 1
end
if @@_reference_count.include?(@ani_bitmap2)
@@_reference_count[@ani_bitmap2] += 1
else
@@_reference_count[@ani_bitmap2] = 1
end
Graphics.frame_reset
end
#--------------------------------------------------------------------------
# * Create Animation Sprites
#--------------------------------------------------------------------------
def make_animation_sprites
@ani_sprites = []
if @use_sprite && !@@ani_spr_checker.include?(@animation)
16.times do
sprite = ::Sprite.new(viewport)
sprite.visible = false
@ani_sprites.push(sprite)
end
if @animation.position == 3
@@ani_spr_checker.push(@animation)
end
end
@ani_duplicated = @@ani_checker.include?(@animation)
if !@ani_duplicated && @animation.position == 3
@@ani_checker.push(@animation)
end
end
#--------------------------------------------------------------------------
# * Set Animation Origin
#--------------------------------------------------------------------------
def set_animation_origin
@ani_ox = @rect.x
@ani_oy = @rect.y
end
#--------------------------------------------------------------------------
# * Free Animation
#--------------------------------------------------------------------------
def dispose_animation
if @ani_bitmap1
@@_reference_count[@ani_bitmap1] -= 1
if @@_reference_count[@ani_bitmap1] == 0
@ani_bitmap1.dispose
end
end
if @ani_bitmap2
@@_reference_count[@ani_bitmap2] -= 1
if @@_reference_count[@ani_bitmap2] == 0
@ani_bitmap2.dispose
end
end
if @ani_sprites
@ani_sprites.each {|sprite| sprite.dispose }
@ani_sprites = nil
@animation = nil
end
@ani_bitmap1 = nil
@ani_bitmap2 = nil
end
#--------------------------------------------------------------------------
# * Update Animation
#--------------------------------------------------------------------------
def update_animation
return unless animation?
@ani_duration -= 1
if @ani_duration == 0
@ani_duration = @animation.frame_max * @ani_rate + 1
end
if @ani_duration % @ani_rate == 0
frame_index = @animation.frame_max
frame_index -= (@ani_duration + @ani_rate - 1) / @ani_rate
animation_set_sprites(@animation.frames[frame_index])
end
end
#--------------------------------------------------------------------------
# * Set Animation Sprite
# frame : Frame data (RPG::Animation::Frame)
#--------------------------------------------------------------------------
def animation_set_sprites(frame)
cell_data = frame.cell_data
@ani_sprites.each_with_index do |sprite, i|
next unless sprite
pattern = cell_data[i, 0]
if !pattern || pattern < 0
sprite.visible = false
next
end
bmp = pattern < 100 ? @ani_bitmap1 : @ani_bitmap2
sprite.bitmap = Bitmap.new(bmp.width / 2, bmp.height / 2)
sprite.bitmap.stretch_blt(Rect.new(0,0,bmp.width/2,bmp.height/2),
bmp, bmp.rect)
sprite.visible = true
sprite.src_rect.set(pattern % 5 * 96, pattern % 100 / 5 *96, 96, 96)
sprite.x = @rect.x
sprite.y = @rect.y
sprite.angle = cell_data[i, 4]
sprite.mirror = (cell_data[i, 5] == 1)
sprite.z = self.z + 300 + i
sprite.ox = 0
sprite.oy = 0
sprite.zoom_x = 1.0
sprite.zoom_y = 1.0
sprite.opacity = 256
sprite.blend_type = cell_data[i, 7]
end
end
end
class Window_SkillInfo < Window_Base
def initialize()
@window_rect = Rect.new(0,0,544,416)
@img_rect = Rect.new(32, 32, 96, 96)
@name_rect = Rect.new(0, 0, 544, 32)
@state_rect = Rect.new(160, 40, 352, 192)
@desc_rect = Rect.new(16, 224, 496, 160)
@viewport = Viewport.new
@viewport.z = 200
@img_sprite = Sprite_Skill.new(@img_rect, @viewport)
super(@window_rect.x, @window_rect.y, @window_rect.width, @window_rect.height)
self.opacity = 256
self.contents_opacity = 256
self.visible = false
self.active = false
@skill = nil
@handler = {}
refresh
end
def dispose
@img_sprite.dispose
@viewport.dispose
end
def refresh
contents.clear
start_anim
draw_name
draw_stats
draw_descr
@img_sprite.update
end
def update_sprite
@img_sprite.update
end
def clear
@img_sprite.dispose_animation
end
def start_anim
if @skill != nil && !@img_sprite.animation?
# проверить, проигралась ли анимашка, если да - начать снова
if @skill.animation_id > 0
animation = $data_animations[@skill.animation_id]
@img_sprite.start_animation(animation)
end
end
end
def draw_name
if @skill != nil
contents.font.size = 32
contents.font.color = SkillInfo::SKILL_NAME_COLOR
contents.draw_text(@name_rect, @skill.name, 1)
end
end
def draw_param(text1, text2, cur_y)
cur_x = @state_rect.x
contents.font.color = SkillInfo::STAT_NAME_COLOR
contents.draw_text(cur_x, cur_y, contents.text_size(text1).width + 4,
28, text1)
cur_x += contents.text_size(text1).width + 4
contents.font.color = SkillInfo::STAT_VALUE_COLOR
contents.draw_text(cur_x, cur_y, contents.text_size(text2).width + 4,
28, text2)
end
def draw_stats
if @skill != nil
cur_y = @state_rect.y
contents.font.size = 20
contents.font.color = normal_color
draw_param("Элемент: ", $data_system.elements[@skill.damage.element_id].to_s, cur_y)
cur_y += 24
draw_param("Цель: ", get_scope_text(@skill.scope), cur_y)
cur_y += 24
draw_param("Стоимость: ", sprintf("%d %s", @skill.mp_cost, Vocab::mp_a), cur_y)
cur_y += 24
draw_param("Скорость: ", @skill.speed.to_s, cur_y)
cur_y += 24
draw_param("Формула: ", @skill.damage.formula.to_s, cur_y)
cur_y += 24
if @skill.damage.critical
contents.font.color = SkillInfo::CRITICAL_COLOR
text = sprintf("Возможен критический урон!")
contents.draw_text(@state_rect.x, cur_y, contents.text_size(text).width + 4,
24, text)
cur_y += 24
end
# if @skill.effects.lenght > 0
#
#end
end
end
def draw_descr
contents.fill_rect(@desc_rect.x, @desc_rect.y, @desc_rect.width, 2,
text_color(7))
if @skill != nil
contents.font.color = SkillInfo::SKILL_DESCR_COLOR
results = @skill.note.scan(SkillInfo::RGX_INFO)
results.each do |res|
draw_text_ex(@desc_rect.x, @desc_rect.y + 4, res[0].to_s)
end
end
end
def process_character(c, text, pos)
case c
when "\n" # New line
process_new_line(text, pos)
when "\f" # New page
process_new_page(text, pos)
when "\e" # Control character
process_escape_character(obtain_escape_code(text), text, pos)
when " " # Space
txt = text.dup
word = txt.slice(/\A(.+?)\s|\z/)
text_width = text_size(word).width + 4
if text_width + pos[:x] > 480
process_new_line(text, pos)
else
process_normal_character(c, pos)
end
else # Normal character
process_normal_character(c, pos)
end
end
def get_scope_text(id)
case id
when 0
return "нет"
when 1
return "один противник"
when 2
return "все противники"
when 3
return "случайный противник"
when 4
return "2 случайных противника"
when 5
return "3 случайных противника"
when 6
return "4 случайных противника"
when 7
return "один союзник"
when 8
return "все союзники"
when 9
return "мертвый союзник"
when 10
return "все мертвые союзники"
when 11
return "игрок"
else
return ""
end
end
def set_skill(skill)
@skill = skill
if @skill.animation_id > 0
animation = $data_animations[@skill.animation_id]
@img_sprite.start_animation(animation)
end
refresh
end
def update
if self.active
super
return process_cancel if Input.trigger?(:B)
end
end
def process_cancel
Sound.play_cancel
Input.update
deactivate
@handler[:cancel].call
end
def set_handler(symbol, method)
@handler[symbol] = method
end
end
class Scene_Skill
alias skillinfo_start start
def start
@skillinfo_window = Window_SkillInfo.new
@skillinfo_window.set_handler(:cancel, method(:on_skillinfo_cancel))
create_select
skillinfo_start
@sel_window.viewport = @viewport
@sel_window.z = 300
end
def create_select
@sel_window = Window_SkillSelect.new(160, 200,200)
@sel_window.set_handler(:use, method(:command_suse))
@sel_window.set_handler(:show, method(:command_sshow))
@sel_window.set_handler(:cancel, method(:command_scancel))
@sel_window.hide.deactivate
end
def command_suse
@sel_window.hide.deactivate
determine_item
end
def command_sshow
@sel_window.hide.deactivate
@skillinfo_window.set_skill(item)
show_sub_window(@skillinfo_window)
end
def command_scancel
@sel_window.hide.deactivate
activate_item_window
end
def on_skillinfo_cancel
@skillinfo_window.clear
hide_sub_window(@skillinfo_window)
end
def on_item_ok
@actor.last_skill.object = item
@sel_window.set_use(@actor && @actor.usable?(item))
@sel_window.show.activate
end
def update
super
if @skillinfo_window != nil
@skillinfo_window.update_sprite
end
end
end
class Window_SkillSelect < Window_Command
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize(window_width, x, y)
@window_width = window_width
clear_command_list
make_command_list
@first_enabled = true
super(x, y)
@viewport = Viewport.new
@viewport.z = 200
end
#--------------------------------------------------------------------------
# * Get Window Width
#--------------------------------------------------------------------------
def window_width
@window_width
end
#--------------------------------------------------------------------------
# * Get Digit Count
#--------------------------------------------------------------------------
def col_max
return 1
end
#--------------------------------------------------------------------------
# * Create Command List
#--------------------------------------------------------------------------
def make_command_list
add_command("Использовать", :use)
add_command("Посмотреть", :show)
add_command("Отмена", :cancel)
end
def set_use(usable)
@first_enabled = usable
refresh
end
#---HACKS------------------------------------------------------
def draw_item(index)
if index == 0 && !@first_enabled
change_color(normal_color, false)
draw_text(item_rect_for_text(index), command_name(index), alignment)
else
change_color(normal_color, command_enabled?(index))
draw_text(item_rect_for_text(index), command_name(index), alignment)
end
end
def current_item_enabled?
if index == 0 && !@first_enabled
false
else
current_data ? current_data[:enabled] : false
end
end
end
class Window_SkillList
def enable?(item)
if item != nil
return true
end
return false
end
end
Демо yadi.sk/d/tYxKbWgWhyf5T
|