mirror of
https://github.com/2006-Scape/apollo.git
synced 2026-07-07 08:39:17 +00:00
Housekeeping
This commit is contained in:
@@ -0,0 +1,136 @@
|
||||
require 'java'
|
||||
|
||||
java_import 'org.apollo.game.model.entity.Skill'
|
||||
|
||||
private
|
||||
|
||||
# Contains potion-related constants.
|
||||
module Constants
|
||||
|
||||
# The id of the sound made when drinking a potion.
|
||||
DRINK_POTION_SOUND = 334
|
||||
|
||||
# The id of an empty vial.
|
||||
EMPTY_VIAL_ID = 229
|
||||
|
||||
# The delay between drinking potions
|
||||
POTION_DELAY = 2
|
||||
end
|
||||
|
||||
# A drinkable potion.
|
||||
class Potion < Consumable
|
||||
|
||||
def initialize(id, name, doses)
|
||||
super(name, id, Constants::DRINK_POTION_SOUND, Constants::POTION_DELAY, ConsumableType::POTION)
|
||||
@doses = doses
|
||||
end
|
||||
|
||||
def consume(player)
|
||||
index = @doses.find_index(id) + 1
|
||||
|
||||
if index != @doses.length # Consumable removes the old potion for us, so don't do it here.
|
||||
player.inventory.add(@doses[index])
|
||||
player.send_message("You drink some of your #{name} potion.")
|
||||
|
||||
remaining = "You have #{@doses.length - index} dose#{'s' unless index == 3} of potion left."
|
||||
player.send_message(remaining)
|
||||
else
|
||||
player.send_message('You drink the last of your potion.')
|
||||
player.inventory.add(Constants::EMPTY_VIAL_ID)
|
||||
end
|
||||
|
||||
drink(player)
|
||||
end
|
||||
|
||||
def drink(_player)
|
||||
# Override to provide functionality
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# A potion that can be consumed to boost the current skill level of a stat (or stats).
|
||||
class BoostingPotion < Potion
|
||||
|
||||
def initialize(id, name, doses, skills, boost)
|
||||
super(id, name, doses)
|
||||
@skill_ids = skills.is_a?(Array) ? skills : [skills]
|
||||
@boost = boost
|
||||
end
|
||||
|
||||
def drink(player)
|
||||
@skill_ids.each do |id|
|
||||
skill = player.skill_set.skill(id)
|
||||
max = skill.maximum_level
|
||||
level = [skill.current_level, max].min
|
||||
|
||||
new_current = @boost.call(max, level).floor
|
||||
player.skill_set.set_skill(id, Skill.new(skill.experience, new_current, max))
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# Returns the parameters for the potion, as an array. Fails if any of the specified keys do not
|
||||
# exist.
|
||||
def get_parameters(hash, keys)
|
||||
fail "Hash must contain the following keys: #{keys.join(', ')}." unless hash.has_keys?(*keys)
|
||||
|
||||
keys.map { |key| hash[key] }
|
||||
end
|
||||
|
||||
# Appends a potion to the list of consumables.
|
||||
def potion(hash)
|
||||
class_name = 'Potion'
|
||||
keys = [:name, :doses]
|
||||
|
||||
unless (hash.size == 2)
|
||||
keys << :skills << :boost
|
||||
class_name.prepend('Boosting')
|
||||
end
|
||||
|
||||
parameters = get_parameters(hash, keys)
|
||||
doses = hash[:doses]
|
||||
doses.each { |dose| append_consumable(Object.const_get(class_name).new(dose, *parameters)) }
|
||||
end
|
||||
|
||||
# Some frequently-used boosts and skills
|
||||
# Lambda parameters are | maximum_skill_level, current_skill_level |
|
||||
basic_combat_boost = ->(_, level) { level * 1.10 + 3 }
|
||||
super_combat_boost = ->(_, level) { level * 1.15 + 5 }
|
||||
non_combat_boost = ->(_, level) { level + 3 }
|
||||
|
||||
ATTACK, STRENGTH, DEFENCE = Skill::ATTACK, Skill::STRENGTH, Skill::DEFENCE
|
||||
MAGIC, RANGED, PRAYER = Skill::MAGIC, Skill::RANGED, Skill::PRAYER
|
||||
|
||||
all_skills = (Skill::ATTACK..Skill::RUNECRAFT).to_a
|
||||
combat_skills = [ATTACK, STRENGTH, DEFENCE, MAGIC, RANGED]
|
||||
|
||||
# Boosting potions:
|
||||
# Note that the order of the elements must be: :name, :doses, :skills, :boost.
|
||||
potion name: :attack, doses: [2428, 121, 123, 125], skills: ATTACK, boost: basic_combat_boost
|
||||
potion name: :strength, doses: [113, 115, 117, 119], skills: STRENGTH, boost: basic_combat_boost
|
||||
potion name: :defence, doses: [2432, 133, 135, 137], skills: DEFENCE, boost: basic_combat_boost
|
||||
|
||||
potion name: :agility, doses: [3032, 3034, 3036, 3038], skills: Skill::AGILITY,
|
||||
boost: non_combat_boost
|
||||
potion name: :fishing, doses: [2438, 151, 153, 155], skills: Skill::FISHING,
|
||||
boost: non_combat_boost
|
||||
potion name: :prayer, doses: [2434, 139, 141, 143], skills: Skill::PRAYER,
|
||||
boost: ->(_, level) { level / 4 + 7 }
|
||||
|
||||
potion name: :restore, doses: [2430, 127, 129, 131], skills: combat_skills,
|
||||
boost: ->(_, level) { [level * 1.3 + 10, max].min }
|
||||
potion name: :super_restore, doses: [3024, 3026, 3028, 3030], skills: all_skills,
|
||||
boost: ->(_, level) { [level * 1.25 + 8, max].min }
|
||||
|
||||
potion name: :super_attack, doses: [2436, 145, 147, 149], skills: ATTACK, boost: super_combat_boost
|
||||
potion name: :super_strength, doses: [2440, 157, 159, 161], skills: STRENGTH,
|
||||
boost: super_combat_boost
|
||||
potion name: :super_defence, doses: [2442, 163, 165, 167], skills: DEFENCE,
|
||||
boost: super_combat_boost
|
||||
|
||||
potion name: :ranging, doses: [2444, 169, 171, 173], skills: RANGED,
|
||||
boost: ->(_, level) { level * 1.10 + 4 }
|
||||
|
||||
potion name: :magic, doses: [3040, 3042, 3044, 3046], skills: MAGIC,
|
||||
boost: ->(_, level) { level + 4 }
|
||||
Reference in New Issue
Block a user