From 1a1c81fcc736098b315d730324ba537e6833f2d7 Mon Sep 17 00:00:00 2001 From: yunimoo Date: Sun, 4 Aug 2024 21:47:14 -0400 Subject: [PATCH] Add binary search for rewards --- gamedata/event_marathon.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/gamedata/event_marathon.go b/gamedata/event_marathon.go index 7acacd74..d2925339 100644 --- a/gamedata/event_marathon.go +++ b/gamedata/event_marathon.go @@ -61,18 +61,19 @@ type EventMarathon struct { } func (em *EventMarathon) GetNextReward(eventPoint int32) (generic.Nullable[int32], generic.Nullable[client.Content]) { - // TODO(optimization): this can be a binary search - for _, reward := range em.TopStatus.EventMarathonPointRewardMasterRows.Slice { - if reward.RequiredPoint > eventPoint { - content := em.Gamedata.EventMarathonReward[reward.RewardGroupId][0] - return generic.NewNullable(reward.RequiredPoint), generic.NewNullableFromPointer(content) - } + slice := em.TopStatus.EventMarathonPointRewardMasterRows.Slice + idx := sort.Search(len(slice), func(i int) bool { + return slice[i].RequiredPoint > eventPoint + }) + + if idx < len(slice) { + content := em.Gamedata.EventMarathonReward[slice[idx].RewardGroupId][0] + return generic.NewNullable(slice[idx].RequiredPoint), generic.NewNullableFromPointer(content) } return generic.Nullable[int32]{}, generic.Nullable[client.Content]{} } func (em *EventMarathon) GetRankingReward(rank int32) int32 { - // TODO(optimization): this can be a binary search for _, reward := range em.TopStatus.EventMarathonRankingRewardMasterRows.Slice { if (!reward.LowerRank.HasValue) || (reward.LowerRank.Value >= rank) { return reward.RewardGroupId