diff --git a/SVSim.Bootstrap/Data/story/chapters.json b/SVSim.Bootstrap/Data/story/chapters.json index bb7f099..749a2c1 100644 --- a/SVSim.Bootstrap/Data/story/chapters.json +++ b/SVSim.Bootstrap/Data/story/chapters.json @@ -18514,33 +18514,28 @@ "story_reward": [], "sub_chapters": [ { - "story_id": 374, "sub_chapter_id": 1, - "is_finish": 0, + "sub_chapter_story_id": 374, "is_maintenance_chapter": false }, { - "story_id": 375, "sub_chapter_id": 2, - "is_finish": 0, + "sub_chapter_story_id": 375, "is_maintenance_chapter": false }, { - "story_id": 376, "sub_chapter_id": 3, - "is_finish": 0, + "sub_chapter_story_id": 376, "is_maintenance_chapter": false }, { - "story_id": 377, "sub_chapter_id": 4, - "is_finish": 0, + "sub_chapter_story_id": 377, "is_maintenance_chapter": false }, { - "story_id": 378, "sub_chapter_id": 5, - "is_finish": 0, + "sub_chapter_story_id": 378, "is_maintenance_chapter": false } ] @@ -32500,5 +32495,699 @@ ], "story_reward": [], "sub_chapters": [] + }, + { + "story_id": 10000001, + "section_id": 9001, + "chara_id": 0, + "chapter_id": "1", + "next_chapter_id": "2", + "required_chapter_id": null, + "selection_display_position": null, + "selection_text_id": null, + "show_coordinate": 1, + "x_coordinate": 265.0, + "y_coordinate": 180.0, + "is_camera_movable": 1, + "show_subtitles": 0, + "battle_exists": false, + "enemy_chara_id": 1, + "enemy_class": 0, + "enemy_ai_id": 0, + "bg_file_name": "27", + "chapter_effect_path": null, + "chapter_clear_text_id": null, + "battle3dfield_id": 43, + "bgm_id": "0", + "special_battle_setting_id": null, + "release_point": 0, + "is_maintenance_chapter": false, + "is_play_another_end_appearance_animation": false, + "is_released_another_end": false, + "is_skip_enabled": true, + "battle_settings": [ + { + "deck_class_id": 0, + "player_emotion_override": 0, + "enemy_emotion_override": 0, + "skin_id_override": 0, + "battle3dfield_id_override": 0, + "bgm_id_override": 0, + "deck_skin_id_override": 0 + } + ], + "story_reward": [], + "sub_chapters": [] + }, + { + "story_id": 10000002, + "section_id": 9001, + "chara_id": 0, + "chapter_id": "2", + "next_chapter_id": "3", + "required_chapter_id": null, + "selection_display_position": null, + "selection_text_id": null, + "show_coordinate": 1, + "x_coordinate": 180.0, + "y_coordinate": -240.0, + "is_camera_movable": 1, + "show_subtitles": 0, + "battle_exists": false, + "enemy_chara_id": 1, + "enemy_class": 0, + "enemy_ai_id": 0, + "bg_file_name": "29", + "chapter_effect_path": null, + "chapter_clear_text_id": null, + "battle3dfield_id": 43, + "bgm_id": "0", + "special_battle_setting_id": null, + "release_point": 0, + "is_maintenance_chapter": false, + "is_play_another_end_appearance_animation": false, + "is_released_another_end": false, + "is_skip_enabled": true, + "battle_settings": [ + { + "deck_class_id": 0, + "player_emotion_override": 0, + "enemy_emotion_override": 0, + "skin_id_override": 0, + "battle3dfield_id_override": 0, + "bgm_id_override": 0, + "deck_skin_id_override": 0 + } + ], + "story_reward": [], + "sub_chapters": [] + }, + { + "story_id": 10000003, + "section_id": 9001, + "chara_id": 0, + "chapter_id": "3", + "next_chapter_id": "0", + "required_chapter_id": null, + "selection_display_position": null, + "selection_text_id": null, + "show_coordinate": 1, + "x_coordinate": 730.0, + "y_coordinate": 0.0, + "is_camera_movable": 1, + "show_subtitles": 0, + "battle_exists": false, + "enemy_chara_id": 1, + "enemy_class": 0, + "enemy_ai_id": 0, + "bg_file_name": "31", + "chapter_effect_path": null, + "chapter_clear_text_id": null, + "battle3dfield_id": 43, + "bgm_id": "0", + "special_battle_setting_id": null, + "release_point": 0, + "is_maintenance_chapter": false, + "is_play_another_end_appearance_animation": false, + "is_released_another_end": false, + "is_skip_enabled": true, + "battle_settings": [ + { + "deck_class_id": 0, + "player_emotion_override": 0, + "enemy_emotion_override": 0, + "skin_id_override": 0, + "battle3dfield_id_override": 0, + "bgm_id_override": 0, + "deck_skin_id_override": 0 + } + ], + "story_reward": [], + "sub_chapters": [] + }, + { + "story_id": 10000004, + "section_id": 9002, + "chara_id": 0, + "chapter_id": "1", + "next_chapter_id": "2", + "required_chapter_id": null, + "selection_display_position": null, + "selection_text_id": null, + "show_coordinate": 1, + "x_coordinate": 1300.0, + "y_coordinate": -745.0, + "is_camera_movable": 1, + "show_subtitles": 0, + "battle_exists": false, + "enemy_chara_id": 1, + "enemy_class": 0, + "enemy_ai_id": 0, + "bg_file_name": "54", + "chapter_effect_path": null, + "chapter_clear_text_id": null, + "battle3dfield_id": 43, + "bgm_id": "0", + "special_battle_setting_id": null, + "release_point": 0, + "is_maintenance_chapter": false, + "is_play_another_end_appearance_animation": false, + "is_released_another_end": false, + "is_skip_enabled": true, + "battle_settings": [ + { + "deck_class_id": 0, + "player_emotion_override": 0, + "enemy_emotion_override": 0, + "skin_id_override": 0, + "battle3dfield_id_override": 0, + "bgm_id_override": 0, + "deck_skin_id_override": 0 + } + ], + "story_reward": [], + "sub_chapters": [] + }, + { + "story_id": 10000005, + "section_id": 9002, + "chara_id": 0, + "chapter_id": "2", + "next_chapter_id": "3", + "required_chapter_id": null, + "selection_display_position": null, + "selection_text_id": null, + "show_coordinate": 1, + "x_coordinate": -865.0, + "y_coordinate": 145.0, + "is_camera_movable": 1, + "show_subtitles": 0, + "battle_exists": false, + "enemy_chara_id": 1, + "enemy_class": 0, + "enemy_ai_id": 0, + "bg_file_name": "55", + "chapter_effect_path": null, + "chapter_clear_text_id": null, + "battle3dfield_id": 43, + "bgm_id": "0", + "special_battle_setting_id": null, + "release_point": 0, + "is_maintenance_chapter": false, + "is_play_another_end_appearance_animation": false, + "is_released_another_end": false, + "is_skip_enabled": true, + "battle_settings": [ + { + "deck_class_id": 0, + "player_emotion_override": 0, + "enemy_emotion_override": 0, + "skin_id_override": 0, + "battle3dfield_id_override": 0, + "bgm_id_override": 0, + "deck_skin_id_override": 0 + } + ], + "story_reward": [], + "sub_chapters": [] + }, + { + "story_id": 10000006, + "section_id": 9002, + "chara_id": 0, + "chapter_id": "3", + "next_chapter_id": "0", + "required_chapter_id": null, + "selection_display_position": null, + "selection_text_id": null, + "show_coordinate": 1, + "x_coordinate": -815.0, + "y_coordinate": 585.0, + "is_camera_movable": 1, + "show_subtitles": 0, + "battle_exists": false, + "enemy_chara_id": 1, + "enemy_class": 0, + "enemy_ai_id": 0, + "bg_file_name": "54", + "chapter_effect_path": null, + "chapter_clear_text_id": null, + "battle3dfield_id": 43, + "bgm_id": "0", + "special_battle_setting_id": null, + "release_point": 0, + "is_maintenance_chapter": false, + "is_play_another_end_appearance_animation": false, + "is_released_another_end": false, + "is_skip_enabled": true, + "battle_settings": [ + { + "deck_class_id": 0, + "player_emotion_override": 0, + "enemy_emotion_override": 0, + "skin_id_override": 0, + "battle3dfield_id_override": 0, + "bgm_id_override": 0, + "deck_skin_id_override": 0 + } + ], + "story_reward": [], + "sub_chapters": [] + }, + { + "story_id": 10000007, + "section_id": 9003, + "chara_id": 0, + "chapter_id": "1", + "next_chapter_id": "2", + "required_chapter_id": null, + "selection_display_position": null, + "selection_text_id": null, + "show_coordinate": 1, + "x_coordinate": -700.0, + "y_coordinate": -720.0, + "is_camera_movable": 1, + "show_subtitles": 0, + "battle_exists": false, + "enemy_chara_id": 1, + "enemy_class": 0, + "enemy_ai_id": 0, + "bg_file_name": "1", + "chapter_effect_path": null, + "chapter_clear_text_id": null, + "battle3dfield_id": 43, + "bgm_id": "0", + "special_battle_setting_id": null, + "release_point": 0, + "is_maintenance_chapter": false, + "is_play_another_end_appearance_animation": false, + "is_released_another_end": false, + "is_skip_enabled": true, + "battle_settings": [ + { + "deck_class_id": 0, + "player_emotion_override": 0, + "enemy_emotion_override": 0, + "skin_id_override": 0, + "battle3dfield_id_override": 0, + "bgm_id_override": 0, + "deck_skin_id_override": 0 + } + ], + "story_reward": [], + "sub_chapters": [] + }, + { + "story_id": 10000008, + "section_id": 9003, + "chara_id": 0, + "chapter_id": "2", + "next_chapter_id": "3", + "required_chapter_id": null, + "selection_display_position": null, + "selection_text_id": null, + "show_coordinate": 1, + "x_coordinate": 297.0, + "y_coordinate": -100.0, + "is_camera_movable": 1, + "show_subtitles": 0, + "battle_exists": false, + "enemy_chara_id": 1, + "enemy_class": 0, + "enemy_ai_id": 0, + "bg_file_name": "6", + "chapter_effect_path": null, + "chapter_clear_text_id": null, + "battle3dfield_id": 43, + "bgm_id": "0", + "special_battle_setting_id": null, + "release_point": 0, + "is_maintenance_chapter": false, + "is_play_another_end_appearance_animation": false, + "is_released_another_end": false, + "is_skip_enabled": true, + "battle_settings": [ + { + "deck_class_id": 0, + "player_emotion_override": 0, + "enemy_emotion_override": 0, + "skin_id_override": 0, + "battle3dfield_id_override": 0, + "bgm_id_override": 0, + "deck_skin_id_override": 0 + } + ], + "story_reward": [], + "sub_chapters": [] + }, + { + "story_id": 10000009, + "section_id": 9003, + "chara_id": 0, + "chapter_id": "3", + "next_chapter_id": "4", + "required_chapter_id": null, + "selection_display_position": null, + "selection_text_id": null, + "show_coordinate": 1, + "x_coordinate": 925.0, + "y_coordinate": -345.0, + "is_camera_movable": 1, + "show_subtitles": 0, + "battle_exists": false, + "enemy_chara_id": 1, + "enemy_class": 0, + "enemy_ai_id": 0, + "bg_file_name": "4", + "chapter_effect_path": null, + "chapter_clear_text_id": null, + "battle3dfield_id": 43, + "bgm_id": "0", + "special_battle_setting_id": null, + "release_point": 0, + "is_maintenance_chapter": false, + "is_play_another_end_appearance_animation": false, + "is_released_another_end": false, + "is_skip_enabled": true, + "battle_settings": [ + { + "deck_class_id": 0, + "player_emotion_override": 0, + "enemy_emotion_override": 0, + "skin_id_override": 0, + "battle3dfield_id_override": 0, + "bgm_id_override": 0, + "deck_skin_id_override": 0 + } + ], + "story_reward": [], + "sub_chapters": [] + }, + { + "story_id": 10000010, + "section_id": 9003, + "chara_id": 0, + "chapter_id": "4", + "next_chapter_id": "5", + "required_chapter_id": null, + "selection_display_position": null, + "selection_text_id": null, + "show_coordinate": 1, + "x_coordinate": 297.0, + "y_coordinate": -100.0, + "is_camera_movable": 1, + "show_subtitles": 0, + "battle_exists": false, + "enemy_chara_id": 1, + "enemy_class": 0, + "enemy_ai_id": 0, + "bg_file_name": "87", + "chapter_effect_path": null, + "chapter_clear_text_id": null, + "battle3dfield_id": 43, + "bgm_id": "0", + "special_battle_setting_id": null, + "release_point": 0, + "is_maintenance_chapter": false, + "is_play_another_end_appearance_animation": false, + "is_released_another_end": false, + "is_skip_enabled": true, + "battle_settings": [ + { + "deck_class_id": 0, + "player_emotion_override": 0, + "enemy_emotion_override": 0, + "skin_id_override": 0, + "battle3dfield_id_override": 0, + "bgm_id_override": 0, + "deck_skin_id_override": 0 + } + ], + "story_reward": [], + "sub_chapters": [] + }, + { + "story_id": 10000011, + "section_id": 9003, + "chara_id": 0, + "chapter_id": "5", + "next_chapter_id": "6", + "required_chapter_id": null, + "selection_display_position": null, + "selection_text_id": null, + "show_coordinate": 1, + "x_coordinate": -105.0, + "y_coordinate": -505.0, + "is_camera_movable": 1, + "show_subtitles": 0, + "battle_exists": false, + "enemy_chara_id": 1, + "enemy_class": 0, + "enemy_ai_id": 0, + "bg_file_name": "3", + "chapter_effect_path": null, + "chapter_clear_text_id": null, + "battle3dfield_id": 43, + "bgm_id": "0", + "special_battle_setting_id": null, + "release_point": 0, + "is_maintenance_chapter": false, + "is_play_another_end_appearance_animation": false, + "is_released_another_end": false, + "is_skip_enabled": true, + "battle_settings": [ + { + "deck_class_id": 0, + "player_emotion_override": 0, + "enemy_emotion_override": 0, + "skin_id_override": 0, + "battle3dfield_id_override": 0, + "bgm_id_override": 0, + "deck_skin_id_override": 0 + } + ], + "story_reward": [], + "sub_chapters": [] + }, + { + "story_id": 10000012, + "section_id": 9003, + "chara_id": 0, + "chapter_id": "6", + "next_chapter_id": "0", + "required_chapter_id": null, + "selection_display_position": null, + "selection_text_id": null, + "show_coordinate": 1, + "x_coordinate": 300.0, + "y_coordinate": 140.0, + "is_camera_movable": 1, + "show_subtitles": 0, + "battle_exists": false, + "enemy_chara_id": 1, + "enemy_class": 0, + "enemy_ai_id": 0, + "bg_file_name": "88", + "chapter_effect_path": null, + "chapter_clear_text_id": null, + "battle3dfield_id": 43, + "bgm_id": "0", + "special_battle_setting_id": null, + "release_point": 0, + "is_maintenance_chapter": false, + "is_play_another_end_appearance_animation": false, + "is_released_another_end": false, + "is_skip_enabled": true, + "battle_settings": [ + { + "deck_class_id": 0, + "player_emotion_override": 0, + "enemy_emotion_override": 0, + "skin_id_override": 0, + "battle3dfield_id_override": 0, + "bgm_id_override": 0, + "deck_skin_id_override": 0 + } + ], + "story_reward": [], + "sub_chapters": [] + }, + { + "story_id": 10000013, + "section_id": 9005, + "chara_id": 0, + "chapter_id": "1", + "next_chapter_id": "2", + "required_chapter_id": null, + "selection_display_position": null, + "selection_text_id": null, + "show_coordinate": 1, + "x_coordinate": -700.0, + "y_coordinate": -720.0, + "is_camera_movable": 1, + "show_subtitles": 0, + "battle_exists": false, + "enemy_chara_id": 1, + "enemy_class": 0, + "enemy_ai_id": 0, + "bg_file_name": "1004", + "chapter_effect_path": null, + "chapter_clear_text_id": null, + "battle3dfield_id": 43, + "bgm_id": "0", + "special_battle_setting_id": null, + "release_point": 0, + "is_maintenance_chapter": false, + "is_play_another_end_appearance_animation": false, + "is_released_another_end": false, + "is_skip_enabled": true, + "battle_settings": [ + { + "deck_class_id": 0, + "player_emotion_override": 0, + "enemy_emotion_override": 0, + "skin_id_override": 0, + "battle3dfield_id_override": 0, + "bgm_id_override": 0, + "deck_skin_id_override": 0 + } + ], + "story_reward": [], + "sub_chapters": [] + }, + { + "story_id": 10000014, + "section_id": 9005, + "chara_id": 0, + "chapter_id": "2", + "next_chapter_id": "3", + "required_chapter_id": null, + "selection_display_position": null, + "selection_text_id": null, + "show_coordinate": 1, + "x_coordinate": 297.0, + "y_coordinate": -100.0, + "is_camera_movable": 1, + "show_subtitles": 0, + "battle_exists": false, + "enemy_chara_id": 1, + "enemy_class": 0, + "enemy_ai_id": 0, + "bg_file_name": "1006", + "chapter_effect_path": null, + "chapter_clear_text_id": null, + "battle3dfield_id": 43, + "bgm_id": "0", + "special_battle_setting_id": null, + "release_point": 0, + "is_maintenance_chapter": false, + "is_play_another_end_appearance_animation": false, + "is_released_another_end": false, + "is_skip_enabled": true, + "battle_settings": [ + { + "deck_class_id": 0, + "player_emotion_override": 0, + "enemy_emotion_override": 0, + "skin_id_override": 0, + "battle3dfield_id_override": 0, + "bgm_id_override": 0, + "deck_skin_id_override": 0 + } + ], + "story_reward": [], + "sub_chapters": [] + }, + { + "story_id": 10000015, + "section_id": 9005, + "chara_id": 0, + "chapter_id": "3", + "next_chapter_id": "4", + "required_chapter_id": null, + "selection_display_position": null, + "selection_text_id": null, + "show_coordinate": 1, + "x_coordinate": 925.0, + "y_coordinate": -345.0, + "is_camera_movable": 1, + "show_subtitles": 0, + "battle_exists": false, + "enemy_chara_id": 1, + "enemy_class": 0, + "enemy_ai_id": 0, + "bg_file_name": "1005", + "chapter_effect_path": null, + "chapter_clear_text_id": null, + "battle3dfield_id": 43, + "bgm_id": "0", + "special_battle_setting_id": null, + "release_point": 0, + "is_maintenance_chapter": false, + "is_play_another_end_appearance_animation": false, + "is_released_another_end": false, + "is_skip_enabled": true, + "battle_settings": [ + { + "deck_class_id": 0, + "player_emotion_override": 0, + "enemy_emotion_override": 0, + "skin_id_override": 0, + "battle3dfield_id_override": 0, + "bgm_id_override": 0, + "deck_skin_id_override": 0 + } + ], + "story_reward": [], + "sub_chapters": [] + }, + { + "story_id": 10000016, + "section_id": 9005, + "chara_id": 0, + "chapter_id": "4", + "next_chapter_id": "0", + "required_chapter_id": null, + "selection_display_position": null, + "selection_text_id": null, + "show_coordinate": 1, + "x_coordinate": 297.0, + "y_coordinate": -100.0, + "is_camera_movable": 1, + "show_subtitles": 0, + "battle_exists": false, + "enemy_chara_id": 1, + "enemy_class": 0, + "enemy_ai_id": 0, + "bg_file_name": "1004", + "chapter_effect_path": null, + "chapter_clear_text_id": null, + "battle3dfield_id": 43, + "bgm_id": "0", + "special_battle_setting_id": null, + "release_point": 0, + "is_maintenance_chapter": false, + "is_play_another_end_appearance_animation": false, + "is_released_another_end": false, + "is_skip_enabled": true, + "battle_settings": [ + { + "deck_class_id": 0, + "player_emotion_override": 0, + "enemy_emotion_override": 0, + "skin_id_override": 0, + "battle3dfield_id_override": 0, + "bgm_id_override": 0, + "deck_skin_id_override": 0 + } + ], + "story_reward": [ + { + "reward_type": "6", + "reward_detail_id": "200000031", + "reward_number": "1" + } + ], + "sub_chapters": [] } ] \ No newline at end of file diff --git a/SVSim.Database/Repositories/Story/StoryMasterRepository.cs b/SVSim.Database/Repositories/Story/StoryMasterRepository.cs index 3751792..68647da 100644 --- a/SVSim.Database/Repositories/Story/StoryMasterRepository.cs +++ b/SVSim.Database/Repositories/Story/StoryMasterRepository.cs @@ -10,8 +10,13 @@ public class StoryMasterRepository : IStoryMasterRepository public Task> GetSectionsByFamilyAsync(StoryApiType apiType) { + // /story/section (AllStory) returns BOTH Main and Limited sections — they share world_list + // entries in prod. The Story Mode UI's "Special" submenu in world 1 is populated by the + // limited-story sections (section_id >= 9000, story_type_overwrite=2) appearing alongside + // the Prologue (section 0). Event-story sections never appear here — they live behind their + // own menu and are fetched via /event_story/section. var families = apiType == StoryApiType.AllStory - ? new[] { StoryApiType.Main } // AllStory effectively returns Main per spec + ? new[] { StoryApiType.Main, StoryApiType.Limited } : new[] { apiType }; return _db.StorySections.Where(s => families.Contains(s.StoryApiType)) .OrderBy(s => s.AllStoryOrderId) diff --git a/SVSim.EmulatedEntrypoint/Services/StoryService.cs b/SVSim.EmulatedEntrypoint/Services/StoryService.cs index 65e4ae6..bd9f4e2 100644 --- a/SVSim.EmulatedEntrypoint/Services/StoryService.cs +++ b/SVSim.EmulatedEntrypoint/Services/StoryService.cs @@ -133,6 +133,11 @@ public class StoryService : IStoryService IsFinish = pState?.IsFinish ?? false, IsPlayAnotherEndAppearanceAnimation = c.IsPlayAnotherEndAppearanceAnimation, IsReleasedAnotherEnd = c.IsReleasedAnotherEnd, + // TODO: prod gates skip on tutorial chapters specifically — the first battle of + // each class's section-1 intro (the "class tutorial" chapters) only shows skip on + // REPLAY, not on first play. Other chapters honor the chapter-master flag as-is. + // Our captures are all post-clear so the exact gate is unconfirmed; cosmetic-only, + // viewer sees skip earlier than prod would allow on class-tutorial first plays. IsSkipEnabled = c.IsSkipEnabled, }); }