Tornado Quest Log Edit

Started by ojp2010, September 06, 2010, 04:34:10 pm

Previous topic - Next topic

ojp2010

I am looking for someone to do and or help me edit Tornado Quest Book by storm for my game. I included that script and the RMX-OS save script. I am wanting to add a effect to the script the calls a scene when the call script, $game_party.add_quest(id), is used. The scene will be a small window that displays the information about the quest, ["title","author's name","text","reward"], and also offers the player an option to select either accept quest or cancel the scene. If a player selects accept then the quest is added to the Quest Log, if cancel then it isn't. It will also check rather a players has completed the quest already. If a player has completed the quest already then scene will just display no available quest. When a player completes a quest and returns to the quest giver the script will check if it is complete, if it is then the option accept is replaced by complete. Player selects complete the quest is removed from their quest log and they are rewarded. Much like the interface for most MMORPG's online today

**Since quests can only be done once so the script will also need to check if a player has already done the quest too, which that data will need to be saved by RMX-OS. Which I can handled and define myself if someone so choices to help me.

The scene it calls will use the current windowskin and be slightly translucent, like in the following picture.

Spoiler: ShowHide



Tornado Quest Book
Spoiler: ShowHide
#==============================================================================
#==============================================================================
#                            Tornado Quest Book
#                               Version 1.0
#                              Author: Storm
#                      http://rpgxpultimate.darkbb.com
#
# Instructions:
# Place the script above main.
#
# Use $scene = Scene_QuestBook.new to call it.
#
# Use $game_party.add_quest(id) to add quest.
#
# Use $game_party.delete_quest(id) to delete quest.
#
# Use $game_party.finish_quest(id) to finish quest.
#
# Use $game_party.unfinish_quest(id) to unfinish quest.
#
# In condition branch, at the script tab enter $game_party.quest_complete?(id)
# to check if that quest have completed yet.
#
# Features:
# Can custom menus name.
# Opacity configable.
# Customable complete quest color.
# Customable incomplete quest color.
# Able to set return scene.
# Auto replace text in the message.
# Replacements configable.
#
# Compatibility:
# Most of things. (Haven't test to any yet. :P)
#
# Credits and Thanks:
# Storm     - For making it.
# Game_Guy  - For teach me how to use array.
#
#==============================================================================
#==============================================================================
module TNDqb
  #============================================================================
  # START CONFIG
  #============================================================================
 
  #============================== General Config ==============================
  # General Config.
  #============================================================================
  QB_Name     = "Quest Book" #Quest Book name
  Author_Name = "Author" #Author name
  Title_Name  = "Title" #Title name
  Reward_Name = "Reward" #Reward name
  Status_Name = "Status" #Reward name
  Complete    = "Complete" #Complete name
  Incomplete  = "Incomplete" #Incomplete name
  Unknown     = "???" #Unknown Name
  Opacity     = 200 #Windows Opacity
  Screen      = 1 #(0 = black,1 = map,"quoted string" = picture)
 
  Cmp_Color   = Color.new(0, 255, 0, 255) #Complete color
  Incmp_Color = Color.new(255, 0, 0, 255) #Incomplete Color
 
  Return      = Scene_Map #Return Scene
 
  #================================ Ignore Part ===============================
  # Ignore Parts Under This.
  #============================================================================
  Quest       = []
 
  #============================ Replacement Config ============================
  # Replacements, this will auto replace texts in your message
  #
  # Replace = ["text","replace"]
  # NOTE: Maximum of replaces is 10. Replaces cannot be add or remove.
  #       Cannot include {name1}, {name2}, {name3} and {name4}
  #
  #       Completed Replacements: (Do not add)
  #       {name1} = 1st actor's name
  #       {name2} = 2nd actor's name
  #       {name3} = 3rd actor's name
  #       {name4} = 4th actor's name
  #============================================================================
  Replace1 = ["",""]
  Replace2 = ["",""]
  Replace3 = ["",""]
  Replace4 = ["",""]
  Replace5 = ["",""]
  Replace6 = ["",""]
  Replace7 = ["",""]
  Replace8 = ["",""]
  Replace9 = ["",""]
  Replace10 = ["",""]
 
  #=============================== Quest Config ===============================
  # Config quests here.
  #
  # Quest[id] = ["title","author's name","text","reward"]
  #============================================================================
 
  #PART 1
  Quest[1]    = ["Anemone Refugees","Flol ","Flol wants you to talk to Opsur","10 Gold & 5 Experience"]
  Quest[2]    = ["Bee Stringers","Hene","Hene has asked you to kill ten bees and bring back their stringers as proof","4 Gold & 10 Experience"]
  Quest[3]    = ["Camellia Flower","Pogrua","Bring twenty Camellia flowers to Pogrua. The flowers can be found anywhere in the Camellia Plains","2 Gold & 20 Expereince"]
  Quest[4]    = ["Abonded Chest", "Chest","It is locked, you should take it to Riro.","5 Gold & 10 Experience"]
  Quest[5]    = ["Supplies Thiefs","Fupp","Find the Fupp's ten missing supply crates.","3 Gold & 15 Experience"]
  #============================================================================
  # END CONFIG
  #============================================================================
