diff --git a/app/assets/stylesheets/items/sources.sass b/app/assets/stylesheets/items/sources.sass index afe83b05..1545387f 100644 --- a/app/assets/stylesheets/items/sources.sass +++ b/app/assets/stylesheets/items/sources.sass @@ -26,8 +26,8 @@ img display: block - width: 100% - height: 100% + width: 2.5em + height: 2.5em .name-cell a text-decoration: none @@ -62,6 +62,11 @@ /* Bootstrap's Purple 600 */ +awesome-button-color(#59359a) + .price-breakdown + text-decoration-line: underline + text-decoration-style: dotted + cursor: help + .special-color-explanation text-wrap: balance font-style: italic @@ -70,9 +75,13 @@ font-size: 85% opacity: .85 + a + color: inherit + a[title] text-decoration-line: underline text-decoration-style: dotted + cursor: help &:hover, &:focus text-decoration-style: solid diff --git a/app/controllers/items_controller.rb b/app/controllers/items_controller.rb index 01e7cd6e..b3c0bba6 100644 --- a/app/controllers/items_controller.rb +++ b/app/controllers/items_controller.rb @@ -114,8 +114,8 @@ class ItemsController < ApplicationController def sources item_ids = params[:ids].split(",") - @items = Item.where(id: item_ids).includes(:nc_mall_record).order(:name). - limit(50) + @items = Item.where(id: item_ids).includes(:nc_mall_record). + includes(:dyeworks_base_item).order(:name).limit(50) if @items.empty? render file: "public/404.html", status: :not_found, layout: nil @@ -123,10 +123,13 @@ class ItemsController < ApplicationController end # Group the items by category! - @nc_mall_items = @items.select(&:currently_in_mall?) - @other_nc_items = @items.select(&:nc?).reject(&:currently_in_mall?) + @nc_mall_items = @items.select(&:currently_in_mall?). + reject(&:dyeworks_active?) + @active_dyeworks_items = @items.select(&:dyeworks_active?) @np_items = @items.select(&:np?) @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. trade_values_task = Async { Item.preload_nc_trade_values(@other_nc_items) } diff --git a/app/helpers/items_helper.rb b/app/helpers/items_helper.rb index d7f3d075..b5409952 100644 --- a/app/helpers/items_helper.rb +++ b/app/helpers/items_helper.rb @@ -161,12 +161,70 @@ module ItemsHelper return nil if value.nil? 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 ' + "for trading. Items with similar values can often be traded for one " + "another. This is an estimate, not a rule!" 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 def build_on_pet_types(species, special_color=nil, &block) diff --git a/app/models/item.rb b/app/models/item.rb index 9650dc81..c5168e8e 100644 --- a/app/models/item.rb +++ b/app/models/item.rb @@ -202,6 +202,12 @@ class Item < ApplicationRecord dyeworks_base_item.present? 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{ ^( # Most Dyeworks items have a colon in the name. diff --git a/app/views/items/sources.html.haml b/app/views/items/sources.html.haml index 39cfd428..bbcb0353 100644 --- a/app/views/items/sources.html.haml +++ b/app/views/items/sources.html.haml @@ -15,7 +15,7 @@ %tr %td %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"}) %td.actions-cell @@ -29,6 +29,47 @@ = cart_icon alt: "" 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? %h2 Neopoint items :markdown @@ -99,7 +140,7 @@ = render "item_list_row", item: - if @other_nc_items.present? - %h2 Neocash items (Capsules, Dyeworks, events, retired, etc.) + %h2 Neocash items (Capsules, events, retired, etc.) :markdown 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