Add more PB item info and links to Item Getting Guide
I add some infrastructural support for inferring an item's paintbrush color (if any), and a field to the database to manually track an item's paint brush item name! This is both useful for tracking which colors are even *available* via paint brush, and also for working with colors with unusual paint brush names, like the "Get Off My Lawn Paint Brush" (for Elderly pets). Here's the script I ran to backfill this for current colors and their paint brushes! ```rb Color.find_by_name("Baby").update!(pb_item_name: "Baby Paint Brush") Color.find_by_name("Biscuit").update!(pb_item_name: "Biscuit Paint Brush") Color.find_by_name("Blue").update!(pb_item_name: "Blue Paint Brush") Color.find_by_name("Brown").update!(pb_item_name: "Brown Paint Brush") Color.find_by_name("Camouflage").update!(pb_item_name: "Camouflage Paint Brush") Color.find_by_name("Candy").update!(pb_item_name: "Candy Paint Brush") Color.find_by_name("Checkered").update!(pb_item_name: "Checkered Paint Brush") Color.find_by_name("Christmas").update!(pb_item_name: "Christmas Paint Brush") Color.find_by_name("Cloud").update!(pb_item_name: "Cloud Paint Brush") Color.find_by_name("Darigan").update!(pb_item_name: "Darigan Paint Brush") Color.find_by_name("Dimensional").update!(pb_item_name: "Dimensional Paint Brush") Color.find_by_name("Disco").update!(pb_item_name: "Disco Fever Paint Brush") Color.find_by_name("Electric").update!(pb_item_name: "Electric Blue Paint Brush") Color.find_by_name("Eventide").update!(pb_item_name: "Eventide Paint Brush") Color.find_by_name("Faerie").update!(pb_item_name: "Faerie Paint Brush") Color.find_by_name("Fire").update!(pb_item_name: "Fire, Fire, Your Pants On Fire Paint Brush") Color.find_by_name("Elderlyboy").update!(pb_item_name: "Get Off My Lawn Paint Brush") Color.find_by_name("Elderlygirl").update!(pb_item_name: "Get Off My Lawn Paint Brush") Color.find_by_name("Ghost").update!(pb_item_name: "Ghost Paint Brush") Color.find_by_name("Glowing").update!(pb_item_name: "Glowing Paint Brush") Color.find_by_name("Gold").update!(pb_item_name: "Golden Paint Brush") Color.find_by_name("Green").update!(pb_item_name: "Green Paint Brush") Color.find_by_name("Grey").update!(pb_item_name: "Grey Paint Brush") Color.find_by_name("Halloween").update!(pb_item_name: "Halloween Paint Brush") Color.find_by_name("Invisible").update!(pb_item_name: "Invisible Paint Brush") Color.find_by_name("Desert").update!(pb_item_name: "Lost Desert Paint Brush") Color.find_by_name("Maractite").update!(pb_item_name: "Maractite Paint Brush") Color.find_by_name("Maraquan").update!(pb_item_name: "Maraquan Paint Brush") Color.find_by_name("Marble").update!(pb_item_name: "Marble Paint Brush") Color.find_by_name("Island").update!(pb_item_name: "Mystery Island Paint Brush") Color.find_by_name("Oil Paint").update!(pb_item_name: "Oil Paint Brush") Color.find_by_name("Orange").update!(pb_item_name: "Orange Paint Brush") Color.find_by_name("Origami").update!(pb_item_name: "Origami Paint Brush") Color.find_by_name("Pastel").update!(pb_item_name: "Pastel Paint Brush") Color.find_by_name("Pink").update!(pb_item_name: "Pink Paint Brush") Color.find_by_name("Pirate").update!(pb_item_name: "Pirate Paint Brush") Color.find_by_name("Plushie").update!(pb_item_name: "Plushie Paint Brush") Color.find_by_name("Polka Dot").update!(pb_item_name: "Polka Dot Paint Brush") Color.find_by_name("Purple").update!(pb_item_name: "Purple Paint Brush") Color.find_by_name("Rainbow").update!(pb_item_name: "Rainbow Paint Brush") Color.find_by_name("Red").update!(pb_item_name: "Red Paint Brush") Color.find_by_name("Relic").update!(pb_item_name: "Relic Paint Brush") Color.find_by_name("Royalboy").update!(pb_item_name: "Royal Paint Brush") Color.find_by_name("Royalgirl").update!(pb_item_name: "Royal Paint Brush") Color.find_by_name("Sketch").update!(pb_item_name: "Scritchy Sketchy Paint Brush") Color.find_by_name("Shadow").update!(pb_item_name: "Shadow Paint Brush") Color.find_by_name("Silver").update!(pb_item_name: "Silver Paint Brush") Color.find_by_name("Skunk").update!(pb_item_name: "Skunk Paint Brush") Color.find_by_name("Snow").update!(pb_item_name: "Snow Paint Brush") Color.find_by_name("Speckled").update!(pb_item_name: "Speckled Paint Brush") Color.find_by_name("Split").update!(pb_item_name: "Split Paint Brush") Color.find_by_name("Spotted").update!(pb_item_name: "Spotted Paint Brush") Color.find_by_name("Starry").update!(pb_item_name: "Starry Paint Brush") Color.find_by_name("Stealthy").update!(pb_item_name: "Stealth Paint Brush") Color.find_by_name("Steampunk").update!(pb_item_name: "Steampunk Paint Brush") Color.find_by_name("Strawberry").update!(pb_item_name: "Strawberry Fields Forever Paint Brush") Color.find_by_name("Striped").update!(pb_item_name: "Striped Paint Brush") Color.find_by_name("Swamp Gas").update!(pb_item_name: "Swamp Gas Paint Brush") Color.find_by_name("Toy").update!(pb_item_name: "Toy Paint Brush") Color.find_by_name("Transparent").update!(pb_item_name: "Transparent Paint Brush") Color.find_by_name("Tyrannian").update!(pb_item_name: "Tyrannian Paint Brush") Color.find_by_name("Usuki Boy").update!(pb_item_name: "Usuki Paint Brush") Color.find_by_name("Usuki Girl").update!(pb_item_name: "Usuki Paint Brush") Color.find_by_name("Valentine").update!(pb_item_name: "Valentine Paint Brush") Color.find_by_name("Water").update!(pb_item_name: "Water Paint Brush") Color.find_by_name("White").update!(pb_item_name: "White Paint Brush") Color.find_by_name("Woodland").update!(pb_item_name: "Woodland Paint Brush") Color.find_by_name("Wraith").update!(pb_item_name: "Wraith Paint Brush") Color.find_by_name("Yellow").update!(pb_item_name: "Yellow Paint Brush") Color.find_by_name("Zombie").update!(pb_item_name: "Zombie Paint Brush") ```
This commit is contained in:
parent
1bd5598b64
commit
1b03c2caed
6 changed files with 60 additions and 8 deletions
|
@ -52,3 +52,7 @@
|
||||||
.actions-cell button
|
.actions-cell button
|
||||||
/* Bootstrap's Purple 600 */
|
/* Bootstrap's Purple 600 */
|
||||||
+awesome-button-color(#59359a)
|
+awesome-button-color(#59359a)
|
||||||
|
|
||||||
|
.special-color-explanation
|
||||||
|
text-wrap: balance
|
||||||
|
font-style: italic
|
||||||
|
|
|
@ -97,8 +97,9 @@ module ItemsHelper
|
||||||
SHOP_WIZARD_URL_TEMPLATE = Addressable::Template.new(
|
SHOP_WIZARD_URL_TEMPLATE = Addressable::Template.new(
|
||||||
"https://www.neopets.com/shops/wizard.phtml{?string}"
|
"https://www.neopets.com/shops/wizard.phtml{?string}"
|
||||||
)
|
)
|
||||||
def shop_wizard_url_for(item)
|
def shop_wizard_url_for(item_or_name)
|
||||||
SHOP_WIZARD_URL_TEMPLATE.expand(string: item.name).to_s
|
item_or_name = item_or_name.name if item_or_name.is_a? Item
|
||||||
|
SHOP_WIZARD_URL_TEMPLATE.expand(string: item_or_name).to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
SUPER_SHOP_WIZARD_URL_TEMPLATE = Addressable::Template.new(
|
SUPER_SHOP_WIZARD_URL_TEMPLATE = Addressable::Template.new(
|
||||||
|
@ -111,8 +112,9 @@ module ItemsHelper
|
||||||
TRADING_POST_URL_TEMPLATE = Addressable::Template.new(
|
TRADING_POST_URL_TEMPLATE = Addressable::Template.new(
|
||||||
"https://www.neopets.com/island/tradingpost.phtml?type=browse&criteria=item_exact{&search_string}"
|
"https://www.neopets.com/island/tradingpost.phtml?type=browse&criteria=item_exact{&search_string}"
|
||||||
)
|
)
|
||||||
def trading_post_url_for(item)
|
def trading_post_url_for(item_or_name)
|
||||||
TRADING_POST_URL_TEMPLATE.expand(search_string: item.name).to_s
|
item_or_name = item_or_name.name if item_or_name.is_a? Item
|
||||||
|
TRADING_POST_URL_TEMPLATE.expand(search_string: item_or_name).to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
AUCTION_GENIE_URL_TEMPLATE = Addressable::Template.new(
|
AUCTION_GENIE_URL_TEMPLATE = Addressable::Template.new(
|
||||||
|
|
|
@ -179,6 +179,28 @@ class Item < ApplicationRecord
|
||||||
nc_mall_record&.current_price
|
nc_mall_record&.current_price
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# If this is a PB item, return the corresponding Color, inferred from the
|
||||||
|
# item name. If it's not a PB item, or we fail to infer, return nil.
|
||||||
|
def pb_color
|
||||||
|
return nil unless pb?
|
||||||
|
|
||||||
|
# NOTE: To handle colors like "Royalboy", where the items aren't consistent
|
||||||
|
# with the color name regarding whether or not there's spaces, we remove
|
||||||
|
# all spaces from the item name and color name when matching. We also
|
||||||
|
# hackily handle the fact that "Elderlyboy" color has items named "Elderly
|
||||||
|
# Male" (and same for Girl/Female) by replacing those words, too. These
|
||||||
|
# hacks could cause false matches in theory, but I'm not aware of any rn!
|
||||||
|
normalized_name = name.downcase.gsub("female", "girl").gsub("male", "boy").
|
||||||
|
gsub(/\s/, "")
|
||||||
|
|
||||||
|
Color.order(:name).
|
||||||
|
find { |c| normalized_name.include?(c.name.downcase.gsub(/\s/, "")) }
|
||||||
|
end
|
||||||
|
|
||||||
|
def pb_item_name
|
||||||
|
pb_color&.pb_item_name
|
||||||
|
end
|
||||||
|
|
||||||
def restricted_zones(options={})
|
def restricted_zones(options={})
|
||||||
options[:scope] ||= Zone.all
|
options[:scope] ||= Zone.all
|
||||||
options[:scope].find(restricted_zone_ids)
|
options[:scope].find(restricted_zone_ids)
|
||||||
|
|
|
@ -54,13 +54,31 @@
|
||||||
target: "_blank", icon: search_icon
|
target: "_blank", icon: search_icon
|
||||||
|
|
||||||
- if @pb_items.present?
|
- if @pb_items.present?
|
||||||
%h2 Paintbrush items
|
%h2 Paint Brush items
|
||||||
:markdown
|
:markdown
|
||||||
These items are part of a paintbrush set. Once you paint your pet,
|
These items are part of a paint brush set. Once you paint your pet,
|
||||||
these items will be semi-permanently added to your Closet, even if your
|
these items will be semi-permanently added to your Closet, even if your
|
||||||
pet changes color again! You can use this to mix-and-match styles for
|
pet changes color again! You can use this to mix-and-match styles for
|
||||||
"cross-paint" outfits.
|
"cross-paint" outfits.
|
||||||
= render @pb_items
|
%table.item-list
|
||||||
|
%thead
|
||||||
|
%td
|
||||||
|
%th{colspan: 2}
|
||||||
|
Total: #{pluralize @pb_items.size, "item"}
|
||||||
|
%tbody
|
||||||
|
- @pb_items.each do |item|
|
||||||
|
= render "item_list_row", item: do
|
||||||
|
- if item.pb_item_name.present?
|
||||||
|
= button_link_to "Shops",
|
||||||
|
shop_wizard_url_for(item.pb_item_name),
|
||||||
|
target: "_blank", icon: search_icon
|
||||||
|
= button_link_to "Trades",
|
||||||
|
trading_post_url_for(item.pb_item_name),
|
||||||
|
target: "_blank", icon: search_icon
|
||||||
|
- else
|
||||||
|
.special-color-explanation
|
||||||
|
No Paint Brush for this color. Get via Lab
|
||||||
|
Ray, morphing potions, etc.
|
||||||
|
|
||||||
- if @other_nc_items.present?
|
- if @other_nc_items.present?
|
||||||
%h2 Neocash items (Capsules, Dyeworks, events, retired, etc.)
|
%h2 Neocash items (Capsules, Dyeworks, events, retired, etc.)
|
||||||
|
|
5
db/migrate/20240522222040_add_pb_item_name_to_colors.rb
Normal file
5
db/migrate/20240522222040_add_pb_item_name_to_colors.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
class AddPbItemNameToColors < ActiveRecord::Migration[7.1]
|
||||||
|
def change
|
||||||
|
add_column :colors, :pb_item_name, :string
|
||||||
|
end
|
||||||
|
end
|
|
@ -10,7 +10,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema[7.1].define(version: 2024_05_11_003019) do
|
ActiveRecord::Schema[7.1].define(version: 2024_05_22_222040) do
|
||||||
create_table "alt_styles", charset: "utf8mb4", collation: "utf8mb4_unicode_520_ci", force: :cascade do |t|
|
create_table "alt_styles", charset: "utf8mb4", collation: "utf8mb4_unicode_520_ci", force: :cascade do |t|
|
||||||
t.integer "species_id", null: false
|
t.integer "species_id", null: false
|
||||||
t.integer "color_id", null: false
|
t.integer "color_id", null: false
|
||||||
|
@ -76,6 +76,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_05_11_003019) do
|
||||||
t.boolean "standard"
|
t.boolean "standard"
|
||||||
t.boolean "prank", default: false, null: false
|
t.boolean "prank", default: false, null: false
|
||||||
t.string "name", null: false
|
t.string "name", null: false
|
||||||
|
t.string "pb_item_name"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "contributions", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_520_ci", force: :cascade do |t|
|
create_table "contributions", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_520_ci", force: :cascade do |t|
|
||||||
|
|
Loading…
Reference in a new issue