oakdex-battle 0.0.1 → 0.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: ecd31f627a41112b511d36b3f229b4f39f16c50db2f30d2152d6d8be6c2a4084
4
- data.tar.gz: c4d2ff60f0bc64a148b278f8dc9493a71191298672d0f365fa0a5ce2a3e8ab61
2
+ SHA1:
3
+ metadata.gz: a1d0972ff95da713b2117cf6f642ac45edc48daa
4
+ data.tar.gz: 9d71621683079bebffd2703b7c448a3df79873ca
5
5
  SHA512:
6
- metadata.gz: eae5231ca258390c2d3b3f2af6979b34f66c9615ed6e55c7c636d96267cdae3f76a8a86475f19a819aa0bdda1746f6b3efb8f84c0547cbb7290099efd6889ba4
7
- data.tar.gz: 5a22eb518390c80e4eb7d5ab086ef744588a11de5260043050958a2930286dca62a88efe27f957bd6fccdc2c47c397325a11f5fa143fc5ff6d04399d4f11a2b5
6
+ metadata.gz: '08b23d0d4936817b5a93f044fd69af58ee74b534e973e97d143555d9f0f6b2af9b23a95c910833aa689bd13e794dcf4a37d383f09173906c4d632ffcd2613acd'
7
+ data.tar.gz: 25f79543b12fde79d5777cc6857a65b08aaee38bca10a11fa9c32b2bb259b50634d2f01a6502221432d786c04edcc9bd86bfc673846b47921ffc5f3c39d07ee0
data/README.md CHANGED
@@ -90,10 +90,25 @@ battle = Oakdex::Battle.new([trainer1], [trainer2], pokemon_per_side: 3)
90
90
  battle = Oakdex::Battle.new([trainer1, trainer3], [trainer2, trainer4])
