订单逻辑修改

This commit is contained in:
hahwu 2025-09-01 16:11:19 +08:00
parent 3759505847
commit 9fec847b36
12 changed files with 173 additions and 87 deletions

View File

@ -11,6 +11,8 @@ const (
CFG_ORDER_CHESS_DATA = "OrderChessData"
CFG_ORDER_NUM_DATA = "OrderNumData"
CFG_START_ORDER = "StartOrder"
CFG_CONST = "OrderConst"
CFG_ORDER_SCENE = "OrderScene"
)
func init() {
@ -18,6 +20,24 @@ func init() {
gamedata.InitCfg(CFG_ORDER_CHESS_DATA)
gamedata.InitCfg(CFG_ORDER_NUM_DATA)
gamedata.InitCfg(CFG_START_ORDER)
gamedata.InitCfg(CFG_CONST)
gamedata.InitCfg(CFG_ORDER_SCENE)
}
func GetOrderFactor(Scene int) int {
data, err := gamedata.GetDataByIntKey(CFG_ORDER_SCENE, Scene)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Factor")
}
func GetEmitExtraOrder() string {
data, err := gamedata.GetDataByKey(CFG_CONST, "EmitId_Extra_Order")
if err != nil {
return ""
}
return gamedata.GetStringValue(data, "Value")
}
func GetLvMin(EnergyMul int) int {

View File

@ -17,6 +17,8 @@ func Charge(p *Player, ChargeId int) {
PiggyBankFire(p, ChargeId) // 猪猪银行
PlayroomFire(p, ChargeId) // 游乐场
ActivityFire(p, ChargeId) // 活动礼包
OrderMod := p.PlayMod.getOrderMod()
OrderMod.SetIsCharge() // 设置订单模块为充值状态
p.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_PURCHASE, A: []interface{}{}})
}

View File

