diff --git a/.vscode/settings.json b/.vscode/settings.json index 35ad1b0..0610281 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,6 +3,7 @@ "ввода", "внимательно", "Детективы", + "диалога", "диалогом", "корректный", "Можно", @@ -14,10 +15,12 @@ "открытую", "открыть", "получение", + "после", "правила", "Приложение", "приложением", "проходами", + "проходом", "скрытой", "скрытую", "существует", diff --git a/internal/services/story_service/service.go b/internal/services/story_service/service.go index a2ca7e6..9a81904 100644 --- a/internal/services/story_service/service.go +++ b/internal/services/story_service/service.go @@ -79,7 +79,7 @@ func (s *StoryService) GetPlace(code string) *models.Place { func (s *StoryService) GetPlaces(codes []string) []*models.Place { places := make([]*models.Place, 0, 100) m := map[string]any{} - for _, code := range codes { + for i, code := range codes { place := s.GetPlace(code) _, ok := m[place.Code] if place.Hidden && !ok { @@ -89,6 +89,17 @@ func (s *StoryService) GetPlaces(codes []string) []*models.Place { for _, door := range place.Doors { m[door.Code] = struct{}{} } + + if i > 0 { + for j := range places[i-1].Doors { + if places[i-1].Doors[j].Code != place.Code { + if places[i-1].Doors[j].Show { + places[i-1].Doors[j].Show = false + delete(m, places[i-1].Doors[j].Code) + } + } + } + } } return places } diff --git a/internal/services/story_service/service_test.go b/internal/services/story_service/service_test.go index 7f26fa3..af2f7c8 100644 --- a/internal/services/story_service/service_test.go +++ b/internal/services/story_service/service_test.go @@ -203,6 +203,7 @@ func TestStoryService_GetPlaces(t *testing.T) { "Текст", models.WithPlaceDoors( models.NewDoor("Ы-2", "Название"), + models.NewDoor("Ы-3", "Название"), ), ), models.NewPlace( @@ -211,9 +212,15 @@ func TestStoryService_GetPlaces(t *testing.T) { "Текст", models.WithPlaceHidden(true), ), + models.NewPlace( + "Ы-3", + "Название", + "Текст", + models.WithPlaceHidden(true), + ), }, }, - codes: []string{"Ы-1", "Ы-2"}, + codes: []string{"Ы-1", "Ы-2", "Ы-3"}, want: []*models.Place{ models.NewPlace( "Ы-1", @@ -221,6 +228,7 @@ func TestStoryService_GetPlaces(t *testing.T) { "Текст", models.WithPlaceDoors( models.NewDoor("Ы-2", "Название"), + models.NewDoor("Ы-3", "Название"), ), ), models.NewPlace( @@ -229,6 +237,163 @@ func TestStoryService_GetPlaces(t *testing.T) { "Текст", models.WithPlaceHidden(true), ), + models.NewPlace( + "Ы-3", + "Название", + "Текст", + models.WithPlaceHidden(true), + ), + }, + }, + { + name: "Открываем скрытую точку диалога", + story: &models.Story{ + Places: []*models.Place{ + models.NewPlace( + "Ы-1", + "Название", + "Текст", + models.WithPlaceDoors( + models.NewDoor("Ы-2", "Название", models.WithDoorShow(true)), + ), + ), + models.NewPlace( + "Ы-2", + "Название", + "Текст", + models.WithPlaceHidden(true), + ), + models.NewPlace( + "Ы-3", + "Название", + "Текст", + ), + }, + }, + codes: []string{"Ы-1", "Ы-3", "Ы-2"}, + want: []*models.Place{ + models.NewPlace( + "Ы-1", + "Название", + "Текст", + models.WithPlaceDoors( + models.NewDoor("Ы-2", "Название", models.WithDoorShow(false)), + ), + ), + models.NewPlace( + "Ы-3", + "Название", + "Текст", + ), + models.NewNotFoundPlace("Ы-2"), + }, + }, + { + name: "Открываем скрытую точку диалога", + story: &models.Story{ + Places: []*models.Place{ + models.NewPlace( + "Ы-1", + "Название", + "Текст", + models.WithPlaceDoors( + models.NewDoor("Ы-2", "Название", models.WithDoorShow(true)), + models.NewDoor("Ы-3", "Название", models.WithDoorShow(true)), + ), + ), + models.NewPlace( + "Ы-2", + "Название", + "Текст", + models.WithPlaceHidden(true), + ), + models.NewPlace( + "Ы-3", + "Название", + "Текст", + models.WithPlaceHidden(true), + ), + }, + }, + codes: []string{"Ы-1", "Ы-2", "Ы-3"}, + want: []*models.Place{ + models.NewPlace( + "Ы-1", + "Название", + "Текст", + models.WithPlaceDoors( + models.NewDoor("Ы-2", "Название", models.WithDoorShow(true)), + models.NewDoor("Ы-3", "Название", models.WithDoorShow(false)), + ), + ), + models.NewPlace( + "Ы-2", + "Название", + "Текст", + models.WithPlaceHidden(true), + ), + models.NewNotFoundPlace("Ы-3"), + }, + }, + { + name: "Открываем скрытую точку после диалога", + story: &models.Story{ + Places: []*models.Place{ + models.NewPlace( + "Ы-1", + "Название", + "Текст", + models.WithPlaceDoors( + models.NewDoor("Ы-2", "Название", models.WithDoorShow(true)), + models.NewDoor("Ы-3", "Название", models.WithDoorShow(true)), + models.NewDoor("Ы-4", "Название"), + ), + ), + models.NewPlace( + "Ы-2", + "Название", + "Текст", + models.WithPlaceHidden(true), + ), + models.NewPlace( + "Ы-3", + "Название", + "Текст", + models.WithPlaceHidden(true), + ), + models.NewPlace( + "Ы-4", + "Название", + "Текст", + models.WithPlaceHidden(true), + ), + }, + }, + codes: []string{"Ы-1", "Ы-2", "Ы-3", "Ы-4"}, + want: []*models.Place{ + models.NewPlace( + "Ы-1", + "Название", + "Текст", + models.WithPlaceDoors( + models.NewDoor("Ы-2", "Название", models.WithDoorShow(true)), + models.NewDoor("Ы-3", "Название", models.WithDoorShow(false)), + models.NewDoor("Ы-4", "Название"), + ), + ), + models.NewPlace( + "Ы-2", + "Название", + "Текст", + models.WithPlaceHidden(true), + ), + models.NewNotFoundPlace("Ы-3"), + models.NewPlace( + "Ы-4", + "Название", + "Текст", + models.WithPlaceHidden(true), + ), }, }, }