Войти на сайт
×
ТЕМА: Bestiary Version 1.4
Bestiary Version 1.4 10 года 11 мес. назад #66645
|
Автор: Matt (McDohl)
rpgmaker.net/scripts/ Расстояние между колонками Width = 544 Отображение неизвестных монстров Hidden = "???" Количество колонок Columns = 2 Скрипт подкорректирован мной в названиях: Кол-во убитых и Номер монстра в базе данных игры. ################################################################
# RETCON Library
# Bestiary Version 1.4
# Author: Matt (McDohl)
# Script is free for usage, but please give credit where credit
# is due. :)
################################################################
# PURPOSE
# This script adds a bestiary (yes, it's spelled bestiary) to your
# game. It hides enemies until they've been encountered, keeps
# track of how many have been defeated, displays their stats,
# as well as a blurb about the enemy.
#
# As of right now, there is a lot of hard-coded stuff in this script.
# That will change as I get more familiar with RGSS3 and VX ACE's
# method handling.
################################################################
# UPDATE HISTORY
# 1.4 - Added description text offset.
# Added function to module to change the variable appropriate for
# bestiary access. Bad programming practices shoo.
# 1.3 - Added method to check if the bestiary variable exists.
# If not, call function to create it. Mostly for users
# who plug in this script while loading a game save.
# Checks for draw_text word wrap script, as now is part of
# the RETCON library.
# Added lock function.
# Fixed bug wherein selecting a locked function would cause
# a user's game to crash.
# 1.2 - Fixed bug which was not ticing off multiple enemy deaths
# correctly.
# More code cleaning.
# 1.1 - Added tag+method to skip a monster in the database
# Used terms as defined in the database rather than hardcode.
# Added columns variable.
# Rudimentary code cleanup.
# 1.0 - First draft
################################################################
# METHODOLOGY
# Three new window class are created:
#
# Window_Bestiary - Displays the bestiary window. Subset of
# Window_Command, this is where monsters are shown/hidden.
#
# Window_Monster - Displays the monster's vital info upon being
# selected from Window_Bestiary. Subset of Window_Selectable.
#
# Window_MonsterDesc - Displays the monster index number, name, as
# well as how many times defeated.
#
# One new scene class is created:
#
# Scene_Bestiary - Manages all the windows for the bestiary.
#
# Five previously initialized classes are modified.
#
# Window_MenuCommand - Modified to include the bestiary method to the
# menu.
#
# Scene_Menu - Displays the bestiary command in the menu.
#
# Game_Party - Initalizes and saves the bestiary hash, as well as
# making it referable. This is where the bestiary hash is saved as well, so
# make sure to start a new game when testing this script, or to comment it out
# if you want to continue.
#
# Game_Troop - Makes it so enemies seen are set to true in the bestiary hash.
#
# Game_Battler - Tics the bestiary hash when an enemy is defeated.
################################################################
# USAGE
# To the notes section of the monsters tab in the database, you may add a
# description to the monster to be parsed into the bestiary. Tags for the
# bestiary follow this format:
#
# <bestiary: *.* />
#
# Wherein *.* is replaced with the descriptor text you wish to have displayed
# in the bestiary. It is two lines, and requires manual carrage returns, so use
# \n to delinate where the draw_text_ex function should go to the next line.
#
# Example:
# <bestiary: The legendary white tiger. His fangs are said\nto be able to crush diamonds. />
#
# Note: If draw_text word wrap script is loaded, \n is not needed. It will
# display the text normally.
#
# If you wish to skip a monster in the database from being filed into the hash,
# (used as a sort delinear, not ready to be implemented, or whatever the reason),
# simply add this tag in the notes:
# <skipbestiary />
#
# To change Bestiary access, call the following script function in your game
# RETCON::Bestiary::bestiary_access(bool)
# Replace 'bool' with either 'true' (accessible) or 'false' (inaccessible)
################################################################
# CONCERNS
#-If enemies "revive", it will not detract from their kill count.
#-There is a potential collision issue should an actor name have
# the same name as a monster during the same fight and an actor dies.
# This is due to the Game_Battler class not distinguishing between
# actors and enemies.
#-Assumes all listings in the database are monsters. If you're organizing
# your monsters by adding blanks and such, make sure you use the skipbestiary
# tag.
################################################################
# CUSTOMIZATION
module RETCON
module Bestiary
#Name of the bestiary in the command menu.
Name = "Книга охоты"
#Width of the monster menu. Set to 544, or the maximum width.
Width = 544
#What to display in the bestiary when an enemy is locked.
Hidden = "???"
#Number of columns to display on the bestiary.
Columns = 2
#Make the bestiary accessible in the menu. Set to true to make it available,
#set to false to make it unavailable, at the start of your game.
Available = true
#Offset for the bestiary description. Measured by pixels.
#Make negative to raise the text. Make positive to lower the text.
#line_height is 24 pixels.
DescOffset = 0
################################################################
#Customization ends here!
#You shouldn't really edit below here, but if you know what
#you're doing, it won't be a big deal. Edit at your own risk and
#all that jazz.
################################################################
def self.check_for_bestiary
$game_party.make_the_bestiary if $game_party.bestiary.nil?
end
def self.bestiary_access(bestiarybool)
$game_party.bestiary_accessible = bestiarybool
end
end
end
#################
#CLASS ORIGINALS#
#################
#The bestiary command window, activates when selected.
class Window_Bestiary < Window_Command
def initialize
super(0, fitting_height(1))
end
def window_height
Graphics.height - fitting_height(1)
end
def window_width
return RETCON::Bestiary::Width
end
#Interprets bestiary hash to display commands.
def make_command_list
RETCON::Bestiary::check_for_bestiary
i = 0
$game_party.bestiary.each {|k, v|
i += 1
if v[0] == false
add_command(RETCON::Bestiary::Hidden, :bestiary_blank)
else
add_command("%03d" %i.to_s + ". #{k}", :bestiary_lookup)
end
}
end
def col_max
return RETCON::Bestiary::Columns
end
#Hide and show functions that hide the command menu when showing an enemy
def hide
self.opacity = 0
self.contents_opacity = 0
end
def show
self.opacity = 255
self.contents_opacity = 255
end
end
#Window to display the monster once selected.
class Window_Monster < Window_Selectable
def initialize
super(0, fitting_height(1), Graphics.width, Graphics.height - fitting_height(1))
draw_horz_line(line_height * 11)
self.openness = 0
open
end
#three methods to display the monster window
def display_monster(enemyindex)
monsterdb = $data_enemies[enemyindex]
get_the_entry(monsterdb)
draw_monster(monsterdb)
draw_stats(monsterdb)
end
def get_the_entry(db)
#draws the bestiary description text as set in notes.
monstentry = db.note
if monstentry =~ /<bestiary: (.*) \/>/i
monstentry = $1.to_str
if !$imported.nil? && $imported["RETCON-wordwrap"] == true
draw_text(4, line_height * 12 + RETCON::Bestiary::DescOffset, Graphics.width, line_height * 4, monstentry)
else
monstentry = monstentry.gsub(/\\n/, "\n")
draw_text_ex(4, line_height * 12 + RETCON::Bestiary::DescOffset, monstentry)
end
end
end
#calls and displays the monster image, including hues.
def draw_monster(db)
@monstviewport = Viewport.new(6, fitting_height(1) + 6, 412, Graphics.height - fitting_height(5))
@monstviewport.z = 1000
@monstpicture = Sprite.new(@monstviewport)
@monstpicture.bitmap = Cache.battler(db.battler_name, db.battler_hue)
#determines centers of the viewpoint and currently loaded image
ox = @monstviewport.rect.width / 2
oy = @monstviewport.rect.height / 2
obx = @monstpicture.bitmap.width / 2
oby = @monstpicture.bitmap.height / 2
#realigns the image so it's centered in the viewport
@monstpicture.x = ox - obx
@monstpicture.y = oy - oby
end
#displays the monsters stats. Does not show MP.
#Same lines for each stat, but one is aligned left and one aligned right.
def draw_stats(db)
stat_window_width = Graphics.width - 430
stat_window_x = 403
stats = Array.new
params = Array.new
stats = [Vocab::param(0), Vocab::param(2), Vocab::param(3), Vocab::param(4), Vocab::param(5), Vocab::param(6), Vocab::param(7)]
change_color(system_color)
7.times{|i| draw_text(stat_window_x, fitting_height(i-1), stat_window_width, line_height, stats[i])}
params = [db.params[0], db.params[2], db.params[3], db.params[4], db.params[5], db.params[6], db.params[7]]
change_color(normal_color)
7.times {|i| draw_text(stat_window_x, fitting_height(i-1), stat_window_width, line_height, params[i], 2)}
change_color(text_color(17))
draw_text(stat_window_x, fitting_height(6), stat_window_width, line_height, Vocab::currency_unit)
change_color(normal_color)
draw_text(stat_window_x, fitting_height(7), stat_window_width, line_height, db.gold, 2)
change_color(text_color(23))
draw_text(stat_window_x, fitting_height(8), stat_window_width, line_height, "EXP")
change_color(normal_color)
draw_text(stat_window_x, fitting_height(9), stat_window_width, line_height, db.exp, 2)
end
def draw_horz_line(y)
line_y = y + line_height / 2 - 1
contents.fill_rect(0, line_y, contents_width, 2, line_color)
end
def line_color
color = normal_color
color.alpha = 128
color
end
#erases the picture when window closes.
def clear_pic
@monstpicture.dispose
end
def window_width
return Graphics.width
end
end
#description window when displaying monster. Shows name as well as times defeated.
class Window_MonsterDesc < Window_Selectable
def initialize
super(0, 0, Graphics.width, fitting_height(1))
self.openness = 0
open
end
def display_desc(enemyname, enemyindex)
enemynumindex = "%03d" %enemyindex.to_s
change_color(text_color(6))
draw_text(0, 0, width-30, line_height, "Номер #" + enemynumindex + ": " + enemyname)
change_color(normal_color)
draw_text(0, 0, width-30, line_height, "Убито: " + $game_party.bestiary[enemyname][1].to_s, 2)
end
end
#Displays the scene
class Scene_Bestiary < Scene_MenuBase
def initialize
super
create_bestiary
end
#shows the command window for the bestiary
def create_bestiary
@monsterlisting = Window_Bestiary.new
@monsterlisting.set_handler(:bestiary_blank, method(:play_error))
@monsterlisting.set_handler(:bestiary_lookup, method(:monst_display))
@monsterlisting.set_handler(:cancel, method(:backout))
@monsterlisting.active = true
end
def backout
SceneManager.return
end
#when a monster is selected, initializes the new windows and makes
#them the focus
def monst_display
@monster = Window_Monster.new
@monsterdesc = Window_MonsterDesc.new
monster_info
@monster.set_handler(:cancel, method(:clear_monster))
@monsterdesc.set_handler(:cancel, method(:clear_monster))
@monsterlisting.hide
@monster.active = true
@monsterdesc.active = true
end
#sends information to window classes to display correct information
def monster_info
subjectnumber = @monsterlisting.index+1
subject = $data_enemies[subjectnumber].name
@monsterdesc.display_desc(subject, subjectnumber)
@monster.display_monster(subjectnumber)
end
#dummy function to do nothing when locked enemy is selected
def play_error
@monsterlisting.active = true
Sound::play_buzzer
end
#refocuses the bestiary command list
def clear_monster
@monster.clear_pic
@monster.close
@monsterdesc.close
@monsterlisting.show
@monsterlisting.active = true
end
end
###############
#CLASS ADDENDA#
###############
#adds bestiary option to the window, using add_original_commands
class Window_MenuCommand < Window_Command
alias bestiary_command add_original_commands
def add_original_commands
bestiary_command
add_command(RETCON::Bestiary::Name, :bestiary, $game_party.bestiary_accessible)
end
end
#adds the bestiary option to the command menu
class Scene_Menu < Scene_MenuBase
alias bestiary_command_window create_command_window
def create_command_window
bestiary_command_window
#the addition
@command_window.set_handler(:bestiary, method(:command_bestiary))
end
def command_bestiary
SceneManager.call(Scene_Bestiary)
end
end
#initializes the bestiary hash, as well as makes it accessible.
class Game_Party < Game_Unit
attr_accessor :bestiary
attr_accessor :bestiary_accessible
alias beastiary_retain_previous initialize
def initialize
beastiary_retain_previous
make_the_bestiary
end
#initalizes the bestiary hash.
def make_the_bestiary
enemies = $data_enemies
monsterlist = Array.new
@bestiary = Hash.new
@bestiary_accessible = RETCON::Bestiary::Available
i = 0
while i < enemies.length
if i == 0
i = 1
end
if enemies[i].note =~ /<skipbestiary \/>/i
p i-1 ##skip method
else
monsterlist[i-1] = enemies[i].name
@bestiary.merge! monsterlist[i-1] => [false, 0]
end
i += 1
end
end
end
#upon battle initialization, unlocks enemies in the bestiary
class Game_Troop < Game_Unit
alias bestiary_setup setup
def setup(troop_id)
bestiary_setup(troop_id)
seen_the_enemy
end
def seen_the_enemy
RETCON::Bestiary::check_for_bestiary
members.each do |enemy|
if $game_party.bestiary[enemy.original_name][0] == false
$game_party.bestiary[enemy.original_name][0] = true
end
end
end
end
#checks death in a battle to see if it was enemy or ally.
#if enemy, then add a tick to the bestiary hash.
class Game_Battler < Game_BattlerBase
alias bestiary_die die
def die
bestiary_die
enemy_check
end
def enemy_check
enemy_dead = false
$game_troop.members.each do |enemy|
if enemy.original_name == @original_name && enemy_dead == false
$game_party.bestiary[enemy.original_name][1] += 1
enemy_dead = true
end
end
end
end |
Администратор запретил публиковать записи гостям.
|
Модераторы: NeKotZima
Время создания страницы: 0.222 секунд