|
|
|
package live_logic
|
|
|
|
|
|
|
|
import (
|
|
|
|
"dcg/game/manager"
|
|
|
|
"dcg/game/pb"
|
|
|
|
pbCommon "dcg/game/pb/common"
|
|
|
|
pbGameZhgzd "dcg/game/pb/game/zhgzd"
|
|
|
|
pbMq "dcg/game/pb/mq"
|
|
|
|
pbRoom "dcg/game/pb/room"
|
|
|
|
"dcg/game/svc"
|
|
|
|
"dcg/pkg/cmd"
|
|
|
|
"git.noahlan.cn/northlan/ntools-go/logger"
|
|
|
|
"math/rand"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
type ZhgzdGameLogic struct {
|
|
|
|
svcCtx *svc.ServiceContext
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewZhgzdLiveGameLogic(svcCtx *svc.ServiceContext) *ZhgzdGameLogic {
|
|
|
|
return &ZhgzdGameLogic{
|
|
|
|
svcCtx: svcCtx,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h *ZhgzdGameLogic) WithGameType() LogicOption {
|
|
|
|
return WithGameType(pbRoom.GameType_name[int32(pbRoom.GameType_ZHGZD)])
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h *ZhgzdGameLogic) WithCmdParserLogic(p []cmd.Pattern) LogicOption {
|
|
|
|
pattern := []cmd.Pattern{
|
|
|
|
{
|
|
|
|
Prefix: "j",
|
|
|
|
Alias: []string{"加入", "加入游戏"},
|
|
|
|
ContentMaxLen: 0,
|
|
|
|
}, {
|
|
|
|
Prefix: "c",
|
|
|
|
Alias: []string{"换兵"},
|
|
|
|
ContentMaxLen: 1,
|
|
|
|
}, {
|
|
|
|
Prefix: "w",
|
|
|
|
Alias: []string{"我在哪"},
|
|
|
|
ContentMaxLen: 0,
|
|
|
|
}, {
|
|
|
|
Prefix: "s",
|
|
|
|
ContentMaxLen: 1,
|
|
|
|
}, {
|
|
|
|
Prefix: "m",
|
|
|
|
ContentMaxLen: 1,
|
|
|
|
}, {
|
|
|
|
Prefix: "r",
|
|
|
|
ContentMaxLen: 1,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
pattern = append(pattern, p...)
|
|
|
|
cmdParser := cmd.NewCMDParser(pattern...)
|
|
|
|
cmdParser.SetDistinct(true)
|
|
|
|
|
|
|
|
return WithCmdParser(cmdParser)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h *ZhgzdGameLogic) WithCmdHandlers() LogicOption {
|
|
|
|
return func(logic LiveLogic) {
|
|
|
|
logic.RegisterCMDHandler(h.handleJoinGame, "j")
|
|
|
|
logic.RegisterCMDHandler(h.handleDispatch, "s")
|
|
|
|
logic.RegisterCMDHandler(h.handleOutbreak, "s")
|
|
|
|
logic.RegisterCMDHandler(h.handleChangeUnit, "c")
|
|
|
|
logic.RegisterCMDHandler(h.handlePosition, "p")
|
|
|
|
logic.RegisterCMDHandler(h.handleMove, "m")
|
|
|
|
logic.RegisterCMDHandler(h.handleWhere, "w")
|
|
|
|
logic.RegisterCMDHandler(h.handleMode, "r")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h *ZhgzdGameLogic) WithGiftHandler() LogicOption {
|
|
|
|
return WithGiftHandler(func(next GiftHandlerFunc) GiftHandlerFunc {
|
|
|
|
return func(liveRoom *LiveRoom, user *pbCommon.PbUser, gift *pbMq.MqGift) {
|
|
|
|
h.handleGift(liveRoom, user, gift)
|
|
|
|
next(liveRoom, user, gift)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h *ZhgzdGameLogic) handleJoinGame(liveRoom *LiveRoom, _ string, _ []rune, user *pbCommon.PbUser) {
|
|
|
|
room, err := manager.GameManager.RoomByLiveRoom(liveRoom.RoomId, liveRoom.Platform)
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
logger.SLog.Debugf("用户 [%s] 加入游戏", user.Username)
|
|
|
|
room.Broadcast(pb.PushZhgzdJoinGame, &pbGameZhgzd.JoinGame{User: user})
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h *ZhgzdGameLogic) handleDispatch(liveRoom *LiveRoom, msgId string, content []rune, user *pbCommon.PbUser) {
|
|
|
|
room, err := manager.GameManager.RoomByLiveRoom(liveRoom.RoomId, liveRoom.Platform)
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if len(content) == 0 {
|
|
|
|
h.handleOutbreak(liveRoom, msgId, content, user)
|
|
|
|
} else {
|
|
|
|
|
|
|
|
const cmdType = "s"
|
|
|
|
unitType := string(content[0])
|
|
|
|
|
|
|
|
cfg := h.svcCtx.Config.Game.Zhgzd
|
|
|
|
unitId := cfg.CommandUnitDict[unitType]
|
|
|
|
count := cfg.DispatchCountDict[unitId]
|
|
|
|
var costSp int32
|
|
|
|
if costCfg, ok := cfg.CommandCostDict[cmdType]; ok {
|
|
|
|
costSp = costCfg.Units[unitId]
|
|
|
|
}
|
|
|
|
|
|
|
|
logger.SLog.Debugf("用户 [%s] 战略出兵 %s x %d cost:%d", user.Username, unitId, count, costSp)
|
|
|
|
|
|
|
|
room.Broadcast(pb.PushZhgzdDispatch, &pbGameZhgzd.DispatchUnit{
|
|
|
|
User: user,
|
|
|
|
CostSp: costSp,
|
|
|
|
Id: unitId,
|
|
|
|
Count: count,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h *ZhgzdGameLogic) handleOutbreak(liveRoom *LiveRoom, _ string, content []rune, user *pbCommon.PbUser) {
|
|
|
|
room, err := manager.GameManager.RoomByLiveRoom(liveRoom.RoomId, liveRoom.Platform)
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if len(content) == 0 {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
const cmdType = "s"
|
|
|
|
|
|
|
|
cfg := h.svcCtx.Config.Game.Zhgzd
|
|
|
|
var costSp int32
|
|
|
|
if costCfg, ok := cfg.CommandCostDict[cmdType]; ok {
|
|
|
|
costSp = costCfg.Common
|
|
|
|
}
|
|
|
|
|
|
|
|
logger.SLog.Debugf("用户 [%s] 征召模式暴兵 cost:%d", user.Username, costSp)
|
|
|
|
|
|
|
|
room.Broadcast(pb.PushZhgzdOutbreak, &pbGameZhgzd.Outbreak{
|
|
|
|
User: user,
|
|
|
|
CostSp: costSp,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h *ZhgzdGameLogic) handleChangeUnit(liveRoom *LiveRoom, _ string, content []rune, user *pbCommon.PbUser) {
|
|
|
|
room, err := manager.GameManager.RoomByLiveRoom(liveRoom.RoomId, liveRoom.Platform)
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if len(content) == 0 {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
const cmdType = "c"
|
|
|
|
unitType := string(content[0])
|
|
|
|
|
|
|
|
cfg := h.svcCtx.Config.Game.Zhgzd
|
|
|
|
unitId := cfg.CommandUnitDict[unitType]
|
|
|
|
var costSp int32
|
|
|
|
if costCfg, ok := cfg.CommandCostDict[cmdType]; ok {
|
|
|
|
costSp = costCfg.Common
|
|
|
|
}
|
|
|
|
|
|
|
|
logger.SLog.Debugf("用户 [%s] 更改生产单位 %s cost:%d", user.Username, unitId, costSp)
|
|
|
|
|
|
|
|
room.Broadcast(pb.PushZhgzdChangeUnit, &pbGameZhgzd.ChangeUnit{
|
|
|
|
User: user,
|
|
|
|
CostSp: costSp,
|
|
|
|
Id: unitId,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h *ZhgzdGameLogic) handlePosition(liveRoom *LiveRoom, _ string, content []rune, user *pbCommon.PbUser) {
|
|
|
|
room, err := manager.GameManager.RoomByLiveRoom(liveRoom.RoomId, liveRoom.Platform)
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(content) == 0 {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
const cmdType = "p"
|
|
|
|
|
|
|
|
cfg := h.svcCtx.Config.Game.Zhgzd
|
|
|
|
var costSp int32
|
|
|
|
if costCfg, ok := cfg.CommandCostDict[cmdType]; ok {
|
|
|
|
costSp = costCfg.Common
|
|
|
|
}
|
|
|
|
|
|
|
|
pos := string(content[0])
|
|
|
|
|
|
|
|
logger.SLog.Debugf("用户 [%s] 移动位置到 %s cost:%d", user.Username, pos, costSp)
|
|
|
|
|
|
|
|
room.Broadcast(pb.PushZhgzdPosition, &pbGameZhgzd.Position{
|
|
|
|
User: user,
|
|
|
|
Position: pos,
|
|
|
|
CostSp: costSp,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h *ZhgzdGameLogic) handleMove(liveRoom *LiveRoom, _ string, content []rune, user *pbCommon.PbUser) {
|
|
|
|
room, err := manager.GameManager.RoomByLiveRoom(liveRoom.RoomId, liveRoom.Platform)
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(content) == 0 {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
const cmdType = "m"
|
|
|
|
|
|
|
|
cfg := h.svcCtx.Config.Game.Zhgzd
|
|
|
|
var costSp int32
|
|
|
|
if costCfg, ok := cfg.CommandCostDict[cmdType]; ok {
|
|
|
|
costSp = costCfg.Common
|
|
|
|
}
|
|
|
|
|
|
|
|
line := string(content[0])
|
|
|
|
|
|
|
|
logger.SLog.Debugf("用户 [%s] 选择出兵路线 %s cost:%d", user.Username, line, costSp)
|
|
|
|
|
|
|
|
room.Broadcast(pb.PushZhgzdMove, &pbGameZhgzd.ChangeLine{
|
|
|
|
User: user,
|
|
|
|
CostSp: costSp,
|
|
|
|
Line: line,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h *ZhgzdGameLogic) handleWhere(liveRoom *LiveRoom, _ string, _ []rune, user *pbCommon.PbUser) {
|
|
|
|
room, err := manager.GameManager.RoomByLiveRoom(liveRoom.RoomId, liveRoom.Platform)
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
logger.SLog.Debugf("用户 [%s] 查询位置", user.Username)
|
|
|
|
|
|
|
|
room.Broadcast(pb.PushZhgzdWhere, &pbGameZhgzd.Where{User: user})
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h *ZhgzdGameLogic) handleMode(liveRoom *LiveRoom, _ string, content []rune, user *pbCommon.PbUser) {
|
|
|
|
room, err := manager.GameManager.RoomByLiveRoom(liveRoom.RoomId, liveRoom.Platform)
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if len(content) == 0 {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
const cmdType = "r"
|
|
|
|
|
|
|
|
cfg := h.svcCtx.Config.Game.Zhgzd
|
|
|
|
var costSp int32
|
|
|
|
if costCfg, ok := cfg.CommandCostDict[cmdType]; ok {
|
|
|
|
costSp = costCfg.Common
|
|
|
|
}
|
|
|
|
|
|
|
|
mode := string(content[0])
|
|
|
|
|
|
|
|
logger.SLog.Debugf("用户 [%s] 切换玩家模式 %s cost:%d", user.Username, mode, costSp)
|
|
|
|
|
|
|
|
room.Broadcast(pb.PushZhgzdMode, &pbGameZhgzd.PlayerMode{
|
|
|
|
User: user,
|
|
|
|
Mode: mode,
|
|
|
|
CostSp: costSp,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h *ZhgzdGameLogic) handleGift(liveRoom *LiveRoom, user *pbCommon.PbUser, gift *pbMq.MqGift) {
|
|
|
|
room, err := manager.GameManager.RoomByLiveRoom(liveRoom.RoomId, liveRoom.Platform)
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
cfg := h.svcCtx.Config.Game.Zhgzd.GiftEffect
|
|
|
|
|
|
|
|
logger.SLog.Debugf("用户 [%s] 赠送礼物 %s x %d", user.Username, gift.GiftName, gift.GiftNum)
|
|
|
|
|
|
|
|
// 战略点回复速度
|
|
|
|
for _, id := range cfg.StrategicRecover.GiftIds {
|
|
|
|
if gift.GiftId == id {
|
|
|
|
for i := 0; i < int(gift.GiftNum); i++ {
|
|
|
|
logger.SLog.Debugf("用户 [%s] 战略点恢复速度提高 %d x%ds", user.Username, cfg.StrategicRecover.Addon, cfg.StrategicRecover.Duration)
|
|
|
|
room.Broadcast("game.sp", &pbGameZhgzd.StrategicPoint{
|
|
|
|
User: user,
|
|
|
|
AddSpeed: cfg.StrategicRecover.Addon,
|
|
|
|
AddSpeedDuration: cfg.StrategicRecover.Duration,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 战略点上限
|
|
|
|
for _, id := range cfg.StrategicMaximal.GiftIds {
|
|
|
|
if gift.GiftId == id {
|
|
|
|
for i := 0; i < int(gift.GiftNum); i++ {
|
|
|
|
logger.SLog.Debugf("用户 [%s] 战略点上限提高 %d", user.Username, cfg.StrategicMaximal.Addon)
|
|
|
|
room.Broadcast("game.sp", &pbGameZhgzd.StrategicPoint{
|
|
|
|
User: user,
|
|
|
|
AddLimit: cfg.StrategicMaximal.Addon,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 支援技能
|
|
|
|
rand.Seed(time.Now().UnixNano())
|
|
|
|
for _, sCfg := range cfg.SupportSkill {
|
|
|
|
for _, id := range sCfg.GiftIds {
|
|
|
|
if gift.GiftId == id && len(sCfg.SkillIds) > 0 {
|
|
|
|
for i := 0; i < int(gift.GiftNum); i++ {
|
|
|
|
// skill 随机
|
|
|
|
tmpSkill := sCfg.SkillIds[0]
|
|
|
|
if len(sCfg.SkillIds) > 1 {
|
|
|
|
randomInt := rand.Intn(len(sCfg.SkillIds))
|
|
|
|
tmpSkill = sCfg.SkillIds[randomInt]
|
|
|
|
//logger.SLog.Debugf("礼物随机值 %d, ID: %s", randomInt, tmpSkill)
|
|
|
|
}
|
|
|
|
room.Broadcast("game.support", &pbGameZhgzd.SupportSkill{
|
|
|
|
User: user,
|
|
|
|
Id: tmpSkill,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 超级技能
|
|
|
|
for _, id := range cfg.SuperSkill.GiftIds {
|
|
|
|
if gift.GiftId == id {
|
|
|
|
for i := 0; i < int(gift.GiftNum); i++ {
|
|
|
|
logger.SLog.Debugf("用户 [%s] 释放超级技能", user.Username)
|
|
|
|
room.Broadcast("game.superSkill", &pbGameZhgzd.SuperSkill{
|
|
|
|
User: user,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|