forked from endernon/PGRData
200 lines
No EOL
5.2 KiB
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 |