docs(importers): update data_dumps path references for reorg
Mirror of the outer-repo data_dumps/ reorganization (commit e1e595d in the SVSim outer repo): updates all data_dumps/extract/ → data_dumps/scripts/, data_dumps/client_master_csv → data_dumps/client-assets, data_dumps/traffic → data_dumps/captures/traffic in XML doc-comments and inline comments across importers, controllers, middlewares, DTOs, and tests. Doc-only; no logic changes; build green. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -53,7 +53,7 @@ public class AchievementCatalogImporter
|
|||||||
{
|
{
|
||||||
Console.WriteLine($"[AchievementCatalogImporter] WARN: {unmappedTypes.Count} types " +
|
Console.WriteLine($"[AchievementCatalogImporter] WARN: {unmappedTypes.Count} types " +
|
||||||
$"with no event_type: [{string.Join(", ", unmappedTypes.OrderBy(x => x))}] — " +
|
$"with no event_type: [{string.Join(", ", unmappedTypes.OrderBy(x => x))}] — " +
|
||||||
"add to ACHIEVEMENT_EVENT_MAP in data_dumps/extract/extract-achievements.py");
|
"add to ACHIEVEMENT_EVENT_MAP in data_dumps/scripts/extract-achievements.py");
|
||||||
}
|
}
|
||||||
return created + updated;
|
return created + updated;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ public class BattlePassMonthlyMissionImporter
|
|||||||
{
|
{
|
||||||
Console.WriteLine($"[BattlePassMonthlyMissionImporter] WARN: {unmapped.Count} rows " +
|
Console.WriteLine($"[BattlePassMonthlyMissionImporter] WARN: {unmapped.Count} rows " +
|
||||||
$"with no event_type: [{string.Join(", ", unmapped)}] — add name to " +
|
$"with no event_type: [{string.Join(", ", unmapped)}] — add name to " +
|
||||||
"BP_MONTHLY_EVENT_MAP in data_dumps/extract/extract-bp-monthly-missions.py");
|
"BP_MONTHLY_EVENT_MAP in data_dumps/scripts/extract-bp-monthly-missions.py");
|
||||||
}
|
}
|
||||||
return created + updated;
|
return created + updated;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ namespace SVSim.Bootstrap.Importers;
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tiny shared helper for content importers. Capture parsing has moved out of the bootstrap
|
/// Tiny shared helper for content importers. Capture parsing has moved out of the bootstrap
|
||||||
/// project entirely (extractors under <c>data_dumps/extract/</c> emit per-table seed JSON);
|
/// project entirely (extractors under <c>data_dumps/scripts/</c> emit per-table seed JSON);
|
||||||
/// only the wire-date normaliser stays here because several seed-driven importers still need
|
/// only the wire-date normaliser stays here because several seed-driven importers still need
|
||||||
/// to canonicalise prod-shaped timestamp strings.
|
/// to canonicalise prod-shaped timestamp strings.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ namespace SVSim.Bootstrap.Importers;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Idempotent upsert of the item catalog from <c>seeds/items.json</c>. Source is the client's
|
/// Idempotent upsert of the item catalog from <c>seeds/items.json</c>. Source is the client's
|
||||||
/// <c>item_master.csv</c> + <c>itemtext.json</c> (extracted via
|
/// <c>item_master.csv</c> + <c>itemtext.json</c> (extracted via
|
||||||
/// <c>data_dumps/extract/extract-items.py</c>). Rows missing from the seed are LEFT INTACT.
|
/// <c>data_dumps/scripts/extract-items.py</c>). Rows missing from the seed are LEFT INTACT.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ItemImporter
|
public class ItemImporter
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ namespace SVSim.Bootstrap.Importers;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Idempotent upsert of the item-purchase catalog from <c>seeds/item-purchase.json</c>.
|
/// Idempotent upsert of the item-purchase catalog from <c>seeds/item-purchase.json</c>.
|
||||||
/// Source is the wire <c>/item_purchase/info</c> response, extracted via
|
/// Source is the wire <c>/item_purchase/info</c> response, extracted via
|
||||||
/// <c>data_dumps/extract/extract-item-purchase.py</c>. Rows missing from the seed are LEFT INTACT.
|
/// <c>data_dumps/scripts/extract-item-purchase.py</c>. Rows missing from the seed are LEFT INTACT.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ItemPurchaseImporter
|
public class ItemPurchaseImporter
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace SVSim.Bootstrap.Importers;
|
|||||||
/// Idempotent upsert of the leader-skin-shop catalog from <c>seeds/leader-skin-shop.json</c>.
|
/// Idempotent upsert of the leader-skin-shop catalog from <c>seeds/leader-skin-shop.json</c>.
|
||||||
/// Mirror of <see cref="SleeveShopImporter"/>. Source is the wire
|
/// Mirror of <see cref="SleeveShopImporter"/>. Source is the wire
|
||||||
/// <c>/leader_skin/products</c> response, extracted via
|
/// <c>/leader_skin/products</c> response, extracted via
|
||||||
/// <c>data_dumps/extract/extract-leader-skin-shop.py</c>. Rows missing from the seed are LEFT INTACT.
|
/// <c>data_dumps/scripts/extract-leader-skin-shop.py</c>. Rows missing from the seed are LEFT INTACT.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class LeaderSkinShopImporter
|
public class LeaderSkinShopImporter
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ public class MissionCatalogImporter
|
|||||||
{
|
{
|
||||||
Console.WriteLine($"[MissionCatalogImporter] WARN: {unmapped.Count} mission_ids with " +
|
Console.WriteLine($"[MissionCatalogImporter] WARN: {unmapped.Count} mission_ids with " +
|
||||||
$"no event_type: [{string.Join(", ", unmapped)}] — add to MISSION_EVENT_MAP " +
|
$"no event_type: [{string.Join(", ", unmapped)}] — add to MISSION_EVENT_MAP " +
|
||||||
"in data_dumps/extract/extract-missions.py and re-run the extractor");
|
"in data_dumps/scripts/extract-missions.py and re-run the extractor");
|
||||||
}
|
}
|
||||||
return created + updated;
|
return created + updated;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ namespace SVSim.Bootstrap.Importers;
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Reads a JSON seed file under <c>SVSim.Bootstrap/Data/seeds/</c>. Replaces ImporterBase.LoadCapture.
|
/// Reads a JSON seed file under <c>SVSim.Bootstrap/Data/seeds/</c>. Replaces ImporterBase.LoadCapture.
|
||||||
/// Files are produced by extractors in <c>data_dumps/extract/</c>; the bootstrap project does not
|
/// Files are produced by extractors in <c>data_dumps/scripts/</c>; the bootstrap project does not
|
||||||
/// transform wire formats. Missing files are non-fatal (returns empty/null) — caller decides.
|
/// transform wire formats. Missing files are non-fatal (returns empty/null) — caller decides.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static class SeedLoader
|
public static class SeedLoader
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ namespace SVSim.Bootstrap.Importers;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Idempotent upsert of the sleeve-shop catalog from <c>seeds/sleeve-shop.json</c>.
|
/// Idempotent upsert of the sleeve-shop catalog from <c>seeds/sleeve-shop.json</c>.
|
||||||
/// Source is the wire <c>/sleeve/info</c> response, extracted via
|
/// Source is the wire <c>/sleeve/info</c> response, extracted via
|
||||||
/// <c>data_dumps/extract/extract-sleeve-shop.py</c>. Mirror of the BuildDeck importer pattern.
|
/// <c>data_dumps/scripts/extract-sleeve-shop.py</c>. Mirror of the BuildDeck importer pattern.
|
||||||
/// Rows missing from the seed are LEFT INTACT (so manual test fixtures survive re-runs).
|
/// Rows missing from the seed are LEFT INTACT (so manual test fixtures survive re-runs).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class SleeveShopImporter
|
public class SleeveShopImporter
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ namespace SVSim.Bootstrap.Importers;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Idempotent upsert of the spot card exchange catalog from <c>seeds/spot-card-exchange.json</c>.
|
/// Idempotent upsert of the spot card exchange catalog from <c>seeds/spot-card-exchange.json</c>.
|
||||||
/// Source is the wire <c>/spot_card_exchange/top</c> response, extracted via
|
/// Source is the wire <c>/spot_card_exchange/top</c> response, extracted via
|
||||||
/// <c>data_dumps/extract/extract-spot-card-exchange.py</c>. Rows missing from the seed are
|
/// <c>data_dumps/scripts/extract-spot-card-exchange.py</c>. Rows missing from the seed are
|
||||||
/// LEFT INTACT.
|
/// LEFT INTACT.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class SpotCardExchangeImporter
|
public class SpotCardExchangeImporter
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ public static class Program
|
|||||||
if (!opts.SkipGlobals)
|
if (!opts.SkipGlobals)
|
||||||
{
|
{
|
||||||
// Per-domain seed pipeline. Each importer reads a per-table JSON seed file under
|
// Per-domain seed pipeline. Each importer reads a per-table JSON seed file under
|
||||||
// SVSim.Bootstrap/Data/seeds/ produced by an extractor in data_dumps/extract/.
|
// SVSim.Bootstrap/Data/seeds/ produced by an extractor in data_dumps/scripts/.
|
||||||
//
|
//
|
||||||
// RotationConfigImporter writes the Rotation GameConfig section that RotationFlagUpdater
|
// RotationConfigImporter writes the Rotation GameConfig section that RotationFlagUpdater
|
||||||
// reads; CardImporter ran earlier in the !SkipCards block so CardSets are populated.
|
// reads; CardImporter ran earlier in the !SkipCards block so CardSets are populated.
|
||||||
@@ -229,7 +229,7 @@ public static class Program
|
|||||||
" --story-data-dir <dir> Override story data directory (default: shipped Data/story)\n" +
|
" --story-data-dir <dir> Override story data directory (default: shipped Data/story)\n" +
|
||||||
" --skip-story Skip story import (worlds/sections/chapters/sbs)\n" +
|
" --skip-story Skip story import (worlds/sections/chapters/sbs)\n" +
|
||||||
"\n" +
|
"\n" +
|
||||||
"Capture-derived seeds are produced by extractors under data_dumps/extract/* and\n" +
|
"Capture-derived seeds are produced by extractors under data_dumps/scripts/* and\n" +
|
||||||
"checked into SVSim.Bootstrap/Data/seeds/. The bootstrap project never parses wire\n" +
|
"checked into SVSim.Bootstrap/Data/seeds/. The bootstrap project never parses wire\n" +
|
||||||
"captures directly — refresh seeds by re-running the relevant extractor.\n" +
|
"captures directly — refresh seeds by re-running the relevant extractor.\n" +
|
||||||
"\n" +
|
"\n" +
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ public class ResourceConfig
|
|||||||
/// <c>PlayerPrefs["RES_VER"]</c> and uses it as the version path component for asset
|
/// <c>PlayerPrefs["RES_VER"]</c> and uses it as the version path component for asset
|
||||||
/// manifest lookups: <c>https://<cdn>/dl/Manifest/<RES_VER>/<lang>/<Platform>/</c>.
|
/// manifest lookups: <c>https://<cdn>/dl/Manifest/<RES_VER>/<lang>/<Platform>/</c>.
|
||||||
/// <para>
|
/// <para>
|
||||||
/// Default value is the prod-captured version from <c>data_dumps/traffic_prod_tutorial.ndjson</c>
|
/// Default value is the prod-captured version from <c>data_dumps/captures/traffic_prod_tutorial.ndjson</c>
|
||||||
/// (2026-05-28) — i.e., a path Akamai actually serves. When this rotates (or Akamai sunsets
|
/// (2026-05-28) — i.e., a path Akamai actually serves. When this rotates (or Akamai sunsets
|
||||||
/// ahead of June 2026), update via DB <c>GameConfigs</c> row, appsettings.json, or this
|
/// ahead of June 2026), update via DB <c>GameConfigs</c> row, appsettings.json, or this
|
||||||
/// shipped default; no code change needed.
|
/// shipped default; no code change needed.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ namespace SVSim.Database.Models;
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Item master row. Mirrors the client's <c>item_master.csv</c> + <c>itemtext.json</c>
|
/// Item master row. Mirrors the client's <c>item_master.csv</c> + <c>itemtext.json</c>
|
||||||
/// (under <c>data_dumps/client_master_csv/</c>): <see cref="Type"/> matches the client-side
|
/// (under <c>data_dumps/client-assets/</c>): <see cref="Type"/> matches the client-side
|
||||||
/// item_type enum (1 = challenge ticket, 2 = card-pack ticket, 3 = premium orb,
|
/// item_type enum (1 = challenge ticket, 2 = card-pack ticket, 3 = premium orb,
|
||||||
/// 4 = colosseum ticket, 5 = orb piece, 6 = skin/event ticket, 7 = other);
|
/// 4 = colosseum ticket, 5 = orb piece, 6 = skin/event ticket, 7 = other);
|
||||||
/// <see cref="ThumbnailPath"/> is the client-resolved sprite key.
|
/// <see cref="ThumbnailPath"/> is the client-resolved sprite key.
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ namespace SVSim.Database.Models;
|
|||||||
/// main_story/get_deck_list's build_deck_list / trial_deck_list. PK (DeckNo) equals the deck's
|
/// main_story/get_deck_list's build_deck_list / trial_deck_list. PK (DeckNo) equals the deck's
|
||||||
/// wire deck_no, which also equals BuildDeckProductEntry.Id — the 40-card list is read from that
|
/// wire deck_no, which also equals BuildDeckProductEntry.Id — the 40-card list is read from that
|
||||||
/// product (single source of truth), NOT stored here. Sourced from
|
/// product (single source of truth), NOT stored here. Sourced from
|
||||||
/// data_dumps/traffic_prod_trial_decks.ndjson via seeds/story-decks.json.
|
/// data_dumps/captures/traffic_prod_trial_decks.ndjson via seeds/story-decks.json.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class StoryDeckEntry : BaseEntity<int>
|
public class StoryDeckEntry : BaseEntity<int>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ public class PackRepository : IPackRepository
|
|||||||
// parent_gacha_id DESC matches the prod /pack/info wire order. The tutorial pack
|
// parent_gacha_id DESC matches the prod /pack/info wire order. The tutorial pack
|
||||||
// UI runs with controls locked and auto-selects the FIRST entry in
|
// UI runs with controls locked and auto-selects the FIRST entry in
|
||||||
// pack_config_list, so the legendary starter pack (99047) MUST be index 0 for the
|
// pack_config_list, so the legendary starter pack (99047) MUST be index 0 for the
|
||||||
// tutorial to progress. Verified against data_dumps/traffic_prod_tutorial.ndjson —
|
// tutorial to progress. Verified against data_dumps/captures/traffic_prod_tutorial.ndjson —
|
||||||
// prod emits [99047, 92001, 80047, 16015..16011, 10032..10001].
|
// prod emits [99047, 92001, 80047, 16015..16011, 10032..10001].
|
||||||
.OrderByDescending(p => p.Id)
|
.OrderByDescending(p => p.Id)
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ public class DeckBuilderController : ControllerBase
|
|||||||
Clan = req.Clan.ToString(),
|
Clan = req.Clan.ToString(),
|
||||||
SubClan = req.SubClan ?? 0,
|
SubClan = req.SubClan ?? 0,
|
||||||
// Standard decks emit int 0; my-rotation decks emit the rotation id as a string.
|
// Standard decks emit int 0; my-rotation decks emit the rotation id as a string.
|
||||||
// Mixed wire typing matches prod (data_dumps/traffic_prod_deckcode.ndjson).
|
// Mixed wire typing matches prod (data_dumps/captures/traffic_prod_deckcode.ndjson).
|
||||||
RotationId = (object?)req.RotationId ?? 0,
|
RotationId = (object?)req.RotationId ?? 0,
|
||||||
// Strip the foil flag (ones digit) — matches prod's normalize-on-encode behaviour
|
// Strip the foil flag (ones digit) — matches prod's normalize-on-encode behaviour
|
||||||
// observed in the traffic dump (e.g. 703441011 → 703441010).
|
// observed in the traffic dump (e.g. 703441011 → 703441010).
|
||||||
|
|||||||
@@ -234,7 +234,7 @@ public class ShadowverseTranslationMiddleware : IMiddleware
|
|||||||
|
|
||||||
// Wrap the response in a datawrapper. Portal (no-encryption) endpoints emit an anonymous
|
// Wrap the response in a datawrapper. Portal (no-encryption) endpoints emit an anonymous
|
||||||
// envelope — viewer/udid/sid stay zero/empty — matching the prod portal traffic shape
|
// envelope — viewer/udid/sid stay zero/empty — matching the prod portal traffic shape
|
||||||
// captured in data_dumps/traffic_prod_deckcode.ndjson.
|
// captured in data_dumps/captures/traffic_prod_deckcode.ndjson.
|
||||||
DataWrapper wrappedResponseData = new DataWrapper
|
DataWrapper wrappedResponseData = new DataWrapper
|
||||||
{
|
{
|
||||||
Data = responseData,
|
Data = responseData,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ namespace SVSim.EmulatedEntrypoint.Models.Dtos;
|
|||||||
/// One entry inside <c>gacha_point_rewards[i].reward_list</c>. Different shape from the
|
/// One entry inside <c>gacha_point_rewards[i].reward_list</c>. Different shape from the
|
||||||
/// post-state-totals <see cref="RewardListEntry"/> used by /pack/open: this is a catalog
|
/// post-state-totals <see cref="RewardListEntry"/> used by /pack/open: this is a catalog
|
||||||
/// declaration ("here's what you'd get if you exchanged"), not a viewer-state assignment.
|
/// declaration ("here's what you'd get if you exchanged"), not a viewer-state assignment.
|
||||||
/// Wire keys verified against prod capture data_dumps/traffic_prod_tradeables_capture.ndjson.
|
/// Wire keys verified against prod capture data_dumps/captures/traffic_prod_tradeables_capture.ndjson.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[MessagePackObject]
|
[MessagePackObject]
|
||||||
public class GachaPointRewardDetailEntry
|
public class GachaPointRewardDetailEntry
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ public class GenerateDeckCodeRequest
|
|||||||
[Key("deck_format")]
|
[Key("deck_format")]
|
||||||
public int DeckFormat { get; set; }
|
public int DeckFormat { get; set; }
|
||||||
|
|
||||||
// Wire key is camelCase mid-word capital — verified in data_dumps/traffic.ndjson live
|
// Wire key is camelCase mid-word capital — verified in data_dumps/captures/traffic.ndjson live
|
||||||
// capture (`"cardID":[...]`). The client's LitJson serializer emits the C# property name
|
// capture (`"cardID":[...]`). The client's LitJson serializer emits the C# property name
|
||||||
// verbatim, and the param classes in Wizard/GenerateDeckCodeTask.cs use `cardID` /
|
// verbatim, and the param classes in Wizard/GenerateDeckCodeTask.cs use `cardID` /
|
||||||
// `phantomCardID`. Snake-case would silently bind to empty and the controller would emit
|
// `phantomCardID`. Snake-case would silently bind to empty and the controller would emit
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ namespace SVSim.EmulatedEntrypoint.Models.Dtos.Requests;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Request body for /mypage/refresh. Carries only the standard auth envelope —
|
/// Request body for /mypage/refresh. Carries only the standard auth envelope —
|
||||||
/// no <c>carrier</c> field, unlike MyPageIndexRequest. Confirmed against prod traffic
|
/// no <c>carrier</c> field, unlike MyPageIndexRequest. Confirmed against prod traffic
|
||||||
/// in data_dumps/traffic_prod.ndjson: both refresh request bodies have exactly
|
/// in data_dumps/captures/traffic_prod.ndjson: both refresh request bodies have exactly
|
||||||
/// <c>viewer_id / steam_id / steam_session_ticket</c>.
|
/// <c>viewer_id / steam_id / steam_session_ticket</c>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[MessagePackObject]
|
[MessagePackObject]
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ namespace SVSim.EmulatedEntrypoint.Services;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// In-memory deck-code store with a 3-minute absolute TTL. Codes are lowercase 4-character
|
/// In-memory deck-code store with a 3-minute absolute TTL. Codes are lowercase 4-character
|
||||||
/// alphanumeric tokens — matches the shortest sample observed in prod (e.g. "t7rz" in
|
/// alphanumeric tokens — matches the shortest sample observed in prod (e.g. "t7rz" in
|
||||||
/// data_dumps/traffic_prod_deckcode.ndjson). The portal's anonymous global namespace is
|
/// data_dumps/captures/traffic_prod_deckcode.ndjson). The portal's anonymous global namespace is
|
||||||
/// mirrored here: codes are not scoped to viewer.
|
/// mirrored here: codes are not scoped to viewer.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public sealed class DeckCodeService : IDeckCodeService
|
public sealed class DeckCodeService : IDeckCodeService
|
||||||
|
|||||||
@@ -243,7 +243,7 @@ public class PackControllerGachaPointTests
|
|||||||
var text = await response.Content.ReadAsStringAsync();
|
var text = await response.Content.ReadAsStringAsync();
|
||||||
|
|
||||||
// Literal wire-key checks — verified against
|
// Literal wire-key checks — verified against
|
||||||
// data_dumps/traffic_prod_tradeables_capture.ndjson pack 10008 response.
|
// data_dumps/captures/traffic_prod_tradeables_capture.ndjson pack 10008 response.
|
||||||
Assert.That(text, Does.Contain("\"gacha_point_rewards\""));
|
Assert.That(text, Does.Contain("\"gacha_point_rewards\""));
|
||||||
Assert.That(text, Does.Contain("\"class_id\":\"0\""), "class_id MUST be a string");
|
Assert.That(text, Does.Contain("\"class_id\":\"0\""), "class_id MUST be a string");
|
||||||
Assert.That(text, Does.Contain("\"reward_detail_id\":1080410100"),
|
Assert.That(text, Does.Contain("\"reward_detail_id\":1080410100"),
|
||||||
|
|||||||
@@ -416,7 +416,7 @@ public class StoryServiceTests
|
|||||||
// Section 17 in prod offers 4 custom leaders (chara_ids 500901-500904), not the default
|
// Section 17 in prod offers 4 custom leaders (chara_ids 500901-500904), not the default
|
||||||
// 8 classes. Ordering is by ascending min(story_id) of each chara's chapters:
|
// 8 classes. Ordering is by ascending min(story_id) of each chara's chapters:
|
||||||
// 500901 (569), 500903 (591), 500904 (594), 500902 (597) — non-numeric chara_id sequence.
|
// 500901 (569), 500903 (591), 500904 (594), 500902 (597) — non-numeric chara_id sequence.
|
||||||
// Verified against data_dumps/traffic_prod_626_story.ndjson section_id=17 leader_select.
|
// Verified against data_dumps/captures/traffic_prod_626_story.ndjson section_id=17 leader_select.
|
||||||
var s17chapters = new List<StoryChapter> {
|
var s17chapters = new List<StoryChapter> {
|
||||||
Ch(569, 17, 500901, "1", "2"), Ch(570, 17, 500901, "2", "3"),
|
Ch(569, 17, 500901, "1", "2"), Ch(570, 17, 500901, "2", "3"),
|
||||||
Ch(591, 17, 500903, "1", "2"), Ch(592, 17, 500903, "2", "3"),
|
Ch(591, 17, 500903, "1", "2"), Ch(592, 17, 500903, "2", "3"),
|
||||||
|
|||||||
Reference in New Issue
Block a user