From 6fdeffebf1093664bb769acccb9c6a356b825cf0 Mon Sep 17 00:00:00 2001 From: Emi Matchu Date: Sat, 31 Aug 2024 13:37:12 -0700 Subject: [PATCH 1/2] Simplify PetType.random_basic_per_species I'm mostly just going around looking for `special_color`, a concept I think the app doesn't use anymore, and removing it where I see it! --- app/models/pet_type.rb | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/app/models/pet_type.rb b/app/models/pet_type.rb index b34d2910..31602ad8 100644 --- a/app/models/pet_type.rb +++ b/app/models/pet_type.rb @@ -11,23 +11,18 @@ class PetType < ApplicationRecord BasicHashes = YAML::load_file(Rails.root.join('config', 'basic_type_hashes.yml')) + scope :basic, -> { joins(:color).merge(Color.basic) } scope :matching_name, ->(color_name, species_name) { color = Color.find_by_name!(color_name) species = Species.find_by_name!(species_name) where(color_id: color.id, species_id: species.id) } - def self.special_color_or_basic(special_color) - color_ids = special_color ? [special_color.id] : Color.basic.select([:id]).map(&:id) - where(color_id: color_ids) - end - def self.random_basic_per_species(species_ids) random_pet_types = [] - # TODO: omg so lame :P - standards = special_color_or_basic(nil).group_by(&:species_id) + basics_by_species_id = basic.group_by(&:species_id) species_ids.each do |species_id| - pet_types = standards[species_id] + pet_types = basics_by_species_id[species_id] random_pet_types << pet_types[rand(pet_types.size)] if pet_types end random_pet_types From 1c36276865edfac554817b46adb9f9f3feadeae0 Mon Sep 17 00:00:00 2001 From: Emi Matchu Date: Sat, 31 Aug 2024 13:42:25 -0700 Subject: [PATCH 2/2] Remove unused `special_color` logic from Item We used to use this to determine what color to show by default on the item page preview for, like, Maraquan-specific items. Now, we infer it from our actual customization data, rather than these heuristics! There's still a database field for `Item#manual_special_color_id`. We can still read and write this from the support UI, and Impress 2020 still slightly uses it from the homepage, so I'm not removing from the database right now. --- app/models/item.rb | 51 ---------------------------------------------- 1 file changed, 51 deletions(-) diff --git a/app/models/item.rb b/app/models/item.rb index e246be6f..e1b74953 100644 --- a/app/models/item.rb +++ b/app/models/item.rb @@ -25,8 +25,6 @@ class Item < ApplicationRecord NCRarities = [0, 500] PAINTBRUSH_SET_DESCRIPTION = 'This item is part of a deluxe paint brush set!' - SPECIAL_COLOR_DESCRIPTION_REGEX = - /This item is only wearable by [a-zA-Z]+ painted ([a-zA-Z]+)\.|WARNING: This [a-zA-Z]+ can be worn by ([a-zA-Z]+) [a-zA-Z]+ ONLY!|If your Neopet is not painted ([a-zA-Z]+), it will not be able to wear this item\./ scope :newest, -> { order(arel_table[:created_at].desc) if arel_table[:created_at] @@ -306,55 +304,6 @@ class Item < ApplicationRecord restricted_zones + occupied_zones end - def special_color - @special_color ||= determine_special_color - end - - def special_color_id - special_color.try(:id) - end - - protected - def determine_special_color - I18n.with_locale(I18n.default_locale) do - # Rather than go find the special description in all locales, let's just - # run this logic in English. - if description.include?(PAINTBRUSH_SET_DESCRIPTION) - name_words = name.downcase.split - Color.nonstandard.each do |color| - return color if name_words.include?(color.name) - end - end - - match = description.match(SPECIAL_COLOR_DESCRIPTION_REGEX) - if match - # Since there are multiple formats in the one regex, there are multiple - # possible color name captures. So, take the first non-nil capture. - color = match.captures.detect(&:present?) - return Color.find_by_name(color.downcase) - end - - # HACK: this should probably be a flag on the record instead of - # being hardcoded :P - if [71893, 76192, 76202, 77367, 77368, 77369, 77370].include?(id) - return Color.find_by_name('baby') - end - - if [76198].include?(id) - return Color.find_by_name('mutant') - end - - if [75372].include?(id) - return Color.find_by_name('maraquan') - end - - if manual_special_color_id? - return Color.find(manual_special_color_id) - end - end - end - public - def species_support_ids @species_support_ids_array ||= read_attribute('species_support_ids').split(',').map(&:to_i) rescue nil end