oakdex-battle 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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