Filter search in wardrobe-2020 by alt styles!
Yay, we finally added it, the part where we include the appearance data for the items based on both the species/color and the alt style! Now, switching to Faerie Acara correctly filters the search only to items that would fit (I think literally just only body_id=0 items right now, but we're not banking on that!)
This commit is contained in:
parent
421f2ce39f
commit
87782767f8
4 changed files with 45 additions and 28 deletions
|
@ -121,11 +121,16 @@ class ItemsController < ApplicationController
|
||||||
def load_appearances
|
def load_appearances
|
||||||
appearance_params = params[:with_appearances_for]
|
appearance_params = params[:with_appearances_for]
|
||||||
return {} if appearance_params.blank?
|
return {} if appearance_params.blank?
|
||||||
raise NotImplementedError if appearance_params[:alt_style_id].present?
|
|
||||||
|
|
||||||
pet_type = Item::Search::Query.load_pet_type_by_color_and_species(
|
if appearance_params[:alt_style_id].present?
|
||||||
|
target = Item::Search::Query.load_alt_style_by_id(
|
||||||
|
appearance_params[:alt_style_id])
|
||||||
|
else
|
||||||
|
target = Item::Search::Query.load_pet_type_by_color_and_species(
|
||||||
appearance_params[:color_id], appearance_params[:species_id])
|
appearance_params[:color_id], appearance_params[:species_id])
|
||||||
pet_type.appearances_for(@items.map(&:id), swf_asset_includes: [:zone])
|
end
|
||||||
|
|
||||||
|
target.appearances_for(@items.map(&:id), swf_asset_includes: [:zone])
|
||||||
end
|
end
|
||||||
|
|
||||||
def search_error(e)
|
def search_error(e)
|
||||||
|
|
|
@ -49,6 +49,11 @@ class AltStyle < ApplicationRecord
|
||||||
swf_asset.image_url
|
swf_asset.image_url
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Given a list of item IDs, return how they look on this alt style.
|
||||||
|
def appearances_for(item_ids, ...)
|
||||||
|
Item.appearances_for(item_ids, self, ...)
|
||||||
|
end
|
||||||
|
|
||||||
def biology=(biology)
|
def biology=(biology)
|
||||||
# TODO: This is very similar to what `PetState` does, but like… much much
|
# TODO: This is very similar to what `PetState` does, but like… much much
|
||||||
# more compact? Idk if I'm missing something, or if I was just that much
|
# more compact? Idk if I'm missing something, or if I was just that much
|
||||||
|
|
|
@ -495,6 +495,34 @@ class Item < ApplicationRecord
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Given a list of item IDs, return how they look on the given target (either
|
||||||
|
# a pet type or an alt style).
|
||||||
|
def self.appearances_for(item_ids, target, swf_asset_includes: [])
|
||||||
|
# First, load all the relationships for these items that also fit this
|
||||||
|
# body.
|
||||||
|
relationships = ParentSwfAssetRelationship.
|
||||||
|
includes(swf_asset: swf_asset_includes).
|
||||||
|
where(parent_type: "Item", parent_id: item_ids).
|
||||||
|
where(swf_asset: {body_id: [target.body_id, 0]})
|
||||||
|
|
||||||
|
pet_type_body = Appearance::Body.new(target.body_id, target.species)
|
||||||
|
all_pets_body = Appearance::Body.new(0, nil)
|
||||||
|
|
||||||
|
# Then, convert this into a hash from item ID to SWF assets.
|
||||||
|
assets_by_item_id = relationships.group_by(&:parent_id).
|
||||||
|
transform_values { |rels| rels.map(&:swf_asset) }
|
||||||
|
|
||||||
|
# Finally, for each item, return an appearance—even if it's empty!
|
||||||
|
item_ids.to_h do |item_id|
|
||||||
|
assets = assets_by_item_id.fetch(item_id, [])
|
||||||
|
|
||||||
|
fits_all_pets = assets.present? && assets.all? { |a| a.body_id == 0 }
|
||||||
|
body = fits_all_pets ? all_pets_body : pet_type_body
|
||||||
|
|
||||||
|
[item_id, Appearance.new(body, assets)]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def self.all_by_ids_or_children(ids, swf_assets)
|
def self.all_by_ids_or_children(ids, swf_assets)
|
||||||
swf_asset_ids = []
|
swf_asset_ids = []
|
||||||
swf_assets_by_id = {}
|
swf_assets_by_id = {}
|
||||||
|
|
|
@ -169,30 +169,9 @@ class PetType < ApplicationRecord
|
||||||
}.first
|
}.first
|
||||||
end
|
end
|
||||||
|
|
||||||
def appearances_for(item_ids, swf_asset_includes: [])
|
# Given a list of item IDs, return how they look on this pet type.
|
||||||
# First, load all the relationships for these items that also fit this
|
def appearances_for(item_ids, ...)
|
||||||
# body.
|
Item.appearances_for(item_ids, self, ...)
|
||||||
relationships = ParentSwfAssetRelationship.
|
|
||||||
includes(swf_asset: swf_asset_includes).
|
|
||||||
where(parent_type: "Item", parent_id: item_ids).
|
|
||||||
where(swf_asset: {body_id: [body_id, 0]})
|
|
||||||
|
|
||||||
pet_type_body = Item::Appearance::Body.new(body_id, species)
|
|
||||||
all_pets_body = Item::Appearance::Body.new(0, nil)
|
|
||||||
|
|
||||||
# Then, convert this into a hash from item ID to SWF assets.
|
|
||||||
assets_by_item_id = relationships.group_by(&:parent_id).
|
|
||||||
transform_values { |rels| rels.map(&:swf_asset) }
|
|
||||||
|
|
||||||
# Finally, for each item, return an appearance—even if it's empty!
|
|
||||||
item_ids.to_h do |item_id|
|
|
||||||
assets = assets_by_item_id.fetch(item_id, [])
|
|
||||||
|
|
||||||
fits_all_pets = assets.present? && assets.all? { |a| a.body_id == 0 }
|
|
||||||
body = fits_all_pets ? all_pets_body : pet_type_body
|
|
||||||
|
|
||||||
[item_id, Item::Appearance.new(body, assets)]
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.all_by_ids_or_children(ids, pet_states)
|
def self.all_by_ids_or_children(ids, pet_states)
|
||||||
|
|
Loading…
Reference in a new issue