Main Menu
  • Welcome to The RPG Maker Resource Kit.

[REQUEST] Beastiary Script

Started by Xuroth, July 29, 2007, 09:41:02 PM

0 Members and 2 Guests are viewing this topic.

Xuroth

In my game, Gotterdammerung: Twilight of the Gods, I have a beastiary book. I am asking for a script that can show basic stats, areas they are found in, and large areas to show information about the monster. I also want the name on top, just above a monster battler. I would also like the option to be able to take the item to a Loremaster (some old wizard dude) and be able to fight monsters. I want the monsters to only appear in the book, after they have been defeated. I only want the option to fight to appear when you are next to a loremaster. I understand this sounds like a pokedex script, but it will be different due to the monsters. I also understand this can be done with many hours of hard work with events, and I have done it before that way. I just want to use scripting to make it better, more professional, and attractive. Any questions, please post.

xeph

#==============================================================================
# ? Bestiary
#------------------------------------------------------------------------------
# Credit(i forgot i think its momo)
#
#==============================================================================

module Enemy_Book_Config
DROP_ITEM_NEED_ANALYZE = false
EVA_NAME = "Evasion"             
SHOW_COMPLETE_TYPE = 3         
                         
end

class Game_Temp
attr_accessor :enemy_book_data
alias temp_enemy_book_data_initialize initialize
def initialize
   temp_enemy_book_data_initialize
   @enemy_book_data = Data_MonsterBook.new
end
end

class Game_Party
attr_accessor :enemy_info           
#--------------------------------------------------------------------------
alias book_info_initialize initialize
def initialize
   book_info_initialize
   @enemy_info = {}
end
#--------------------------------------------------------------------------
def add_enemy_info(enemy_id, type = 0)
   case type
   when 0
     if @enemy_info[enemy_id] == 2
       return false
     end
     @enemy_info[enemy_id] = 1
   when 1
     @enemy_info[enemy_id] = 2
   when -1
     @enemy_info[enemy_id] = 0
   end
end
#--------------------------------------------------------------------------
def enemy_book_max
   return $game_temp.enemy_book_data.id_data.size - 1
end
#--------------------------------------------------------------------------
def enemy_book_now
   now_enemy_info = @enemy_info.keys
   no_add = $game_temp.enemy_book_data.no_add_element
   new_enemy_info = []
   for i in now_enemy_info
     enemy = $data_enemies[i]
     next if enemy.name == ""
     if enemy.element_ranks[no_add] == 1
       next
     end
     new_enemy_info.push(enemy.id)
   end
   return new_enemy_info.size
end
#--------------------------------------------------------------------------
def enemy_book_complete_percentage
   e_max = enemy_book_max.to_f
   e_now = enemy_book_now.to_f
   comp = e_now / e_max * 100
   return comp.truncate
end
end

class Interpreter
def enemy_book_max
   return $game_party.enemy_book_max
end
def enemy_book_now
   return $game_party.enemy_book_now
end
def enemy_book_comp
   return $game_party.enemy_book_complete_percentage
end
end

class Scene_Battle
alias add_enemy_info_start_phase5 start_phase5
def start_phase5
   for enemy in $game_troop.enemies
     unless enemy.hidden
       $game_party.add_enemy_info(enemy.id, 0)
     end
   end
   add_enemy_info_start_phase5
end
end

class Window_Base < Window
#--------------------------------------------------------------------------
def draw_enemy_drop_item(enemy, x, y)
   self.contents.font.color = normal_color
   treasures = []
   if enemy.item_id > 0
     treasures.push($data_items[enemy.item_id])
   end
   if enemy.weapon_id > 0
     treasures.push($data_weapons[enemy.weapon_id])
   end
   if enemy.armor_id > 0
     treasures.push($data_armors[enemy.armor_id])
   end
   if treasures.size > 0
     item = treasures[0]
     bitmap = RPG::Cache.icon(item.icon_name)
     opacity = 255
     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
     name = treasures[0].name
   else
     self.contents.font.color = disabled_color
     name = "No Item"
   end
   self.contents.draw_text(x+28, y, 212, 32, name)
