PGRData/Script/matrix/xui/xuicomeacross/ComeAcrossEliminateGamePlayer.lua

200 lines
No EOL
5.2 KiB
Lua

local ComeAcrossGamePlayer = require("XUi/XUiComeAcross/ComeAcrossGamePlayer")
local ComeAcrossEliminateGamePlayer = XClass(ComeAcrossGamePlayer, "ComeAcrossEliminateGamePlayer")
local TOTALGRID_LIMIT = 8
------------------需要重写的方法--------------------------------
--初始化
function ComeAcrossEliminateGamePlayer:OnPlayerInit()
self.TotalClickTimesLimit = 0 --游戏次数
self.AnswerIndex = 0
self.OnPlayAddAnswer = nil
ComeAcrossEliminateGamePlayer.Super.OnPlayerInit(self)
end
--播放下一关
function ComeAcrossEliminateGamePlayer:OnPlayerNextLevel()
self.CurAnswer = self:GetCurLevelData()
self.TotalClickTimesLimit = self.GameData.LimitTimes
if self.OnPlayNext then
self.OnPlayNext(self.GameData, self.CurAnswer)
end
end
--开始游戏
function ComeAcrossEliminateGamePlayer:OnPlayerStart()
self.TotalClickTimesLimit = 0
self.AnswerIndex = 0
end
--等待开始
function ComeAcrossEliminateGamePlayer:OnPlayerReadyDelay(isReadyDelay, delayTime)
if self.OnPlayReadyDelay then
self.OnPlayReadyDelay(isReadyDelay, delayTime)
end
end
--等待下关
function ComeAcrossEliminateGamePlayer:OnPlayerWaitForNext(isWaiting, waitTime)
if self.OnPlayWaitForNext then
self.OnPlayWaitForNext(isWaiting, waitTime)
end
end
--等待结束
function ComeAcrossEliminateGamePlayer:OnPlayerWaitForEnding(isEnding, delayTime)
if self.OnPlayEndingDelay then
self.OnPlayEndingDelay(isEnding, delayTime)
end
end
--停止回调
function ComeAcrossEliminateGamePlayer:OnPlayerStop()
end
--完成回调
function ComeAcrossEliminateGamePlayer:OnPlayerFinish()
if self.OnPlayFinish then
self.OnPlayFinish(self.PlayResult)
end
end
--处理消除的元素
function ComeAcrossEliminateGamePlayer:OnPlayerDealClick(id)
local target = nil
local targetIndex = -1
for i, v in ipairs(self.CurAnswer) do
if v.Index == id then
target = v
targetIndex = i
break
end
end
if not target then
XLog.Error("ComeAcrossEliminateGamePlayer:OnClick 找不到Id", id)
return
end
local removeList = {}
local last = target.Last
local next = target.Next
table.insert(removeList, target)
removeList, last, next, targetIndex = self:FindNeighborRecursion(removeList, target.Type, targetIndex, last, next, true)
if removeList and #removeList >= targetIndex then
for _ = 1,#removeList,1 do
table.remove(self.GameData.Answer,targetIndex)
end
end
if last then
last.Next = next
end
if next then
next.Last = last
end
local removeCount = #removeList
--补充元素
for _ = 1, removeCount, 1 do
self.AnswerIndex = self.AnswerIndex + 1
local answer = self.GameData.Answer[self.AnswerIndex]
if answer then
local lastIndex = #self.CurAnswer
local lastAnswer = self.CurAnswer[lastIndex]
table.insert(self.CurAnswer,answer)
lastAnswer.Next = answer
answer.Last = lastAnswer
if self.OnPlayAddAnswer then
self.OnPlayAddAnswer(answer)
end
end
end
--如果条件不符合
local success = false
local question = self.GameData.Question
if #question <= #removeList and question[1] == target.Type then
success = true
end
if success then
self.State = ComeAcrossGamePlayer.PlayerState.ELIMINATE
self.LastEliminate = self.Time
self.Step = self.Step + 1
self.TotalClickTimesLimit = self.TotalClickTimesLimit - 1
else
self.TotalClickTimesLimit = self.TotalClickTimesLimit - 1
end
if self.OnPlayClick then
self.OnPlayClick(success, removeList)
end
self:OnPlayerCheckLevelFinish()
end
--检测当前关卡是否完成
function ComeAcrossEliminateGamePlayer:OnPlayerCheckLevelFinish()
if self.Step > self.GameData.Times then
self.PlayResult[self.LevelIndex] = 1
elseif self.TotalClickTimesLimit == 0 then
self.PlayResult[self.LevelIndex] = 0
end
self:OnPlayerStepChanged()
if self.TotalClickTimesLimit == 0 or self.Step > self.GameData.Times then
self.State = ComeAcrossGamePlayer.PlayerState.WAIT
self.LevelChangeWaitTime = CS.XGame.Config:GetInt("TrustGameWaitForNextSecond")
end
end
--每一步骤回调
function ComeAcrossEliminateGamePlayer:OnPlayerStepChanged()
if self.OnPlayStepChange then
self.OnPlayStepChange(self.LevelIndex,self.PlayResult,self.Step - 1,self.GameData.Times,self.TotalClickTimesLimit)
end
end
------------------------------------------
--获取当前关卡数据
function ComeAcrossEliminateGamePlayer:GetCurLevelData()
local gameData = self.PlayData[self.LevelIndex]
if not gameData or #gameData.Answer < TOTALGRID_LIMIT then
return
end
local curData = {}
local lastData = nil
for i = 1, TOTALGRID_LIMIT, 1 do
local data = gameData.Answer[i]
table.insert(curData, data)
if lastData then
data.Last = lastData
lastData.Next = data
end
lastData = data
end
self.AnswerIndex = TOTALGRID_LIMIT
return curData
end
return ComeAcrossEliminateGamePlayer