60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
package world
|
|
|
|
import (
|
|
"bd2server/internal/server/design/gamedata"
|
|
"bd2server/internal/server/domain/command"
|
|
"slices"
|
|
)
|
|
|
|
func (s *Service) attachPackDetailDesign(source *gamedata.Source) {
|
|
s.packDetailDesign = func(packID int) (gamedata.PackDetailDesign, error) {
|
|
return source.PackDetail(packID)
|
|
}
|
|
}
|
|
|
|
func (s *Service) packRewardCounts(ctx command.Context, packID int) (once, regen, research uint64, err error) {
|
|
pack, err := s.packDetailDesign(packID)
|
|
if err != nil {
|
|
return 0, 0, 0, err
|
|
}
|
|
ids, err := s.openedFieldObjects(ctx, packID)
|
|
if err != nil {
|
|
return 0, 0, 0, err
|
|
}
|
|
mapIDs := pack.MapIDs
|
|
for _, id := range ids {
|
|
object := s.fieldObjects[packID].Objects[id]
|
|
if !slices.Contains(mapIDs, object.MapID) {
|
|
continue
|
|
}
|
|
if matchesFieldCount(object, 2) {
|
|
once++
|
|
}
|
|
if matchesFieldCount(object, 3) {
|
|
regen++
|
|
}
|
|
}
|
|
ids, err = s.state.ResearchObjects(ctx, packID)
|
|
if err != nil || len(ids) == 0 {
|
|
return once, regen, 0, err
|
|
}
|
|
design, err := s.researchDesign(packID)
|
|
if err != nil {
|
|
return 0, 0, 0, err
|
|
}
|
|
for _, id := range ids {
|
|
object, found := design.Objects[id]
|
|
if !found || object.Reward.Type == 0 && object.CollectionID == 0 {
|
|
continue
|
|
}
|
|
seen := map[int]bool{}
|
|
for _, mapID := range object.Maps {
|
|
if !seen[mapID] && slices.Contains(mapIDs, mapID) {
|
|
research++
|
|
seen[mapID] = true
|
|
}
|
|
}
|
|
}
|
|
return once, regen, research, nil
|
|
}
|