diff --git a/SVSim.EmulatedEntrypoint/Controllers/PracticeController.cs b/SVSim.EmulatedEntrypoint/Controllers/PracticeController.cs index 6d5b0bef..60ab3556 100644 --- a/SVSim.EmulatedEntrypoint/Controllers/PracticeController.cs +++ b/SVSim.EmulatedEntrypoint/Controllers/PracticeController.cs @@ -4,6 +4,7 @@ using SVSim.Database.Enums; using SVSim.EmulatedEntrypoint.Models.Dtos; using SVSim.Database.Repositories.Globals; using SVSim.Database.Repositories.Viewer; +using SVSim.Database.Services; using SVSim.Database.Services.BattleXp; using SVSim.EmulatedEntrypoint.Models.Dtos.Requests; using SVSim.EmulatedEntrypoint.Models.Dtos.Requests.Common; @@ -109,18 +110,15 @@ public class PracticeController : SVSimController }; } - // Mission/achievement progress hook. Catalog rows for practice_win achievements use - // opponent NAMES (e.g. "practice_win:elite:arisa") — we only have numeric class_id / - // difficulty here, so we emit numeric forms. Bridging numeric→name to match captured - // catalog rows is a follow-up; the infrastructure is in place. + // Mission/achievement progress hook. Wire values (difficulty int, enemy_class_id int) + // are mapped to catalog-facing names by MissionEventKeys.Practice — the catalog + // authors keys like "practice_win:elite:arisa", so the emitter must match. Wire + // difficulties outside 4/6/7 (elite/elite2/elite3) only advance the top-level counter. if (isWin) { - await _missionProgress.RecordEventAsync(viewerId, new[] - { - "practice_win", - $"practice_win:{request.Difficulty}", - $"practice_win:{request.Difficulty}:{request.EnemyClassId}", - }); + await _missionProgress.RecordEventAsync( + viewerId, + MissionEventKeys.Practice.WinAll(request.Difficulty, request.EnemyClassId)); } int gainXp = 0, totalXp = 0, level = 1; diff --git a/SVSim.EmulatedEntrypoint/Controllers/StoryController.cs b/SVSim.EmulatedEntrypoint/Controllers/StoryController.cs index db4b3727..15bd1479 100644 --- a/SVSim.EmulatedEntrypoint/Controllers/StoryController.cs +++ b/SVSim.EmulatedEntrypoint/Controllers/StoryController.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using SVSim.Database.Entities.Story; +using SVSim.Database.Services; using SVSim.EmulatedEntrypoint.Models.Dtos.Story; using SVSim.EmulatedEntrypoint.Services; @@ -83,12 +84,8 @@ public class StoryController : SVSimController }; if (prefix is not null && req.StoryId != 0) { - await _missionProgress.RecordEventAsync(vid, new[] - { - "story_chapter_finish", - $"story_chapter_finish:{prefix}", - $"story_chapter_finish:{prefix}:{req.StoryId}", - }); + await _missionProgress.RecordEventAsync( + vid, MissionEventKeys.Story.ChapterFinishAll(prefix, req.StoryId)); } return result;