|
|
|
@ -2,160 +2,180 @@ |
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
|
|
|
|
#include "core/hle/service/mii/mii_util.h"
|
|
|
|
#include "core/hle/service/mii/types/char_info.h"
|
|
|
|
#include "core/hle/service/mii/types/raw_data.h"
|
|
|
|
#include "core/hle/service/mii/types/store_data.h"
|
|
|
|
#include "core/hle/service/mii/types/ver3_store_data.h"
|
|
|
|
|
|
|
|
namespace Service::Mii { |
|
|
|
|
|
|
|
void Ver3StoreData::BuildToStoreData(CharInfo& out_char_info) const { |
|
|
|
void NfpStoreDataExtension::SetFromStoreData(const StoreData& store_data) { |
|
|
|
faceline_color = static_cast<u8>(store_data.GetFacelineColor() & 0xf); |
|
|
|
hair_color = static_cast<u8>(store_data.GetHairColor() & 0x7f); |
|
|
|
eye_color = static_cast<u8>(store_data.GetEyeColor() & 0x7f); |
|
|
|
eyebrow_color = static_cast<u8>(store_data.GetEyebrowColor() & 0x7f); |
|
|
|
mouth_color = static_cast<u8>(store_data.GetMouthColor() & 0x7f); |
|
|
|
beard_color = static_cast<u8>(store_data.GetBeardColor() & 0x7f); |
|
|
|
glass_color = static_cast<u8>(store_data.GetGlassColor() & 0x7f); |
|
|
|
glass_type = static_cast<u8>(store_data.GetGlassType() & 0x1f); |
|
|
|
} |
|
|
|
|
|
|
|
void Ver3StoreData::BuildToStoreData(StoreData& out_store_data) const { |
|
|
|
out_store_data.BuildBase(Gender::Male); |
|
|
|
|
|
|
|
if (!IsValid()) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
// TODO: We are ignoring a bunch of data from the mii_v3
|
|
|
|
|
|
|
|
out_char_info.gender = static_cast<u8>(mii_information.gender); |
|
|
|
out_char_info.favorite_color = static_cast<u8>(mii_information.favorite_color); |
|
|
|
out_char_info.height = height; |
|
|
|
out_char_info.build = build; |
|
|
|
out_store_data.SetGender(static_cast<Gender>(static_cast<u8>(mii_information.gender))); |
|
|
|
out_store_data.SetFavoriteColor(static_cast<u8>(mii_information.favorite_color)); |
|
|
|
out_store_data.SetHeight(height); |
|
|
|
out_store_data.SetBuild(build); |
|
|
|
|
|
|
|
// Copy name until string terminator
|
|
|
|
out_char_info.name = {}; |
|
|
|
for (std::size_t index = 0; index < out_char_info.name.size() - 1; index++) { |
|
|
|
out_char_info.name[index] = mii_name[index]; |
|
|
|
if (out_char_info.name[index] == 0) { |
|
|
|
Nickname name = {}; |
|
|
|
for (std::size_t index = 0; index < name.data.size() - 1; index++) { |
|
|
|
name.data[index] = mii_name[index]; |
|
|
|
if (name.data[index] == 0) { |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
out_char_info.font_region = region_information.character_set; |
|
|
|
|
|
|
|
out_char_info.faceline_type = appearance_bits1.face_shape; |
|
|
|
out_char_info.faceline_color = appearance_bits1.skin_color; |
|
|
|
out_char_info.faceline_wrinkle = appearance_bits2.wrinkles; |
|
|
|
out_char_info.faceline_make = appearance_bits2.makeup; |
|
|
|
|
|
|
|
out_char_info.hair_type = hair_style; |
|
|
|
out_char_info.hair_color = appearance_bits3.hair_color; |
|
|
|
out_char_info.hair_flip = appearance_bits3.flip_hair; |
|
|
|
|
|
|
|
out_char_info.eye_type = static_cast<u8>(appearance_bits4.eye_type); |
|
|
|
out_char_info.eye_color = static_cast<u8>(appearance_bits4.eye_color); |
|
|
|
out_char_info.eye_scale = static_cast<u8>(appearance_bits4.eye_scale); |
|
|
|
out_char_info.eye_aspect = static_cast<u8>(appearance_bits4.eye_vertical_stretch); |
|
|
|
out_char_info.eye_rotate = static_cast<u8>(appearance_bits4.eye_rotation); |
|
|
|
out_char_info.eye_x = static_cast<u8>(appearance_bits4.eye_spacing); |
|
|
|
out_char_info.eye_y = static_cast<u8>(appearance_bits4.eye_y_position); |
|
|
|
|
|
|
|
out_char_info.eyebrow_type = static_cast<u8>(appearance_bits5.eyebrow_style); |
|
|
|
out_char_info.eyebrow_color = static_cast<u8>(appearance_bits5.eyebrow_color); |
|
|
|
out_char_info.eyebrow_scale = static_cast<u8>(appearance_bits5.eyebrow_scale); |
|
|
|
out_char_info.eyebrow_aspect = static_cast<u8>(appearance_bits5.eyebrow_yscale); |
|
|
|
out_char_info.eyebrow_rotate = static_cast<u8>(appearance_bits5.eyebrow_rotation); |
|
|
|
out_char_info.eyebrow_x = static_cast<u8>(appearance_bits5.eyebrow_spacing); |
|
|
|
out_char_info.eyebrow_y = static_cast<u8>(appearance_bits5.eyebrow_y_position); |
|
|
|
|
|
|
|
out_char_info.nose_type = static_cast<u8>(appearance_bits6.nose_type); |
|
|
|
out_char_info.nose_scale = static_cast<u8>(appearance_bits6.nose_scale); |
|
|
|
out_char_info.nose_y = static_cast<u8>(appearance_bits6.nose_y_position); |
|
|
|
|
|
|
|
out_char_info.mouth_type = static_cast<u8>(appearance_bits7.mouth_type); |
|
|
|
out_char_info.mouth_color = static_cast<u8>(appearance_bits7.mouth_color); |
|
|
|
out_char_info.mouth_scale = static_cast<u8>(appearance_bits7.mouth_scale); |
|
|
|
out_char_info.mouth_aspect = static_cast<u8>(appearance_bits7.mouth_horizontal_stretch); |
|
|
|
out_char_info.mouth_y = static_cast<u8>(appearance_bits8.mouth_y_position); |
|
|
|
|
|
|
|
out_char_info.mustache_type = static_cast<u8>(appearance_bits8.mustache_type); |
|
|
|
out_char_info.mustache_scale = static_cast<u8>(appearance_bits9.mustache_scale); |
|
|
|
out_char_info.mustache_y = static_cast<u8>(appearance_bits9.mustache_y_position); |
|
|
|
|
|
|
|
out_char_info.beard_type = static_cast<u8>(appearance_bits9.bear_type); |
|
|
|
out_char_info.beard_color = static_cast<u8>(appearance_bits9.facial_hair_color); |
|
|
|
|
|
|
|
out_char_info.glasses_type = static_cast<u8>(appearance_bits10.glasses_type); |
|
|
|
out_char_info.glasses_color = static_cast<u8>(appearance_bits10.glasses_color); |
|
|
|
out_char_info.glasses_scale = static_cast<u8>(appearance_bits10.glasses_scale); |
|
|
|
out_char_info.glasses_y = static_cast<u8>(appearance_bits10.glasses_y_position); |
|
|
|
|
|
|
|
out_char_info.mole_type = static_cast<u8>(appearance_bits11.mole_enabled); |
|
|
|
out_char_info.mole_scale = static_cast<u8>(appearance_bits11.mole_scale); |
|
|
|
out_char_info.mole_x = static_cast<u8>(appearance_bits11.mole_x_position); |
|
|
|
out_char_info.mole_y = static_cast<u8>(appearance_bits11.mole_y_position); |
|
|
|
out_store_data.SetNickname(name); |
|
|
|
out_store_data.SetFontRegion( |
|
|
|
static_cast<FontRegion>(static_cast<u8>(region_information.font_region))); |
|
|
|
|
|
|
|
out_store_data.SetFacelineType(appearance_bits1.faceline_type); |
|
|
|
out_store_data.SetFacelineColor(appearance_bits1.faceline_color); |
|
|
|
out_store_data.SetFacelineWrinkle(appearance_bits2.faceline_wrinkle); |
|
|
|
out_store_data.SetFacelineMake(appearance_bits2.faceline_make); |
|
|
|
|
|
|
|
out_store_data.SetHairType(hair_type); |
|
|
|
out_store_data.SetHairColor(appearance_bits3.hair_color); |
|
|
|
out_store_data.SetHairFlip(static_cast<HairFlip>(static_cast<u8>(appearance_bits3.hair_flip))); |
|
|
|
|
|
|
|
out_store_data.SetEyeType(static_cast<u8>(appearance_bits4.eye_type)); |
|
|
|
out_store_data.SetEyeColor(static_cast<u8>(appearance_bits4.eye_color)); |
|
|
|
out_store_data.SetEyeScale(static_cast<u8>(appearance_bits4.eye_scale)); |
|
|
|
out_store_data.SetEyeAspect(static_cast<u8>(appearance_bits4.eye_aspect)); |
|
|
|
out_store_data.SetEyeRotate(static_cast<u8>(appearance_bits4.eye_rotate)); |
|
|
|
out_store_data.SetEyeX(static_cast<u8>(appearance_bits4.eye_x)); |
|
|
|
out_store_data.SetEyeY(static_cast<u8>(appearance_bits4.eye_y)); |
|
|
|
|
|
|
|
out_store_data.SetEyebrowType(static_cast<u8>(appearance_bits5.eyebrow_type)); |
|
|
|
out_store_data.SetEyebrowColor(static_cast<u8>(appearance_bits5.eyebrow_color)); |
|
|
|
out_store_data.SetEyebrowScale(static_cast<u8>(appearance_bits5.eyebrow_scale)); |
|
|
|
out_store_data.SetEyebrowAspect(static_cast<u8>(appearance_bits5.eyebrow_aspect)); |
|
|
|
out_store_data.SetEyebrowRotate(static_cast<u8>(appearance_bits5.eyebrow_rotate)); |
|
|
|
out_store_data.SetEyebrowX(static_cast<u8>(appearance_bits5.eyebrow_x)); |
|
|
|
out_store_data.SetEyebrowY(static_cast<u8>(appearance_bits5.eyebrow_y)); |
|
|
|
|
|
|
|
out_store_data.SetNoseType(static_cast<u8>(appearance_bits6.nose_type)); |
|
|
|
out_store_data.SetNoseScale(static_cast<u8>(appearance_bits6.nose_scale)); |
|
|
|
out_store_data.SetNoseY(static_cast<u8>(appearance_bits6.nose_y)); |
|
|
|
|
|
|
|
out_store_data.SetMouthType(static_cast<u8>(appearance_bits7.mouth_type)); |
|
|
|
out_store_data.SetMouthColor(static_cast<u8>(appearance_bits7.mouth_color)); |
|
|
|
out_store_data.SetMouthScale(static_cast<u8>(appearance_bits7.mouth_scale)); |
|
|
|
out_store_data.SetMouthAspect(static_cast<u8>(appearance_bits7.mouth_aspect)); |
|
|
|
out_store_data.SetMouthY(static_cast<u8>(appearance_bits8.mouth_y)); |
|
|
|
|
|
|
|
out_store_data.SetMustacheType( |
|
|
|
static_cast<MustacheType>(static_cast<u8>(appearance_bits8.mustache_type))); |
|
|
|
out_store_data.SetMustacheScale(static_cast<u8>(appearance_bits9.mustache_scale)); |
|
|
|
out_store_data.SetMustacheY(static_cast<u8>(appearance_bits9.mustache_y)); |
|
|
|
|
|
|
|
out_store_data.SetBeardType( |
|
|
|
static_cast<BeardType>(static_cast<u8>(appearance_bits9.beard_type))); |
|
|
|
out_store_data.SetBeardColor(static_cast<u8>(appearance_bits9.beard_color)); |
|
|
|
|
|
|
|
out_store_data.SetGlassType(static_cast<u8>(appearance_bits10.glass_type)); |
|
|
|
out_store_data.SetGlassColor(static_cast<u8>(appearance_bits10.glass_color)); |
|
|
|
out_store_data.SetGlassScale(static_cast<u8>(appearance_bits10.glass_scale)); |
|
|
|
out_store_data.SetGlassY(static_cast<u8>(appearance_bits10.glass_y)); |
|
|
|
|
|
|
|
out_store_data.SetMoleType(static_cast<u8>(appearance_bits11.mole_type)); |
|
|
|
out_store_data.SetMoleScale(static_cast<u8>(appearance_bits11.mole_scale)); |
|
|
|
out_store_data.SetMoleX(static_cast<u8>(appearance_bits11.mole_x)); |
|
|
|
out_store_data.SetMoleY(static_cast<u8>(appearance_bits11.mole_y)); |
|
|
|
} |
|
|
|
|
|
|
|
void Ver3StoreData::BuildFromStoreData(const CharInfo& char_info) { |
|
|
|
void Ver3StoreData::BuildFromStoreData(const StoreData& store_data) { |
|
|
|
version = 1; |
|
|
|
mii_information.gender.Assign(char_info.gender); |
|
|
|
mii_information.favorite_color.Assign(char_info.favorite_color); |
|
|
|
height = char_info.height; |
|
|
|
build = char_info.build; |
|
|
|
mii_information.gender.Assign(store_data.GetGender()); |
|
|
|
mii_information.favorite_color.Assign(store_data.GetFavoriteColor()); |
|
|
|
height = store_data.GetHeight(); |
|
|
|
build = store_data.GetBuild(); |
|
|
|
|
|
|
|
// Copy name until string terminator
|
|
|
|
mii_name = {}; |
|
|
|
for (std::size_t index = 0; index < char_info.name.size() - 1; index++) { |
|
|
|
mii_name[index] = char_info.name[index]; |
|
|
|
for (std::size_t index = 0; index < store_data.GetNickname().data.size() - 1; index++) { |
|
|
|
mii_name[index] = store_data.GetNickname().data[index]; |
|
|
|
if (mii_name[index] == 0) { |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
region_information.character_set.Assign(char_info.font_region); |
|
|
|
region_information.font_region.Assign(static_cast<u8>(store_data.GetFontRegion())); |
|
|
|
|
|
|
|
appearance_bits1.face_shape.Assign(char_info.faceline_type); |
|
|
|
appearance_bits2.wrinkles.Assign(char_info.faceline_wrinkle); |
|
|
|
appearance_bits2.makeup.Assign(char_info.faceline_make); |
|
|
|
appearance_bits1.faceline_type.Assign(store_data.GetFacelineType()); |
|
|
|
appearance_bits2.faceline_wrinkle.Assign(store_data.GetFacelineWrinkle()); |
|
|
|
appearance_bits2.faceline_make.Assign(store_data.GetFacelineMake()); |
|
|
|
|
|
|
|
hair_style = char_info.hair_type; |
|
|
|
appearance_bits3.flip_hair.Assign(char_info.hair_flip); |
|
|
|
hair_type = store_data.GetHairType(); |
|
|
|
appearance_bits3.hair_flip.Assign(store_data.GetHairFlip()); |
|
|
|
|
|
|
|
appearance_bits4.eye_type.Assign(char_info.eye_type); |
|
|
|
appearance_bits4.eye_scale.Assign(char_info.eye_scale); |
|
|
|
appearance_bits4.eye_vertical_stretch.Assign(char_info.eye_aspect); |
|
|
|
appearance_bits4.eye_rotation.Assign(char_info.eye_rotate); |
|
|
|
appearance_bits4.eye_spacing.Assign(char_info.eye_x); |
|
|
|
appearance_bits4.eye_y_position.Assign(char_info.eye_y); |
|
|
|
appearance_bits4.eye_type.Assign(store_data.GetEyeType()); |
|
|
|
appearance_bits4.eye_scale.Assign(store_data.GetEyeScale()); |
|
|
|
appearance_bits4.eye_aspect.Assign(store_data.GetEyebrowAspect()); |
|
|
|
appearance_bits4.eye_rotate.Assign(store_data.GetEyeRotate()); |
|
|
|
appearance_bits4.eye_x.Assign(store_data.GetEyeX()); |
|
|
|
appearance_bits4.eye_y.Assign(store_data.GetEyeY()); |
|
|
|
|
|
|
|
appearance_bits5.eyebrow_style.Assign(char_info.eyebrow_type); |
|
|
|
appearance_bits5.eyebrow_scale.Assign(char_info.eyebrow_scale); |
|
|
|
appearance_bits5.eyebrow_yscale.Assign(char_info.eyebrow_aspect); |
|
|
|
appearance_bits5.eyebrow_rotation.Assign(char_info.eyebrow_rotate); |
|
|
|
appearance_bits5.eyebrow_spacing.Assign(char_info.eyebrow_x); |
|
|
|
appearance_bits5.eyebrow_y_position.Assign(char_info.eyebrow_y); |
|
|
|
appearance_bits5.eyebrow_type.Assign(store_data.GetEyebrowType()); |
|
|
|
appearance_bits5.eyebrow_scale.Assign(store_data.GetEyebrowScale()); |
|
|
|
appearance_bits5.eyebrow_aspect.Assign(store_data.GetEyebrowAspect()); |
|
|
|
appearance_bits5.eyebrow_rotate.Assign(store_data.GetEyebrowRotate()); |
|
|
|
appearance_bits5.eyebrow_x.Assign(store_data.GetEyebrowX()); |
|
|
|
appearance_bits5.eyebrow_y.Assign(store_data.GetEyebrowY()); |
|
|
|
|
|
|
|
appearance_bits6.nose_type.Assign(char_info.nose_type); |
|
|
|
appearance_bits6.nose_scale.Assign(char_info.nose_scale); |
|
|
|
appearance_bits6.nose_y_position.Assign(char_info.nose_y); |
|
|
|
appearance_bits6.nose_type.Assign(store_data.GetNoseType()); |
|
|
|
appearance_bits6.nose_scale.Assign(store_data.GetNoseScale()); |
|
|
|
appearance_bits6.nose_y.Assign(store_data.GetNoseY()); |
|
|
|
|
|
|
|
appearance_bits7.mouth_type.Assign(char_info.mouth_type); |
|
|
|
appearance_bits7.mouth_scale.Assign(char_info.mouth_scale); |
|
|
|
appearance_bits7.mouth_horizontal_stretch.Assign(char_info.mouth_aspect); |
|
|
|
appearance_bits8.mouth_y_position.Assign(char_info.mouth_y); |
|
|
|
appearance_bits7.mouth_type.Assign(store_data.GetMouthType()); |
|
|
|
appearance_bits7.mouth_scale.Assign(store_data.GetMouthScale()); |
|
|
|
appearance_bits7.mouth_aspect.Assign(store_data.GetMouthAspect()); |
|
|
|
appearance_bits8.mouth_y.Assign(store_data.GetMouthY()); |
|
|
|
|
|
|
|
appearance_bits8.mustache_type.Assign(char_info.mustache_type); |
|
|
|
appearance_bits9.mustache_scale.Assign(char_info.mustache_scale); |
|
|
|
appearance_bits9.mustache_y_position.Assign(char_info.mustache_y); |
|
|
|
appearance_bits8.mustache_type.Assign(store_data.GetMustacheType()); |
|
|
|
appearance_bits9.mustache_scale.Assign(store_data.GetMustacheScale()); |
|
|
|
appearance_bits9.mustache_y.Assign(store_data.GetMustacheY()); |
|
|
|
|
|
|
|
appearance_bits9.bear_type.Assign(char_info.beard_type); |
|
|
|
appearance_bits9.beard_type.Assign(store_data.GetBeardType()); |
|
|
|
|
|
|
|
appearance_bits10.glasses_scale.Assign(char_info.glasses_scale); |
|
|
|
appearance_bits10.glasses_y_position.Assign(char_info.glasses_y); |
|
|
|
appearance_bits10.glass_scale.Assign(store_data.GetGlassScale()); |
|
|
|
appearance_bits10.glass_y.Assign(store_data.GetGlassY()); |
|
|
|
|
|
|
|
appearance_bits11.mole_enabled.Assign(char_info.mole_type); |
|
|
|
appearance_bits11.mole_scale.Assign(char_info.mole_scale); |
|
|
|
appearance_bits11.mole_x_position.Assign(char_info.mole_x); |
|
|
|
appearance_bits11.mole_y_position.Assign(char_info.mole_y); |
|
|
|
appearance_bits11.mole_type.Assign(store_data.GetMoleType()); |
|
|
|
appearance_bits11.mole_scale.Assign(store_data.GetMoleScale()); |
|
|
|
appearance_bits11.mole_x.Assign(store_data.GetMoleX()); |
|
|
|
appearance_bits11.mole_y.Assign(store_data.GetMoleY()); |
|
|
|
|
|
|
|
// These types are converted to V3 from a table
|
|
|
|
appearance_bits1.skin_color.Assign(RawData::FromVer3GetFacelineColor(char_info.faceline_color)); |
|
|
|
appearance_bits3.hair_color.Assign(RawData::FromVer3GetHairColor(char_info.hair_color)); |
|
|
|
appearance_bits4.eye_color.Assign(RawData::FromVer3GetEyeColor(char_info.eye_color)); |
|
|
|
appearance_bits5.eyebrow_color.Assign(RawData::FromVer3GetHairColor(char_info.eyebrow_color)); |
|
|
|
appearance_bits7.mouth_color.Assign(RawData::FromVer3GetMouthlineColor(char_info.mouth_color)); |
|
|
|
appearance_bits9.facial_hair_color.Assign(RawData::FromVer3GetHairColor(char_info.beard_color)); |
|
|
|
appearance_bits10.glasses_color.Assign(RawData::FromVer3GetGlassColor(char_info.glasses_color)); |
|
|
|
appearance_bits10.glasses_type.Assign(RawData::FromVer3GetGlassType(char_info.glasses_type)); |
|
|
|
appearance_bits1.faceline_color.Assign( |
|
|
|
RawData::FromVer3GetFacelineColor(store_data.GetFacelineColor())); |
|
|
|
appearance_bits3.hair_color.Assign(RawData::FromVer3GetHairColor(store_data.GetHairColor())); |
|
|
|
appearance_bits4.eye_color.Assign(RawData::FromVer3GetEyeColor(store_data.GetEyeColor())); |
|
|
|
appearance_bits5.eyebrow_color.Assign( |
|
|
|
RawData::FromVer3GetHairColor(store_data.GetEyebrowColor())); |
|
|
|
appearance_bits7.mouth_color.Assign( |
|
|
|
RawData::FromVer3GetMouthlineColor(store_data.GetMouthColor())); |
|
|
|
appearance_bits9.beard_color.Assign(RawData::FromVer3GetHairColor(store_data.GetBeardColor())); |
|
|
|
appearance_bits10.glass_color.Assign( |
|
|
|
RawData::FromVer3GetGlassColor(store_data.GetGlassColor())); |
|
|
|
appearance_bits10.glass_type.Assign(RawData::FromVer3GetGlassType(store_data.GetGlassType())); |
|
|
|
|
|
|
|
crc = MiiUtil::CalculateCrc16(&version, sizeof(Ver3StoreData) - sizeof(u16)); |
|
|
|
} |
|
|
|
@ -171,56 +191,56 @@ u32 Ver3StoreData::IsValid() const { |
|
|
|
is_valid = is_valid && (height < 128); |
|
|
|
is_valid = is_valid && (build < 128); |
|
|
|
|
|
|
|
is_valid = is_valid && (appearance_bits1.face_shape < 12); |
|
|
|
is_valid = is_valid && (appearance_bits1.skin_color < 7); |
|
|
|
is_valid = is_valid && (appearance_bits2.wrinkles < 12); |
|
|
|
is_valid = is_valid && (appearance_bits2.makeup < 12); |
|
|
|
is_valid = is_valid && (appearance_bits1.faceline_type < 12); |
|
|
|
is_valid = is_valid && (appearance_bits1.faceline_color < 7); |
|
|
|
is_valid = is_valid && (appearance_bits2.faceline_wrinkle < 12); |
|
|
|
is_valid = is_valid && (appearance_bits2.faceline_make < 12); |
|
|
|
|
|
|
|
is_valid = is_valid && (hair_style < 132); |
|
|
|
is_valid = is_valid && (hair_type < 132); |
|
|
|
is_valid = is_valid && (appearance_bits3.hair_color < 8); |
|
|
|
|
|
|
|
is_valid = is_valid && (appearance_bits4.eye_type < 60); |
|
|
|
is_valid = is_valid && (appearance_bits4.eye_color < 6); |
|
|
|
is_valid = is_valid && (appearance_bits4.eye_scale < 8); |
|
|
|
is_valid = is_valid && (appearance_bits4.eye_vertical_stretch < 7); |
|
|
|
is_valid = is_valid && (appearance_bits4.eye_rotation < 8); |
|
|
|
is_valid = is_valid && (appearance_bits4.eye_spacing < 13); |
|
|
|
is_valid = is_valid && (appearance_bits4.eye_y_position < 19); |
|
|
|
is_valid = is_valid && (appearance_bits4.eye_aspect < 7); |
|
|
|
is_valid = is_valid && (appearance_bits4.eye_rotate < 8); |
|
|
|
is_valid = is_valid && (appearance_bits4.eye_x < 13); |
|
|
|
is_valid = is_valid && (appearance_bits4.eye_y < 19); |
|
|
|
|
|
|
|
is_valid = is_valid && (appearance_bits5.eyebrow_style < 25); |
|
|
|
is_valid = is_valid && (appearance_bits5.eyebrow_type < 25); |
|
|
|
is_valid = is_valid && (appearance_bits5.eyebrow_color < 8); |
|
|
|
is_valid = is_valid && (appearance_bits5.eyebrow_scale < 9); |
|
|
|
is_valid = is_valid && (appearance_bits5.eyebrow_yscale < 7); |
|
|
|
is_valid = is_valid && (appearance_bits5.eyebrow_rotation < 12); |
|
|
|
is_valid = is_valid && (appearance_bits5.eyebrow_spacing < 12); |
|
|
|
is_valid = is_valid && (appearance_bits5.eyebrow_y_position < 19); |
|
|
|
is_valid = is_valid && (appearance_bits5.eyebrow_aspect < 7); |
|
|
|
is_valid = is_valid && (appearance_bits5.eyebrow_rotate < 12); |
|
|
|
is_valid = is_valid && (appearance_bits5.eyebrow_x < 12); |
|
|
|
is_valid = is_valid && (appearance_bits5.eyebrow_y < 19); |
|
|
|
|
|
|
|
is_valid = is_valid && (appearance_bits6.nose_type < 18); |
|
|
|
is_valid = is_valid && (appearance_bits6.nose_scale < 9); |
|
|
|
is_valid = is_valid && (appearance_bits6.nose_y_position < 19); |
|
|
|
is_valid = is_valid && (appearance_bits6.nose_y < 19); |
|
|
|
|
|
|
|
is_valid = is_valid && (appearance_bits7.mouth_type < 36); |
|
|
|
is_valid = is_valid && (appearance_bits7.mouth_color < 5); |
|
|
|
is_valid = is_valid && (appearance_bits7.mouth_scale < 9); |
|
|
|
is_valid = is_valid && (appearance_bits7.mouth_horizontal_stretch < 7); |
|
|
|
is_valid = is_valid && (appearance_bits8.mouth_y_position < 19); |
|
|
|
is_valid = is_valid && (appearance_bits7.mouth_aspect < 7); |
|
|
|
is_valid = is_valid && (appearance_bits8.mouth_y < 19); |
|
|
|
|
|
|
|
is_valid = is_valid && (appearance_bits8.mustache_type < 6); |
|
|
|
is_valid = is_valid && (appearance_bits9.mustache_scale < 7); |
|
|
|
is_valid = is_valid && (appearance_bits9.mustache_y_position < 17); |
|
|
|
is_valid = is_valid && (appearance_bits9.mustache_y < 17); |
|
|
|
|
|
|
|
is_valid = is_valid && (appearance_bits9.bear_type < 6); |
|
|
|
is_valid = is_valid && (appearance_bits9.facial_hair_color < 8); |
|
|
|
is_valid = is_valid && (appearance_bits9.beard_type < 6); |
|
|
|
is_valid = is_valid && (appearance_bits9.beard_color < 8); |
|
|
|
|
|
|
|
is_valid = is_valid && (appearance_bits10.glasses_type < 9); |
|
|
|
is_valid = is_valid && (appearance_bits10.glasses_color < 6); |
|
|
|
is_valid = is_valid && (appearance_bits10.glasses_scale < 8); |
|
|
|
is_valid = is_valid && (appearance_bits10.glasses_y_position < 21); |
|
|
|
is_valid = is_valid && (appearance_bits10.glass_type < 9); |
|
|
|
is_valid = is_valid && (appearance_bits10.glass_color < 6); |
|
|
|
is_valid = is_valid && (appearance_bits10.glass_scale < 8); |
|
|
|
is_valid = is_valid && (appearance_bits10.glass_y < 21); |
|
|
|
|
|
|
|
is_valid = is_valid && (appearance_bits11.mole_enabled < 2); |
|
|
|
is_valid = is_valid && (appearance_bits11.mole_type < 2); |
|
|
|
is_valid = is_valid && (appearance_bits11.mole_scale < 9); |
|
|
|
is_valid = is_valid && (appearance_bits11.mole_x_position < 17); |
|
|
|
is_valid = is_valid && (appearance_bits11.mole_y_position < 31); |
|
|
|
is_valid = is_valid && (appearance_bits11.mole_x < 17); |
|
|
|
is_valid = is_valid && (appearance_bits11.mole_y < 31); |
|
|
|
|
|
|
|
return is_valid; |
|
|
|
} |
|
|
|
|