321 lines
8.4 KiB
Go
321 lines
8.4 KiB
Go
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
|
||
}
|
||
}
|
||
}
|