fix(pack): route /tutorial/pack_open through the normal path
The tutorial pack-open alias hardcoded parent_gacha_id=99047 (the May 2026 throwback pair), so once the June rotation replaced it with 99032 the tutorial's final pack-open 400ed. Fix the identity gate by removing it: /tutorial/pack_open is now a plain alias for /pack/open with a single epilogue that advances TutorialState to 100 and emits tutorial_step=100. The tutorial gift's TICKET_MULTI item naturally scopes what the alias can open — the normal path's ticket-debit branch already consumes it, so no separate tutorial-path bypass is needed. Also drop the July-1 expiry on packs 80032/99032 so the current throwback pair stays visible. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -727,71 +727,6 @@ public class PackControllerOpenTests
|
||||
Assert.That(v.Currency.Rupees, Is.EqualTo(0UL), "freeplay must not deduct real DB balance");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TutorialPackOpen_does_not_accrue_gacha_points()
|
||||
{
|
||||
using var factory = new SVSimTestFactory();
|
||||
long viewerId = await factory.SeedViewerAsync();
|
||||
// Seed the starter pack 99047 with a GachaPointConfig set — the tutorial-path skip
|
||||
// must hold even when the pack is technically point-eligible.
|
||||
using (var scope = factory.Services.CreateScope())
|
||||
{
|
||||
var db = scope.ServiceProvider.GetRequiredService<SVSimDbContext>();
|
||||
db.Classes.Add(new ClassEntry { Id = 0, Name = "Neutral" });
|
||||
var set = new ShadowverseCardSetEntry { Id = 99047, IsInRotation = true };
|
||||
db.CardSets.Add(set);
|
||||
for (int i = 0; i < 30; i++)
|
||||
{
|
||||
set.Cards.Add(new ShadowverseCardEntry
|
||||
{
|
||||
Id = 99047_1010 + i, Name = $"c{i}",
|
||||
Rarity = (Rarity)((i % 4) + 1),
|
||||
Class = db.Classes.Local.First(), IsFoil = false,
|
||||
});
|
||||
}
|
||||
db.Items.Add(new ItemEntry { Id = 90001, Name = "starter-ticket" });
|
||||
db.Packs.Add(new PackConfigEntry
|
||||
{
|
||||
Id = 99047, BasePackId = 99047, PackCategory = PackCategory.LegendCardPack,
|
||||
CommenceDate = DateTime.UtcNow.AddDays(-1), CompleteDate = DateTime.UtcNow.AddDays(30),
|
||||
GachaType = 1,
|
||||
GachaPointConfig = new PackGachaPointConfig { ExchangeablePoint = 400, IncreaseGachaPoint = 1 },
|
||||
ChildGachas =
|
||||
{
|
||||
new PackChildGachaEntry
|
||||
{
|
||||
GachaId = 990475, TypeDetail = CardPackType.TicketMulti, Cost = 0, CardCount = 8,
|
||||
ItemId = 90001,
|
||||
},
|
||||
},
|
||||
});
|
||||
var viewer = await db.Viewers
|
||||
.Include(v => v.Items).ThenInclude(i => i.Item)
|
||||
.FirstAsync(v => v.Id == viewerId);
|
||||
viewer.Items.Add(new OwnedItemEntry { Item = db.Items.Local.First(), Count = 1, Viewer = viewer });
|
||||
viewer.MissionData.TutorialState = 41; // pre-END so the tutorial path is allowed
|
||||
await db.SaveChangesAsync();
|
||||
}
|
||||
// Install a draw table for 99047 pointing at the 30 seeded card stubs.
|
||||
var seededCardIds = Enumerable.Range(0, 30).Select(i => (long)(99047_1010 + i)).ToArray();
|
||||
await factory.SeedPackDrawTableAsync(99047, seededCardIds);
|
||||
|
||||
using var client = factory.CreateAuthenticatedClient(viewerId);
|
||||
var body = new StringContent(
|
||||
"""{"parent_gacha_id":99047,"gacha_id":990475,"gacha_type":1,"pack_number":1,"exclude_card_ids":[],"viewer_id":"0","steam_id":0,"steam_session_ticket":""}""",
|
||||
System.Text.Encoding.UTF8, "application/json");
|
||||
var response = await client.PostAsync("/tutorial/pack_open", body);
|
||||
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK),
|
||||
await response.Content.ReadAsStringAsync());
|
||||
|
||||
using var scope2 = factory.Services.CreateScope();
|
||||
var db2 = scope2.ServiceProvider.GetRequiredService<SVSimDbContext>();
|
||||
var v = await db2.Viewers
|
||||
.Include(x => x.GachaPointBalances)
|
||||
.FirstAsync(x => x.Id == viewerId);
|
||||
Assert.That(v.GachaPointBalances, Is.Empty, "tutorial path must not accrue gacha points");
|
||||
}
|
||||
|
||||
// ---------------- Free pack (type_detail=10) ----------------
|
||||
|
||||
/// <summary>
|
||||
|
||||
Reference in New Issue
Block a user