end
#--------------------------------------------------------------------------
def draw_enemy_book_id(enemy, x, y)
   self.contents.font.color = normal_color
   id = $game_temp.enemy_book_data.id_data.index(enemy.id)
   self.contents.draw_text(x, y, 32, 32, id.to_s)
end
#--------------------------------------------------------------------------
def draw_enemy_name(enemy, x, y)
   self.contents.font.color = normal_color
   self.contents.draw_text(x, y, 152, 32, enemy.name)
end
#--------------------------------------------------------------------------
def draw_enemy_graphic(enemy, x, y, opacity = 255)
   bitmap = RPG::Cache.battler(enemy.battler_name, enemy.battler_hue)
   cw = bitmap.width
   ch = bitmap.height
   src_rect = Rect.new(0, 0, 64, 64)
   self.contents.blt(x + 10, y - 270, bitmap, src_rect, opacity)
end
#--------------------------------------------------------------------------
def draw_enemy_exp(enemy, x, y)
   self.contents.font.color = system_color
   self.contents.draw_text(x, y, 120, 32, "EXP")
   self.contents.font.color = normal_color
   self.contents.draw_text(x + 120, y, 36, 32, enemy.exp.to_s, 2)
end
#--------------------------------------------------------------------------
def draw_enemy_gold(enemy, x, y)
   self.contents.font.color = system_color
   self.contents.draw_text(x, y, 120, 32, $data_system.words.gold)
   self.contents.font.color = normal_color
   self.contents.draw_text(x + 120, y, 36, 32, enemy.gold.to_s, 2)
end
end

class Game_Enemy_Book < Game_Enemy
#--------------------------------------------------------------------------
def initialize(enemy_id)
   super(2, 1)
   @enemy_id = enemy_id
   enemy = $data_enemies[@enemy_id]
   @battler_name = enemy.battler_name
   @battler_hue = enemy.battler_hue
   @hp = maxhp
   @sp = maxsp
end
end

class Data_MonsterBook
attr_reader :id_data
#--------------------------------------------------------------------------
def initialize
   @id_data = enemy_book_id_set
end
#--------------------------------------------------------------------------
def no_add_element
   no_add = 0
   for i in 1...$data_system.elements.size
     if $data_system.elements[i] =~ /??????/
       no_add = i
       break
     end
   end
   return no_add
end
#--------------------------------------------------------------------------
def enemy_book_id_set
   data = [0]
   no_add = no_add_element
   for i in 1...$data_enemies.size
     enemy = $data_enemies[i]
     next if enemy.name == ""
     if enemy.element_ranks[no_add] == 1
       next
     end
     data.push(enemy.id)
   end
   return data
end
end


class Window_MonsterBook < Window_Selectable
attr_reader   :data
#--------------------------------------------------------------------------
def initialize(index=0)
   super(0, 64, 640, 416)
   @column_max = 2
   @book_data = $game_temp.enemy_book_data
   @data = @book_data.id_data.dup
   @data.shift
   #@data.sort!
   @item_max = @data.size
   self.index = 0
   refresh if @item_max > 0
end
#--------------------------------------------------------------------------
def data_set
   data = $game_party.enemy_info.keys
   data.sort!
   newdata = []
   for i in data
     next if $game_party.enemy_info[i] == 0
     if book_id(i) != nil
       newdata.push(i)
     end
   end
   return newdata
end
#--------------------------------------------------------------------------
def show?(id)
   if $game_party.enemy_info[id] == 0 or $game_party.enemy_info[id] == nil
     return false
   else
     return true
   end
end
#--------------------------------------------------------------------------
def book_id(id)
   return @book_data.index(id)
end
#--------------------------------------------------------------------------
def item
   return @data[self.index]
