228 lines
6.5 KiB
Go
228 lines
6.5 KiB
Go
package game
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"server/GoUtil"
|
|
mergeDataCfg "server/conf/mergeData"
|
|
"server/game/mod/item"
|
|
"server/game/mod/quest"
|
|
"server/msg"
|
|
"server/pkg/github.com/name5566/leaf/log"
|
|
"sort"
|
|
|
|
"google.golang.org/protobuf/proto"
|
|
)
|
|
|
|
type PlayerChessData struct {
|
|
*PlayerData
|
|
Data msg.ResPlayerChessData
|
|
ColorData msg.ResChessColorData
|
|
}
|
|
|
|
func (p *PlayerChessData) LoadDataFromDB(dwUin interface{}) bool {
|
|
|
|
return true
|
|
}
|
|
|
|
func (p *PlayerChessData) Reconnect(b bool) {
|
|
|
|
}
|
|
|
|
func (p *PlayerChessData) SaveDataFromDB(Key interface{}) bool {
|
|
|
|
return true
|
|
}
|
|
|
|
func (p *PlayerChessData) ResPlayerChessData(player *Player) {
|
|
if player != p.M_Player {
|
|
return
|
|
}
|
|
agent := p.GetPlayer().GetAgentByPlayer()
|
|
Msg := &p.Data
|
|
ChessMod := p.M_Player.PlayMod.getChessMod()
|
|
Msg.ChessList = ChessMod.BackData().ChessList
|
|
Msg.MChessData = ChessMod.ChessMap
|
|
data, _ := proto.Marshal(Msg)
|
|
G_getGameLogic().PackResInfo(agent, "ResPlayerChessData", data)
|
|
}
|
|
|
|
func (p *PlayerChessData) ResChessColorData(player *Player) {
|
|
if player != p.M_Player {
|
|
return
|
|
}
|
|
agent := p.GetPlayer().GetAgentByPlayer()
|
|
data, _ := proto.Marshal(&p.ColorData)
|
|
G_getGameLogic().PackResInfo(agent, "ResChessColorData", data)
|
|
}
|
|
|
|
// 同步棋盘数据
|
|
func (p *PlayerChessData) UpdatePlayerChessData(buf []byte) error {
|
|
update := &msg.UpdatePlayerChessData{}
|
|
proto.Unmarshal(buf, update)
|
|
err := p.HandleChess(update.MChessHandle)
|
|
if err != nil {
|
|
res := &msg.ResUpdatePlayerChessData{
|
|
Code: msg.RES_CODE_FAIL,
|
|
Msg: err.Error(),
|
|
}
|
|
p.M_Player.SendErrClienRes(res)
|
|
return err
|
|
}
|
|
p.M_Player.PushClientRes(&msg.ResUpdatePlayerChessData{
|
|
Code: msg.RES_CODE_SUCCESS,
|
|
})
|
|
p.Data.MChessData = update.MChessData
|
|
|
|
if !p.checkChessEqual() {
|
|
res := &msg.ResUpdatePlayerChessData{
|
|
Code: msg.RES_CODE_FAIL,
|
|
Msg: "棋子数据不一致",
|
|
}
|
|
log.Debug("棋子数据不一致, %v---%v", p.Data.MChessData, p.M_Player.PlayMod.getChessMod().GetChessList())
|
|
p.M_Player.SendErrClienRes(res)
|
|
return fmt.Errorf("棋子数据不一致")
|
|
}
|
|
p.M_Player.PlayMod.getChessMod().ChessMap = update.MChessData
|
|
return nil
|
|
}
|
|
|
|
func (p *PlayerChessData) UpdateChessData(MChessData map[string]int32) error {
|
|
p.Data.MChessData = MChessData
|
|
if !p.checkChessEqual() {
|
|
res := &msg.ResUpdatePlayerChessData{
|
|
Code: msg.RES_CODE_FAIL,
|
|
Msg: "棋子数据不一致",
|
|
}
|
|
log.Debug("棋子数据不一致, %v---%v", p.Data.MChessData, p.M_Player.PlayMod.getChessMod().GetChessList())
|
|
p.M_Player.SendErrClienRes(res)
|
|
return fmt.Errorf("棋子数据不一致")
|
|
}
|
|
p.M_Player.PlayMod.getChessMod().ChessMap = MChessData
|
|
return nil
|
|
}
|
|
|
|
// 检查棋子数据是否一致
|
|
func (p *PlayerChessData) checkChessEqual() bool {
|
|
if len(p.Data.MChessData) == 0 {
|
|
return true
|
|
}
|
|
ChessList := p.M_Player.PlayMod.getChessMod().GetChessList()
|
|
if len(ChessList) != len(p.Data.MChessData) {
|
|
return false
|
|
}
|
|
aCopy := make([]int, len(ChessList))
|
|
bCopy := make([]int, len(p.Data.MChessData))
|
|
for _, v := range ChessList {
|
|
aCopy = append(aCopy, int(v))
|
|
}
|
|
|
|
for _, v := range p.Data.MChessData {
|
|
bCopy = append(bCopy, int(v))
|
|
}
|
|
return SlicesEqual(aCopy, bCopy)
|
|
}
|
|
|
|
// 棋子操作
|
|
func (p *PlayerChessData) HandleChess(handle_list []*msg.ChessHandle) error {
|
|
sort.Slice(handle_list, func(i, j int) bool {
|
|
return handle_list[i].Id < handle_list[j].Id
|
|
})
|
|
ChessMod := p.M_Player.PlayMod.getChessMod()
|
|
HandbookMod := p.M_Player.PlayMod.getHandbookMod()
|
|
var addChessCostEnergy int
|
|
var buyChess int
|
|
TriggerList := make([]*quest.Trigger, 0)
|
|
itemList := make([]*item.Item, 0)
|
|
AddChessList := make([]int, 0)
|
|
AddNewEmit := make([]int, 0)
|
|
for _, v := range handle_list {
|
|
ChessId := int(v.ChessId)
|
|
EmitId := int(v.Emit)
|
|
switch v.Type {
|
|
case msg.HANDLE_TYPE_ADD: //增加棋子
|
|
err := ChessMod.AddChess(ChessId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
AddChessList = append(AddChessList, ChessId)
|
|
if !GoUtil.InArray(EmitId, []int{561, 562, 563, 564, 701, 702, 703, 704, 705, 706, 0}) { // 宝箱生成的棋子不扣体力
|
|
addChessCostEnergy++
|
|
}
|
|
|
|
b := HandbookMod.SetHandbook(ChessId) // 添加图鉴
|
|
if b {
|
|
p.M_Player.TeLog("collection_add", map[string]interface{}{
|
|
"item_id": ChessId,
|
|
"item_name": mergeDataCfg.GetNameById(ChessId),
|
|
})
|
|
AddNewEmit = append(AddNewEmit, ChessId)
|
|
}
|
|
p.M_Player.PushClientRes(HandbookMod.BackData())
|
|
case msg.HANDLE_TYPE_COMPOSE: //合成棋子
|
|
NewChessId, err := ChessMod.ComposeChess(ChessId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
HandbookMod := p.M_Player.PlayMod.getHandbookMod() // 添加图鉴
|
|
b := HandbookMod.SetHandbook(NewChessId)
|
|
if b {
|
|
AddNewEmit = append(AddNewEmit, NewChessId)
|
|
}
|
|
AddChessList = append(AddChessList, NewChessId)
|
|
NewChessIdLv := mergeDataCfg.GetLvById(NewChessId)
|
|
TriggerList = append(TriggerList, &quest.Trigger{Label: quest.TRIGGER_LABEL_MERGELVTIME, A: []interface{}{NewChessIdLv}})
|
|
TriggerList = append(TriggerList, &quest.Trigger{Label: quest.TRIGGER_LABEL_MERGETIME})
|
|
p.M_Player.PushClientRes(HandbookMod.BackData())
|
|
// 获取活动道具
|
|
ActItem := GetActivityItem(p.M_Player, GoUtil.Int32ToInt(v.ActType))
|
|
itemList = item.Merge(itemList, ActItem)
|
|
case msg.HANDLE_TYPE_BUY: //购买棋子
|
|
loseGold, err := ChessMod.BuyChess(ChessId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
buyChess += loseGold
|
|
itemList = append(itemList, &item.Item{Id: item.ITEM_STAR_ID, Num: int(-loseGold)})
|
|
case msg.HANDLE_TYPE_SELL: //出售棋子
|
|
items, err := ChessMod.SellChess(ChessId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
p.M_Player.TeLog("sell_item", map[string]interface{}{
|
|
"merge_item_id": ChessId,
|
|
"get_star_num": items[0].Num,
|
|
})
|
|
itemList = item.Merge(itemList, items)
|
|
case msg.HANDLE_TYPE_REMOVE: //移除棋子
|
|
ChessMod.RemoveChess(ChessId)
|
|
}
|
|
|
|
}
|
|
|
|
//扣除体力
|
|
if addChessCostEnergy > 0 {
|
|
EnergyPow := p.M_Player.PlayMod.getBaseMod().GetEnergyMul()
|
|
ReduceEneny := int(math.Pow(2, float64(EnergyPow))) * addChessCostEnergy
|
|
itemList = append(itemList, &item.Item{Id: item.ITEM_ENERGY_ID, Num: -ReduceEneny})
|
|
}
|
|
err := p.M_Player.HandleItem(itemList, msg.ITEM_POP_LABEL_HandleChess.String())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
OrderMod := p.M_Player.PlayMod.getOrderMod()
|
|
Update := OrderMod.CreateExtraOrder(AddChessList, AddNewEmit, ChessMod.GetChessList())
|
|
if Update {
|
|
p.M_Player.PushClientRes(OrderMod.BackData())
|
|
}
|
|
p.M_Player.QuestTriggerList(TriggerList)
|
|
EmitRetireTrigger1(p.M_Player)
|
|
p.M_Player.PushClientRes(ChessMod.BackData())
|
|
p.M_Player.PlayMod.save()
|
|
return nil
|
|
}
|
|
|
|
func (p *PlayerChessData) ClearData() bool {
|
|
return true
|
|
}
|