mirror of
https://github.com/2006-Scape/apollo.git
synced 2026-07-06 08:40:03 +00:00
Housekeeping
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0"?>
|
||||
<plugin>
|
||||
<id>quest</id>
|
||||
<version>0.9</version>
|
||||
<name>Quest</name>
|
||||
<description>Adds </description>
|
||||
<authors>
|
||||
<author>Major</author>
|
||||
</authors>
|
||||
<scripts>
|
||||
<script>repository.rb</script>
|
||||
</scripts>
|
||||
<dependencies>
|
||||
<dependency>attributes</dependency>
|
||||
</dependencies>
|
||||
</plugin>
|
||||
@@ -0,0 +1,132 @@
|
||||
|
||||
# Defines a quest with the specified name.
|
||||
def quest(name, stage_names)
|
||||
stages = {}
|
||||
stage_names.each_with_index { |stage, index| stages[stage] = QuestStage.new(stage, index, name) }
|
||||
|
||||
QUESTS[name] = Quest.new(name, stages)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# The repository of quests.
|
||||
QUESTS = {}
|
||||
|
||||
# An ingame Quest.
|
||||
class Quest
|
||||
attr_reader :name
|
||||
|
||||
# Creates the Quest.
|
||||
def initialize(name, stages)
|
||||
fail "Quest name must be a symbol, received '#{name}'." unless name.is_a?(Symbol)
|
||||
@name = name
|
||||
@stages = stages
|
||||
end
|
||||
|
||||
# Gets the finishing quest stage (i.e. the stage that indicates the Player has completed the
|
||||
# quest).
|
||||
def final_stage
|
||||
@stages.last
|
||||
end
|
||||
|
||||
# Gets the starting quest stage.
|
||||
def initial_stage
|
||||
@stages.first
|
||||
end
|
||||
|
||||
# Gets the QuestStage with the specified name.
|
||||
def stage(name)
|
||||
stage = @stages[name]
|
||||
fail "No stage named #{name} exists in #{@name}." if stage.nil?
|
||||
stage
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# A stage in a quest, indicating the progress of a Player.
|
||||
class QuestStage
|
||||
attr_reader :name, :index
|
||||
|
||||
# Creates the QuestProgress.
|
||||
def initialize(name, index, quest, log_text = nil)
|
||||
@name = name
|
||||
@index = index
|
||||
@quest = quest
|
||||
@log_text = log_text
|
||||
end
|
||||
|
||||
# Returns whether or no this quest stage should be logged.
|
||||
def logged
|
||||
!@log_text.nil?
|
||||
end
|
||||
|
||||
# Gets the log text for this stage.
|
||||
def log_text
|
||||
fail 'Cannot get the log text from an unlogged quest stage.' unless logged
|
||||
@log_text
|
||||
end
|
||||
|
||||
# Defines the equality operator.
|
||||
def ==(other)
|
||||
@index == index_of(other)
|
||||
end
|
||||
|
||||
# Defines the not equal operator.
|
||||
def !=(other)
|
||||
@index != index_of(other)
|
||||
end
|
||||
|
||||
# Defines the greater than or equal to operator.
|
||||
def >=(other)
|
||||
@index >= index_of(other)
|
||||
end
|
||||
|
||||
# Defines the greater than operator.
|
||||
def >(other)
|
||||
@index > index_of(other)
|
||||
end
|
||||
|
||||
# Defines the less than operator.
|
||||
def <(other)
|
||||
@index < index_of(other)
|
||||
end
|
||||
|
||||
# Defines the less than or equal to operator.
|
||||
def <=(other)
|
||||
@index <= index_of(other)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Gets the index of the QuestStage with the specified name.
|
||||
def index_of(name)
|
||||
QUESTS[@quest].stage(name).index
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# Define method_missing for player
|
||||
class Player
|
||||
|
||||
# Override method_missing to return a QuestStage if the method name indicates quest.
|
||||
def method_missing(symbol, *args)
|
||||
unless args.nil?
|
||||
arg = args[0]
|
||||
args[0] = arg.name if arg.is_a?(QuestStage)
|
||||
end
|
||||
|
||||
result = super(symbol, *args)
|
||||
string = symbol.to_s
|
||||
|
||||
if string.end_with?('_progress')
|
||||
name = string[0..-10] # Cut the '_progress' from the end
|
||||
quest = QUESTS[name.to_sym]
|
||||
fail "No Quest with the name '#{name}' exists." if quest.nil?
|
||||
|
||||
result = quest.stage(result)
|
||||
end
|
||||
|
||||
result
|
||||
end
|
||||
|
||||
end
|
||||
Reference in New Issue
Block a user