mirror of
https://github.com/2006-Scape/apollo.git
synced 2026-07-02 16:49:12 +00:00
137 lines
4.4 KiB
Ruby
137 lines
4.4 KiB
Ruby
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 }
|