From c58d76edc7926ea03b193e9a40183184a564bf0a Mon Sep 17 00:00:00 2001 From: David Gay Date: Fri, 9 Apr 2021 18:22:35 -0400 Subject: Improve hacked-together pokemon generator, plus BSR --- app/models/ptu_pokemon.rb | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) (limited to 'app/models/ptu_pokemon.rb') 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 -- cgit v1.2.3