diff --git a/backend/scene-types/interaction.ts b/backend/scene-types/interaction.ts index 9bff4be..2c62bd4 100644 --- a/backend/scene-types/interaction.ts +++ b/backend/scene-types/interaction.ts @@ -100,7 +100,7 @@ export class InteractionSceneState implements SceneState finishInteractionExecution(interactionId: string, onlyIfOngoing: boolean = true) { if (onlyIfOngoing && (this.ongoingInteractionExecution === null || interactionId !== getSuggestedInteractionId(this.ongoingInteractionExecution))) return this.ongoingInteractionExecution = null - this.emit({ type: "interaction-execution-finished" }) + this.emit({ type: "interaction-execution-finished", interactionId }) this.removeInteractionFromQueue(interactionId) const interaction = this.definition.interactionsById.get(interactionId) @@ -112,6 +112,10 @@ export class InteractionSceneState implements SceneState this.setObjectVisibility(interaction.objectId, false) } + interaction.outputObjectIds.forEach(objectId => { + this.revealOrUpgradeObject(objectId, interaction.objectId === objectId && interaction.consume) + }) + break case "combine": @@ -119,26 +123,8 @@ export class InteractionSceneState implements SceneState if (consume) this.setObjectVisibility(id, false) }) - interaction.outputObjectIds.forEach(id => { - const object = this.definition.objectsById.get(id)! - this.setObjectVisibility(id, true) - - if (object.completion !== undefined) { - let step = (this.objectCompletionStepById.get(id) ?? -1) - if (interaction.inputObjects.get(id)?.consume === true) { - step = 0 - } else { - step = Math.min(step + 1, object.completion.steps) - } - - this.objectCompletionStepById.set(id, step) - this.emit({ type: "object-completion-step-changed", objectId: id, step }) - - if (step === object.completion.steps) { - this.objectVisibilityById.set(id, false) - this.objectVisibilityById.set(object.completion.replaceWith, true) - } - } + interaction.outputObjectIds.forEach(objectId => { + this.revealOrUpgradeObject(objectId, interaction.inputObjects.get(objectId)?.consume === true) }) break @@ -166,4 +152,26 @@ export class InteractionSceneState implements SceneState this.objectVisibilityById.set(objectId, isVisible) this.emit({ type: "object-visibility-changed", objectId: objectId, isVisible }) } + + revealOrUpgradeObject(objectId: string, resetCompletionSteps: boolean = false) { + const object = this.definition.objectsById.get(objectId)! + this.setObjectVisibility(objectId, true) + + if (object.completion !== undefined) { + let step = (this.objectCompletionStepById.get(objectId) ?? -1) + if (resetCompletionSteps) { + step = 0 + } else { + step = Math.min(step + 1, object.completion.steps) + } + + this.objectCompletionStepById.set(objectId, step) + this.emit({ type: "object-completion-step-changed", objectId, step }) + + if (step === object.completion.steps) { + this.objectVisibilityById.set(objectId, false) + this.objectVisibilityById.set(object.completion.replaceWith, true) + } + } + } } \ No newline at end of file diff --git a/frontend/scene-types/interaction/CrewInteractionCard.vue b/frontend/scene-types/interaction/CrewInteractionCard.vue index 08210ef..e1f0498 100644 --- a/frontend/scene-types/interaction/CrewInteractionCard.vue +++ b/frontend/scene-types/interaction/CrewInteractionCard.vue @@ -1,33 +1,62 @@ @@ -37,11 +66,11 @@ \ No newline at end of file diff --git a/frontend/scene-types/interaction/CrewObjectCard.vue b/frontend/scene-types/interaction/CrewObjectCard.vue index 8bc20da..b9e8560 100644 --- a/frontend/scene-types/interaction/CrewObjectCard.vue +++ b/frontend/scene-types/interaction/CrewObjectCard.vue @@ -4,7 +4,7 @@ {{ object.label }}
- +