Compare commits
No commits in common. "e0f9a27adc44641c781cdd6cc1f08872e6b132b0" and "5cbab5a7660d86488faf88b2aeab8e02ccfab456" have entirely different histories.
e0f9a27adc
...
5cbab5a766
6 changed files with 95 additions and 51 deletions
|
@ -160,26 +160,3 @@ body.items-show
|
||||||
select
|
select
|
||||||
border-color: $error-border-color
|
border-color: $error-border-color
|
||||||
color: $error-color
|
color: $error-color
|
||||||
|
|
||||||
.item-zones-info
|
|
||||||
margin-top: .5em
|
|
||||||
|
|
||||||
h3
|
|
||||||
display: inline
|
|
||||||
font: inherit
|
|
||||||
font-weight: bold
|
|
||||||
&:after
|
|
||||||
content: ": "
|
|
||||||
|
|
||||||
ul
|
|
||||||
list-style-type: none
|
|
||||||
display: inline
|
|
||||||
|
|
||||||
li
|
|
||||||
display: inline
|
|
||||||
&:not(:last-of-type):after
|
|
||||||
content: ", "
|
|
||||||
|
|
||||||
.no-zones
|
|
||||||
font-style: italic
|
|
||||||
opacity: .85
|
|
||||||
|
|
|
@ -31,12 +31,11 @@ module ItemsHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def standard_species_search_links
|
def standard_species_search_links
|
||||||
all_species = Species.alphabetical.map(&:id)
|
build_on_pet_types(Species.alphabetical) do |pet_type|
|
||||||
PetType.random_basic_per_species(all_species).map do |pet_type|
|
|
||||||
image = pet_type_image(pet_type, :happy, :zoom)
|
image = pet_type_image(pet_type, :happy, :zoom)
|
||||||
query = "species:#{pet_type.species.name}"
|
query = "species:#{pet_type.species.name}"
|
||||||
link_to(image, items_path(:q => query))
|
link_to(image, items_path(:q => query))
|
||||||
end.join.html_safe
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def closet_list_verb(owned)
|
def closet_list_verb(owned)
|
||||||
|
@ -224,6 +223,15 @@ module ItemsHelper
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def build_on_pet_types(species, special_color=nil, &block)
|
||||||
|
species_ids = species.map(&:id)
|
||||||
|
pet_types = special_color ?
|
||||||
|
PetType.where(:color_id => special_color.id, :species_id => species_ids).
|
||||||
|
order(:species_id) :
|
||||||
|
PetType.random_basic_per_species(species.map(&:id))
|
||||||
|
pet_types.map(&block).join.html_safe
|
||||||
|
end
|
||||||
|
|
||||||
def pet_type_image(pet_type, emotion, size)
|
def pet_type_image(pet_type, emotion, size)
|
||||||
src = pet_type_image_url(pet_type, emotion:, size:)
|
src = pet_type_image_url(pet_type, emotion:, size:)
|
||||||
human_name = pet_type.species.name.humanize
|
human_name = pet_type.species.name.humanize
|
||||||
|
|
|
@ -25,6 +25,8 @@ class Item < ApplicationRecord
|
||||||
|
|
||||||
NCRarities = [0, 500]
|
NCRarities = [0, 500]
|
||||||
PAINTBRUSH_SET_DESCRIPTION = 'This item is part of a deluxe paint brush set!'
|
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, -> {
|
scope :newest, -> {
|
||||||
order(arel_table[:created_at].desc) if arel_table[:created_at]
|
order(arel_table[:created_at].desc) if arel_table[:created_at]
|
||||||
|
@ -281,15 +283,78 @@ class Item < ApplicationRecord
|
||||||
occupied_zones.map(&:id)
|
occupied_zones.map(&:id)
|
||||||
end
|
end
|
||||||
|
|
||||||
def occupied_zones
|
def occupied_zones(options={})
|
||||||
zone_ids = swf_assets.map(&:zone_id).uniq
|
options[:scope] ||= Zone.all
|
||||||
Zone.find(zone_ids)
|
all_body_ids = []
|
||||||
|
zone_body_ids = {}
|
||||||
|
selected_assets = swf_assets.select('body_id, zone_id').each do |swf_asset|
|
||||||
|
zone_body_ids[swf_asset.zone_id] ||= []
|
||||||
|
body_ids = zone_body_ids[swf_asset.zone_id]
|
||||||
|
body_ids << swf_asset.body_id unless body_ids.include?(swf_asset.body_id)
|
||||||
|
all_body_ids << swf_asset.body_id unless all_body_ids.include?(swf_asset.body_id)
|
||||||
|
end
|
||||||
|
zones = options[:scope].find(zone_body_ids.keys)
|
||||||
|
zones_by_id = zones.inject({}) { |h, z| h[z.id] = z; h }
|
||||||
|
total_body_ids = all_body_ids.size
|
||||||
|
zone_body_ids.each do |zone_id, body_ids|
|
||||||
|
zones_by_id[zone_id].sometimes = true if body_ids.size < total_body_ids
|
||||||
|
end
|
||||||
|
zones
|
||||||
end
|
end
|
||||||
|
|
||||||
def affected_zones
|
def affected_zones
|
||||||
restricted_zones + occupied_zones
|
restricted_zones + occupied_zones
|
||||||
end
|
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
|
def species_support_ids
|
||||||
@species_support_ids_array ||= read_attribute('species_support_ids').split(',').map(&:to_i) rescue nil
|
@species_support_ids_array ||= read_attribute('species_support_ids').split(',').map(&:to_i) rescue nil
|
||||||
end
|
end
|
||||||
|
|
|
@ -11,7 +11,6 @@ class PetType < ApplicationRecord
|
||||||
|
|
||||||
BasicHashes = YAML::load_file(Rails.root.join('config', 'basic_type_hashes.yml'))
|
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) {
|
scope :matching_name, ->(color_name, species_name) {
|
||||||
color = Color.find_by_name!(color_name)
|
color = Color.find_by_name!(color_name)
|
||||||
species = Species.find_by_name!(species_name)
|
species = Species.find_by_name!(species_name)
|
||||||
|
@ -29,11 +28,17 @@ class PetType < ApplicationRecord
|
||||||
merge(Color.order(basic: :desc, standard: :desc, name: :asc))
|
merge(Color.order(basic: :desc, standard: :desc, name: :asc))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
def self.random_basic_per_species(species_ids)
|
||||||
random_pet_types = []
|
random_pet_types = []
|
||||||
basics_by_species_id = basic.group_by(&:species_id)
|
# TODO: omg so lame :P
|
||||||
|
standards = special_color_or_basic(nil).group_by(&:species_id)
|
||||||
species_ids.each do |species_id|
|
species_ids.each do |species_id|
|
||||||
pet_types = basics_by_species_id[species_id]
|
pet_types = standards[species_id]
|
||||||
random_pet_types << pet_types[rand(pet_types.size)] if pet_types
|
random_pet_types << pet_types[rand(pet_types.size)] if pet_types
|
||||||
end
|
end
|
||||||
random_pet_types
|
random_pet_types
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
class Zone < ActiveRecord::Base
|
class Zone < ActiveRecord::Base
|
||||||
|
# When selecting zones that an asset occupies, we allow the zone to set
|
||||||
|
# whether or not the zone is "sometimes" occupied. This is false by default.
|
||||||
|
attr_writer :sometimes
|
||||||
|
|
||||||
scope :alphabetical, -> { order(:label) }
|
scope :alphabetical, -> { order(:label) }
|
||||||
scope :matching_label, ->(label) {
|
scope :matching_label, ->(label) {
|
||||||
where(plain_label: Zone.plainify_label(label))
|
where(plain_label: Zone.plainify_label(label))
|
||||||
|
@ -9,6 +13,10 @@ class Zone < ActiveRecord::Base
|
||||||
super({only: [:id, :depth, :label]}.merge(options))
|
super({only: [:id, :depth, :label]}.merge(options))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def uncertain_label
|
||||||
|
@sometimes ? "#{label} sometimes" : label
|
||||||
|
end
|
||||||
|
|
||||||
def is_commonly_used_by_items
|
def is_commonly_used_by_items
|
||||||
# Zone metadata marks item zones with types 2, 3, and 4. But also, in
|
# Zone metadata marks item zones with types 2, 3, and 4. But also, in
|
||||||
# practice, the Biology Effects zone (type 1, ID 4) has been used for a few
|
# practice, the Biology Effects zone (type 1, ID 4) has been used for a few
|
||||||
|
|
|
@ -33,25 +33,6 @@
|
||||||
"id", "human_name", @selected_preview_pet_type.species_id)
|
"id", "human_name", @selected_preview_pet_type.species_id)
|
||||||
= submit_tag "Go", name: nil
|
= submit_tag "Go", name: nil
|
||||||
|
|
||||||
.item-zones-info
|
|
||||||
%section
|
|
||||||
%h3 Occupies
|
|
||||||
- if @item.occupied_zones.present?
|
|
||||||
%ul
|
|
||||||
- @item.occupied_zones.sort_by(&:label).each do |zone|
|
|
||||||
%li= zone.label
|
|
||||||
- else
|
|
||||||
%span.no-zones (None)
|
|
||||||
|
|
||||||
%section
|
|
||||||
%h3 Restricts
|
|
||||||
- if @item.restricted_zones.present?
|
|
||||||
%ul
|
|
||||||
- @item.restricted_zones.sort_by(&:label).each do |zone|
|
|
||||||
%li= zone.label
|
|
||||||
- else
|
|
||||||
%span.no-zones (None)
|
|
||||||
|
|
||||||
- unless @contributors_with_counts.empty?
|
- unless @contributors_with_counts.empty?
|
||||||
#item-contributors
|
#item-contributors
|
||||||
%header #{t '.contributors.header'}:
|
%header #{t '.contributors.header'}:
|
||||||
|
|
Loading…
Reference in a new issue