summaryrefslogtreecommitdiff
path: root/app/models/ptu_pokemon.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/ptu_pokemon.rb')
-rw-r--r--app/models/ptu_pokemon.rb41
1 files changed, 33 insertions, 8 deletions
diff --git a/app/models/ptu_pokemon.rb b/app/models/ptu_pokemon.rb
index a351701..6074fcd 100644
--- a/app/models/ptu_pokemon.rb
+++ b/app/models/ptu_pokemon.rb
@@ -17,7 +17,6 @@ class PtuPokemon < ApplicationRecord
def random_stat_hash(level: 1)
nature = PtuNature.find(PtuNature.pluck(:id).sample)
- points_to_assign = 10 + level
if self.male_chance
gender = 1 + rand(100) <= self.male_chance ? "Male" : "Female"
else
@@ -28,22 +27,48 @@ class PtuPokemon < ApplicationRecord
level: level,
gender: gender,
nature: nature.name,
- stats: {
+ base_stats: {
hp: self.base_hp,
atk: self.base_atk,
def: self.base_def,
spatk: self.base_spatk,
spdef: self.base_spdef,
speed: self.base_speed,
- }
+ },
+ stats: {},
}
+
+ # Adjust base stats for nature
+ hash[:base_stats][nature.raises.to_sym] += nature.raises.to_sym == :hp ? 1 : 2
+ hash[:base_stats][nature.lowers.to_sym] -= nature.lowers.to_sym == :hp ? 1 : 2
+ hash[:base_stats][nature.lowers.to_sym] = [1, hash[:base_stats][nature.lowers.to_sym]].max
+
+ # e.g. [[:speed, 9], [:atk, 8], [:def, 8], [:spatk, 6], [:spdef, 6], [:hp, 5]]
+ sorted_base_stats = hash[:base_stats].sort_by { |_, v| -v }
+
+ rank = 1
+ # e.g. [1, 2, 2, 4, 4, 6]
+ rankings_array = sorted_base_stats.each_with_index.map { |a, i| sorted_base_stats[i - 1][1] == a[1] ? rank : (rank = i + 1) }
+
+ # e.g. {:speed=>1, :atk=>2, :def=>2, :spatk=>4, :spdef=>4, :hp=>6}
+ base_stat_rankings = Hash[sorted_base_stats.map { |s| s[0] }.zip(rankings_array)]
+
+ hash[:stats] = hash[:base_stats].deep_dup
+ points_to_assign = 10 + level
points_to_assign.times do
- stat = hash[:stats].keys.sample
- hash[:stats][stat] += stat == :hp ? 1 : 2
+ loop do
+ stat = hash[:stats].keys.sample
+ higher_base_stats = base_stat_rankings.select { |_, v| v < base_stat_rankings[stat] }.keys
+ if higher_base_stats.select { |s| hash[:stats][s] <= (hash[:stats][stat] + 1) }.any?
+ next
+ else
+ hash[:stats][stat] += 1 and break
+ end
+ end
end
- hash[:stats][nature.raises.to_sym] += nature.raises.to_sym == :hp ? 1 : 2
- hash[:stats][nature.lowers.to_sym] -= nature.lowers.to_sym == :hp ? 1 : 2
- hash[:stats][nature.lowers.to_sym] = [1, hash[:stats][nature.lowers.to_sym]].max
+
+ hash[:hit_points] = 10 + level + (hash[:stats][:hp] * 3)
+
hash
end
end