diff --git a/app/controllers/outfits_controller.rb b/app/controllers/outfits_controller.rb index 36e6b669..5b0d6c28 100644 --- a/app/controllers/outfits_controller.rb +++ b/app/controllers/outfits_controller.rb @@ -116,7 +116,7 @@ class OutfitsController < ApplicationController def outfit_params params.require(:outfit).permit( :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 def find_authorized_outfit diff --git a/app/javascript/wardrobe-2020/loaders/outfits.js b/app/javascript/wardrobe-2020/loaders/outfits.js index fbafbec2..5b3d95ea 100644 --- a/app/javascript/wardrobe-2020/loaders/outfits.js +++ b/app/javascript/wardrobe-2020/loaders/outfits.js @@ -58,6 +58,7 @@ async function saveOutfit({ speciesId, colorId, pose, + appearanceId, altStyleId, wornItemIds, closetedItemIds, @@ -69,6 +70,7 @@ async function saveOutfit({ species_id: speciesId, color_id: colorId, pose: pose, + pet_state_id: appearanceId, }, alt_style_id: altStyleId, item_ids: { worn: wornItemIds, closeted: closetedItemIds }, @@ -127,6 +129,7 @@ function normalizeOutfit(outfit) { speciesId: String(outfit.species_id), colorId: String(outfit.color_id), pose: outfit.pose, + appearanceId: outfit.pet_state_id, altStyleId: outfit.alt_style_id ? String(outfit.alt_style_id) : null, wornItemIds: (outfit.item_ids?.worn || []).map((id) => String(id)), closetedItemIds: (outfit.item_ids?.closeted || []).map((id) => diff --git a/app/models/outfit.rb b/app/models/outfit.rb index 3ae8b564..1e69014b 100644 --- a/app/models/outfit.rb +++ b/app/models/outfit.rb @@ -102,15 +102,19 @@ class Outfit < ApplicationRecord end def biology=(biology) - @biology = biology.slice(:species_id, :color_id, :pose) + @biology = biology.slice(:species_id, :color_id, :pose, :pet_state_id) begin - pet_type = PetType.where( - species_id: @biology[:species_id], - color_id: @biology[:color_id], - ).first! - self.pet_state = pet_type.pet_states.with_pose(@biology[:pose]). - emotion_order.first! + if @biology[:pet_state_id] + self.pet_state = PetState.find(@biology[:pet_state_id]) + else + pet_type = PetType.where( + species_id: @biology[:species_id], + color_id: @biology[:color_id], + ).first! + self.pet_state = pet_type.pet_states.with_pose(@biology[:pose]). + emotion_order.first! + end rescue ActiveRecord::RecordNotFound # 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. diff --git a/app/models/pet.rb b/app/models/pet.rb index a4299a32..6e2d6c2c 100644 --- a/app/models/pet.rb +++ b/app/models/pet.rb @@ -85,11 +85,12 @@ class Pet < ApplicationRecord def wardrobe_query { - :name => self.name, - :color => self.pet_type.color.id, - :species => self.pet_type.species.id, - :state => self.pet_state.id, - :objects => self.items.map(&:id) + name: self.name, + color: self.pet_type.color.id, + species: self.pet_type.species.id, + pose: self.pet_state.pose, + state: self.pet_state.id, + objects: self.items.map(&:id), }.to_query end