end

#====================
# Game_Party
#====================
class Game_Party
  attr_accessor :quest
  attr_accessor :qComplete
  alias tnd_qb_init initialize
  def initialize
    @quest = []
    @qComplete = []
    tnd_qb_init
  end
 
  def add_quest(id)
    msg = TNDqb::Quest[id]
    return if msg == nil
    unless @quest.include?(id)
      @qComplete.delete(id)
      @quest.push(id)
    end
  end
 
  def delete_quest(id)
    msg = TNDqb::Quest[id]
    return if msg == nil
    if @quest.include?(id)
      @qComplete.delete(id)
      @quest.delete(id)
    end
  end
 
  def finish_quest(id)
    msg = TNDqb::Quest[id]
    return if msg == nil
    if @quest.include?(id)
      @qComplete.push(id)
    end
  end
 
  def unfinish_quest(id)
    msg = TNDqb::Quest[id]
    return if msg == nil
    if @quest.include?(id)
      @qComplete.delete(id)
    end
  end
 
  def quest_complete?(id)
    return if id == nil
    msg = TNDqb::Quest[id]
    return if msg == nil
    if @qComplete.include?(id)
      return true
    else
      return false
    end
  end
 
end

#====================
# Bitmap
#====================
class Bitmap
  def format_text(text, width)
    words = text.split(' ')
    return words if words.size == 1
    result, current_text = [], words.shift
    words.each_index {|i|
        if self.text_size("#{current_text} #{words[i]}").width > width
          result.push(current_text)
          current_text = words[i]
        else
          current_text = "#{current_text} #{words[i]}"
        end
        result.push(current_text) if i >= words.size - 1}
    return result
  end
end

#====================
# Window_QuestTitle
#====================
class Window_QuestTitle < Window_Base
  def initialize
    super(0, 0, 640, 60)
    self.back_opacity = TNDqb::Opacity
    self.contents = Bitmap.new(width - 32, height - 32)
    refresh
  end
  def refresh
    self.contents.clear
    self.contents.font.color = normal_color
    self.contents.font.size = 25
    cx = contents.text_size(TNDqb::QB_Name).width
    self.contents.draw_text(0, 0, cx, 37, TNDqb::QB_Name)
  end
end

#====================
# Window_QuestMain
#====================
class Window_QuestMain < Window_Base
  def initialize
    super(35, 100, 380, 340)
    self.back_opacity = TNDqb::Opacity
    self.contents = Bitmap.new(width - 32, height - 32)
    refresh
  end
  def refresh
    return if @quest_id == nil
    msg = TNDqb::Quest[@quest_id]
    return if msg == nil
    self.contents.clear
    self.contents.font.size = 20
    t = self.contents.text_size(TNDqb::Title_Name+": ").width
    t2 = self.contents.text_size(TNDqb::Author_Name+": ").width
    t3 = self.contents.text_size(TNDqb::Reward_Name+": ").width
    t4 = self.contents.text_size(TNDqb::Status_Name+": ").width
    self.contents.font.color = system_color
    self.contents.draw_text(0, 0, self.width, 32, TNDqb::Title_Name+": ")
    self.contents.draw_text(0, 32, self.width, 32, TNDqb::Author_Name+": ")
    self.contents.draw_text(0, 250, self.width, 32, TNDqb::Reward_Name+": ")
    self.contents.draw_text(0, 282, self.width, 32, TNDqb::Status_Name+": ")
    self.contents.font.color = normal_color
    self.contents.draw_text(t, 0, self.width, 32, msg[0])
    self.contents.draw_text(t2, 32, self.width, 32, msg[1])
   
    @text = msg[2]
   
    @text = @text.gsub(TNDqb::Replace1[0], TNDqb::Replace1[1])
    @text = @text.gsub(TNDqb::Replace2[0], TNDqb::Replace2[1])
    @text = @text.gsub(TNDqb::Replace3[0], TNDqb::Replace3[1])
    @text = @text.gsub(TNDqb::Replace4[0], TNDqb::Replace4[1])
    @text = @text.gsub(TNDqb::Replace5[0], TNDqb::Replace5[1])
    @text = @text.gsub(TNDqb::Replace6[0], TNDqb::Replace6[1])
    @text = @text.gsub(TNDqb::Replace7[0], TNDqb::Replace7[1])
    @text = @text.gsub(TNDqb::Replace8[0], TNDqb::Replace8[1])
    @text = @text.gsub(TNDqb::Replace9[0], TNDqb::Replace9[1])
    @text = @text.gsub(TNDqb::Replace10[0], TNDqb::Replace10[1])
   
    actor = $game_party.actors[0]
    @text = @text.gsub("{name1}", actor.name)

   
    draw_msg(@text, 0, 64)
   
    if $game_party.qComplete.include?(@quest_id)
      self.contents.draw_text(t3, 250, self.width, 32, msg[3])
      self.contents.font.color = TNDqb::Cmp_Color
      self.contents.draw_text(t4, 282, self.width, 32, TNDqb::Complete)
    else
      self.contents.draw_text(t3, 250, self.width, 32, TNDqb::Unknown)
      self.contents.font.color = TNDqb::Incmp_Color
      self.contents.draw_text(t4, 282, self.width, 32, TNDqb::Incomplete)
    end
  end
  def draw_msg(msg, x, y)
    text = self.contents.format_text(msg, 380)
    text.each_index {|i|self.contents.draw_text(x, y + i*32, 544, 32, text[i])}
  end
  def set_quest(id)
    return if @quest_id == id
    @quest_id = id
    refresh
  end
