game_sync/robot/fishing/fishplayer.go

321 lines
8.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package fishing
import (
"fmt"
"math/rand"
"mongo.games.com/game/common"
"mongo.games.com/game/proto"
fish_proto "mongo.games.com/game/protocol/fishing"
hall_proto "mongo.games.com/game/protocol/gamehall"
server_proto "mongo.games.com/game/protocol/server"
"mongo.games.com/game/robot/base"
"mongo.games.com/goserver/core/logger"
"time"
)
type FishingPlayer struct {
base.BasePlayer
*fish_proto.FishingPlayerData
dbGameFree *server_proto.DB_GameFree //自由场数据
scene *FishingScene
changePowerTs int64
changePower2Ts int64 //倍率递归变化时间间隔
lifeTimeTs int64
fireTimeTs int64
leaveTimeTs int64
changeVIPTimeTs int64
changeVIPTime int64
curPower int32 //当前倍率
targetPower int32 //目标倍率
lockFish int32 //当前锁定攻击的鱼
logicTick int32 //逻辑时钟
bulletSeq int32 //子弹增长因子
bulletId int32 //子弹编号
}
func NewFishingPlayer(data *fish_proto.FishingPlayerData, sceneEx *FishingScene, gameFreeId, roomId int32) *FishingPlayer {
p := &FishingPlayer{
FishingPlayerData: data,
scene: sceneEx,
dbGameFree: base.SceneMgrSingleton.GetSceneDBGameFree(roomId, gameFreeId),
changePowerTs: 0,
changePower2Ts: 0,
lifeTimeTs: 0,
fireTimeTs: 0,
leaveTimeTs: 0,
changeVIPTimeTs: 0,
changeVIPTime: 0,
curPower: 0,
targetPower: 0,
lockFish: 0,
}
p.Init()
return p
}
func (this *FishingPlayer) RandomVipGun() {
if this.IsRobot() == false {
return
}
sceneType := this.dbGameFree.GetSceneType()
minValue := int32(0)
maxValue := int32(1)
switch sceneType {
case 1: //1初级场 0至2中随机1个
minValue = 0
maxValue = 2
case 2: //2中级场 1至4中随机1个
minValue = 1
maxValue = 4
case 3: //3高级场 2至6中随机1个
minValue = 2
maxValue = 6
default:
minValue = 0
maxValue = 1
}
vipLevel := this.GetVIP()
if vipLevel < maxValue {
maxValue = vipLevel
if maxValue <= minValue {
minValue = 0
maxValue = 1
}
}
s := base.PlayerMgrSingleton.GetPlayerSession(this.GetSnId())
if s != nil {
vipLevelSelected := rand.Int31n(maxValue-minValue) + minValue
pack := fish_proto.CSFishingOp{
OpCode: proto.Int32(FishingPlayerOpSelVip),
}
pack.Params = append(pack.Params, int64(vipLevelSelected))
s.Send(int(fish_proto.FIPacketID_FISHING_CS_OP), pack)
}
}
func (this *FishingPlayer) RandomPower() {
if this.IsRobot() == false {
logger.Logger.Trace("RandomPower not robot", this.GetSnId())
return
}
s := base.PlayerMgrSingleton.GetPlayerSession(this.GetSnId())
if s != nil {
logger.Logger.Trace("RandomPower ", this.GetSnId())
otherParams := this.dbGameFree.GetOtherIntParams()
powerIndex := rand.Int31n(int32(len(otherParams)))
powerValue := otherParams[powerIndex]
if common.InSliceInt64(otherParams, powerValue) {
this.targetPower = int32(powerValue)
}
logger.Logger.Trace("RandomPower ", this.GetSnId(), powerValue)
this.changePower2Ts = int64(time.Duration(common.RandInt(500, 1000)) * time.Millisecond)
}
}
func (this *FishingPlayer) CheckInitGameCoin() {
if this.IsRobot() == false {
logger.Logger.Trace("CheckInitGameCoin not robot", this.GetSnId())
return
}
s := base.PlayerMgrSingleton.GetPlayerSession(this.GetSnId())
if s != nil {
minValue := int(this.dbGameFree.GetRobotTakeCoin()[0])
maxValue := int(this.dbGameFree.GetRobotTakeCoin()[1])
if maxValue == minValue {
minValue = int(this.dbGameFree.GetBaseScore())
maxValue = minValue * 100
}
if this.GetCoin() < int64(minValue) || this.GetCoin() > int64(maxValue) {
coins := rand.Intn(maxValue-minValue) + minValue - int(this.GetCoin())
base.ExePMCmd(s, fmt.Sprintf("%v%v%v", common.PMCmd_AddCoin, common.PMCmd_SplitToken, coins))
}
//ExePMCmd(s, fmt.Sprintf("%v%v%v", common.PMCmd_AddCoin, common.PMCmd_SplitToken, 100))
}
}
func (this *FishingPlayer) Init() {
//在场内时间
this.leaveTimeTs = int64(time.Duration(common.RandInt(5, 10)) * time.Minute)
//换炮间隔
this.changeVIPTime = int64(time.Duration(common.RandInt(5, 10)) * time.Minute)
this.RandomVipGun()
this.RandomPower()
this.CheckInitGameCoin()
}
func (this *FishingPlayer) Clear() {
this.logicTick = 0
this.bulletId = 0
}
func (this *FishingPlayer) UpdatePlayerData(data *fish_proto.FishingPlayerData) {
this.FishingPlayerData = data
}
func (this *FishingPlayer) MarkFlag(flag int32) {
myFlag := this.GetFlag()
myFlag |= flag
this.Flag = proto.Int32(myFlag)
}
func (this *FishingPlayer) UnmarkFlag(flag int32) {
myFlag := this.GetFlag()
myFlag &= ^flag
this.Flag = proto.Int32(myFlag)
}
func (this *FishingPlayer) IsMarkFlag(flag int32) bool {
if (this.GetFlag() & flag) != 0 {
return true
}
return false
}
func (this *FishingPlayer) IsOnLine() bool {
return this.IsMarkFlag(base.PlayerState_Online)
}
func (this *FishingPlayer) IsReady() bool {
return this.IsMarkFlag(base.PlayerState_Ready)
}
func (this *FishingPlayer) IsSceneOwner() bool {
return this.IsMarkFlag(base.PlayerState_SceneOwner)
}
func (this *FishingPlayer) IsRobot() bool {
player := base.PlayerMgrSingleton.GetPlayer(this.GetSnId())
return player != nil
}
func (this *FishingPlayer) SetFlag(flag int32) {
this.Flag = proto.Int32(flag)
}
func (this *FishingPlayer) GetLastOp() int32 {
return 0
}
func (this *FishingPlayer) SetLastOp(op int32) {
}
func (this *FishingPlayer) UpdateCards(cards []int32) {
}
func (this *FishingPlayer) Update(ts int64) {
if !this.IsRobot() {
return
}
//切换倍率
if this.targetPower == this.curPower {
this.changePowerTs += ts
if this.changePowerTs >= int64(2*time.Minute) {
this.changePowerTs = 0
this.RandomPower()
}
} else {
this.changePower2Ts = this.changePower2Ts - ts
if this.changePower2Ts <= int64(0*time.Millisecond) {
if this.targetPower < this.curPower {
this.curPower = this.curPower - this.dbGameFree.GetBaseScore()
} else if this.targetPower > this.curPower {
this.curPower = this.curPower + this.dbGameFree.GetBaseScore()
}
s := base.PlayerMgrSingleton.GetPlayerSession(this.GetSnId())
if s != nil {
pack := &fish_proto.CSFishingOp{
OpCode: proto.Int32(FishingPlayerOpSetPower),
}
pack.Params = append(pack.Params, int64(this.curPower), int64(this.targetPower))
s.Send(int(fish_proto.FIPacketID_FISHING_CS_OP), pack)
logger.Logger.Tracef("this.curPower =", this.curPower)
}
this.changePower2Ts = int64(time.Duration(common.RandInt(500, 1000)) * time.Millisecond)
}
}
//换炮
this.changeVIPTimeTs += ts
if this.changeVIPTimeTs >= this.changeVIPTime {
this.changeVIPTimeTs = 0
this.RandomVipGun()
}
//离场
this.lifeTimeTs += ts
if this.lifeTimeTs >= this.leaveTimeTs {
this.lifeTimeTs = 0
s := base.PlayerMgrSingleton.GetPlayerSession(this.GetSnId())
if s != nil {
pack := &hall_proto.CSQuitGame{
Id: proto.Int32(this.dbGameFree.Id),
}
proto.SetDefaults(pack)
s.Send(int(hall_proto.GameHallPacketID_PACKET_CS_QUITGAME), pack)
}
}
//一发子弹一发命中,交替执行
if this.scene.logicTick%2 == 0 {
this.Fire()
} else {
this.Hit()
}
}
func (this *FishingPlayer) Fire() {
s := base.PlayerMgrSingleton.GetPlayerSession(this.GetSnId())
if s != nil && this.scene != nil {
f := this.scene.RandGetOneFish()
if f != nil {
this.lockFish = f.id
this.bulletSeq++
this.bulletId = this.bulletSeq
pack := &fish_proto.CSFishingOp{
OpCode: proto.Int32(FishingPlayerOpFire),
Params: []int64{rand.Int63n(1280), rand.Int63n(720), int64(this.bulletId), int64(this.curPower)},
}
proto.SetDefaults(pack)
s.Send(int(fish_proto.FIPacketID_FISHING_CS_OP), pack)
logger.Logger.Infof("FishingPlayer.Fire(snid:%v, bullet:%v)", this.GetSnId(), this.bulletId)
}
}
}
func (this *FishingPlayer) Hit() {
if this.lockFish != 0 && this.bulletId != 0 {
s := base.PlayerMgrSingleton.GetPlayerSession(this.GetSnId())
if s != nil && this.scene != nil {
f := this.scene.GetFish(this.lockFish)
if f == nil {
f = this.scene.RandGetOneFish()
}
if f == nil {
return
}
pack := &fish_proto.CSFishingOp{
OpCode: proto.Int32(FishingPlayerOpHitFish),
Params: []int64{int64(this.bulletId), int64(f.id)},
}
proto.SetDefaults(pack)
s.Send(int(fish_proto.FIPacketID_FISHING_CS_OP), pack)
logger.Logger.Infof("FishingPlayer.Hit(snid:%v, bullet:%v)", this.GetSnId(), this.bulletId)
this.bulletId = 0
}
}
}