Class: Lich::DragonRealms::DRSkill

Inherits:
Object
  • Object
show all
Defined in:
documented/dragonrealms/drinfomon/drskill.rb

Overview

Represents a skill in the DragonRealms game. This class manages skill data, including experience and rank.

Examples:

Creating a new skill

skill = Lich::DragonRealms::DRSkill.new("Evasion", 10, 150, 75)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, rank, exp, percent) ⇒ DRSkill

Initializes a new DRSkill instance.

Parameters:

  • name (String)

    The name of the skill.

  • rank (Integer)

    The earned rank in the skill.

  • exp (Integer)

    The experience points in the skill.

  • percent (Integer)

    The percentage to the next rank from 0 to 100.



29
30
31
32
33
34
35
36
37
38
39
40
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 29

def initialize(name, rank, exp, percent)
  @name = name # skill name like 'Evasion'
  @rank = rank.to_i # earned ranks in the skill
  # Skill mindstate x/34
  # Hardcode caped skills to 34/34
  @exp = rank.to_i >= 1750 ? 34 : exp.to_i
  @percent = percent.to_i # percent to next rank from 0 to 100
  @baseline = rank.to_i + (percent.to_i / 100.0)
  @current = rank.to_i + (percent.to_i / 100.0)
  @skillset = lookup_skillset(@name)
  @@list.push(self) unless @@list.find { |skill| skill.name == @name }
end

Instance Attribute Details

#baselineObject

Returns the value of attribute baseline.



21
22
23
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 21

def baseline
  @baseline
end

#currentObject

Returns the value of attribute current.



21
22
23
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 21

def current
  @current
end

#expObject

Returns the value of attribute exp.



21
22
23
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 21

def exp
  @exp
end

#nameObject (readonly)

Returns the value of attribute name.



20
21
22
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 20

def name
  @name
end

#percentObject

Returns the value of attribute percent.



21
22
23
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 21

def percent
  @percent
end

#rankObject

Returns the value of attribute rank.



21
22
23
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 21

def rank
  @rank
end

#skillsetObject (readonly)

Returns the value of attribute skillset.



20
21
22
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 20

def skillset
  @skillset
end

Class Method Details

.clear_mind(val) ⇒ void

This method returns an undefined value.

Clears the experience of a specified skill.

Parameters:

  • val (String)

    The name of the skill.



164
165
166
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 164

def self.clear_mind(val)
  self.find_skill(val).exp = 0
end

.convert_rexp_str_to_seconds(time_string) ⇒ Integer

Converts a rested experience time string to seconds.

Parameters:

  • time_string (String)

    The time string to convert.

Returns:

  • (Integer)

    The total seconds represented by the time string.



233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 233

def self.convert_rexp_str_to_seconds(time_string)
  # Handle empty, nil, or specific "zero" cases (less than a minute is zero because it can get stuck there)
  return 0 if time_string.nil? ||
              time_string.to_s.strip.empty? ||
              time_string.include?("none") ||
              time_string.include?("less than a minute")

  total_seconds = 0

  # Extract hours and optional minutes (e.g., "4:38 hours" or "6 hour")
  # Ruby's match returns a MatchData object or nil
  if (hour_match = time_string.match(/(\d+):?(\d+)?\s*hour/))
    hours = hour_match[1].to_i
    total_seconds += hours * 60 * 60

    # Handle the minutes part of a "4:38" format
    if hour_match[2]
      total_seconds += hour_match[2].to_i * 60
      return total_seconds
    end
  end

  # Extract standalone minutes (e.g., "38 minutes")
  if (minute_match = time_string.match(/(\d+)\s*minute/))
    total_seconds += minute_match[1].to_i * 60
  end

  total_seconds
end

.exp_modifiersHash

Returns the experience modifiers for skills.

Returns:

  • (Hash)

    A hash of skill names and their corresponding modifiers.



133
134
135
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 133

def self.exp_modifiers
  @@exp_modifiers
end

.find_skill(val) ⇒ DRSkill?

Finds a skill by its name or alias.

