2025-12-01 23:31:48 +08:00
|
|
|
|
package service
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"blazing/cool"
|
|
|
|
|
|
"blazing/modules/blazing/model"
|
2025-12-08 19:16:37 +08:00
|
|
|
|
"context"
|
|
|
|
|
|
"fmt"
|
|
|
|
|
|
"strings"
|
2025-12-02 03:59:28 +08:00
|
|
|
|
|
2025-12-05 00:24:02 +08:00
|
|
|
|
"github.com/alpacahq/alpacadecimal"
|
2025-12-02 03:59:28 +08:00
|
|
|
|
"github.com/gogf/gf/v2/frame/g"
|
2025-12-08 19:16:37 +08:00
|
|
|
|
"github.com/gogf/gf/v2/os/gcache"
|
2025-12-02 03:59:28 +08:00
|
|
|
|
"github.com/gogf/gf/v2/util/grand"
|
2025-12-01 23:31:48 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// PetFusionService 宠物融合配方主表Service(对应pet_fusion表)
|
|
|
|
|
|
type PetFusionService struct {
|
|
|
|
|
|
*cool.Service // 嵌入通用Service(继承基础CRUD方法)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-08 19:50:54 +08:00
|
|
|
|
var PetFusionServiceS = NewPetFusionService()
|
|
|
|
|
|
|
2025-12-01 23:31:48 +08:00
|
|
|
|
// NewPetFusionService 创建PetFusionService实例
|
|
|
|
|
|
func NewPetFusionService() *PetFusionService {
|
|
|
|
|
|
return &PetFusionService{
|
|
|
|
|
|
&cool.Service{
|
2025-12-04 00:26:49 +08:00
|
|
|
|
Model: model.NewPetFusion(), // 绑定PetFusion模型
|
2025-12-08 19:31:59 +08:00
|
|
|
|
Cache: gcache.New(),
|
2025-12-04 00:26:49 +08:00
|
|
|
|
PageQueryOp: &cool.QueryOp{FieldEQ: []string{"is_enable", "main_pet_id", "sub_pet_id", "result_pet_id"}},
|
2025-12-01 23:31:48 +08:00
|
|
|
|
},
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-12-02 03:59:28 +08:00
|
|
|
|
|
|
|
|
|
|
//获取主副精灵融合的id,如果不存在,那就给一个保底的id
|
|
|
|
|
|
|
2025-12-04 02:32:31 +08:00
|
|
|
|
func (s *PetFusionService) Data(p1, p2, rand uint32) uint32 {
|
2025-12-05 00:24:02 +08:00
|
|
|
|
rand = uint32(alpacadecimal.NewFromInt(int64(rand)).Mul(alpacadecimal.NewFromFloat(0.5)).IntPart())
|
2025-12-02 03:59:28 +08:00
|
|
|
|
|
2025-12-08 19:16:37 +08:00
|
|
|
|
pet := s.getData(p1, p2)
|
2025-12-02 03:59:28 +08:00
|
|
|
|
for _, v := range pet {
|
|
|
|
|
|
|
|
|
|
|
|
rr := grand.Intn(100)
|
2025-12-04 02:32:31 +08:00
|
|
|
|
if rr < int(v.Probability+int32(rand)) {
|
2025-12-02 03:59:28 +08:00
|
|
|
|
return uint32(v.ResultPetID)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-12-02 02:50:20 +00:00
|
|
|
|
//说明是失败,直接返回失败
|
|
|
|
|
|
if len(pet) > 0 {
|
|
|
|
|
|
return 0
|
|
|
|
|
|
}
|
2025-12-08 19:16:37 +08:00
|
|
|
|
pets := s.def()
|
2025-12-02 02:50:20 +00:00
|
|
|
|
res := pets[grand.Intn(len(pets)-1)]
|
|
|
|
|
|
rr := grand.Intn(100)
|
2025-12-04 02:32:31 +08:00
|
|
|
|
if rr < int(res.Probability+int32(rand)) {
|
2025-12-02 02:50:20 +00:00
|
|
|
|
return uint32(res.ResultPetID)
|
|
|
|
|
|
}
|
2025-12-08 19:16:37 +08:00
|
|
|
|
//到这里相当于直接失败
|
2025-12-02 02:50:20 +00:00
|
|
|
|
return 0
|
2025-12-02 03:59:28 +08:00
|
|
|
|
|
|
|
|
|
|
}
|
2025-12-08 19:16:37 +08:00
|
|
|
|
func (s *PetFusionService) getData(p1, p2 uint32) []model.PetFusion {
|
|
|
|
|
|
cacheKey := strings.Join([]string{fmt.Sprintf("%d", p1), fmt.Sprintf("%d", p2)}, ":")
|
|
|
|
|
|
//println(cacheKey, "获取融合id")
|
2025-12-08 19:31:59 +08:00
|
|
|
|
ret, _ := s.Cache.GetOrSetFuncLock(context.Background(), cacheKey, func(context.Context) (interface{}, error) {
|
2025-12-08 19:16:37 +08:00
|
|
|
|
m := cool.DBM(s.Model)
|
|
|
|
|
|
|
|
|
|
|
|
var pet []model.PetFusion //一个特性应该是唯一的,但是我们要获取默认随机特性
|
|
|
|
|
|
condition := g.Map{
|
|
|
|
|
|
"main_pet_id": p1,
|
|
|
|
|
|
"sub_pet_id": p2,
|
|
|
|
|
|
"is_enable": 1,
|
|
|
|
|
|
// "hits between ? and ?" : g.Slice{1, 10},
|
|
|
|
|
|
// "exp > 0" : nil,
|
|
|
|
|
|
// "category" : g.Slice{100, 200},
|
|
|
|
|
|
}
|
|
|
|
|
|
m.Where(condition).Scan(&pet)
|
|
|
|
|
|
return pet, nil
|
|
|
|
|
|
|
|
|
|
|
|
}, 0)
|
|
|
|
|
|
return ret.Interface().([]model.PetFusion)
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
func (s *PetFusionService) def() []model.PetFusion {
|
|
|
|
|
|
|
|
|
|
|
|
//println(cacheKey, "获取融合id")
|
2025-12-08 19:31:59 +08:00
|
|
|
|
ret, _ := s.Cache.GetOrSetFuncLock(context.Background(), "-1", func(context.Context) (interface{}, error) {
|
2025-12-08 19:16:37 +08:00
|
|
|
|
|
|
|
|
|
|
var pets []model.PetFusion
|
|
|
|
|
|
m := cool.DBM(s.Model)
|
|
|
|
|
|
m.Where("is_enable", 1).Where("is_default", 1).Scan(&pets)
|
|
|
|
|
|
|
|
|
|
|
|
return pets, nil
|
|
|
|
|
|
}, 0)
|
|
|
|
|
|
return ret.Interface().([]model.PetFusion)
|
|
|
|
|
|
|
|
|
|
|
|
}
|