七日签到奖励优化

This commit is contained in:
hahwu 2026-03-17 14:57:20 +08:00
parent 630064912a
commit b1b22e06d8
7 changed files with 86 additions and 37 deletions

View File

@ -29,11 +29,11 @@ func GetSevenLoginReward() []*gamedata.SevenLoginRewardData {
var result []*gamedata.SevenLoginRewardData
for k, v := range data {
Id, _ := strconv.Atoi(k)
Diamond := gamedata.GetIntValue(v, "Diamond")
Energy := gamedata.GetFloatValue(v, "Energy")
RewardNum := gamedata.GetIntValue(v, "RewardNum")
result = append(result, &gamedata.SevenLoginRewardData{
Id: Id,
Diamond: Diamond,
Energy: Energy,
RewardNum: RewardNum,
})
}
@ -53,11 +53,11 @@ func GetSevenLoginMonthReward(nowMonth int) []*gamedata.SevenLoginRewardData {
continue
}
Id, _ := strconv.Atoi(k)
Diamond := gamedata.GetIntValue(v, "Diamond")
Energy := gamedata.GetFloatValue(v, "Energy")
RewardNum := gamedata.GetIntValue(v, "RewardNum")
result = append(result, &gamedata.SevenLoginRewardData{
Id: Id,
Diamond: Diamond,
Energy: Energy,
RewardNum: RewardNum,
})
}
@ -73,7 +73,7 @@ func GetSevenLoginJackpot(IsMonth int) []*gamedata.SevenLoginJackpotData {
var result []*gamedata.SevenLoginJackpotData
for k, v := range data {
Id, _ := strconv.Atoi(k)
Diamond := gamedata.GetIntValue(v, "Diamond")
Energy := gamedata.GetFloatValue(v, "Energy")
Type := gamedata.GetIntValue(v, "Type")
Month := gamedata.GetIntValue(v, "Month")
if IsMonth != Month && IsMonth != 0 {
@ -82,11 +82,11 @@ func GetSevenLoginJackpot(IsMonth int) []*gamedata.SevenLoginJackpotData {
ItemMap := gamedata.GetValue(v, "Item")
Items := item.ParseItem(ItemMap)
result = append(result, &gamedata.SevenLoginJackpotData{
Id: Id,
Diamond: Diamond,
Items: Items,
Type: Type,
Month: Month,
Id: Id,
Energy: Energy,
Items: Items,
Type: Type,
Month: Month,
})
}
return result

View File

@ -645,7 +645,7 @@ func ReqGmCommand_(player *Player, Command string) error {
SevenMod := player.PlayMod.getSevenLoginMod()
SevenMod.MonthResetTime = 0
PlayerBaseMod := player.GetPlayerBaseMod()
SevenMod.ZeroUpdate(PlayerBaseMod.GetSevenLoginAdd(), PlayerBaseMod.GetLastLoginTime())
SevenMod.ZeroUpdate(PlayerBaseMod.GetSevenLoginAdd(), PlayerBaseMod.GetLastLoginTime(), player.GetOrderFactor())
case "debugLogoutMsg":
ToUid, _ := strconv.Atoi(arg[1])
uidList, err := db.GetDebugPlayer(ToUid)

View File

@ -2,6 +2,7 @@ package sevenLogin
import (
"fmt"
"math"
sevenLoginCfg "server/conf/seven_login"
"server/game/mod/item"
GoUtil "server/game_util"
@ -30,19 +31,21 @@ func (s *SevenLoginMod) InitData() {
}
func (s *SevenLoginMod) ZeroUpdate(Add, LastLoginTime int) {
func (s *SevenLoginMod) ZeroUpdate(Add, LastLoginTime, factor int) {
WeekZeroTimestamp := GoUtil.WeekZeroTimestamp()
Now := GoUtil.Now()
if WeekZeroTimestamp > s.WeekResetTime {
RewardType := GoUtil.IfTrue(Now-int64(LastLoginTime) > GoUtil.SEVENDAYS && LastLoginTime > 0, BACK_REWARD, DEFAULT_REWARD).(int)
s.IsBack = RewardType == BACK_REWARD
s.LoginReward = randWeekReward(Add, RewardType)
s.LoginReward = formatSevenReward(s.LoginReward, factor)
s.WeekResetTime = WeekZeroTimestamp
s.DayR = 0
}
monthZeroTimestamp := GoUtil.MonthZeroTimestamp()
if monthZeroTimestamp > s.MonthResetTime {
s.MonthReward = randMonthReward()
s.MonthReward = formatSevenReward(s.MonthReward, factor)
s.Active = 0
s.MonthResetTime = monthZeroTimestamp
}
@ -124,3 +127,28 @@ func (s *SevenLoginMod) BackData() *msg.ResSevenLogin {
IsBack: s.IsBack,
}
}
func formatSevenReward(reward map[int]Reward, factor int) map[int]Reward {
for k, v := range reward {
for _, v := range v.Item1 {
if v.Id == item.ITEM_STAR_ID {
Num := math.Round(float64(v.Num) * float64(factor) / 100)
v.Num = int(Num) / 5 * 5
}
}
for _, v := range v.Item2 {
if v.Id == item.ITEM_STAR_ID {
Num := math.Round(float64(v.Num) * float64(factor) / 100)
v.Num = int(Num) / 5 * 5
}
}
for _, v := range v.Item3 {
if v.Id == item.ITEM_STAR_ID {
Num := math.Round(float64(v.Num) * float64(factor) / 100)
v.Num = int(Num) / 5 * 5
}
}
reward[k] = v
}
return reward
}

View File

@ -1,6 +1,7 @@
package sevenLogin
import (
"math"
"math/rand/v2"
sevenLoginCfg "server/conf/seven_login"
"server/game/mod/item"
@ -23,7 +24,7 @@ func randWeekReward(Add, Type int) map[int]Reward {
})
jackpot := sevenLoginCfg.GetSevenLoginJackpot(0)
sort.Slice(jackpot, func(i, j int) bool {
return jackpot[i].Diamond < jackpot[j].Diamond
return jackpot[i].Energy < jackpot[j].Energy
})
RI := make([]int, 0, len(RewardList))
for _, v := range RewardList {
@ -37,7 +38,7 @@ func randWeekReward(Add, Type int) map[int]Reward {
EnergyMul = 2.0
}
for _, v := range RewardList {
v.Diamond = int(float64(v.Diamond) * (1 + float64(Add)/100))
v.Energy = float64(v.Energy) * (1 + float64(Add)/100)
Reward := randReward(v, LastType, jackpot, CardPackIds, 0.5, EnergyMul)
result[v.Id] = Reward
}
@ -46,16 +47,16 @@ func randWeekReward(Add, Type int) map[int]Reward {
func randReward(RewardData *gamedata.SevenLoginRewardData, LastType int, jackpot []*gamedata.SevenLoginJackpotData, CardPackIds []int, EnergyPer, EnergyMul float64) Reward {
// 奖励1 体力 体力等价钻石占总价值的50%且1钻≈2.5体力体力值四舍五入需以0或5结尾
Num := float64(RewardData.Diamond) * EnergyPer * 2.5
Num = float64(int(Num/5+0.5)) * 5
RemainDiamond := RewardData.Diamond - int(Num/2.5)
Num = Num * EnergyMul
Item1 := []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(Num))}
Num := math.Round(float64(RewardData.Energy) * 0.5)
energyNum := float64(int(Num/5)) * 5
RemainEnergy := RewardData.Energy - energyNum
// 召回玩家 每日体力数*2
energyNum = energyNum * EnergyMul
Item1 := []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(energyNum))}
// 奖励2
NewJackpot := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot))
for _, v := range jackpot {
if v.Diamond <= RemainDiamond && v.Type != LastType && v.Type != JACKPOT_CARD_TYPE {
if v.Energy <= RemainEnergy && v.Type != LastType && v.Type != JACKPOT_CARD_TYPE {
NewJackpot = append(NewJackpot, v)
}
}
@ -65,38 +66,46 @@ func randReward(RewardData *gamedata.SevenLoginRewardData, LastType int, jackpot
var Item2 []*item.Item
Item2Type := 0
if RewardData.RewardNum == 3 {
RemainDiamond -= 5
RemainEnergy -= 5
}
if GoUtil.InArray(RewardData.Id, CardPackIds) {
CardJackpot := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot))
for _, v := range jackpot {
if v.Diamond <= RemainDiamond && v.Type == JACKPOT_CARD_TYPE {
if v.Energy <= RemainEnergy && v.Type == JACKPOT_CARD_TYPE {
CardJackpot = append(CardJackpot, v)
}
}
if len(CardJackpot) == 0 {
Item2 = []*item.Item{item.NewItem(item.ITEM_DIAMOND_ID, RemainDiamond)}
Item2 = []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(RemainEnergy))}
} else {
Index := rand.IntN(len(CardJackpot))
Item2Type = CardJackpot[Index].Type
Item2 = CardJackpot[Index].Items
RemainDiamond -= CardJackpot[Index].Diamond
RemainEnergy -= CardJackpot[Index].Energy
}
} else {
Index := rand.IntN(len(NewJackpot))
Item2Type = NewJackpot[Index].Type
Item2 = NewJackpot[Index].Items
RemainDiamond -= NewJackpot[Index].Diamond
RemainEnergy -= NewJackpot[Index].Energy
}
var Item3 []*item.Item
if RewardData.RewardNum == 3 {
RemainDiamond += 5
RemainEnergy += 5
NewJackpot3 := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot))
for _, v := range jackpot {
if v.Diamond <= RemainDiamond && v.Type != LastType && v.Type != Item2Type {
if v.Energy <= RemainEnergy && v.Type != LastType && v.Type != Item2Type {
NewJackpot3 = append(NewJackpot3, v)
}
}
if len(NewJackpot3) == 0 {
Item3 = []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(RemainEnergy))}
return Reward{
Item1: Item1,
Item2: Item2,
Item3: Item3,
}
}
Index := rand.IntN(len(NewJackpot3))
Item3 = NewJackpot3[Index].Items
}
@ -116,7 +125,7 @@ func randMonthReward() map[int]Reward {
})
jackpot := sevenLoginCfg.GetSevenLoginJackpot(1)
sort.Slice(jackpot, func(i, j int) bool {
return jackpot[i].Diamond < jackpot[j].Diamond
return jackpot[i].Energy < jackpot[j].Energy
})
result := make(map[int]Reward)
for _, v := range RewardList {

View File

@ -16,6 +16,7 @@ import (
limitedTimeEventCfg "server/conf/limited_time_event"
mergeDataCfg "server/conf/merge_data"
miningCfg "server/conf/mining"
orderCfg "server/conf/order"
playroomCfg "server/conf/playroom"
"server/db"
"server/ga"
@ -368,7 +369,7 @@ func (p *Player) ZeroUpdate(a []interface{}) {
p.PushClientRes(p.PlayMod.getBaseMod().BackData())
// 七日签到
p.PlayMod.getSevenLoginMod().ZeroUpdate(PlayerBaseMod.GetSevenLoginAdd(), PlayerBaseMod.GetLastLoginTime())
p.PlayMod.getSevenLoginMod().ZeroUpdate(PlayerBaseMod.GetSevenLoginAdd(), PlayerBaseMod.GetLastLoginTime(), p.GetOrderFactor())
p.PushClientRes(p.PlayMod.getSevenLoginMod().BackData())
// 礼包充值
@ -1418,3 +1419,7 @@ func (p *Player) FixPlayroomPyhical() {
}
}
}
func (p *Player) GetOrderFactor() int {
return orderCfg.GetOrderFactor(p.GetDecorateMod().AreaId)
}

View File

@ -31,16 +31,16 @@ type StartOrderData struct {
type SevenLoginRewardData struct {
Id int
Diamond int
Energy float64
RewardNum int
}
type SevenLoginJackpotData struct {
Id int
Diamond int
Items []*item.Item
Type int
Month int
Id int
Energy float64
Items []*item.Item
Type int
Month int
}
type ActivityData struct {

View File

@ -1,6 +1,7 @@
package test
import (
"fmt"
sevenLoginCfg "server/conf/seven_login"
"server/game"
GoUtil "server/game_util"
@ -17,7 +18,13 @@ func TestSevenLoginZeroUpdate(t *testing.T) {
p1 := new(game.Player)
p1.InitPlayer("3625212")
SevenLoginMod := p1.GetSevenLoginMod()
SevenLoginMod.ZeroUpdate(0, 0)
SevenLoginMod.WeekResetTime = 0
SevenLoginMod.ZeroUpdate(0, 0, p1.GetOrderFactor())
SevenLoginMod.BackData()
fmt.Printf("order factor:%v\n", p1.GetOrderFactor())
for _, v := range SevenLoginMod.LoginReward {
t.Logf("Reward:%v", v)
fmt.Printf("Reward:%v\n", v)
}
t.Logf("SevenLoginMod:%v", SevenLoginMod)
}