end
#--------------------------------------------------------------------------
def refresh
   if self.contents != nil
     self.contents.dispose
     self.contents = nil
   end
   self.contents = Bitmap.new(width - 32, row_max * 32)
   if @item_max > 0
     for i in 0...@item_max
      draw_item(i)
     end
   end
end
#--------------------------------------------------------------------------
def draw_item(index)
   enemy = $data_enemies[@data[index]]
   return if enemy == nil
   x = 4 + index % 2 * (288 + 32)
   y = index / 2 * 32
   rect = Rect.new(x, y, self.width / @column_max - 32, 32)
   self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
   self.contents.font.color = normal_color
   draw_enemy_book_id(enemy, x, y)
   if show?(enemy.id)
     self.contents.draw_text(x + 28+16, y, 212, 32, enemy.name, 0)
   else
     self.contents.draw_text(x + 28+16, y, 212, 32, "?????", 0)
     return
   end
   if analyze?(@data[index])
     self.contents.font.color = text_color(3)
     self.contents.draw_text(x + 256, y, 24, 32, "?", 2)
   end
end
#--------------------------------------------------------------------------
def analyze?(enemy_id)
   if $game_party.enemy_info[enemy_id] == 2
     return true
   else
     return false
   end
end
end


class Window_MonsterBook_Info < Window_Base
include Enemy_Book_Config
#--------------------------------------------------------------------------
def initialize
   super(0, 0+64, 640, 480-64)
   self.contents = Bitmap.new(width - 32, height - 32)
end
#--------------------------------------------------------------------------
def refresh(enemy_id)
   self.contents.clear
   self.contents.font.size = 22
   enemy = Game_Enemy_Book.new(enemy_id)
   draw_enemy_graphic(enemy, 96, 240+48+64, 200)
   draw_enemy_book_id(enemy, 4, 0)
   draw_enemy_name(enemy, 48, 0)
   draw_actor_hp(enemy, 288, 0)
   draw_actor_sp(enemy, 288+160, 0)
   draw_actor_parameter(enemy, 288    ,  32, 0)
   self.contents.font.color = system_color
   self.contents.draw_text(288+160, 32, 120, 32, EVA_NAME)
   self.contents.font.color = normal_color
   self.contents.draw_text(288+160 + 120, 32, 36, 32, enemy.eva.to_s, 2)
   draw_actor_parameter(enemy, 288    ,  64, 3)
   draw_actor_parameter(enemy, 288+160,  64, 4)
   draw_actor_parameter(enemy, 288    ,  96, 5)
   draw_actor_parameter(enemy, 288+160,  96, 6)
   draw_actor_parameter(enemy, 288    , 128, 1)
   draw_actor_parameter(enemy, 288+160, 128, 2)
   draw_enemy_exp(enemy, 288, 160)
   draw_enemy_gold(enemy, 288+160, 160)
   if analyze?(enemy.id) or !DROP_ITEM_NEED_ANALYZE
     self.contents.draw_text(288, 192, 96, 32, "Drop Item")
     draw_enemy_drop_item(enemy, 288+96+4, 192)
     self.contents.font.color = normal_color
     #draw_element_guard(enemy, 320-32, 160-16+96)
   end
end
#--------------------------------------------------------------------------
def analyze?(enemy_id)
   if $game_party.enemy_info[enemy_id] == 2
     return true
   else
     return false
   end
end
end