Parameters:

  • val (String)

    The name or alias of the skill.

Returns:

  • (DRSkill, nil)

    The DRSkill instance if found, nil otherwise.



226
227
228
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 226

def self.find_skill(val)
  @@list.find { |data| data.name == self.lookup_alias(val) }
end

.gained_exp(val) ⇒ Float

Calculates the gained experience for a skill.

Parameters:

  • val (String)

    The name of the skill.

Returns:

  • (Float)

    The gained experience, rounded to two decimal places.



65
66
67
68
69
70
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 65

def self.gained_exp(val)
  skill = self.find_skill(val)
  if skill
    return skill.current ? (skill.current - skill.baseline).round(2) : 0.00
  end
end

.gained_skillsArray<Hash>

Returns the list of gained skills.

Returns:

  • (Array<Hash>)

    An array of hashes containing skill names and changes.



58
59
60
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 58

def self.gained_skills
  @@gained_skills
end

.getmodrank(val) ⇒ Integer?

Retrieves the modified rank of a specified skill, including modifiers.

Parameters:

  • val (String)

    The name of the skill.

Returns:

  • (Integer, nil)

    The modified rank of the skill or nil if not found.



178
179
180
181
182
183
184
185
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 178

def self.getmodrank(val)
  skill = self.find_skill(val)
  if skill
    rank = skill.rank.to_i
    modifier = self.exp_modifiers[skill.name].to_i
    rank + modifier
  end
end

.getpercent(val) ⇒ Integer

Retrieves the percentage to the next rank of a specified skill.

Parameters:

  • val (String)

    The name of the skill.

Returns:

  • (Integer)

    The percentage to the next rank.



198
199
200
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 198

def self.getpercent(val)
  self.find_skill(val).percent.to_i
end

.getrank(val) ⇒ Integer

Retrieves the rank of a specified skill.

Parameters:

  • val (String)

    The name of the skill.

Returns:

  • (Integer)

    The rank of the skill.



171
172
173
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 171

def self.getrank(val)
  self.find_skill(val).rank.to_i
end

.getskillset(val) ⇒ String

Retrieves the skillset associated with a specified skill.

Parameters:

  • val (String)

    The name of the skill.

Returns:

  • (String)

    The skillset of the skill.



205
206
207
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 205

def self.getskillset(val)
  self.find_skill(val).skillset
end

.getxp(val) ⇒ Integer

Retrieves the experience points of a specified skill.

Parameters:

  • val (String)

    The name of the skill.

Returns:

  • (Integer)

    The experience points of the skill.



190
191
192
193
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 190

def self.getxp(val)
  skill = self.find_skill(val)
  skill.exp.to_i
end

.handle_exp_change(name, new_exp) ⇒ void

This method returns an undefined value.

Handles the experience change for a skill and records it if increased.

Parameters:

  • name (String)

    The name of the skill.

  • new_exp (Integer)

    The new experience value.



76
77
78
79
80
81
82
83
84
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 76

def self.handle_exp_change(name, new_exp)
  return unless UserVars.echo_exp

  old_exp = DRSkill.getxp(name)
  change = new_exp.to_i - old_exp.to_i
  if change > 0
    DRSkill.gained_skills << { skill: name, change: change }
  end
end

.include?(val) ⇒ Boolean

Checks if a skill exists in the list.

Parameters:

  • val (String)

    The name of the skill.

Returns:

  • (Boolean)

    True if the skill exists, false otherwise.



89
90
91
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 89

def self.include?(val)
  !self.find_skill(val).nil?
end

.listArray<DRSkill>

Returns the list of all skills.

Returns:

  • (Array<DRSkill>)

    An array of all DRSkill instances.



219
220
221
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 219

def self.list
  @@list
end

.listallvoid

This method returns an undefined value.

Lists all skills with their details.



211
212
213
214
215
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 211

def self.listall
  @@list.each do |i|
    echo "#{i.name}: #{i.rank}.#{i.percent}% [#{i.exp}/34]"
  end
end

