feat(pet): 实现精灵融合功能并优化相关数据结构 - 新增精灵融合主服务和材料服务,支持根据主副精灵ID查询融合结果 - 调整融合接口参数结构,将物品字段统一为数组形式 - 修改融合材料模型字段类型,提升数据一致性 - 重构融合配置相关逻辑,移除旧融合配置模型及服务 - 增加特性随机选择逻辑,确保融合产物具备有效特性 - 添加材料合法性校验,防止非法材料参与融合 ```
85 lines
2.4 KiB
Go
85 lines
2.4 KiB
Go
package service
|
||
|
||
import (
|
||
"blazing/common/utils"
|
||
"blazing/cool"
|
||
"blazing/modules/blazing/model"
|
||
dictmodel "blazing/modules/dict/model"
|
||
"blazing/modules/dict/service"
|
||
|
||
"github.com/gogf/gf/v2/frame/g"
|
||
"github.com/gogf/gf/v2/util/gconv"
|
||
"github.com/gogf/gf/v2/util/grand"
|
||
)
|
||
|
||
// PetFusionMaterialService 宠物融合材料子表Service(对应pet_fusion_material表)
|
||
type PetFusionMaterialService struct {
|
||
*cool.Service // 嵌入通用Service(继承基础CRUD方法)
|
||
}
|
||
|
||
// NewPetFusionMaterialService 创建PetFusionMaterialService实例
|
||
func NewPetFusionMaterialService() *PetFusionMaterialService {
|
||
return &PetFusionMaterialService{
|
||
&cool.Service{
|
||
Model: model.NewPetFusionMaterial(), // 绑定PetFusionMaterial模型(默认参数占位)
|
||
},
|
||
}
|
||
}
|
||
|
||
// 获取融合材料的特性,返回两个值,一个是指定的特性,另一个是如果配方没找到的情况下,默认的配置
|
||
func (s *PetFusionMaterialService) Data(Material1 [4]uint32) uint32 {
|
||
|
||
fusion, _ := service.NewDictInfoService().DataOne("fusion")
|
||
|
||
fusions := utils.ToMap(fusion, func(t dictmodel.DictInfo) uint32 {
|
||
|
||
return gconv.Uint32(t.Remark)
|
||
})
|
||
for _, v := range Material1 {
|
||
_, ok := fusions[v]
|
||
if !ok {
|
||
//todo使用了非法材料
|
||
return 0
|
||
}
|
||
|
||
}
|
||
m := cool.DBM(s.Model)
|
||
|
||
var effect model.PetFusionMaterial //一个特性应该是唯一的,但是我们要获取默认随机特性
|
||
condition := g.Map{
|
||
"material1": fusions[Material1[0]].ID,
|
||
"material2": fusions[Material1[1]].ID,
|
||
"material3": fusions[Material1[2]].ID,
|
||
"material4": fusions[Material1[3]].ID,
|
||
"is_enable": 1,
|
||
}
|
||
m.Where(condition).Scan(&effect)
|
||
//这时候有可能效果是空的,那么这时候就再次查询默认的特性,保证每次必会生成一个数据库有的特性
|
||
//也许这个时候的特性配方就是随机从数据库中查找一个特性
|
||
|
||
effect2, _ := service.NewDictInfoService().DataOne("effect")
|
||
effect2s := utils.ToMap(effect2, func(t dictmodel.DictInfo) uint32 {
|
||
|
||
return gconv.Uint32(t.ID)
|
||
})
|
||
|
||
if effect.Trait1Idx != 0 {
|
||
r := grand.Intn(3)
|
||
switch r {
|
||
case 0:
|
||
return gconv.Uint32(effect2s[effect.Trait1Idx].Remark)
|
||
case 1:
|
||
return gconv.Uint32(effect2s[effect.Trait2Idx].Remark)
|
||
case 2:
|
||
return gconv.Uint32(effect2s[effect.Trait3Idx].Remark)
|
||
case 3:
|
||
return gconv.Uint32(effect2s[effect.Trait4Idx].Remark)
|
||
}
|
||
|
||
}
|
||
|
||
r := grand.Intn(len(effect2) - 1)
|
||
return gconv.Uint32(effect2[r].Remark)
|
||
|
||
}
|