|
|
@ -46,6 +46,9 @@ namespace Build_God_Api.Services |
|
|
public DateTime? EndTime { get; set; } |
|
|
public DateTime? EndTime { get; set; } |
|
|
public bool IsFromYesterday { get; set; } |
|
|
public bool IsFromYesterday { get; set; } |
|
|
public DateTime AssignedDate { get; set; } |
|
|
public DateTime AssignedDate { get; set; } |
|
|
|
|
|
public int ExpReward { get; set; } |
|
|
|
|
|
public int TodayClaimedCount { get; set; } |
|
|
|
|
|
public int TodayTotalCount { get; set; } |
|
|
public List<MissionRewardDto> Rewards { get; set; } = new(); |
|
|
public List<MissionRewardDto> Rewards { get; set; } = new(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -69,9 +72,23 @@ namespace Build_God_Api.Services |
|
|
private readonly ILogger<DailyMissionService> _logger = logger; |
|
|
private readonly ILogger<DailyMissionService> _logger = logger; |
|
|
|
|
|
|
|
|
private const int DailyMissionCount = 5; |
|
|
private const int DailyMissionCount = 5; |
|
|
|
|
|
private const int HardMissionCount = 2; |
|
|
|
|
|
private const int PurgatoryMissionCount = 1; |
|
|
|
|
|
|
|
|
private static readonly TimeZoneInfo BeijingTimeZone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time"); |
|
|
private static readonly TimeZoneInfo BeijingTimeZone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time"); |
|
|
|
|
|
|
|
|
|
|
|
private int CalculateExpReward(MissionDifficulty difficulty, int levelId) |
|
|
|
|
|
{ |
|
|
|
|
|
var coefficient = difficulty switch |
|
|
|
|
|
{ |
|
|
|
|
|
MissionDifficulty.Normal => 2, |
|
|
|
|
|
MissionDifficulty.Hard => 4, |
|
|
|
|
|
MissionDifficulty.Purgatory => 6, |
|
|
|
|
|
_ => 2 |
|
|
|
|
|
}; |
|
|
|
|
|
return coefficient * levelId * levelId * levelId; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
private DateTime GetBeijingTime() |
|
|
private DateTime GetBeijingTime() |
|
|
{ |
|
|
{ |
|
|
return TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, BeijingTimeZone); |
|
|
return TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, BeijingTimeZone); |
|
|
@ -88,12 +105,20 @@ namespace Build_God_Api.Services |
|
|
var yesterday = today.AddDays(-1); |
|
|
var yesterday = today.AddDays(-1); |
|
|
|
|
|
|
|
|
var dailyMissions = await _db.Queryable<CharacterDailyMission>() |
|
|
var dailyMissions = await _db.Queryable<CharacterDailyMission>() |
|
|
.Where(x => x.CharacterId == characterId && x.Status != DailyMissionStatus.Claimed) |
|
|
.Where(x => x.CharacterId == characterId) |
|
|
.Where(x => x.AssignedDate == today || x.AssignedDate == yesterday) |
|
|
.Where(x => x.AssignedDate == today || x.AssignedDate == yesterday) |
|
|
.OrderByDescending(x => x.AssignedDate) |
|
|
.OrderByDescending(x => x.AssignedDate) |
|
|
.OrderByDescending(x => x.IsFromYesterday) |
|
|
.OrderByDescending(x => x.IsFromYesterday) |
|
|
.ToListAsync(); |
|
|
.ToListAsync(); |
|
|
|
|
|
|
|
|
|
|
|
var character = await _db.Queryable<Character>() |
|
|
|
|
|
.FirstAsync(x => x.Id == characterId) |
|
|
|
|
|
?? throw new Exception("角色不存在"); |
|
|
|
|
|
|
|
|
|
|
|
var todayMissions = dailyMissions.Where(x => x.AssignedDate == today).ToList(); |
|
|
|
|
|
var todayClaimedCount = todayMissions.Count(x => x.Status == DailyMissionStatus.Claimed); |
|
|
|
|
|
var todayTotalCount = todayMissions.Count; |
|
|
|
|
|
|
|
|
var result = new List<DailyMissionDto>(); |
|
|
var result = new List<DailyMissionDto>(); |
|
|
|
|
|
|
|
|
foreach (var dm in dailyMissions) |
|
|
foreach (var dm in dailyMissions) |
|
|
@ -117,7 +142,10 @@ namespace Build_God_Api.Services |
|
|
StartTime = dm.StartTime, |
|
|
StartTime = dm.StartTime, |
|
|
EndTime = dm.EndTime, |
|
|
EndTime = dm.EndTime, |
|
|
IsFromYesterday = dm.IsFromYesterday, |
|
|
IsFromYesterday = dm.IsFromYesterday, |
|
|
AssignedDate = dm.AssignedDate |
|
|
AssignedDate = dm.AssignedDate, |
|
|
|
|
|
ExpReward = CalculateExpReward(mission.Difficulty, character.LevelId), |
|
|
|
|
|
TodayClaimedCount = todayClaimedCount, |
|
|
|
|
|
TodayTotalCount = todayTotalCount |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
if (mission.Rewards != null) |
|
|
if (mission.Rewards != null) |
|
|
@ -143,6 +171,13 @@ namespace Build_God_Api.Services |
|
|
|
|
|
|
|
|
public async Task<bool> AcceptMission(int characterId, int dailyMissionId) |
|
|
public async Task<bool> AcceptMission(int characterId, int dailyMissionId) |
|
|
{ |
|
|
{ |
|
|
|
|
|
var existingInProgress = await _db.Queryable<CharacterDailyMission>() |
|
|
|
|
|
.Where(x => x.CharacterId == characterId && x.Status == DailyMissionStatus.InProgress) |
|
|
|
|
|
.AnyAsync(); |
|
|
|
|
|
|
|
|
|
|
|
if (existingInProgress) |
|
|
|
|
|
throw new Exception("已有任务在执行中,请先完成当前任务"); |
|
|
|
|
|
|
|
|
var dailyMission = await _db.Queryable<CharacterDailyMission>() |
|
|
var dailyMission = await _db.Queryable<CharacterDailyMission>() |
|
|
.FirstAsync(x => x.Id == dailyMissionId && x.CharacterId == characterId) |
|
|
.FirstAsync(x => x.Id == dailyMissionId && x.CharacterId == characterId) |
|
|
?? throw new Exception("任务不存在"); |
|
|
?? throw new Exception("任务不存在"); |
|
|
@ -184,17 +219,16 @@ namespace Build_God_Api.Services |
|
|
.FirstAsync(x => x.Id == characterId) |
|
|
.FirstAsync(x => x.Id == characterId) |
|
|
?? throw new Exception("角色不存在"); |
|
|
?? throw new Exception("角色不存在"); |
|
|
|
|
|
|
|
|
|
|
|
var expReward = CalculateExpReward(mission.Difficulty, character.LevelId); |
|
|
|
|
|
character.CurrentExp += expReward; |
|
|
|
|
|
_logger.LogInformation("角色 {CharacterId} 领取任务奖励:经验 +{ExpReward}", characterId, expReward); |
|
|
|
|
|
|
|
|
if (mission.Rewards != null) |
|
|
if (mission.Rewards != null) |
|
|
{ |
|
|
{ |
|
|
foreach (var reward in mission.Rewards) |
|
|
foreach (var reward in mission.Rewards) |
|
|
{ |
|
|
{ |
|
|
switch (reward.RewardType) |
|
|
switch (reward.RewardType) |
|
|
{ |
|
|
{ |
|
|
case RewardType.Exp: |
|
|
|
|
|
character.CurrentExp += reward.Count; |
|
|
|
|
|
_logger.LogInformation("角色 {CharacterId} 领取任务奖励:经验 +{Count}", characterId, reward.Count); |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
case RewardType.Money: |
|
|
case RewardType.Money: |
|
|
character.Money += reward.Count; |
|
|
character.Money += reward.Count; |
|
|
_logger.LogInformation("角色 {CharacterId} 领取任务奖励:灵石 +{Count}", characterId, reward.Count); |
|
|
_logger.LogInformation("角色 {CharacterId} 领取任务奖励:灵石 +{Count}", characterId, reward.Count); |
|
|
@ -212,9 +246,9 @@ namespace Build_God_Api.Services |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
await _db.Updateable(character).ExecuteCommandAsync(); |
|
|
await _db.Updateable(character).ExecuteCommandAsync(); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
dailyMission.Status = DailyMissionStatus.Claimed; |
|
|
dailyMission.Status = DailyMissionStatus.Claimed; |
|
|
await _db.Updateable(dailyMission).ExecuteCommandAsync(); |
|
|
await _db.Updateable(dailyMission).ExecuteCommandAsync(); |
|
|
@ -275,16 +309,31 @@ namespace Build_God_Api.Services |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
var random = new Random(); |
|
|
var random = new Random(); |
|
|
var filteredMissions = availableMissions |
|
|
|
|
|
.Where(x => random.Next(100) < (int)x.ObtainPercentage) |
|
|
|
|
|
.ToList(); |
|
|
|
|
|
|
|
|
|
|
|
var selectedMissions = filteredMissions |
|
|
var normalMissions = availableMissions |
|
|
.OrderBy(x => random.Next()) |
|
|
.Where(x => x.Difficulty == MissionDifficulty.Normal) |
|
|
|
|
|
//.Where(x => random.Next(100) < (int)x.ObtainPercentage)
|
|
|
|
|
|
//.OrderBy(x => random.Next())
|
|
|
.Take(DailyMissionCount) |
|
|
.Take(DailyMissionCount) |
|
|
.ToList(); |
|
|
.ToList(); |
|
|
|
|
|
|
|
|
foreach (var mission in selectedMissions) |
|
|
var hardMissions = availableMissions |
|
|
|
|
|
.Where(x => x.Difficulty == MissionDifficulty.Hard) |
|
|
|
|
|
//.Where(x => random.Next(100) < (int)x.ObtainPercentage)
|
|
|
|
|
|
//.OrderBy(x => random.Next())
|
|
|
|
|
|
.Take(HardMissionCount) |
|
|
|
|
|
.ToList(); |
|
|
|
|
|
|
|
|
|
|
|
var purgatoryMissions = availableMissions |
|
|
|
|
|
.Where(x => x.Difficulty == MissionDifficulty.Purgatory) |
|
|
|
|
|
//.Where(x => random.Next(100) < (int)x.ObtainPercentage)
|
|
|
|
|
|
//.OrderBy(x => random.Next())
|
|
|
|
|
|
.Take(PurgatoryMissionCount) |
|
|
|
|
|
.ToList(); |
|
|
|
|
|
|
|
|
|
|
|
var allSelectedMissions = normalMissions.Concat(hardMissions).Concat(purgatoryMissions).ToList(); |
|
|
|
|
|
|
|
|
|
|
|
foreach (var mission in allSelectedMissions) |
|
|
{ |
|
|
{ |
|
|
var dailyMission = new CharacterDailyMission |
|
|
var dailyMission = new CharacterDailyMission |
|
|
{ |
|
|
{ |
|
|
@ -299,7 +348,8 @@ namespace Build_God_Api.Services |
|
|
await _db.Insertable(dailyMission).ExecuteCommandAsync(); |
|
|
await _db.Insertable(dailyMission).ExecuteCommandAsync(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
_logger.LogInformation("为角色 {CharacterId} 分配了 {Count} 个每日任务", characterId, selectedMissions.Count); |
|
|
_logger.LogInformation("为角色 {CharacterId} 分配了 {Count} 个每日任务(普通:{NormalCount}, 困难:{HardCount}, 炼狱:{PurgatoryCount})", |
|
|
|
|
|
characterId, allSelectedMissions.Count, normalMissions.Count, hardMissions.Count, purgatoryMissions.Count); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|