Merge branch 'develop' into sdk

This commit is contained in:
hahwu 2025-09-10 10:23:24 +08:00
commit 3d8542fae5
34 changed files with 4081 additions and 2234 deletions

View File

@ -2,6 +2,7 @@ package GoUtil
import ( import (
"fmt" "fmt"
"reflect"
"server/game/mod/item" "server/game/mod/item"
"sort" "sort"
"strconv" "strconv"
@ -232,18 +233,43 @@ func PopSlice(s []int) (int, []int) {
return s[0], s[1:] return s[0], s[1:]
} }
// 判断两个切片的元素是否一致
func SliceEqual(a, b []int) bool { func SliceEqual(a, b []int) bool {
if len(a) != len(b) { if len(a) != len(b) {
return false return false
} }
sort.Ints(a)
sort.Ints(b) // 创建副本以避免修改原始切片
for k, v := range a { aCopy := make([]int, len(a))
if v != b[k] { bCopy := make([]int, len(b))
return false copy(aCopy, a)
} copy(bCopy, b)
// 对切片进行排序
sort.Ints(aCopy)
sort.Ints(bCopy)
// 比较排序后的切片
return reflect.DeepEqual(aCopy, bCopy)
}
func SlicesEqualString(a, b []string) bool {
if len(a) != len(b) {
return false
} }
return true
// 创建副本以避免修改原始切片
aCopy := make([]string, len(a))
bCopy := make([]string, len(b))
copy(aCopy, a)
copy(bCopy, b)
// 对切片进行排序
sort.Strings(aCopy)
sort.Strings(bCopy)
// 比较排序后的切片
return reflect.DeepEqual(aCopy, bCopy)
} }
// IsContainSlice checks if all elements of s2 are contained in s. // IsContainSlice checks if all elements of s2 are contained in s.

View File

@ -5,6 +5,7 @@ import (
"server/gamedata" "server/gamedata"
"server/pkg/github.com/name5566/leaf/log" "server/pkg/github.com/name5566/leaf/log"
"strconv" "strconv"
"strings"
) )
const ( const (
@ -88,21 +89,21 @@ func GetProgressReward(Scene, Lv int) []*item.Item {
} }
for _, v := range value { for _, v := range value {
if gamedata.GetIntValue(v, "Scene") == Scene && gamedata.GetIntValue(v, "Lv") == Lv { if gamedata.GetIntValue(v, "Scene") == Scene && gamedata.GetIntValue(v, "Lv") == Lv {
return gamedata.GetItemList(v, "Item") return gamedata.GetItemList(v, "AreaReward")
} }
} }
return nil return nil
} }
func GetDecoarteReward(Scene int) []*item.Item { func GetDecoarteReward(Scene int, Lv int) []*item.Item {
value, err := gamedata.GetData(INDOOR_PROGRESS) value, err := gamedata.GetData(INDOOR_PROGRESS)
if err != nil { if err != nil {
log.Debug("IndoorProgress GetDecoarteReward not found") log.Debug("IndoorProgress GetDecoarteReward not found")
return nil return nil
} }
for _, v := range value { for _, v := range value {
if gamedata.GetIntValue(v, "Scene") == Scene && gamedata.GetIntValue(v, "Lv") == 1 { if gamedata.GetIntValue(v, "Scene") == Scene && gamedata.GetIntValue(v, "Lv") == Lv {
return gamedata.GetItemList(v, "AreaReward") return gamedata.GetItemList(v, "Item")
} }
} }
return nil return nil
@ -150,3 +151,56 @@ func GetDecoratePExp(AreaId, SortId int) int {
} }
return 0 return 0
} }
func GetAllPartId() []int {
data, err := gamedata.GetDataByKey(DECORATE_CONST, "AllPartId")
if err != nil {
log.Debug("DecorateCost GetAllPartId not found")
return []int{1505, 1515, 1525, 1535}
}
var PartIdList []int
str := gamedata.GetStringValue(data, "Value")
r1 := strings.Split(str, "|")
for _, v := range r1 {
id, _ := strconv.Atoi(v)
PartIdList = append(PartIdList, id)
}
return PartIdList
}
func GetIdBySenceAndLv(Sence, Lv int) int {
data, err := gamedata.GetData(INDOOR_PROGRESS)
if err != nil {
log.Debug("DecorateArea GetIdBySenceAndLv not found")
return 0
}
for k, v := range data {
if gamedata.GetIntValue(v, "Scene") == Sence && gamedata.GetIntValue(v, "Lv") == Lv {
id, _ := strconv.Atoi(k)
return id
}
}
return 0
}
func GetPartNumByAreaId(AreaId int) map[int]int {
data, err := gamedata.GetData(INDOOR_PROGRESS)
if err != nil {
log.Debug("DecorateArea GetPartNumByAreaId not found AreaId:%v", AreaId)
return nil
}
res := make(map[int]int)
for k, v := range data {
Sence := gamedata.GetIntValue(v, "Scene")
if Sence != AreaId {
continue
}
id, _ := strconv.Atoi(k)
PartNum := gamedata.GetIntValue(v, "Part")
if PartNum == 0 {
continue
}
res[id] = PartNum
}
return res
}

View File

