oakdex-pokemon 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +29 -2
- data/lib/oakdex/pokemon.rb +38 -1
- data/lib/oakdex/pokemon/growth_events.rb +5 -0
- data/lib/oakdex/pokemon/growth_events/base.rb +7 -0
- data/lib/oakdex/pokemon/growth_events/gained_ev.rb +17 -0
- data/lib/oakdex/pokemon/growth_events/increase_max_pp.rb +23 -0
- data/lib/oakdex/pokemon/growth_events/increase_move_max_pp.rb +18 -0
- data/lib/oakdex/pokemon/growth_events/increase_move_pp.rb +18 -0
- data/lib/oakdex/pokemon/growth_events/increase_pp.rb +23 -0
- data/lib/oakdex/pokemon/import.rb +60 -0
- data/lib/oakdex/pokemon/invalid_pokemon.rb +7 -0
- data/lib/oakdex/pokemon/move.rb +27 -1
- data/lib/oakdex/pokemon/schema.json +237 -0
- data/lib/oakdex/pokemon/use_item_service.rb +105 -2
- data/lib/oakdex/pokemon/version.rb +1 -1
- metadata +24 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f76d4ae970dc1d103c9ce5a2fd9301e19786e067
|
4
|
+
data.tar.gz: 716c84b59d44cb3d5a95ec70a7601431aebf4d49
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 052e9a4a83ba05746908ef6f56dc12d9dfc1d322e044d4584232238ef0a03c568dcca022e2df50acbaf5c47ef7cda8032e79155fd74aec2132e60bcac44f3d20
|
7
|
+
data.tar.gz: a8be7b269365758dbfa5faa6a02c5da440f6ee253a370daacfb501738656cb348912bf5875e11fb0fe86a30a97c35a3e426614125dc0517f7d2e1d9c4162f8a9
|
data/README.md
CHANGED
@@ -77,9 +77,9 @@ end
|
|
77
77
|
pikachu.level # => 13
|
78
78
|
pikachu.exp # => 2197
|
79
79
|
|
80
|
-
# Calculate exp from won battles
|
80
|
+
# Calculate exp and ev from won battles
|
81
81
|
fainted_opponent = bulbasaur
|
82
|
-
pikachu.
|
82
|
+
pikachu.grow_from_battle(fainted_opponent, using_exp_share: false, flat: false)
|
83
83
|
|
84
84
|
# Evolution by level
|
85
85
|
charmander = Oakdex::Pokemon.create('Charmander', level: 15)
|
@@ -152,6 +152,24 @@ end
|
|
152
152
|
charmander.hp # => 40
|
153
153
|
charmander.usable_item?('Potion') # => false
|
154
154
|
|
155
|
+
# Increase pp by PP Up
|
156
|
+
exeggcute = Oakdex::Pokemon.create('Exeggcute', level: 12)
|
157
|
+
exeggcute.usable_item?('PP Up') # => true
|
158
|
+
exeggcute.use_item('PP Up')
|
159
|
+
# Exeggcute can increase pp of a mvoe
|
160
|
+
while exeggcute.growth_event? do
|
161
|
+
e = exeggcute.growth_event
|
162
|
+
if e.read_only?
|
163
|
+
puts e.message
|
164
|
+
e.execute
|
165
|
+
else
|
166
|
+
puts e.message
|
167
|
+
puts e.possible_actions # => name of moves
|
168
|
+
e.execute(e.possible_actions.first)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
exeggcute.moves.first.max_pp # => Changed
|
172
|
+
|
155
173
|
|
156
174
|
charmander = Oakdex::Pokemon.create('Charmander', level: 15, primary_status_condition: 'poison')
|
157
175
|
charmander.usable_item?('Antidote') # => true
|
@@ -168,6 +186,15 @@ charmander.primary_status_condition # => nil
|
|
168
186
|
charmander.usable_item?('Antidote') # => false
|
169
187
|
```
|
170
188
|
|
189
|
+
### Import and export Pokemon
|
190
|
+
|
191
|
+
```ruby
|
192
|
+
squirtle = Oakdex::Pokemon.create('Squirtle', level: 12)
|
193
|
+
json = squirtle.to_json
|
194
|
+
# Might throw Oakdex::Pokemon::InvalidPokemon
|
195
|
+
identical_squirtle = Oakdex::Pokemon.from_json(json)
|
196
|
+
```
|
197
|
+
|
171
198
|
|
172
199
|
## Contributing
|
173
200
|
|
data/lib/oakdex/pokemon.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'forwardable'
|
2
|
+
require 'json'
|
2
3
|
require 'oakdex/pokedex'
|
3
4
|
|
4
5
|
require 'oakdex/pokemon/stat'
|
@@ -8,6 +9,7 @@ require 'oakdex/pokemon/experience_gain_calculator'
|
|
8
9
|
require 'oakdex/pokemon/evolution_matcher'
|
9
10
|
require 'oakdex/pokemon/use_item_service'
|
10
11
|
require 'oakdex/pokemon/growth_events'
|
12
|
+
require 'oakdex/pokemon/import'
|
11
13
|
|
12
14
|
module Oakdex
|
13
15
|
# Represents detailed pokemon instance
|
@@ -29,6 +31,7 @@ module Oakdex
|
|
29
31
|
@species_id = species_id
|
30
32
|
@attributes = attributes
|
31
33
|
@attributes[:growth_events] ||= []
|
34
|
+
species
|
32
35
|
end
|
33
36
|
|
34
37
|
def species
|
@@ -143,6 +146,16 @@ module Oakdex
|
|
143
146
|
@attributes[:exp] += exp_to_add
|
144
147
|
end
|
145
148
|
|
149
|
+
def add_ev(stat, ev_to_add)
|
150
|
+
@attributes[:ev] = @attributes[:ev].map do |k, v|
|
151
|
+
[k, k.to_s == stat ? [v + ev_to_add, 255].min : v]
|
152
|
+
end.to_h
|
153
|
+
end
|
154
|
+
|
155
|
+
def ev_max?(stat)
|
156
|
+
@attributes[:ev][stat].to_i >= 255
|
157
|
+
end
|
158
|
+
|
146
159
|
def learn_new_move(move_id, replaced_move_id = nil)
|
147
160
|
new_move = Move.create(move_id)
|
148
161
|
if replaced_move_id.nil?
|
@@ -181,9 +194,10 @@ module Oakdex
|
|
181
194
|
gain_exp(gained_exp)
|
182
195
|
end
|
183
196
|
|
184
|
-
def
|
197
|
+
def grow_from_battle(fainted, options = {})
|
185
198
|
exp = ExperienceGainCalculator.calculate(fainted, self, options)
|
186
199
|
gain_exp(exp)
|
200
|
+
gain_ev_from_battle(fainted) unless options[:using_exp_share]
|
187
201
|
end
|
188
202
|
|
189
203
|
def growth_event?
|
@@ -222,8 +236,31 @@ module Oakdex
|
|
222
236
|
species
|
223
237
|
end
|
224
238
|
|
239
|
+
def to_json
|
240
|
+
JSON.dump(to_h)
|
241
|
+
end
|
242
|
+
|
243
|
+
def self.from_json(json)
|
244
|
+
Import.new(json).import!
|
245
|
+
end
|
246
|
+
|
225
247
|
private
|
226
248
|
|
249
|
+
def to_h
|
250
|
+
@attributes.dup.tap do |attributes|
|
251
|
+
attributes[:species_id] = species.name
|
252
|
+
attributes[:moves] = attributes[:moves].map(&:to_h)
|
253
|
+
attributes[:growth_events] = attributes[:growth_events].map(&:to_h)
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
def gain_ev_from_battle(fainted)
|
258
|
+
fainted.species.ev_yield.each do |stat, value|
|
259
|
+
next if value.zero?
|
260
|
+
add_growth_event(GrowthEvents::GainedEv, stat: stat, value: value)
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
227
264
|
def initial_stat(stat)
|
228
265
|
Stat.initial_stat(stat,
|
229
266
|
level: level,
|
@@ -8,6 +8,7 @@ end
|
|
8
8
|
|
9
9
|
require 'oakdex/pokemon/growth_events/base'
|
10
10
|
require 'oakdex/pokemon/growth_events/gained_exp'
|
11
|
+
require 'oakdex/pokemon/growth_events/gained_ev'
|
11
12
|
require 'oakdex/pokemon/growth_events/learn_move'
|
12
13
|
require 'oakdex/pokemon/growth_events/level_up'
|
13
14
|
require 'oakdex/pokemon/growth_events/forgot_and_learned_move'
|
@@ -18,3 +19,7 @@ require 'oakdex/pokemon/growth_events/evolution'
|
|
18
19
|
require 'oakdex/pokemon/growth_events/add_hp'
|
19
20
|
require 'oakdex/pokemon/growth_events/revive'
|
20
21
|
require 'oakdex/pokemon/growth_events/remove_status_condition'
|
22
|
+
require 'oakdex/pokemon/growth_events/increase_max_pp'
|
23
|
+
require 'oakdex/pokemon/growth_events/increase_move_max_pp'
|
24
|
+
require 'oakdex/pokemon/growth_events/increase_pp'
|
25
|
+
require 'oakdex/pokemon/growth_events/increase_move_pp'
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
class Oakdex::Pokemon
|
4
|
+
module GrowthEvents
|
5
|
+
# When pokemon gains ev
|
6
|
+
class GainedEv < Base
|
7
|
+
def message
|
8
|
+
"#{@pokemon.name} got stronger in #{@options[:stat]}."
|
9
|
+
end
|
10
|
+
|
11
|
+
def execute
|
12
|
+
@pokemon.add_ev(@options[:stat], @options[:value])
|
13
|
+
remove_event
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
class Oakdex::Pokemon
|
4
|
+
module GrowthEvents
|
5
|
+
# When pokemon increases max pp for a move
|
6
|
+
class IncreaseMaxPp < Base
|
7
|
+
def message
|
8
|
+
"Please choose a move of #{@pokemon.name} that should increase its Max PP."
|
9
|
+
end
|
10
|
+
|
11
|
+
def possible_actions
|
12
|
+
@options[:moves].keys
|
13
|
+
end
|
14
|
+
|
15
|
+
def execute(action)
|
16
|
+
@pokemon.add_growth_event(GrowthEvents::IncreaseMoveMaxPp,
|
17
|
+
move_id: action,
|
18
|
+
change_by: @options[:moves][action])
|
19
|
+
remove_event
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
class Oakdex::Pokemon
|
4
|
+
module GrowthEvents
|
5
|
+
# When picked move for increasing max pp
|
6
|
+
class IncreaseMoveMaxPp < Base
|
7
|
+
def message
|
8
|
+
"#{@pokemon.name} increased Max PP for #{@options[:move_id]}."
|
9
|
+
end
|
10
|
+
|
11
|
+
def execute
|
12
|
+
move = @pokemon.moves.find { |m| m.name == @options[:move_id] }
|
13
|
+
move.add_max_pp(@options[:change_by])
|
14
|
+
remove_event
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
class Oakdex::Pokemon
|
4
|
+
module GrowthEvents
|
5
|
+
# When picked move for increasing pp
|
6
|
+
class IncreaseMovePp < Base
|
7
|
+
def message
|
8
|
+
"#{@pokemon.name} increased PP for #{@options[:move_id]}."
|
9
|
+
end
|
10
|
+
|
11
|
+
def execute
|
12
|
+
move = @pokemon.moves.find { |m| m.name == @options[:move_id] }
|
13
|
+
move.add_pp(@options[:change_by])
|
14
|
+
remove_event
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
class Oakdex::Pokemon
|
4
|
+
module GrowthEvents
|
5
|
+
# When pokemon increases pp for a move
|
6
|
+
class IncreasePp < Base
|
7
|
+
def message
|
8
|
+
"Please choose a move of #{@pokemon.name} that should increase its PP."
|
9
|
+
end
|
10
|
+
|
11
|
+
def possible_actions
|
12
|
+
@options[:moves].keys
|
13
|
+
end
|
14
|
+
|
15
|
+
def execute(action)
|
16
|
+
@pokemon.add_growth_event(GrowthEvents::IncreaseMovePp,
|
17
|
+
move_id: action,
|
18
|
+
change_by: @options[:moves][action])
|
19
|
+
remove_event
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'json-schema'
|
2
|
+
require 'json'
|
3
|
+
require 'oakdex/pokemon/invalid_pokemon'
|
4
|
+
|
5
|
+
module Oakdex
|
6
|
+
class Pokemon
|
7
|
+
# Imports and validates pokemon
|
8
|
+
class Import
|
9
|
+
SCHEMA_PATH = './lib/oakdex/pokemon/schema.json'.freeze
|
10
|
+
|
11
|
+
def self.schema
|
12
|
+
@schema ||= File.read(File.expand_path(SCHEMA_PATH))
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(data)
|
16
|
+
@data = data.is_a?(Hash) ? data : JSON.parse(data)
|
17
|
+
end
|
18
|
+
|
19
|
+
def import!
|
20
|
+
JSON::Validator.validate!(self.class.schema, @data)
|
21
|
+
pok = Oakdex::Pokemon.new(@data['species_id'], attributes)
|
22
|
+
apply_growth_events(pok)
|
23
|
+
pok
|
24
|
+
rescue JSON::Schema::ValidationError => e
|
25
|
+
raise Oakdex::Pokemon::InvalidPokemon, e.message
|
26
|
+
rescue Oakdex::Pokedex::NotFound => e
|
27
|
+
raise Oakdex::Pokemon::InvalidPokemon, e.message
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def attributes
|
33
|
+
@data.map do |k, v|
|
34
|
+
next if k == 'species_id' || k == 'growth_events'
|
35
|
+
if k == 'moves'
|
36
|
+
[:moves, moves]
|
37
|
+
else
|
38
|
+
[k.to_sym, v]
|
39
|
+
end
|
40
|
+
end.compact.to_h
|
41
|
+
end
|
42
|
+
|
43
|
+
def moves
|
44
|
+
(@data['moves'] || []).map do |move_data|
|
45
|
+
move_type = Oakdex::Pokedex::Move.find!(move_data['move_id'])
|
46
|
+
Move.new(move_type, move_data['pp'], move_data['max_pp'])
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def apply_growth_events(pok)
|
51
|
+
(@data['growth_events'] || []).each do |growth_event_data|
|
52
|
+
klass = Object.const_get(growth_event_data['name'])
|
53
|
+
pok.add_growth_event(klass, growth_event_data['options'].map do |k, v|
|
54
|
+
[k.to_sym, v]
|
55
|
+
end.to_h)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/oakdex/pokemon/move.rb
CHANGED
@@ -11,7 +11,7 @@ module Oakdex
|
|
11
11
|
|
12
12
|
extend Forwardable
|
13
13
|
|
14
|
-
attr_reader :max_pp
|
14
|
+
attr_reader :max_pp, :move_type
|
15
15
|
attr_accessor :pp
|
16
16
|
|
17
17
|
def_delegators :@move_type, :target, :priority, :accuracy,
|
@@ -39,6 +39,24 @@ module Oakdex
|
|
39
39
|
@move_type.names['en']
|
40
40
|
end
|
41
41
|
|
42
|
+
def max_pp_at_max?
|
43
|
+
@max_pp >= @move_type.max_pp
|
44
|
+
end
|
45
|
+
|
46
|
+
def pp_max?
|
47
|
+
@pp >= @max_pp
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_max_pp(change_by)
|
51
|
+
old = max_pp
|
52
|
+
@max_pp = [max_pp + change_by, @move_type.max_pp].min
|
53
|
+
@pp += @max_pp - old
|
54
|
+
end
|
55
|
+
|
56
|
+
def add_pp(change_by)
|
57
|
+
@pp = [@pp + change_by, @max_pp].min
|
58
|
+
end
|
59
|
+
|
42
60
|
def type_id
|
43
61
|
@move_type.type
|
44
62
|
end
|
@@ -46,6 +64,14 @@ module Oakdex
|
|
46
64
|
def type
|
47
65
|
Oakdex::Pokedex::Type.find!(type_id)
|
48
66
|
end
|
67
|
+
|
68
|
+
def to_h
|
69
|
+
{
|
70
|
+
move_id: @move_type.name,
|
71
|
+
pp: @pp,
|
72
|
+
max_pp: @max_pp
|
73
|
+
}
|
74
|
+
end
|
49
75
|
end
|
50
76
|
end
|
51
77
|
end
|
@@ -0,0 +1,237 @@
|
|
1
|
+
{
|
2
|
+
"$schema": "http://json-schema.org/draft-04/schema#",
|
3
|
+
"type": "object",
|
4
|
+
"title": "Pokemon",
|
5
|
+
"definitions": {
|
6
|
+
"ev_stats": {
|
7
|
+
"type": "object",
|
8
|
+
"properties": {
|
9
|
+
"hp": {
|
10
|
+
"type": "integer",
|
11
|
+
"minimum": 0,
|
12
|
+
"maximum": 255
|
13
|
+
},
|
14
|
+
"atk": {
|
15
|
+
"type": "integer",
|
16
|
+
"minimum": 0,
|
17
|
+
"maximum": 255
|
18
|
+
},
|
19
|
+
"def": {
|
20
|
+
"type": "integer",
|
21
|
+
"minimum": 0,
|
22
|
+
"maximum": 255
|
23
|
+
},
|
24
|
+
"sp_atk": {
|
25
|
+
"type": "integer",
|
26
|
+
"minimum": 0,
|
27
|
+
"maximum": 255
|
28
|
+
},
|
29
|
+
"sp_def": {
|
30
|
+
"type": "integer",
|
31
|
+
"minimum": 0,
|
32
|
+
"maximum": 255
|
33
|
+
},
|
34
|
+
"speed": {
|
35
|
+
"type": "integer",
|
36
|
+
"minimum": 0,
|
37
|
+
"maximum": 255
|
38
|
+
}
|
39
|
+
},
|
40
|
+
"required": [
|
41
|
+
"hp",
|
42
|
+
"atk",
|
43
|
+
"def",
|
44
|
+
"sp_atk",
|
45
|
+
"sp_def",
|
46
|
+
"speed"
|
47
|
+
],
|
48
|
+
"additionalProperties": false
|
49
|
+
},
|
50
|
+
"iv_stats": {
|
51
|
+
"type": "object",
|
52
|
+
"properties": {
|
53
|
+
"hp": {
|
54
|
+
"type": "integer",
|
55
|
+
"minimum": 0,
|
56
|
+
"maximum": 31
|
57
|
+
},
|
58
|
+
"atk": {
|
59
|
+
"type": "integer",
|
60
|
+
"minimum": 0,
|
61
|
+
"maximum": 31
|
62
|
+
},
|
63
|
+
"def": {
|
64
|
+
"type": "integer",
|
65
|
+
"minimum": 0,
|
66
|
+
"maximum": 31
|
67
|
+
},
|
68
|
+
"sp_atk": {
|
69
|
+
"type": "integer",
|
70
|
+
"minimum": 0,
|
71
|
+
"maximum": 31
|
72
|
+
},
|
73
|
+
"sp_def": {
|
74
|
+
"type": "integer",
|
75
|
+
"minimum": 0,
|
76
|
+
"maximum": 31
|
77
|
+
},
|
78
|
+
"speed": {
|
79
|
+
"type": "integer",
|
80
|
+
"minimum": 0,
|
81
|
+
"maximum": 31
|
82
|
+
}
|
83
|
+
},
|
84
|
+
"required": [
|
85
|
+
"hp",
|
86
|
+
"atk",
|
87
|
+
"def",
|
88
|
+
"sp_atk",
|
89
|
+
"sp_def",
|
90
|
+
"speed"
|
91
|
+
],
|
92
|
+
"additionalProperties": false
|
93
|
+
}
|
94
|
+
},
|
95
|
+
"properties": {
|
96
|
+
"species_id": {
|
97
|
+
"type": "string"
|
98
|
+
},
|
99
|
+
"exp": {
|
100
|
+
"type": "integer",
|
101
|
+
"minimum": 0,
|
102
|
+
"maximum": 1640000
|
103
|
+
},
|
104
|
+
"gender": {
|
105
|
+
"type": "string",
|
106
|
+
"enum": [
|
107
|
+
"male",
|
108
|
+
"female",
|
109
|
+
"neuter"
|
110
|
+
]
|
111
|
+
},
|
112
|
+
"ability_id": {
|
113
|
+
"type": "string"
|
114
|
+
},
|
115
|
+
"item_id": {
|
116
|
+
"type": ["string", "null"]
|
117
|
+
},
|
118
|
+
"nature_id": {
|
119
|
+
"type": "string"
|
120
|
+
},
|
121
|
+
"hp": {
|
122
|
+
"type": "integer",
|
123
|
+
"minimum": 0,
|
124
|
+
"maximum": 10000000
|
125
|
+
},
|
126
|
+
"friendship": {
|
127
|
+
"type": "integer",
|
128
|
+
"minimum": 0,
|
129
|
+
"maximum": 255
|
130
|
+
},
|
131
|
+
"original_trainer": {
|
132
|
+
"type": ["string", "null"]
|
133
|
+
},
|
134
|
+
"ev": {
|
135
|
+
"$ref": "#/definitions/ev_stats"
|
136
|
+
},
|
137
|
+
"iv": {
|
138
|
+
"$ref": "#/definitions/iv_stats"
|
139
|
+
},
|
140
|
+
"primary_status_condition": {
|
141
|
+
"type": ["string", "null"],
|
142
|
+
"enum": [
|
143
|
+
"poison",
|
144
|
+
"bad_poison",
|
145
|
+
"paralysis",
|
146
|
+
"sleep",
|
147
|
+
"freeze",
|
148
|
+
"burn",
|
149
|
+
null
|
150
|
+
]
|
151
|
+
},
|
152
|
+
"wild": {
|
153
|
+
"type": ["boolean", "null"]
|
154
|
+
},
|
155
|
+
"moves": {
|
156
|
+
"type": "array",
|
157
|
+
"minItems": 1,
|
158
|
+
"items": {
|
159
|
+
"type": "object",
|
160
|
+
"properties": {
|
161
|
+
"move_id": {
|
162
|
+
"type": "string"
|
163
|
+
},
|
164
|
+
"pp": {
|
165
|
+
"type": "integer",
|
166
|
+
"minimum": 0,
|
167
|
+
"maximum": 50
|
168
|
+
},
|
169
|
+
"max_pp": {
|
170
|
+
"type": "integer",
|
171
|
+
"minimum": 0,
|
172
|
+
"maximum": 50
|
173
|
+
}
|
174
|
+
},
|
175
|
+
"required": [
|
176
|
+
"move_id",
|
177
|
+
"pp",
|
178
|
+
"max_pp"
|
179
|
+
],
|
180
|
+
"additionalProperties": false
|
181
|
+
}
|
182
|
+
},
|
183
|
+
"amie": {
|
184
|
+
"type": ["object", "null"],
|
185
|
+
"properties": {
|
186
|
+
"affection": {
|
187
|
+
"type": "integer",
|
188
|
+
"minimum": 0,
|
189
|
+
"maximum": 255
|
190
|
+
},
|
191
|
+
"fullness": {
|
192
|
+
"type": "integer",
|
193
|
+
"minimum": 0,
|
194
|
+
"maximum": 255
|
195
|
+
},
|
196
|
+
"enjoyment": {
|
197
|
+
"type": "integer",
|
198
|
+
"minimum": 0,
|
199
|
+
"maximum": 255
|
200
|
+
}
|
201
|
+
},
|
202
|
+
"additionalProperties": false
|
203
|
+
},
|
204
|
+
"growth_events": {
|
205
|
+
"type": "array",
|
206
|
+
"items": {
|
207
|
+
"type": "object",
|
208
|
+
"properties": {
|
209
|
+
"name": {
|
210
|
+
"type": "string"
|
211
|
+
},
|
212
|
+
"options": {
|
213
|
+
"type": "object"
|
214
|
+
}
|
215
|
+
},
|
216
|
+
"required": [
|
217
|
+
"name",
|
218
|
+
"options"
|
219
|
+
],
|
220
|
+
"additionalProperties": false
|
221
|
+
}
|
222
|
+
}
|
223
|
+
},
|
224
|
+
"required": [
|
225
|
+
"species_id",
|
226
|
+
"exp",
|
227
|
+
"ability_id",
|
228
|
+
"gender",
|
229
|
+
"nature_id",
|
230
|
+
"hp",
|
231
|
+
"iv",
|
232
|
+
"ev",
|
233
|
+
"moves",
|
234
|
+
"friendship"
|
235
|
+
],
|
236
|
+
"additionalProperties": false
|
237
|
+
}
|
@@ -31,7 +31,7 @@ module Oakdex
|
|
31
31
|
def effect_usable?
|
32
32
|
@item.effects.any? do |effect|
|
33
33
|
condition_applies?(effect) && target_applies?(effect) &&
|
34
|
-
pokemon_changes_apply?(effect)
|
34
|
+
pokemon_changes_apply?(effect) && move_changes_apply?(effect)
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
@@ -56,22 +56,51 @@ module Oakdex
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
+
def move_changes_apply?(effect)
|
60
|
+
move_changes = effect['move_changes'] || []
|
61
|
+
return true if move_changes.empty?
|
62
|
+
move_changes.any? do |change|
|
63
|
+
move_change_applies?(change)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
59
67
|
def pokemon_change_applies?(change)
|
60
68
|
!pokemon_field_max?(change) &&
|
61
|
-
(
|
69
|
+
(independent_fainted?(change) ||
|
70
|
+
!@pokemon.fainted? ||
|
71
|
+
(@pokemon.fainted? && change['revive']))
|
72
|
+
end
|
73
|
+
|
74
|
+
def move_change_applies?(change)
|
75
|
+
!move_field_max?(change)
|
76
|
+
end
|
77
|
+
|
78
|
+
def move_field_max?(change)
|
79
|
+
case change['field']
|
80
|
+
when 'max_pp' then @pokemon.moves.all?(&:max_pp_at_max?)
|
81
|
+
when 'pp' then @pokemon.moves.all?(&:pp_max?)
|
82
|
+
end
|
62
83
|
end
|
63
84
|
|
64
85
|
def pokemon_field_max?(change)
|
65
86
|
case change['field']
|
66
87
|
when 'current_hp' then @pokemon.current_hp >= @pokemon.hp
|
88
|
+
when 'level' then @pokemon.level >= 100
|
89
|
+
when /^ev_/ then @pokemon.ev_max?(change['field'].sub('ev_', '').to_sym)
|
67
90
|
when 'status_condition' then !change['conditions']
|
68
91
|
.include?(@pokemon.primary_status_condition)
|
69
92
|
end
|
70
93
|
end
|
71
94
|
|
95
|
+
def independent_fainted?(change)
|
96
|
+
%w[level max_pp].include?(change['field']) ||
|
97
|
+
change['field'].start_with?('ev_')
|
98
|
+
end
|
99
|
+
|
72
100
|
def execute_effects
|
73
101
|
@item.effects.each do |effect|
|
74
102
|
execute_pokemon_changes(effect)
|
103
|
+
execute_move_changes(effect)
|
75
104
|
end
|
76
105
|
end
|
77
106
|
|
@@ -81,17 +110,91 @@ module Oakdex
|
|
81
110
|
end
|
82
111
|
end
|
83
112
|
|
113
|
+
def execute_move_changes(effect)
|
114
|
+
(effect['move_changes'] || []).each do |change|
|
115
|
+
execute_move_change(change, effect) if move_change_applies?(change)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
84
119
|
def execute_pokemon_change(change)
|
85
120
|
case change['field']
|
86
121
|
when 'current_hp' then execute_current_hp_change(change)
|
87
122
|
when 'status_condition' then execute_remove_status_condition(change)
|
123
|
+
when 'level' then execute_level_up(change)
|
124
|
+
when /^ev_/ then execute_ev_change(change)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def execute_move_change(change, effect)
|
129
|
+
case change['field']
|
130
|
+
when 'max_pp' then execute_add_max_pp(change)
|
131
|
+
when 'pp' then execute_add_pp(change, effect)
|
88
132
|
end
|
89
133
|
end
|
90
134
|
|
135
|
+
def execute_level_up(_change)
|
136
|
+
@pokemon.increment_level
|
137
|
+
end
|
138
|
+
|
139
|
+
def execute_ev_change(change)
|
140
|
+
stat = change['field'].sub('ev_', '').to_sym
|
141
|
+
@pokemon.add_ev(stat, change['change_by'])
|
142
|
+
end
|
143
|
+
|
91
144
|
def execute_remove_status_condition(_change)
|
92
145
|
@pokemon.add_growth_event(GrowthEvents::RemoveStatusCondition)
|
93
146
|
end
|
94
147
|
|
148
|
+
def execute_add_max_pp(change)
|
149
|
+
moves = @pokemon.moves.map do |move|
|
150
|
+
next if move.max_pp_at_max?
|
151
|
+
[move.name, change_for_move(move, change)]
|
152
|
+
end.compact.to_h
|
153
|
+
@pokemon.add_growth_event(GrowthEvents::IncreaseMaxPp, moves: moves)
|
154
|
+
end
|
155
|
+
|
156
|
+
def execute_add_pp(change, effect)
|
157
|
+
if effect['target'] == 'Single Pokemon > All Moves'
|
158
|
+
@pokemon.moves.each do |move|
|
159
|
+
next if move.pp_max?
|
160
|
+
@pokemon.add_growth_event(
|
161
|
+
GrowthEvents::IncreaseMovePp,
|
162
|
+
move_id: move.name,
|
163
|
+
change_by: pp_change_for_move(move, change)
|
164
|
+
)
|
165
|
+
end
|
166
|
+
else
|
167
|
+
moves = @pokemon.moves.map do |move|
|
168
|
+
next if move.pp_max?
|
169
|
+
[move.name, pp_change_for_move(move, change)]
|
170
|
+
end.compact.to_h
|
171
|
+
@pokemon.add_growth_event(GrowthEvents::IncreasePp, moves: moves)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def pp_change_for_move(move, change)
|
176
|
+
if change['change_by_percent']
|
177
|
+
(move.max_pp.to_f * (change['change_by_percent'].to_f / 100)).to_i
|
178
|
+
else
|
179
|
+
change['change_by']
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def change_for_move(move, change)
|
184
|
+
increase_by = if change['change_by_percent']
|
185
|
+
(move.move_type.pp.to_f *
|
186
|
+
(change['change_by_percent'].to_f / 100)).to_i
|
187
|
+
else
|
188
|
+
change['change_by']
|
189
|
+
end
|
190
|
+
|
191
|
+
if change['change_by_max'] && increase_by > change['change_by_max']
|
192
|
+
change['change_by_max']
|
193
|
+
else
|
194
|
+
increase_by
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
95
198
|
def execute_current_hp_change(change)
|
96
199
|
change_by = change['change_by']
|
97
200
|
if change['change_by_percent']
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jalyna Schroeder
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oakdex-pokedex
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.4.3
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: json-schema
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.5.2
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.5.2
|
27
41
|
description: Pokémon Instance Representer, based on oakdex-pokedex
|
28
42
|
email: jalyna.schroeder@gmail.com
|
29
43
|
executables: []
|
@@ -43,13 +57,21 @@ files:
|
|
43
57
|
- lib/oakdex/pokemon/growth_events/did_not_learn_move.rb
|
44
58
|
- lib/oakdex/pokemon/growth_events/evolution.rb
|
45
59
|
- lib/oakdex/pokemon/growth_events/forgot_and_learned_move.rb
|
60
|
+
- lib/oakdex/pokemon/growth_events/gained_ev.rb
|
46
61
|
- lib/oakdex/pokemon/growth_events/gained_exp.rb
|
62
|
+
- lib/oakdex/pokemon/growth_events/increase_max_pp.rb
|
63
|
+
- lib/oakdex/pokemon/growth_events/increase_move_max_pp.rb
|
64
|
+
- lib/oakdex/pokemon/growth_events/increase_move_pp.rb
|
65
|
+
- lib/oakdex/pokemon/growth_events/increase_pp.rb
|
47
66
|
- lib/oakdex/pokemon/growth_events/learn_move.rb
|
48
67
|
- lib/oakdex/pokemon/growth_events/level_up.rb
|
49
68
|
- lib/oakdex/pokemon/growth_events/remove_status_condition.rb
|
50
69
|
- lib/oakdex/pokemon/growth_events/revive.rb
|
51
70
|
- lib/oakdex/pokemon/growth_events/skipped_evolution.rb
|
71
|
+
- lib/oakdex/pokemon/import.rb
|
72
|
+
- lib/oakdex/pokemon/invalid_pokemon.rb
|
52
73
|
- lib/oakdex/pokemon/move.rb
|
74
|
+
- lib/oakdex/pokemon/schema.json
|
53
75
|
- lib/oakdex/pokemon/stat.rb
|
54
76
|
- lib/oakdex/pokemon/use_item_service.rb
|
55
77
|
- lib/oakdex/pokemon/version.rb
|