Skip to content

Commit e34e87f

Browse files
authored
Merge branch 'master' into ReduceQuestXPGold
2 parents c1948b7 + ac0bfe7 commit e34e87f

7 files changed

Lines changed: 20 additions & 14 deletions

File tree

src/Application/Games/Commands/GetGameUserCommand.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ public async ValueTask<Result<GameUserViewModel>> Handle(GetGameUserCommand req,
173173

174174
// No need to save here since a character will be created and a save will be needed.
175175
_db.ActivityLogs.Add(_activityLogService.CreateUserCreatedLog(user.Id));
176+
await _questAssignmentService.AssignQuestsToNewUserAsync(user.Id, cancellationToken);
176177
}
177178
else
178179
{
@@ -208,7 +209,6 @@ await _db.Entry(user)
208209

209210
_db.ActivityLogs.Add(_activityLogService.CreateCharacterCreatedLog(user.Id, user.ActiveCharacter.Id));
210211
await _db.SaveChangesAsync(cancellationToken);
211-
await _questAssignmentService.AssignQuestsToNewUserAsync(user.Id, cancellationToken);
212212
}
213213
else
214214
{

src/Application/Quests/Commands/RerollQuestCommand.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,13 @@ public async ValueTask<Result> Handle(RerollQuestCommand req,
3535
CancellationToken cancellationToken)
3636
{
3737
int price = constants.QuestRerollDailyQuestPrice;
38-
var userQuest = await db.UserQuests
38+
var userDailyQuests = await db.UserQuests
3939
.Include(uq => uq.QuestDefinition)
4040
.Include(uq => uq.User!)
41-
.FirstOrDefaultAsync(
42-
uq => uq.Id == req.UserQuestId && uq.UserId == req.UserId &&
43-
uq.QuestDefinition!.Type == QuestType.Daily, cancellationToken);
41+
.Where(uq => uq.UserId == req.UserId && uq.QuestDefinition!.Type == QuestType.Daily)
42+
.ToListAsync(cancellationToken);
43+
44+
var userQuest = userDailyQuests.FirstOrDefault(uq => uq.Id == req.UserQuestId);
4445

4546
if (userQuest == null)
4647
{
@@ -68,9 +69,11 @@ public async ValueTask<Result> Handle(RerollQuestCommand req,
6869
return new(CommonErrors.NotEnoughGold(price, user.Gold));
6970
}
7071

72+
var assignedQuestDefinitionIds = userDailyQuests.Select(uq => uq.QuestDefinitionId).ToHashSet();
73+
7174
user.Gold -= price;
7275

73-
var newUserQuest = await questAssignmentService.ReplaceDailyUserQuestAsync(userQuest, cancellationToken);
76+
var newUserQuest = await questAssignmentService.ReplaceDailyUserQuestAsync(userQuest, assignedQuestDefinitionIds, cancellationToken);
7477

7578
db.ActivityLogs.Add(activityLogService.CreateQuestRerolledLog(
7679
req.UserId, userQuest.Id, newUserQuest.Id, price));

src/Application/Quests/Services/IQuestAssignmentService.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public interface IQuestAssignmentService
3030
/// Reroll selected quest.
3131
/// </summary>
3232
/// <param name="userQuest">Old user quest.</param>
33+
/// <param name="assignedQuestDefinitionIds">All daily quests definitions assigned to user now.</param>
3334
/// <param name="cancellationToken">Cancellation token.</param>
34-
Task<UserQuest> ReplaceDailyUserQuestAsync(UserQuest userQuest, CancellationToken cancellationToken = default);
35+
Task<UserQuest> ReplaceDailyUserQuestAsync(UserQuest userQuest, HashSet<int> assignedQuestDefinitionIds, CancellationToken cancellationToken = default);
3536
}

src/Application/Quests/Services/QuestAssignmentService.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,11 +201,10 @@ public async Task AssignQuestsToNewUserAsync(int userId, CancellationToken cance
201201
await db.SaveChangesAsync(cancellationToken);
202202
}
203203

204-
public async Task<UserQuest> ReplaceDailyUserQuestAsync(UserQuest userQuest,
205-
CancellationToken cancellationToken = default)
204+
public async Task<UserQuest> ReplaceDailyUserQuestAsync(UserQuest userQuest, HashSet<int> assignedQuestDefinitionIds, CancellationToken cancellationToken = default)
206205
{
207206
var questDefinitions = await db.QuestDefinitions
208-
.Where(qd => qd.IsActive && qd.Type == QuestType.Daily && userQuest.QuestDefinition!.Id != qd.Id)
207+
.Where(qd => qd.IsActive && qd.Type == QuestType.Daily && !assignedQuestDefinitionIds.Contains(qd.Id))
209208
.ToListAsync(cancellationToken);
210209

211210
var randomQuestDefinition = questDefinitions.Shuffle().FirstOrDefault() ?? throw new InvalidOperationException("No available daily quest definitions found.");

src/Module.Server/Common/Models/CrpgAgentStatCalculateModel.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,7 @@ static double Polynomial(float x)
550550
1.0f);
551551

552552
props.WeaponInaccuracy *= encumbranceMultiplier;
553+
props.WeaponInaccuracy = MathF.Clamp(props.WeaponInaccuracy, 0f, 1f);
553554

554555
// Reload & draw speed penalty: linearly drops from 1.0 at 20 to 0.25 at 30
555556
float reloadThrustMultiplier = totalEncumbrance <= 20f

test/Application.UTest/Quests/RerollQuestCommandTest.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -311,8 +311,8 @@ public async Task ShouldRerollQuestSuccessfully()
311311
activityLogServiceMock.Setup(al => al.CreateQuestRerolledLog(user.Id, userQuest.Id, newUserQuest.Id, Constants.QuestRerollDailyQuestPrice))
312312
.Returns(new ActivityLog());
313313
Mock<IQuestAssignmentService> questAssignmentServiceMock = new();
314-
questAssignmentServiceMock.Setup(q => q.ReplaceDailyUserQuestAsync(It.IsAny<UserQuest>(), It.IsAny<CancellationToken>()))
315-
.Callback<UserQuest, CancellationToken>((uq, ct) =>
314+
questAssignmentServiceMock.Setup(q => q.ReplaceDailyUserQuestAsync(It.IsAny<UserQuest>(), It.IsAny<HashSet<int>>(), It.IsAny<CancellationToken>()))
315+
.Callback<UserQuest, HashSet<int>, CancellationToken>((uq, aq, ct) =>
316316
{
317317
// Simulate removal of old quest and addition of new one as the real service does
318318
ActDb.UserQuests.Remove(uq);
@@ -338,7 +338,7 @@ public async Task ShouldRerollQuestSuccessfully()
338338
var dbUser = await AssertDb.Users.FirstAsync(u => u.Id == user.Id);
339339
Assert.That(dbUser.Gold, Is.EqualTo(700)); // 1000 - 300
340340

341-
questAssignmentServiceMock.Verify(q => q.ReplaceDailyUserQuestAsync(It.IsAny<UserQuest>(), It.IsAny<CancellationToken>()), Times.Once);
341+
questAssignmentServiceMock.Verify(q => q.ReplaceDailyUserQuestAsync(It.IsAny<UserQuest>(), It.IsAny<HashSet<int>>(), It.IsAny<CancellationToken>()), Times.Once);
342342
activityLogServiceMock.Verify(al => al.CreateQuestRerolledLog(
343343
user.Id, userQuest.Id, newUserQuest.Id, Constants.QuestRerollDailyQuestPrice), Times.Once);
344344

test/Application.UTest/Quests/Services/QuestAssignmentServiceTest.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,12 +218,14 @@ public async Task ReplaceDailyUserQuestShouldReplaceWithDifferentDefinitionAndKe
218218

219219
QuestAssignmentService service = new(ActDb, Constants);
220220

221+
var assignedDailyQuests = await ActDb.UserQuests.Where(uq => uq.UserId == user.Id).Select(uq => uq.QuestDefinitionId).ToHashSetAsync();
222+
221223
UserQuest oldUserQuest = await ActDb.UserQuests
222224
.Include(uq => uq.User)
223225
.Include(uq => uq.QuestDefinition)
224226
.FirstAsync(uq => uq.Id == 100);
225227

226-
UserQuest newUserQuest = await service.ReplaceDailyUserQuestAsync(oldUserQuest);
228+
UserQuest newUserQuest = await service.ReplaceDailyUserQuestAsync(oldUserQuest, assignedDailyQuests);
227229

228230
bool oldQuestExists = await AssertDb.UserQuests.AnyAsync(uq => uq.Id == 100);
229231
UserQuest dbNewQuest = await AssertDb.UserQuests

0 commit comments

Comments
 (0)