@ -453,7 +453,10 @@ func ReqGmCommand_(player *Player, Command string) error {
BaseMod.Uid = Uid
case "copyUser":
p1 := new(Player)
p1.InitPlayer(arg[1])
err := p1.InitPlayer(arg[1])
if err != nil {
return err
}
BaseMod := p1.PlayMod.getBaseMod()
BaseMod.Uid = player.M_DwUin
BaseMod.NickName = player.PlayMod.getBaseMod().NickName

View File

@ -156,6 +156,7 @@ func (p *PlayerChessData) HandleChess(player *Player, handle_list []*msg.ChessHa
itemList := make([]*item.Item, 0)
AddChessList := make([]int, 0)
AddNewEmit := make([]int, 0)
EmitList := ChessMod.GetEmitList()
for _, v := range handle_list {
ChessId := int(v.ChessId)
EmitId := int(v.Emit)
@ -233,7 +234,6 @@ func (p *PlayerChessData) HandleChess(player *Player, handle_list []*msg.ChessHa
}
}
//扣除体力
EnergyPow := BaseMod.GetEnergyMul()
ReduceEneny := 0
@ -245,7 +245,22 @@ func (p *PlayerChessData) HandleChess(player *Player, handle_list []*msg.ChessHa
if err != nil {
return err
}
NewEmitList := ChessMod.GetEmitList()
EmitProductList := make([]string, 0)
for _, v := range EmitList {
ColorList := mergeDataCfg.GetEmitProduceType(v)
EmitProductList = append(EmitProductList, ColorList...)
}
NewEmitProductList := make([]string, 0)
for _, v := range NewEmitList {
ColorList := mergeDataCfg.GetEmitProduceType(v)
NewEmitProductList = append(NewEmitProductList, ColorList...)
}
OrderMod := player.PlayMod.getOrderMod()
if !GoUtil.SlicesEqualString(EmitProductList, NewEmitProductList) {
// 发射器系列变化,重新洗牌
OrderMod.ResetChessPool()
}
Update := OrderMod.CreateExtraOrder(AddChessList, AddNewEmit, ChessMod.GetUnlockChessList(), EnergyPow)
if Update {
player.PushClientRes(OrderMod.BackData())

View File

@ -10,12 +10,11 @@ import (
"server/conf"
cardCfg "server/conf/card"
chargeCfg "server/conf/charge"
decorateCfg "server/conf/decorate"
limitedTimeEventCfg "server/conf/limitedTimeEvent"
mailCfg "server/conf/mail"
mergeDataCfg "server/conf/mergeData"
orderCfg "server/conf/order"
playroomCfg "server/conf/playroom"
userCfg "server/conf/user"
"server/db"
"server/game/mod/activity"
"server/game/mod/card"
@ -983,30 +982,10 @@ func (player *Player) GetPetOrderItemExp() int {
// 弃用
func (player *Player) FormatOrderReward() {
return
Exp, PExp := userCfg.GetLevUpExp(player.GetPlayerBaseMod().GetLevel())
BaseMod := player.PlayMod.getBaseMod()
DecorateMod := player.PlayMod.getDecorateMod()
ExpCoin := (Exp-BaseMod.GetExp())*decorateCfg.GetAreaPerPExp(DecorateMod.GetAreaId()) - BaseMod.GetStar()
PExpCoin := (PExp-BaseMod.GetPExp())*50 - player.GetPetOrderItemExp()
OrderMod := player.PlayMod.getOrderMod()
if ExpCoin > PExpCoin || BaseMod.GetLevel() < 6 {
for k, v := range OrderMod.GetOrderList() {
if len(v.Items) != 0 {
continue
}
if v.Type != order.Common_type {
continue
}
Star := order.GetOrderStar(v.MergeId)
v.Items = append(v.Items, &item.Item{
Id: item.ITEM_STAR_ID,
Num: Star,
})
OrderMod.OrderList[k] = v
}
return
}
DecorateMod := player.PlayMod.getDecorateMod()
ChessMod := player.PlayMod.getChessMod()
OrderFactor := orderCfg.GetOrderFactor(DecorateMod.GetAreaId())
for k, v := range OrderMod.GetOrderList() {
if len(v.Items) != 0 {
continue
@ -1014,17 +993,40 @@ func (player *Player) FormatOrderReward() {
if v.Type != order.Common_type {
continue
}
Items := make([]*item.Item, 0)
Star := order.GetOrderStar(v.MergeId)
Items = player.GetPetOrderReward(Star, Items)
if len(Items) == 1 && Items[0].Id == item.ITEM_STAR_ID {
v.Type = order.Common_type
} else {
v.Type = order.Pet_type
}
v.Items = Items
Star = int(float64(Star)*float64(OrderFactor)/10) * 10
v.Items = append(v.Items, item.NewItem(item.ITEM_STAR_ID, Star))
OrderMod.OrderList[k] = v
}
// 触发式订单 满足条件生成零件订单
PartCost := DecorateMod.GetPartCost()
PartBag := ChessMod.GetPartBag()
Trigger := true
for _, v := range OrderMod.GetOrderList() {
if v.Type == order.Trigger_type {
Trigger = false
}
}
Trigger2 := false
for k, v := range PartCost {
if v > PartBag[k] {
Trigger2 = true
}
}
if Trigger && Trigger2 {
for k, v := range OrderMod.GetOrderList() {
if v.Type != order.Common_type {
continue
}
if v.Diff == order.DIFF_LOW {
continue
}
v.Items = append(v.Items, item.NewItem(item.ITEM_LAUNCHER_ID, 2))
v.Type = order.Trigger_type
OrderMod.OrderList[k] = v
break
}
}
}
func (player *Player) GetPetOrderReward(Star int, Items []*item.Item) []*item.Item {

View File

@ -154,7 +154,7 @@ func TriggerComfortOrder(p *Player) {
Now := GoUtil.Now()
Lv := BaseMod.GetLevel()
if Now-BaseMod.GetLogoutTime() < 7*86400 || Lv < 6 {
if Now-BaseMod.GetLogoutTime() < 7*86400 || Lv < 17 {
return
}
OrderMod := p.PlayMod.getOrderMod()

View File

@ -49,6 +49,7 @@ func UnitOrder(p *Player) error {
return err
}
}
p.FormatOrderReward()
return nil
}

View File

@ -620,3 +620,11 @@ func (cb *ChessBorad) UpgradeChess(ChessId int) (int, error) {
cb.AddChess(NewChess)
return NewChess, nil
}
func (cb *ChessBorad) GetPartBag() map[int]int {
res := make(map[int]int)
for k, v := range cb.PartBag.List {
res[k] = v.Num
}
return res
}

View File

@ -279,3 +279,13 @@ func (d *Decorate) initPartCost(AreaId int) {
}
}
}
func (d *Decorate) GetPartCost() map[int]int {
res := make(map[int]int)
for _, v := range d.PartCost {
for _, v1 := range v.Items {
res[v1.Id] += v1.Num
}
}
return res
}

View File

@ -21,6 +21,7 @@ const (
ITEM_DIAMOND_ID = 100003
ITEM_FIVE_STAR_CARD_PACK = 100008
ITEM_RACING_BATTERY_ID = 100027
ITEM_LAUNCHER_ID = 1601
)
const (

View File

@ -25,6 +25,7 @@ type OrderMod struct {
ChessPool []int // 棋子池
OrderPool map[int]*Order // 订单池
FinishOrder []int // 已完成订单
IsCharge bool // 是否充值
}
type Order struct {
@ -207,16 +208,8 @@ func (o *OrderMod) TriggerOrder(lv int, Type string, Emit []int, EnergyMul int)
}
}
}
if lv >= 12 {
normalOrder := 0
for _, v := range o.OrderList {
if v.Type == Common_type {
normalOrder++
}
}
for i := normalOrder; i < 3; i++ {
o.CreateNormalOrder(lv, Emit, EnergyMul)
}
if lv >= 17 {
o.CreateOrder(lv, Emit, EnergyMul)
}
return nil
}
@ -258,6 +251,19 @@ func (o *OrderMod) CheckCondition(lv int, condition, Type string, Emit []int, Fi
if !GoUtil.InStringArray(r2[1], Class) {
return false
}
case "EmitMax":
Class := []string{}
for _, v := range Emit {
EmitLv := mergeDataCfg.GetLvById(v)
MaxLv := mergeDataCfg.GetMaxLvById(v)
if EmitLv < MaxLv {
continue
}
Class = append(Class, mergeDataCfg.GetColorById(v))
}
if GoUtil.InStringArray(r2[1], Class) {
return false
}
}
}
return true
@ -486,13 +492,13 @@ func (o *OrderMod) CreateCleanOrder2(ChessList []int) bool {
}
func (o *OrderMod) CreateExtraOrder(AddChess, AddNewEmit, ChessList []int, EnergyMul int) bool {
GetExtraEmitId := mergeDataCfg.GetExtraEmitId()
BeginExtraEmitId := orderCfg.GetEmitExtraOrder() // 从发射器F系列开始
b1 := false
OrderEmit := 0
MaxLvChess := make(map[int]int)
for _, v := range AddNewEmit {
Emit_Id := mergeDataCfg.GetEmitId(v)
_, ok := GetExtraEmitId[Emit_Id]
ok := Emit_Id >= BeginExtraEmitId
_, ok1 := o.EimtOrder[Emit_Id]
ChessColor := mergeDataCfg.GetEmitProduceChessType(v)
if ok && !ok1 && len(ChessColor) > 0 {
@ -589,7 +595,7 @@ func (o *OrderMod) ChangeEnergyMul(lv int, Emit []int, EnergyMul int, ChessList
Lv := mergeDataCfg.GetLvById(vv)
Color := mergeDataCfg.GetColorById(vv)
EmitId := GetEmitByColor(Emit, Color)
_, Max := getChesslvRange(EmitId, EnergyMul)
_, Max := getChesslvRange(EmitId, EnergyMul, o.IsCharge)
Adjust := mergeDataCfg.GetAdjust(EmitId, Color)
if Lv >= EnergyMul+1 && Lv <= Max-Adjust {
continue
@ -661,3 +667,16 @@ func (o *OrderMod) CreateComfortOrder(lv int, Emit []int, EnergyMul, Diff, Chess
o.addOrder(mergeList, Diff, COMFORT_TYPE)
return nil
}
func (o *OrderMod) ResetChessPool() {
o.ChessPool = make([]int, 0)
o.EmitShuffle = nil
}
func (o *OrderMod) SetIsCharge() {
o.IsCharge = true
}
func (o *OrderMod) GetIsCharge() bool {
return o.IsCharge
}

View File

@ -12,9 +12,9 @@ var reflectChess = map[int]int{} // 棋子难度映射表
// 订单棋子数量
func getChessNumRand(OrderN int) map[int]int {
return map[int]int{
1: int(15 - 3*OrderN),
2: int(50 + OrderN),
3: int(35 + 2*OrderN),
1: int(70 - 2*OrderN),
2: int(25 + OrderN),
3: int(5 + OrderN),
}
}
@ -24,21 +24,21 @@ func getOrderDiffRand(Diff, OrderN int) map[int]int {
switch Diff {
case DIFF_MID:
d = map[int]int{
DIFF_LOW: int(21 - 3*OrderN),
DIFF_MID: int(49 + 1.5*float64(OrderN)),
DIFF_HIGH: int(30 + 1.5*float64(OrderN)),
DIFF_LOW: 21,
DIFF_MID: 49,
DIFF_HIGH: 30,
}
case DIFF_HIGH:
d = map[int]int{
DIFF_LOW: int(60 - 5*OrderN),
DIFF_MID: int(30 + 3*float64(OrderN)),
DIFF_HIGH: int(10 + 2*float64(OrderN)),
DIFF_LOW: 60,
DIFF_MID: 30,
DIFF_HIGH: 10,
}
default:
d = map[int]int{
DIFF_LOW: int(10 - OrderN),
DIFF_MID: int(30),
DIFF_HIGH: int(60 + OrderN),
DIFF_LOW: 10,
DIFF_MID: 30,
DIFF_HIGH: 60,
}
}
return d
@ -56,8 +56,8 @@ func getChessDiff(ChessNum, OrderDiff, OrderN int) map[int]int {
switch OrderDiff {
case DIFF_LOW:
rand := map[int]int{
DIFF_LOW: 99 - OrderN,
DIFF_MID: 1 + OrderN,
DIFF_LOW: 99,
DIFF_MID: 1,
}
secondDiff := GoUtil.RandMap(rand)
rs = map[int]int{
@ -66,8 +66,8 @@ func getChessDiff(ChessNum, OrderDiff, OrderN int) map[int]int {
}
case DIFF_MID:
rand := map[int]int{
DIFF_LOW: 5 + OrderN,
DIFF_MID: 95 - OrderN,
DIFF_LOW: 50,
DIFF_MID: 50,
}
secondDiff := GoUtil.RandMap(rand)
rs = map[int]int{
@ -76,9 +76,9 @@ func getChessDiff(ChessNum, OrderDiff, OrderN int) map[int]int {
}
case DIFF_HIGH:
rand := map[int]int{
DIFF_LOW: int(95 - 10*OrderN),
DIFF_MID: int(4 + 6*OrderN),
DIFF_HIGH: int(1 + 4*OrderN),
DIFF_LOW: 95,
DIFF_MID: 4,
DIFF_HIGH: 1,
}
secondDiff := GoUtil.RandMap(rand)
rs = map[int]int{
@ -90,13 +90,13 @@ func getChessDiff(ChessNum, OrderDiff, OrderN int) map[int]int {
switch OrderDiff {
case DIFF_LOW:
rand := map[int]int{
DIFF_LOW: 95 - OrderN,
DIFF_MID: 5 + OrderN,
DIFF_LOW: 95,
DIFF_MID: 5,
}
secondDiff := GoUtil.RandMap(rand)
rand = map[int]int{
DIFF_LOW: 60 - 4*OrderN,
DIFF_MID: 40 + 4*OrderN,
DIFF_LOW: 70,
DIFF_MID: 30,
}
thirdDiff := GoUtil.RandMap(rand)
rs = map[int]int{
@ -106,33 +106,33 @@ func getChessDiff(ChessNum, OrderDiff, OrderN int) map[int]int {
}
case DIFF_MID:
rand := map[int]int{
DIFF_LOW: 50 - 3*OrderN,
DIFF_MID: 50 + 3*OrderN,
DIFF_LOW: 95,
DIFF_MID: 5,
}
secondDiff := GoUtil.RandMap(rand)
rand = map[int]int{
DIFF_MID: 95 - 4*OrderN,
DIFF_HIGH: 5 + 4*OrderN,
DIFF_LOW: 60,
DIFF_MID: 40,
}
thirdDiff := GoUtil.RandMap(rand)
rs = map[int]int{
1: DIFF_LOW,
1: DIFF_MID,
2: secondDiff,
3: thirdDiff,
}
case DIFF_HIGH:
rand := map[int]int{
DIFF_LOW: int(95 - 10*OrderN),
DIFF_MID: int(5 + 10*OrderN),
DIFF_LOW: 95,
DIFF_MID: 5,
}
secondDiff := GoUtil.RandMap(rand)
rand = map[int]int{
DIFF_MID: int(95 - 8*OrderN),
DIFF_HIGH: int(5 + 8*OrderN),
DIFF_LOW: 50,
DIFF_MID: 50,
}
thirdDiff := GoUtil.RandMap(rand)
rs = map[int]int{
1: DIFF_LOW,
1: DIFF_HIGH,
2: secondDiff,
3: thirdDiff,
}
@ -204,7 +204,7 @@ func RandChessColor(Emit []int) string {
}
// 获取棋子等级范围
func getChesslvRange(Emit int, EnergyMul int) (int, int) {
func getChesslvRange(Emit int, EnergyMul int, IsCharge bool) (int, int) {
RandEmitLv := mergeDataCfg.GetLvById(Emit)
EmitId := mergeDataCfg.GetEmitId(Emit)
RandMaxLv := mergeDataCfg.GetMaxLvById(Emit)
@ -213,6 +213,11 @@ func getChesslvRange(Emit int, EnergyMul int) (int, int) {
m := int(float64(1+RandEmitLv-RandEmitMinLv) / float64(1+RandMaxLv-RandEmitMinLv) / Ratio * 100)
ChessMinLev := orderCfg.GetLvMin(EnergyMul)
ChessMaxLev := orderCfg.GetLvMax(EnergyMul, m)
ProductList := mergeDataCfg.GetEmitProduceType(Emit)
ChessMaxLev = ChessMaxLev - len(ProductList) + 2
if IsCharge {
ChessMaxLev += 1
}
return ChessMinLev, ChessMaxLev
}
@ -445,7 +450,7 @@ func GetOrderStar(ChessList []int) int {
}
func GetChessByDiff(EmitId, EnergyMul, Diff int, Color string) []int {
ChessMinLv, ChessMaxLv := getChesslvRange(EmitId, EnergyMul)
ChessMinLv, ChessMaxLv := getChesslvRange(EmitId, EnergyMul, false)
LvRange := getChessLvRange(ChessMinLv, ChessMaxLv, Diff)
ChessIds := []int{}
for _, v := range LvRange {
@ -486,7 +491,7 @@ func getChessFromPoolByDiff(o *OrderMod, Diff int, Emit []int, EnergyMul int) in
MinChessColor := mergeDataCfg.GetColorById(MinChessId)
NewEmitChessId := GetEmitByColor(Emit, MinChessColor)
ColorRand := mergeDataCfg.GetEmitProduceType(NewEmitChessId)
ChessMinLv, ChessMaxLv := getChesslvRange(NewEmitChessId, EnergyMul)
ChessMinLv, ChessMaxLv := getChesslvRange(NewEmitChessId, EnergyMul, o.IsCharge)
NewLev := getChessLv(ChessMinLv, ChessMaxLv, Diff)
MinChessLv := mergeDataCfg.GetLvById(MinChessId)
NewLev2 := mergeDataCfg.DynamicLev2(NewLev, NewEmitChessId, ColorRand[0], MinChessColor)
@ -502,7 +507,7 @@ func getChessFromPoolByDiff(o *OrderMod, Diff int, Emit []int, EnergyMul int) in
return Chess
}
Color := GoUtil.RandStringSlice(ColorRand)
ChessMinLv, ChessMaxLv := getChesslvRange(EmitChessId, EnergyMul)
ChessMinLv, ChessMaxLv := getChesslvRange(EmitChessId, EnergyMul, o.IsCharge)
NewLev := getChessLv(ChessMinLv, ChessMaxLv, Diff)
NewLev1 := mergeDataCfg.DynamicLev(NewLev, EmitChessId, Color)
MaxLev := mergeDataCfg.GetMaxLvByColor(Color)
@ -538,7 +543,7 @@ func initReflectChess(Emits []int, EnergyMul int) {
if len(ProduceColor) == 0 || ProduceColor[0] == "" {
continue
}
ChessMinLv, ChessMaxLv := getChesslvRange(Emit, EnergyMul)
ChessMinLv, ChessMaxLv := getChesslvRange(Emit, EnergyMul, false)
Product := mergeDataCfg.GetEmitProduceChessType(Emit)
Start = ChessMinLv
End = ChessMinLv + (ChessMaxLv-ChessMinLv+1)/3 - 1