Add Dyeworks section to Item Getting Guide (but it's currently wrong!)
I started writing this up, then sent a preview to a friend, and he was like "oh cool, but also this is not correct?" I didn't realize Dyeworks has limited-time support to be *able* to dye certain items. Hey, glad we're writing this guide for people like me, then! lol I wonder if we can lean on Owls for this. It seems like they already list "Permanent Dyeworks" for some items, I wonder if they say something special for active limited-edition Dyeworks items!
This commit is contained in:
parent
857cb547ed
commit
5de9e2a27b
5 changed files with 126 additions and 9 deletions
|
@ -26,8 +26,8 @@
|
||||||
|
|
||||||
img
|
img
|
||||||
display: block
|
display: block
|
||||||
width: 100%
|
width: 2.5em
|
||||||
height: 100%
|
height: 2.5em
|
||||||
|
|
||||||
.name-cell a
|
.name-cell a
|
||||||
text-decoration: none
|
text-decoration: none
|
||||||
|
@ -62,6 +62,11 @@
|
||||||
/* Bootstrap's Purple 600 */
|
/* Bootstrap's Purple 600 */
|
||||||
+awesome-button-color(#59359a)
|
+awesome-button-color(#59359a)
|
||||||
|
|
||||||
|
.price-breakdown
|
||||||
|
text-decoration-line: underline
|
||||||
|
text-decoration-style: dotted
|
||||||
|
cursor: help
|
||||||
|
|
||||||
.special-color-explanation
|
.special-color-explanation
|
||||||
text-wrap: balance
|
text-wrap: balance
|
||||||
font-style: italic
|
font-style: italic
|
||||||
|
@ -70,9 +75,13 @@
|
||||||
font-size: 85%
|
font-size: 85%
|
||||||
opacity: .85
|
opacity: .85
|
||||||
|
|
||||||
|
a
|
||||||
|
color: inherit
|
||||||
|
|
||||||
a[title]
|
a[title]
|
||||||
text-decoration-line: underline
|
text-decoration-line: underline
|
||||||
text-decoration-style: dotted
|
text-decoration-style: dotted
|
||||||
|
cursor: help
|
||||||
|
|
||||||
&:hover, &:focus
|
&:hover, &:focus
|
||||||
text-decoration-style: solid
|
text-decoration-style: solid
|
||||||
|
|
|
@ -114,8 +114,8 @@ class ItemsController < ApplicationController
|
||||||
|
|
||||||
def sources
|
def sources
|
||||||
item_ids = params[:ids].split(",")
|
item_ids = params[:ids].split(",")
|
||||||
@items = Item.where(id: item_ids).includes(:nc_mall_record).order(:name).
|
@items = Item.where(id: item_ids).includes(:nc_mall_record).
|
||||||
limit(50)
|
includes(:dyeworks_base_item).order(:name).limit(50)
|
||||||
|
|
||||||
if @items.empty?
|
if @items.empty?
|
||||||
render file: "public/404.html", status: :not_found, layout: nil
|
render file: "public/404.html", status: :not_found, layout: nil
|
||||||
|
@ -123,10 +123,13 @@ class ItemsController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
# Group the items by category!
|
# Group the items by category!
|
||||||
@nc_mall_items = @items.select(&:currently_in_mall?)
|
@nc_mall_items = @items.select(&:currently_in_mall?).
|
||||||
@other_nc_items = @items.select(&:nc?).reject(&:currently_in_mall?)
|
reject(&:dyeworks_active?)
|
||||||
|
@active_dyeworks_items = @items.select(&:dyeworks_active?)
|
||||||
@np_items = @items.select(&:np?)
|
@np_items = @items.select(&:np?)
|
||||||
@pb_items = @items.select(&:pb?)
|
@pb_items = @items.select(&:pb?)
|
||||||
|
@other_nc_items = @items.select(&:nc?).reject(&:currently_in_mall?).
|
||||||
|
reject(&:dyeworks_active?)
|
||||||
|
|
||||||
# Start loading the NC trade values for the non-Mall NC items.
|
# Start loading the NC trade values for the non-Mall NC items.
|
||||||
trade_values_task = Async { Item.preload_nc_trade_values(@other_nc_items) }
|
trade_values_task = Async { Item.preload_nc_trade_values(@other_nc_items) }
|
||||||
|
|
|
@ -161,12 +161,70 @@ module ItemsHelper
|
||||||
return nil if value.nil?
|
return nil if value.nil?
|
||||||
|
|
||||||
link_to "Owls listing: #{item.nc_trade_value.value_text}",
|
link_to "Owls listing: #{item.nc_trade_value.value_text}",
|
||||||
"https://www.neopets.com/~owls",
|
"https://www.neopets.com/~owls", target: "_blank",
|
||||||
title: 'Owls keeps track of approximate "capsule" values of NC items ' +
|
title: 'Owls keeps track of approximate "capsule" values of NC items ' +
|
||||||
"for trading. Items with similar values can often be traded for one " +
|
"for trading. Items with similar values can often be traded for one " +
|
||||||
"another. This is an estimate, not a rule!"
|
"another. This is an estimate, not a rule!"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def dyeworks_explanation_subtitle_for(item)
|
||||||
|
base_item = item.dyeworks_base_item
|
||||||
|
content_tag :span, class: "dyeworks-explanation" do
|
||||||
|
concat link_to(base_item.name, base_item, target: "_blank")
|
||||||
|
concat " + 1 Potion"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def nc_total_for(items)
|
||||||
|
items.map(&:current_nc_price).sum
|
||||||
|
end
|
||||||
|
|
||||||
|
def dyeworks_nc_total_for(items)
|
||||||
|
dyeworks_items_nc_total_for(items) + dyeworks_potions_nc_total(items.size)
|
||||||
|
end
|
||||||
|
|
||||||
|
def dyeworks_items_nc_total_for(items)
|
||||||
|
nc_total_for items.map(&:dyeworks_base_item)
|
||||||
|
end
|
||||||
|
|
||||||
|
def dyeworks_potions_nc_total(num_items)
|
||||||
|
dyeworks_potions_nc_breakdown(num_items)[:nc_total]
|
||||||
|
end
|
||||||
|
|
||||||
|
def dyeworks_potions_nc_summary(num_items)
|
||||||
|
dyeworks_potions_nc_breakdown(num_items)[:summary]
|
||||||
|
end
|
||||||
|
|
||||||
|
def dyeworks_potions_nc_breakdown(num_items)
|
||||||
|
nc_total = 0
|
||||||
|
summaries = []
|
||||||
|
|
||||||
|
# For every 10 potions, buy a 10-Bundle for 900 NC.
|
||||||
|
while num_items >= 10
|
||||||
|
nc_total += 900
|
||||||
|
summaries << "10-Bundle (900 NC)"
|
||||||
|
num_items -= 10
|
||||||
|
end
|
||||||
|
|
||||||
|
# For every remaining 5 potions, buy a 5-Bundle for 500 NC.
|
||||||
|
while num_items >= 5
|
||||||
|
nc_total += 500
|
||||||
|
summaries << "5-Bundle (500 NC)"
|
||||||
|
num_items -= 5
|
||||||
|
end
|
||||||
|
|
||||||
|
# For every remaining potion, buy each directly for 125 NC.
|
||||||
|
if num_items >= 1
|
||||||
|
nc_total += num_items * 125
|
||||||
|
summaries << "#{pluralize num_items, "potion"} (#{num_items * 125} NC)"
|
||||||
|
num_items = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
summary = summaries.join(", ")
|
||||||
|
|
||||||
|
{nc_total:, summary:}
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def build_on_pet_types(species, special_color=nil, &block)
|
def build_on_pet_types(species, special_color=nil, &block)
|
||||||
|
|
|
@ -202,6 +202,12 @@ class Item < ApplicationRecord
|
||||||
dyeworks_base_item.present?
|
dyeworks_base_item.present?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Whether this is a Dyeworks item whose base item can currently be purchased
|
||||||
|
# in the NC Mall, then dyed via Dyeworks.
|
||||||
|
def dyeworks_active?
|
||||||
|
dyeworks_base_item.present? && dyeworks_base_item.currently_in_mall?
|
||||||
|
end
|
||||||
|
|
||||||
DYEWORKS_NAME_PATTERN = %r{
|
DYEWORKS_NAME_PATTERN = %r{
|
||||||
^(
|
^(
|
||||||
# Most Dyeworks items have a colon in the name.
|
# Most Dyeworks items have a colon in the name.
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
%tr
|
%tr
|
||||||
%td
|
%td
|
||||||
%th
|
%th
|
||||||
Total: #{@nc_mall_items.map(&:current_nc_price).sum} NC
|
Total: #{nc_total_for @nc_mall_items} NC
|
||||||
(#{pluralize @nc_mall_items.size, "item"})
|
(#{pluralize @nc_mall_items.size, "item"})
|
||||||
|
|
||||||
%td.actions-cell
|
%td.actions-cell
|
||||||
|
@ -29,6 +29,47 @@
|
||||||
= cart_icon alt: ""
|
= cart_icon alt: ""
|
||||||
Buy (#{item.current_nc_price} NC)
|
Buy (#{item.current_nc_price} NC)
|
||||||
|
|
||||||
|
- if @active_dyeworks_items.present?
|
||||||
|
%h2 Dyeworks items
|
||||||
|
:markdown
|
||||||
|
These are recolored "Dyeworks" variants of items. First get the "base"
|
||||||
|
item, then get a Dyeworks Hue Brew Potion, and combine them in the
|
||||||
|
[Dyeworks][dyeworks] section of the NC Mall! Potions can also be bought in
|
||||||
|
bundles of 5 or 10.
|
||||||
|
|
||||||
|
TODO: This is currently incorrect! Dyeworks items can't always be dyed, we
|
||||||
|
need to keep track of which ones actually can be right now!
|
||||||
|
|
||||||
|
[dyeworks]: https://www.neopets.com/mall/dyeworks/
|
||||||
|
%table.item-list
|
||||||
|
%thead
|
||||||
|
%td.thumbnail-cell
|
||||||
|
= image_tag "https://images.neopets.com/items/mall_80x80_cleaning.gif",
|
||||||
|
alt: "Dyeworks Hue Brew Potion"
|
||||||
|
%th
|
||||||
|
Total: #{dyeworks_nc_total_for @active_dyeworks_items} NC
|
||||||
|
= surround "(", ")" do
|
||||||
|
%span.price-breakdown{
|
||||||
|
title: "#{dyeworks_items_nc_total_for(@active_dyeworks_items)} NC"
|
||||||
|
}<
|
||||||
|
#{pluralize @active_dyeworks_items.size, "item"}
|
||||||
|
+
|
||||||
|
%span.price-breakdown{
|
||||||
|
title: dyeworks_potions_nc_summary(@active_dyeworks_items.size)
|
||||||
|
}<
|
||||||
|
#{pluralize @active_dyeworks_items.size, "potion"}
|
||||||
|
%td.actions-cell
|
||||||
|
%button{onclick: "alert('Todo!')"}
|
||||||
|
= cart_icon alt: ""
|
||||||
|
Buy all in NC Mall
|
||||||
|
%tbody
|
||||||
|
- @active_dyeworks_items.each do |item|
|
||||||
|
= render "item_list_row", item:,
|
||||||
|
subtitle: dyeworks_explanation_subtitle_for(item) do
|
||||||
|
%button{onclick: "alert('Todo!')"}
|
||||||
|
= cart_icon alt: ""
|
||||||
|
Buy base (#{item.dyeworks_base_item.current_nc_price} NC)
|
||||||
|
|
||||||
- if @np_items.present?
|
- if @np_items.present?
|
||||||
%h2 Neopoint items
|
%h2 Neopoint items
|
||||||
:markdown
|
:markdown
|
||||||
|
@ -99,7 +140,7 @@
|
||||||
= render "item_list_row", item:
|
= render "item_list_row", item:
|
||||||
|
|
||||||
- if @other_nc_items.present?
|
- if @other_nc_items.present?
|
||||||
%h2 Neocash items (Capsules, Dyeworks, events, retired, etc.)
|
%h2 Neocash items (Capsules, events, retired, etc.)
|
||||||
:markdown
|
:markdown
|
||||||
These items are part of the Neocash economy and can't be purchased with
|
These items are part of the Neocash economy and can't be purchased with
|
||||||
Neopoints. We don't track all the details of how to get these items
|
Neopoints. We don't track all the details of how to get these items
|
||||||
|
|
Loading…
Reference in a new issue