#===============================================================================
# 퀘스트 로그 시스템
# game_guy 가이 만듬
# 빗자루씨 번역
# Version 3.0
#-------------------------------------------------------------------------------
# 간략한 소개:
# 퀘스트를 만들수 있는 스크립트 입니다.
#
# 구성 요소:
# 퀘스트가 완료되었을때 이름을 노란색으로 표시합니다.
# 퀘스트를 만들기 쉬워집니다.
# 존나게 긴 퀘스트를 만들수 있습니다.
# 그림을 띄워서 설명할 수 있습니다.
# 퀘스트를 추가하고 쉽게 클리어 할수 있습니다.
# 다른 쉬운 버전보다 가볍습니다.
#
# 설치방법:
# 조금 아래를 내려다보면 # 이 보입니다. 아래에 있는 대로 하세요..
# 이벤트 설정에서 스크립트 실행으로 아래를 응용할수 있습니다.
#
# 스크립트 목록:
# Quest.add(id) ~ 퀘스트(id)를 리스트에 추가합니다.
# Quest.take(id) ~ 퀘스트(id)를 리스트에서 삭제합니다.
# Quest.complete(id) ~ 퀘스트(id)를 완료합니다.
# Quest.completed?(id) ~ 퀘스트(id)를 완료했을때 값을 true로 돌립니다..
# Quest.has?(id) ~ 퀘스트(id)를 받았는지 확인합니다.
# $scene = Scene_Quest.new ~ 퀘스트 메뉴를 엽니다.
#
# 주의사항 :
# 퀘스트가 하나도 없을시에는 에러가 납니다.
# 적어도 퀘스트가 하나라도 있을때 퀘스트 창을 열수 있게 해주세요.
#
# 크레딧:
# game_guy ~ 이거 만들었습니다.
# 베타 테스터 ~ Sally and Landith
# Blizzard ~ 이 사람의 코드에서 조금 배꼈다고 하는군요.
# 빗자루씨 ~ 이거 번역한사람입네다.
#===============================================================================
module GameGuy
#==================================================
# Begin Config
# UsePicture ~ true값으로 지정되었을때 그림을
# 퀘스트창에 표시합니다만 false일때는 안합니다.
#==================================================
UsePicture = false
def self.qreward(id)
case id
#==================================================
# 퀘스트 보상
# when x then return "보상"을 사용해서 보상을 추가합니다.
# x = id, 보상 = quotes 안에 있는 보상
#==================================================
when 1 then return "100 골드"
when 2 then return "3 포션"
when 3 then return "힘의 반지"
end
return "????"
end
def self.qpicture(id)
case id
#==================================================
# 퀘스트 그림
# when x then return "그림" 방식으로 추가합니다.
# x = id, 그림 = quotes 안에 있는 그림
#==================================================
when 1 then return "ghost"
end
return nil
end
def self.qname(id)
case id
#==================================================
# 퀘스트 이름
# when x then return "이름" 방식으로 추가합니다.
# x = id, 이름 = quotes 안에 있는 이름
#==================================================
when 1 then return "빌리지 헌트"
when 2 then return "페이 텝"
when 3 then return "헌팅 나이프"
end
return ""
end
def self.qlocation(id)
case id
#==================================================
# 퀘스트 장소
# when x then return "장소" 방식으로 추가합니다.
# x = id, 장소 = quotes 안에 있는 장소
#==================================================
when 1 then return "아톤 숲"
when 2 then return "에카"
when 3 then return "에카"
end
return "????"
end
def self.qdescription(id)
case id
#==================================================
# 퀘스트 설명
# when x then return "설명" 방식으로 추가합니다.
# x = id, 설명 = quotes 안에 있는 설명
#==================================================
when 1 then return "엄청나게 기ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ인 퀘스트 소개입니다. 이거는 잠시동안만 볼수있습니다."
when 2 then return "잔스의 방어를 위해서 그녀에게 돈을 기부하세요."
when 3 then return "에카에게 헌팅 나이프를 전해주세요.
"
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_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, "퀘스트:")
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, "보상:")
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, "장소:")
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, "완료 여부:")
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, "완료")
else
self.contents.font.color = normal_color
self.contents.draw_text(0, 224, 480, 32, "진행중...")
end
self.contents.font.color = system_color
self.contents.draw_text(0, 256, 480, 32, "퀘스트 설명:")
self.contents.font.color = normal_color
text = self.contents.slice_text(GameGuy.qdescription(@quest), 460)
text.each_index {|i|
self.contents.draw_text(0, 288 + i*32, 460, 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
사용 방법
1. 메뉴 스크립트에 끼워 넣는 방법이 있고요
2. 이벤트에서 '스크립트'가 있는데 거기서 만약에 퀘스트 1을 주고싶다면 Quest.add(1)을 쳐주시면 됩니다.
테스트 완료.
에러 없음.
진짜 없음.
주의사항만 따르면 에러 없어요
module GameGuy
#==================================================
# Begin Config
# UsePicture ~ true값으로 지정되었을때 그림을
# 퀘스트창에 표시합니다만 false일때는 안합니다.
#==================================================
UsePicture = false
def self.qreward(id)
case id
#==================================================
# 퀘스트 보상
# when x then return "보상"을 사용해서 보상을 추가합니다.
# x = id, 보상 = quotes 안에 있는 보상
#==================================================
when 1 then return "예제 물건"
when 2 then return "3 포션"
when 3 then return "힘의 반지"
end
return "????"
end
def self.qpicture(id)
case id
#==================================================
# 퀘스트 그림
# when x then return "그림" 방식으로 추가합니다.
# x = id, 그림 = quotes 안에 있는 그림
#==================================================
when 1 then return "ghost"
end
return nil
end
def self.qname(id)
case id
#==================================================
# 퀘스트 이름
# when x then return "이름" 방식으로 추가합니다.
# x = id, 이름 = quotes 안에 있는 이름
#==================================================
when 1 then return "예제 퀘스트"
when 2 then return "페이 텝"
when 3 then return "헌팅 나이프"
end
return ""
end
def self.qlocation(id)
case id
#==================================================
# 퀘스트 장소
# when x then return "장소" 방식으로 추가합니다.
# x = id, 장소 = quotes 안에 있는 장소
#==================================================
when 1 then return "예제 성"
when 2 then return "에카"
when 3 then return "에카"
end
return "????"
end
def self.qdescription(id)
case id
#==================================================
# 퀘스트 설명
# when x then return "설명" 방식으로 추가합니다.
# x = id, 설명 = quotes 안에 있는 설명
#==================================================
when 1 then return "예제 입니다.."
when 2 then return "잔스의 방어를 위해서 그녀에게 돈을 기부하세요."
when 3 then return "에카에게 헌팅 나이프를 전해주세요.
"
end
return ""
end
end
위 상황일때
이벤트에서 스크립트를 선택해서 Quest.add(1)을 해주면 퀘스트를 받습니다.
그리고 완료되었을때 Quest.complete(1)로 끝내는 겁니다.
또하나 예제
Quest.completed?(1) == true 를 조건분기로 두었을때
조건을 만족하는곳에 Quest.add(2)로 둔다면 퀘스트 1를 완료시에 퀘스트 2를 받을수 있고,
Quest.has?(2) == true 를 조건분기로 두었을때
조건을 만족하는곳에 메세지로 이미 받았다하면
받았다고 메세지를 보내줍니다.