oakdex-pokemon 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +80 -15
- data/lib/oakdex/pokemon.rb +121 -8
- data/lib/oakdex/pokemon/evolution_matcher.rb +110 -0
- data/lib/oakdex/pokemon/factory.rb +21 -12
- data/lib/oakdex/pokemon/growth_events.rb +17 -0
- data/lib/oakdex/pokemon/growth_events/base.rb +35 -0
- data/lib/oakdex/pokemon/growth_events/did_evolution.rb +12 -0
- data/lib/oakdex/pokemon/growth_events/did_not_learn_move.rb +12 -0
- data/lib/oakdex/pokemon/growth_events/evolution.rb +31 -0
- data/lib/oakdex/pokemon/growth_events/forgot_and_learned_move.rb +28 -0
- data/lib/oakdex/pokemon/growth_events/gained_exp.rb +24 -0
- data/lib/oakdex/pokemon/growth_events/learn_move.rb +66 -0
- data/lib/oakdex/pokemon/growth_events/level_up.rb +40 -0
- data/lib/oakdex/pokemon/growth_events/skipped_evolution.rb +12 -0
- data/lib/oakdex/pokemon/move.rb +11 -0
- data/lib/oakdex/pokemon/version.rb +1 -1
- metadata +12 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ece893d782898db992873cd83ba8528c78e0bd21
|
4
|
+
data.tar.gz: a100e34a8228c83bd14bc49f593f8ac35af53d80
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 643a162e94ddaf55ef4e289892bcaae39f4a128348162ac85b1a62ae53cfaf7b3f5b0f4370f06c1f629923c720d8ed8ec4d3de2403320d6420e631524ced7392
|
7
|
+
data.tar.gz: 8fb593746fcee99c0a98c68939624e5c55382a80f745abece8903a90715e4333ca70e62148727e7c1622ef016341914229ba85412cb07f2c3eac1a7047a6f5f2
|
data/README.md
CHANGED
@@ -15,9 +15,8 @@ pikachu = Oakdex::Pokemon.create('Pikachu', level: 12)
|
|
15
15
|
bulbasaur = Oakdex::Pokemon.create('Bulbasaur', { # many options available
|
16
16
|
exp: 120,
|
17
17
|
gender: 'female',
|
18
|
-
|
19
|
-
|
20
|
-
item: 'Earth Plate',
|
18
|
+
ability_id: 'Soundproof',
|
19
|
+
nature_id: 'Bashful',
|
21
20
|
hp: 2,
|
22
21
|
iv: {
|
23
22
|
hp: 8,
|
@@ -57,22 +56,88 @@ pikachu.change_hp_by(38)
|
|
57
56
|
pikachu.current_hp # => 0
|
58
57
|
pikachu.change_pp_by('Thunder Shock', -1)
|
59
58
|
pikachu.moves.map { |p| "#{p.name} #{p.pp}" } # => ["Quick Attack 30", "Tail Whip 30", "Growl 40", "Thunder Shock 29"]
|
60
|
-
```
|
61
|
-
|
62
59
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
60
|
+
pikachu.exp # => 1728
|
61
|
+
pikachu.increment_level
|
62
|
+
pikachu.level # => 12
|
63
|
+
pikachu.exp # => 1728
|
64
|
+
|
65
|
+
# Pikachu learns Electro Ball in Level 13
|
66
|
+
while pikachu.growth_event? do
|
67
|
+
e = pikachu.growth_event
|
68
|
+
if e.read_only?
|
69
|
+
puts e.message
|
70
|
+
e.execute
|
71
|
+
else
|
72
|
+
puts e.message
|
73
|
+
puts e.possible_actions # => ['Forget Quick Attack', ..., 'Do not learn Electro Ball']
|
74
|
+
e.execute(e.possible_actions.sample)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
pikachu.level # => 13
|
78
|
+
pikachu.exp # => 2197
|
79
|
+
|
80
|
+
# Calculate exp from won battles
|
81
|
+
fainted_opponent = bulbasaur
|
82
|
+
pikachu.gain_exp_from_battle(fainted_opponent, using_exp_share: false, flat: false)
|
83
|
+
|
84
|
+
# Evolution by level
|
85
|
+
charmander = Oakdex::Pokemon.create('Charmander', level: 15)
|
86
|
+
charmander.increment_level
|
87
|
+
# Charmander envolves to Charmeleon
|
88
|
+
while charmander.growth_event? do
|
89
|
+
e = charmander.growth_event
|
90
|
+
if e.read_only?
|
91
|
+
puts e.message
|
92
|
+
e.execute
|
93
|
+
else
|
94
|
+
puts e.message
|
95
|
+
puts e.possible_actions # => ['Continue', 'Skip']
|
96
|
+
e.execute(e.possible_actions.first)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
charmander.level # => 16
|
100
|
+
charmander.name # => Charmeleon
|
101
|
+
|
102
|
+
# Evolution by trade
|
103
|
+
feebas = Oakdex::Pokemon.create('Feebas', level: 12, item_id: 'Prism Scale')
|
104
|
+
trainer = OpenStruct.new(name: 'My Awesome Trainer')
|
105
|
+
feebas.trade_to(trainer)
|
106
|
+
# Feebas envolves to Milotic
|
107
|
+
while feebas.growth_event? do
|
108
|
+
e = feebas.growth_event
|
109
|
+
if e.read_only?
|
110
|
+
puts e.message
|
111
|
+
e.execute
|
112
|
+
else
|
113
|
+
puts e.message
|
114
|
+
puts e.possible_actions # => ['Continue', 'Skip']
|
115
|
+
e.execute(e.possible_actions.first)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
feebas.name # => Milotic
|
119
|
+
feebas.trainer # => trainer
|
120
|
+
|
121
|
+
# Evolution by item
|
122
|
+
exeggcute = Oakdex::Pokemon.create('Exeggcute', level: 12)
|
123
|
+
exeggcute.usable_item?('Leaf Stone') # => true
|
124
|
+
exeggcute.use_item('Leaf Stone')
|
125
|
+
# Exeggcute envolves to Exeggutor
|
126
|
+
while exeggcute.growth_event? do
|
127
|
+
e = exeggcute.growth_event
|
128
|
+
if e.read_only?
|
129
|
+
puts e.message
|
130
|
+
e.execute
|
131
|
+
else
|
132
|
+
puts e.message
|
133
|
+
puts e.possible_actions # => ['Continue', 'Skip']
|
134
|
+
e.execute(e.possible_actions.first)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
exeggcute.name # => Exeggutor
|
72
138
|
```
|
73
139
|
|
74
140
|
|
75
|
-
|
76
141
|
## Contributing
|
77
142
|
|
78
143
|
I would be happy if you want to add your contribution to the project. In order to contribute, you just have to fork this repository.
|
data/lib/oakdex/pokemon.rb
CHANGED
@@ -5,6 +5,8 @@ require 'oakdex/pokemon/stat'
|
|
5
5
|
require 'oakdex/pokemon/move'
|
6
6
|
require 'oakdex/pokemon/factory'
|
7
7
|
require 'oakdex/pokemon/experience_gain_calculator'
|
8
|
+
require 'oakdex/pokemon/evolution_matcher'
|
9
|
+
require 'oakdex/pokemon/growth_events'
|
8
10
|
|
9
11
|
module Oakdex
|
10
12
|
# Represents detailed pokemon instance
|
@@ -13,19 +15,27 @@ module Oakdex
|
|
13
15
|
|
14
16
|
BATTLE_STATS = %i[hp atk def sp_atk sp_def speed]
|
15
17
|
|
16
|
-
def_delegators
|
18
|
+
def_delegators :species, :types
|
17
19
|
|
18
20
|
attr_accessor :trainer
|
19
|
-
attr_reader :species
|
20
21
|
|
21
22
|
def self.create(species_name, options = {})
|
22
23
|
species = Oakdex::Pokedex::Pokemon.find!(species_name)
|
23
24
|
Factory.create(species, options)
|
24
25
|
end
|
25
26
|
|
26
|
-
def initialize(
|
27
|
-
@
|
27
|
+
def initialize(species_id, attributes = {})
|
28
|
+
@species_id = species_id
|
28
29
|
@attributes = attributes
|
30
|
+
@attributes[:growth_events] ||= []
|
31
|
+
end
|
32
|
+
|
33
|
+
def species
|
34
|
+
@species ||= Oakdex::Pokedex::Pokemon.find!(@species_id)
|
35
|
+
end
|
36
|
+
|
37
|
+
def inspect
|
38
|
+
"#<#{self.class.name}:#{object_id} #{@attributes.inspect}>"
|
29
39
|
end
|
30
40
|
|
31
41
|
def primary_status_condition
|
@@ -37,13 +47,17 @@ module Oakdex
|
|
37
47
|
end
|
38
48
|
|
39
49
|
def name
|
40
|
-
|
50
|
+
species.names['en']
|
41
51
|
end
|
42
52
|
|
43
53
|
def gender
|
44
54
|
@attributes[:gender]
|
45
55
|
end
|
46
56
|
|
57
|
+
def friendship
|
58
|
+
@attributes[:friendship]
|
59
|
+
end
|
60
|
+
|
47
61
|
def moves
|
48
62
|
@attributes[:moves]
|
49
63
|
end
|
@@ -110,8 +124,12 @@ module Oakdex
|
|
110
124
|
end
|
111
125
|
end
|
112
126
|
|
127
|
+
def exp
|
128
|
+
@attributes[:exp]
|
129
|
+
end
|
130
|
+
|
113
131
|
def level
|
114
|
-
Stat.level_by_exp(
|
132
|
+
Stat.level_by_exp(species.leveling_rate, @attributes[:exp])
|
115
133
|
end
|
116
134
|
|
117
135
|
BATTLE_STATS.each do |stat|
|
@@ -120,16 +138,111 @@ module Oakdex
|
|
120
138
|
end
|
121
139
|
end
|
122
140
|
|
141
|
+
def add_exp(exp_to_add)
|
142
|
+
@attributes[:exp] += exp_to_add
|
143
|
+
end
|
144
|
+
|
145
|
+
def learn_new_move(move_id, replaced_move_id = nil)
|
146
|
+
new_move = Move.create(move_id)
|
147
|
+
if replaced_move_id.nil?
|
148
|
+
@attributes[:moves] << new_move
|
149
|
+
else
|
150
|
+
index = @attributes[:moves]
|
151
|
+
.find_index { |m| m.name == replaced_move_id }
|
152
|
+
@attributes[:moves][index] = new_move if index
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def gain_exp(gained_exp)
|
157
|
+
add_growth_event(GrowthEvents::GainedExp, gained_exp: gained_exp)
|
158
|
+
end
|
159
|
+
|
160
|
+
def trade_to(trainer)
|
161
|
+
self.trainer = trainer
|
162
|
+
available_evolution = EvolutionMatcher.new(self, 'trade').evolution
|
163
|
+
|
164
|
+
add_growth_event(GrowthEvents::Evolution,
|
165
|
+
evolution: available_evolution) if available_evolution
|
166
|
+
end
|
167
|
+
|
168
|
+
def usable_item?(item_id)
|
169
|
+
!evolution_by_item(item_id).nil?
|
170
|
+
end
|
171
|
+
|
172
|
+
def use_item(item_id)
|
173
|
+
return unless usable_item?(item_id)
|
174
|
+
add_growth_event(GrowthEvents::Evolution,
|
175
|
+
evolution: evolution_by_item(item_id))
|
176
|
+
end
|
177
|
+
|
178
|
+
def increment_level
|
179
|
+
gained_exp = exp_next_level - @attributes[:exp]
|
180
|
+
gain_exp(gained_exp)
|
181
|
+
end
|
182
|
+
|
183
|
+
def gain_exp_from_battle(fainted, options = {})
|
184
|
+
exp = ExperienceGainCalculator.calculate(fainted, self, options)
|
185
|
+
gain_exp(exp)
|
186
|
+
end
|
187
|
+
|
188
|
+
def growth_event?
|
189
|
+
!@attributes[:growth_events].empty?
|
190
|
+
end
|
191
|
+
|
192
|
+
def growth_event
|
193
|
+
@attributes[:growth_events].first
|
194
|
+
end
|
195
|
+
|
196
|
+
def remove_growth_event
|
197
|
+
@attributes[:growth_events].shift
|
198
|
+
end
|
199
|
+
|
200
|
+
def add_growth_event(klass, options = {})
|
201
|
+
evt = klass.new(self, options.select { |k, _| k != :after })
|
202
|
+
if options[:after]
|
203
|
+
index = @attributes[:growth_events].index(options[:after])
|
204
|
+
if index.nil?
|
205
|
+
@attributes[:growth_events] << evt
|
206
|
+
else
|
207
|
+
@attributes[:growth_events].insert(index + 1, evt)
|
208
|
+
end
|
209
|
+
else
|
210
|
+
@attributes[:growth_events] << evt
|
211
|
+
end
|
212
|
+
|
213
|
+
evt
|
214
|
+
end
|
215
|
+
|
216
|
+
def envolve_to(species_id)
|
217
|
+
old_max_hp = hp
|
218
|
+
@species = nil
|
219
|
+
@species_id = species_id
|
220
|
+
change_hp_by(hp - old_max_hp) unless fainted?
|
221
|
+
species
|
222
|
+
end
|
223
|
+
|
123
224
|
private
|
124
225
|
|
226
|
+
def evolution_by_item(item_id)
|
227
|
+
EvolutionMatcher.new(self, 'item', item_id: item_id).evolution
|
228
|
+
end
|
229
|
+
|
125
230
|
def initial_stat(stat)
|
126
231
|
Stat.initial_stat(stat,
|
127
232
|
level: level,
|
128
|
-
nature:
|
233
|
+
nature: nature,
|
129
234
|
iv: @attributes[:iv],
|
130
235
|
ev: @attributes[:ev],
|
131
|
-
base_stats:
|
236
|
+
base_stats: species.base_stats
|
132
237
|
)
|
133
238
|
end
|
239
|
+
|
240
|
+
def nature
|
241
|
+
@nature ||= Oakdex::Pokedex::Nature.find!(@attributes[:nature_id])
|
242
|
+
end
|
243
|
+
|
244
|
+
def exp_next_level
|
245
|
+
Stat.exp_by_level(species.leveling_rate, level + 1)
|
246
|
+
end
|
134
247
|
end
|
135
248
|
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
module Oakdex
|
2
|
+
class Pokemon
|
3
|
+
# Calculates if Pokemon can envolve and to which
|
4
|
+
# item, move_learned, trade, level_up are possible triggers
|
5
|
+
class EvolutionMatcher
|
6
|
+
TRIGGERS = %w[item trade level level_up move_learned happiness]
|
7
|
+
|
8
|
+
def initialize(pokemon, trigger, options = {})
|
9
|
+
@pokemon = pokemon
|
10
|
+
@trigger = trigger
|
11
|
+
@options = options
|
12
|
+
end
|
13
|
+
|
14
|
+
def evolution
|
15
|
+
evolutions.sample
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def evolutions
|
21
|
+
available_evolutions.map do |e|
|
22
|
+
e['to'] if trigger_for(e) == @trigger && valid_evolution?(e)
|
23
|
+
end.compact
|
24
|
+
end
|
25
|
+
|
26
|
+
def available_evolutions
|
27
|
+
@pokemon.species.evolutions
|
28
|
+
end
|
29
|
+
|
30
|
+
def trigger_for(evolution)
|
31
|
+
original_trigger = TRIGGERS.find { |t| evolution[t] }
|
32
|
+
return 'level_up' if %w[level happiness].include?(original_trigger)
|
33
|
+
original_trigger
|
34
|
+
end
|
35
|
+
|
36
|
+
def valid_evolution?(e)
|
37
|
+
hold_item_match?(e) && item_match?(e) && happiness_match?(e) &&
|
38
|
+
level_match?(e) && move_learned_match?(e) && conditions_match?(e)
|
39
|
+
end
|
40
|
+
|
41
|
+
def hold_item_match?(e)
|
42
|
+
!e['hold_item'] || e['hold_item'] == @pokemon.item_id
|
43
|
+
end
|
44
|
+
|
45
|
+
def item_match?(e)
|
46
|
+
!e['item'] || e['item'] == @options[:item_id]
|
47
|
+
end
|
48
|
+
|
49
|
+
def happiness_match?(e)
|
50
|
+
!e['happiness'] || @pokemon.friendship >= 220
|
51
|
+
end
|
52
|
+
|
53
|
+
def level_match?(e)
|
54
|
+
!e['level'] || @pokemon.level >= e['level']
|
55
|
+
end
|
56
|
+
|
57
|
+
def move_learned_match?(e)
|
58
|
+
!e['move_learned'] || currently_learned_move?(e) ||
|
59
|
+
pokemon_learned_move_already?(e)
|
60
|
+
end
|
61
|
+
|
62
|
+
def currently_learned_move?(e)
|
63
|
+
e['move_learned'] && e['move_learned'] == @options[:move_id]
|
64
|
+
end
|
65
|
+
|
66
|
+
def pokemon_learned_move_already?(e)
|
67
|
+
@trigger != 'move_learned' &&
|
68
|
+
@pokemon.moves.map(&:name).include?(e['move_learned'])
|
69
|
+
end
|
70
|
+
|
71
|
+
def conditions_match?(e)
|
72
|
+
(e['conditions'] || []).all? do |condition|
|
73
|
+
method_name = condition.downcase.tr(' é', '_e')
|
74
|
+
.gsub('>', 'bigger_than')
|
75
|
+
.gsub('=', 'equal')
|
76
|
+
.gsub('<', 'lower_than')
|
77
|
+
if respond_to?("#{method_name}?", true)
|
78
|
+
send("#{method_name}?")
|
79
|
+
else
|
80
|
+
false
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def female?
|
86
|
+
@pokemon.gender == 'female'
|
87
|
+
end
|
88
|
+
|
89
|
+
def male?
|
90
|
+
@pokemon.gender == 'male'
|
91
|
+
end
|
92
|
+
|
93
|
+
def attack_bigger_than_defense?
|
94
|
+
@pokemon.atk > @pokemon.def
|
95
|
+
end
|
96
|
+
|
97
|
+
def attack_equal_defense?
|
98
|
+
@pokemon.atk == @pokemon.def
|
99
|
+
end
|
100
|
+
|
101
|
+
def defense_bigger_than_defense?
|
102
|
+
@pokemon.def > @pokemon.atk
|
103
|
+
end
|
104
|
+
|
105
|
+
def random?
|
106
|
+
true
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -2,13 +2,14 @@ module Oakdex
|
|
2
2
|
class Pokemon
|
3
3
|
# Creates Pokemon instance and prefills attributes
|
4
4
|
class Factory
|
5
|
-
REQUIRED_ATTRIBUTES = %i[exp gender
|
5
|
+
REQUIRED_ATTRIBUTES = %i[exp gender ability_id nature_id hp iv ev moves]
|
6
6
|
OPTIONAL_ATTRIBUTES = %i[
|
7
7
|
original_trainer
|
8
8
|
primary_status_condition
|
9
9
|
wild
|
10
10
|
item_id
|
11
11
|
amie
|
12
|
+
friendship
|
12
13
|
]
|
13
14
|
|
14
15
|
class << self
|
@@ -18,7 +19,7 @@ module Oakdex
|
|
18
19
|
OPTIONAL_ATTRIBUTES).map do |attr|
|
19
20
|
[attr, factory.send(attr)]
|
20
21
|
end]
|
21
|
-
Pokemon.new(species, attributes)
|
22
|
+
Pokemon.new(species.names['en'], attributes)
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
@@ -41,6 +42,10 @@ module Oakdex
|
|
41
42
|
@options[:wild]
|
42
43
|
end
|
43
44
|
|
45
|
+
def friendship
|
46
|
+
@options[:friendship] || @species.base_friendship
|
47
|
+
end
|
48
|
+
|
44
49
|
def item_id
|
45
50
|
@options[:item_id]
|
46
51
|
end
|
@@ -84,11 +89,11 @@ module Oakdex
|
|
84
89
|
end.compact
|
85
90
|
end
|
86
91
|
|
87
|
-
def
|
88
|
-
if @options[
|
89
|
-
|
92
|
+
def ability_id
|
93
|
+
if @options[:ability_id]
|
94
|
+
@options[:ability_id]
|
90
95
|
else
|
91
|
-
|
96
|
+
abilities.sample['name']
|
92
97
|
end
|
93
98
|
end
|
94
99
|
|
@@ -146,12 +151,16 @@ module Oakdex
|
|
146
151
|
end
|
147
152
|
end
|
148
153
|
|
149
|
-
def
|
150
|
-
@
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
154
|
+
def nature_id
|
155
|
+
@nature_id ||= if @options[:nature_id]
|
156
|
+
@options[:nature_id]
|
157
|
+
else
|
158
|
+
Oakdex::Pokedex::Nature.all.values.sample.names['en']
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def nature
|
163
|
+
@nature ||= Oakdex::Pokedex::Nature.find!(nature_id)
|
155
164
|
end
|
156
165
|
end
|
157
166
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Oakdex
|
2
|
+
class Pokemon
|
3
|
+
# Represents Growth events namespace (Moves, Evolution etc.)
|
4
|
+
module GrowthEvents
|
5
|
+
end
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'oakdex/pokemon/growth_events/base'
|
10
|
+
require 'oakdex/pokemon/growth_events/gained_exp'
|
11
|
+
require 'oakdex/pokemon/growth_events/learn_move'
|
12
|
+
require 'oakdex/pokemon/growth_events/level_up'
|
13
|
+
require 'oakdex/pokemon/growth_events/forgot_and_learned_move'
|
14
|
+
require 'oakdex/pokemon/growth_events/did_not_learn_move'
|
15
|
+
require 'oakdex/pokemon/growth_events/did_evolution'
|
16
|
+
require 'oakdex/pokemon/growth_events/skipped_evolution'
|
17
|
+
require 'oakdex/pokemon/growth_events/evolution'
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
class Oakdex::Pokemon
|
4
|
+
module GrowthEvents
|
5
|
+
# Represents Base GrowthEvent
|
6
|
+
class Base
|
7
|
+
def initialize(pokemon, options = {})
|
8
|
+
@pokemon = pokemon
|
9
|
+
@options = options
|
10
|
+
end
|
11
|
+
|
12
|
+
def read_only?
|
13
|
+
possible_actions.empty?
|
14
|
+
end
|
15
|
+
|
16
|
+
def possible_actions
|
17
|
+
[]
|
18
|
+
end
|
19
|
+
|
20
|
+
def message
|
21
|
+
raise 'implement me'
|
22
|
+
end
|
23
|
+
|
24
|
+
def execute(_action = nil)
|
25
|
+
remove_event
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def remove_event
|
31
|
+
@pokemon.remove_growth_event
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
class Oakdex::Pokemon
|
4
|
+
module GrowthEvents
|
5
|
+
# When pokemon could learn move
|
6
|
+
class Evolution < Base
|
7
|
+
def message
|
8
|
+
"#{@pokemon.name} wants to envolve to #{@options[:evolution]}."
|
9
|
+
end
|
10
|
+
|
11
|
+
def possible_actions
|
12
|
+
%w[Continue Skip]
|
13
|
+
end
|
14
|
+
|
15
|
+
def execute(action)
|
16
|
+
if action == 'Skip'
|
17
|
+
@pokemon.add_growth_event(GrowthEvents::SkippedEvolution,
|
18
|
+
after: self)
|
19
|
+
else
|
20
|
+
original = @pokemon.name
|
21
|
+
@pokemon.envolve_to(@options[:evolution])
|
22
|
+
@pokemon.add_growth_event(GrowthEvents::DidEvolution,
|
23
|
+
original: original,
|
24
|
+
after: self)
|
25
|
+
end
|
26
|
+
|
27
|
+
remove_event
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
class Oakdex::Pokemon
|
4
|
+
module GrowthEvents
|
5
|
+
# When move was learnt and other move was forgotten
|
6
|
+
class ForgotAndLearnedMove < Base
|
7
|
+
def message
|
8
|
+
"#{@pokemon.name} learned #{@options[:move_id]} and forgot #{@options[:forgot_move_id]}."
|
9
|
+
end
|
10
|
+
|
11
|
+
def execute
|
12
|
+
if available_evolution
|
13
|
+
@pokemon.add_growth_event(GrowthEvents::Evolution,
|
14
|
+
evolution: available_evolution,
|
15
|
+
after: self)
|
16
|
+
end
|
17
|
+
remove_event
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def available_evolution
|
23
|
+
@available_evolution ||= Oakdex::Pokemon::EvolutionMatcher
|
24
|
+
.new(@pokemon, 'move_learned', move_id: @options[:move_id]).evolution
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
class Oakdex::Pokemon
|
4
|
+
module GrowthEvents
|
5
|
+
# When pokemon gains exp
|
6
|
+
class GainedExp < Base
|
7
|
+
def message
|
8
|
+
"#{@pokemon.name} gained #{@options[:gained_exp]} EXP."
|
9
|
+
end
|
10
|
+
|
11
|
+
def execute
|
12
|
+
level_before = @pokemon.level
|
13
|
+
@pokemon.add_exp(@options[:gained_exp])
|
14
|
+
last_evt = self
|
15
|
+
((level_before + 1)...(@pokemon.level + 1)).to_a.each do |new_level|
|
16
|
+
last_evt = @pokemon.add_growth_event(GrowthEvents::LevelUp,
|
17
|
+
new_level: new_level,
|
18
|
+
after: last_evt)
|
19
|
+
end
|
20
|
+
remove_event
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
class Oakdex::Pokemon
|
4
|
+
module GrowthEvents
|
5
|
+
# When pokemon could learn move
|
6
|
+
class LearnMove < Base
|
7
|
+
def message
|
8
|
+
if move_slot_left?
|
9
|
+
"#{@pokemon.name} learned #{@options[:move_id]}."
|
10
|
+
else
|
11
|
+
"#{@pokemon.name} wants to learn #{@options[:move_id]} but has already 4 moves."
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def possible_actions
|
16
|
+
return [] if move_slot_left?
|
17
|
+
[not_learn_action] + unlearn_moves.keys
|
18
|
+
end
|
19
|
+
|
20
|
+
def execute(action = nil)
|
21
|
+
if move_slot_left?
|
22
|
+
@pokemon.learn_new_move(@options[:move_id])
|
23
|
+
if available_evolution
|
24
|
+
@pokemon.add_growth_event(GrowthEvents::Evolution,
|
25
|
+
evolution: available_evolution,
|
26
|
+
after: self)
|
27
|
+
end
|
28
|
+
else
|
29
|
+
if action == not_learn_action
|
30
|
+
@pokemon.add_growth_event(GrowthEvents::DidNotLearnMove,
|
31
|
+
move_id: @options[:move_id], after: self)
|
32
|
+
else
|
33
|
+
move_id = unlearn_moves[action]
|
34
|
+
@pokemon.learn_new_move(@options[:move_id], move_id)
|
35
|
+
@pokemon.add_growth_event(GrowthEvents::ForgotAndLearnedMove,
|
36
|
+
move_id: @options[:move_id],
|
37
|
+
forgot_move_id: move_id,
|
38
|
+
after: self)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
remove_event
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def available_evolution
|
47
|
+
@available_evolution ||= Oakdex::Pokemon::EvolutionMatcher
|
48
|
+
.new(@pokemon, 'move_learned', move_id: @options[:move_id]).evolution
|
49
|
+
end
|
50
|
+
|
51
|
+
def not_learn_action
|
52
|
+
"Do not learn #{@options[:move_id]}"
|
53
|
+
end
|
54
|
+
|
55
|
+
def unlearn_moves
|
56
|
+
@pokemon.moves.map do |move|
|
57
|
+
["Forget #{move.name}", move.name]
|
58
|
+
end.to_h
|
59
|
+
end
|
60
|
+
|
61
|
+
def move_slot_left?
|
62
|
+
@pokemon.moves.size < 4
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
class Oakdex::Pokemon
|
4
|
+
module GrowthEvents
|
5
|
+
# When pokemon reached the next level
|
6
|
+
class LevelUp < Base
|
7
|
+
def message
|
8
|
+
"#{@pokemon.name} reached Level #{@options[:new_level]}."
|
9
|
+
end
|
10
|
+
|
11
|
+
def execute
|
12
|
+
last_evt = self
|
13
|
+
available_moves.each do |move_id|
|
14
|
+
last_evt = @pokemon.add_growth_event(GrowthEvents::LearnMove,
|
15
|
+
move_id: move_id,
|
16
|
+
after: last_evt)
|
17
|
+
end
|
18
|
+
if available_evolution
|
19
|
+
@pokemon.add_growth_event(GrowthEvents::Evolution,
|
20
|
+
evolution: available_evolution,
|
21
|
+
after: last_evt)
|
22
|
+
end
|
23
|
+
remove_event
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def available_moves
|
29
|
+
@pokemon.species.learnset.map do |m|
|
30
|
+
m['move'] if m['level'] && m['level'] == @options[:new_level]
|
31
|
+
end.compact
|
32
|
+
end
|
33
|
+
|
34
|
+
def available_evolution
|
35
|
+
@available_evolution ||= Oakdex::Pokemon::EvolutionMatcher
|
36
|
+
.new(@pokemon, 'level_up').evolution
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/oakdex/pokemon/move.rb
CHANGED
@@ -24,6 +24,17 @@ module Oakdex
|
|
24
24
|
@max_pp = max_pp
|
25
25
|
end
|
26
26
|
|
27
|
+
def inspect
|
28
|
+
fields = instance_variables.map do |name|
|
29
|
+
if name == :@move_type
|
30
|
+
"#{name}=#<Oakdex::Pokedex::Move #{@move_type.name}>"
|
31
|
+
else
|
32
|
+
"#{name}=#{instance_variable_get(name)}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
"#<#{self.class.name}:#{object_id} #{fields.join(', ')}>"
|
36
|
+
end
|
37
|
+
|
27
38
|
def name
|
28
39
|
@move_type.names['en']
|
29
40
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oakdex-pokemon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jalyna Schroeder
|
@@ -33,8 +33,19 @@ files:
|
|
33
33
|
- README.md
|
34
34
|
- lib/oakdex.rb
|
35
35
|
- lib/oakdex/pokemon.rb
|
36
|
+
- lib/oakdex/pokemon/evolution_matcher.rb
|
36
37
|
- lib/oakdex/pokemon/experience_gain_calculator.rb
|
37
38
|
- lib/oakdex/pokemon/factory.rb
|
39
|
+
- lib/oakdex/pokemon/growth_events.rb
|
40
|
+
- lib/oakdex/pokemon/growth_events/base.rb
|
41
|
+
- lib/oakdex/pokemon/growth_events/did_evolution.rb
|
42
|
+
- lib/oakdex/pokemon/growth_events/did_not_learn_move.rb
|
43
|
+
- lib/oakdex/pokemon/growth_events/evolution.rb
|
44
|
+
- lib/oakdex/pokemon/growth_events/forgot_and_learned_move.rb
|
45
|
+
- lib/oakdex/pokemon/growth_events/gained_exp.rb
|
46
|
+
- lib/oakdex/pokemon/growth_events/learn_move.rb
|
47
|
+
- lib/oakdex/pokemon/growth_events/level_up.rb
|
48
|
+
- lib/oakdex/pokemon/growth_events/skipped_evolution.rb
|
38
49
|
- lib/oakdex/pokemon/move.rb
|
39
50
|
- lib/oakdex/pokemon/stat.rb
|
40
51
|
- lib/oakdex/pokemon/version.rb
|