@ -0,0 +1,82 @@
package GuideTaskCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
)
const (
GUIDE_TASK_CONST = "GuideTaskConst"
GUIDE_TASK_TASK = "GuideTaskTask"
GUIDE_TASK_ACTIVE = "GuideTaskActive"
)
func init() {
gamedata.InitCfg(GUIDE_TASK_CONST)
gamedata.InitCfg(GUIDE_TASK_TASK)
gamedata.InitCfg(GUIDE_TASK_ACTIVE)
}
func GetTaskRewardById(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id)
if err != nil {
return nil
}
return gamedata.GetItemList(data, "Items")
}
func GetTaskById(Id int) string {
data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id)
if err != nil {
return ""
}
return gamedata.GetStringValue(data, "Task")
}
func GetTaskActive(Id int) int {
data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Active")
}
func GetActiveReward(Id int) ([]*item.Item, int) {
data, err := gamedata.GetDataByIntKey(GUIDE_TASK_ACTIVE, Id)
if err != nil {
return nil, 0
}
return gamedata.GetItemList(data, "Items"), gamedata.GetIntValue(data, "Active")
}
func GetUnlockLv() int {
data, err := gamedata.GetDataByKey(GUIDE_TASK_CONST, "UnlockLv")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetDays() int {
data, err := gamedata.GetDataByKey(GUIDE_TASK_CONST, "Days")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetTaskList(Lv int) map[int]string {
r := make(map[int]string)
data, err := gamedata.GetData(GUIDE_TASK_TASK)
if err != nil {
log.Debug("GetTaskList get data nil")
return r
}
for k, v := range data {
k1, _ := strconv.Atoi(k)
r[k1] = gamedata.GetStringValue(v, "Task")
}
return r
}

View File

@ -0,0 +1,51 @@
package GuideTaskCfg
import (
"fmt"
"testing"
)
func TestGuideTaskCfg_NoPanic(t *testing.T) {
ids := []int{-1, 0, 1, 999999}
for _, id := range ids {
t.Run(fmt.Sprintf("Id=%d", id), func(t *testing.T) {
defer func() {
if r := recover(); r != nil {
t.Fatalf("unexpected panic: %v", r)
}
}()
_ = GetTaskRewardById(id)
_ = GetTaskActive(id)
_, _ = GetActiveReward(id)
})
}
_ = GetUnlockLv()
_ = GetDays()
}
// 以下 Example 用于文档与编译校验(无固定输出校验)
func ExampleGetTaskRewardById() {
_ = GetTaskRewardById(1)
// Output:
}
func ExampleGetTaskActive() {
_ = GetTaskActive(1)
// Output:
}
func ExampleGetActiveReward() {
_, _ = GetActiveReward(1)
// Output:
}
func ExampleGetUnlockLv() {
_ = GetUnlockLv()
// Output:
}
func ExampleGetDays() {
_ = GetDays()
// Output:
}

View File

@ -131,7 +131,7 @@ func GetChessIdByLvAndColor(Lv int, Color string) int {
return Id return Id
} }
} }
log.Debug("MergeDataCfg GetChessIdByLvAndColor lv:%v Color:%v not found", Lv, Color) // log.Debug("MergeDataCfg GetChessIdByLvAndColor lv:%v Color:%v not found", Lv, Color)
return 0 return 0
} }
@ -169,7 +169,7 @@ func GetMaxLvByColor(Color string) int {
func GetEmitMinLvById(Id string) int { func GetEmitMinLvById(Id string) int {
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, Id) data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, Id)
if err != nil { if err != nil {
log.Debug("GetMaxLvById GetOne Id:%v not found", Id) log.Debug("GetEmitMinLvById GetOne Id:%v not found", Id)
return 0 return 0
} }
return gamedata.GetIntValue(data, "Emit_Min_Lv") return gamedata.GetIntValue(data, "Emit_Min_Lv")
@ -179,12 +179,21 @@ func GetEmitMinLvById(Id string) int {
func GetEmitRatio(Id string) float64 { func GetEmitRatio(Id string) float64 {
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, Id) data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, Id)
if err != nil { if err != nil {
log.Debug("GetMaxLvById GetOne Id:%v not found", Id) log.Debug("GetEmitRatio GetOne Id:%v not found", Id)
return 0 return 0
} }
return gamedata.GetFloatValue(data, "Ratio") return gamedata.GetFloatValue(data, "Ratio")
} }
func GetEmitRetire(Id string) int {
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, Id)
if err != nil {
log.Debug("GetEmitRetire GetOne Id:%v not found", Id)
return 0
}
return gamedata.GetIntValue(data, "Retire")
}
// 根据Id获取棋子类型 // 根据Id获取棋子类型
func GetTypeById(Id int) string { func GetTypeById(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id) data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
@ -209,7 +218,7 @@ func GetColorById(Id int) string {
func GetSellNumById(Id int) int { func GetSellNumById(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id) data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil { if err != nil {
log.Debug("GetColorById GetOne Id:%v not found", Id) log.Debug("GetSellNumById GetOne Id:%v not found", Id)
return 0 return 0
} }
return gamedata.GetIntValue(data, "SellNum") return gamedata.GetIntValue(data, "SellNum")

View File

@ -11,6 +11,8 @@ const (
CFG_ORDER_CHESS_DATA = "OrderChessData" CFG_ORDER_CHESS_DATA = "OrderChessData"
CFG_ORDER_NUM_DATA = "OrderNumData" CFG_ORDER_NUM_DATA = "OrderNumData"
CFG_START_ORDER = "StartOrder" CFG_START_ORDER = "StartOrder"
CFG_CONST = "OrderConst"
CFG_ORDER_SCENE = "OrderScene"
) )
func init() { func init() {
@ -18,6 +20,24 @@ func init() {
gamedata.InitCfg(CFG_ORDER_CHESS_DATA) gamedata.InitCfg(CFG_ORDER_CHESS_DATA)
gamedata.InitCfg(CFG_ORDER_NUM_DATA) gamedata.InitCfg(CFG_ORDER_NUM_DATA)
gamedata.InitCfg(CFG_START_ORDER) 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 { func GetLvMin(EnergyMul int) int {
@ -61,6 +81,28 @@ func GetOrderNum(Level int) int {
return 0 return 0
} }
func GetStartOrderList() []*gamedata.StartOrderData {
ret := make([]*gamedata.StartOrderData, 0)
data, err := gamedata.GetData(CFG_START_ORDER)
if err != nil {
return ret
}
for k, v := range data {
OrderId, _ := strconv.Atoi(k)
ret = append(ret, &gamedata.StartOrderData{
Id: OrderId,
MergeList: gamedata.GetIntSliceValue(v, "merge_id_list"),
Appear: gamedata.GetStringValue(v, "appear"),
Preview: gamedata.GetStringValue(v, "preview"),
Items: gamedata.GetItemList(v, "reward"),
})
}
sort.Slice(ret, func(i, j int) bool {
return ret[i].Id < ret[j].Id
})
return ret
}
func GetStartOrderByStep(id int) []*gamedata.StartOrderData { func GetStartOrderByStep(id int) []*gamedata.StartOrderData {
ret := make([]*gamedata.StartOrderData, 0) ret := make([]*gamedata.StartOrderData, 0)
data, err := gamedata.GetData(CFG_START_ORDER) data, err := gamedata.GetData(CFG_START_ORDER)
@ -115,3 +157,11 @@ func GetMaxStep() int {
} }
return max return max
} }
func GetOrderType(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_START_ORDER, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "type")
}

View File

@ -190,6 +190,14 @@ func GetInteractNum() int {
return gamedata.GetIntValue(data, "Value") return gamedata.GetIntValue(data, "Value")
} }
func GetInteractUnlock() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "InteractUnlock")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetVisitorItem() int { func GetVisitorItem() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "VisitorItem") data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "VisitorItem")
if err != nil { if err != nil {

View File

@ -6,6 +6,7 @@ import (
"server/game/mod/item" "server/game/mod/item"
MsgMod "server/game/mod/msg" MsgMod "server/game/mod/msg"
"server/game/mod/piggyBank" "server/game/mod/piggyBank"
"server/game/mod/quest"
"server/msg" "server/msg"
"server/pkg/github.com/name5566/leaf/log" "server/pkg/github.com/name5566/leaf/log"
) )
@ -16,6 +17,9 @@ func Charge(p *Player, ChargeId int) {
PiggyBankFire(p, ChargeId) // 猪猪银行 PiggyBankFire(p, ChargeId) // 猪猪银行
PlayroomFire(p, ChargeId) // 游乐场 PlayroomFire(p, ChargeId) // 游乐场
ActivityFire(p, ChargeId) // 活动礼包 ActivityFire(p, ChargeId) // 活动礼包
OrderMod := p.PlayMod.getOrderMod()
OrderMod.SetIsCharge() // 设置订单模块为充值状态
p.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_PURCHASE, A: []interface{}{}})
} }
func SendCharge(p *Player, d *ChargeExtra) { func SendCharge(p *Player, d *ChargeExtra) {

View File

@ -690,6 +690,7 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
RegisterMsgProcessFunc("ReqSetEnergyMul", RegSetEneryFunc) //设置能量倍数 RegisterMsgProcessFunc("ReqSetEnergyMul", RegSetEneryFunc) //设置能量倍数
RegisterMsgProcessFunc("ReqChessEx", ReqChessEx) // 转换棋子 RegisterMsgProcessFunc("ReqChessEx", ReqChessEx) // 转换棋子
RegisterMsgProcessFunc("ReqGetChessFromBuff", ReqGetChessFromBuff) // 从buff中获取棋子 RegisterMsgProcessFunc("ReqGetChessFromBuff", ReqGetChessFromBuff) // 从buff中获取棋子
RegisterMsgProcessFunc("ReqPutPartInBag", ReqPutPartInBag) // 把零件放入背包
RegisterMsgProcessFunc("ReqPutChessInBag", ReqPutChessInBag) // 把棋子放入背包 RegisterMsgProcessFunc("ReqPutChessInBag", ReqPutChessInBag) // 把棋子放入背包
RegisterMsgProcessFunc("ReqTakeChessOutBag", ReqTakeChessOutBag) // 从背包中取出棋子 RegisterMsgProcessFunc("ReqTakeChessOutBag", ReqTakeChessOutBag) // 从背包中取出棋子
RegisterMsgProcessFunc("ReqBuyChessBagGrid", ReqBuyChessBagGrid) // 解锁背包格子 RegisterMsgProcessFunc("ReqBuyChessBagGrid", ReqBuyChessBagGrid) // 解锁背包格子
@ -736,6 +737,9 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
RegisterMsgProcessFunc("ReqGetDailyTaskReward", ReqGetDailyTaskReward) // 领取日常任务奖励 RegisterMsgProcessFunc("ReqGetDailyTaskReward", ReqGetDailyTaskReward) // 领取日常任务奖励
RegisterMsgProcessFunc("ReqGetDailyWeekReward", ReqGetDailyWeekReward) // 领取周活跃奖励 RegisterMsgProcessFunc("ReqGetDailyWeekReward", ReqGetDailyWeekReward) // 领取周活跃奖励
RegisterMsgProcessFunc("ReqDailyUnlock", ReqDailyUnlock) // 日常任务解锁 RegisterMsgProcessFunc("ReqDailyUnlock", ReqDailyUnlock) // 日常任务解锁
// 新手任务
RegisterMsgProcessFunc("ReqGetGuideTaskReward", ReqGetGuideTaskReward) // 领取日新手任务奖励
RegisterMsgProcessFunc("ReqGetGuideActiveReward", ReqGetGuideActiveReward) // 领取活跃奖励
// 引导奖励 // 引导奖励
RegisterMsgProcessFunc("ReqGuideReward", ReqGuideReward) // 领取引导奖励 RegisterMsgProcessFunc("ReqGuideReward", ReqGuideReward) // 领取引导奖励
@ -759,7 +763,7 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
RegisterMsgProcessFunc("ReqFastProduceReward", ReqFastProduceReward) // 连击快手奖励 RegisterMsgProcessFunc("ReqFastProduceReward", ReqFastProduceReward) // 连击快手奖励
RegisterMsgProcessFunc("ReqFastProduceInfo", ReqFastProduceInfo) // 请求连击快手数据 RegisterMsgProcessFunc("ReqFastProduceInfo", ReqFastProduceInfo) // 请求连击快手数据
RegisterMsgProcessFunc("ReqLimitSenceReward", ReqLimitSenceReward) // 获取场景转盘奖励 RegisterMsgProcessFunc("ReqLimitSenceReward", ReqLimitSenceReward) // 获取场景转盘奖励
RegisterMsgProcessFunc("ReqSelectLimitEvent", ReqSelectLimitEvent) //领取限时事件进度奖励 RegisterMsgProcessFunc("ReqSelectLimitEvent", ReqSelectLimitEvent) //领取Bouns限时事件进度奖励
RegisterMsgProcessFunc("ReqGetGoldCard", ReqGetGoldCard) //请求金卡交换信息 RegisterMsgProcessFunc("ReqGetGoldCard", ReqGetGoldCard) //请求金卡交换信息
RegisterMsgProcessFunc("ReqLimitEventLuckyCat", ReqLimitEventLuckyCat) //幸运猫获取奖励 RegisterMsgProcessFunc("ReqLimitEventLuckyCat", ReqLimitEventLuckyCat) //幸运猫获取奖励
RegisterMsgProcessFunc("ReqCatTrickReward", ReqCatTrickReward) //小猫戏法获取奖励 RegisterMsgProcessFunc("ReqCatTrickReward", ReqCatTrickReward) //小猫戏法获取奖励

View File

@ -17,11 +17,13 @@ import (
"server/game/mod/activity" "server/game/mod/activity"
"server/game/mod/avatar" "server/game/mod/avatar"
"server/game/mod/card" "server/game/mod/card"
"server/game/mod/decorate"
"server/game/mod/emoji" "server/game/mod/emoji"
"server/game/mod/face" "server/game/mod/face"
"server/game/mod/friend" "server/game/mod/friend"
"server/game/mod/item" "server/game/mod/item"
MsgMod "server/game/mod/msg" MsgMod "server/game/mod/msg"
"server/game/mod/order"
"server/game/mod/playroom" "server/game/mod/playroom"
"server/msg" "server/msg"
"server/pkg/github.com/name5566/leaf/log" "server/pkg/github.com/name5566/leaf/log"
@ -42,7 +44,7 @@ func ReqGmCommand_(player *Player, Command string) error {
// log.Error("ReqGmCommand panic: %v", err) // log.Error("ReqGmCommand panic: %v", err)
// } // }
// }() // }()
if conf.Server.GameName != "pet_home" && conf.Server.GameName != "merge_pet_sdk" { if conf.Server.GameName != "pet_home" && conf.Server.GameName != "merge_pet_sdk" && conf.Server.GameName != "Merge_Pet_Local" {
return fmt.Errorf("Player %d ReqGmCommand not support in game %s, command %s", player.M_DwUin, conf.Server.GameName, Command) return fmt.Errorf("Player %d ReqGmCommand not support in game %s, command %s", player.M_DwUin, conf.Server.GameName, Command)
} }
player.TeLog("gm", map[string]interface{}{ player.TeLog("gm", map[string]interface{}{
@ -83,12 +85,20 @@ func ReqGmCommand_(player *Player, Command string) error {
DailyMod := player.PlayMod.getDailyTaskMod() DailyMod := player.PlayMod.getDailyTaskMod()
DailyMod.Active = num DailyMod.Active = num
player.PushClientRes(DailyMod.BackData()) player.PushClientRes(DailyMod.BackData())
case "triggerOrder":
OrderMod := player.PlayMod.getOrderMod()
ChessMod := player.PlayMod.getChessMod()
OrderMod.TriggerOrder(player.GetPlayerBaseMod().GetLevel(), order.TRIGGER_TYPE_ORDER, ChessMod.GetEmitList(), 1)
player.PushClientRes(OrderMod.BackData())
case "setlv": case "setlv":
num, _ := strconv.Atoi(arg[1]) num, _ := strconv.Atoi(arg[1])
player.PlayMod.getBaseMod().Level = num player.PlayMod.getBaseMod().Level = num
player.PlayMod.getBaseMod().Exp = 0 player.PlayMod.getBaseMod().Exp = 0
player.PushClientRes(player.PlayerBaseMod.BackAsset()) player.PushClientRes(player.PlayerBaseMod.BackAsset())
player.initAcitivity() player.initAcitivity()
player.PlayMod.getGuideTaskMod().Unlock(num)
player.PlayMod.getOrderMod().TriggerOrder(num, order.TRIGGER_TYPE_LV, nil, 1)
player.PushClientRes(player.PlayMod.getOrderMod().BackData())
player.BackDataActivity() player.BackDataActivity()
case "zeroUpdate": case "zeroUpdate":
VarMod := player.PlayMod.getVarMod() VarMod := player.PlayMod.getVarMod()
@ -286,7 +296,7 @@ func ReqGmCommand_(player *Player, Command string) error {
PlayroomMod := player.PlayMod.getPlayroomMod() PlayroomMod := player.PlayMod.getPlayroomMod()
PlayroomMod.NewCollect = make(map[int]*playroom.CollectInfo, 0) PlayroomMod.NewCollect = make(map[int]*playroom.CollectInfo, 0)
for _, v := range CollectList { for _, v := range CollectList {
PlayroomMod.AddCollect(v) PlayroomMod.AddCollect(v, "Gm")
} }
case "playroomDress": case "playroomDress":
PlayroomMod := player.PlayMod.getPlayroomMod() PlayroomMod := player.PlayMod.getPlayroomMod()
@ -376,12 +386,27 @@ func ReqGmCommand_(player *Player, Command string) error {
GuildMod := player.PlayMod.getGuideMod() GuildMod := player.PlayMod.getGuideMod()
GuildMod.Reward = make(map[int]int) GuildMod.Reward = make(map[int]int)
player.PushClientRes(GuildMod.BackData()) player.PushClientRes(GuildMod.BackData())
case "resetDecoratePart":
DecorateMod := player.PlayMod.getDecorateMod()
DecorateMod.PartCost = make(map[int]*decorate.PartCostInfo)
DecorateMod.PartClassPool = []int{}
DecorateMod.PartPool = make(map[int]int)
DecorateMod.InitData()
player.PushClientRes(DecorateMod.BackData())
case "setDecorateArea": case "setDecorateArea":
S, _ := strconv.Atoi(arg[1]) S, _ := strconv.Atoi(arg[1])
DecorateMod := player.PlayMod.getDecorateMod() DecorateMod := player.PlayMod.getDecorateMod()
DecorateMod.AreaId = S DecorateMod.AreaId = S
DecorateMod.FinishList = make(map[int]struct{}) DecorateMod.FinishList = make(map[int]struct{})
DecorateMod.Progress = 0 DecorateMod.Progress = 0
case "setDecorateProgress":
S, _ := strconv.Atoi(arg[1])
DecorateMod := player.PlayMod.getDecorateMod()
DecorateMod.FinishList = make(map[int]struct{})
for i := 1; i <= S; i++ {
DecorateMod.FinishList[i] = struct{}{}
}
DecorateMod.Progress = S
case "resetCardSeasonFirst": case "resetCardSeasonFirst":
CardMod := player.PlayMod.getCardMod() CardMod := player.PlayMod.getCardMod()
CardMod.SeasonFirst = false CardMod.SeasonFirst = false
@ -449,7 +474,10 @@ func ReqGmCommand_(player *Player, Command string) error {
BaseMod.Uid = Uid BaseMod.Uid = Uid
case "copyUser": case "copyUser":
p1 := new(Player) p1 := new(Player)
p1.InitPlayer(arg[1]) err := p1.InitPlayer(arg[1])
if err != nil {
return err
}
BaseMod := p1.PlayMod.getBaseMod() BaseMod := p1.PlayMod.getBaseMod()
BaseMod.Uid = player.M_DwUin BaseMod.Uid = player.M_DwUin
BaseMod.NickName = player.PlayMod.getBaseMod().NickName BaseMod.NickName = player.PlayMod.getBaseMod().NickName

View File

@ -267,3 +267,22 @@ func LimitedTimeEnergyAdd(p *Player) {
BaseMod.SetRecoverTime(curtime) BaseMod.SetRecoverTime(curtime)
p.SendErrClienRes(PlayerBaseMod.BackAsset()) p.SendErrClienRes(PlayerBaseMod.BackAsset())
} }
func GuideTaskTrigger(p *Player) {
GuideTaskMod := p.PlayMod.getGuideTaskMod()
UnlockTime := GuideTaskMod.UnlockTime
if UnlockTime == 0 {
return
}
Now := GoUtil.Now()
NextSecond := 86400 - (Now-UnlockTime)%86400
if NextSecond > 0 {
p.CallEvent(time.Duration(NextSecond)*time.Second, func() {
p.lock.Lock()
defer p.lock.Unlock()
GuideTaskMod.Login()
p.PushClientRes(GuideTaskMod.BackData())
p.SendClientRes()
}, "PlayroomWork")
}
}

View File

@ -23,7 +23,6 @@ import (
"server/game/mod/item" "server/game/mod/item"
"server/game/mod/limitedTimeEvent" "server/game/mod/limitedTimeEvent"
MsgMod "server/game/mod/msg" MsgMod "server/game/mod/msg"
"server/game/mod/order"
"server/game/mod/playroom" "server/game/mod/playroom"
"server/game/mod/quest" "server/game/mod/quest"
"server/msg" "server/msg"
@ -155,8 +154,10 @@ func (p *Player) ProcessTrigger() {
DailyTaskMod := p.PlayMod.getDailyTaskMod() DailyTaskMod := p.PlayMod.getDailyTaskMod()
MailMod := p.PlayMod.getMailMod() MailMod := p.PlayMod.getMailMod()
PlayroomMod := p.PlayMod.getPlayroomMod() PlayroomMod := p.PlayMod.getPlayroomMod()
GuideTaskMod := p.PlayMod.getGuideTaskMod()
IsPlayroomBack := false IsPlayroomBack := false
IsMailBack := false IsMailBack := false
IsGuideTask := false
for _, tr := range p.Trigger { for _, tr := range p.Trigger {
if DailyTaskMod.Trigger(tr) { if DailyTaskMod.Trigger(tr) {
IsDailyBack = true IsDailyBack = true
@ -167,6 +168,9 @@ func (p *Player) ProcessTrigger() {
if PlayroomMod.QuestTrigger(tr) { if PlayroomMod.QuestTrigger(tr) {
IsPlayroomBack = true IsPlayroomBack = true
} }
if GuideTaskMod.Trigger(tr) {
IsGuideTask = true
}
} }
if IsDailyBack { if IsDailyBack {
@ -178,6 +182,9 @@ func (p *Player) ProcessTrigger() {
if IsPlayroomBack { if IsPlayroomBack {
p.NotifyPlayroomTask() p.NotifyPlayroomTask()
} }
if IsGuideTask {
p.PushClientRes(GuideTaskMod.BackData())
}
p.Trigger = make([]*quest.Trigger, 0) p.Trigger = make([]*quest.Trigger, 0)
} }
@ -367,26 +374,7 @@ func (p *Player) Login() {
FaceMod := p.PlayMod.getFaceMod() FaceMod := p.PlayMod.getFaceMod()
AvatarMod := p.PlayMod.getAvatarMod() AvatarMod := p.PlayMod.getAvatarMod()
PlayBaseMod := p.GetPlayerBaseMod() PlayBaseMod := p.GetPlayerBaseMod()
OrderMod := p.PlayMod.getOrderMod() GuideTaskMod := p.PlayMod.getGuideTaskMod()
PlayroomUnlockLv := playroomCfg.GetUnLockLv()
// TODO 优化数据
if BaseMod.GetLevel() < PlayroomUnlockLv {
for k, v := range OrderMod.GetOrderList() {
if v.Type == order.Trigger_type {
v.Type = order.Common_type
OrderMod.OrderList[k] = v
}
}
ItemMod := p.PlayMod.getItemMod()
ItemMod.Data = make(map[int]int)
}
// TODO : 优化数据
GuideMod := p.PlayMod.getGuideMod()
if GuideMod.Reward[4] > 0 {
if AvatarMod.List[10] == nil {
AvatarMod.Unlock(10, 0)
}
}
// playroom触发 // playroom触发
LimitedTimePlayroomTrigger(p) // playroom数值变化 LimitedTimePlayroomTrigger(p) // playroom数值变化
LimitedTimePlayroomWorkTrigger(p) // playroom打工 LimitedTimePlayroomWorkTrigger(p) // playroom打工
@ -395,6 +383,7 @@ func (p *Player) Login() {
LoignBack(p) // 登录返回数据 LoignBack(p) // 登录返回数据
SyncMailMsg(p) // 同步邮件 SyncMailMsg(p) // 同步邮件
BaseMod.Login() BaseMod.Login()
GuideTaskMod.Login()
FaceMod.Login(PlayBaseMod.GetRegisterTime()) FaceMod.Login(PlayBaseMod.GetRegisterTime())
AvatarMod.Login(PlayBaseMod.GetRegisterTime()) AvatarMod.Login(PlayBaseMod.GetRegisterTime())
HandbookItem := p.PlayMod.getCardMod().Login(G_GameLogicPtr.SeverInfo.OpenTime) HandbookItem := p.PlayMod.getCardMod().Login(G_GameLogicPtr.SeverInfo.OpenTime)
@ -512,6 +501,9 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
change_type = "gain" change_type = "gain"
} }
IType := itemCfg.GetItemType(v.Id) IType := itemCfg.GetItemType(v.Id)
if IType == 0 {
return errors.New("item type error, item id :" + strconv.Itoa(v.Id))
}
switch IType { switch IType {
case item.ITEM_TYPE_ENERGY: // 能量 case item.ITEM_TYPE_ENERGY: // 能量
err := p.GetPlayerBaseMod().AddEnergy(p, v.Num) err := p.GetPlayerBaseMod().AddEnergy(p, v.Num)
@ -545,6 +537,9 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
if err != nil { if err != nil {
return err return err
} }
if v.Num < 0 {
p.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_DIAMOND, A: []interface{}{-v.Num}})
}
p.TeLog("asset_change", map[string]interface{}{ p.TeLog("asset_change", map[string]interface{}{
"item_id": v.Id, "item_id": v.Id,
"change_type": change_type, "change_type": change_type,
@ -605,6 +600,20 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
case item.ITEM_TYPE_CHESS: // 棋子 case item.ITEM_TYPE_CHESS: // 棋子
ChessMod := p.PlayMod.getChessMod() ChessMod := p.PlayMod.getChessMod()
if v.Num < 0 {
err := ChessMod.LosePart(v.Id, -v.Num)
if err != nil {
return err
}
p.TeLog("chess_part_consume", map[string]interface{}{
"chess_id": v.Id,
"chess_name": mergeDataCfg.GetNameById(v.Id),
"consume_num": -v.Num,
"remain_num": ChessMod.PartBag.List[v.Id].Num,
"consume_from": Label,
})
continue
}
for i := 0; i < v.Num; i++ { for i := 0; i < v.Num; i++ {
ChessMod.AddChessBuff(v.Id) ChessMod.AddChessBuff(v.Id)
} }
@ -693,7 +702,7 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
case item.ITEM_TYPE_PLAYROOM_DECORATION: // playroom装饰 case item.ITEM_TYPE_PLAYROOM_DECORATION: // playroom装饰
Effect := itemCfg.GetItemEffect(v.Id) Effect := itemCfg.GetItemEffect(v.Id)
PlayroomMod := p.PlayMod.getPlayroomMod() PlayroomMod := p.PlayMod.getPlayroomMod()
PlayroomMod.AddCollect(Effect) PlayroomMod.AddCollect(Effect, Label)
BackDataType[item.ITEM_TYPE_PLAYROOM_DECORATION] = struct{}{} BackDataType[item.ITEM_TYPE_PLAYROOM_DECORATION] = struct{}{}
Type, Name := playroomCfg.GetDecoInfo(Effect) Type, Name := playroomCfg.GetDecoInfo(Effect)
p.TeLog("room_deco_get", map[string]interface{}{ p.TeLog("room_deco_get", map[string]interface{}{
@ -704,7 +713,7 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
case item.ITEM_TYPE_PLAYROOM_DRESS: // playroom服饰 case item.ITEM_TYPE_PLAYROOM_DRESS: // playroom服饰
Effect := itemCfg.GetItemEffect(v.Id) Effect := itemCfg.GetItemEffect(v.Id)
PlayroomMod := p.PlayMod.getPlayroomMod() PlayroomMod := p.PlayMod.getPlayroomMod()
PlayroomMod.AddDress(Effect) PlayroomMod.AddDress(Effect, Label)
BackDataType[item.ITEM_TYPE_PLAYROOM_DRESS] = struct{}{} BackDataType[item.ITEM_TYPE_PLAYROOM_DRESS] = struct{}{}
Type := playroomCfg.GetDressPart(Effect) Type := playroomCfg.GetDressPart(Effect)
Name := playroomCfg.GetDressName(Effect) Name := playroomCfg.GetDressName(Effect)
@ -720,7 +729,7 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
if v == 0 { if v == 0 {
continue continue
} }
PlayroomMod.AddCollect(v) PlayroomMod.AddCollect(v, Label)
Type, Name := playroomCfg.GetDecoInfo(v) Type, Name := playroomCfg.GetDecoInfo(v)
p.TeLog("room_deco_get", map[string]interface{}{ p.TeLog("room_deco_get", map[string]interface{}{
"room_deco_type": Type, "room_deco_type": Type,
@ -800,7 +809,9 @@ func (p *Player) LoginBackData() {
p.PushClientRes(p.PlayMod.mod_list.Item.BackData()) p.PushClientRes(p.PlayMod.mod_list.Item.BackData())
p.PushClientRes(p.GetPlayerBaseMod().BackAsset()) p.PushClientRes(p.GetPlayerBaseMod().BackAsset())
p.PushClientRes(p.PlayMod.mod_list.Kv.BackData()) p.PushClientRes(p.PlayMod.mod_list.Kv.BackData())
p.PushClientRes(p.PlayMod.mod_list.GuideTask.BackData())
p.PushClientRes(p.PlayMod.mod_list.Friend.BubbleBackData()) p.PushClientRes(p.PlayMod.mod_list.Friend.BubbleBackData())
p.PushClientRes(p.PlayMod.mod_list.Guide.BackData())
p.BackDataActivity() p.BackDataActivity()
BackChampship(p) BackChampship(p)
BackUserInfo(p) BackUserInfo(p)

View File

@ -11,6 +11,7 @@ import (
"server/game/mod/item" "server/game/mod/item"
"server/game/mod/limitedTimeEvent" "server/game/mod/limitedTimeEvent"
Msg "server/game/mod/msg" Msg "server/game/mod/msg"
"server/game/mod/order"
"server/game/mod/quest" "server/game/mod/quest"
"server/msg" "server/msg"
"server/pkg/github.com/name5566/leaf/log" "server/pkg/github.com/name5566/leaf/log"
@ -467,6 +468,9 @@ func (p *PlayerBaseData) AddStar(player *Player, cnt int) error {
if NewStar < 0 { if NewStar < 0 {
return errors.New("星星不足") return errors.New("星星不足")
} }
if cnt > 0 {
player.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_STAR, A: []interface{}{cnt}})
}
BaseMod.Star = NewStar BaseMod.Star = NewStar
player.UpdateUserInfo() player.UpdateUserInfo()
return nil return nil
@ -516,10 +520,16 @@ func (p *PlayerBaseData) AddExp(player *Player, exp int, pexp int) (int, error)
if ChessMod.TriggerChessBagUnlock(int(BaseMod.Level)) { if ChessMod.TriggerChessBagUnlock(int(BaseMod.Level)) {
player.PushClientRes(ChessMod.BackData()) player.PushClientRes(ChessMod.BackData())
} }
GuideTaskMod := player.PlayMod.getGuideTaskMod()
if GuideTaskMod.Unlock(BaseMod.Level) {
player.PushClientRes(GuideTaskMod.BackData())
}
ChargeMod := player.PlayMod.getChargeMod() ChargeMod := player.PlayMod.getChargeMod()
ChargeMod.TriggerChargeUnlock(int(BaseMod.Level), ChessMod.GetEmitList()) ChargeMod.TriggerChargeUnlock(int(BaseMod.Level), ChessMod.GetEmitList())
player.PushClientRes(ChargeMod.BackData()) player.PushClientRes(ChargeMod.BackData())
OrderMod := player.PlayMod.getOrderMod()
OrderMod.TriggerOrder(BaseMod.Level, order.TRIGGER_TYPE_LV, ChessMod.GetOrderEmit(), player.PlayMod.getBaseMod().GetEnergyMul())
player.PushClientRes(OrderMod.BackData())
// 重载活动 // 重载活动
player.initAcitivity() player.initAcitivity()
player.BackDataActivity() player.BackDataActivity()

View File

@ -57,8 +57,9 @@ func (p *PlayerChessData) ResChessColorData(player *Player) {
func (p *PlayerChessData) UpdatePlayerChessData(player *Player, buf []byte) error { func (p *PlayerChessData) UpdatePlayerChessData(player *Player, buf []byte) error {
update := &msg.UpdatePlayerChessData{} update := &msg.UpdatePlayerChessData{}
proto.Unmarshal(buf, update) proto.Unmarshal(buf, update)
err := p.HandleChess(player, update.MChessHandle)
LastMap := player.PlayMod.getChessMod().ChessMap LastMap := player.PlayMod.getChessMod().ChessMap
AddChessList, AddNewEmit, err := p.HandleChess(player, update.MChessHandle)
if err != nil { if err != nil {
res := &msg.ResUpdatePlayerChessData{ res := &msg.ResUpdatePlayerChessData{
Code: msg.RES_CODE_FAIL, Code: msg.RES_CODE_FAIL,
@ -98,7 +99,14 @@ func (p *PlayerChessData) UpdatePlayerChessData(player *Player, buf []byte) erro
}) })
return fmt.Errorf("棋子数据不一致") return fmt.Errorf("棋子数据不一致")
} }
player.PlayMod.getChessMod().ChessMap = update.MChessData ChessMod := player.PlayMod.getChessMod()
BaseMod := player.PlayMod.getBaseMod()
OrderMod := player.PlayMod.getOrderMod()
ChessMod.ChessMap = update.MChessData
Update := OrderMod.CreateExtraOrder(AddChessList, AddNewEmit, ChessMod.GetUnlockChessList(), BaseMod.GetEnergyMul(), BaseMod.GetLevel())
if Update {
player.PushClientRes(OrderMod.BackData())
}
return nil return nil
} }
@ -142,7 +150,7 @@ func (p *PlayerChessData) checkChessEqual(player *Player) bool {
} }
// 棋子操作 // 棋子操作
func (p *PlayerChessData) HandleChess(player *Player, handle_list []*msg.ChessHandle) error { func (p *PlayerChessData) HandleChess(player *Player, handle_list []*msg.ChessHandle) ([]int, []int, error) {
sort.Slice(handle_list, func(i, j int) bool { sort.Slice(handle_list, func(i, j int) bool {
return handle_list[i].Id < handle_list[j].Id return handle_list[i].Id < handle_list[j].Id
}) })
@ -156,6 +164,7 @@ func (p *PlayerChessData) HandleChess(player *Player, handle_list []*msg.ChessHa
itemList := make([]*item.Item, 0) itemList := make([]*item.Item, 0)
AddChessList := make([]int, 0) AddChessList := make([]int, 0)
AddNewEmit := make([]int, 0) AddNewEmit := make([]int, 0)
EmitList := ChessMod.GetEmitList()
for _, v := range handle_list { for _, v := range handle_list {
ChessId := int(v.ChessId) ChessId := int(v.ChessId)
EmitId := int(v.Emit) EmitId := int(v.Emit)
@ -163,7 +172,7 @@ func (p *PlayerChessData) HandleChess(player *Player, handle_list []*msg.ChessHa
case msg.HANDLE_TYPE_ADD: //增加棋子 case msg.HANDLE_TYPE_ADD: //增加棋子
err := ChessMod.AddChess(ChessId) err := ChessMod.AddChess(ChessId)
if err != nil { if err != nil {
return err return nil, nil, err
} }
Type := mergeDataCfg.GetTypeById(ChessId) Type := mergeDataCfg.GetTypeById(ChessId)
AddChessList = append(AddChessList, ChessId) AddChessList = append(AddChessList, ChessId)
@ -183,7 +192,7 @@ func (p *PlayerChessData) HandleChess(player *Player, handle_list []*msg.ChessHa
case msg.HANDLE_TYPE_COMPOSE: //合成棋子 case msg.HANDLE_TYPE_COMPOSE: //合成棋子
NewChessId, err := ChessMod.ComposeChess(ChessId) NewChessId, err := ChessMod.ComposeChess(ChessId)
if err != nil { if err != nil {
return err return nil, nil, err
} }
HandbookMod := player.PlayMod.getHandbookMod() // 添加图鉴 HandbookMod := player.PlayMod.getHandbookMod() // 添加图鉴
b := HandbookMod.SetHandbook(NewChessId) b := HandbookMod.SetHandbook(NewChessId)
@ -202,8 +211,9 @@ func (p *PlayerChessData) HandleChess(player *Player, handle_list []*msg.ChessHa
case msg.HANDLE_TYPE_BUY: //购买棋子 case msg.HANDLE_TYPE_BUY: //购买棋子
loseGold, err := ChessMod.BuyChess(ChessId) loseGold, err := ChessMod.BuyChess(ChessId)
if err != nil { if err != nil {
return err return nil, nil, err
} }
AddChessList = append(AddChessList, ChessId)
buyChess += loseGold buyChess += loseGold
itemList = append(itemList, &item.Item{Id: item.ITEM_STAR_ID, Num: int(-loseGold)}) itemList = append(itemList, &item.Item{Id: item.ITEM_STAR_ID, Num: int(-loseGold)})
case msg.HANDLE_TYPE_SELL: //出售棋子 case msg.HANDLE_TYPE_SELL: //出售棋子
@ -221,7 +231,7 @@ func (p *PlayerChessData) HandleChess(player *Player, handle_list []*msg.ChessHa
LimitPush = true LimitPush = true
} }
if err != nil { if err != nil {
return err return nil, nil, err
} }
player.TeLog("sell_item", map[string]interface{}{ player.TeLog("sell_item", map[string]interface{}{
"merge_item_id": ChessId, "merge_item_id": ChessId,
@ -233,7 +243,6 @@ func (p *PlayerChessData) HandleChess(player *Player, handle_list []*msg.ChessHa
} }
} }
//扣除体力 //扣除体力
EnergyPow := BaseMod.GetEnergyMul() EnergyPow := BaseMod.GetEnergyMul()
ReduceEneny := 0 ReduceEneny := 0
@ -243,13 +252,25 @@ func (p *PlayerChessData) HandleChess(player *Player, handle_list []*msg.ChessHa
} }
err := player.HandleItem(itemList, msg.ITEM_POP_LABEL_HandleChess.String()) err := player.HandleItem(itemList, msg.ITEM_POP_LABEL_HandleChess.String())
if err != nil { if err != nil {
return err return nil, nil, 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() OrderMod := player.PlayMod.getOrderMod()
Update := OrderMod.CreateExtraOrder(AddChessList, AddNewEmit, ChessMod.GetUnlockChessList(), EnergyPow) if !GoUtil.SlicesEqualString(EmitProductList, NewEmitProductList) {
if Update { // 发射器系列变化,重新洗牌
player.PushClientRes(OrderMod.BackData()) OrderMod.ResetChessPool()
} }
// 限时事件 小猫戏法 // 限时事件 小猫戏法
LimitedTimeEventMod := player.PlayMod.getLimitedTimeEventMod() LimitedTimeEventMod := player.PlayMod.getLimitedTimeEventMod()
if LimitedTimeEventMod.CheckExist(limitedTimeEvent.EVENT_TYPE_CAT_TRICK) { if LimitedTimeEventMod.CheckExist(limitedTimeEvent.EVENT_TYPE_CAT_TRICK) {
@ -263,7 +284,7 @@ func (p *PlayerChessData) HandleChess(player *Player, handle_list []*msg.ChessHa
EmitRetireTrigger1(player) EmitRetireTrigger1(player)
player.PushClientRes(ChessMod.BackData()) player.PushClientRes(ChessMod.BackData())
player.PlayMod.save() player.PlayMod.save()
return nil return AddChessList, AddNewEmit, nil
} }
func (p *PlayerChessData) ClearData() bool { func (p *PlayerChessData) ClearData() bool {

View File

@ -14,6 +14,7 @@ import (
limitedTimeEventCfg "server/conf/limitedTimeEvent" limitedTimeEventCfg "server/conf/limitedTimeEvent"
mailCfg "server/conf/mail" mailCfg "server/conf/mail"
mergeDataCfg "server/conf/mergeData" mergeDataCfg "server/conf/mergeData"
orderCfg "server/conf/order"
playroomCfg "server/conf/playroom" playroomCfg "server/conf/playroom"
userCfg "server/conf/user" userCfg "server/conf/user"
"server/db" "server/db"
@ -774,7 +775,7 @@ func GetVisitorPlayer(p *Player) int {
continue continue
} }
PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(v.Uid) PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(v.Uid)
if PlayerSimpleData.Level < 6 { if PlayerSimpleData.Level < 15 {
continue continue
} }
PlayerList4 = append(PlayerList4, v.Uid) PlayerList4 = append(PlayerList4, v.Uid)
@ -854,6 +855,7 @@ func EmitRetireTrigger1(p *Player) {
func EmitRetireTrigger2(p *Player) { func EmitRetireTrigger2(p *Player) {
ChessMod := p.PlayMod.getChessMod() ChessMod := p.PlayMod.getChessMod()
OrderMod := p.PlayMod.getOrderMod() OrderMod := p.PlayMod.getOrderMod()
BaseMod := p.PlayMod.getBaseMod()
OrderList := OrderMod.GetOrderList() OrderList := OrderMod.GetOrderList()
AllChess := make(map[string]struct{}, 0) AllChess := make(map[string]struct{}, 0)
for _, v := range OrderList { for _, v := range OrderList {
@ -870,6 +872,11 @@ func EmitRetireTrigger2(p *Player) {
if v != 1 { if v != 1 {
continue continue
} }
RetireLv := mergeDataCfg.GetEmitRetire(k)
if RetireLv > BaseMod.GetLevel() {
continue
}
NeedFinishOrder := false NeedFinishOrder := false
Produce := mergeDataCfg.GetEmitProduce(k) Produce := mergeDataCfg.GetEmitProduce(k)
for _, v1 := range Produce { for _, v1 := range Produce {
@ -982,6 +989,8 @@ func (player *Player) FormatOrderReward() {
Exp, PExp := userCfg.GetLevUpExp(player.GetPlayerBaseMod().GetLevel()) Exp, PExp := userCfg.GetLevUpExp(player.GetPlayerBaseMod().GetLevel())
BaseMod := player.PlayMod.getBaseMod() BaseMod := player.PlayMod.getBaseMod()
DecorateMod := player.PlayMod.getDecorateMod() DecorateMod := player.PlayMod.getDecorateMod()
ChessMod := player.PlayMod.getChessMod()
OrderFactor := orderCfg.GetOrderFactor(DecorateMod.GetAreaId())
ExpCoin := (Exp-BaseMod.GetExp())*decorateCfg.GetAreaPerPExp(DecorateMod.GetAreaId()) - BaseMod.GetStar() ExpCoin := (Exp-BaseMod.GetExp())*decorateCfg.GetAreaPerPExp(DecorateMod.GetAreaId()) - BaseMod.GetStar()
PExpCoin := (PExp-BaseMod.GetPExp())*50 - player.GetPetOrderItemExp() PExpCoin := (PExp-BaseMod.GetPExp())*50 - player.GetPetOrderItemExp()
OrderMod := player.PlayMod.getOrderMod() OrderMod := player.PlayMod.getOrderMod()
@ -994,6 +1003,7 @@ func (player *Player) FormatOrderReward() {
continue continue
} }
Star := order.GetOrderStar(v.MergeId) Star := order.GetOrderStar(v.MergeId)
Star = int(float64(Star)*float64(OrderFactor)/10) * 10
v.Items = append(v.Items, &item.Item{ v.Items = append(v.Items, &item.Item{
Id: item.ITEM_STAR_ID, Id: item.ITEM_STAR_ID,
Num: Star, Num: Star,
@ -1011,6 +1021,7 @@ func (player *Player) FormatOrderReward() {
} }
Items := make([]*item.Item, 0) Items := make([]*item.Item, 0)
Star := order.GetOrderStar(v.MergeId) Star := order.GetOrderStar(v.MergeId)
Star = int(float64(Star)*float64(OrderFactor)/10) * 10
Items = player.GetPetOrderReward(Star, Items) Items = player.GetPetOrderReward(Star, Items)
if len(Items) == 1 && Items[0].Id == item.ITEM_STAR_ID { if len(Items) == 1 && Items[0].Id == item.ITEM_STAR_ID {
v.Type = order.Common_type v.Type = order.Common_type
@ -1020,6 +1031,35 @@ func (player *Player) FormatOrderReward() {
v.Items = Items v.Items = Items
OrderMod.OrderList[k] = v 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 = []*item.Item{item.NewItem(item.ITEM_LAUNCHER_ID, 2)}
v.Type = order.Part_type
OrderMod.OrderList[k] = v
break
}
}
} }
func (player *Player) GetPetOrderReward(Star int, Items []*item.Item) []*item.Item { func (player *Player) GetPetOrderReward(Star int, Items []*item.Item) []*item.Item {

View File

@ -25,6 +25,7 @@ import (
"server/game/mod/friendTreasure.go" "server/game/mod/friendTreasure.go"
guesscolor "server/game/mod/guessColor" guesscolor "server/game/mod/guessColor"
"server/game/mod/guide" "server/game/mod/guide"
"server/game/mod/guideTask"
"server/game/mod/handbook" "server/game/mod/handbook"
"server/game/mod/invite" "server/game/mod/invite"
"server/game/mod/item" "server/game/mod/item"
@ -82,6 +83,7 @@ type PlayerModList struct {
Activity activity.Activity // 活动 Activity activity.Activity // 活动
Compensation compensation.Compensation // 补偿 Compensation compensation.Compensation // 补偿
Catnip catnip.CatnipMod // 猫草大作战 Catnip catnip.CatnipMod // 猫草大作战
GuideTask guideTask.GuideTaskMod // 引导任务
} }
func (p *PlayerModData) LoadDataFromDB(dwUin interface{}) bool { func (p *PlayerModData) LoadDataFromDB(dwUin interface{}) bool {
@ -180,6 +182,8 @@ func (p *PlayerModData) InitMod(player *Player) (bool, error) {
p.ModList.Collect.InitData() p.ModList.Collect.InitData()
p.ModList.Activity.InitData() p.ModList.Activity.InitData()
p.ModList.Catnip.InitData() p.ModList.Catnip.InitData()
p.ModList.Compensation.InitData()
p.ModList.GuideTask.InitData()
return is_update, nil return is_update, nil
} }
@ -378,3 +382,6 @@ func (p *PlayerMod) getCompensationMod() *compensation.Compensation {
func (p *PlayerMod) getCatnipMod() *catnip.CatnipMod { func (p *PlayerMod) getCatnipMod() *catnip.CatnipMod {
return &p.mod_list.Catnip return &p.mod_list.Catnip
} }
func (p *PlayerMod) getGuideTaskMod() *guideTask.GuideTaskMod {
return &p.mod_list.GuideTask
}

View File

@ -230,26 +230,10 @@ func ReqRewardOrder(player *Player, buf []byte) error {
proto.Unmarshal(buf, req) proto.Unmarshal(buf, req)
OrderMod := player.PlayMod.getOrderMod() OrderMod := player.PlayMod.getOrderMod()
ChessMod := player.PlayMod.getChessMod() ChessMod := player.PlayMod.getChessMod()
PlayroomMod := player.PlayMod.getPlayroomMod()
LimitedTimeEventMod := player.PlayMod.getLimitedTimeEventMod() LimitedTimeEventMod := player.PlayMod.getLimitedTimeEventMod()
Item, mergeList, OrderType, Star, err := OrderMod.RewardOrder(int(req.OrderId)) Item, mergeList, OrderType, Star, err := OrderMod.RewardOrder(int(req.OrderId))
ActItem := GetActivityItem(player, GoUtil.Int32ToInt(req.ActType)) ActItem := GetActivityItem(player, GoUtil.Int32ToInt(req.ActType))
Item = item.Merge(Item, ActItem) Item = item.Merge(Item, ActItem)
if OrderType == order.Trigger_type { // playroom触发式订单获取额外道具
Item1 := PlayroomMod.GetReward()
Item = item.Merge(Item, Item1)
IdList := playroomCfg.GetPremiumItem()
if GoUtil.InArray(Item[0].Id, IdList) {
Star = int(math.Ceil(float64(Star) * 0.8))
} else {
Star = int(math.Ceil(float64(Star) * 0.6))
}
Target := GetVisitorPlayer(player)
PlayroomMod.Target = Target
PlayroomMod.Status = playroom.STATUS_VISIT
PlayroomBackData(player)
}
if !OrderMod.CheckSuperOrder() { if !OrderMod.CheckSuperOrder() {
if LimitedTimeEventMod.RemoveSuperOrder() { if LimitedTimeEventMod.RemoveSuperOrder() {
player.PushClientRes(&msg.LimitEventNotify{ player.PushClientRes(&msg.LimitEventNotify{
@ -353,19 +337,20 @@ func ReqRewardOrder(player *Player, buf []byte) error {
EnergyMul := player.PlayMod.getBaseMod().GetEnergyMul() EnergyMul := player.PlayMod.getBaseMod().GetEnergyMul()
Emit := ChessMod.GetOrderEmit() Emit := ChessMod.GetOrderEmit()
TriggerSeedSource(player) TriggerSeedSource(player)
NewOrder := TriggerSeedOrder(player) //NewOrder := TriggerSeedOrder(player)
if NewOrder == nil || len(NewOrder.MergeId) == 0 { // if NewOrder == nil || len(NewOrder.MergeId) == 0 {
OrderMod.CreateOrder(Lv, Emit, EnergyMul) // OrderMod.CreateOrder(Lv, Emit, EnergyMul)
} else { // } else {
OrderMod.CreateOrderSeed(NewOrder) // OrderMod.CreateOrderSeed(NewOrder)
} // }
OrderMod.TriggerOrder(Lv, order.TRIGGER_TYPE_ORDER, Emit, EnergyMul)
player.FormatOrderReward() player.FormatOrderReward()
// 存钱罐增加钻石 // 存钱罐增加钻石
PiggyBankMod := player.PlayMod.getPiggyBankMod() PiggyBankMod := player.PlayMod.getPiggyBankMod()
PiggyBankMod.Trigger() PiggyBankMod.Trigger()
// 锦标赛增加积分 // 锦标赛增加积分
if player.GetPlayerBaseMod().GetLevel() >= 6 { if player.GetPlayerBaseMod().GetLevel() >= 17 {
ChampshipMod := player.PlayMod.getChampshipMod() ChampshipMod := player.PlayMod.getChampshipMod()
ChampshipMod.AddScore(mergeList) ChampshipMod.AddScore(mergeList)
player.HandleInChampshipRank() player.HandleInChampshipRank()
@ -419,7 +404,7 @@ func ReqDecorate(player *Player, buf []byte) error {
DecorateId := int(req.DecorateId) DecorateId := int(req.DecorateId)
AreaId := int(req.AreaId) AreaId := int(req.AreaId)
CostItem, PetExp := DecorateMod.GetDecorateCostItem(AreaId, DecorateId) CostItem, PetExp := DecorateMod.GetDecorateCostItem(AreaId, DecorateId)
err := player.HandleItem(CostItem, msg.ITEM_POP_LABEL_DecorateCost.String()) // 扣除道具 err := player.HandleLoseItem(CostItem, msg.ITEM_POP_LABEL_DecorateCost.String()) // 扣除道具
if err != nil { if err != nil {
player.SendErrClienRes(&msg.ResDecorate{ player.SendErrClienRes(&msg.ResDecorate{
Code: msg.RES_CODE_FAIL, Code: msg.RES_CODE_FAIL,
@ -435,7 +420,7 @@ func ReqDecorate(player *Player, buf []byte) error {
}) })
return err return err
} }
player.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_DECORATE, A: []interface{}{1}})
EnergyItem := DecorateMod.GetDecorateAddEnergy(1) EnergyItem := DecorateMod.GetDecorateAddEnergy(1)
AddItem = item.Merge(AddItem, EnergyItem) AddItem = item.Merge(AddItem, EnergyItem)
err = player.HandleItem(AddItem, msg.ITEM_POP_LABEL_DecorateAdd.String()) // 增加道具 err = player.HandleItem(AddItem, msg.ITEM_POP_LABEL_DecorateAdd.String()) // 增加道具
@ -496,7 +481,7 @@ func ReqDecorateAll(player *Player, buf []byte) error {
} }
PlayerBaseMod := player.GetPlayerBaseMod() PlayerBaseMod := player.GetPlayerBaseMod()
CostItem, AddItem, DecorateNum, DecorateList, Log, PetExp := DecorateMod.DecorateAll(PlayerBaseMod.GetStar()) CostItem, AddItem, DecorateNum, DecorateList, Log, PetExp := DecorateMod.DecorateAll(PlayerBaseMod.GetStar())
err := player.HandleItem(CostItem, msg.ITEM_POP_LABEL_DecorateCost.String()) // 扣除道具 err := player.HandleLoseItem(CostItem, msg.ITEM_POP_LABEL_DecorateCost.String()) // 扣除道具
if err != nil { if err != nil {
player.SendErrClienRes(&msg.ResDecorateAll{ player.SendErrClienRes(&msg.ResDecorateAll{
Code: msg.RES_CODE_FAIL, Code: msg.RES_CODE_FAIL,
@ -504,6 +489,7 @@ func ReqDecorateAll(player *Player, buf []byte) error {
}) })
return err return err
} }
player.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_DECORATE, A: []interface{}{DecorateNum}})
EnergyItem := DecorateMod.GetDecorateAddEnergy(DecorateNum) EnergyItem := DecorateMod.GetDecorateAddEnergy(DecorateNum)
AddItem = item.Merge(AddItem, EnergyItem) AddItem = item.Merge(AddItem, EnergyItem)
err = player.HandleItem(AddItem, msg.ITEM_POP_LABEL_DecorateAdd.String()) // 增加道具 err = player.HandleItem(AddItem, msg.ITEM_POP_LABEL_DecorateAdd.String()) // 增加道具
@ -514,7 +500,6 @@ func ReqDecorateAll(player *Player, buf []byte) error {
}) })
return err return err
} }
_, err = player.GetPlayerBaseMod().AddExp(player, 10*DecorateNum, PetExp) _, err = player.GetPlayerBaseMod().AddExp(player, 10*DecorateNum, PetExp)
if err != nil { if err != nil {
player.SendErrClienRes(&msg.ResDecorateAll{ player.SendErrClienRes(&msg.ResDecorateAll{
@ -625,7 +610,7 @@ func ReqGetChessFromBuff(player *Player, buf []byte) error {
player.TeLog("ReqGetChessFromBuff", map[string]interface{}{ player.TeLog("ReqGetChessFromBuff", map[string]interface{}{
"chess_id": ChessId, "chess_id": ChessId,
}) })
Update = OrderMod.CreateExtraOrder([]int{ChessId}, AddNewEmit, ChessMod.GetUnlockChessList(), BaseMod.GetEnergyMul()) Update = OrderMod.CreateExtraOrder([]int{ChessId}, AddNewEmit, ChessMod.GetUnlockChessList(), BaseMod.GetEnergyMul(), BaseMod.GetLevel())
if Update { if Update {
player.PushClientRes(OrderMod.BackData()) player.PushClientRes(OrderMod.BackData())
} }
@ -640,6 +625,40 @@ func ReqGetChessFromBuff(player *Player, buf []byte) error {
return nil return nil
} }
// 放置棋子进背包
func ReqPutPartInBag(player *Player, buf []byte) error {
req := &msg.ReqPutPartInBag{}
proto.Unmarshal(buf, req)
ChessMod := player.PlayMod.getChessMod()
err := ChessMod.PutPartInBag(int(req.ChessId))
if err != nil {
player.SendErrClienRes(&msg.ResPutPartInBag{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
data := &PlayerChessData{}
err = data.UpdateChessData(player, req.MChessData)
if err != nil {
player.SendErrClienRes(&msg.ResPutPartInBag{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.TeLog("ReqPutPartInBag", map[string]interface{}{
"chess_id": req.ChessId,
})
player.PlayMod.save()
player.PushClientRes(ChessMod.BackData())
player.PushClientRes(&msg.ResPutPartInBag{
Code: msg.RES_CODE_SUCCESS,
})
player.UpdateUserInfo()
return nil
}
// 放置棋子进背包 // 放置棋子进背包
func ReqPutChessInBag(player *Player, buf []byte) error { func ReqPutChessInBag(player *Player, buf []byte) error {
req := &msg.ReqPutChessInBag{} req := &msg.ReqPutChessInBag{}
@ -697,6 +716,12 @@ func ReqTakeChessOutBag(player *Player, buf []byte) error {
}) })
return err return err
} }
OrderMod := player.PlayMod.getOrderMod()
BaseMod := player.PlayMod.getBaseMod()
Update := OrderMod.CreateExtraOrder([]int{ChessId}, nil, ChessMod.GetUnlockChessList(), BaseMod.GetEnergyMul(), BaseMod.GetLevel())
if Update {
player.PushClientRes(OrderMod.BackData())
}
player.TeLog("ReqTakeChessOutBag", map[string]interface{}{ player.TeLog("ReqTakeChessOutBag", map[string]interface{}{
"bag_id": req.BagId, "bag_id": req.BagId,
"chess_id": ChessId, "chess_id": ChessId,
@ -841,6 +866,7 @@ func ReqChessEx(player *Player, buf []byte) error {
}) })
return err return err
} }
player.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_BUBBLE, A: []interface{}{}})
} }
err := ChessMod.ExChess(int(req.OldChessId), int(req.NewChessId)) err := ChessMod.ExChess(int(req.OldChessId), int(req.NewChessId))
@ -1223,6 +1249,74 @@ func ReqDailyUnlock(player *Player, buf []byte) error {
return nil return nil
} }
func ReqGetGuideTaskReward(player *Player, buf []byte) error {
req := &msg.ReqGetGuideTaskReward{}
proto.Unmarshal(buf, req)
GuideTaskMod := player.PlayMod.getGuideTaskMod()
itemList, err := GuideTaskMod.GetTaskReward(int(req.Id))
if err != nil {
player.SendErrClienRes(&msg.ResGetGuideTaskReward{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.args["ResItemPopId"] = int(req.Id)
err = player.HandleItem(itemList, msg.ITEM_POP_LABEL_GuideTaskReward.String())
if err != nil {
player.SendErrClienRes(&msg.ResGetGuideTaskReward{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.TeLog("ReqGetGuideTaskReward", map[string]interface{}{
"task_id": int(req.Id),
"item_list": itemList,
})
player.PlayMod.save()
player.PushClientRes(GuideTaskMod.BackData())
player.PushClientRes(&msg.ResGetGuideTaskReward{
Code: msg.RES_CODE_SUCCESS,
Id: req.Id,
})
return nil
}
func ReqGetGuideActiveReward(player *Player, buf []byte) error {
req := &msg.ReqGetGuideActiveReward{}
proto.Unmarshal(buf, req)
GuideTaskMod := player.PlayMod.getGuideTaskMod()
itemList, err := GuideTaskMod.GetActiveReward(int(req.Id))
if err != nil {
player.SendErrClienRes(&msg.ResGetGuideActiveReward{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.args["ResItemPopId"] = int(req.Id)
err = player.HandleItem(itemList, msg.ITEM_POP_LABEL_GuideActiveReward.String())
if err != nil {
player.SendErrClienRes(&msg.ResGetGuideActiveReward{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.TeLog("ReqGetGuideActiveReward", map[string]interface{}{
"active_id": int(req.Id),
"item_list": itemList,
})
player.PlayMod.save()
player.PushClientRes(GuideTaskMod.BackData())
player.PushClientRes(&msg.ResGetGuideActiveReward{
Code: msg.RES_CODE_SUCCESS,
Id: req.Id,
})
return nil
}
// 头像框 // 头像框
func ReqSetAvatar(player *Player, buf []byte) error { func ReqSetAvatar(player *Player, buf []byte) error {
req := &msg.ReqSetAvatar{} req := &msg.ReqSetAvatar{}
@ -3318,6 +3412,8 @@ func ReqPlayroomInteract(player *Player, buf []byte) error {
Msg: err.Error(), Msg: err.Error(),
}) })
} }
BaseMod := player.PlayMod.getBaseMod()
PlayroomMod.AddInteractNum(BaseMod.GetLevel())
player.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_INTERACT, A: []interface{}{int(req.Id)}}) player.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_INTERACT, A: []interface{}{int(req.Id)}})
player.PlayMod.save() player.PlayMod.save()
G_GameLogicPtr.SetUserData(int(player.M_DwUin), VAR_OP_KISS, 0) G_GameLogicPtr.SetUserData(int(player.M_DwUin), VAR_OP_KISS, 0)
@ -4232,12 +4328,10 @@ func ReqCollect(player *Player, buf []byte) error {
func ReqSellChessNum(player *Player, buf []byte) error { func ReqSellChessNum(player *Player, buf []byte) error {
req := &msg.ReqSellChessNum{} req := &msg.ReqSellChessNum{}
proto.Unmarshal(buf, req) proto.Unmarshal(buf, req)
BaseMod := player.PlayMod.getBaseMod()
ChessMod := player.PlayMod.getChessMod()
data, _ := mergeDataCfg.GetOne(int(req.ChessId)) data, _ := mergeDataCfg.GetOne(int(req.ChessId))
Num := data.SellNum Num := data.SellNum
limitedTimeEventMod := player.PlayMod.getLimitedTimeEventMod() limitedTimeEventMod := player.PlayMod.getLimitedTimeEventMod()
if checkChess(int(req.ChessId), BaseMod.GetEnergyMul(), ChessMod.GetEmitList()) || limitedTimeEventMod.CheckExist(limitedTimeEvent.EVENT_TYPE_PAYBACK_DAY) { if limitedTimeEventMod.CheckExist(limitedTimeEvent.EVENT_TYPE_PAYBACK_DAY) {
Num = data.Star Num = data.Star
} }
player.PushClientRes(&msg.ResSellChessNum{ player.PushClientRes(&msg.ResSellChessNum{

View File

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

View File

@ -4,9 +4,9 @@ import (
"fmt" "fmt"
"math" "math"
mergeDataCfg "server/conf/mergeData" mergeDataCfg "server/conf/mergeData"
"server/game/mod/decorate"
"server/game/mod/order" "server/game/mod/order"
"server/game/mod/quest" "server/game/mod/quest"
"server/game/mod/sevenLogin"
"server/msg" "server/msg"
"server/pkg/github.com/name5566/leaf/log" "server/pkg/github.com/name5566/leaf/log"
"time" "time"
@ -41,15 +41,16 @@ func UnitChessShop(p *Player) error {
func UnitOrder(p *Player) error { func UnitOrder(p *Player) error {
OrderMod := p.PlayMod.getOrderMod() OrderMod := p.PlayMod.getOrderMod()
ChessMod := p.PlayMod.getChessMod() // ChessMod := p.PlayMod.getChessMod()
BaseMod := p.PlayMod.getBaseMod() // BaseMod := p.PlayMod.getBaseMod()
OrderMod.OrderList = make(map[int]order.Order) OrderMod.OrderList = make(map[int]order.Order)
for i := 0; i < 1000; i++ { for i := 0; i < 1000; i++ {
err := OrderMod.CreateNormalOrder(BaseMod.GetLevel(), ChessMod.GetEmitList(), BaseMod.EnergyMul) err := OrderMod.CreateNormalOrder(17, []int{87, 109, 145, 170, 189}, 2)
if err != nil { if err != nil {
return err return err
} }
} }
p.FormatOrderReward()
return nil return nil
} }
@ -77,16 +78,14 @@ func UnitChess(p *Player) error {
} }
func UnitDecorate(p *Player) error { func UnitDecorate(p *Player) error {
PlayerBaseMod := p.GetPlayerBaseMod()
PlayerBaseMod.Data.Level = 6
PlayerBaseMod.Data.Exp = 50
PlayerBaseMod.AddExp(p, 100, 0)
return nil return nil
} }
func UnitSevenMonthReward(p *Player) error { func UnitSevenMonthReward(p *Player) error {
i := sevenLogin.F() ChargeMod := p.PlayMod.getChargeMod()
fmt.Print(i) BaseMod := p.PlayMod.getBaseMod()
ChessMod := p.PlayMod.getChessMod()
ChargeMod.TriggerChargeUnlock(int(BaseMod.Level), ChessMod.GetEmitList())
return nil return nil
} }
@ -207,8 +206,8 @@ func UnitChess1(p *Player) error {
} }
func UnitPlayroom(p *Player) error { func UnitPlayroom(p *Player) error {
PlayroomMod := p.PlayMod.getPlayroomMod() //PlayroomMod := p.PlayMod.getPlayroomMod()
PlayroomMod.UnLock(15) //PlayroomMod.UnLock(15)
PlayroomBackData(p) PlayroomBackData(p)
return nil return nil
} }
@ -235,3 +234,42 @@ func UnitPetOrder(p *Player) error {
p.FormatOrderReward() p.FormatOrderReward()
return nil return nil
} }
func UnitDecoratePartCost(p *Player) error {
p.LoginBackData()
DecorateMod := p.PlayMod.getDecorateMod()
DecorateMod.AreaId = 3
DecorateMod.PartCost = make(map[int]*decorate.PartCostInfo)
DecorateMod.PartClassPool = []int{}
DecorateMod.PartPool = make(map[int]int)
DecorateMod.InitData()
Items, _ := DecorateMod.GetDecorateCostItem(1, 33)
err := p.HandleLoseItem(Items, "")
if err != nil {
fmt.Print(err)
}
return nil
ChessMod := p.PlayMod.getChessMod()
return ChessMod.PutPartInBag(1515)
}
func UnitOrderTrigger(p *Player) error {
OrderMod := p.PlayMod.getOrderMod()
BaseMod := p.PlayMod.getBaseMod()
Lv := int(BaseMod.Level)
ChessMod := p.PlayMod.getChessMod()
Emit := ChessMod.GetEmitList()
EnergyMul := BaseMod.GetEnergyMul()
OrderMod.TriggerOrder(Lv, order.TRIGGER_TYPE_ORDER, Emit, EnergyMul)
return nil
}
func UnitOrderExtra(p *Player) error {
OrderMod := p.PlayMod.getOrderMod()
BaseMod := p.PlayMod.getBaseMod()
ChessMod := p.PlayMod.getChessMod()
Update := OrderMod.CreateExtraOrder([]int{25}, nil, ChessMod.GetUnlockChessList(), BaseMod.GetEnergyMul(), BaseMod.GetLevel())
fmt.Print(Update)
return nil
}

View File

@ -191,6 +191,7 @@ func HandleClientReq(args []interface{}) {
EventName: "Login_log", EventName: "Login_log",
}) })
} }
p.(*Player).ProcessTrigger()
case "ReqServerTime": // 获取服务器时间 case "ReqServerTime": // 获取服务器时间
detail := &msg.ReqServerTime{} detail := &msg.ReqServerTime{}
proto.Unmarshal(buf, detail) proto.Unmarshal(buf, detail)

View File

@ -221,10 +221,10 @@ func (b *Base) SetLang(lang msg.LANG_TYPE) {
} }
func (b *Base) BuyEnergy(Energy int) ([]*item.Item, int, int) { func (b *Base) BuyEnergy(Energy int) ([]*item.Item, int, int) {
if !b.IsFirstBuy { // if !b.IsFirstBuy {
b.IsFirstBuy = true // b.IsFirstBuy = true
return []*item.Item{{Id: item.ITEM_ENERGY_ID, Num: 100}}, 100, 0 // return []*item.Item{{Id: item.ITEM_ENERGY_ID, Num: 100}}, 100, 0
} // }
b.EnergyBuy += 1 b.EnergyBuy += 1
Mul := baseCfg.GetEnergyByMul(b.EnergyBuy) Mul := baseCfg.GetEnergyByMul(b.EnergyBuy)
Diamond := int(float64(Energy) / Mul) Diamond := int(float64(Energy) / Mul)

View File

@ -2,11 +2,13 @@ package charge
import ( import (
"fmt" "fmt"
"math"
"server/GoUtil" "server/GoUtil"
chargeCfg "server/conf/charge" chargeCfg "server/conf/charge"
mergeDataCfg "server/conf/mergeData" mergeDataCfg "server/conf/mergeData"
playroomCfg "server/conf/playroom" playroomCfg "server/conf/playroom"
"server/game/mod/item" "server/game/mod/item"
"server/game/mod/order"
"server/msg" "server/msg"
"server/pkg/github.com/name5566/leaf/log" "server/pkg/github.com/name5566/leaf/log"
) )
@ -262,7 +264,14 @@ func (c *ChargeMod) BackData() *msg.ResCharge {
ChessId: int32(v.Id), ChessId: int32(v.Id),
} }
} }
resWish := &msg.WishList{}
if c.WishList != nil {
resWish = &msg.WishList{
Id: int32(c.WishList.ItemId),
Count: int32(c.WishList.Count),
Uid: c.WishList.SendList,
}
}
return &msg.ResCharge{ return &msg.ResCharge{
Charge: float32(c.Charge), Charge: float32(c.Charge),
Total: int32(c.Total), Total: int32(c.Total),
@ -276,11 +285,7 @@ func (c *ChargeMod) BackData() *msg.ResCharge {
SpecialChargeWeek: int32(GoUtil.FullWeeksSince(c.LastSpecialCharge)), SpecialChargeWeek: int32(GoUtil.FullWeeksSince(c.LastSpecialCharge)),
TodayCharge: float32(c.TodayCharge), TodayCharge: float32(c.TodayCharge),
MonthCharge: float32(c.MonthCharge), MonthCharge: float32(c.MonthCharge),
Wish: &msg.WishList{ Wish: resWish,
Id: int32(c.WishList.ItemId),
Count: int32(c.WishList.Count),
Uid: c.WishList.SendList,
},
} }
} }
@ -289,26 +294,44 @@ func (c *ChargeMod) InitChessShop(Emit []int) {
return return
} }
c.ChessShop = make(map[int]*ChessShop) c.ChessShop = make(map[int]*ChessShop)
ColorList := make([]string, 0) //ColorList := make([]string, 0)
RandList := make([]*Rand, 0)
for _, v := range Emit { for _, v := range Emit {
ProduceList := mergeDataCfg.GetEmitProduceType(v) ProduceList := mergeDataCfg.GetEmitProduceType(v)
ColorList = append(ColorList, ProduceList...) for _, p := range ProduceList {
} ChessList := order.GetChessByDiff(v, 1, order.DIFF_MID, p)
ColorType := mergeDataCfg.GetColorType(p)
RandList := make([]*Rand, 0) for _, c := range ChessList {
for _, v := range ColorList { if c == 0 {
ColorType := mergeDataCfg.GetColorType(v) continue
r := make([]*Rand, 0) }
switch ColorType { ChessLv := mergeDataCfg.GetLvById(c)
case mergeDataCfg.CHESS_PRODUCT_MAIN_TYPE: Diamond := int(math.Pow(2, float64(ChessLv-1)) / 2.5)
r = getChessMainRand(v) if ColorType == mergeDataCfg.CHESS_PRODUCT_SUB_TYPE {
case mergeDataCfg.CHESS_PRODUCT_SECONDARY_TYPE: Diamond = int(math.Pow(2, float64(ChessLv-1))/2.5 + 6.4)
r = getChessSecondaryRand(v) }
case mergeDataCfg.CHESS_PRODUCT_SUB_TYPE: if ColorType == mergeDataCfg.CHESS_PRODUCT_SECONDARY_TYPE {
r = getChessSubRand(v) Diamond *= 2
}
RandList = append(RandList, &Rand{ChessId: c, Diamond: Diamond})
}
} }
RandList = append(RandList, r...) //ColorList = append(ColorList, ProduceList...)
} }
// for _, v := range ColorList {
// ColorType := mergeDataCfg.GetColorType(v)
// r := make([]*Rand, 0)
// switch ColorType {
// case mergeDataCfg.CHESS_PRODUCT_MAIN_TYPE:
// r = getChessMainRand(v)
// case mergeDataCfg.CHESS_PRODUCT_SECONDARY_TYPE:
// r = getChessSecondaryRand(v)
// case mergeDataCfg.CHESS_PRODUCT_SUB_TYPE:
// r = getChessSubRand(v)
// }
// RandList = append(RandList, r...)
// }
randList := make([]interface{}, len(RandList)) randList := make([]interface{}, len(RandList))
for k, v := range RandList { for k, v := range RandList {
randList[k] = v randList[k] = v
@ -317,6 +340,9 @@ func (c *ChargeMod) InitChessShop(Emit []int) {
for k, v := range L { for k, v := range L {
Diamond := v.(*Rand).Diamond Diamond := v.(*Rand).Diamond
ChessId := v.(*Rand).ChessId ChessId := v.(*Rand).ChessId
if ChessId == 0 {
continue
}
c.ChessShop[k+1] = &ChessShop{Diamond: Diamond, Count: 5, Id: ChessId} c.ChessShop[k+1] = &ChessShop{Diamond: Diamond, Count: 5, Id: ChessId}
} }
} }
@ -339,10 +365,10 @@ func (c *ChargeMod) BuyChess(Chess int) ([]*item.Item, []*item.Item, int, error)
} }
func (c *ChargeMod) TriggerChargeUnlock(Lv int, Emit []int) { func (c *ChargeMod) TriggerChargeUnlock(Lv int, Emit []int) {
UnlockLv := chargeCfg.GetUnlockShopLv() //UnlockLv := chargeCfg.GetUnlockShopLv()
if Lv != UnlockLv { // if Lv != UnlockLv {
return // return
} // }
c.InitChessShop(Emit) c.InitChessShop(Emit)
} }

View File

@ -27,6 +27,9 @@ func getChessMainRand(Color string) []*Rand {
for i := 6; i <= 10; i++ { for i := 6; i <= 10; i++ {
Diamond := int(math.Pow(2, float64(i-1)) / 2.5) Diamond := int(math.Pow(2, float64(i-1)) / 2.5)
ChessId := mergeDataCfg.GetChessIdByLvAndColor(i, Color) ChessId := mergeDataCfg.GetChessIdByLvAndColor(i, Color)
if ChessId == 0 {
continue
}
r = append(r, &Rand{ChessId: ChessId, Diamond: Diamond}) r = append(r, &Rand{ChessId: ChessId, Diamond: Diamond})
} }
return r return r
@ -37,6 +40,9 @@ func getChessSecondaryRand(Color string) []*Rand {
for i := 5; i <= 9; i++ { for i := 5; i <= 9; i++ {
Diamond := int((math.Pow(2, float64(i-1)) / 2.5) * 2) Diamond := int((math.Pow(2, float64(i-1)) / 2.5) * 2)
ChessId := mergeDataCfg.GetChessIdByLvAndColor(i, Color) ChessId := mergeDataCfg.GetChessIdByLvAndColor(i, Color)
if ChessId == 0 {
continue
}
r = append(r, &Rand{ChessId: ChessId, Diamond: Diamond}) r = append(r, &Rand{ChessId: ChessId, Diamond: Diamond})
} }
return r return r
@ -47,6 +53,9 @@ func getChessSubRand(Color string) []*Rand {
for i := 5; i <= 9; i++ { for i := 5; i <= 9; i++ {
Diamond := int(math.Pow(2, float64(i-1))/2.5 + 6.4) Diamond := int(math.Pow(2, float64(i-1))/2.5 + 6.4)
ChessId := mergeDataCfg.GetChessIdByLvAndColor(i, Color) ChessId := mergeDataCfg.GetChessIdByLvAndColor(i, Color)
if ChessId == 0 {
continue
}
r = append(r, &Rand{ChessId: ChessId, Diamond: Diamond}) r = append(r, &Rand{ChessId: ChessId, Diamond: Diamond})
} }
return r return r

View File

@ -40,12 +40,16 @@ type ChessBorad struct {
EmitList map[int]int EmitList map[int]int
ChessBuff []int ChessBuff []int
ChessBag ChessBag ChessBag ChessBag
PartBag PartBag
ChessMap map[string]int32 ChessMap map[string]int32
Honor map[int]int // 荣誉室 Honor map[int]int // 荣誉室
Retire map[string]int // 退役发射器系列 Retire map[string]int // 退役发射器系列
RetireChessMap map[string][]int RetireChessMap map[string][]int
} }
type PartBag struct {
List map[int]PartBagGrid // 零件背包
}
type ChessBag struct { type ChessBag struct {
List map[int]ChessBagGrid List map[int]ChessBagGrid
Buy int Buy int
@ -57,6 +61,11 @@ type ChessBagGrid struct {
EmitId int // 发射器id EmitId int // 发射器id
} }
type PartBagGrid struct {
PartId int // 零件id
Num int // 零件数量
}
func (cb *ChessBorad) IsEmpty() bool { func (cb *ChessBorad) IsEmpty() bool {
cb.ver() cb.ver()
return len(cb.ChessList) == 0 return len(cb.ChessList) == 0
@ -87,6 +96,9 @@ func (cb *ChessBorad) ver() {
cb.ChessBag.List[i] = ChessBagGrid{} cb.ChessBag.List[i] = ChessBagGrid{}
} }
} }
if cb.PartBag.List == nil {
cb.PartBag.List = make(map[int]PartBagGrid)
}
if cb.ChessMap == nil { if cb.ChessMap == nil {
cb.ChessMap = make(map[string]int32) cb.ChessMap = make(map[string]int32)
} }
@ -335,12 +347,26 @@ func (cb *ChessBorad) GetChessFromBuff(Chess int) error {
if v == Chess { if v == Chess {
cb.ChessBuff = append(cb.ChessBuff[:i], cb.ChessBuff[i+1:]...) cb.ChessBuff = append(cb.ChessBuff[:i], cb.ChessBuff[i+1:]...)
cb.AddChess(Chess) cb.AddChess(Chess)
ChessType := mergeDataCfg.GetTypeById(Chess)
if ChessType == "Emitter" {
cb.EmitList[Chess]++
}
return nil return nil
} }
} }
return errors.New("chess id not exist") return errors.New("chess id not exist")
} }
func (cb *ChessBorad) LosePart(PartId int, Num int) error {
v, ok := cb.PartBag.List[PartId]
if !ok || v.Num < Num {
return errors.New("part id not exist or num not enough" + fmt.Sprintf("PartId: %d, Num: %d, ok: %v", PartId, Num, ok))
}
v.Num -= Num
cb.PartBag.List[PartId] = v
return nil
}
// 返回数据 // 返回数据
func (cb *ChessBorad) BackData() *msg.ResPlayerChessInfo { func (cb *ChessBorad) BackData() *msg.ResPlayerChessInfo {
var ChessBagGrids []*msg.ChessBagGrid var ChessBagGrids []*msg.ChessBagGrid
@ -351,6 +377,13 @@ func (cb *ChessBorad) BackData() *msg.ResPlayerChessInfo {
EmitId: int32(v.EmitId), EmitId: int32(v.EmitId),
}) })
} }
var PartBagGrids []*msg.PartBagGrid
for k, v := range cb.PartBag.List {
PartBagGrids = append(PartBagGrids, &msg.PartBagGrid{
PartId: int32(k),
Count: int32(v.Num),
})
}
Re := make([]string, 0) Re := make([]string, 0)
for k, v := range cb.Retire { for k, v := range cb.Retire {
if v == 3 { if v == 3 {
@ -371,6 +404,9 @@ func (cb *ChessBorad) BackData() *msg.ResPlayerChessInfo {
ChessBuyCnt: int32(cb.ChessBag.Buy), ChessBuyCnt: int32(cb.ChessBag.Buy),
ChessFreeCnt: int32(cb.ChessBag.Free), ChessFreeCnt: int32(cb.ChessBag.Free),
}, },
PartBag: &msg.PartBag{
PartBagGrids: PartBagGrids,
},
} }
} }
@ -435,6 +471,31 @@ func (cb *ChessBorad) PutChessInBag(Grid, ChessId, EmitId int) error {
return nil return nil
} }
func (cb *ChessBorad) PutPartInBag(ChessId int) error {
err := cb.RemoveChess(ChessId)
if err != nil {
return err
}
ChessLv := mergeDataCfg.GetLvById(ChessId)
ChessMaxLv := mergeDataCfg.GetMaxLvById(ChessId)
if ChessLv != ChessMaxLv { // 零件只能放入满级棋子
return errors.New("part Lv is not max")
}
Num := 0
v, ok := cb.PartBag.List[ChessId]
if ok {
Num = v.Num
}
if cb.PartBag.List == nil {
cb.PartBag.List = make(map[int]PartBagGrid)
}
cb.PartBag.List[ChessId] = PartBagGrid{
PartId: ChessId,
Num: Num + 1,
}
return nil
}
func (cb *ChessBorad) TakeChessOutBag(Grid int) (int, error) { func (cb *ChessBorad) TakeChessOutBag(Grid int) (int, error) {
if Grid < 0 { if Grid < 0 {
cb.RemoveHonor(-Grid) cb.RemoveHonor(-Grid)
@ -575,3 +636,11 @@ func (cb *ChessBorad) UpgradeChess(ChessId int) (int, error) {
cb.AddChess(NewChess) cb.AddChess(NewChess)
return NewChess, nil 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

@ -10,11 +10,19 @@ import (
) )
type Decorate struct { type Decorate struct {
AreaId int AreaId int
FinishList map[int]struct{} FinishList map[int]struct{}
Progress int Progress int
DecorateNum int DecorateNum int
AreaReward []int AreaReward []int
PartPool map[int]int
PartClassPool []int
PartCost map[int]*PartCostInfo
LastPart []int
}
type PartCostInfo struct {
Items []*item.Item
} }
func (d *Decorate) InitData() { func (d *Decorate) InitData() {
@ -22,6 +30,15 @@ func (d *Decorate) InitData() {
d.AreaId = 1 d.AreaId = 1
d.FinishList = make(map[int]struct{}) d.FinishList = make(map[int]struct{})
} }
if d.PartCost == nil {
d.PartCost = make(map[int]*PartCostInfo)
}
if d.PartPool == nil {
d.PartPool = make(map[int]int)
}
if len(d.PartCost) == 0 {
d.initPartCost(d.AreaId)
}
} }
// 装饰 // 装饰
@ -39,11 +56,14 @@ func (d *Decorate) Decorate(areaId int, decorateId int) ([]*item.Item, error) {
d.FinishList[decorateId] = struct{}{} d.FinishList[decorateId] = struct{}{}
d.Progress += 1 d.Progress += 1
Item := decorateCfg.GetProgressReward(areaId, d.Progress) Item := decorateCfg.GetProgressReward(areaId, d.Progress)
Item1 := decorateCfg.GetDecoarteReward(areaId, decorateId)
Item = append(Item, Item1...)
if d.Progress >= len(SortList) { if d.Progress >= len(SortList) {
d.AreaId++ d.AreaId++
d.Progress = 0 d.Progress = 0
d.FinishList = make(map[int]struct{}) d.FinishList = make(map[int]struct{})
} }
d.DecorateNum++ d.DecorateNum++
return Item, nil return Item, nil
} }
@ -58,7 +78,17 @@ func (d *Decorate) GetDecorateAddEnergy(cnt int) []*item.Item {
func (d *Decorate) GetDecorateCostItem(AreaId, DecorateId int) ([]*item.Item, int) { func (d *Decorate) GetDecorateCostItem(AreaId, DecorateId int) ([]*item.Item, int) {
Item := decorateCfg.GetStarCost(AreaId, DecorateId) Item := decorateCfg.GetStarCost(AreaId, DecorateId)
PetExp := decorateCfg.GetDecoratePExp(AreaId, DecorateId) PetExp := decorateCfg.GetDecoratePExp(AreaId, DecorateId)
return []*item.Item{item.NewItem(item.ITEM_STAR_ID, -Item)}, PetExp Id := decorateCfg.GetIdBySenceAndLv(AreaId, DecorateId)
Items := []*item.Item{item.NewItem(item.ITEM_STAR_ID, Item)}
PartItem := d.PartCost[Id]
if PartItem != nil {
Items = append(Items, PartItem.Items...)
delete(d.PartCost, Id)
}
if len(d.PartCost) == 0 {
d.initPartCost(d.AreaId + 1)
}
return Items, PetExp
} }
func (d *Decorate) DecorateAll(Star int) ([]*item.Item, []*item.Item, int, []int, []interface{}, int) { func (d *Decorate) DecorateAll(Star int) ([]*item.Item, []*item.Item, int, []int, []interface{}, int) {
@ -66,6 +96,7 @@ func (d *Decorate) DecorateAll(Star int) ([]*item.Item, []*item.Item, int, []int
SubAlice := GoUtil.SubSlices(DecorateAll, GoUtil.MapIntToIntSlice(d.FinishList)) SubAlice := GoUtil.SubSlices(DecorateAll, GoUtil.MapIntToIntSlice(d.FinishList))
sort.Ints(SubAlice) sort.Ints(SubAlice)
SubItem := 0 SubItem := 0
SubItems := make([]*item.Item, 0)
AddItem := make([]*item.Item, 0) AddItem := make([]*item.Item, 0)
DecorateList := make([]int, 0) DecorateList := make([]int, 0)
Log := make([]interface{}, 0) Log := make([]interface{}, 0)
@ -79,10 +110,17 @@ func (d *Decorate) DecorateAll(Star int) ([]*item.Item, []*item.Item, int, []int
Star -= NeedStar Star -= NeedStar
SubItem += NeedStar SubItem += NeedStar
d.FinishList[v] = struct{}{} d.FinishList[v] = struct{}{}
Id := decorateCfg.GetIdBySenceAndLv(d.AreaId, d.Progress)
PartItem := d.PartCost[Id]
if PartItem != nil {
SubItems = append(SubItems, PartItem.Items...)
delete(d.PartCost, Id)
}
d.Progress++ d.Progress++
d.DecorateNum++ d.DecorateNum++
Num++ Num++
Item := decorateCfg.GetProgressReward(d.AreaId, d.Progress) Item := decorateCfg.GetProgressReward(d.AreaId, d.Progress)
Item = append(Item, decorateCfg.GetDecoarteReward(d.AreaId, v)...)
if len(Item) > 0 { if len(Item) > 0 {
if d.Progress >= len(DecorateAll) { if d.Progress >= len(DecorateAll) {
Log = append(Log, map[string]interface{}{ Log = append(Log, map[string]interface{}{
@ -107,16 +145,27 @@ func (d *Decorate) DecorateAll(Star int) ([]*item.Item, []*item.Item, int, []int
d.Progress = 0 d.Progress = 0
d.FinishList = make(map[int]struct{}) d.FinishList = make(map[int]struct{})
} }
if len(d.PartCost) == 0 {
return []*item.Item{item.NewItem(item.ITEM_STAR_ID, -SubItem)}, AddItem, Num, DecorateList, Log, PetExp d.initPartCost(d.AreaId)
}
SubItems = append(SubItems, item.NewItem(item.ITEM_STAR_ID, SubItem))
return SubItems, AddItem, Num, DecorateList, Log, PetExp
} }
// 获取装饰信息 // 获取装饰信息
func (d *Decorate) BackData() *msg.ResDecorateInfo { func (d *Decorate) BackData() *msg.ResDecorateInfo {
PartRes := []*msg.DecoratePart{}
for k, v := range d.PartCost {
PartRes = append(PartRes, &msg.DecoratePart{
Id: int32(k),
Items: item.ItemToMsg(v.Items),
})
}
return &msg.ResDecorateInfo{ return &msg.ResDecorateInfo{
AreaId: int32(d.AreaId), AreaId: int32(d.AreaId),
MFinishList: GoUtil.MapIntToSlice(d.FinishList), MFinishList: GoUtil.MapIntToSlice(d.FinishList),
RewardArea: GoUtil.IntToInt32(d.AreaReward), RewardArea: GoUtil.IntToInt32(d.AreaReward),
Parts: PartRes,
} }
} }
@ -125,7 +174,7 @@ func (d *Decorate) GetDecorateReward(areaId int) ([]*item.Item, error) {
return nil, fmt.Errorf("areaId already rewarded") return nil, fmt.Errorf("areaId already rewarded")
} }
d.AreaReward = append(d.AreaReward, areaId) d.AreaReward = append(d.AreaReward, areaId)
return decorateCfg.GetDecoarteReward(areaId), nil return decorateCfg.GetDecoarteReward(areaId, 20), nil
} }
func (d *Decorate) GetAreaId() int { func (d *Decorate) GetAreaId() int {
@ -139,3 +188,123 @@ func (d *Decorate) GetProgress() int {
func (d *Decorate) GetDecorateNum() int { func (d *Decorate) GetDecorateNum() int {
return d.DecorateNum return d.DecorateNum
} }
func (d *Decorate) GetPart(Num int) map[int]int {
d.initPartPool()
res := make(map[int]int, 0)
ClassNum := min(Num, 3)
ClassList := d.GetPartClass(ClassNum)
NewClassList := d.sortClass(ClassList)
for i := range Num {
Class := NewClassList[i%ClassNum]
d.PartPool[Class]--
res[Class]++
}
return res
}
func (d *Decorate) sortClass(Class []int) []int {
d.initPartPool()
type sortClass struct {
Id int
Num int
}
sortList := make([]sortClass, 0)
for _, v := range Class {
sortList = append(sortList, sortClass{
Id: v,
Num: d.PartPool[v],
})
}
sort.Slice(sortList, func(i, j int) bool {
return sortList[i].Num > sortList[j].Num
})
res := make([]int, 0)
for _, v := range sortList {
res = append(res, v.Id)
}
return res
}
func (d *Decorate) GetPartClass(Num int) []int {
res := []int{}
Id := 0
for range Num {
if len(d.PartClassPool) == 0 {
d.initPartClassPool()
}
Id, d.PartClassPool = GoUtil.PopSlice(d.PartClassPool)
res = append(res, Id)
}
return res
}
func (d *Decorate) initPartClassPool() {
if len(d.PartClassPool) == 0 {
ClassList := decorateCfg.GetAllPartId()
r1 := GoUtil.SubSlices(ClassList, d.LastPart)
c1 := GoUtil.RandSlice(r1)
r2 := GoUtil.SubSlices(ClassList, []int{c1})
r3 := GoUtil.ShuffleArray(r2)
d.PartClassPool = append([]int{c1}, r3...)
}
}
func (d *Decorate) initPartPool() {
IsEmpty := true
for _, v := range d.PartPool {
if v > 0 {
IsEmpty = false
break
}
}
if IsEmpty {
PartList := decorateCfg.GetAllPartId()
for _, v := range PartList {
d.PartPool[v] = 7
}
}
}
func (d *Decorate) initPartCost(AreaId int) {
AllPartList := decorateCfg.GetPartNumByAreaId(AreaId)
for k, v := range AllPartList {
// 初始零件消耗写死
if k == 33 {
d.PartCost[k] = &PartCostInfo{
Items: []*item.Item{item.NewItem(1515, 1)},
}
continue
}
if k == 34 {
d.PartCost[k] = &PartCostInfo{
Items: []*item.Item{item.NewItem(1505, 1)},
}
continue
}
if k == 35 {
d.PartCost[k] = &PartCostInfo{
Items: []*item.Item{item.NewItem(1505, 1), item.NewItem(1515, 1)},
}
continue
}
PartList := d.GetPart(v)
Items := make([]*item.Item, 0)
for k1, v1 := range PartList {
Items = append(Items, item.NewItem(k1, v1))
}
d.PartCost[k] = &PartCostInfo{
Items: Items,
}
}
}
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

@ -0,0 +1,148 @@
package guideTask
import (
"fmt"
"server/GoUtil"
GuideTaskCfg "server/conf/guideTask"
"server/game/mod/item"
"server/game/mod/quest"
"server/msg"
)
type GuideTaskMod struct {
Tasks map[int]*GuideTask
Active int
Reward []int // 任务奖励状态
UnlockTime int64 // 解锁时间
LoginDay map[int]struct{} // 登录天数
}
type GuideTask struct {
Items []*item.Item
Status int
Quest quest.QuestProgress
UnLock bool
}
func (gt *GuideTaskMod) InitData() {
if gt.Tasks == nil {
gt.Tasks = make(map[int]*GuideTask)
}
if len(gt.Tasks) == 0 {
for i := 1; ; i++ {
Str := GuideTaskCfg.GetTaskById(i)
if Str == "" {
break
}
Quest, _ := quest.ParseQuest(Str)
gt.Tasks[i] = &GuideTask{
Status: quest.QUEST_STATUS_UNFINISH,
Quest: Quest,
}
}
}
if gt.LoginDay == nil {
gt.LoginDay = make(map[int]struct{})
}
}
func (gt *GuideTaskMod) Login() {
// 登录时触发的引导任务
if gt.UnlockTime == 0 {
return
}
LoginDay := (GoUtil.Now()-gt.UnlockTime)/86400 + 1
gt.LoginDay[int(LoginDay)] = struct{}{}
gt.Trigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_GUIDE_LOGIN, A: []interface{}{len(gt.LoginDay)}})
}
func (gt *GuideTaskMod) Unlock(lv int) bool {
UnLockLv := GuideTaskCfg.GetUnlockLv()
if lv >= UnLockLv && gt.UnlockTime == 0 {
gt.UnlockTime = GoUtil.Now()
gt.Login()
return true
}
return false
}
func (gt *GuideTaskMod) CheckOpen() bool {
// 检查是否可以打开引导任务
if gt.UnlockTime == 0 {
return false
}
return GoUtil.Now()-gt.UnlockTime <= 96*3600 // 96小时内可以打开
}
func (gt *GuideTaskMod) Trigger(Tr *quest.Trigger) bool {
if !gt.CheckOpen() {
return false
}
update := false
for k, v := range gt.Tasks {
if v.Status != quest.QUEST_STATUS_UNFINISH {
continue
}
if v.Quest.Label == quest.TRIGGER_LABEL_GUIDE_LOGIN {
v.Quest.A = []interface{}{gt.UnlockTime}
}
up := quest.TriggerQuestProgress(&v.Quest, Tr)
if up {
update = true
}
if v.Quest.Status {
v.Status = quest.QUEST_STATUS_FINISH
}
gt.Tasks[k] = v
}
return update
}
func (gt *GuideTaskMod) GetTaskReward(Id int) ([]*item.Item, error) {
if task, ok := gt.Tasks[Id]; ok {
if task.Status == quest.QUEST_STATUS_FINISH {
task.Status = quest.QUEST_STATUS_REWARD
Active := GuideTaskCfg.GetTaskActive(Id)
gt.Active += Active
return GuideTaskCfg.GetTaskRewardById(Id), nil
}
}
return nil, fmt.Errorf("no task id %d", Id)
}
func (gt *GuideTaskMod) GetActiveReward(Id int) ([]*item.Item, error) {
for _, v := range gt.Reward {
if v == Id {
return nil, fmt.Errorf("active reward already got")
}
}
items, needActive := GuideTaskCfg.GetActiveReward(Id)
if items == nil {
return nil, fmt.Errorf("no active reward id %d", Id)
}
if gt.Active < needActive {
return nil, fmt.Errorf("active not enough")
}
gt.Reward = append(gt.Reward, Id)
return items, nil
}
func (gt *GuideTaskMod) BackData() *msg.ResGuideTask {
if !gt.CheckOpen() {
return nil
}
resTask := make(map[int32]*msg.GuideTask)
for k, v := range gt.Tasks {
resTask[int32(k)] = &msg.GuideTask{
Status: int32(v.Status),
Progress: quest.QuestProgressToMsg(&v.Quest),
}
}
return &msg.ResGuideTask{
Task: resTask,
Active: int32(gt.Active),
UnlockTime: int32(gt.UnlockTime),
ActiveReward: GoUtil.SliceIntToInt32(gt.Reward),
}
}

View File

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

View File

@ -125,7 +125,7 @@ func (m *MailMod) Del(id int) error {
return fmt.Errorf("mail id %d not exist", id) return fmt.Errorf("mail id %d not exist", id)
} }
if v.Status == MAIL_STATUS_DEL { if v.Status == MAIL_STATUS_DEL {
return fmt.Errorf("mail have readed") return fmt.Errorf("mail have deleted")
} }
v.Status = MAIL_STATUS_DEL v.Status = MAIL_STATUS_DEL
v.Del = GoUtil.Now() v.Del = GoUtil.Now()

View File

@ -2,12 +2,14 @@ package order
import ( import (
"fmt" "fmt"
"log"
"server/GoUtil" "server/GoUtil"
limitedTimeEventCfg "server/conf/limitedTimeEvent" limitedTimeEventCfg "server/conf/limitedTimeEvent"
mergeDataCfg "server/conf/mergeData" mergeDataCfg "server/conf/mergeData"
orderCfg "server/conf/order" orderCfg "server/conf/order"
"server/game/mod/item" "server/game/mod/item"
"server/msg" "server/msg"
"strings"
"time" "time"
) )
@ -23,6 +25,8 @@ type OrderMod struct {
EmitShuffle []string // 发射器乱序 EmitShuffle []string // 发射器乱序
ChessPool []int // 棋子池 ChessPool []int // 棋子池
OrderPool map[int]*Order // 订单池 OrderPool map[int]*Order // 订单池
FinishOrder []int // 已完成订单
IsCharge bool // 是否充值
} }
type Order struct { type Order struct {
@ -47,10 +51,17 @@ const (
COMFORT_TYPE = 9 // 安慰订单 COMFORT_TYPE = 9 // 安慰订单
Guide_type = 10 // 引导订单 Guide_type = 10 // 引导订单
Pet_type = 11 // 宠物订单 Pet_type = 11 // 宠物订单
Preview_type = 12 // 预览订单
Fixed_type = 13 // 固定订单
Playroom_type = 14 // playroom装饰物订单
Part_type = 15 // 零件订单
DIFF_LOW = 1 // 低难度 DIFF_LOW = 1 // 低难度
DIFF_MID = 2 // 中难度 DIFF_MID = 2 // 中难度
DIFF_HIGH = 3 // 高难度 DIFF_HIGH = 3 // 高难度
TRIGGER_TYPE_ORDER = "Order" // 订单触发器
TRIGGER_TYPE_LV = "Lv" // 等级触发器
) )
func (o *OrderMod) InitData() { func (o *OrderMod) InitData() {
@ -63,29 +74,18 @@ func (o *OrderMod) InitData() {
if o.OrderPool == nil { if o.OrderPool == nil {
o.OrderPool = make(map[int]*Order) o.OrderPool = make(map[int]*Order)
} }
if o.Step == 0 { if len(o.OrderList) == 0 {
o.OrderList = make(map[int]Order) o.OrderList = make(map[int]Order)
Cfg := orderCfg.GetStartOrderByStep(o.Step + 1) o.TriggerOrder(1, TRIGGER_TYPE_ORDER, nil, 1)
o.Step = 1
o.Auto_id = 0
o.LastDiff = DIFF_LOW
for _, v := range Cfg {
star := GetOrderStar(v.MergeList)
Items := make([]*item.Item, 0)
Items = append(Items, item.NewItem(item.ITEM_STAR_ID, star))
o.Auto_id++
o.OrderList[o.Auto_id] = Order{
Type: Common_type,
MergeId: v.MergeList,
Items: Items,
}
}
} }
for k, v := range o.OrderList { for k, v := range o.OrderList {
if GoUtil.InArray(0, v.MergeId) || len(v.MergeId) == 0 { if GoUtil.InArray(0, v.MergeId) || len(v.MergeId) == 0 {
delete(o.OrderList, k) delete(o.OrderList, k)
} }
} }
if o.Auto_id == 0 {
o.Auto_id = 10000
}
} }
func (o *OrderMod) GetOrderList() map[int]Order { func (o *OrderMod) GetOrderList() map[int]Order {
@ -112,6 +112,9 @@ func (o *OrderMod) RewardOrder(id int) ([]*item.Item, []int, int, int, error) {
if v.Type == Guide_type { if v.Type == Guide_type {
return nil, v.MergeId, v.Type, 0, nil return nil, v.MergeId, v.Type, 0, nil
} }
if v.Type == Fixed_type || v.Type == Playroom_type {
o.FinishOrder = append(o.FinishOrder, id)
}
return ItemList, v.MergeId, v.Type, Star, nil return ItemList, v.MergeId, v.Type, Star, nil
} }
return ItemList, MergeList, 0, 0, fmt.Errorf("订单不存在, 订单id%d", id) return ItemList, MergeList, 0, 0, fmt.Errorf("订单不存在, 订单id%d", id)
@ -169,60 +172,131 @@ func (o *OrderMod) CreatOrderPool(lv int, Emit []int, EnergyMul int) error {
return nil return nil
} }
// 触发生成新的固定订单
func (o *OrderMod) TriggerOrder(lv int, Type string, Emit []int, EnergyMul int) error {
TriggerOrderList := orderCfg.GetStartOrderList()
FixedOrder := 0
for _, v := range o.OrderList {
if v.Type == Fixed_type {
FixedOrder++
}
}
OrderList := make(map[int]Order, len(o.OrderList))
for k, v := range o.OrderList {
OrderList[k] = v
}
// 触发生成新的固定订单
for _, v := range TriggerOrderList {
if GoUtil.InArray(v.Id, o.FinishOrder) {
continue
}
orderInfo, exists := OrderList[v.Id]
if exists && v.Preview == "" {
continue
}
// 预览条件不为空且未存在且未完成
if v.Preview != "" && !exists && !GoUtil.InArray(v.Id, o.FinishOrder) {
if o.CheckCondition(lv, v.Preview, Type, Emit, FixedOrder, OrderList) {
o.addFixOrder(v.Id, v.MergeList, Preview_type, v.Items)
}
}
if v.Appear != "" {
if o.CheckCondition(lv, v.Appear, Type, Emit, FixedOrder, OrderList) {
Type := Fixed_type
OrderType := orderCfg.GetOrderType(v.Id)
if OrderType != 0 {
Type = OrderType
}
if exists {
orderInfo.Type = Fixed_type
o.OrderList[v.Id] = orderInfo
} else {
o.addFixOrder(v.Id, v.MergeList, Type, v.Items)
}
}
}
}
if lv >= 12 {
o.CreateOrder(lv, Emit, EnergyMul)
}
return nil
}
func (o *OrderMod) CheckCondition(lv int, condition, Type string, Emit []int, FixedOrder int, OrderList map[int]Order) bool {
r1 := strings.Split(condition, "|")
for _, v := range r1 {
r2 := strings.Split(v, "=")
switch r2[0] {
case "Finish":
id := GoUtil.Int(r2[1])
if !GoUtil.InArray(id, o.FinishOrder) && id != 0 {
return false
}
if id == 0 && Type != TRIGGER_TYPE_ORDER {
return false
}
case "Lv":
id := GoUtil.Int(r2[1])
if lv < id {
return false
}
case "OrderNum":
id := GoUtil.Int(r2[1])
if FixedOrder != id {
return false
}
case "Order":
id := GoUtil.Int(r2[1])
_, ok := OrderList[id]
if !GoUtil.InArray(id, o.FinishOrder) && !ok {
return false
}
case "Emit":
Class := []string{}
for _, v := range Emit {
Class = append(Class, mergeDataCfg.GetEmitId(v))
}
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.GetEmitId(v))
}
if !GoUtil.InStringArray(r2[1], Class) {
return false
}
}
}
return true
}
// 生成新订单 // 生成新订单
func (o *OrderMod) CreateOrder(lv int, Emit []int, EnergyMul int) error { func (o *OrderMod) CreateOrder(lv int, Emit []int, EnergyMul int) error {
if len(Emit) == 0 { if len(Emit) == 0 {
return nil return nil
} }
switch o.LastOrder.Type { /// 生成优先订单
case Preheat_type: if o.CreatePriorityOrder(lv, Emit) {
ChessId := o.LastOrder.MergeId[0] return nil
ChessColor := mergeDataCfg.GetColorById(ChessId) }
PreheatStep := o.PreheatStep[ChessColor] MaxOrderNum := orderCfg.GetOrderNum(lv)
if PreheatStep < 4 { n := 0
NewChessId := mergeDataCfg.GetChessIdByLvAndColor(EnergyMul+PreheatStep+1, ChessColor) for _, v := range o.OrderList {
if NewChessId == 0 { if v.Type == Common_type || v.Type == Clean_type || v.Type == Pet_type || v.Type == Part_type || v.Type == Fixed_type || v.Type == Preview_type {
return fmt.Errorf("CreateOrder: NewChessId is 0, EnergyMul: %d, PreheatStep: %d, ChessColor: %s", EnergyMul, PreheatStep, ChessColor) n++
}
o.addOrder([]int{NewChessId}, DIFF_LOW, Preheat_type)
o.PreheatStep[ChessColor]++
} }
default: }
MaxStep := orderCfg.GetMaxStep() for i := n; i < MaxOrderNum; i++ {
if o.Step < MaxStep { err := o.CreateNormalOrder(lv, Emit, EnergyMul)
n := 0 if err != nil {
for _, v := range o.OrderList { return err
if v.Type == Common_type {
n++
}
}
if n != 0 {
return nil
}
Cfg := orderCfg.GetStartOrderByStep(o.Step + 1)
o.Step++
for _, v := range Cfg {
o.addOrder(v.MergeList, DIFF_LOW, Common_type)
}
return nil
} else {
/// 生成优先订单
if o.CreatePriorityOrder(lv, Emit) {
return nil
}
MaxOrderNum := orderCfg.GetOrderNum(lv)
n := 0
for _, v := range o.OrderList {
if v.Type == Common_type || v.Type == Clean_type || v.Type == Pet_type {
n++
}
}
for i := n; i < MaxOrderNum; i++ {
err := o.CreateNormalOrder(lv, Emit, EnergyMul)
if err != nil {
return err
}
}
} }
} }
return nil return nil
@ -271,6 +345,9 @@ func (o *OrderMod) CreatePriorityOrder(lv int, Emit []int) bool {
NewLv := GoUtil.RandNum(4+DurLv, 3+DurLv*2) NewLv := GoUtil.RandNum(4+DurLv, 3+DurLv*2)
NewChessId = mergeDataCfg.GetChessIdByLvAndColor(NewLv, NewColor) NewChessId = mergeDataCfg.GetChessIdByLvAndColor(NewLv, NewColor)
} }
if NewChessId == 0 {
continue
}
o.addOrder([]int{NewChessId}, DiffLv, Common_type) o.addOrder([]int{NewChessId}, DiffLv, Common_type)
return true return true
} }
@ -345,7 +422,7 @@ func (o *OrderMod) CreateNormalOrder(lv int, Emit []int, EnergyMul int) error {
} }
break break
} }
// log.Printf("CreateNormalOrder: %v, %v, %v", mergeList, OrderDiff, err) log.Printf("CreateNormalOrder: %v, %v, %v", mergeList, OrderDiff, err)
o.addOrder(mergeList, OrderDiff, Common_type) o.addOrder(mergeList, OrderDiff, Common_type)
return nil return nil
} }
@ -384,7 +461,15 @@ func (o *OrderMod) CreateSuperOrder(lv int, Emit []int, EnergyMul int) error {
o.addOrder(mergeList, OrderDiff, Super_type) o.addOrder(mergeList, OrderDiff, Super_type)
return nil return nil
} }
func (o *OrderMod) addFixOrder(Id int, ChessList []int, Type int, Items []*item.Item) {
Order := Order{
MergeId: ChessList,
Type: Type,
Timestamp: time.Now().Unix(),
Items: Items,
}
o.OrderList[Id] = Order
}
func (o *OrderMod) addOrder(ChessList []int, Diff int, Type int) int { func (o *OrderMod) addOrder(ChessList []int, Diff int, Type int) int {
o.Auto_id++ o.Auto_id++
Star := GetOrderStar(ChessList) Star := GetOrderStar(ChessList)
@ -417,14 +502,14 @@ func (o *OrderMod) CreateCleanOrder2(ChessList []int) bool {
return true return true
} }
func (o *OrderMod) CreateExtraOrder(AddChess, AddNewEmit, ChessList []int, EnergyMul int) bool { func (o *OrderMod) CreateExtraOrder(AddChess, AddNewEmit, ChessList []int, EnergyMul, Level int) bool {
GetExtraEmitId := mergeDataCfg.GetExtraEmitId() BeginExtraEmitId := orderCfg.GetEmitExtraOrder() // 从发射器F系列开始
b1 := false b1 := false
OrderEmit := 0 OrderEmit := 0
MaxLvChess := make(map[int]int) MaxLvChess := make(map[int]int)
for _, v := range AddNewEmit { for _, v := range AddNewEmit {
Emit_Id := mergeDataCfg.GetEmitId(v) Emit_Id := mergeDataCfg.GetEmitId(v)
_, ok := GetExtraEmitId[Emit_Id] ok := Emit_Id >= BeginExtraEmitId
_, ok1 := o.EimtOrder[Emit_Id] _, ok1 := o.EimtOrder[Emit_Id]
ChessColor := mergeDataCfg.GetEmitProduceChessType(v) ChessColor := mergeDataCfg.GetEmitProduceChessType(v)
if ok && !ok1 && len(ChessColor) > 0 { if ok && !ok1 && len(ChessColor) > 0 {
@ -445,9 +530,20 @@ func (o *OrderMod) CreateExtraOrder(AddChess, AddNewEmit, ChessList []int, Energ
MaxLvChess[ChessId]++ MaxLvChess[ChessId]++
} }
} }
//额外订单补充2当玩家的棋盘中出现三个相同的满级产物时立刻生成一个对应的收购订单
for k := range MaxLvChess {
ChessNum := GoUtil.GetElemNum(ChessList, k)
if ChessNum == 3 && Level >= 12 {
b1 = true
o.addOrder([]int{k, k, k}, DIFF_LOW, Extra_type)
}
}
//额外订单补充1CDEG发射器首次合成时生成其对应2及棋子订单完成后生成3及再完成生成4及的 //额外订单补充1CDEG发射器首次合成时生成其对应2及棋子订单完成后生成3及再完成生成4及的
if b1 { if b1 {
ChessColor := mergeDataCfg.GetEmitProduceChessType(OrderEmit) ChessColor := mergeDataCfg.GetEmitProduceChessType(OrderEmit)
if len(ChessColor) == 0 {
return b1
}
ChessId := mergeDataCfg.GetChessIdByLvAndColor(EnergyMul+1, ChessColor[0]) ChessId := mergeDataCfg.GetChessIdByLvAndColor(EnergyMul+1, ChessColor[0])
if ChessId != 0 { if ChessId != 0 {
o.PreheatStep[ChessColor[0]] = 1 o.PreheatStep[ChessColor[0]] = 1
@ -521,7 +617,7 @@ func (o *OrderMod) ChangeEnergyMul(lv int, Emit []int, EnergyMul int, ChessList
Lv := mergeDataCfg.GetLvById(vv) Lv := mergeDataCfg.GetLvById(vv)
Color := mergeDataCfg.GetColorById(vv) Color := mergeDataCfg.GetColorById(vv)
EmitId := GetEmitByColor(Emit, Color) EmitId := GetEmitByColor(Emit, Color)
_, Max := getChesslvRange(EmitId, EnergyMul) _, Max := getChesslvRange(EmitId, EnergyMul, o.IsCharge)
Adjust := mergeDataCfg.GetAdjust(EmitId, Color) Adjust := mergeDataCfg.GetAdjust(EmitId, Color)
if Lv >= EnergyMul+1 && Lv <= Max-Adjust { if Lv >= EnergyMul+1 && Lv <= Max-Adjust {
continue continue
@ -593,3 +689,16 @@ func (o *OrderMod) CreateComfortOrder(lv int, Emit []int, EnergyMul, Diff, Chess
o.addOrder(mergeList, Diff, COMFORT_TYPE) o.addOrder(mergeList, Diff, COMFORT_TYPE)
return nil 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 { func getChessNumRand(OrderN int) map[int]int {
return map[int]int{ return map[int]int{
1: int(15 - 3*OrderN), 1: int(70 - 2*OrderN),
2: int(50 + OrderN), 2: int(25 + OrderN),
3: int(35 + 2*OrderN), 3: int(5 + OrderN),
} }
} }
@ -24,21 +24,21 @@ func getOrderDiffRand(Diff, OrderN int) map[int]int {
switch Diff { switch Diff {
case DIFF_MID: case DIFF_MID:
d = map[int]int{ d = map[int]int{
DIFF_LOW: int(21 - 3*OrderN), DIFF_LOW: 21,
DIFF_MID: int(49 + 1.5*float64(OrderN)), DIFF_MID: 49,
DIFF_HIGH: int(30 + 1.5*float64(OrderN)), DIFF_HIGH: 30,
} }
case DIFF_HIGH: case DIFF_HIGH:
d = map[int]int{ d = map[int]int{
DIFF_LOW: int(60 - 5*OrderN), DIFF_LOW: 60,
DIFF_MID: int(30 + 3*float64(OrderN)), DIFF_MID: 30,
DIFF_HIGH: int(10 + 2*float64(OrderN)), DIFF_HIGH: 10,
} }
default: default:
d = map[int]int{ d = map[int]int{
DIFF_LOW: int(10 - OrderN), DIFF_LOW: 10,
DIFF_MID: int(30), DIFF_MID: 30,
DIFF_HIGH: int(60 + OrderN), DIFF_HIGH: 60,
} }
} }
return d return d
@ -56,8 +56,8 @@ func getChessDiff(ChessNum, OrderDiff, OrderN int) map[int]int {
switch OrderDiff { switch OrderDiff {
case DIFF_LOW: case DIFF_LOW:
rand := map[int]int{ rand := map[int]int{
DIFF_LOW: 99 - OrderN, DIFF_LOW: 99,
DIFF_MID: 1 + OrderN, DIFF_MID: 1,
} }
secondDiff := GoUtil.RandMap(rand) secondDiff := GoUtil.RandMap(rand)
rs = map[int]int{ rs = map[int]int{
@ -66,8 +66,8 @@ func getChessDiff(ChessNum, OrderDiff, OrderN int) map[int]int {
} }
case DIFF_MID: case DIFF_MID:
rand := map[int]int{ rand := map[int]int{
DIFF_LOW: 5 + OrderN, DIFF_LOW: 50,
DIFF_MID: 95 - OrderN, DIFF_MID: 50,
} }
secondDiff := GoUtil.RandMap(rand) secondDiff := GoUtil.RandMap(rand)
rs = map[int]int{ rs = map[int]int{
@ -76,9 +76,9 @@ func getChessDiff(ChessNum, OrderDiff, OrderN int) map[int]int {
} }
case DIFF_HIGH: case DIFF_HIGH:
rand := map[int]int{ rand := map[int]int{
DIFF_LOW: int(95 - 10*OrderN), DIFF_LOW: 95,
DIFF_MID: int(4 + 6*OrderN), DIFF_MID: 4,
DIFF_HIGH: int(1 + 4*OrderN), DIFF_HIGH: 1,
} }
secondDiff := GoUtil.RandMap(rand) secondDiff := GoUtil.RandMap(rand)
rs = map[int]int{ rs = map[int]int{
@ -90,13 +90,13 @@ func getChessDiff(ChessNum, OrderDiff, OrderN int) map[int]int {
switch OrderDiff { switch OrderDiff {
case DIFF_LOW: case DIFF_LOW:
rand := map[int]int{ rand := map[int]int{
DIFF_LOW: 95 - OrderN, DIFF_LOW: 95,
DIFF_MID: 5 + OrderN, DIFF_MID: 5,
} }
secondDiff := GoUtil.RandMap(rand) secondDiff := GoUtil.RandMap(rand)
rand = map[int]int{ rand = map[int]int{
DIFF_LOW: 60 - 4*OrderN, DIFF_LOW: 70,
DIFF_MID: 40 + 4*OrderN, DIFF_MID: 30,
} }
thirdDiff := GoUtil.RandMap(rand) thirdDiff := GoUtil.RandMap(rand)
rs = map[int]int{ rs = map[int]int{
@ -106,33 +106,33 @@ func getChessDiff(ChessNum, OrderDiff, OrderN int) map[int]int {
} }
case DIFF_MID: case DIFF_MID:
rand := map[int]int{ rand := map[int]int{
DIFF_LOW: 50 - 3*OrderN, DIFF_LOW: 95,
DIFF_MID: 50 + 3*OrderN, DIFF_MID: 5,
} }
secondDiff := GoUtil.RandMap(rand) secondDiff := GoUtil.RandMap(rand)
rand = map[int]int{ rand = map[int]int{
DIFF_MID: 95 - 4*OrderN, DIFF_LOW: 60,
DIFF_HIGH: 5 + 4*OrderN, DIFF_MID: 40,
} }
thirdDiff := GoUtil.RandMap(rand) thirdDiff := GoUtil.RandMap(rand)
rs = map[int]int{ rs = map[int]int{
1: DIFF_LOW, 1: DIFF_MID,
2: secondDiff, 2: secondDiff,
3: thirdDiff, 3: thirdDiff,
} }
case DIFF_HIGH: case DIFF_HIGH:
rand := map[int]int{ rand := map[int]int{
DIFF_LOW: int(95 - 10*OrderN), DIFF_LOW: 95,
DIFF_MID: int(5 + 10*OrderN), DIFF_MID: 5,
} }
secondDiff := GoUtil.RandMap(rand) secondDiff := GoUtil.RandMap(rand)
rand = map[int]int{ rand = map[int]int{
DIFF_MID: int(95 - 8*OrderN), DIFF_LOW: 50,
DIFF_HIGH: int(5 + 8*OrderN), DIFF_MID: 50,
} }
thirdDiff := GoUtil.RandMap(rand) thirdDiff := GoUtil.RandMap(rand)
rs = map[int]int{ rs = map[int]int{
1: DIFF_LOW, 1: DIFF_HIGH,
2: secondDiff, 2: secondDiff,
3: thirdDiff, 3: thirdDiff,
} }
@ -160,6 +160,28 @@ func getChessLv(Min, Max, Diff int) int {
return GoUtil.RandNum(Start, End) return GoUtil.RandNum(Start, End)
} }
func getChessLvRange(Min, Max, Diff int) []int {
Start := Min
End := Max
switch Diff {
case DIFF_LOW:
End = Min + (Max-Min+1)/3 - 1
case DIFF_MID:
Start = Min + (Max-Min+1)/3
End = Min + (Max-Min+1)/3*2 - 1
case DIFF_HIGH:
Start = Min + (Max-Min+1)/3*2
}
Start = max(Min, Start)
End = max(Start, End)
End = min(Max, End)
r := make([]int, 0)
for i := Start; i <= End; i++ {
r = append(r, i)
}
return r
}
// 宝箱雨随机棋子类型 // 宝箱雨随机棋子类型
func RandChessColor(Emit []int) string { func RandChessColor(Emit []int) string {
r := make(map[string]int) r := make(map[string]int)
@ -182,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) RandEmitLv := mergeDataCfg.GetLvById(Emit)
EmitId := mergeDataCfg.GetEmitId(Emit) EmitId := mergeDataCfg.GetEmitId(Emit)
RandMaxLv := mergeDataCfg.GetMaxLvById(Emit) RandMaxLv := mergeDataCfg.GetMaxLvById(Emit)
@ -191,6 +213,11 @@ func getChesslvRange(Emit int, EnergyMul int) (int, int) {
m := int(float64(1+RandEmitLv-RandEmitMinLv) / float64(1+RandMaxLv-RandEmitMinLv) / Ratio * 100) m := int(float64(1+RandEmitLv-RandEmitMinLv) / float64(1+RandMaxLv-RandEmitMinLv) / Ratio * 100)
ChessMinLev := orderCfg.GetLvMin(EnergyMul) ChessMinLev := orderCfg.GetLvMin(EnergyMul)
ChessMaxLev := orderCfg.GetLvMax(EnergyMul, m) ChessMaxLev := orderCfg.GetLvMax(EnergyMul, m)
ProductList := mergeDataCfg.GetEmitProduceType(Emit)
ChessMaxLev = ChessMaxLev - len(ProductList) + 2
if IsCharge {
ChessMaxLev += 1
}
return ChessMinLev, ChessMaxLev return ChessMinLev, ChessMaxLev
} }
@ -397,6 +424,9 @@ func getEmitSeries(o *OrderMod, Emit []int) string {
} }
Num := 1 Num := 1
for { for {
if len(o.EmitShuffle) == 1 {
break
}
o.EmitShuffle = GoUtil.ShuffleStringArray(o.EmitShuffle) o.EmitShuffle = GoUtil.ShuffleStringArray(o.EmitShuffle)
if o.EmitShuffle[0] != PopEmitId { if o.EmitShuffle[0] != PopEmitId {
break break
@ -419,6 +449,20 @@ func GetOrderStar(ChessList []int) int {
return Star return Star
} }
func GetChessByDiff(EmitId, EnergyMul, Diff int, Color string) []int {
ChessMinLv, ChessMaxLv := getChesslvRange(EmitId, EnergyMul, false)
LvRange := getChessLvRange(ChessMinLv, ChessMaxLv, Diff)
ChessIds := []int{}
for _, v := range LvRange {
NewLev1 := mergeDataCfg.DynamicLev(v, EmitId, Color)
MaxLev := mergeDataCfg.GetMaxLvByColor(Color)
NewLev1 = min(NewLev1, MaxLev)
ChessId := mergeDataCfg.GetChessIdByLvAndColor(NewLev1, Color)
ChessIds = append(ChessIds, ChessId)
}
return GoUtil.UniqueInts(ChessIds)
}
// 从棋子池中获取棋子 // 从棋子池中获取棋子
func getChessFromPoolByDiff(o *OrderMod, Diff int, Emit []int, EnergyMul int) int { func getChessFromPoolByDiff(o *OrderMod, Diff int, Emit []int, EnergyMul int) int {
EmitSeries := getEmitSeries(o, Emit) EmitSeries := getEmitSeries(o, Emit)
@ -447,7 +491,7 @@ func getChessFromPoolByDiff(o *OrderMod, Diff int, Emit []int, EnergyMul int) in
MinChessColor := mergeDataCfg.GetColorById(MinChessId) MinChessColor := mergeDataCfg.GetColorById(MinChessId)
NewEmitChessId := GetEmitByColor(Emit, MinChessColor) NewEmitChessId := GetEmitByColor(Emit, MinChessColor)
ColorRand := mergeDataCfg.GetEmitProduceType(NewEmitChessId) ColorRand := mergeDataCfg.GetEmitProduceType(NewEmitChessId)
ChessMinLv, ChessMaxLv := getChesslvRange(NewEmitChessId, EnergyMul) ChessMinLv, ChessMaxLv := getChesslvRange(NewEmitChessId, EnergyMul, o.IsCharge)
NewLev := getChessLv(ChessMinLv, ChessMaxLv, Diff) NewLev := getChessLv(ChessMinLv, ChessMaxLv, Diff)
MinChessLv := mergeDataCfg.GetLvById(MinChessId) MinChessLv := mergeDataCfg.GetLvById(MinChessId)
NewLev2 := mergeDataCfg.DynamicLev2(NewLev, NewEmitChessId, ColorRand[0], MinChessColor) NewLev2 := mergeDataCfg.DynamicLev2(NewLev, NewEmitChessId, ColorRand[0], MinChessColor)
@ -463,7 +507,7 @@ func getChessFromPoolByDiff(o *OrderMod, Diff int, Emit []int, EnergyMul int) in
return Chess return Chess
} }
Color := GoUtil.RandStringSlice(ColorRand) Color := GoUtil.RandStringSlice(ColorRand)
ChessMinLv, ChessMaxLv := getChesslvRange(EmitChessId, EnergyMul) ChessMinLv, ChessMaxLv := getChesslvRange(EmitChessId, EnergyMul, o.IsCharge)
NewLev := getChessLv(ChessMinLv, ChessMaxLv, Diff) NewLev := getChessLv(ChessMinLv, ChessMaxLv, Diff)
NewLev1 := mergeDataCfg.DynamicLev(NewLev, EmitChessId, Color) NewLev1 := mergeDataCfg.DynamicLev(NewLev, EmitChessId, Color)
MaxLev := mergeDataCfg.GetMaxLvByColor(Color) MaxLev := mergeDataCfg.GetMaxLvByColor(Color)
@ -499,7 +543,7 @@ func initReflectChess(Emits []int, EnergyMul int) {
if len(ProduceColor) == 0 || ProduceColor[0] == "" { if len(ProduceColor) == 0 || ProduceColor[0] == "" {
continue continue
} }
ChessMinLv, ChessMaxLv := getChesslvRange(Emit, EnergyMul) ChessMinLv, ChessMaxLv := getChesslvRange(Emit, EnergyMul, false)
Product := mergeDataCfg.GetEmitProduceChessType(Emit) Product := mergeDataCfg.GetEmitProduceChessType(Emit)
Start = ChessMinLv Start = ChessMinLv
End = ChessMinLv + (ChessMaxLv-ChessMinLv+1)/3 - 1 End = ChessMinLv + (ChessMaxLv-ChessMinLv+1)/3 - 1
@ -526,6 +570,9 @@ func initReflectChess2(Color string, Start, End, Diff, adjust int) {
for i := Start; i <= End; i++ { for i := Start; i <= End; i++ {
Lv := max(i-adjust, 1) Lv := max(i-adjust, 1)
ChessId := mergeDataCfg.GetChessIdByLvAndColor(Lv, Color) ChessId := mergeDataCfg.GetChessIdByLvAndColor(Lv, Color)
if ChessId == 0 {
continue
}
reflectChess[ChessId] = Diff reflectChess[ChessId] = Diff
} }
} }

View File

@ -518,11 +518,14 @@ func (p *PlayroomMod) Interact(Id, Type int) ([]*item.Item, int, error) {
PType, PEffect := playroomCfg.GetInteractPhysiology(Id) PType, PEffect := playroomCfg.GetInteractPhysiology(Id)
p.AddPhysiology(PType, PEffect) p.AddPhysiology(PType, PEffect)
p.AddMood(MoodType, Effect) p.AddMood(MoodType, Effect)
p.AddInteractNum()
return ItemList, PType, nil return ItemList, PType, nil
} }
func (p *PlayroomMod) AddInteractNum() { func (p *PlayroomMod) AddInteractNum(Lv int) {
Unlock := playroomCfg.GetInteractUnlock()
if Lv < Unlock {
return
}
p.InteractNum++ p.InteractNum++
p.InteractNum = min(p.InteractNum, playroomCfg.GetInteractNum()) p.InteractNum = min(p.InteractNum, playroomCfg.GetInteractNum())
} }
@ -578,14 +581,15 @@ func (p *PlayroomMod) SetRoom(Room map[int]int) (map[int]int, error) {
return diff, nil return diff, nil
} }
func (p *PlayroomMod) AddCollect(Id int) { func (p *PlayroomMod) AddCollect(Id int, Label string) {
p.NewCollect[Id] = &CollectInfo{ p.NewCollect[Id] = &CollectInfo{
Id: Id, Id: Id,
AddTime: GoUtil.Now(), AddTime: GoUtil.Now(),
Label: Label,
} }
} }
func (p *PlayroomMod) AddDress(Id int) { func (p *PlayroomMod) AddDress(Id int, Label string) {
Part := playroomCfg.GetDressPart(Id) Part := playroomCfg.GetDressPart(Id)
if _, ok := p.NewDress[Id]; !ok { if _, ok := p.NewDress[Id]; !ok {
p.NewDress[Id] = &DressInfo{ p.NewDress[Id] = &DressInfo{
@ -593,7 +597,7 @@ func (p *PlayroomMod) AddDress(Id int) {
Part: Part, Part: Part,
AddTime: GoUtil.Now(), AddTime: GoUtil.Now(),
EndTime: 0, EndTime: 0,
Label: "", Label: Label,
Num: 1, Num: 1,
} }
} else { } else {

View File

@ -18,6 +18,8 @@ const (
TRIGGER_LABEL_MERGELVTIME = "MergeLvTime" TRIGGER_LABEL_MERGELVTIME = "MergeLvTime"
TRIGGER_LABEL_FINISHORDER = "FinishOrder" TRIGGER_LABEL_FINISHORDER = "FinishOrder"
TRIGGER_LABEL_ENERGY = "Energy" TRIGGER_LABEL_ENERGY = "Energy"
TRIGGER_LABEL_STAR = "Star" // 收集宠物币
TRIGGER_LABEL_DIAMOND = "Diamond" // 消耗钻石
TRIGGER_LABEL_MERGETIME = "MergeTime" TRIGGER_LABEL_MERGETIME = "MergeTime"
TRIGGER_LABEL_STOKECAT = "StokeCat" TRIGGER_LABEL_STOKECAT = "StokeCat"
TRIGGER_LABEL_TAKECAT = "TakeCat" TRIGGER_LABEL_TAKECAT = "TakeCat"
@ -26,12 +28,16 @@ const (
TRIGGER_LABEL_CLEANCAT = "CleanCat" TRIGGER_LABEL_CLEANCAT = "CleanCat"
TRIGGER_LABEL_UPLV = "UpLv" // 升级 TRIGGER_LABEL_UPLV = "UpLv" // 升级
TRIGGER_LABEL_LOGIN = "Login" // 登录 TRIGGER_LABEL_LOGIN = "Login" // 登录
TRIGGER_LABEL_GUIDE_LOGIN = "GuideLogin" // 新手任务登录
TRIGGER_LABEL_INTERACT = "Interact" // 互动 TRIGGER_LABEL_INTERACT = "Interact" // 互动
TRIGGER_LABEL_PETDRESS = "PetDress" // 宠物换装 TRIGGER_LABEL_PETDRESS = "PetDress" // 宠物换装
TRIGGER_LABEL_VISITROOM = "VisitRoom" // 参观房间 TRIGGER_LABEL_VISITROOM = "VisitRoom" // 参观房间
TRIGGER_LABEL_PETTREASURE = "PetTreasure" // 宠物寻宝 TRIGGER_LABEL_PETTREASURE = "PetTreasure" // 宠物寻宝
TRIGGER_LABEL_ROOMDEC = "RoomDec" // 房间装饰 TRIGGER_LABEL_ROOMDEC = "RoomDec" // 房间装饰
TRIGGER_LABEL_PETWORK = "PetWork" // 宠物工作 TRIGGER_LABEL_PETWORK = "PetWork" // 宠物工作
TRIGGER_LABEL_DECORATE = "Decorate" // 装饰
TRIGGER_LABEL_PURCHASE = "Purchase" // 购买任意物品
TRIGGER_LABEL_BUBBLE = "Bubble" // 使用钻石打开气泡
) )
type QuestProgress struct { type QuestProgress struct {
@ -69,21 +75,27 @@ func TriggerQuestProgress(q *QuestProgress, Tr *Trigger) bool {
} }
switch q.Label { switch q.Label {
case TRIGGER_LABEL_ENERGY: // 消耗x能量 case TRIGGER_LABEL_ENERGY,
AddNum := Tr.A[0].(int) TRIGGER_LABEL_STAR,
TRIGGER_LABEL_DIAMOND,
TRIGGER_LABEL_DECORATE: // 消耗x能量
AddNum := GoUtil.Int(Tr.A[0])
q.Num += AddNum q.Num += AddNum
case TRIGGER_LABEL_MERGELVTIME: // 合成x级棋子y次 case TRIGGER_LABEL_MERGELVTIME: // 合成x级棋子y次
Lv, _ := Tr.A[0].(int) Lv := GoUtil.Int(Tr.A[0])
TargetLv, _ := strconv.Atoi(q.A[0].(string)) TargetLv, _ := strconv.Atoi(q.A[0].(string))
if TargetLv == Lv { if TargetLv == Lv {
q.Num += 1 q.Num += 1
} }
case TRIGGER_LABEL_GUIDE_LOGIN: // 引导任务登录
LoginDay := GoUtil.Int(q.A[0])
q.Num = LoginDay
case TRIGGER_LABEL_MERGETIME, // 合成x次 case TRIGGER_LABEL_MERGETIME, // 合成x次
TRIGGER_LABEL_FINISHORDER: // 完成x次订单 TRIGGER_LABEL_FINISHORDER,
TRIGGER_LABEL_BUBBLE: // 完成x次订单
q.Num += 1 q.Num += 1
case TRIGGER_LABEL_INTERACT: // 互动x类型y次 case TRIGGER_LABEL_INTERACT: // 互动x类型y次
InteractId := Tr.A[0].(int) InteractId := GoUtil.Int(Tr.A[0])
Ids := make([]int, 0) Ids := make([]int, 0)
for _, v := range q.A { for _, v := range q.A {
Ids = append(Ids, GoUtil.Int(v)) Ids = append(Ids, GoUtil.Int(v))
@ -113,7 +125,7 @@ func TriggerQuestProgress(q *QuestProgress, Tr *Trigger) bool {
func QuestProgressToMsg(quest *QuestProgress) *msg.QuestProgress { func QuestProgressToMsg(quest *QuestProgress) *msg.QuestProgress {
Param := 0 Param := 0
if len(quest.A) > 0 { if len(quest.A) > 0 {
Param, _ = strconv.Atoi(quest.A[0].(string)) Param = GoUtil.Int(quest.A[0])
} }
return &msg.QuestProgress{ return &msg.QuestProgress{
Label: quest.Label, Label: quest.Label,

View File

@ -19,9 +19,12 @@ type MergeDataRecord struct {
} }
type StartOrderData struct { type StartOrderData struct {
Id int `json:"Id"` Id int `json:"Id"`
MergeList []int `json:"merge_id_list"` MergeList []int `json:"merge_id_list"`
Step int `json:"step"` Step int `json:"step"`
Appear string `json:"appear"`
Preview string `json:"preview"`
Items []*item.Item
} }
type SevenLoginRewardData struct { type SevenLoginRewardData struct {

File diff suppressed because it is too large Load Diff