From 89083bd0a1f008749907e46d87693a21f8bb8009 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B0=D0=B5=D1=80=20=D0=9C=D0=B8=D1=85=D0=B0=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D1=87?= Date: Thu, 27 Aug 2026 01:42:44 +0300 Subject: [PATCH] fix: tilt Memento shy state left --- src/features/avatar/avatars.ts | 27 ++++++++++++++++++- .../studio/__tests__/studio-document-test.ts | 11 ++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/features/avatar/avatars.ts b/src/features/avatar/avatars.ts index c7c7344..d289054 100644 --- a/src/features/avatar/avatars.ts +++ b/src/features/avatar/avatars.ts @@ -320,6 +320,7 @@ const fixedSkinColorBehavior = (behavior?: AvatarBehaviorLibrary): AvatarBehavio const mementoHeadsetWorkingExpressionId = 'memento-headset-working-joyful-eyes' const mementoHeadsetShyExpressionId = 'memento-headset-shy-left' +const mementoHeadsetShyTiltExpressionId = 'memento-headset-shy-left-tilt' const copyExpressionEyes = (target: Expression, source: Expression): Expression => ({ ...target, @@ -348,7 +349,8 @@ const mementoBehavior = ( expression.semanticKey !== 'onboarding-listening' && expression.semanticKey !== 'onboarding-curious' && expression.semanticKey !== mementoHeadsetWorkingExpressionId && - expression.semanticKey !== mementoHeadsetShyExpressionId + expression.semanticKey !== mementoHeadsetShyExpressionId && + expression.semanticKey !== mementoHeadsetShyTiltExpressionId ) const expressions = sourceExpressions.map(expression => { const fixedColorExpression = { ...expression } @@ -415,12 +417,34 @@ const mementoBehavior = ( positionYRight: shySource.positionYRight + 10, } : undefined + const shyTiltSource = expressions.find(expression => expression.semanticKey === 'shy-downward') + const headsetShyTiltExpression = + customizeHeadsetExpressions && shyTiltSource + ? { + ...shyTiltSource, + id: mementoHeadsetShyTiltExpressionId, + semanticKey: mementoHeadsetShyTiltExpressionId, + headZ: -Math.abs(shyTiltSource.headZ), + } + : undefined const sequenceFirstExpression = new Map([ ...(headsetWorkingExpression ? [['working', headsetWorkingExpression.id] as const] : []), ...(headsetShyExpression ? [['shy', headsetShyExpression.id] as const] : []), ]) const resolvedSequences = sequences.map(sequence => { const expressionId = sequenceFirstExpression.get(sequence.semanticKey ?? '') + if (sequence.semanticKey === 'shy' && headsetShyTiltExpression) { + return { + ...sequence, + steps: sequence.steps.map((step, index) => + index === 0 && expressionId + ? { ...step, expressionId } + : index === 1 + ? { ...step, expressionId: headsetShyTiltExpression.id } + : step + ), + } + } return expressionId ? { ...sequence, @@ -435,6 +459,7 @@ const mementoBehavior = ( ...expressions, ...(headsetWorkingExpression ? [headsetWorkingExpression] : []), ...(headsetShyExpression ? [headsetShyExpression] : []), + ...(headsetShyTiltExpression ? [headsetShyTiltExpression] : []), ...onboardingExpressions, ], sequences: [ diff --git a/src/features/studio/__tests__/studio-document-test.ts b/src/features/studio/__tests__/studio-document-test.ts index 36ebffb..0a6b7b8 100644 --- a/src/features/studio/__tests__/studio-document-test.ts +++ b/src/features/studio/__tests__/studio-document-test.ts @@ -230,6 +230,9 @@ describe('Studio document', () => { const headsetShyFirst = headsetMemento?.behavior?.sequences.find( sequence => sequence.semanticKey === 'shy' )?.steps[0] + const headsetShySecond = headsetMemento?.behavior?.sequences.find( + sequence => sequence.semanticKey === 'shy' + )?.steps[1] const headsetWorkingExpression = headsetMemento?.behavior?.expressions.find( expression => expression.id === headsetWorkingFirst?.expressionId ) @@ -239,6 +242,9 @@ describe('Studio document', () => { const headsetShyExpression = headsetMemento?.behavior?.expressions.find( expression => expression.id === headsetShyFirst?.expressionId ) + const headsetShyTiltExpression = headsetMemento?.behavior?.expressions.find( + expression => expression.id === headsetShySecond?.expressionId + ) expect(headsetWorkingExpression).toMatchObject({ widthLeft: headsetJoyfulExpression?.widthLeft, widthRight: headsetJoyfulExpression?.widthRight, @@ -260,6 +266,11 @@ describe('Studio document', () => { positionYLeft: initialExpressions[0].positionYLeft + 10, positionYRight: initialExpressions[0].positionYRight + 10, }) + expect(headsetShyTiltExpression).toMatchObject({ + headX: initialExpressions[24].headX, + headY: initialExpressions[24].headY, + headZ: -Math.abs(initialExpressions[24].headZ), + }) expect( memento?.behavior?.sequences.find(sequence => sequence.semanticKey === 'joyful')?.steps[0] .expressionId