.lookup_alias(skill) ⇒ String

Looks up the alias for a skill based on the guild’s skill aliases.

Parameters:

  • skill (String)

    The name of the skill.

Returns:

  • (String)

    The resolved skill name or alias.



266
267
268
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 266

def self.lookup_alias(skill)
  @@skills_data[:guild_skill_aliases][DRStats.guild][skill] || skill
end

.resetvoid

This method returns an undefined value.

Resets the gained skills and start time.



44
45
46
47
48
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 44

def self.reset
  @@gained_skills = []
  @@start_time = Time.now
  @@list.each { |skill| skill.baseline = skill.current }
end

.rested_active?Boolean

Checks if rested experience is active.

Returns:

  • (Boolean)

    True if both stored and usable rested experience are greater than zero.



157
158
159
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 157

def self.rested_active?
  @@rexp_stored > 0 && @@rexp_usable > 0
end

.rested_exp_refreshInteger

Returns the refresh time for rested experience.

Returns:

  • (Integer)

    The refresh time in seconds.



151
152
153
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 151

def self.rested_exp_refresh
  @@rexp_refresh
end

.rested_exp_storedInteger

Returns the stored rested experience.

Returns:

  • (Integer)

    The stored rested experience in seconds.



139
140
141
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 139

def self.rested_exp_stored
  @@rexp_stored
end

.rested_exp_usableInteger

Returns the usable rested experience.

Returns:

  • (Integer)

    The usable rested experience in seconds.



145
146
147
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 145

def self.rested_exp_usable
  @@rexp_usable
end

.start_timeTime

Returns the start time of the skill tracking.

Returns:

  • (Time)

    The start time.



52
53
54
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 52

def self.start_time
  @@start_time
end

.update(name, rank, exp, percent) ⇒ void

This method returns an undefined value.

Updates the skill’s rank, experience, and percentage.

Parameters:

  • name (String)

    The name of the skill.

  • rank (Integer)

    The new rank of the skill.

  • exp (Integer)

    The new experience points of the skill.

  • percent (Integer)

    The new percentage to the next rank.



99
100
101
102
103
104
105
106
107
108
109
110
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 99

def self.update(name, rank, exp, percent)
  self.handle_exp_change(name, exp)
  skill = self.find_skill(name)
  if skill
    skill.rank = rank.to_i
    skill.exp = skill.rank.to_i >= 1750 ? 34 : exp.to_i
    skill.percent = percent.to_i
    skill.current = rank.to_i + (percent.to_i / 100.0)
  else
    DRSkill.new(name, rank, exp, percent)
  end
end

.update_mods(name, rank) ⇒ void

This method returns an undefined value.

Updates the experience modifiers for a skill.

Parameters:

  • name (String)

    The name of the skill.

  • rank (Integer)

    The new rank modifier.



116
117
118
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 116

def self.update_mods(name, rank)
  self.exp_modifiers[self.lookup_alias(name)] = rank.to_i
end

.update_rested_exp(stored, usable, refresh) ⇒ void

This method returns an undefined value.

Updates the rested experience values.

Parameters:

  • stored (String)

    The stored rested experience as a string.

  • usable (String)

    The usable rested experience as a string.

  • refresh (String)

    The refresh time for rested experience as a string.



125
126
127
128
129
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 125

def self.update_rested_exp(stored, usable, refresh)
  @@rexp_stored = self.convert_rexp_str_to_seconds(stored)
  @@rexp_usable = self.convert_rexp_str_to_seconds(usable)
  @@rexp_refresh = self.convert_rexp_str_to_seconds(refresh)
end

Instance Method Details

#lookup_skillset(skill) ⇒ String

Looks up the skillset for a given skill.

Parameters:

  • skill (String)

    The name of the skill.

Returns:

  • (String)

    The skillset associated with the skill.



273
274
275
# File 'documented/dragonrealms/drinfomon/drskill.rb', line 273

def lookup_skillset(skill)
  @@skills_data[:skillsets].find { |_skillset, skills| skills.include?(skill) }.first
end