91
91
  ```
92
92
 
93
+
94
+ ### Breeding
95
+
96
+ ```ruby
97
+ pok1 = Oakdex::Battle::Pokemon.create('Ditto', level: 20)
98
+ pok2 = Oakdex::Battle::Pokemon.create('Pikachu', level: 20, gender: 'female')
99
+
100
+ Oakdex::Battle::Breeding.compatible?(pok1, pok2) # => true
101
+ Oakdex::Battle::Breeding.chance_in_percentage(pok1, pok2) # => 20
102
+ Oakdex::Battle::Breeding.breed(pok1, pok2) #=> Oakdex::Battle::Pokemon Pichu
103
+ ```
104
+
105
+
93
106
  ## Contributing
94
107
 
95
108
  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.
96
109
 
110
+ Please respect the [Code of Conduct](//github.com/jalyna/oakdex-battle/blob/master/CODE_OF_CONDUCT.md).
111
+
97
112
  ## License
98
113
 
99
114
  MIT License. See the included MIT-LICENSE file.
data/lib/oakdex/battle.rb CHANGED
@@ -9,6 +9,7 @@ require 'oakdex/battle/turn'
9
9
  require 'oakdex/battle/valid_action_service'
10
10
  require 'oakdex/battle/side'
11
11
  require 'oakdex/battle/in_battle_pokemon'
12
+ require 'oakdex/battle/breeding'
12
13
 
13
14
  module Oakdex
14
15
  # Represents battle, with has n turns and m sides
@@ -0,0 +1,109 @@
1
+ module Oakdex
2
+ class Battle
3
+ # Pokemon Breeding
4
+ class Breeding
5
+ class << self
6
+ def compatible?(pokemon1, pokemon2)
7
+ new(pokemon1, pokemon2).compatible?
8
+ end
9
+
10
+ def chance_in_percentage(pokemon1, pokemon2)
11
+ new(pokemon1, pokemon2).chance_in_percentage
12
+ end
13
+
14
+ def breed(pokemon1, pokemon2)
15
+ new(pokemon1, pokemon2).child
16
+ end
17
+ end
18
+
19
+ def initialize(pokemon1, pokemon2)
20
+ @female = pokemon1.gender == 'female' ? pokemon1 : pokemon2
21
+ @male = ([pokemon1, pokemon2] - [@female]).first
22
+ end
23
+
24
+ def compatible?
25
+ (opposite_gender? && same_egg_group? && !any_undiscovered?) ||
26
+ (exactly_one_is_ditto? && non_ditto_is_discovered?)
27
+ end
28
+
29
+ def chance_in_percentage
30
+ return 0 unless compatible?
31
+ return 50 if same_species?
32
+ 20
33
+ end
34
+
35
+ def child
36
+ return unless compatible?
37
+ Oakdex::Battle::Pokemon.create(child_species.name,
38
+ level: 1,
39
+ additional_moves: enabled_egg_moves
40
+ )
41
+ end
42
+
43
+ private
44
+
45
+ def child_species
46
+ @child_species ||=
47
+ lowest_in_evolutionary_chain(non_ditto_or_female.species)
48
+ end
49
+
50
+ def enabled_egg_moves
51
+ egg_moves & parent_moves
52
+ end
53
+
54
+ def parent_moves
55
+ @female.moves.map(&:name) + @male.moves.map(&:name)
56
+ end
57
+
58
+ def egg_moves
59
+ child_species.learnset
60
+ .map { |l| l['egg_move'] ? l['move'] : nil }
61
+ .compact
62
+ end
63
+
64
+ def lowest_in_evolutionary_chain(species)
65
+ # TODO: take incenses into account
66
+ lowest_species = species
67
+ while lowest_species.evolution_from
68
+ lowest_species = Oakdex::Pokedex::Pokemon
69
+ .find!(lowest_species.evolution_from)
70
+ end
71
+ lowest_species
72
+ end
73
+
74
+ def exactly_one_is_ditto?
75
+ (@female.name == 'Ditto') ^ (@male.name == 'Ditto')
76
+ end
77
+
78
+ def non_ditto_is_discovered?
79
+ !non_ditto.species.egg_groups.include?('Undiscovered')
80
+ end
81
+
82
+ def non_ditto
83
+ return unless exactly_one_is_ditto?
84
+ @female.name == 'Ditto' ? @male : @female
85
+ end
86
+
87
+ def non_ditto_or_female
88
+ non_ditto || @female
89
+ end
90
+
91
+ def opposite_gender?
92
+ @female.gender == 'female' && @male.gender == 'male'
93
+ end
94
+
95
+ def same_egg_group?
96
+ !(@female.species.egg_groups & @male.species.egg_groups).empty?
97
+ end
98
+
99
+ def any_undiscovered?
100
+ (@female.species.egg_groups + @male.species.egg_groups)
101
+ .include?('Undiscovered')
102
+ end
103
+
104
+ def same_species?
105
+ @female.name == @male.name
106
+ end
107
+ end
108
+ end
109
+ end
@@ -24,6 +24,7 @@ module Oakdex
24
24
  def_delegators :@species, :types
25
25
 
26
26
  attr_accessor :trainer
27
+ attr_reader :species
27
28
 
28
29
  def self.create(species_name, options = {})
29
30
  species = Oakdex::Pokedex::Pokemon.find!(species_name)
@@ -41,6 +42,10 @@ module Oakdex
41
42
  @species.names['en']
42
43
  end
43
44
 
45
+ def gender
46
+ @attributes[:gender]
47
+ end
48
+
44
49
  def moves
45
50
  @attributes[:moves]
46
51
  end
@@ -31,10 +31,22 @@ module Oakdex
31
31
  )
32
32
  end
33
33
  else
34
- available_moves.sample(4).map do |move_name|
35
- move_type = Oakdex::Pokedex::Move.find!(move_name)
36
- Move.new(move_type, move_type.pp, move_type.pp)
37
- end
34
+ (generate_available_moves + additional_moves).take(4)
35
+ end
36
+ end
37
+
38
+ def generate_available_moves
39
+ available_moves.sample(4).map do |move_name|
40
+ move_type = Oakdex::Pokedex::Move.find!(move_name)
41
+ Move.new(move_type, move_type.pp, move_type.pp)
42
+ end
43
+ end
44
+
45
+ def additional_moves
46
+ return [] unless @options[:additional_moves]
47
+ @options[:additional_moves].map do |move_name|
48
+ move_type = Oakdex::Pokedex::Move.find!(move_name)
49
+ Move.new(move_type, move_type.pp, move_type.pp)
38
50
  end
39
51
  end
40
52
 
@@ -1,5 +1,5 @@
1
1
  module Oakdex
2
2
  class Battle
3
- VERSION = '0.0.1'
3
+ VERSION = '0.0.2'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oakdex-battle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jalyna Schroeder
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-11 00:00:00.000000000 Z
11
+ date: 2019-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oakdex-pokedex
@@ -34,6 +34,7 @@ files:
34
34
  - lib/oakdex.rb
35
35
  - lib/oakdex/battle.rb
36
36
  - lib/oakdex/battle/action.rb
37
+ - lib/oakdex/battle/breeding.rb
37
38
  - lib/oakdex/battle/damage.rb
38
39
  - lib/oakdex/battle/in_battle_pokemon.rb
39
40
  - lib/oakdex/battle/move.rb
@@ -75,7 +76,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
75
76
  version: '0'
76
77
  requirements: []
77
78
  rubyforge_project:
78
- rubygems_version: 2.7.3
79
+ rubygems_version: 2.5.2
79
80
  signing_key:
80
81
  specification_version: 4
81
82
  summary: Pokémon Battle Engine in Ruby