Compare commits
5 commits
566ac241a1
...
118ec6aa1a
Author | SHA1 | Date | |
---|---|---|---|
118ec6aa1a | |||
3ab6d1e3ae | |||
66f20747a9 | |||
5d0848bf28 | |||
dc44b4dbb3 |
9 changed files with 61 additions and 26 deletions
|
@ -116,7 +116,7 @@ class OutfitsController < ApplicationController
|
||||||
def outfit_params
|
def outfit_params
|
||||||
params.require(:outfit).permit(
|
params.require(:outfit).permit(
|
||||||
:name, :starred, :alt_style_id, item_ids: {worn: [], closeted: []},
|
:name, :starred, :alt_style_id, item_ids: {worn: [], closeted: []},
|
||||||
biology: [:species_id, :color_id, :pose])
|
biology: [:species_id, :color_id, :pose, :pet_state_id])
|
||||||
end
|
end
|
||||||
|
|
||||||
def find_authorized_outfit
|
def find_authorized_outfit
|
||||||
|
|
|
@ -48,6 +48,13 @@ module OutfitsHelper
|
||||||
content_tag :li, :class => class_name, &block
|
content_tag :li, :class => class_name, &block
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def outfit_image_tag(outfit)
|
||||||
|
image_tag(
|
||||||
|
outfit.image.small.url,
|
||||||
|
srcset: [[outfit.image.medium.url, "2x"]],
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
def pet_attribute_select(name, collection, value=nil)
|
def pet_attribute_select(name, collection, value=nil)
|
||||||
options = options_from_collection_for_select(collection, :id, :human_name, value)
|
options = options_from_collection_for_select(collection, :id, :human_name, value)
|
||||||
select_tag name, options, id: nil, class: name
|
select_tag name, options, id: nil, class: name
|
||||||
|
|
|
@ -69,6 +69,7 @@ function useOutfitSaving(outfitState, dispatchToOutfit) {
|
||||||
speciesId: outfitState.speciesId,
|
speciesId: outfitState.speciesId,
|
||||||
colorId: outfitState.colorId,
|
colorId: outfitState.colorId,
|
||||||
pose: outfitState.pose,
|
pose: outfitState.pose,
|
||||||
|
appearanceId: outfitState.appearanceId,
|
||||||
altStyleId: outfitState.altStyleId,
|
altStyleId: outfitState.altStyleId,
|
||||||
wornItemIds: [...outfitState.wornItemIds],
|
wornItemIds: [...outfitState.wornItemIds],
|
||||||
closetedItemIds: [...outfitState.closetedItemIds],
|
closetedItemIds: [...outfitState.closetedItemIds],
|
||||||
|
|
|
@ -447,6 +447,7 @@ function getOutfitStateFromOutfitData(outfit) {
|
||||||
speciesId: outfit.speciesId,
|
speciesId: outfit.speciesId,
|
||||||
colorId: outfit.colorId,
|
colorId: outfit.colorId,
|
||||||
pose: outfit.pose,
|
pose: outfit.pose,
|
||||||
|
appearanceId: outfit.appearanceId,
|
||||||
altStyleId: outfit.altStyleId,
|
altStyleId: outfit.altStyleId,
|
||||||
wornItemIds: new Set(outfit.wornItemIds),
|
wornItemIds: new Set(outfit.wornItemIds),
|
||||||
closetedItemIds: new Set(outfit.closetedItemIds),
|
closetedItemIds: new Set(outfit.closetedItemIds),
|
||||||
|
|
|
@ -58,6 +58,7 @@ async function saveOutfit({
|
||||||
speciesId,
|
speciesId,
|
||||||
colorId,
|
colorId,
|
||||||
pose,
|
pose,
|
||||||
|
appearanceId,
|
||||||
altStyleId,
|
altStyleId,
|
||||||
wornItemIds,
|
wornItemIds,
|
||||||
closetedItemIds,
|
closetedItemIds,
|
||||||
|
@ -69,6 +70,7 @@ async function saveOutfit({
|
||||||
species_id: speciesId,
|
species_id: speciesId,
|
||||||
color_id: colorId,
|
color_id: colorId,
|
||||||
pose: pose,
|
pose: pose,
|
||||||
|
pet_state_id: appearanceId,
|
||||||
},
|
},
|
||||||
alt_style_id: altStyleId,
|
alt_style_id: altStyleId,
|
||||||
item_ids: { worn: wornItemIds, closeted: closetedItemIds },
|
item_ids: { worn: wornItemIds, closeted: closetedItemIds },
|
||||||
|
@ -127,6 +129,7 @@ function normalizeOutfit(outfit) {
|
||||||
speciesId: String(outfit.species_id),
|
speciesId: String(outfit.species_id),
|
||||||
colorId: String(outfit.color_id),
|
colorId: String(outfit.color_id),
|
||||||
pose: outfit.pose,
|
pose: outfit.pose,
|
||||||
|
appearanceId: String(outfit.pet_state_id),
|
||||||
altStyleId: outfit.alt_style_id ? String(outfit.alt_style_id) : null,
|
altStyleId: outfit.alt_style_id ? String(outfit.alt_style_id) : null,
|
||||||
wornItemIds: (outfit.item_ids?.worn || []).map((id) => String(id)),
|
wornItemIds: (outfit.item_ids?.worn || []).map((id) => String(id)),
|
||||||
closetedItemIds: (outfit.item_ids?.closeted || []).map((id) =>
|
closetedItemIds: (outfit.item_ids?.closeted || []).map((id) =>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
class ItemOutfitRelationship < ApplicationRecord
|
class ItemOutfitRelationship < ApplicationRecord
|
||||||
belongs_to :item
|
belongs_to :item
|
||||||
belongs_to :outfit
|
belongs_to :outfit, touch: true
|
||||||
|
|
||||||
validates_presence_of :item
|
validates_presence_of :item
|
||||||
end
|
end
|
||||||
|
|
|
@ -61,18 +61,36 @@ class Outfit < ApplicationRecord
|
||||||
OutfitImage.new(image_versions)
|
OutfitImage.new(image_versions)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
IMAGE_URL_TEMPLATE = Addressable::Template.new(
|
||||||
|
Rails.configuration.x.impress_2020.origin +
|
||||||
|
"/api/outfitImage{?id,size,updatedAt}"
|
||||||
|
)
|
||||||
def image_versions
|
def image_versions
|
||||||
# Now, instead of using the saved outfit to S3, we're using out the
|
if Rails.env.production?
|
||||||
# DTI 2020 API + CDN cache version. We use openneo-assets.net to get
|
# Now, instead of using the saved outfit to S3, we're using out the
|
||||||
# around a bug on Neopets petpages with openneo.net URLs.
|
# DTI 2020 API + CDN cache version. We use openneo-assets.net to get
|
||||||
base_url = "https://outfits.openneo-assets.net/outfits" +
|
# around a bug on Neopets petpages with openneo.net URLs.
|
||||||
"/#{CGI.escape id.to_s}" +
|
base_url = "https://outfits.openneo-assets.net/outfits" +
|
||||||
"/v/#{CGI.escape updated_at.to_i.to_s}"
|
"/#{CGI.escape id.to_s}" +
|
||||||
{
|
"/v/#{CGI.escape updated_at.to_i.to_s}"
|
||||||
large: "#{base_url}/600.png",
|
{
|
||||||
medium: "#{base_url}/300.png",
|
large: "#{base_url}/600.png",
|
||||||
small: "#{base_url}/150.png",
|
medium: "#{base_url}/300.png",
|
||||||
}
|
small: "#{base_url}/150.png",
|
||||||
|
}
|
||||||
|
else
|
||||||
|
# In development, just talk to our local Impress 2020 directly.
|
||||||
|
build_url = -> size {
|
||||||
|
IMAGE_URL_TEMPLATE.expand(
|
||||||
|
id: id, size: size, updatedAt: updated_at.to_i
|
||||||
|
).to_s
|
||||||
|
}
|
||||||
|
{
|
||||||
|
large: build_url.call("600"),
|
||||||
|
medium: build_url.call("300"),
|
||||||
|
small: build_url.call("150"),
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
# NOTE: Below is the previous code that uses the saved outfits!
|
# NOTE: Below is the previous code that uses the saved outfits!
|
||||||
# {}.tap do |versions|
|
# {}.tap do |versions|
|
||||||
|
@ -102,15 +120,19 @@ class Outfit < ApplicationRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def biology=(biology)
|
def biology=(biology)
|
||||||
@biology = biology.slice(:species_id, :color_id, :pose)
|
@biology = biology.slice(:species_id, :color_id, :pose, :pet_state_id)
|
||||||
|
|
||||||
begin
|
begin
|
||||||
pet_type = PetType.where(
|
if @biology[:pet_state_id]
|
||||||
species_id: @biology[:species_id],
|
self.pet_state = PetState.find(@biology[:pet_state_id])
|
||||||
color_id: @biology[:color_id],
|
else
|
||||||
).first!
|
pet_type = PetType.where(
|
||||||
self.pet_state = pet_type.pet_states.with_pose(@biology[:pose]).
|
species_id: @biology[:species_id],
|
||||||
emotion_order.first!
|
color_id: @biology[:color_id],
|
||||||
|
).first!
|
||||||
|
self.pet_state = pet_type.pet_states.with_pose(@biology[:pose]).
|
||||||
|
emotion_order.first!
|
||||||
|
end
|
||||||
rescue ActiveRecord::RecordNotFound
|
rescue ActiveRecord::RecordNotFound
|
||||||
# If there's no such pet state (which shouldn't happen normally in-app),
|
# If there's no such pet state (which shouldn't happen normally in-app),
|
||||||
# we don't set `pet_state` but we keep `@biology` for validation.
|
# we don't set `pet_state` but we keep `@biology` for validation.
|
||||||
|
|
|
@ -85,11 +85,12 @@ class Pet < ApplicationRecord
|
||||||
|
|
||||||
def wardrobe_query
|
def wardrobe_query
|
||||||
{
|
{
|
||||||
:name => self.name,
|
name: self.name,
|
||||||
:color => self.pet_type.color.id,
|
color: self.pet_type.color.id,
|
||||||
:species => self.pet_type.species.id,
|
species: self.pet_type.species.id,
|
||||||
:state => self.pet_state.id,
|
pose: self.pet_state.pose,
|
||||||
:objects => self.items.map(&:id)
|
state: self.pet_state.id,
|
||||||
|
objects: self.items.map(&:id),
|
||||||
}.to_query
|
}.to_query
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
= outfit_li_for(outfit) do
|
= outfit_li_for(outfit) do
|
||||||
- if outfit.image?
|
- if outfit.image?
|
||||||
= link_to image_tag(outfit.image.small.url), outfit
|
= link_to outfit_image_tag(outfit), outfit
|
||||||
|
|
||||||
%header
|
%header
|
||||||
.outfit-star
|
.outfit-star
|
||||||
|
|
Loading…
Reference in a new issue