package base

type AI interface {
	// SetOwner 挂载玩家
	SetOwner(*Player)
	// GetOwner 获取挂载玩家
	GetOwner() *Player
	// GetAttribute 获取属性
	GetAttribute(key interface{}) (interface{}, bool)
	// SetAttribute 设置属性
	SetAttribute(key, val interface{})
	// OnStart 开启事件
	OnStart()
	// OnStop 停止事件
	OnStop()
	// OnTick 心跳事件
	OnTick(s *Scene)
	// OnSelfEnter 自己进入事件
	OnSelfEnter(s *Scene, p *Player)
	// OnSelfLeave 自己离开事件
	OnSelfLeave(s *Scene, p *Player, reason int)
	// OnPlayerEnter 其他玩家进入事件
	OnPlayerEnter(s *Scene, p *Player)
	// OnPlayerLeave 其他玩家离开事件
	OnPlayerLeave(s *Scene, p *Player, reason int)
	// OnPlayerDropLine 其他玩家掉线事件
	OnPlayerDropLine(s *Scene, p *Player)
	// OnPlayerRehold 其他玩家重连事件
	OnPlayerRehold(s *Scene, p *Player)
	// OnPlayerReturn 其他玩家返回房间事件
	OnPlayerReturn(s *Scene, p *Player)
	// OnPlayerOp 其他玩家操作事件
	OnPlayerOp(s *Scene, p *Player, opcode int, params []int64) bool
	// OnPlayerOperate 其他玩家操作事件
	OnPlayerOperate(s *Scene, p *Player, params interface{}) bool
	// OnPlayerEvent 其他玩家事件
	OnPlayerEvent(s *Scene, p *Player, evtcode int, params []int64)
	// OnAudienceEnter 其他观众进入事件
	OnAudienceEnter(s *Scene, p *Player)
	// OnAudienceLeave 其他观众离开事件
	OnAudienceLeave(s *Scene, p *Player, reason int)
	// OnAudienceSit 其他观众坐下事件
	OnAudienceSit(s *Scene, p *Player)
	// OnAudienceDropLine 其他观众掉线事件
	OnAudienceDropLine(s *Scene, p *Player)
	// OnChangeSceneState 房间状态变化事件
	OnChangeSceneState(s *Scene, oldstate, newstate int)
}

type BaseAI struct {
	owner     *Player
	attribute map[interface{}]interface{}
}

//挂载玩家
func (b *BaseAI) SetOwner(p *Player) {
	b.owner = p
}

//获取挂载玩家
func (b *BaseAI) GetOwner() *Player {
	return b.owner
}

//获取属性
func (b *BaseAI) GetAttribute(key interface{}) (interface{}, bool) {
	if b.attribute != nil {
		v, ok := b.attribute[key]
		return v, ok
	}
	return nil, false
}

//设置属性
func (b *BaseAI) SetAttribute(key, val interface{}) {
	if b.attribute != nil {
		b.attribute[key] = val
	}
}

//开启事件
func (b *BaseAI) OnStart() {

}

//关闭事件
func (b *BaseAI) OnStop() {

}

//心跳事件
func (b *BaseAI) OnTick(s *Scene) {

}

//自己进入事件
func (b *BaseAI) OnSelfEnter(s *Scene, p *Player) {
	if !p.IsLocal {
		return
	}
	takeCoin, leaveCoin, gameTimes := s.RandTakeCoin(p)
	p.Coin = takeCoin
	p.SetTakeCoin(takeCoin)
	p.ExpectGameTime = int32(gameTimes)
	p.ExpectLeaveCoin = leaveCoin
	//当局游戏结束后剩余金额 起始设置
	p.SetCurrentCoin(takeCoin)
	p.LastSyncCoin = p.Coin
}

//自己离开事件
func (b *BaseAI) OnSelfLeave(s *Scene, p *Player, reason int) {

}

//其他玩家进入事件
func (b *BaseAI) OnPlayerEnter(s *Scene, p *Player) {

}

//其他玩家离开事件
func (b *BaseAI) OnPlayerLeave(s *Scene, p *Player, reason int) {

}

//其他玩家掉线
func (b *BaseAI) OnPlayerDropLine(s *Scene, p *Player) {

}

//其他玩家重连
func (b *BaseAI) OnPlayerRehold(s *Scene, p *Player) {

}

//其他玩家 返回房间
func (b *BaseAI) OnPlayerReturn(s *Scene, p *Player) {

}

//其他玩家操作事件
func (b *BaseAI) OnPlayerOp(s *Scene, p *Player, opcode int, params []int64) bool {
	return true
}

//其他玩家操作事件
func (b *BaseAI) OnPlayerOperate(s *Scene, p *Player, params interface{}) bool {
	return true
}

//其他玩家事件
func (b *BaseAI) OnPlayerEvent(s *Scene, p *Player, evtcode int, params []int64) {

}

//观众进入事件
func (b *BaseAI) OnAudienceEnter(s *Scene, p *Player) {

}

//观众离开事件
func (b *BaseAI) OnAudienceLeave(s *Scene, p *Player, reason int) {

}

//观众坐下事件
func (b *BaseAI) OnAudienceSit(s *Scene, p *Player) {

}

//观众掉线事件
func (b *BaseAI) OnAudienceDropLine(s *Scene, p *Player) {

}

//房间状态变化事件
func (b *BaseAI) OnChangeSceneState(s *Scene, oldstate, newstate int) {

}