class Scene_MonsterBook
include Enemy_Book_Config
#--------------------------------------------------------------------------
def main
   $game_temp.enemy_book_data = Data_MonsterBook.new
   @title_window = Window_Base.new(0, 0, 640, 64)
   @title_window.contents = Bitmap.new(640 - 32, 64 - 32)
   @title_window.contents.draw_text(4, 0, 320, 32, "Bestiary", 0)
   if SHOW_COMPLETE_TYPE != 0
     case SHOW_COMPLETE_TYPE
     when 1
       e_now = $game_party.enemy_book_now
       e_max = $game_party.enemy_book_max
       text = e_now.to_s + "/" + e_max.to_s
     when 2
       comp = $game_party.enemy_book_complete_percentage
       text = comp.to_s + "%"
     when 3
       e_now = $game_party.enemy_book_now
       e_max = $game_party.enemy_book_max
       comp = $game_party.enemy_book_complete_percentage
       text = e_now.to_s + "/" + e_max.to_s + "    " + comp.to_s + "%"
     end
     if text != nil
       @title_window.contents.draw_text(320, 0, 288, 32,  text, 2)
     end
   end
   @main_window = Window_MonsterBook.new
   @main_window.active = true
   @info_window = Window_MonsterBook_Info.new
   @info_window.z = 110
   @info_window.visible = false
   @info_window.active = false
   @visible_index = 0
   Graphics.transition
   loop do
     Graphics.update
     Input.update
     update
     if $scene != self
       break
     end
   end
   Graphics.freeze
   @main_window.dispose
   @info_window.dispose
   @title_window.dispose
end
#--------------------------------------------------------------------------
def update
   @main_window.update
   @info_window.update
   if @info_window.active
     update_info
     return
   end
   if @main_window.active
     update_main
     return
   end
end
#--------------------------------------------------------------------------
def update_main
   if Input.trigger?(Input::B)
     $game_system.se_play($data_system.cancel_se)
     $scene = Scene_Menu.new
     return
   end
   if Input.trigger?(Input::C)
     if @main_window.item == nil or @main_window.show?(@main_window.item) == false
       $game_system.se_play($data_system.buzzer_se)
       return
     end
     $game_system.se_play($data_system.decision_se)
     @main_window.active = false
     @info_window.active = true
     @info_window.visible = true
     @visible_index = @main_window.index
     @info_window.refresh(@main_window.item)
     return
   end
end
#--------------------------------------------------------------------------
def update_info
   if Input.trigger?(Input::B)
     $game_system.se_play($data_system.cancel_se)
     @main_window.active = true
     @info_window.active = false
     @info_window.visible = false
     return
   end
   if Input.trigger?(Input::C)
     #$game_system.se_play($data_system.decision_se)
     return
   end
   if Input.trigger?(Input::L)
     $game_system.se_play($data_system.decision_se)
     loop_end = false
     while loop_end == false
       if @visible_index != 0
         @visible_index -= 1
       else
         @visible_index = @main_window.data.size - 1
       end
       loop_end = true if @main_window.show?(@main_window.data[@visible_index])
     end
     id = @main_window.data[@visible_index]
     @info_window.refresh(id)
     return
   end
   if Input.trigger?(Input::R)
     $game_system.se_play($data_system.decision_se)
     loop_end = false
     while loop_end == false
       if @visible_index != @main_window.data.size - 1
         @visible_index += 1
       else
         @visible_index = 0
       end
       loop_end = true if @main_window.show?(@main_window.data[@visible_index])
     end
     id = @main_window.data[@visible_index]
     @info_window.refresh(id)
     return
   end
end
end


If you want it to be a option in main menu just ask me

Xuroth

how would I go about adding specific monsters? how do I add stats, pictures, and info or the ability to battle monsters when near a "loremaster"? I would like to add an option into the menu, but I am using Rune's CMS which only has space for the 6 options. Can I add it to an object? I want the book to be able to call this script, and then be able to battle the monsters when near a loremaster. How would I go about doing this?

thank you for this script. If you cant help me get it perfect, then i will suffice and find a way to get it to work someother way. Thanks in advance for any help. I appreciate your help.

xeph

You dont need to it just comes up when you battle it you dont need to add anything
really simple just make a monster and then when you battle it the script reconizes it
Sorry for the bad spelling i did this quick

Xuroth

ok, I added that script just above main. i called it Scene_Beastiary. I did a battle and nothing appeared to change. How do I access the beastiary script? How should I call it? when I try a "$scene = SceneBeastiary.new" call, it gives a Name Error: Uninitialized Constant Interpreter :: Scene_Beastiary. I tried calling it as a window, but that didnt work either, as it gave the same error.

