#===============================================================================
# Quest Log System
# Author game_guy
# Version 3.0
#-------------------------------------------------------------------------------
# Intro:
# A script that keeps track of quests you obtain and complete.
#
# Features:
# Marks quest names with a yellow color if they're completed
# Easy to setup one quest
# Be able to use a fairly long description
# Be able to display a picture
# Easy to add and complete a quest
# More compatible than earlier versions
#
# Instructions:
# Scroll down a bit until you see # Being Config. Follow the instructions there.
# Scroll below that and you'll see Begin Quest Setup. Follow the steps there.
#
# Script Calls:
# Quest.add(id) ~ Adds the quest(id) to the parties quests.
# Quest.take(id) ~ Takes the quest(id) from the party.
# Quest.complete(id) ~ Makes the quest(id) completed.
# Quest.completed?(id) ~ Returns true if the quest(id) is completed.
# Quest.has?(id) ~ Returns true if the party has quest(id).
#
# Credits:
# game_guy ~ for making it
# Beta Testers ~ Sally and Landith
# Blizzard ~ Small piece of code I borrowed from his bestiary
#===============================================================================
module GameGuy
  #==================================================
  # Begin Config
  # UsePicture ~ true means it'll show pictures in 
  #              the quests, false it wont.
  #==================================================
  UsePicture   = true
  
  def self.qreward(id)
    case id
    #==================================================
    # Quest Reward
    # Use when x then return "Reward"
    # x = id, Reward = reward in quotes
    #==================================================
    when 1 then return "100 Gold"
    when 2 then return "3 Potions"
    when 3 then return "Strength Ring"
    end
    return "????"
  end
  
  def self.qpicture(id)
    case id
    #==================================================
    # Quest Picture
    # Use when x then return "picture"
    # x = id, picture = picutre name in quotes
    #==================================================
    when 1 then return "ghost"
    end
    return nil
  end
  
  def self.qname(id)
    case id
    #==================================================
    # Quest Name
    # Use when x then return "name"
    # x = id, name = quest name in quotes
    #==================================================
    when 1 then return "Village Hunt"
    when 2 then return "Pay Tab"
    when 3 then return "Hunting Knife"
    end
    return ""
  end
  
  def self.qlocation(id)
    case id
    #==================================================
    # Quest Location
    # Use when x then return "location"
    # x = id, location = location in quotes
    #==================================================
    when 1 then return "Arton Woods"
    when 2 then return "Eeka"
    when 3 then return "Eeka"
    end
    return "????"
  end
  
  def self.qdescription(id)
    case id
    #==================================================
    # Quest Description
    # Use when x then return "description"
    # x = id, description = quest description in quotes
    #==================================================
    when 1 then return "Capture 10 animals and bring back the meat."
    when 2 then return "Bring gold to Jarns Defense to pay her tab."
    when 3 then return "Go get Kip a hunting knife from Eeka."
    end
    return ""
  end
  
end

module Quest
  
  def self.add(id)
    $game_party.add_quest(id)
  end
  
  def self.take(id)
    $game_party.take_quest(id)
  end
  
  def self.complete(id)
    $game_party.complete(id)
  end
  
  def self.completed?(id)
    return $game_party.completed?(id)
  end
  
  def self.has?(id)
    return $game_party.has_quest?(id)
  end
  
end
  
class Game_Party
  
  attr_accessor :quests
  attr_accessor :completed
  
  alias gg_quests_lat initialize
  def initialize
    @quests = []
    @completed = []
    gg_quests_lat
  end
  
  def add_quest(id)
    unless @quests.include?(id)
      @quests.push(id)
    end
  end
  
  def completed?(id)
    return @completed.include?(id)
  end
  
  def complete(id)
    unless @completed.include?(id)
      if @quests.include?(id)
        @completed.push(id)
      end
    end
  end
  
  def has_quest?(id)
    return @quests.include?(id)
  end
  
  def take_quest(id)
    @quests.delete(id)
    @completed.delete(id)
  end
  
end
class Scene_Quest
  def main
    @quests = []
    for i in $game_party.quests
      @quests.push(GameGuy.qname(i))
    end
    @map = Spriteset_Map.new
    @quests2 = []
    for i in $game_party.quests
      @quests2.push(i)
    end
    @quests.push("No Quests") if @quests.size < 1
    @quests_window = Window_Command.new(160, @quests)
    @quests_window.height = 480
    @quests_window.back_opacity = 110
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    @quests_window.dispose
    @quest_info.dispose if @quest_info != nil
    @map.dispose
  end
  def update
    @quests_window.update
    if @quests_window.active
      update_quests
      return
    end
    if @quest_info != nil
      update_info
      return
    end
  end
  def update_quests
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Menu.new
      return
    end
    if Input.trigger?(Input::C)
      $game_system.se_play($data_system.decision_se)
      @quest_info = Window_QuestInfo.new(@quests2[@quests_window.index])
      @quest_info.back_opacity = 110
      @quests_window.active = false
      return
    end
  end
  def update_info
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @quests_window.active = true
      @quest_info.dispose
      @quest_info = nil
      return
    end
  end
end
class Window_QuestInfo < Window_Base
  def initialize(quest)
    super(160, 0, 480, 480)
    self.contents = Bitmap.new(width - 32, height - 32)
    @quest = quest
    refresh
  end
  def refresh
    self.contents.clear
    if GameGuy::UsePicture
      pic = GameGuy.qpicture(@quest)
      bitmap = RPG::Cache.picture(GameGuy.qpicture(@quest)) if pic != nil
      rect = Rect.new(0, 0, bitmap.width, bitmap.height) if pic != nil
      self.contents.blt(480-bitmap.width-32, 0, bitmap, rect) if pic != nil
    end
    self.contents.font.color = system_color
    self.contents.draw_text(0, 0, 480, 32, "Quest:")
    self.contents.font.color = normal_color
    self.contents.draw_text(0, 32, 480, 32, GameGuy.qname(@quest))
    self.contents.font.color = system_color
    self.contents.draw_text(0, 64, 480, 32, "Reward:")
    self.contents.font.color = normal_color
    self.contents.draw_text(0, 96, 480, 32, GameGuy.qreward(@quest))
    self.contents.font.color = system_color
    self.contents.draw_text(0, 128, 480, 32, "Location:")
    self.contents.font.color = normal_color
    self.contents.draw_text(0, 160, 480, 32, GameGuy.qlocation(@quest))
    self.contents.font.color = system_color
    self.contents.draw_text(0, 192, 480, 32, "Completion:")
    self.contents.font.color = normal_color
    if $game_party.completed.include?(@quest)
      self.contents.font.color = crisis_color
      self.contents.draw_text(0, 224, 480, 32, "Completed")
    else
      self.contents.font.color = normal_color
      self.contents.draw_text(0, 224, 480, 32, "In Progress")
    end
    self.contents.font.color = system_color
    self.contents.draw_text(0, 256, 480, 32, "Description:")
    self.contents.font.color = normal_color
    text = self.contents.slice_text(GameGuy.qdescription(@quest), 480)
    text.each_index {|i|
        self.contents.draw_text(0, 288 + i*32, 480, 32, text[i])}
  end
end
class Bitmap
  
  def slice_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