Class: Player

Inherits:
Creature show all
Defined in:
lib/terminal_hero/classes/player.rb

Overview

Represents the player’s character

Instance Attribute Summary collapse

Attributes inherited from Creature

#avatar, #coords, #current_hp, #level, #max_hp, #name

Instance Method Summary collapse

Methods inherited from Creature

#calc_damage_dealt, #calc_damage_range, #calc_destination, #dead?, #flee, #heal_hp, #health_color, #receive_damage

Constructor Details

#initialize(name: "Player", coords: GameData::DEFAULT_COORDS, level: 1, stats: GameData::DEFAULT_STATS, health_lost: 0, current_xp: 0, avatar: "@".colorize(:blue)) ⇒ Player

Returns a new instance of Player.



9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/terminal_hero/classes/player.rb', line 9

def initialize(
  name: "Player",
  coords: GameData::DEFAULT_COORDS,
  level: 1,
  stats: GameData::DEFAULT_STATS,
  health_lost: 0,
  current_xp: 0,
  avatar: "@".colorize(:blue)
)
  super(name, coords, stats, health_lost, level, avatar)
  @current_xp = current_xp
end

Instance Attribute Details

#current_xpObject (readonly)

Returns the value of attribute current_xp.



7
8
9
# File 'lib/terminal_hero/classes/player.rb', line 7

def current_xp
  @current_xp
end

#statsObject

Returns the value of attribute stats.



6
7
8
# File 'lib/terminal_hero/classes/player.rb', line 6

def stats
  @stats
end

Instance Method Details

#allocate_stats(stats) ⇒ Object

Update the player’s stats to reflect a given statblock, and restore hp to full



85
86
87
88
89
# File 'lib/terminal_hero/classes/player.rb', line 85

def allocate_stats(stats)
  @stats = stats
  @max_hp = calc_max_hp
  @current_hp = @max_hp
end

#calc_max_hpObject

Calculate max HP based on stats (constitution). Overrides Creature method - Player has 50 extra health to reduce difficulty.



28
29
30
# File 'lib/terminal_hero/classes/player.rb', line 28

def calc_max_hp
  return @stats[:con][:value] * GameData::CON_TO_HP + 50
end

#calc_xp_to_level(current_lvl: @level, constant: GameData::LEVELING_CONSTANT, exponent: GameData::LEVELING_EXPONENT) ⇒ Object

Given a level, calculate the XP required to level up



23
24
25
# File 'lib/terminal_hero/classes/player.rb', line 23

def calc_xp_to_level(current_lvl: @level, constant: GameData::LEVELING_CONSTANT, exponent: GameData::LEVELING_EXPONENT)
  return (constant * (current_lvl**exponent)).round
end

#exportObject

Export all values required for initialization to a hash, to be stored in a JSON save file



92
93
94
95
96
97
98
99
100
101
102
# File 'lib/terminal_hero/classes/player.rb', line 92

def export
  return {
    name: @name,
    coords: @coords,
    level: @level,
    stats: @stats,
    health_lost: (@max_hp - @current_hp),
    current_xp: @current_xp,
    avatar: @avatar
  }
end

#gain_xp(xp_gained) ⇒ Object

Gain a given amount of XP, and return the amount gained



47
48
49
50
# File 'lib/terminal_hero/classes/player.rb', line 47

def gain_xp(xp_gained)
  @current_xp += xp_gained
  return xp_gained
end

#level_upObject

Levels up the player based on current XP and returns the number of levels gained



71
72
73
74
75
76
77
78
79
80
81
# File 'lib/terminal_hero/classes/player.rb', line 71

def level_up
  return 0 unless leveled_up?

  levels_gained = 0
  while @current_xp >= calc_xp_to_level
    @current_xp -= calc_xp_to_level
    @level += 1
    levels_gained += 1
  end
  return levels_gained
end

#leveled_up?Boolean

Returns whether the player’s current xp is sufficient to level up

Returns:

  • (Boolean)


66
67
68
# File 'lib/terminal_hero/classes/player.rb', line 66

def leveled_up?
  return @current_xp >= calc_xp_to_level
end

#lose_xp(level: @level, exponent: GameData::LEVELING_EXPONENT, constant: level, modifier: GameData::XP_LOSS_MULTIPLIER) ⇒ Object

Lose an amount of XP based on player level (but not reducing current XP below 0), and return the amount lost



54
55
56
57
58
# File 'lib/terminal_hero/classes/player.rb', line 54

def lose_xp(level: @level, exponent: GameData::LEVELING_EXPONENT, constant: level, modifier: GameData::XP_LOSS_MULTIPLIER)
  xp_lost = (constant + (level**exponent) * modifier).round
  @current_xp = [@current_xp - xp_lost, 0].max
  return xp_lost
end

#post_combat(outcome, enemy) ⇒ Object

Apply any healing and XP gain or loss after the end of a combat encounter,

based on the outcome of the combat and the enemy fought. Return xp gained or lost (if any) for display to the user.


34
35
36
37
38
39
40
41
42
43
44
# File 'lib/terminal_hero/classes/player.rb', line 34

def post_combat(outcome, enemy)
  case outcome
  when :victory
    return gain_xp(enemy.calc_xp)
  when :defeat
    heal_hp(@max_hp)
    return lose_xp
  else
    return nil
  end
end

#xp_progressObject

Return a string showing Player’s progress to next level



61
62
63
# File 'lib/terminal_hero/classes/player.rb', line 61

def xp_progress
  return "#{@current_xp}/#{calc_xp_to_level}"
end