pet_home_server/src/server/game/Trigger.go
2025-03-13 12:25:04 +08:00

383 lines
9.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package game
import (
"math"
"server/GoUtil"
"server/MergeConst"
"server/conf"
champshipCfg "server/conf/champship"
mergeDataCfg "server/conf/mergeData"
"server/db"
"server/game/mod/chess"
"server/game/mod/item"
"server/game/mod/order"
"server/msg"
"server/pkg/github.com/name5566/leaf/log"
"sort"
"time"
)
func TriggerShippingOrder(player *Player, req *msg.ReqShippingOrder) {
OrderSn := req.OrderSn
Status := int(req.Status)
if Status == MergeConst.ORDER_STATUS_CANCEL { // 取消支付
CancelOrder(player, OrderSn)
player.PushClientRes(&msg.ResShippingOrder{
Code: msg.RES_CODE_SUCCESS,
Msg: "cancel success",
})
return
}
OrderData := &db.SqlChargeOrderStruct{}
var err error
n := 0
for {
n++
if n > 5 {
break
}
OrderData, err = GoogleVerify(player, OrderSn, req.ProduceId, req.Token)
if err != nil {
log.Debug("GoogleVerify parmas OrderSn%s; ProduceId:%s; Token:%s", OrderSn, req.ProduceId, req.Token)
log.Debug("GoogleVerify err:%v", err)
time.Sleep(1 * time.Second)
continue
}
if OrderData.PayStatus != MergeConst.ORDER_STATUS_PAY {
time.Sleep(1 * time.Second)
continue
}
if OrderData.PayStatus == MergeConst.ORDER_STATUS_PAY {
break
}
}
if OrderData == nil {
return
}
log.Debug("[order verify success] Uid:%d;OrderSn:%s;PayOrder:%s;", player.M_DwUin, OrderData.OrderId, OrderData.PayChannelOrderId)
player.lock.Lock()
defer player.lock.Unlock()
Charge(player, int(OrderData.ProductId))
OrderData.PayStatus = MergeConst.ORDER_STATUS_SHIP
db.UpdatePlayerChargeData(OrderData)
player.PlayMod.save()
orderDataMap := map[string]interface{}{
"AppId": conf.Server.AppID,
"ServerId": conf.Server.ServerID,
"OrderId": OrderData.OrderId,
"PayChannelOrderId": OrderData.PayChannelOrderId,
"ProductId": OrderData.ProductId,
"CreateTime": OrderData.CreateTime,
"PayTime": OrderData.PayTime,
"Price": OrderData.Price,
"PayType": OrderData.PayType,
}
player.Kafka("pay", orderDataMap)
player.SendClientRes()
}
func TriggerComfortOrder(p *Player) {
BaseMod := p.PlayMod.getBaseMod()
Now := GoUtil.Now()
Lv := BaseMod.GetLevel()
if Now-BaseMod.GetLogoutTime() < 7*86400 || Lv < 6 {
return
}
OrderMod := p.PlayMod.getOrderMod()
ChessMod := p.PlayMod.getChessMod()
ChessList := ChessMod.GetUnlockChessList()
TriggerType := 1
for _, Order := range OrderMod.GetOrderList() {
if GoUtil.IsContain(ChessList, Order.MergeId) {
continue
}
if Order.Diff == order.DIFF_LOW {
return
}
if Order.Diff == order.DIFF_MID {
TriggerType = 2
}
}
EmitList := ChessMod.GetEmitList()
EnergyMul := BaseMod.GetEnergyMul()
if TriggerType == 1 {
OrderMod.CreateComfortOrder(Lv, EmitList, EnergyMul, order.DIFF_LOW, 2)
OrderMod.CreateComfortOrder(Lv, EmitList, EnergyMul, order.DIFF_LOW, 3)
OrderMod.CreateComfortOrder(Lv, EmitList, EnergyMul, order.DIFF_MID, 2)
} else {
OrderMod.CreateComfortOrder(Lv, EmitList, EnergyMul, order.DIFF_LOW, 2)
OrderMod.CreateComfortOrder(Lv, EmitList, EnergyMul, order.DIFF_LOW, 3)
}
}
func TriggerSeed(player *Player) {
ChampshipMod := player.PlayMod.getChampshipMod()
Items, Score := champshipCfg.GetRewardItems(ChampshipMod.Reward + 1)
if Score < 50 {
return
}
b := false
for _, v := range Items {
if v.Id == item.ITEM_ENERGY_ID {
b = true
break
}
}
BaseMod := player.PlayMod.getBaseMod()
if !b {
BaseMod.SetSeed(false)
} else {
BaseMod.SetSeed(true)
}
}
func TriggerSeedSource(player *Player) {
BaseMod := player.PlayMod.getBaseMod()
if !BaseMod.GetSeed() {
return
}
Total := 0
Energy := BaseMod.GetEnergy()
Total += Energy
ChessMod := player.PlayMod.getChessMod()
ChessList := ChessMod.GetUnlockChessList()
ChessBuff := ChessMod.GetChessBuf()
AllChess := append(ChessList, ChessBuff...)
for _, v := range AllChess {
ChessColor := mergeDataCfg.GetColorById(v)
if ChessColor == "Energy" {
Total += mergeDataCfg.GetSellNumById(v)
}
if v == chess.CHESS_ENERGY_CHEST {
Total += 50
}
if v == chess.CHESS_SURPRISE_CHEST_LOCK || v == chess.CHESS_SURPRISE_CHEST {
Total += 10
}
if v == chess.CHESS_SOURCE_CHEST {
Total += 100
}
if v == chess.CHESS_HIGH_SOURCE_CHEST {
Total += 250
}
}
Total += (5 - BaseMod.EnergyAD) * 25
BaseMod.SetSource(Total)
}
func TriggerSeedOrder(player *Player) *order.Order {
OrderMod := player.PlayMod.getOrderMod()
ChessMod := player.PlayMod.getChessMod()
BaseMod := player.PlayMod.getBaseMod()
if !BaseMod.GetSeed() {
return nil
}
OrderMod.CreatOrderPool(BaseMod.Level, ChessMod.GetOrderEmit(), BaseMod.EnergyMul)
ChampshipMod := player.PlayMod.getChampshipMod()
NeedScore := champshipCfg.GetRewardTotalScore(ChampshipMod.Reward + 1)
E := BaseMod.GetSource()
ChessList := ChessMod.GetUnlockChessList()
ChessBuff := ChessMod.GetChessBuf()
AllChess := append(ChessList, ChessBuff...)
NewOrder := &order.Order{}
MaxQ := 0
MinQ := 0
// 计算Q值
for _, Order := range OrderMod.OrderPool {
Q := 0
for _, v := range Order.MergeId {
Color := mergeDataCfg.GetColorById(v)
Lv := mergeDataCfg.GetLvById(v)
Q1 := int(math.Pow(2, float64(Lv))) - 1
Q2 := 0
Q3 := 0
for _, Chess := range AllChess {
Lv1 := mergeDataCfg.GetLvById(Chess)
Color1 := mergeDataCfg.GetColorById(Chess)
Type := mergeDataCfg.GetTypeById(Chess)
if Type != "Product" {
continue
}
if Color != Color1 {
continue
}
if Lv1 > Lv {
continue
}
Q2 += int(math.Pow(2, float64(Lv1))) - 1
}
for _, Chess := range AllChess {
if Chess == chess.CHESS_ZIXUAN_CHEST {
if Lv < 3 {
continue
}
Q3 += int(math.Pow(2, 3)) - 1
}
if Chess == chess.CHESS_HIGH_ZIXUAN_CHEST {
if Lv < 7 {
continue
}
Q3 += int(math.Pow(2, 7)) - 1
}
if Chess == chess.CHESS_SOURCE_CHEST {
if Lv < 3 {
continue
}
Q3 += int(math.Pow(2, 3)) - 1
Q3 += int(math.Pow(2, 4)) - 1
}
if Chess == chess.CHESS_HIGH_SOURCE_CHEST {
if Lv < 7 {
continue
}
Q3 += int(math.Pow(2, 7)) - 1
Q3 += int(math.Pow(2, 7)) - 1
}
}
Q += max(Q1-Q2-Q3, 0)
Order.Q = Q
MaxQ = max(MaxQ, Q)
MinQ = min(MinQ, Q)
}
}
if E > MaxQ {
return nil
}
if E == MaxQ {
for _, Order := range OrderMod.OrderPool {
if Order.Q == MaxQ {
NewOrder = Order
break
}
}
EmitTypeList := []string{}
for _, v := range NewOrder.MergeId {
Color := mergeDataCfg.GetColorById(v)
EmitType := mergeDataCfg.GetEmitTypeByColor(Color)
EmitTypeList = append(EmitTypeList, EmitType)
}
ChessList := []int{}
for _, v := range AllChess {
Color := mergeDataCfg.GetColorById(v)
EmitType := mergeDataCfg.GetEmitTypeByColor(Color)
Lv := mergeDataCfg.GetLvById(v)
if Lv < 3 || Lv > 4 {
continue
}
if GoUtil.InStringArray(EmitType, EmitTypeList) {
continue
}
ChessList = append(ChessList, v)
}
if len(ChessList) != 0 {
RandChess := GoUtil.RandSlice(ChessList)
Color := mergeDataCfg.GetColorById(RandChess)
Lv := mergeDataCfg.GetLvById(RandChess)
NewChess := mergeDataCfg.GetChessIdByLvAndColor(Lv, Color)
NewOrder.MergeId = append(NewOrder.MergeId, NewChess)
}
return NewOrder
}
if E == MinQ {
for _, Order := range OrderMod.OrderPool {
if Order.Q == MinQ {
return Order
}
}
}
if E < MinQ {
for _, Order := range OrderMod.OrderPool {
if Order.Q == MinQ {
ChessList := []int{}
for _, v := range AllChess {
Lv := mergeDataCfg.GetLvById(v)
if Lv < 5 {
ChessList = append(ChessList, v)
}
}
if len(ChessList) != 0 {
NewChess := GoUtil.RandSlice(ChessList)
Order.MergeId = append(Order.MergeId, NewChess)
}
return Order
}
}
}
if E > MinQ && E < MaxQ {
L1 := []*order.Order{}
for _, Order := range OrderMod.OrderPool {
if Order.Q > E {
L1 = append(L1, Order)
}
}
Smax := 0
Smin := 0
for _, Order := range L1 {
Score := 0
for _, v := range Order.MergeId {
Lv := mergeDataCfg.GetLvById(v)
Score += champshipCfg.GetChessScore(Lv)
}
Smax = max(Score, Smax)
Smin = min(Score, Smin)
Order.S = Score
}
if NeedScore > Smax {
for _, Order := range OrderMod.OrderPool {
if Order.Q == MinQ {
ChessList := []int{}
for _, v := range AllChess {
Lv := mergeDataCfg.GetLvById(v)
if Lv < 5 {
ChessList = append(ChessList, v)
}
}
if len(ChessList) != 0 {
NewChess := GoUtil.RandSlice(ChessList)
Order.MergeId = append(Order.MergeId, NewChess)
}
return Order
}
}
}
if NeedScore == Smax {
for _, Order := range L1 {
if Order.S == Smax {
return Order
}
}
}
if NeedScore == Smin {
for _, Order := range L1 {
if Order.S == Smin {
return Order
}
}
}
L2 := []*order.Order{}
for _, Order := range L1 {
if Order.S > NeedScore {
L2 = append(L2, Order)
}
}
if len(L2) != 0 {
sort.Slice(L2, func(i, j int) bool {
return L2[i].Q < L2[j].Q
})
return L2[0]
}
}
return NewOrder
}