oakdex-pokemon 0.0.6 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|