diff --git a/common/utils/test_test.go b/common/utils/test_test.go index ebec41a2..4d4b23e1 100644 --- a/common/utils/test_test.go +++ b/common/utils/test_test.go @@ -9,63 +9,8 @@ import ( "github.com/apcera/termtables" "github.com/gogf/gf/v2/os/glog" - "github.com/pointernil/bitset32" ) -func TestThree(t *testing.T) { - fmt.Printf("! \n") - var b bitset32.BitSet32 - var a bitset32.BitSet32 - // play some Go Fish - // for i := 0; i < 100; i++ { - // card1 := uint(rand.Intn(52)) - // card2 := uint(rand.Intn(52)) - // b.Set(card1) - // if b.Test(card2) { - // fmt.Println("Go Fish!") - // } - // b.Clear(card1) - // } - - // Chaining - b.Set(10).Set(11) - a = *bitset32.New(50) - for i, e := b.NextSet(0); e; i, e = b.NextSet(i + 1) { - fmt.Println("The b bit is set:", i) - } - a.Set(10).Set(9) - f := b.Union(&a) - for i, e := f.NextSet(0); e; i, e = f.NextSet(i + 1) { - fmt.Println("The b+ bit is set:", i) - } - fmt.Println(b.Bytes()) -} -func TestMap(t *testing.T) { - // 使用 SyncMap 存储字符串 -> int 类型的键值对 - sm1 := &SyncMap[string, int]{} - sm1.Store("apple", 5) - sm1.Store("banana", 10) - - // 加载并打印值 - if value, ok := sm1.Load("apple"); ok { - fmt.Println("apple:", value) - } - if value, ok := sm1.Load("banana"); ok { - fmt.Println("banana:", value) - } - - // 使用 SyncMap 存储 int -> string 类型的键值对 - sm2 := &SyncMap[int, string]{} - sm2.Store(1, "one") - sm2.Store(2, "two") - - // 遍历所有键值对 - sm2.Range(func(key int, value string) bool { - fmt.Printf("%d: %s\n", key, value) - return true - }) -} - func TestInit(t *testing.T) { table := termtables.CreateTable() diff --git a/logic/controller/task.go b/logic/controller/task.go index bf3c18ee..db2e0286 100644 --- a/logic/controller/task.go +++ b/logic/controller/task.go @@ -72,11 +72,7 @@ func (h Controller) Complete_Task(data *task.CompleteTaskInboundInfo, c *player. result.ItemList = append(result.ItemList, task.ItemInfo{ItemId: 500001, ItemCount: 1}) result.ItemList = append(result.ItemList, task.ItemInfo{ItemId: 500502, ItemCount: 1}) result.ItemList = append(result.ItemList, task.ItemInfo{ItemId: 500503, ItemCount: 1}) - // service.NewUserService(c.Info.UserID).ItemExec(func(tt []model.ItemE) []model.ItemE { - - // return tt - - // }) + } if data.TaskId == 86 { //新手注册任务 var petid int diff --git a/logic/service/player/pet.go b/logic/service/player/pet.go index 348c99d6..669f1734 100644 --- a/logic/service/player/pet.go +++ b/logic/service/player/pet.go @@ -6,59 +6,64 @@ import ( "math" ) -// calculateExperience 根据公式计算指定等级所需的经验值 -func calculateExperience(level uint32) uint32 { - var x float64 - // 判断等级奇偶性确定x的值 - if level%2 == 1 { // 奇数 - x = 0.5 - } else { // 偶数 - x = -0.5 - } +// calculateExperience 计算指定等级和种族值所需的经验值 +// level: 当前等级 +// baseValue: 种族值 +func calculateExperience(level uint32, baseValue uint32) uint32 { + // 计算 A 部分:向上取整(3.75 * a * (a + 1)) + partA := math.Ceil(3.75 * float64(level) * float64(level+1)) - // 应用公式计算 - lvFloat := float64(level) - experience := 3.75*lvFloat*lvFloat + 3.75*lvFloat + 1 + x + // 计算 B 部分:向上取整(b * log(1 + a / 100)) + // 这里使用自然对数 math.Log,如果想换底数可以用换底公式 + partB := math.Log(1.0 + float64(level)/100.0) + partB = float64(baseValue) * partB + partB = math.Ceil(partB) - // 四舍五入为整数 - return uint32(math.Round(experience)) + // 总经验是两部分之和,并向上取整 + totalExp := math.Ceil(partA + partB) + return uint32(totalExp) } // 主函数实现 // 添加经验 // 超NO 加成 func (p *Player) AddPetExp(pet *model.PetInfo, addExp uint32) { + originalLevel := pet.Level for { - needExp := calculateExperience(pet.Level) + basic := xmlres.PetMAP[int(pet.ID)] + ba := basic.Atk + + basic.Def + + basic.SpAtk + + basic.SpDef + + basic.Spd + + uint32(basic.HP) + needExp := calculateExperience(pet.Level, ba) if addExp >= needExp { addExp -= needExp pet.Level++ + + // 检查是否可以进化 + if basic.EvolvesTo != 0 || // 有明确的进化 + basic.EvolvingLv >= int(pet.Level) || // 有明确的进化等级 + basic.IsLarge == 0 { // 非最终形态 + + pet.ID = uint32(basic.EvolvesTo) + + } + } else { + pet.NextLvExp = calculateExperience(pet.Level, ba) break } + } pet.Exp = addExp - pet.NextLvExp = calculateExperience(pet.Level) + pet.LvExp = pet.NextLvExp - pet.Exp // 处理进化逻辑 - for { - - basic := xmlres.PetMAP[int(pet.ID)] - // 检查是否可以进化 - if basic.EvolvesTo == 0 || - basic.EvolvingLv == 0 || - basic.EvolvingLv >= int(pet.Level) || - basic.IsLarge != 0 { - break - } - - // 获取进化后的资产 - - pet.ID = uint32(basic.EvolvesTo) - } // 重新计算面板 if originalLevel != pet.Level {