Original Source
- Original title: [SOLVED] Kilozappit Word Wrapping Support #2
- Original author: Rutsah
- Original date: June 5, 2021
- Source thread: https://forums.rpgmakerweb.com/threads/solved-kilozappit-word-wrapping-support-2.137186/
- Source forum path: Game Development Engines > Ruby Game System (RGSS) Scripts > RGSSx Script Support
Summary
Hi, I need a small modification for my Kilozappit script. I do want it working for my other scripts (Venka's Bestiary, Vlue's Quest System, MoonlessNight's AMN Glossary), but I do not want it working for regular dialogues, as it does not take into account various other scripts I'm using, and it's f@cking up the sentence structures as a result. Can anyone help? For reference: -Venka's Bestiary
Archived First Post
Can anyone help?
For reference:
-Venka's Bestiary
-Vlue's Quest System:
#Basic Quest System v1.3f
#By Vlue
#----------#
#Features: Quests! What more can you say.
#
#Usage: Set up your quests and away you go!
# Script calls:
# accept_quest(:questid) - force quest accept
# ask_accept(:questid) - open quest acceptance window
# abandon_quest(:questid) - force quest abandon
# turnin_quest(:questid) - force quest turnin
# fail_quest(:questid) - force abandon with ME
# ask_turnin(:questid) - open quest complete window
#
# adv_obj(:questid, :objectiveid, value) - changes obj by value
# set_obj(:questid, :objectiveid, value) - sets obj to value
# obj(:questid, :objectiveid) - gets obj value
# hide_obj(:questid, :objectiveid) - hides objective
# show_obj(:questid, :objectiveid) - shows objective
#
# $game_quests[:questid].accepted? - true if quest is accepted
# $game_quests[:questid].completed? - true if quest is completed
# $game_quests[:questid].turned_in? - true if quest is turned in
#
# Examples:
# The obj function can be used in conditional branches to check progress
# of certain objectives. Example.
# #Checking if :obj3 of :quest89 is greater than 3:
# obj(:quest89, :obj3) > 3
#
#~ #----------#
#-- Script by: V.M of D.T
#
#- Questions or comments can be:
# given by email: sumptuaryspade@live.ca
# provided on facebook: http://www.facebook.com/DaimoniousTailsGames
# All my other scripts and projects can be found here: http://daimonioustails.weebly.com/
#
#--- Free to use in any project, commercial or non-commercial, with credit given
# - - Though a donation's always a nice way to say thank you~ (I also accept actual thank you's)
#Visibility of quest log on map
$questlogvisibility = false
#Maximum # of quests displayed on the quest log overlay
$questlogmaxdisplay = 2
#Quest log position, 1 - top-left, 2 - top-right
QUEST_LOG_POSITION = 2
#Quest log offsets
QUEST_LOG_OFFSET_X = 0
QUEST_LOG_OFFSET_Y = 0
# Quest Format and set up!
# DETAILS[:quest_id] = {
# :name => "quest name" #Quest name
# :level => value #Arbitrary value (Optional)
# :difficulty => "string" #Arbitrary string (Optional)
# :auto_complete => true #Recieve rewards on the spot (Optional)
# :abandonable => false #Set's whether quest can be abandoned (Optional)
# :force_accept => true #ask_accept only allows accepting (Optional)
# :force_turnin => true #ask_turnin only allows completing (Optional)
# }
# DESCRIPTIONS[:quest_id] = {
# :qgiver_name => "string" #Quest giver name (shows in log) (Optional)
# :location => "string" #Quest giver location (shows in log) (Optional)
# :desc => "string" #Description of quest displayed in log (Optional)
# }
# OBJECTIVES[:quest_id] = { #Quest objectives, "string" is name, id is max value
# # boolean is hidden objective (true for hidden)
# :obj_id1 => ["string", id]
# :obj_id2 => ["string", id, boolean],
# etc...
# }
# REWARDS[:quest_id] = {
# :gold => value #Gold recieved from quest (Optional)
# :exp => value #Exp recieved from quest (Optional)
# #Items recieved from quest, :type is :item, :weapon, or :armor
# :scale_exp => value #Percent value to scale exp based on level vs party
# :items => [[:type,id,value], ...]], (Optional)
# }
module QUEST
DETAILS= {}
DESCRIPTIONS = {}
OBJECTIVES = {}
REWARDS = {}
#Broken Reality
DETAILS[:quest1] = {
:name => "Broken Reality",}
DESCRIPTIONS[:quest1] = {
:desc => "A deity known as 'Mother' wants me to find some 'Truth' about the world of Psema. The 'Regulators', also known as 'The Trinity', Gods of Psema, want me to stay put. Both claim to have my best interests in mind, and say that the other is lying. I fear I am the unluckiest person in Psema." }
OBJECTIVES[:quest1] = {
:obj1 => ["Explore Psema",0],
:obj2 => ["I found Hana, Mother's chosen.",1,true],
:obj3 => ["We recruited a werewolf, Gouki.",1,true],
:obj4 => ["We recruited a magus, Hachi.",1,true] }
REWARDS[:quest1] = {}
#Mother's Will
DETAILS[:quest2] = {
:name => "Mother's Will",}
DESCRIPTIONS[:quest2] = {
:desc => "Mother has told Hana that we need to travel to a city called 'Theodoxa'. There, the next part of her plan will be revealed. I will lead Hana there, but..." }
OBJECTIVES[:quest2] = {
:obj1 => ["Travel to Kronos from the Docks and recruit a man there",1]}
REWARDS[:quest2] = {
:exp => 10000 }
#Floor 3 Church Side Quest
DETAILS[:sidequest001] = {
:name => "Abandoned Faith"}
DESCRIPTIONS[:sidequest001] = {
:qgiver_name => "Trinity Priest",
:location => "Blackcry",
:desc => "The Trinity priest of Blackcry was chased out of his church by the dark elves, leaving behind his silver cross of the Trinity. He wants it back." }
OBJECTIVES[:sidequest001] = {
:obj1 => ["Silver Cross", 1] }
REWARDS[:sidequest001] = {
:exp => 250 }
#Floor 1 Wolf Perk Side Quest
DETAILS[:sidequest002] = {
:name => "Howl of the Wolf"}
DESCRIPTIONS[:sidequest002] = {
:qgiver_name => "Tibian",
:location => "Illfang's Forest",
:desc => "A group of ruffians hunt wolves for sport. Tibian wants me to stop them. I can find them in Mermaid's Song, in ToB." }
OBJECTIVES[:sidequest002] = {
:obj1 => ["Hunters dispatched", 3],
:obj2 => ["Report back to Tibian",1,true]}
REWARDS[:sidequest002] = {
:exp => 300 }
#Floor 1 Kobold Side Quest
DETAILS[:sidequest003] = {
:name => "The Kobold Cousins"}
DESCRIPTIONS[:sidequest003] = {
:qgiver_name => "Kobold Guard",
:location => "Town of Beginnings",
:desc => "The kobold guarding the entrance to Illfang's Tower wants me to find out what happened to his cousin, Vagabond. He should be in Illfang's Forest, in some cave." }
OBJECTIVES[:sidequest003] = {
:obj1 => ["Find Vagabond", 1],
:obj2 => ["Learn cousin's name", 1],
:obj3 => ["Report back to cousin", 1]}
REWARDS[:sidequest003] = {
:exp => 180 }
#Floor 1 Docks Scorpion Skin Quest
DETAILS[:sidequest004] = {
:name => "Missing Ingredient"}
DESCRIPTIONS[:sidequest004] = {
:qgiver_name => "Magus at docks",
:location => "Town of Beginnings Docks",
:desc => "A masked man in the docks is looking for his lost ingredient for alchemy, scorpion skin. It is located somewhere in the docks." }
OBJECTIVES[:sidequest004] = {
:obj1 => ["Find the scorpion skin", 1],
:obj2 => ["Return to the magus", 0, true]}
REWARDS[:sidequest004] = {
:exp => 30 }
#Floor 1 Hiding Grandson
DETAILS[:sidequest005] = {
:name => "Brat Trackdown"}
DESCRIPTIONS[:sidequest005] = {
:qgiver_name => "Elderly Man",
:location => "Palace Plaza, ToB",
:desc => "An old man's grandson has ran off. I should ask the children where to find him." }
OBJECTIVES[:sidequest005] = {
:obj1 => ["Locate the brat", 1],
:obj2 => ["Return to the elder", 0, true]}
REWARDS[:sidequest005] = {
:exp => 50 }
#Floor 1 Wine Cellar Rats
DETAILS[:sidequest006] = {
:name => "Rat Infestation"}
DESCRIPTIONS[:sidequest006] = {
:qgiver_name => "Liquor Store Owner",
:location => "Southeast Sector, ToB",
:desc => "The basement of the liquor store is infested with rats. I need to kill them all." }
OBJECTIVES[:sidequest006] = {
:obj1 => ["Rats killed", 4]}
REWARDS[:sidequest006] = {
:exp => 110 }
#Floor 1 Hunter 1 - Doug
DETAILS[:sidequest007] = {
:name => "A Punchable Offense"}
DESCRIPTIONS[:sidequest007] = {
:qgiver_name => "Doug",
:location => "Mermaid's Song, ToB",
:desc => "Doug Ironsword is one of the three hunter ruffians in Mermaid's Song." }
OBJECTIVES[:sidequest007] = {
:obj1 => ["Dig some dirt on Doug", 1],
:obj2 => ["Find mr. Ironsword", 1, true],
:obj3 => ["Go back to Doug", 1, true]}
REWARDS[:sidequest007] = {
:exp => 100 }
#Floor 1 Hunter 1 - Doug Alternative
DETAILS[:sidequest008] = {
:name => "A Highly Punchable Offense"}
DESCRIPTIONS[:sidequest008] = {
:qgiver_name => "Vickie",
:location => "Ironsword Mansion",
:desc => "Vickie wants me to ambush Doug near the Drunk Dragon and mug him. This is an alternative way to stop the hunter." }
OBJECTIVES[:sidequest008] = {
:obj1 => ["Beat up Doug", 1]}
REWARDS[:sidequest008] = {
:exp => 130 }
#Floor 2 Baby Wyrms
DETAILS[:sidequest009] = {
:name => "Sheep Snap"}
DESCRIPTIONS[:sidequest009] = {
:qgiver_name => "Farmer Timberson",
:location => "Urbus Provinces",
:desc => "Farmer Timberson wants me to find and eradicate the baby wyrms that plague his sheep." }
OBJECTIVES[:sidequest009] = {
:obj1 => ["Baby wyrms killed", 6]}
REWARDS[:sidequest009] = {
:exp => 400 }
#Floor 1 Hunter 3 - Music option
DETAILS[:sidequest010] = {
:name => "The Aspiring Musician"}
DESCRIPTIONS[:sidequest010] = {
:qgiver_name => "Hunter",
:location => "Mermaid's Song, ToB",
:desc => "The sophisticated hunter wants to learn music. Perhaps if I could find a bard near the ToB..." }
OBJECTIVES[:sidequest010] = {
:obj1 => ["Find a bard", 1],
:obj2 => ["Report back to the hunter", 1, true]}
REWARDS[:sidequest010] = {
:exp => 100 }
#Floor 1 Hunter 3 - Rude Hunter
DETAILS[:sidequest011] = {
:name => "Enemy of my Enemy"}
DESCRIPTIONS[:sidequest011] = {
:qgiver_name => "Hunter",
:location => "Mermaid's Song, ToB",
:desc => "The sophisticated hunter wants to learn music. Perhaps if I could find a bard near the ToB..." }
OBJECTIVES[:sidequest011] = {
:obj1 => ["Ask the wench", 1],
:obj2 => ["Find Sally", 1, true],
:obj3 => ["Visit the Drunk Dragon", 1, true],
:obj4 => ["Return to Rhys", 1, true]}
REWARDS[:sidequest011] = {
:exp => 100 }
#Floor 1 Church Side Quest
DETAILS[:sidequest012] = {
:name => "Mother's Necklace"}
DESCRIPTIONS[:sidequest012] = {
:qgiver_name => "Nancy",
:location => "Church Grounds, ToB",
:desc => "One of the orphanage girls south of the Town of Beginnings is missing her mother's memento. She suspects someone has stolen it from her." }
OBJECTIVES[:sidequest012] = {
:obj1 => ["Talk with Enver", 1],
:obj2 => ["Talk with Flare", 1, true],
:obj3 => ["Return to Nancy", 1, true]}
REWARDS[:sidequest012] = {
:exp => 60 }
#Floor 1 Church Side Quest #2
DETAILS[:sidequest013] = {
:name => "Enlightment in a Bottle"}
DESCRIPTIONS[:sidequest013] = {
:qgiver_name => "Sister Rafa",
:location => "Orphanage",
:desc => "Sister Rafa, one of the orphans' caretakers is wasted. She accidentally drank the sacramental wine and now needs to replace it." }
OBJECTIVES[:sidequest013] = {
:obj1 => ["Give her red wine", 1],
:obj2 => ["Give her more red wine", 1, true],
:obj3 => ["Give her sake", 1, true]}
REWARDS[:sidequest013] = {
:exp => 100 }
#Floor 10 Wines
DETAILS[:sidequest014] = {
:name => "Poor of Spirits"}
DESCRIPTIONS[:sidequest014] = {
:qgiver_name => "Troubled Man",
:location => "Castle of Thousand Snakes",
:desc => "A guard in the central area of the castle was assigned to guard a wine shipment, but thieves got away with it while he was busy. He has begged you to help him find it. He said it should be in the southern part of the castle." }
OBJECTIVES[:sidequest014] = {
:obj1 => ["Locate the wine shipment", 1],
:obj2 => ["Return to the soldier", 1, true]}
REWARDS[:sidequest014] = {
:exp => 600 }
#Floor 1 Tomb Permit
DETAILS[:sidequest015] = {
:name => "Hikari's Permit"}
DESCRIPTIONS[:sidequest015] = {
:qgiver_name => "Guard",
:location => "Town of Beginnings",
:desc => "South of the Town of Beginnings lies the great dragon Hikari's tomb. The guard there won't let me get close without an official permit. I will have to find someone with authority in the Town of Beginnings to grant it to me." }
OBJECTIVES[:sidequest015] = {
:obj1 => ["Find someone who can give a permit", 1],
:obj2 => ["Get the permit", 1, true],
:obj3 => ["Return to the soldier", 1, true]}
REWARDS[:sidequest015] = {
:exp => 140 }
#Kaliska Mission
DETAILS[:sidequest016] = {
:name => "Into the Jungle"}
DESCRIPTIONS[:sidequest016] = {
:qgiver_name => "Kaliska",
:location => "Tlanextic",
:desc => "Demons are setting up camp in the archipelago of Tlanextic. Me and Kaliska are to find out why and resolve the situation before the locals do something everyone will regret. We should start by finding the tribe's magi and befriending them." }
OBJECTIVES[:sidequest016] = {
:obj1 => ["Get to Ichtaca", 1],
:obj2 => ["Explore the Pyramid of Knowledge", 1, true],
:obj3 => ["Return to the soldier", 1, true]}
REWARDS[:sidequest016] = {
:exp => 5000 }
#Floor 8 Leona Weapons Quest
DETAILS[:sidequest017] = {
:name => "Demon Infestation"}
DESCRIPTIONS[:sidequest017] = {
:qgiver_name => "Leona",
:location => "the Bloody Drake, Imperia",
:desc => "A woman called Leona is leading the people of Imperia to revolution, against king Ezalor and queen Oracia, seeking to reestablish the kingdom of Petros. For that, she needs arms. You need to head to the barracks of Oracle Village, and clear it of the demons who have infested it." }
OBJECTIVES[:sidequest017] = {
:obj1 => ["Reach the Barracks of Oracle Village", 1],
:obj2 => ["Kill the Demons", 1, true],
:obj3 => ["Return to Leona", 1, true]}
REWARDS[:sidequest017] = {
:exp => 700 }
#Floor 1 Grandma Brother
DETAILS[:sidequest018] = {
:name => "Horunka Village"}
DESCRIPTIONS[:sidequest018] = {
:qgiver_name => "Farmer's Wife",
:location => "Illfang's Forest",
:desc => "A middle-aged woman at the edges of Illfang's Forest wants me to find her brother and see if he is alright. According to her, he should be working on his little farm in Horunka Village, in Illfang's Forest." }
OBJECTIVES[:sidequest018] = {
:obj1 => ["Find the Brother", 1],
:obj2 => ["Return to the Farmer's Wife", 1, true]}
REWARDS[:sidequest018] = {
:exp => 110 }
#Floor 5 Cult of the Damned
DETAILS[:sidequest019] = {
:name => "Trapped Spirits"}
DESCRIPTIONS[:sidequest019] = {
:qgiver_name => "Spectre of Jafaan Abdallah",
:location => "Nameless Tomb, East of Asari",
:desc => "I met the ghost of a Trinity priest, cursed by the ancient Cult of the Damned which they defeated to die, and then have the spirit bound to the corpse. He wants me to find two orb artifacts, so that he may break the curse and let himself and his followers go to the afterlife." }
OBJECTIVES[:sidequest019] = {
:obj1 => ["Visit the Asari Temple archives", 1],
:obj2 => ["Orb of Igbagbo in the north tomb", 1, true],
:obj3 => ["Orb of Ina in Jafaan's House in East Asari", 1, true],
:obj4 => ["Obtain the key from the barracks", 1, true],
:obj5 => ["Return to the spectre", 1, true]}
REWARDS[:sidequest019] = {
:exp => 1500 }
#Floor 1 House Maid
DETAILS[:sidequest020] = {
:name => "Maid in Order"}
DESCRIPTIONS[:sidequest020] = {
:qgiver_name => "ToB Home",
:location => "Town of Beginnings",
:desc => "You've got yourself a nice, large house, now if only you had someone to look after it while you're out adventuring... There should be some poor lass in the city looking for work." }
OBJECTIVES[:sidequest020] = {
:obj1 => ["Find a maid for your ToB house", 1]}
REWARDS[:sidequest020] = {
:exp => 450 }
#Floor 1 Spectre Quest
DETAILS[:sidequest021] = {
:name => "Nothing but Silence"}
DESCRIPTIONS[:sidequest021] = {
:qgiver_name => "River Spectre",
:location => "Southern Paths",
:desc => "The spectre by the river south of the Town of Beginnings is dissatisfied with the insistent barkings of the nearby dog when a bear comes to steal the crops. It wants its silence from before the bear showed up to return." }
OBJECTIVES[:sidequest021] = {
:obj1 => ["Keep the dog from barking", 1],
:obj2 => ["Return to the spectre", 1, true]}
REWARDS[:sidequest021] = {
:exp => 100 }
#Floor 1 Illfang
DETAILS[:sidequest022] = {
:name => "Kobold Invasion"}
DESCRIPTIONS[:sidequest022] = {
:qgiver_name => "Personal",
:location => "Tolbana",
:desc => "The kobolds near Tolbana are setting up ambushes for weary travellers and ganging up on adventurers, under the commands of a mysterious master. Dealing with them will make travelling safe, and give me some Yudah recognition." }
OBJECTIVES[:sidequest022] = {
:obj1 => ["Deal with the kobold problem", 1]}
REWARDS[:sidequest022] = {
:exp => 150 }
#Floor 2 N'Gombe
DETAILS[:sidequest023] = {
:name => "Minotaur Raiders"}
DESCRIPTIONS[:sidequest023] = {
:qgiver_name => "Personal",
:location => "Urbus Mountains",
:desc => "Minotaurs attack travellers near Urbus indiscriminately. The beasts are strong, but not too bright, and rarely work on their own. They must have a leader somewhere near Urbus. Dealing with him will give me more Yudah recognition." }
OBJECTIVES[:sidequest023] = {
:obj1 => ["Deal with the minotaurs", 1]}
REWARDS[:sidequest023] = {
:exp => 150 }
#Floor 1-2 Mute Soldier
DETAILS[:sidequest024] = {
:name => "Oath of Silence"}
DESCRIPTIONS[:sidequest024] = {
:qgiver_name => "Silent Soldier",
:location => "Tolbana to Urbus Path",
:desc => "In the outpost on the road from Tolbana to Urbus, I found a soldier who seems incapable of speech for some reason. Perhaps if I helped him, my reputation with Yudah's military would improve." }
OBJECTIVES[:sidequest024] = {
:obj1 => ["Ask the other soldier for details.", 1],
:obj2 => ["Ask around in a Yudah Barracks", 1, true],
:obj3 => ["Ask about Irvin at the Urbus Inn", 1, true],
:obj4 => ["Find Irvin's on the road to Urbus", 1, true],
:obj5 => ["Return to Reuel", 1, true],}
REWARDS[:sidequest024] = {
:exp => 190 }
#Floor 1-2 Mute Soldier
DETAILS[:sidequest025] = {
:name => "Signet Ring"}
DESCRIPTIONS[:sidequest025] = {
:qgiver_name => "Kobold's Lavatory Patron",
:location => "ToB East Sewers",
:desc => "A wealthy figure in Kobold's Lavatory sent an adventurer named Howard on a quest to find a signet ring, in an easter section of the Town of Beginnings' sewers. I am to find him and report back." }
OBJECTIVES[:sidequest025] = {
:obj1 => ["Find Howard or the Signet Ring.", 1],
:obj2 => ["Return to Kobold's Lavatory", 1, true]}
REWARDS[:sidequest025] = {
:exp => 350 }
#Floor 2 Testosterone Drug
DETAILS[:sidequest026] = {
:name => "Testosterone in a Bottle"}
DESCRIPTIONS[:sidequest026] = {
:qgiver_name => "Lucy",
:location => "Imperia Academia",
:desc => "Three lasses in Imperia Academia requested ingredients from me to create a new kind of strength potion. I will need: A regular strength potion, hornet honey and Minotaur Horn Dust." }
OBJECTIVES[:sidequest026] = {
:obj1 => ["Deliver the items to Lucy", 1]}
REWARDS[:sidequest026] = {
:exp => 200 }
#Floor 1 Corpses Missing
DETAILS[:sidequest027] = {
:name => "No Eternal Rest in Yudah"}
DESCRIPTIONS[:sidequest027] = {
:qgiver_name => "Widow",
:location => "Dragontooth",
:desc => "A man in Dragontooth sold his corpse to Yudah's Healers' Union. His grieving wife wants it back, but the Union refuses to resell it. Can bureaucracy really be so cruel, or are there sinister purposes here?" }
OBJECTIVES[:sidequest027] = {
:obj1 => ["Speak with the Corpse Buyer", 1],
:obj2 => ["Speak with Dragontooth's Gravekeeper", 1],
:obj3 => ["Ask denizens of Yudah's underworld about the corpses.", 1]}
REWARDS[:sidequest027] = {
:exp => 800 }
#Floor 3 Hana Outfit
DETAILS[:sidequest028] = {
:name => "Lady Wendigo"}
DESCRIPTIONS[:sidequest028] = {
:qgiver_name => "Raggs",
:location => "Raggs'es Camp",
:desc => "The vile kobold boneworker, who you met in Illfang's mines, has promised to make a new outfit for Hana, for free. He just needs the materials to do it." }
OBJECTIVES[:sidequest028] = {
:obj1 => ["Kill the Demon Bat skin", 1],
:obj2 => ["Find the mistweaver diagrams", 1]}
REWARDS[:sidequest028] = {
:exp => 300 }
#Floor 4 Troll Toll
DETAILS[:sidequest029] = {
:name => "Troll Toll"}
DESCRIPTIONS[:sidequest029] = {
:qgiver_name => "Rhetor",
:location => "Beach Southwest of Kronos",
:desc => "The magus owning the beach worries about the future of his schemes due to the presence of the troll. He wants it cease its tolls on the passangers, and will pay handsomely for it." }
OBJECTIVES[:sidequest029] = {
:obj1 => ["Rid the beach of the troll", 1]}
REWARDS[:sidequest029] = {
:exp => 250 }
end
class Game_Quests
attr_accessor :reset_hash
def initialize
@quests = {}
QUEST::DETAILS.each do |id, quest|
@quests[id] = Quest.new(id,quest)
end
@reset_hash = {}
@quests.each_value do |quest|
@reset_hash[quest.id] = {}
@reset_hash[quest.id][:accepted] = true
@reset_hash[quest.id][:turnedin] = true
quest.objectives.each do |id, obj|
@reset_hash[quest.id][id] = obj
end
end
end
def check_quests
@quests.each do |id, quest|
if !$game_party.quests[id]
$game_party.quests[id] = {}
quest.reset
end
end
end
def [](quest_id)
return msgbox("No Quest with id " + quest_id.to_s) if @quests[quest_id].nil?
@quests[quest_id]
end
def []=(quest_id, val)
@quests[quest_id] = val
end
def quests
@quests
end
def no_quests?
@quests.each do |id, quest|
return false if quest.accepted? && !quest.turned_in
end
return true
end
def tracking?
$game_party.tracking
end
def track_quest(id)
return if $game_party.tracking.include?(id)
$game_party.tracking.push(id)
if $game_party.tracking.size > $questlogmaxdisplay = 5
$game_party.tracking.reverse!.pop
$game_party.tracking.reverse!
end
end
def untrack_quest(id)
return unless $game_party.tracking.include?(id)
$game_party.tracking.delete(id)
$game_party.tracking.compact!
end
end
class Quest
attr_accessor :name
attr_accessor :level
attr_accessor :id
attr_accessor :desc
attr_accessor :objectives
attr_accessor :turned_in
attr_accessor :difficulty
attr_accessor :qgiver_name
attr_accessor :location
attr_accessor :auto_complete
attr_accessor :abandonable
attr_accessor :force_accept
attr_accessor :force_turnin
def initialize(id,quest_hash)
@id = id
@level = 0
@difficulty = 0
@name = "No Quest Name"
@desc = ""
@qgiver_name = 0
@location = 0
@auto_complete = false
@abandonable = true
@need_popup = false
@force_turnin = false
@force_accept = false
@name = quest_hash[:name] if quest_hash[:name]
@level = quest_hash[:level] if quest_hash[:level]
@force_accept = quest_hash[:force_accept] if quest_hash[:force_accept]
@force_turnin = quest_hash[:force_turnin] if quest_hash[:force_turnin]
@difficulty = quest_hash[:difficulty] if quest_hash[:difficulty]
@auto_complete = quest_hash[:auto_complete] if quest_hash[:auto_complete]
@abandonable = quest_hash[:abandonable] if !quest_hash[:abandonable].nil?
@desc = QUEST::DESCRIPTIONS[id][:desc] if QUEST::DESCRIPTIONS[id][:desc]
@qgiver_name = QUEST::DESCRIPTIONS[id][:qgiver_name] if QUEST::DESCRIPTIONS[id][:qgiver_name]
@location = QUEST::DESCRIPTIONS[id][:location] if QUEST::DESCRIPTIONS[id][:location]
@objectives = {}
if QUEST::OBJECTIVES[id]
QUEST::OBJECTIVES[id].each do |id, obj|
@objectives[id] = Objective.new(id, obj)
end
else
msgbox("Quest " + id.to_s + " has no objectives.")
end
@reward_gold = 0
@reward_exp = 0
@scale_exp = 0
@reward_items = []
begin
if QUEST::REWARDS[id][:gold]
@reward_gold = QUEST::REWARDS[id][:gold]
end
if QUEST::REWARDS[id][:exp]
@reward_exp = QUEST::REWARDS[id][:exp]
@scale_exp = QUEST::REWARDS[id][:scale_exp] if QUEST::REWARDS[id][:scale_exp]
end
if QUEST::REWARDS[id][:items]
@reward_items = QUEST::REWARDS[id][:items]
end
rescue
msgbox(id.to_s + " has no defined REWARDS. This is not optional.")
end
end
def accept
reset
$game_party.quests[id][:accepted] = true
track_quest
$game_map.need_refresh = true
Audio.se_play("Audio/SE/Book2")
end
def abandon
reset
$game_party.quests[id][:accepted] = false
end
def fail
Audio.me_play("Audio/SE/Pen")
abandon
end
def accepted?
$game_party.quests[id][:accepted]
end
def accepted
accepted?
end
def completed?
@objectives.each do |id, obj|
return false if !$game_party.quests[@id][id].completed?
end
return true
end
def force_done
$game_party.quests[id][:accepted] = true
@objectives.each do |id, obj|
$game_party.quests[@id][id].current = obj.max
end
turnin
end
def reset
$game_party.quests[id][:accepted] = false
@objectives.each do |id, obj|
$game_party.quests[@id][id] = obj
$game_party.quests[@id][id].current = 0
end
$game_party.quests[id][:turnedin] = false
end
def objective(id)
return Objective.new(id, ["No Objective Found",0]) if @objectives[id].nil?
$game_party.quests[@id][id]
end
def set_obj(id, value)
objective(id).current = value
@need_popup = false if !completed?
popup if completed? && !@need_popup
turnin if completed? && @auto_complete
$game_map.need_refresh = true
end
def adv_obj(id, value)
objective(id).current += value
@need_popup = false if !completed?
popup if completed? && !@need_popup
turnin if completed? && @auto_complete
$game_map.need_refresh = true
end
def reward_gold
@reward_gold
end
def reward_exp
get_mod_exp.to_i
end
def reward_items
@reward_items
end
def turnin
$game_party.quests[id][:turnedin] = true
untrack_quest
$game_map.need_refresh = true
$game_party.gain_gold(@reward_gold)
$game_party.members.each do |actor|
actor.gain_exp(@reward_exp)
end
@reward_items.each do |array|
item = $data_items[array[1]] if array[0] == :item
item = $data_weapons[array[1]] if array[0] == :weapon
item = $data_armors[array[1]] if array[0] == :armor
$game_party.gain_item(item, array[2])
end
end
def track_quest
$game_quests.track_quest(@id)
end
def untrack_quest
$game_quests.untrack_quest(@id)
end
def can_abandon?
@abandonable
end
def popup
@need_popup = true
Audio.me_play("Audio/SE/Magic1")
if Module.const_defined?(:Popup)
Popup.add([@name + ' complete!'])
end
end
def turned_in?
$game_party.quests[id][:turnedin]
end
def turned_in
turned_in?
end
def active?
accepted? && !completed?
end
def get_mod_exp
pval = @scale_exp * (@level - $game_party.highest_level).to_f / 100 + 1
@reward_exp * pval
end
end
class Objective
attr_accessor :id
attr_accessor :name
attr_accessor :current
attr_accessor :max
attr_accessor :hidden
def initialize(id, obj)
@name = obj[0]
@current = 0
@max = obj[1]
@hidden = obj[2] ? obj[2] : false
end
def completed?
@current >= @max
end
end
module DataManager
class << self
alias quest_cgo load_database
alias quest_sng setup_new_game
end
def self.load_database
quest_cgo
$game_quests = Game_Quests.new
end
def self.setup_new_game
$game_quests = Game_Quests.new
quest_sng
end
end
class Scene_Quest < Scene_MenuBase
def start
super
@help_window = Window_Help.new(1)
@help_window.set_text("Quest Log")
@list_window = Window_SceneList.new
@list_window.set_handler(:cancel, method(:list_cancel))
#@list_window.set_handler(:ok, method(:list_ok))
@list_window.refresh
@list_window.activate
@list_window.select(0)
@detail_window = Window_SceneDetail.new
@command_window = Window_QuestTrack.new
@command_window.x = Graphics.width / 2 - @command_window.width / 2
@command_window.y = Graphics.height / 2 - @command_window.height / 2
@command_window.set_handler(:track, method(:track))
@command_window.set_handler(:untrack, method(:untrack))
@command_window.set_handler(:abandon, method(:abandon))
@command_window.set_handler(:cancel, method(:command_cancel))
end
def update
super
@detail_window.quest = @list_window.current_item
end
def list_cancel
SceneManager.return
end
def list_ok
@command_window.quest(@list_window.current_item)
@command_window.refresh
@command_window.select(0)
@command_window.activate
@command_window.open
end
def track
$game_quests.track_quest(@list_window.current_item.id)
command_cancel
end
def untrack
$game_quests.untrack_quest(@list_window.current_item.id)
command_cancel
end
def abandon
@list_window.current_item.abandon
command_cancel
end
def command_cancel
@command_window.close
@list_window.refresh
@list_window.activate
list_cancel if $game_quests.no_quests?
end
end
class Window_SceneList < Window_Selectable
def initialize
super(0,48,Graphics.width/5*2,Graphics.height-48)
refresh
end
def make_item_list
@data = []
$game_quests.quests.each do |id, quest|
@data.push(quest) if quest.accepted? && !quest.turned_in?
end
@data.push(nil) if @data.empty?
end
def draw_item(index)
contents.font.size = 18
item = @data[index]
if item
rect = item_rect(index)
rect.width -= 4
if $game_quests.tracking?.include?(item.id)
text = "*" + item.name
else
text = item.name
end
draw_text(rect, text)
draw_text(rect, "Lv" + item.level.to_s,2) if item.level > 0
end
end
def col_max; 1; end
def current_item
@data[@index]
end
def current_item_enabled?
true
end
def refresh
make_item_list
create_contents
draw_all_items
end
def item_max
@data ? @data.size : 0
end
end
class Window_SceneDetail < Window_Base
def initialize
super(Graphics.width/5*2,48,Graphics.width-Graphics.width/5*2,Graphics.height-48)
end
def quest=(quest)
return if @quest == quest
@quest = quest
refresh
end
def refresh
contents.clear
return unless @quest
contents.font.size = 18
change_color(system_color)
draw_text(0,0,contents.width,line_height,@quest.qgiver_name) if @quest.qgiver_name != 0
draw_text(0,0,contents.width,line_height,@quest.location,2) if @quest.location != 0
change_color(normal_color)
@quest.qgiver_name != 0 || @quest.location != 0 ? yy = line_height : yy = 0
draw_text_ex(0,yy,@quest.desc)
change_color(system_color)
draw_text(0,line_height*7,contents.width,24,"Objectives:")
change_color(normal_color)
yy = line_height * 8
@quest.objectives.each do |id, obj|
next if obj.hidden
draw_objective(yy, obj)
yy += 24
end
change_color(system_color)
draw_text(0,yy,contents.width,line_height,"Rewards:")
yy += line_height
if @quest.reward_exp > 0
draw_text(6,yy,contents.width/2,line_height,"XP: ")
change_color(normal_color)
draw_text(36,yy,contents.width/2,line_height,@quest.reward_exp)
yy += line_height
end
if @quest.reward_gold > 0
change_color(normal_color)
draw_text(6,yy,contents.width/2,line_height,@quest.reward_gold.to_s)
cx = text_size(@quest.reward_gold).width
change_color(system_color)
draw_text(6+cx,yy,contents.width/2,line_height,Vocab::currency_unit)
end
yy += line_height
change_color(normal_color)
@quest.reward_items.each do |array|
item = $data_items[array[1]] if array[0] == :item
item = $data_weapons[array[1]] if array[0] == :weapon
item = $data_armors[array[1]] if array[0] == :armor
draw_item_name(item, 6, yy, true, contents.width)
if array[2] > 1
draw_text(6+text_size(item.name).width+36,yy,48,24,"x"+array[2].to_s)
end
yy += line_height
end
if @quest.difficulty != 0
text = "Difficulty: " + @quest.difficulty
draw_text(0,contents.height-line_height,contents.width,line_height,text,2)
end
end
def draw_objective(yy, obj)
draw_text(6,yy,contents.width,24,obj.name)
draw_text(0,yy,contents.width,24,obj.current.to_s+"/"+obj.max.to_s,2)
end
def reset_font_settings
change_color(normal_color)
contents.font.bold = Font.default_bold
contents.font.italic = Font.default_italic
end
end
class Window_QuestTrack < Window_Command
def initialize
super(0,0)
self.openness = 0
end
def quest(quest)
@quest = quest
end
def make_command_list
return unless @quest
if !$game_quests.tracking?.include?(@quest.id)
#add_command("Track Quest", :track)
else
#add_command("Untrack Quest", :untrack)
end
#add_command("Abandon Quest", :abandon, @quest.can_abandon?)
end
def window_height
fitting_height(2)
end
end
class Window_MenuCommand
alias quest_aoc add_original_commands
def add_original_commands
quest_aoc
add_command("Quest Log", :quest, !$game_quests.no_quests?)
end
end
class Scene_Menu
alias quest_ccw create_command_window
def create_command_window
quest_ccw
@command_window.set_handler(:quest, method(:scene_quest))
end
def scene_quest
SceneManager.call(Scene_Quest)
end
end
class Scene_Map
alias quest_start start
alias quest_update update
def start
quest_start
@quest_log = Window_QuestLog.new
@quest_confirm = Window_QuestConfirm.new
@quest_confirm.set_handler(:accept, method(:confirm_accept))
@quest_confirm.set_handler(:decline, method(:confirm_cancel))
@quest_confirm.set_handler(:cancel, method(:confirm_cancel))
@quest_turnin = Window_QuestTurnin.new
@quest_turnin.set_handler(:accept, method(:turnin_accept))
@quest_turnin.set_handler(:decline, method(:confirm_cancel))
@quest_turnin.set_handler(:cancel, method(:confirm_cancel))
@quest_apply = Window_QuestApply.new(@quest_confirm,@quest_turnin)
end
def update(*args)
@quest_log = Window_QuestLog.new if @quest_log.disposed?
quest_update(*args)
end
def show_quest(id, turnin = false)
@quest_apply.show($game_quests[id],turnin)
end
def accepting?
@quest_confirm.active || @quest_turnin.active
end
def confirm_accept
@quest_apply.accept
@quest_apply.hide
end
def confirm_cancel
@quest_apply.hide
end
def turnin_accept
@quest_apply.turnin
@quest_apply.hide
end
def update_call_menu
if $game_system.menu_disabled || $game_map.interpreter.running? || accepting?
@menu_calling = false
else
@menu_calling ||= Input.trigger?(:B)
call_menu if @menu_calling && !$game_player.moving?
end
end
end
class Scene_Base
def accepting?
false
end
end
class Window_QuestLog < Window_Base
def initialize
super(Graphics.width/5*3,0,Graphics.width/5*2,Graphics.height)
self.x = 0 if QUEST_LOG_POSITION == 1
self.x += QUEST_LOG_OFFSET_X
self.y += QUEST_LOG_OFFSET_Y
self.opacity = 0
self.contents.font.size = 18
end
def update
super
return unless Graphics.frame_count % 20 == 0
self.visible = $questlogvisibility
return unless self.visible
self.visible = !$game_quests.no_quests?
self.visible = $game_quests.tracking?.size > 0
return unless self.visible
contents.clear
change_color(crisis_color)
draw_text(0,0,contents.width,18,"Quest Log:",1)
yy = 18;iter = 0
$game_quests.tracking?.each do |id|
quest = $game_quests[id]
next unless quest.accepted? && !quest.turned_in
change_color(system_color)
draw_text(6,yy,contents.width-6,18,quest.name)
change_color(normal_color)
yy += 18
quest.objectives.each do |obj_id, obj|
next if obj.hidden
draw_objective(yy, $game_party.quests[id][obj_id])
yy += 18
end
iter += 1
end
end
def draw_objective(yy, obj)
draw_text(0,yy,contents.width-24,18,obj.name)
draw_text(0,yy,contents.width,18,obj.current.to_s+"/"+obj.max.to_s,2)
end
end
class Window_QuestApply < Window_Base
def initialize(confirm_window, turnin_window)
super(Graphics.width/8,Graphics.width/8,Graphics.width/5*3,Graphics.height-Graphics.width/8*2)
self.openness = 0
@confirm_window = confirm_window
@turnin_window = turnin_window
self.contents.font.size = 18
end
def refresh
return unless @quest
contents.clear
change_color(system_color)
yy = 0
if @quest.qgiver_name != 0
draw_text(0,0,contents.width/2,line_height,@quest.qgiver_name)
yy = line_height
end
if @quest.location != 0
draw_text(contents.width/2,0,contents.width/2,line_height,@quest.location,2)
yy = line_height
end
change_color(crisis_color)
draw_text(0,yy,contents.width,line_height,"Lvl: " + @quest.level.to_s) if @quest.level > 0
draw_text(0,yy,contents.width,line_height,@quest.name,1)
draw_text(0,yy,contents.width,line_height,@quest.difficulty,2) if @quest.difficulty != 0
change_color(normal_color)
draw_text_ex(0,line_height+yy,@quest.desc)
change_color(system_color)
draw_text(0,line_height*8,contents.width,line_height,"Objectives:")
change_color(normal_color)
yy = line_height * 9
@quest.objectives.each do |obj_id, obj|
next if obj.hidden
draw_objective(yy, $game_party.quests[@quest.id][obj_id])
yy += line_height
end
change_color(system_color)
draw_text(0,yy,contents.width,line_height,"Rewards:")
yy += line_height
if @quest.reward_exp > 0
draw_text(6,yy,contents.width/2,line_height,"XP: ")
change_color(normal_color)
draw_text(36,yy,contents.width/2,line_height,@quest.reward_exp)
yy += line_height
end
if @quest.reward_gold > 0
change_color(normal_color)
draw_text(6,yy,contents.width/2,line_height,@quest.reward_gold.to_s)
cx = text_size(@quest.reward_gold).width
change_color(system_color)
draw_text(6+cx,yy,contents.width/2,line_height,Vocab::currency_unit)
end
yy += line_height
change_color(normal_color)
@quest.reward_items.each do |array|
item = $data_items[array[1]] if array[0] == :item
item = $data_weapons[array[1]] if array[0] == :weapon
item = $data_armors[array[1]] if array[0] == :armor
draw_item_name(item, 6, yy, true, contents.width)
if array[2] > 1
draw_text(6+text_size(item.name).width+36,yy,48,24,"x"+array[2].to_s)
end
yy += line_height
end
end
def reset_font_settings
change_color(normal_color)
contents.font.bold = Font.default_bold
contents.font.italic = Font.default_italic
end
def line_height
18
end
def draw_objective(yy, obj)
draw_text(6,yy,contents.width,24,obj.name)
draw_text(0,yy,contents.width,24,obj.current.to_s+"/"+obj.max.to_s,2)
end
def show(quest,turnin)
@quest = quest
return if @quest.turned_in
refresh
open
@confirm_window.quest(@quest)
@confirm_window.open if !turnin
if turnin
@turnin_window.quest(@quest)
@turnin_window.open
end
end
def hide
close
@confirm_window.close
@turnin_window.close
end
def accept
@quest.accept
end
def turnin
@quest.turnin
end
end
class Window_QuestConfirm < Window_HorzCommand
def initialize
super(Graphics.width/8,Graphics.width/8+Graphics.height-Graphics.width/8*2)
self.openness = 0
self.active = false
@enabled = true
refresh
end
def window_width
Graphics.width/5*2
end
def window_height
48
end
def make_command_list
add_command("Accept",:accept)
add_command("Decline",:decline, @enabled)
end
def item_width
width / 2 - padding * 2
end
def open
super
activate
select(0)
end
def quest(quest)
@quest = quest
@enabled = !@quest.force_accept
refresh
end
def cancel_enabled?
super && @enabled
end
end
class Window_QuestTurnin < Window_QuestConfirm
def quest(quest)
@quest = quest
@enabled = true
@enabled = !@quest.completed? if @quest.force_turnin
refresh
end
def make_command_list
return unless @quest
add_command("Complete",:accept,@quest.completed? && !@quest.turned_in)
add_command("Cancel",:decline, @enabled)
end
end
class Game_Party
attr_accessor :quests
attr_accessor :tracking
alias quests_init initialize
def initialize(*args)
quests_init(*args)
@quests = $game_quests.reset_hash unless $game_quests.nil?
@tracking = []
end
end
class Game_Player
alias quest_update update
def update
return if SceneManager.scene.accepting?
quest_update
end
end
class Game_Event
def obj(quest, objective)
$game_quests[quest].objective(objective).current
end
end
class Game_Interpreter
def accept_quest(quest)
$game_quests[quest].accept
end
def ask_accept(quest)
return unless SceneManager.scene.is_a?(Scene_Map)
SceneManager.scene.show_quest(quest)
Fiber.yield while SceneManager.scene.accepting?
end
def abandon_quest(quest)
$game_quests[quest].abandon
end
def fail_quest(quest)
$game_quests[quest].fail
end
def turnin_quest(quest)
$game_quests[quest].turnin
end
def ask_turnin(quest)
return unless SceneManager.scene.is_a?(Scene_Map)
SceneManager.scene.show_quest(quest,true)
Fiber.yield while SceneManager.scene.accepting?
end
def adv_obj(quest, objective, value)
$game_quests[quest].adv_obj(objective, value)
end
def set_obj(quest, objective, value)
$game_quests[quest].set_obj(objective, value)
end
def obj(quest, objective)
$game_quests[quest].objective(objective).current
end
def hide_obj(quest, objective)
$game_quests[quest].objective(objective).hidden = true
end
def show_obj(quest, objective)
$game_quests[quest].objective(objective).hidden = false
end
end
module DataManager
class << self
alias quest_load_game load_game
end
def self.load_game(index)
quest_load_game(index)
$game_quests.check_quests
end
end
-Moonless Night's Modified Glossary:
=begin
#==============================================================================#
# AMN Glossary
# Version 1.01
# Author: AMoonlessNight
# Date: 07 Nov 2019
# Latest: 07 Nov 2019
#==============================================================================#
# UPDATE LOG
#------------------------------------------------------------------------------#
# 07 Nov 2019 - created the script
#==============================================================================#
# TERMS OF USE
#------------------------------------------------------------------------------#
# - Please credit AMoonlessNight or A-Moonless-Night
# - Free for non-commercial use
# - Contact for commercial use
# - I'd love to see your game if you end up using one of my scripts
#==============================================================================#
This script makes a basic glossary scene, where you can select different terms
and see what they mean. It's pretty basic, but could also be used as a simple
journal or a help screen.
Set up the glossary in the editable region below.
You can access the glossary scene by using the following:
SceneManager.call(Scene_Glossary)
There is also an option to have it in the main menu.
#------------------------------------------------------------------------------#
NOTE: It is recommended that you used Killozappit's Word Wrapping Message Boxes
with this script to make the text automatically wrap.
You can find it here:
https://www.rpgmakercentral.com/topic/6964-word-wrapping-message-boxes/
#------------------------------------------------------------------------------#
=end
module AMN_Glossary
#==============================================================================
# ** EDITABLE REGION BELOW
#------------------------------------------------------------------------------
# Change the values in the area below to suit your needs.
#==============================================================================
Menu_Option = true # whether to have the Glossary show as an option
# in the menu
Glossary_Name = "Technical Terms" # what to call the option in the menu
Draw_Page_Numbers = true # whether to draw page numbers at the bottom
Glossary = {
# Each entry should have a unique title, e.g. "Battles", "Items", "Dashing".
# Each entry should have an array [] of strings, e.g. ["text"].
# You can make multiple pages for one entry by closing off the string
# with " followed by a comma.
# E.g. ["this is page one.", "this is page two.", "page three.",]
# You can use escape codes in the text to change the colour, etc. Just make
# sure you use double slashes, e.g. \\c[3]
# Don't use escape codes in the titles.
# You will need to input the line breaks manually, unless you use a word
# wrapping script (like Killozappit's).
#"Title" => ["text", "can be", "split into", "multiple pages"],
"Basic Controls" => ["\\C[3]WASD\\C[0] will move your character up/left/down and right respectively.
\\C[3]Escape\\C[0] will bring up the Main Menu, pausing the game.
\\C[3]Q\\C[0] will Quick-Save the game, which will always be stored in the \\C[1]second save slot\\C[0].
\\C[3]Q\\C[0] + \\C[3]Shift\\C[0] will Quick-Load the game, loading the \\C[1]second save slot\\C[0].
\\C[3]Shift\\C[0] being held in the game world will make you dash.
\\C[3]Shift\\C[0] when viewing an \\C[1]item\\C[0] or \\C[1]skill\\C[0] will bring up more details about it.
\\C[3]Control\\C[0] will fast forward dialogues. When held, it will keep skipping dialogues until reaching something requiring player input."],
#---------------------
"Dashing" => ["Holding down the \\C[3]Shift\\C[0] key while moving will make you dash, spending \\C[4]Stamina Points\\C[0]. When your \\C[4]Stamina Points\\C[0] are out (as displayed in the bottom-left corner of the screen), your dash will automatically stop, and you will switch back to walking. Your \\C[4]Stamina Points\\C[0] will automatically start refilling when you stop moving. You can increase your maximum \\C[4]Stamina Points \\C[0] by the use of perks, or certain \\C[4]Elite Items\\C[0] found rarely in the game."],
#---------------------
"Battle Scenes" => ["When a visible enemy comes in contact with you in the overworld OR when you have walked enough steps in a map that includes random battles, you will enter a \\C[1]Battle Scene\\C[0]. If the battle began because of a random encounter, you can \\C[1]Escape\\C[0] it, ending it instantly. Your chances of a successful \\C[1]Escape\\C[0] depend on your party's total \\C[1]Agility\\C[0], vs the opposing group's \\C[1]Agility\\C[0]. Otherwise, you can only exit the \\C[1]Battle Scene\\C[0] by killing all currently visible opponents."],
#---------------------
"Damage Formulas" => ["Each attack has its own \\C[1]damage formula\\C[0], which you can view by selecting the \\C[1]skill\\C[0] or \\C[1]magia\\C[0] and pressing \\C[3]Shift\\C[0]. In that formula, \\C[1]A\\C[0] will always be the skill's caster, and \\C[1]B\\C[0] the skill's receiver. For example, if the formula of an attack is 'a.atk - b.def', then the damage will be equal to skill user's \\C[1]A\\C[0]'s \\C[1]Attack Stat\\C[0] - attack receiver's \\C[1]B\\C[0]'s \\C[1]Defense Stat\\C[0]."],
#---------------------
"Items in Battle" => ["Items are separated in three categories depending on their use's timing: \\C[1]Usable in battle\\C[0], \\C[1]Usable only from the Inventory\\C[0], or \\C[1]Always Usable\\C[0]. \\C[1]Foods\\C[0], \\C[1]Elixirs\\C[0], \\C[1]Bandages\\C[0] etc, would need time to be used, and are therefore only usable from the inventory. \\C[1]Throwables\\C[0], like \\C[1]grenades\\C[0] can only be used in battle, and will be vital for surviving in Psema. \\C[1]Potions\\C[0] are always usable, however using \\C[1]items\\C[0] in battle will still take up a turn, so you might want to use your \\C[1]buffing items\\C[0] before a battle starts, if you are expecting it (i.e. before a boss battle for example)."],
#---------------------
"Damage Elements" => ["While some \\C[1]skills\\C[0] do not have an \\C[1]Element\\C[0] of their own, and will therefore inherit the \\C[1]Element\\C[0] of default attacks, depending on priorities, others do. Also, while some enemies in Psema (usually the more humanoid ones) do not have a specific \\C[1]Element\\C[0] weakness, most do. Use either your wits or the information you slowly automatically gather in the \\C[1]Bestiary\\C[0] (that you can access from the Main Menu) to learn each opponent's reactions to the various \\C[1]Attack Elements\\C[0]. Enemies can end up receiving up to five times the damage they would normally take, so hitting them with the \\C[1]Element\\C[0] they are weakest against is a huge advantage. Likewise though, many of the best \\C[1]armors\\C[0] in the game can make you equally vulnerable to specific \\C[1]Elements\\C[0]."],
#---------------------
"Elementalism" => ["The specific \\C[1]Attack Elements\\C[0] in Psema are:
\\C[1]Physical\\C[0]: The attack happens with steel against steel.
\\C[1]Normal Attack\\C[0]: The skill or magia will inherit its \\C[1]Element\\C[0] from the rest of your gear or traits. Keep in mind that your normal \\C[1]attack\\C[0] option in combat always belongs to this category.
\\C[1]Fire\\C[0]: Burn your opponents with intense heat. Enemies like zombies, insects, plants, cold elementals and others will be weak to this.
\\C[1]Ice\\C[0]: Likewise, the ability to freeze your opponents can prove deadly against most plant enemies. Also deadly against slimes.
\\C[1]Water\\C[0]: Useful for dealing with fire elementals, and many of the Artist's minions.",
"\\C[1]Wind\\C[0]: Most of the aetherial enemies in Psema, like ghosts or monsters made of smoke are weak against strong gusts, blowing away their form.
\\C[1]Thunder\\C[0]: Artificial constructs that magi often use, along with the more skeletal types of undead, are weak to this. Naturally, it is lethal in underwater uses.
\\C[1]Light\\C[0]: Used by the Trinity's angels, holy damage will tear apart shadows and darkness.
\\C[1]Dark\\C[0]: Useful against spirits of nature, sprites and the like.
\\C[1]Toxic\\C[0]: Damage the opponent from the inside out, toxic damage is used by \\C[1]blood magi\\C[0]. While not particularly strong, there are very few creatures in Psema with a resistance to it. Useless against undead and slimes.",
"\\C[1]Psychic\\C[0]: Like \\C[1]Toxic Element\\C[0], psychic attacks are attacks directly to the mind, and very few beings in Psema can resist them. Useless against zombies and non-sentient beings.
\\C[1]Chroma\\C[0]: Color is directly linked to the idea of life and vitality, and by siphoning the vile magias of the Color out of Space, draining it from enemies can kill them. Enemies that change colors in battles, like slimes and many bosses, are particularly vulnerable to this."],
#---------------------
"Damage Types" => ["Apart from damage's element, damage is also separated into two categories: \\C[1]physical\\C[0] and \\C[1]magical\\C[0]. This is where parameters like \\C[1]magical evasion\\C[0] and \\C[1]counterattack\\C[0] come into play. Your defensive parameters are always aimed at dealing with one of these two types of damage, not both. You have to keep both this, the elements and which stats the attack formulas favor in mind to take down Psema's most dangerous enemies.
\\C[1]Physical damage\\C[0] parameters: Evasion, Counterattack, Physical Damage Rate.
\\C[1]Magical damage\\C[0] parameters: Magical Evasion, Magic Reflection, Magical Damage Rate."],
#---------------------
"Bosses" => ["Bosses are much tougher than the average enemies you face in their areas. They will usually have a separate, longer \\C[1]health bar\\C[0] above the rest of the enemy troops. They will usually trigger some kind of extra attack or status at 75/50/25% of their max health respectively, so you might want to avoid just bursting them with everything you've got. They are also immune to insta-kill statuses, liked \\C[1]Invoked Death\\C[0]."],
#---------------------
"Crafting" => ["Psema is full of raw materials that you can turn into useful tools or items. Raw meat can be cooked, metal bars can be turned into armor and so forth. An adventurer can learn how to create items with existing materials by learning \\C[1]recipes\\C[0], which can be bought from shops or found as loot around the world. Learnt recipes can be viewed at any time through \\C[1]Recipe Viewer\\C[0] in the \\C[1]Main Menu\\C[0], but crafting can only be done from \\C[1]specific platforms\\C[0], which can be found in the overworld. Said platforms will always have their name floating above them. Recipes are separated into four categories: \\C[1]cooking\\C[0], \\C[1]alchemy\\C[0], \\C[1]smithing\\C[0] and \\C[1]voodoo\\C[0].",
"Each category has its own experience bar, and learnt recipes will only appear as craftable if you have reached their required level (learning the recipes can be done at any time, it's just that the options won't appear as available until reaching said level).
\\C[1]Cooking\\C[0]: Necessary for making food gathered from animals around Psema edible without danger of sickness. Also boosts healing provided by said foods.
\\C[1]Alchemy\\C[0]: Used to turn the various herbs collected from the world into potions and elixirs.
\\C[1]Smithing\\C[0]: Used to create armors and weapons, using metal bars, which in turn are made from gathered raw ores.",
"\\C[1]Voodoo\\C[0]: Used to create artifacts and other magia-based items."],
#---------------------
"Romantic Encounters" => ["There are two primary ways to permanently increase your stats in Psema, other than leveling: 1)By using certain \\C[1]Elite Items\\C[0]. 2)By having unique 'romantic' encounters. The second will tend to increase the stats of both participants, meaning if you can trigger one of these with another of your party members, both will receive stat boosts. Having higher \\C[1]testosterone\\C[0] will often unlock more options, allowing your character specifically to gain even higher stats.",
"Keep in mind, \\C[1]estrogen\\C[0]-based encounters might actually decrease your stats, though they can of course have other positive effects. Romantic encounters between party members can trigger at specific checkpoints, if you have romanced a specific party member enough. The condition check will happen only when you have reached the required romance level for said encounter to happen, so do not worry about missing timings. These are all tied to your relationship with the party members though, which is affected by many factors, including your \\C[1]estrogen\\C[0] or \\C[1]testosterone\\C[0] levels,",
"your current \\C[1]karma\\C[0], your dialogue options, your political beliefs and even how much completely different characters dislike you. You will also be given the option to back out almost every time, but doing so will severly damage your relationship with said party member. Keep in mind that some characters tend to be very jealous, so pursuing romances with others will actually decrease your romance with them. If two characters don't like each other, then naturally siding with one will ruin your chances with the other."],
#---------------------
"Insanity" => ["Insanity is an altered perception of reality, and not necessairly a false one. When you choose to go through specific events that are traumatic, like experiencing a vision of a massacre or choosing to sell your own blood for example, your insanity will increase by 1 (maximum 8). Direct or even simply extensive contact with the Others can also raise insanity. Once insanity goes up, it never goes back down. A higher insanity will make Psema deadlier, with more enemies spawning, strange diseases appearing, and traps being set. Insanity will also change Psema visually in various ways. Seeing ghosts is one of the most common symptoms,",
"but there is no limit to the strangeness that can be caused by \\C[1]Insanity\\C[0], including the spawning of more \\C[1]Elite Items\\C[0]."],
#---------------------
"Perception" => ["Unlike insanity, perception is a stat that is almost purely beneficiary, and the higher it is (max 10) the better. Apart from unlocking more \\C[1]dialogue options\\C[0] which can range from giving free exp. boosts to completely changing the story and discerning lies from truth, \\C[1]perceptiopn\\C[0] also allows you to easily spot \\C[1]invisible treasures\\C[0] in the game world, from secret vaults hidden in walls to amber hidden in random trees. The only possible negative effect is that having high enough perception might allow you to see through lies you would rather not, in ~quite rare~ instances, raising your \\C[1]insanity\\C[0] because your mind noticed things it was not supposed to."],
#---------------------
"Dialogue Checks" => ["Quite often, the game will check how high or low certain character variables are. These can be your fighting stats, your testosterone, estrogen, karma, perception, and also haggling skill, rhetorics, academics, deception and intellect. Haggling is related to transactions, rhetorics to political dialogues, academics to world knowledge, deception to flat-out making stuff up and keeping your stories coherent, and intellect to your puzzle-solving ability, in the most literal sense."],
#---------------------
"Magias" => ["Magia points are a resource required to cast \\C[1]magias\\C[0], which are an alternative move type to \\C[1]skills\\C[0]. While magias can be acquired by all PC classes, only \\C[1]blood magi\\C[0] can naturally gain magia points upon leveling up in order to fuel them. Other classes will have to use either \\C[1]Elite Items\\C[0] or specific gear that raises maximum magia points. Unlike \\C[1]SP\\C[0], your \\C[1]MP\\C[0] are a finite resource, and can only be recovered by resting. There are no respective mana potions in Psema, so your only option for continuously using magias in your adventures is to reduce the MP cost of your magias through specific items or by increasing your maximum \\C[1]magia points\\C[0].",
"Magias are generally powered by your \\C[1]affinity (AFF)\\C[0] stat. Unlike skills, magias have no usage limit."],
#---------------------
"Quests" => ["Quests are one of your best ways of earning experience in Psema, along with improved reputation with certain NPCs. When a quest is offered to you, you will be given a choice to \\C[1]accept\\C[0] or \\C[1]refuse\\C[0] it. Such chances only come once, so be careful. Refusing a quest will permanently deny you a chance to complete it, and will also give an immediate small exp. boost. An accepted quest will appear in your \\C[1]quest log\\C[0] from the \\C[1]main menu\\C[0]. You can view information regarding that quest at any time from there. Quests are usually completed upon returning to the questgiver, after having fullfilled all their \\C[1]objectives\\C[0]. Quest objectives will often appear upon completing the previous ones (for example the objective to return to the quest giver)."],
#---------------------
"Temple" => ["Accessible from the \\C[1]main menu\\C[0], \\C[1]Temple\\C[0] allows you to purchase permanent upgrades for your characters. Unlike \\C[1]perks\\C[0], these upgrades (including new skills/magias or permanent buffs) have no downsides, and are purely beneficial. The \\C[1]currency\\C[0] used for these purchases are \\C[1]Waves\\C[0]. Starting from 1 available \\C[1]Wave\\C[0], a new one is earned every time a character Levels up. There are no prerequisites for any of the available upgrades, study your character and pick them in any order you want. "],
#---------------------
"Sneaking" => ["Depending on your choices you may never have to rely on it, but quite often, enemies will be patrolling areas, looking for intruders. Once they spot you, they will start chasing after you, often sounding the alarm as well. Enemies tend to spot you only if you are within their \\C[1]line of sight\\C[0], which, depending on the enemy type, can range from a few feet in front of them to right across the room. Bad guys in Psema are often known for their lack of peripheral vision, so their eyesight is usually cone-shaped. Hide in corners or behind objects. Also keep in mind that some enemies instead use a \\C[1]proximity trigger\\C[0]. For example, wolves will smell you regardless of direction, if you are near them. Watch your step."],
# Copy and paste as needed; just make sure there's a comma after each: ],
#==============================================================================
# ** END OF EDITABLE REGION
#------------------------------------------------------------------------------
# Please do not edit below this point unless you know what you are doing.
#==============================================================================
}
end
class Window_AMNGlossary < Window_Selectable
attr_reader :info_window
def initialize(x, y)
make_item_list
super(x, y, window_width, window_height)
refresh
activate
end
def window_width
160
end
def window_height
Graphics.height
end
def make_item_list
@data = AMN_Glossary::Glossary.keys
end
def item_max
@data ? @data.size : 1
end
def draw_item(index)
item = @data[index]
if item
rect = item_rect_for_text(index)
rect.width -= 4
draw_text(rect, item)
end
end
def info_window=(info_window)
@info_window = info_window
update
end
def update
super
@info_window.category = @data[index] if @info_window
end
end
class Window_AMNInfo < Window_Base
def initialize(x, y, width, height)
super(x, y, width, height)
@category = nil
setup_data
end
def setup_data
@data = AMN_Glossary::Glossary.clone
refresh
end
def index_max
return 0 unless @category && @data.key?(@category)
@data[@category].size - 1
end
def increase_index
prev = @index
@index = [@index + 1, index_max].min
@index = 0 if prev == index_max
refresh
end
def decrease_index
prev = @index
@index = [@index - 1, 0].max
@index = index_max if prev == 0
refresh
end
def category=(category)
return if @category == category
@category = category
@index = 0
refresh
end
def refresh
contents.clear
draw_info
end
def draw_info
return unless @category
item = @data[@category][@index]
return unless item
draw_text_ex(0, 0, item)
reset_font_settings
if AMN_Glossary::Draw_Page_Numbers
page = "Page #{@index+1}/#{index_max+1}"
c = text_size(page).width
page.insert(0, "\\c[16]"); page.insert(11, "\\c[0]")
draw_text_ex(contents_width - c, contents.height - line_height, page)
end
end
end
class Scene_Glossary < Scene_MenuBase
def start
super
create_glossary_window
create_info_window
end
def create_glossary_window
@glossary_window = Window_AMNGlossary.new(0,0)
@glossary_window.set_handler(:ok, method(:on_glossary_ok))
@glossary_window.set_handler(:cancel, method(:return_scene))
@glossary_window.select(0)
end
def create_info_window
x = @glossary_window.x + @glossary_window.width
width = Graphics.width - @glossary_window.width
height = @glossary_window.height
@info_window = Window_AMNInfo.new(x, 0, width, height)
@glossary_window.info_window = @info_window
end
def on_glossary_ok
@info_window.increase_index
@glossary_window.activate
end
end
class Window_MenuCommand < Window_Command
alias amn_glossary_windmenucmd_addogcommands add_original_commands
def add_original_commands
amn_glossary_windmenucmd_addogcommands
if AMN_Glossary::Menu_Option
add_command(AMN_Glossary::Glossary_Name, :amn_glossary, main_commands_enabled)
end
end
end
class Scene_Menu < Scene_MenuBase
def command_amn_glossary
SceneManager.call(Scene_Glossary)
end
alias amn_glossary_scenemenu_createcomwind create_command_window
def create_command_window
amn_glossary_scenemenu_createcomwind
if AMN_Glossary::Menu_Option
@command_window.set_handler(:amn_glossary, method(:command_amn_glossary))
end
end
end
Finally, Kilozappit's Word Wrapping itself.
Downloads / Referenced Files
Log in, then follow the RPG Maker Developers Group to see these download links.
Log in to downloadLicense / Terms Note
#--- Free to use in any project, commercial or non-commercial, with credit given # - - Though a donation's always a nice way to say thank you~ (I also accept actual thank you's) #Visibility of quest log on map $questlogvisibility = false
Creator Claims / Removal
If you are the original creator and want this listing reassigned, edited, or removed, join BMMPlay and contact the moderators with proof that matches the original RPG Maker Web profile, linked GitHub, itch.io page, or another public creator identity.
Replies (0)
No replies yet.
Topic Summary
Loading summary...