end

#====================
# Scene_QuestBook
#====================
class Scene_QuestBook
  def main
    if TNDqb::Screen.is_a?(Integer)
      if TNDqb::Screen == 1
        @back = Spriteset_Map.new
      end
    else
      @back = Sprite.new
      @back.bitmap = RPG::Cache.picture(TNDqb::Screen)
    end
   
    #Command window setup
    @quest = $game_party.quest
    @msg = []
    @quest.each {|i|
      @msg.push(TNDqb::Quest[i][0])
    }
    @msg = [""] if @msg.size < 1
   
    #Create command window
    @command_window = Window_Command.new(180, @msg)
    @command_window.x = 460
    @command_window.back_opacity = TNDqb::Opacity
    @command_window.height = 420
    @command_window.y = 60
    j = 0
    @quest.each{|i|
    if $game_party.qComplete.include?(i)
      @command_window.draw_item(j, TNDqb::Cmp_Color)
    end
    j += 1}
   
    #Make main windows
    @title = Window_QuestTitle.new
    @main = Window_QuestMain.new
   
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      #Update windows and inputs
      update
      inputUpdate
      #Break if scene is not Scene_QuestBook
      if $scene != self
        break
      end
    end
    Graphics.freeze
   
    #Dispose windows
    if TNDqb::Screen == 1
      @back.dispose
    end
    @command_window.dispose
    @title.dispose
    @main.dispose
  end
 
  def command_refresh
    @newIndex = @command_window.index
    @msg = []
    @command_window.dispose
    @command_window = nil
    @quest.each {|i|
    @msg.push(TNDqb::Quest[i][0])
    }
    @msg = [""] if @msg.size < 1
    @command_window = Window_Command.new(180, @msg)
    @command_window.x = 460
    @command_window.back_opacity = TNDqb::Opacity
    @command_window.height = 420
    @command_window.y = 60
    @command_window.index = @newIndex
    j = 0
    @quest.each{|i|
    if $game_party.qComplete.include?(i)
      @command_window.draw_item(j, TNDqb::Cmp_Color)
    end
    j += 1}
  end
 
  def inputUpdate
    if Input.trigger?(Input::Key['L'])
      #Play Cancel SE
      $game_system.se_play($data_system.cancel_se)
      #Return to set scene
      $scene = TNDqb::Return.new
    elsif Input.trigger?(Input::C)
      #Play Decision SE
      $game_system.se_play($data_system.decision_se)
      #Refresh quest data
      @main.set_quest(@quest[@command_window.index])
      #Goto command_refresh
      command_refresh
    end
  end
 
  def update
    #Updates
    @command_window.update
    @title.update
    @main.update
  end
end


RMX-OS Save Script
Spoiler: ShowHide
module RMXOS
  module Options
    SAVE_DATA[Game_Party].push('@quest')
    SAVE_DATA[Game_Party].push('@qComplete')
    SAVE_DATA[Game_Party].push('@unfinish_quest')
  end
end