xeph

Strange it works fine for me let me check for a sec

try this it should work
$scene = Scene_MonsterBook.new

Rune

Quote from: Xuroth on July 30, 2007, 09:00:54 AM
I am using Rune's CMS which only has space for the 6 options.

Which one?
Sincerely,
Your conscience.

Xuroth

@Rune:

This one:



@BECKY1111:
It works, but monsters dont show up after battling them. I checked it before and after, and nothing changed (that I could see) what should I do now?

Xuroth

Sorry for the double post. I have Blizz's Beastiary script and analyze script, and it works. I only want to add in the ability to battle monsters you have already battled before. This is to simulate a practice arena in my game. you are faced against foes you already have defeated to gain more EXP and to train for the much more difficult Arena battles.

@Rune, I would love to see the ability to add this to your CMS (pic is above) under items, unless you could make a modification to your CMS to add the extra option. I need it to call '$scene = Scene_Bestiary.new' to bring up the beastiary.

@BECKY1111:thanks for your help. even though I didnt use yours, (i would have if I could have gotten to see what it looks like.) I still appreciate you taking time out to help me.

WcW

Yeah, Blizzard's scripts are pretty good and simple, but unfortunately, he doesn't let anyone who's mainly active on here of .org use them.  And I don't give away mine either, not since I got banned.
If you are reading this, the government of the U.S.A. is currently planting a chip in your brain.
People like decreasing my Rep. In fact, people like decreasing most others people's rep.

modern algebra

I don't think that that's true. I've only seen one that he doesn't allow .org people to use, and I haven't seen one that rmrk people are not allowed to use. And also, you were banned because you told the admin that you were 12 years old on 13+ forum. If it is true that he doesn't allow rmrk people to use his scripts, can you link me to the topic where he says that so I can complain  ;8

And welcome back WcW! You were theguywithproblems right?

WcW

Well, he hasn't openly stated it, but seeing as how he deleted all of them off here, I'd say he doesn't want many people here using them.  And I was banned after saying that and then saying it was a joke, and then why was Nightwolf never banned?  And yes, WcW and TGWP are one and the same.  He didn't have much choice letting me back, though, since my birthdays next Friday and I'd be turning 13 anyway.
If you are reading this, the government of the U.S.A. is currently planting a chip in your brain.
People like decreasing my Rep. In fact, people like decreasing most others people's rep.

Demonic Blade

I know this is necro-posting, but the bestiary screen won't appear for me. Nothing happens. Plz help.
I wonder how many of my-reps are there for a reason, and not just because some jackass wanted to show off in front of some other jackasses...?
Probably a lot of them - and those people sure as hell don't deserve my pity, let alone my disgust.
That's right, let's see some more -Rep'ing! BOOYEAH!!

tSwitch

people can use blizzard's scripts, he never said otherwise
he just didn't want them posted here, he wants the traffic to go to his site
now, on that note

Demonic Blade, just use Blizzard's, it does the same thing and I know it works
I've tried it out
and on that note: Bestiary 2.2

also, you should be more specific with your problems
when it's not working
what you were trying to do when it didn't work
your configuration, etc...


FCF3a A+ C- D H- M P+ R T W- Z- Sf RLCT a cmn+++ d++ e++ f h+++ iw+++ j+ p sf+
Follow my project: MBlok | Find me on: Bandcamp | Twitter | Patreon

Demonic Blade

#14
Forget it, I think it was just because I made a Common Event (So that I could press "A" for example, and then it'd appear. But it works with a normal event... I guess I should've tried that first... hehe... ::)
I wonder how many of my-reps are there for a reason, and not just because some jackass wanted to show off in front of some other jackasses...?
Probably a lot of them - and those people sure as hell don't deserve my pity, let alone my disgust.
That's right, let's see some more -Rep'ing! BOOYEAH!!