512 lines
11 KiB
Go
512 lines
11 KiB
Go
package chess
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"server/GoUtil"
|
|
mergeDataCfg "server/conf/mergeData"
|
|
startMergeCfg "server/conf/startMerge"
|
|
userCfg "server/conf/user"
|
|
"server/game/mod/item"
|
|
"server/msg"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
ModuleName = "chess"
|
|
ChessBoradMaxNum = 63
|
|
CHESS_SOURCE_CHEST = 705
|
|
CHESS_HIGH_SOURCE_CHEST = 706
|
|
)
|
|
|
|
type ChessBorad struct {
|
|
ChessList []int
|
|
EmitList map[int]int
|
|
ChessBuff []int
|
|
ChessBag ChessBag
|
|
ChessMap map[string]int32
|
|
Honor map[int]int // 荣誉室
|
|
Retire map[string]int // 退役发射器系列
|
|
RetireChessMap map[string][]int
|
|
}
|
|
|
|
type ChessBag struct {
|
|
List map[int]ChessBagGrid
|
|
Buy int
|
|
Free int
|
|
}
|
|
|
|
type ChessBagGrid struct {
|
|
ChessId int // 棋子id
|
|
EmitId int // 发射器id
|
|
}
|
|
|
|
func (cb *ChessBorad) IsEmpty() bool {
|
|
cb.ver()
|
|
return len(cb.ChessList) == 0
|
|
}
|
|
|
|
// 初始化棋盘
|
|
func (cb *ChessBorad) InitData() {
|
|
StartMerge := startMergeCfg.GetStartChessList()
|
|
cb.EmitList = make(map[int]int)
|
|
cb.ChessList = StartMerge
|
|
if cb.ChessBag.List == nil {
|
|
cb.ChessBag.List = make(map[int]ChessBagGrid)
|
|
InitNum := mergeDataCfg.GetChessBagInitNum()
|
|
for i := 1; i <= InitNum; i++ {
|
|
cb.ChessBag.List[i] = ChessBagGrid{}
|
|
}
|
|
}
|
|
}
|
|
|
|
func (cb *ChessBorad) ver() {
|
|
if cb.EmitList == nil {
|
|
cb.EmitList = make(map[int]int)
|
|
}
|
|
if cb.ChessBag.List == nil {
|
|
cb.ChessBag.List = make(map[int]ChessBagGrid)
|
|
InitNum := mergeDataCfg.GetChessBagInitNum()
|
|
for i := 1; i <= InitNum; i++ {
|
|
cb.ChessBag.List[i] = ChessBagGrid{}
|
|
}
|
|
}
|
|
if cb.ChessMap == nil {
|
|
cb.ChessMap = make(map[string]int32)
|
|
}
|
|
if cb.RetireChessMap == nil {
|
|
cb.RetireChessMap = make(map[string][]int)
|
|
}
|
|
if cb.Retire == nil {
|
|
cb.Retire = make(map[string]int)
|
|
}
|
|
if cb.Honor == nil {
|
|
cb.Honor = make(map[int]int)
|
|
}
|
|
}
|
|
|
|
// 棋子合成
|
|
func (cb *ChessBorad) ComposeChess(id int) (int, error) {
|
|
CfgRecord, err := mergeDataCfg.GetOne(id)
|
|
if err != nil {
|
|
return 0, errors.New("配置错误")
|
|
}
|
|
if CfgRecord.Lv == CfgRecord.MaxLv {
|
|
return 0, errors.New("已达最大等级")
|
|
}
|
|
count := 0
|
|
newList := make([]int, 0)
|
|
for _, chess := range cb.ChessList {
|
|
if chess == id && count < 2 {
|
|
count++
|
|
continue
|
|
}
|
|
newList = append(newList, chess)
|
|
}
|
|
|
|
if count < 2 {
|
|
return 0, errors.New("次数不足")
|
|
}
|
|
ChessType := mergeDataCfg.GetTypeById(id)
|
|
if ChessType == "Emitter" {
|
|
_, ok := cb.EmitList[id+1]
|
|
if ok {
|
|
cb.EmitList[id+1]++
|
|
} else {
|
|
cb.EmitList[id+1] = 1
|
|
}
|
|
if cb.EmitList[id] > 2 {
|
|
cb.EmitList[id] -= 2
|
|
} else {
|
|
delete(cb.EmitList, id)
|
|
}
|
|
}
|
|
id++
|
|
newList = append(newList, id)
|
|
|
|
cb.ChessList = newList
|
|
return id, nil
|
|
}
|
|
|
|
func (cb *ChessBorad) GetChessList() []int {
|
|
return cb.ChessList
|
|
}
|
|
|
|
// 添加棋子
|
|
func (cb *ChessBorad) AddChess(id int) error {
|
|
_, err := mergeDataCfg.GetOne(id)
|
|
if err != nil {
|
|
return errors.New("配置错误")
|
|
}
|
|
NewChessList := append(cb.ChessList, id)
|
|
if len(NewChessList) > ChessBoradMaxNum { // 棋盘满了 加入缓存区
|
|
cb.ChessBuff = append(cb.ChessBuff, id)
|
|
return nil
|
|
}
|
|
ChessType := mergeDataCfg.GetTypeById(id)
|
|
if ChessType == "Emitter" {
|
|
_, ok := cb.EmitList[id]
|
|
if ok {
|
|
cb.EmitList[id]++
|
|
} else {
|
|
cb.EmitList[id] = 1
|
|
}
|
|
}
|
|
cb.ChessList = append(cb.ChessList, id)
|
|
return nil
|
|
}
|
|
|
|
// 购买棋子
|
|
func (cb *ChessBorad) BuyChess(id int) (int, error) {
|
|
CfgRecord, err := mergeDataCfg.GetOne(id)
|
|
if err != nil {
|
|
return 0, errors.New("配置错误")
|
|
}
|
|
cb.ChessList = append(cb.ChessList, id)
|
|
ChessType := mergeDataCfg.GetTypeById(id)
|
|
if ChessType == "Emitter" {
|
|
_, ok := cb.EmitList[id]
|
|
if ok {
|
|
cb.EmitList[id]++
|
|
} else {
|
|
cb.EmitList[id] = 1
|
|
}
|
|
}
|
|
return CfgRecord.SellNum, nil
|
|
}
|
|
|
|
// 出售棋子
|
|
func (cb *ChessBorad) SellChess(id int) ([]*item.Item, error) {
|
|
CfgRecord, err := mergeDataCfg.GetOne(id)
|
|
if err != nil {
|
|
return nil, errors.New("配置错误")
|
|
}
|
|
count := 0
|
|
newList := make([]int, 0, len(cb.ChessList))
|
|
for _, chess := range cb.ChessList {
|
|
if chess == id && count < 1 {
|
|
count++
|
|
continue
|
|
}
|
|
newList = append(newList, chess)
|
|
}
|
|
|
|
if count < 1 {
|
|
return nil, errors.New("次数不足")
|
|
}
|
|
|
|
cb.ChessList = newList
|
|
var items []*item.Item
|
|
switch CfgRecord.SellType {
|
|
case "star":
|
|
items = append(items, &item.Item{Id: item.ITEM_STAR_ID, Num: CfgRecord.SellNum})
|
|
case "diamond":
|
|
items = append(items, &item.Item{Id: item.ITEM_DIAMOND_ID, Num: CfgRecord.SellNum})
|
|
case "energy":
|
|
items = append(items, &item.Item{Id: item.ITEM_ENERGY_ID, Num: CfgRecord.SellNum})
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
// 移除棋子
|
|
func (cb *ChessBorad) RemoveChess(Id int) error {
|
|
find := false
|
|
for k, v := range cb.ChessList {
|
|
if v == Id {
|
|
cb.ChessList = append(cb.ChessList[:k], cb.ChessList[k+1:]...)
|
|
find = true
|
|
break
|
|
}
|
|
}
|
|
if !find {
|
|
return errors.New("chess id not exist")
|
|
}
|
|
ChessType := mergeDataCfg.GetTypeById(Id)
|
|
if ChessType == "Emitter" {
|
|
v, ok := cb.EmitList[Id]
|
|
if v > 0 && ok {
|
|
cb.EmitList[Id]--
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (cb *ChessBorad) GetEmitList() []int {
|
|
result := make([]int, 0, len(cb.EmitList))
|
|
for k, v := range cb.EmitList {
|
|
EmitID := mergeDataCfg.GetEmitId(k)
|
|
if EmitID == "" {
|
|
continue
|
|
}
|
|
if cb.Retire[EmitID] == 2 {
|
|
continue
|
|
}
|
|
if v > 0 {
|
|
result = append(result, k)
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
|
|
// 完成订单 移除棋子
|
|
func (cb *ChessBorad) FinishOrder(ChessId []int) error {
|
|
for _, v := range ChessId {
|
|
err := cb.FinishOrderChess(v)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
func (cb *ChessBorad) FinishOrderChess(Chess int) error {
|
|
for k, v := range cb.ChessList {
|
|
if v == Chess {
|
|
cb.ChessList = append(cb.ChessList[:k], cb.ChessList[k+1:]...)
|
|
return nil
|
|
}
|
|
}
|
|
for k, v := range cb.ChessBag.List {
|
|
if v.ChessId == Chess {
|
|
cb.ChessBag.List[k] = ChessBagGrid{}
|
|
return nil
|
|
}
|
|
}
|
|
return errors.New("order finish chess id not exist")
|
|
}
|
|
|
|
// 棋子转换
|
|
func (cb *ChessBorad) ExChess(OldChessId, NewChessId int) error {
|
|
if OldChessId > 0 {
|
|
newList, b := GoUtil.PopElemSlice(cb.ChessList, OldChessId)
|
|
if !b {
|
|
return fmt.Errorf("ExChess chess id not exist")
|
|
}
|
|
cb.ChessList = newList
|
|
}
|
|
return cb.AddChess(NewChessId)
|
|
}
|
|
|
|
// 增加棋盘缓冲器
|
|
func (cb *ChessBorad) AddChessBuff(chess int) {
|
|
cb.ChessBuff = append(cb.ChessBuff, chess)
|
|
}
|
|
|
|
func (cb *ChessBorad) AddHonor(Id int) {
|
|
cb.Honor[Id] = 1
|
|
}
|
|
|
|
func (cb *ChessBorad) RemoveHonor(Id int) {
|
|
delete(cb.Honor, Id)
|
|
}
|
|
|
|
func (cb *ChessBorad) GetChessFromBuff(Chess int) error {
|
|
for i, v := range cb.ChessBuff {
|
|
if v == Chess {
|
|
cb.ChessBuff = append(cb.ChessBuff[:i], cb.ChessBuff[i+1:]...)
|
|
cb.AddChess(Chess)
|
|
return nil
|
|
}
|
|
}
|
|
return errors.New("chess id not exist")
|
|
}
|
|
|
|
// 返回数据
|
|
func (cb *ChessBorad) BackData() *msg.ResPlayerChessInfo {
|
|
var ChessBagGrids []*msg.ChessBagGrid
|
|
for k, v := range cb.ChessBag.List {
|
|
ChessBagGrids = append(ChessBagGrids, &msg.ChessBagGrid{
|
|
Id: int32(k),
|
|
ChessId: int32(v.ChessId),
|
|
EmitId: int32(v.EmitId),
|
|
})
|
|
}
|
|
Re := make([]string, 0)
|
|
for k, v := range cb.Retire {
|
|
if v == 3 {
|
|
Re = append(Re, k)
|
|
}
|
|
}
|
|
Ho := make([]int32, 0)
|
|
for k := range cb.Honor {
|
|
Ho = append(Ho, int32(k))
|
|
}
|
|
return &msg.ResPlayerChessInfo{
|
|
ChessList: GoUtil.SliceIntToInt32(cb.ChessList),
|
|
ChessBuff: GoUtil.SliceIntToInt32(cb.ChessBuff),
|
|
RetireEmit: Re,
|
|
Honor: Ho,
|
|
ChessBag: &msg.ChessBag{
|
|
ChessBagGrids: ChessBagGrids,
|
|
ChessBuyCnt: int32(cb.ChessBag.Buy),
|
|
ChessFreeCnt: int32(cb.ChessBag.Free),
|
|
},
|
|
}
|
|
}
|
|
|
|
// 解锁棋盘背包
|
|
func (cb *ChessBorad) BuyChessBagGrid() error {
|
|
if cb.ChessBag.Free > 0 {
|
|
cb.ChessBag.List[len(cb.ChessBag.List)+1] = ChessBagGrid{}
|
|
cb.ChessBag.Free--
|
|
return nil
|
|
}
|
|
MaxBuy := mergeDataCfg.GetChessBagBugNum()
|
|
if cb.ChessBag.Buy >= MaxBuy {
|
|
return fmt.Errorf("ChessBag can buy is full")
|
|
}
|
|
cb.ChessBag.Buy++
|
|
cb.ChessBag.List[len(cb.ChessBag.List)+1] = ChessBagGrid{}
|
|
return nil
|
|
}
|
|
|
|
func (cb *ChessBorad) GetBuyChessBagGridCost() []*item.Item {
|
|
if cb.ChessBag.Free > 0 {
|
|
return nil
|
|
}
|
|
NeedDiamond := 10 + 15*cb.ChessBag.Buy
|
|
return []*item.Item{{Id: item.ITEM_DIAMOND_ID, Num: -NeedDiamond}}
|
|
}
|
|
|
|
// 升级触发解锁棋盘背包
|
|
func (cb *ChessBorad) TriggerChessBagUnlock(Lv int) bool {
|
|
UnlockPack := userCfg.GetUnlockPack(Lv)
|
|
if UnlockPack > 0 {
|
|
cb.ChessBag.Free += UnlockPack
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (cb *ChessBorad) PutChessInBag(Grid, ChessId, EmitId int) error {
|
|
err := cb.RemoveChess(ChessId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
EmitColorId := mergeDataCfg.GetEmitId(ChessId)
|
|
ChessLv := mergeDataCfg.GetLvById(ChessId)
|
|
ChessMaxLv := mergeDataCfg.GetMaxLvById(ChessId)
|
|
if ChessLv == ChessMaxLv && cb.Retire[EmitColorId] == 3 { // 退役发射器 加入荣誉室
|
|
cb.AddHonor(ChessId)
|
|
return nil
|
|
}
|
|
v, ok := cb.ChessBag.List[Grid]
|
|
if !ok {
|
|
return errors.New("ChessBag Grid unlock")
|
|
}
|
|
|
|
if v.ChessId > 0 {
|
|
return errors.New("ChessBag Grid is not empty")
|
|
}
|
|
cb.ChessBag.List[Grid] = ChessBagGrid{
|
|
ChessId: ChessId,
|
|
EmitId: EmitId,
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (cb *ChessBorad) TakeChessOutBag(Grid int) error {
|
|
if Grid < 0 {
|
|
cb.RemoveHonor(-Grid)
|
|
cb.AddChess(-Grid)
|
|
return nil
|
|
}
|
|
GridInfo, ok := cb.ChessBag.List[Grid]
|
|
if !ok {
|
|
return errors.New("ChessBag Grid unlock")
|
|
}
|
|
if GridInfo.ChessId == 0 {
|
|
return errors.New("ChessBag Grid is empty")
|
|
}
|
|
cb.ChessBag.List[Grid] = ChessBagGrid{}
|
|
return cb.AddChess(GridInfo.ChessId)
|
|
}
|
|
|
|
func (cb *ChessBorad) GetOrderEmit() []int {
|
|
r := make([]int, 0)
|
|
for k, v := range cb.EmitList {
|
|
if v <= 0 {
|
|
continue
|
|
}
|
|
EmitId := mergeDataCfg.GetEmitId(k)
|
|
if cb.Retire[EmitId] > 0 {
|
|
continue
|
|
}
|
|
r = append(r, k)
|
|
}
|
|
return r
|
|
}
|
|
|
|
func (cb *ChessBorad) GetRetireEmit() map[string]int {
|
|
return cb.Retire
|
|
}
|
|
|
|
func (cb *ChessBorad) GetRetireChess(EmitType string) []int {
|
|
v, ok := cb.RetireChessMap[EmitType]
|
|
if !ok {
|
|
return nil
|
|
}
|
|
if len(v) == 1 {
|
|
cb.RetireChessMap[EmitType] = nil
|
|
return v
|
|
}
|
|
if len(v) == 0 {
|
|
return nil
|
|
}
|
|
cb.RetireChessMap[EmitType] = v[2:]
|
|
return v[:2]
|
|
}
|
|
|
|
func (cb *ChessBorad) BeginRetire(EmitType string) error {
|
|
_, ok := cb.Retire[EmitType]
|
|
if ok {
|
|
return errors.New("chess has been retired")
|
|
}
|
|
cb.Retire[EmitType] = 1
|
|
return nil
|
|
}
|
|
|
|
func (cb *ChessBorad) RetireOrder(EmitType string) error {
|
|
if cb.Retire[EmitType] != 1 {
|
|
return errors.New("chess has not been retired")
|
|
}
|
|
chess := make([]int, 0)
|
|
EmitProduct := mergeDataCfg.GetEmitProduce(EmitType)
|
|
for k, v := range cb.ChessMap {
|
|
arr := strings.Split(k, "@")
|
|
Color := mergeDataCfg.GetColorById(int(v))
|
|
if arr[2] == "0" && GoUtil.InStringArray(Color, EmitProduct) {
|
|
chess = append(chess, int(v))
|
|
}
|
|
}
|
|
|
|
sort.Sort(sort.Reverse(sort.IntSlice(chess)))
|
|
cb.RetireChessMap[EmitType] = chess
|
|
cb.Retire[EmitType] = 2
|
|
return nil
|
|
}
|
|
|
|
func (cb *ChessBorad) FinishRetire(EmitType string) error {
|
|
_, ok := cb.Retire[EmitType]
|
|
if !ok {
|
|
return errors.New("chess has not been retired")
|
|
}
|
|
cb.Retire[EmitType] = 3
|
|
return nil
|
|
}
|
|
|
|
func (cb *ChessBorad) SourceChest(ChessId int) ([]*item.Item, error) {
|
|
err := cb.RemoveChess(ChessId)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if ChessId == CHESS_SOURCE_CHEST {
|
|
return mergeDataCfg.GetSourceChestItem(), nil
|
|
}
|
|
if ChessId == CHESS_HIGH_SOURCE_CHEST {
|
|
return mergeDataCfg.GetHighSourceChestItem(), nil
|
|
}
|
|
|
|
return nil, nil
|
|
}
|