PGRData/Script/matrix/xmanager/XRpgMakerGameManager.lua

1278 lines
No EOL
47 KiB
Lua
Raw 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.

local XRpgMakerGameActivityDb = require("XEntity/XRpgMakerGame/XRpgMakerGameActivityDb")
local XRpgMakerGameEnterStageDb = require("XEntity/XRpgMakerGame/XRpgMakerGameEnterStageDb")
local XRpgMakerGameEndPoint = require("XEntity/XRpgMakerGame/Object/XRpgMakerGameEndPoint")
local XRpgMakerGameMonsterData = require("XEntity/XRpgMakerGame/Object/XRpgMakerGameMonsterData")
local XRpgMakerGamePlayer = require("XEntity/XRpgMakerGame/Object/XRpgMakerGamePlayer")
local XRpgMakerGameTriggerData = require("XEntity/XRpgMakerGame/Object/XRpgMakerGameTriggerData")
local XRpgMakerGameShadow = require("XEntity/XRpgMakerGame/Object/XRpgMakerGameShadow")
local XRpgMakerGameElectricFence = require("XEntity/XRpgMakerGame/Object/XRpgMakerGameElectricFence")
local XRpgMakerGameTrasfer = require("XEntity/XRpgMakerGame/Object/XRpgMakerGameTrasfer")
local XRpgMakerGameGrassData = require("XEntity/XRpgMakerGame/Object/XRpgMakerGameGrassData")
local XRpgMakerGameSteelData = require("XEntity/XRpgMakerGame/Object/XRpgMakerGameSteelData")
local XRpgMakerGameWaterData = require("XEntity/XRpgMakerGame/Object/XRpgMakerGameWaterData")
local XUiRpgMakerGamePlayScene = require("XUi/XUiRpgMakerGame/PlayMain/XUiRpgMakerGamePlayScene")
XRpgMakerGameManagerCreator = function()
local tableInsert = table.insert
local tableSort = table.sort
local tableRemove = table.remove
local tonumber = tonumber
local pairs = pairs
local CSXTextManagerGetText = CS.XTextManager.GetText
local stringFormat = string.format
local RpgMakerGameActivityDb = XRpgMakerGameActivityDb.New()
local RpgMakerGameEnterStageDb = XRpgMakerGameEnterStageDb.New()
local PlayerObj = XRpgMakerGamePlayer.New()
local EndPointObj = XRpgMakerGameEndPoint.New()
local GameMonsterObjDic = {} --怪物对象字典
local TriggerObjDic = {} --机关对象字典
local Actions = {} --状态列表
local CurrentCount = 0 --当前回合数
local CurrentScene = XUiRpgMakerGamePlayScene.New()
local CurrTabGroupIndexByUiMainTemp --缓存主界面选择的chapter对应的TabGroupIndex
local HaveOpenChapterIdList = {} --缓存章节开启情况
local HaveOpenChapterGroupIdList = {} --缓存章节组开启情况
local _CurrentLockReqReset --重置协议锁
local _CurrentReqMoveLock --请求移动协议结果未处理之前不允许接着请求
local ClickObjectCallback --点击场景对象回调
local PointerDownObjectCallback --按下场景对象回调
local PointerUpObjectCallback --松开按下的场景对象回调
local ShadowObjDic = {} --影子对象字典
local ElectricFenceObjDic = {} --电网对象
local GrassObjDic = {} --草圃对象字典
local TransferPointObjDic = {} --传送点对象字典
local SteelObjDic = {} --钢板对象字典
local WaterObjDic = {} --水、冰对象字典
---------------------本地接口 begin------------------
local InitMonsetObj = function(mapId)
GameMonsterObjDic = {}
local monsterIdList = XRpgMakerGameConfigs.GetRpgMakerGameMapIdToMonsterIdList(mapId)
for _, monsterId in ipairs(monsterIdList) do
GameMonsterObjDic[monsterId] = XRpgMakerGameMonsterData.New(monsterId)
end
end
local ClearMonsterObj = function()
for _, monsterObj in pairs(GameMonsterObjDic) do
monsterObj:Dispose()
end
GameMonsterObjDic = {}
end
local ResetMonsetObj = function()
for _, monsterObj in pairs(GameMonsterObjDic) do
monsterObj:InitData()
end
end
local InitTriggerObjDic = function(mapId)
TriggerObjDic = {}
local triggerIdList = XRpgMakerGameConfigs.GetRpgMakerGameMapIdToTriggerIdList(mapId)
for _, triggerId in ipairs(triggerIdList) do
TriggerObjDic[triggerId] = XRpgMakerGameTriggerData.New(triggerId)
end
end
local ClearTriggerObj = function()
for _, triggerObj in pairs(TriggerObjDic) do
triggerObj:Dispose()
end
TriggerObjDic = {}
end
local ResetTriggerObj = function()
for _, triggerObj in pairs(TriggerObjDic) do
triggerObj:InitData()
end
end
local LockReqMove = function()
_CurrentReqMoveLock = true
end
local UnLockReqMove = function()
_CurrentReqMoveLock = nil
end
local IsLockReqMove = function()
return _CurrentReqMoveLock or false
end
local ResetStepCount = function()
XDataCenter.RpgMakerGameManager.SetCurrentCount(0)
end
local InsertAction = function(action)
tableInsert(Actions, action)
end
--检查设置播放电网机关音效(多个电网机关状态改变只播放一次音效)
local CheckSetPlayElectricStatusSwitchSound = function(actions)
local triggerObj
local triggerId
for _, action in ipairs(actions or {}) do
triggerId = action.TriggerId or action.Id
triggerObj = XDataCenter.RpgMakerGameManager.GetTriggerObj(triggerId)
if triggerObj and XRpgMakerGameConfigs.GetRpgMakerGameTriggerType(triggerId) == XRpgMakerGameConfigs.XRpgMakerGameTriggerType.TriggerElectricFence then
triggerObj:SetIsPlayElectricStatusSwitchSound(true)
return
end
end
end
local LockReqReset = function()
_CurrentLockReqReset = true
end
local UnLockReqReset = function()
_CurrentLockReqReset = nil
end
local IsLockReqReset = function()
return _CurrentLockReqReset or false
end
local InitShadowObj = function(mapId)
ShadowObjDic = {}
local shadowIdList = XRpgMakerGameConfigs.GetRpgMakerGameMapIdToShadowIdList(mapId)
for _, shadowId in ipairs(shadowIdList) do
ShadowObjDic[shadowId] = XRpgMakerGameShadow.New(shadowId)
end
end
local ClearShadowObj = function()
for _, shadowObj in pairs(ShadowObjDic) do
shadowObj:Dispose()
end
ShadowObjDic = {}
end
local ResetShadowObj = function()
for _, shadowObj in pairs(ShadowObjDic) do
shadowObj:InitData()
end
end
local InitElectricFenceObj = function(mapId)
ElectricFenceObjDic = {}
local idList = XRpgMakerGameConfigs.GetRpgMakerGameMapIdToElectricFenceIdList(mapId)
for _, id in ipairs(idList) do
ElectricFenceObjDic[id] = XRpgMakerGameElectricFence.New(id)
end
end
local SetElectricFenceStatus = function(electricStatus)
for _, obj in pairs(ElectricFenceObjDic) do
obj:SetElectricStatus(electricStatus)
end
end
local ClearElectricFencebj = function()
for _, obj in pairs(ElectricFenceObjDic) do
obj:Dispose()
end
ElectricFenceObjDic = {}
end
local ResetElectricFenceObj = function()
for _, obj in pairs(ElectricFenceObjDic) do
obj:InitData()
end
end
--传送点
local InitTransferPointObj = function(mapId)
TransferPointObjDic = {}
local idList = XRpgMakerGameConfigs.GetMapIdToTransferPointIdList(mapId)
for _, id in ipairs(idList) do
TransferPointObjDic[id] = XRpgMakerGameTrasfer.New(id)
end
end
local ClearTransferPointObj = function()
for _, obj in pairs(TransferPointObjDic) do
obj:Dispose()
end
TransferPointObjDic = {}
end
--实体对象
local InitEntityObj = function(mapId)
GrassObjDic = {}
SteelObjDic = {}
WaterObjDic = {}
local entityType
local idList = XRpgMakerGameConfigs.GetMapIdToEntityIdList(mapId)
for _, id in ipairs(idList) do
entityType = XRpgMakerGameConfigs.GetEntityType(id)
if entityType == XRpgMakerGameConfigs.XRpgMakerGameEntityType.Water or entityType == XRpgMakerGameConfigs.XRpgMakerGameEntityType.Ice then
WaterObjDic[id] = XRpgMakerGameWaterData.New(id)
WaterObjDic[id]:SetStatus(entityType == XRpgMakerGameConfigs.XRpgMakerGameEntityType.Water and
XRpgMakerGameConfigs.XRpgMakerGameWaterType.Water or
XRpgMakerGameConfigs.XRpgMakerGameWaterType.Ice)
elseif entityType == XRpgMakerGameConfigs.XRpgMakerGameEntityType.Grass then
GrassObjDic[id] = XRpgMakerGameGrassData.New(id)
elseif entityType == XRpgMakerGameConfigs.XRpgMakerGameEntityType.Steel then
SteelObjDic[id] = XRpgMakerGameSteelData.New(id)
end
end
end
local ClearEntityObj = function()
for _, obj in pairs(GrassObjDic) do
obj:Dispose()
end
for _, obj in pairs(SteelObjDic) do
obj:Dispose()
end
for _, obj in pairs(WaterObjDic) do
obj:Dispose()
end
GrassObjDic = {}
SteelObjDic = {}
WaterObjDic = {}
end
local ResetEntityObj = function()
for _, obj in pairs(GrassObjDic) do
obj:InitData()
end
for _, obj in pairs(SteelObjDic) do
obj:InitData()
end
for _, obj in pairs(WaterObjDic) do
obj:InitData()
end
end
local GetCurrClearButtonGroupIndexCookieKey = function()
local activityId = XRpgMakerGameConfigs.GetDefaultActivityId()
return "RpgMakerGameCurrClearButtonGroupIndex" .. XPlayer.Id .. activityId
end
local GetHaveOpenChapterIdListCookieKey = function ()
local activityId = XRpgMakerGameConfigs.GetDefaultActivityId()
return "RpgMakerGameChapterIdList" .. XPlayer.Id .. activityId
end
local GetHaveOpenChapterGroupIdListCookieKey = function ()
local activityId = XRpgMakerGameConfigs.GetDefaultActivityId()
return "RpgMakerGameChapterGroupIdList" .. XPlayer.Id .. activityId
end
---------------------本地接口 end--------------------
local XRpgMakerGameManager = {}
-----------------功能入口 begin----------------
function XRpgMakerGameManager.GetRpgMakerGameStageStatus(rpgMakerGameStageId)
local stageIsClear = XRpgMakerGameManager.IsStageClear(rpgMakerGameStageId)
if stageIsClear then
return XRpgMakerGameConfigs.RpgMakerGameStageStatus.Clear
end
local preStage = XRpgMakerGameConfigs.GetRpgMakerGameStagePreStage(rpgMakerGameStageId)
local preStageIsClear = not XTool.IsNumberValid(preStage) and true or XRpgMakerGameManager.IsStageClear(preStage)
if preStageIsClear then
return XRpgMakerGameConfigs.RpgMakerGameStageStatus.UnLock
end
return XRpgMakerGameConfigs.RpgMakerGameStageStatus.Lock
end
function XRpgMakerGameManager.IsStageClear(stageId)
local stageDb = XRpgMakerGameManager.GetRpgMakerActivityStageDb(stageId)
return stageDb:IsStageClear()
end
function XRpgMakerGameManager.CheckActivityIsOpen(isNotShowTips)
local id = XRpgMakerGameConfigs.GetDefaultActivityId()
local timeId = XRpgMakerGameConfigs.GetRpgMakerGameActivityTimeId(id)
if not XFunctionManager.CheckInTimeByTimeId(timeId) then
if CS.XFight.IsRunning or XLuaUiManager.IsUiLoad("UiLoading") then
return false
end
if not isNotShowTips then
XUiManager.TipText("ActivityMainLineEnd")
XLuaUiManager.RunMain()
end
return false
end
return true
end
function XRpgMakerGameManager.GetActivityTime()
local id = XRpgMakerGameConfigs.GetDefaultActivityId()
local timeId = XRpgMakerGameConfigs.GetRpgMakerGameActivityTimeId(id)
return XFunctionManager.GetTimeByTimeId(timeId)
end
function XRpgMakerGameManager.CheckActivityCondition()
local functionId = XFunctionManager.FunctionName.RpgMakerActivity
local isOpen = XFunctionManager.JudgeCanOpen(functionId)
local desc = XFunctionManager.GetFunctionOpenCondition(functionId)
if not isOpen then
XUiManager.TipMsg(desc)
end
return isOpen, desc
end
function XRpgMakerGameManager.CheckRedPoint()
local groupId = XRpgMakerGameManager.GetCurrTaskTimeLimitId()
return XDataCenter.TaskManager.CheckLimitTaskList(groupId)
end
--所有章节组小红点
function XRpgMakerGameManager.CheckAllChapterGroupRedPoint()
local haveChapterGroupIdList = XRpgMakerGameManager.GetHaveOpenChapterGroupIdList()
local groupIdList = XRpgMakerGameConfigs.GetRpgMakerGameChapterGroupIdList()
local openListCount = 0
local timeId, isOpen
for _, groupId in ipairs(groupIdList) do
timeId = XRpgMakerGameConfigs.GetChapterGroupOpenTimeId(groupId)
isOpen = XFunctionManager.CheckInTimeByTimeId(timeId)
openListCount = openListCount + (isOpen and 1 or 0)
end
return #haveChapterGroupIdList < openListCount
end
--章节组小红点
function XRpgMakerGameManager.CheckChapterGroupBtnRedPoint(chapterGroupId)
local haveChapterGroupIdList = XRpgMakerGameManager.GetHaveOpenChapterGroupIdList()
local timeId = XRpgMakerGameConfigs.GetChapterGroupOpenTimeId(chapterGroupId)
local isOpen = XFunctionManager.CheckInTimeByTimeId(timeId)
for _,v in ipairs(haveChapterGroupIdList) do
if chapterGroupId == v or not isOpen then return false end
end
return true
end
--春节章节小红点
function XRpgMakerGameManager.CheckFirstChapterGroupRedPoint()
local groupIdList = XRpgMakerGameConfigs.GetRpgMakerGameChapterGroupIdList()
local flag
for _,v in ipairs(groupIdList) do
if XRpgMakerGameConfigs.GetChapterGroupIsFirstShow(v) then
flag = v
end
end
local haveChapterIdList = XRpgMakerGameConfigs.GetRpgMakerGameChapterIdList(flag)
for _, v in ipairs(haveChapterIdList) do
if XRpgMakerGameManager.CheckChapterBtnRedPoint(v) then return true end
end
return false
end
--单个章节小红点
function XRpgMakerGameManager.CheckChapterBtnRedPoint(chapterId)
local haveChapterIdList = XRpgMakerGameManager.GetHaveOpenChapterIdList()
for _,v in ipairs(haveChapterIdList) do
if chapterId == v then return false end
end
return XRpgMakerGameManager.IsChapterUnLock(chapterId)
end
function XRpgMakerGameManager.GetActivityChapters()
local chapters = {}
if XRpgMakerGameManager.CheckActivityIsOpen(true) then
local temp = {}
local activityId = XRpgMakerGameConfigs.GetDefaultActivityId()
temp.Id = activityId
temp.Name = XRpgMakerGameConfigs.GetActivityName(activityId)
temp.BannerBg = XRpgMakerGameConfigs.GetActivityBannerBg(activityId)
temp.Type = XDataCenter.FubenManager.ChapterType.RpgMakerGame
table.insert(chapters, temp)
end
return chapters
end
-----------------功能入口 end------------------
-----------------主界面 begin------------------
function XRpgMakerGameManager.GetRpgMakerActivityStageDb(stageCfgId)
return RpgMakerGameActivityDb:GetStageDb(stageCfgId)
end
function XRpgMakerGameManager.GetRpgMakerChapterClearStarCount(chapterId)
local stageIdList = XRpgMakerGameConfigs.GetRpgMakerGameStageIdList(chapterId)
local stageDb
local starCount = 0
for _, stageId in ipairs(stageIdList) do
stageDb = XRpgMakerGameManager.GetRpgMakerActivityStageDb(stageId)
if stageDb then
starCount = starCount + stageDb:GetStarCount()
end
end
return starCount
end
function XRpgMakerGameManager.IsChapterUnLock(chapterId)
if not XTool.IsNumberValid(chapterId) then
return true
end
local timeId = XRpgMakerGameConfigs.GetRpgMakerGameChapterOpenTimeId(chapterId)
return XFunctionManager.CheckInTimeByTimeId(timeId)
end
function XRpgMakerGameManager.IsStageUnLock(stageId)
local stageStatus = XRpgMakerGameManager.GetRpgMakerGameStageStatus(stageId)
if stageStatus ~= XRpgMakerGameConfigs.RpgMakerGameStageStatus.Lock then
return true
end
local preStage = XRpgMakerGameConfigs.GetRpgMakerGameStagePreStage(stageId)
local preStageName = XRpgMakerGameConfigs.GetRpgMakerGameStageName(preStage)
local desc = CS.XTextManager.GetText("RpgMakerGameStageNotOpen", preStageName)
return false, desc
end
function XRpgMakerGameManager.GetCurrTaskTimeLimitId()
local activityId = XRpgMakerGameConfigs.GetDefaultActivityId()
return XRpgMakerGameConfigs.GetRpgMakerGameActivityTaskTimeLimitId(activityId)
end
function XRpgMakerGameManager.GetTimeLimitTask()
local groupId = XRpgMakerGameManager.GetCurrTaskTimeLimitId()
return XDataCenter.TaskManager.GetTimeLimitTaskListByGroupId(groupId)
end
function XRpgMakerGameManager.SetCurrTabGroupIndexByUiMainTemp(currTabGroupIndexByUiMainTemp)
CurrTabGroupIndexByUiMainTemp = currTabGroupIndexByUiMainTemp
end
function XRpgMakerGameManager.SetCurrClearButtonGroupIndex()
local cookieKey = GetCurrClearButtonGroupIndexCookieKey()
XSaveTool.SaveData(cookieKey, CurrTabGroupIndexByUiMainTemp)
end
function XRpgMakerGameManager.GetCurrClearButtonGroupIndex()
local cookieKey = GetCurrClearButtonGroupIndexCookieKey()
return XSaveTool.GetData(cookieKey)
end
function XRpgMakerGameManager.GetDefaultChapterGroupId()
local chapterGroupId = XRpgMakerGameConfigs.GetDefaultChapterGroupId()
local timeId = XRpgMakerGameConfigs.GetChapterGroupOpenTimeId(chapterGroupId)
if XFunctionManager.CheckInTimeByTimeId(timeId, true) then
return chapterGroupId
end
--返回最新且已开启的章节组Id
local chapterGroupIdList = XRpgMakerGameConfigs.GetRpgMakerGameChapterGroupIdList()
local totalCount = #chapterGroupIdList
for i = totalCount, 1, -1 do
chapterGroupId = chapterGroupIdList[i]
timeId = XRpgMakerGameConfigs.GetChapterGroupOpenTimeId(chapterGroupId)
if XFunctionManager.CheckInTimeByTimeId(timeId, true) then
return chapterGroupId
end
end
return chapterGroupIdList[totalCount]
end
function XRpgMakerGameManager.GetActivityEndTime()
local activityId = XRpgMakerGameConfigs.GetDefaultActivityId()
if not XTool.IsNumberValid(activityId) then return 0 end
local timeId = XRpgMakerGameConfigs.GetRpgMakerGameActivityTimeId(activityId)
return XFunctionManager.GetEndTimeByTimeId(timeId)
end
--章节组小红点缓存
function XRpgMakerGameManager.SetChapterGroupIdOpen(chapterGroupId)
HaveOpenChapterGroupIdList = XRpgMakerGameManager.GetHaveOpenChapterGroupIdList() or {}
for _,v in ipairs(HaveOpenChapterGroupIdList) do
if chapterGroupId == v then return end
end
table.insert(HaveOpenChapterGroupIdList, chapterGroupId)
local haveOpenChapterGroupIdList = GetHaveOpenChapterGroupIdListCookieKey()
return XSaveTool.SaveData(haveOpenChapterGroupIdList, HaveOpenChapterGroupIdList)
end
function XRpgMakerGameManager.GetHaveOpenChapterGroupIdList()
local haveOpenChapterGroupIdList = GetHaveOpenChapterGroupIdListCookieKey()
return XSaveTool.GetData(haveOpenChapterGroupIdList) or {}
end
--章节小红点缓存
function XRpgMakerGameManager.SetChapterIdOpen(chapterId)
HaveOpenChapterIdList = XRpgMakerGameManager.GetHaveOpenChapterIdList()
for _,v in ipairs(HaveOpenChapterIdList) do
if chapterId == v then return end
end
table.insert(HaveOpenChapterIdList, chapterId)
local haveOpenChapterIdList = GetHaveOpenChapterIdListCookieKey()
return XSaveTool.SaveData(haveOpenChapterIdList, HaveOpenChapterIdList)
end
function XRpgMakerGameManager.GetHaveOpenChapterIdList()
local haveOpenChapterIdList = GetHaveOpenChapterIdListCookieKey()
return XSaveTool.GetData(haveOpenChapterIdList) or {}
end
--缓存当前的活动组Id
local _CurChapterGroupId
function XRpgMakerGameManager.SetCurChapterGroupId(chapterGroupId)
_CurChapterGroupId = chapterGroupId
XRpgMakerGameManager.SetChapterGroupIdOpen(chapterGroupId)
end
function XRpgMakerGameManager.GetCurChapterGroupId()
return _CurChapterGroupId
end
-----------------主界面 end--------------------
-----------------关卡内 begin------------------
function XRpgMakerGameManager.InitStageMap(mapId, selectRoleId)
PlayerObj:InitData(mapId, selectRoleId)
EndPointObj:InitData(mapId)
InitMonsetObj(mapId)
InitTriggerObjDic(mapId)
InitShadowObj(mapId)
InitElectricFenceObj(mapId)
InitTransferPointObj(mapId)
InitEntityObj(mapId)
ResetStepCount()
end
function XRpgMakerGameManager.ResetStageMap()
local enterStageDb = XRpgMakerGameManager:GetRpgMakerGameEnterStageDb()
local mapId = enterStageDb:GetMapId()
local selectRoleId = enterStageDb:GetSelectRoleId()
PlayerObj:InitData(mapId, selectRoleId)
EndPointObj:InitData(mapId)
ResetTriggerObj()
ResetMonsetObj()
ResetStepCount()
ResetShadowObj()
ResetElectricFenceObj()
ResetEntityObj()
XRpgMakerGameManager.ResetActions()
end
function XRpgMakerGameManager.ClearStageMap()
PlayerObj:Dispose()
EndPointObj:Dispose()
ClearMonsterObj()
ClearTriggerObj()
ClearShadowObj()
ClearElectricFencebj()
ClearTransferPointObj()
ClearEntityObj()
ResetStepCount()
end
function XRpgMakerGameManager.GetNextAction(isNotRemove)
if isNotRemove then
return Actions[1]
end
local action = tableRemove(Actions, 1)
XRpgMakerGameManager.UpdateActionData(action)
return action
end
--需要并列执行动作的用该方法
function XRpgMakerGameManager.GetActions(actionType)
local actions = {}
for i = #Actions, 1, -1 do
if Actions[i].ActionType == actionType then
local action = tableRemove(Actions, i)
XRpgMakerGameManager.UpdateActionData(action)
tableInsert(actions, action)
end
end
return actions
end
function XRpgMakerGameManager.IsActionsEmpty()
return XTool.IsTableEmpty(Actions)
end
--更新状态数据,不播放动画
function XRpgMakerGameManager.UpdateActionData(action)
if action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionPlayerMove then
XRpgMakerGameManager.SetCurrentCount(action.CurrentCount)
PlayerObj:SetFaceDirection(action.Direction)
PlayerObj:UpdatePosition(action.EndPosition)
return
end
if action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionKillMonster
or action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionMonsterDieByTrap
or action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionMonsterKillByElectricFence
or action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionHumanKill
or action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionMonsterDrown then
local monsterObj = XRpgMakerGameManager.GetMonsterObj(action.MonsterId)
if monsterObj then
monsterObj:Die()
end
return
end
if action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionStageWin then
local enterStageDb = XRpgMakerGameManager:GetRpgMakerGameEnterStageDb()
local stageId = enterStageDb:GetStageId()
local selectRoleId = enterStageDb:GetSelectRoleId()
local stepCount = XRpgMakerGameManager.GetCurrentCount()
local stageDb = XRpgMakerGameManager.GetRpgMakerActivityStageDb(stageId)
local starCount = action.StarCondition and #action.StarCondition or 0
stageDb:SetRoleId(selectRoleId)
if stepCount < stageDb:GetStepCount() then
stageDb:SetStepCount(stepCount)
end
if stageDb:GetStarCount() <= starCount then
stageDb:SetStarCondition(action.StarCondition)
end
stageDb:SetStarReward(action.StarReward, true)
return
end
if action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionEndPointOpen then
EndPointObj:EndPointOpen()
return
end
if action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionMonsterRunAway
or action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionMonsterPatrol then
local monsterObj = XRpgMakerGameManager.GetMonsterObj(action.MonsterId)
if monsterObj then
monsterObj:SetFaceDirection(action.Direction)
monsterObj:UpdatePosition(action.EndPosition)
end
return
end
if action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionMonsterChangeDirection then
local monsterObj = XRpgMakerGameManager.GetMonsterObj(action.MonsterId)
if monsterObj then
monsterObj:SetFaceDirection(action.Direction)
end
return
end
if action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionMonsterKillPlayer
or action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionPlayerDieByTrap
or action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionPlayerKillByElectricFence
or action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionPlayerDrown then
PlayerObj:Die()
return
end
if action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionTriggerStatusChange then
local triggerObj = XRpgMakerGameManager.GetTriggerObj(action.TriggerId)
if triggerObj then
triggerObj:SetTriggerStatus(action.TriggerStatus)
triggerObj:SetElectricStatus(action.ElectricStatus)
end
return
end
if action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionUnlockRole then
RpgMakerGameActivityDb:UpdateUnlockRoleId(action.RoleId)
return
end
if action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionShadowMove then
local shadowObj = XRpgMakerGameManager.GetShadowObj(action.ShadowId)
if shadowObj then
shadowObj:SetFaceDirection(action.Direction)
shadowObj:UpdatePosition(action.EndPosition)
end
return
end
if action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionShadowDieByTrap then
local shadowObj = XRpgMakerGameManager.GetShadowObj(action.ShadowId)
if shadowObj then
shadowObj:Die()
end
return
end
if action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionElectricStatusChange then
SetElectricFenceStatus(action.ElectricStatus)
return
end
if action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionSentrySign then
local monsterObj = XRpgMakerGameManager.GetMonsterObj(action.MonsterId)
if monsterObj then
monsterObj:UpdateSentrySignAction(action)
end
return
end
if action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionSteelBrokenToTrap
or XRpgMakerGameConfigs.RpgMakerGameActionType.ActionSteelBrokenToFlat then
local entityId = action.EntityId
local entityObj = XRpgMakerGameManager.GetEntityObj(entityId)
if entityObj and entityObj.SetStatus then
entityObj:SetStatus(XRpgMakerGameConfigs.XRpgMakerGameSteelBrokenType.Flat)
end
return
end
end
--地图某一时刻的状态
function XRpgMakerGameManager.UpdateMapStatusDb(data)
XDataCenter.RpgMakerGameManager.SetCurrentCount(data.CurrentRound)
--玩家状态
PlayerObj:UpdateData(data.GamePlayer)
--终点状态
EndPointObj:UpdateData(data.EndPoint)
--怪物状态
for _, monsterData in ipairs(data.GameMonsters) do
local id = monsterData.Id
local monsterObj = XRpgMakerGameManager.GetMonsterObj(id)
if monsterObj then
monsterObj:UpdateData(monsterData)
end
end
--机关
CheckSetPlayElectricStatusSwitchSound(data.Triggers)
for _, triggerData in ipairs(data.Triggers) do
local id = triggerData.Id
local triggerObj = XRpgMakerGameManager.GetTriggerObj(id)
if triggerObj then
triggerObj:UpdateData(triggerData)
end
end
--影子
for _, shadowData in ipairs(data.Shadows) do
local id = shadowData.Id
local obj = XRpgMakerGameManager.GetShadowObj(id)
if obj then
obj:UpdateData(shadowData)
end
end
--电网
local electricStatus = data.ElectricFence and data.ElectricFence.ElectricStatus
SetElectricFenceStatus(electricStatus)
--水,冰
local waterObj
for _, water in ipairs(data.Water) do
waterObj = XRpgMakerGameManager.GetEntityObj(water.Id)
if waterObj and waterObj.SetStatus then
waterObj:SetStatus(water.WaterStatus)
end
end
--草圃
local grassObj
for _, grass in ipairs(data.Grass) do
grassObj = XRpgMakerGameManager.GetEntityObj(grass.Id)
if grassObj and grassObj.SetIsGrow then
grassObj:SetIsGrow(true)
end
end
--钢板
local steelObj
for _, steel in ipairs(data.Steel) do
steelObj = XRpgMakerGameManager.GetEntityObj(steel.Id)
if steelObj and steelObj.SetStatus then
steelObj:SetStatus(steel.SteelStatus)
end
end
end
function XRpgMakerGameManager.SetCurrentCount(currentCount)
CurrentCount = currentCount
end
function XRpgMakerGameManager.GetCurrentCount()
return CurrentCount
end
function XRpgMakerGameManager.GetShadowObj(shadowId)
return XTool.IsNumberValid(shadowId) and ShadowObjDic[shadowId]
end
function XRpgMakerGameManager.GetMonsterObj(monsterId)
return XTool.IsNumberValid(monsterId) and GameMonsterObjDic[monsterId]
end
function XRpgMakerGameManager.GetMonsterObjDic()
return GameMonsterObjDic
end
function XRpgMakerGameManager.GetElectricFenceObjDic()
return ElectricFenceObjDic
end
function XRpgMakerGameManager.GetElectricFenceObj(electricFenceId)
return XTool.IsNumberValid(electricFenceId) and ElectricFenceObjDic[electricFenceId]
end
--获得怪物死亡的数量
function XRpgMakerGameManager.GetMonsterDeathCount()
local normalMonsterDeathCount = 0
local bossDeathCount = 0
local totalDeathCount = 0
local monsterTypeCfg
for _, obj in pairs(GameMonsterObjDic) do
monsterTypeCfg = XRpgMakerGameConfigs.GetRpgMakerGameMonsterType(obj:GetId())
if monsterTypeCfg == XRpgMakerGameConfigs.XRpgMakerGameMonsterType.Normal and obj:IsDeath() then
normalMonsterDeathCount = normalMonsterDeathCount + 1
elseif monsterTypeCfg == XRpgMakerGameConfigs.XRpgMakerGameMonsterType.BOSS and obj:IsDeath() then
bossDeathCount = bossDeathCount + 1
end
end
totalDeathCount = normalMonsterDeathCount + bossDeathCount
return totalDeathCount, normalMonsterDeathCount, bossDeathCount
end
function XRpgMakerGameManager.GetTriggerObj(triggerId)
return XTool.IsNumberValid(triggerId) and TriggerObjDic[triggerId]
end
function XRpgMakerGameManager.GetRpgMakerGameEnterStageDb()
return RpgMakerGameEnterStageDb
end
function XRpgMakerGameManager.GetPlayerObj()
return PlayerObj
end
function XRpgMakerGameManager.GetEndPointObj()
return EndPointObj
end
function XRpgMakerGameManager.ResetActions()
Actions = {}
end
function XRpgMakerGameManager.GetCurrentScene()
return CurrentScene
end
--获得一个随机对话内容的id
function XRpgMakerGameManager.GetRandomDialogBoxId()
--设置随机数种子
math.randomseed(os.time())
local idList = XRpgMakerGameConfigs.GetRpgMakerGameRandomDialogBoxIdList()
local clearStageIdList = {}
local preStageId
local isStageClear
local weight
local sum = 0
local randomDialogBoxId
--获取权重总和
for _, id in ipairs(idList) do
preStageId = XRpgMakerGameConfigs.GetRpgMakerGameRandomDialogBoxPreStage(id)
isStageClear = not XTool.IsNumberValid(preStageId) and true or XRpgMakerGameManager.IsStageClear(preStageId)
weight = XRpgMakerGameConfigs.GetRpgMakerGameRandomDialogBoxWeight(id)
if isStageClear then
table.insert(clearStageIdList, id)
sum = sum + weight
end
end
--随机数加上权重,越大的权重,数值越大
local maxRand = 0
local rand
for _, id in ipairs(clearStageIdList) do
rand = math.random(0, sum)
weight = XRpgMakerGameConfigs.GetRpgMakerGameRandomDialogBoxWeight(id)
if rand + weight > maxRand then
maxRand = rand + weight
randomDialogBoxId = id
end
end
return randomDialogBoxId
end
function XRpgMakerGameManager.GetSceneCubeObj(row, col)
local currentScene = XRpgMakerGameManager.GetCurrentScene()
return currentScene and currentScene:GetCubeObj(row, col)
end
function XRpgMakerGameManager.GetSceneCubeUpCenterPosition(row, col)
local cubeObj = XRpgMakerGameManager.GetSceneCubeObj(row, col)
return cubeObj and cubeObj:GetGameObjUpCenterPosition()
end
function XRpgMakerGameManager.GetSceneCubeTransform(row, col)
local cubeObj = XRpgMakerGameManager.GetSceneCubeObj(row, col)
return cubeObj and cubeObj:GetTransform()
end
--是否满足激活星星条件,不使用服务端下发的数据
--isWin通关才计算行走步数为nil时不考虑是否通关
function XRpgMakerGameManager.IsStarConditionClear(starConditionId, isWin)
local currentCount = XRpgMakerGameManager.GetCurrentCount()
local totalDeathCount, normalMonsterDeathCount, bossDeathCount = XRpgMakerGameManager.GetMonsterDeathCount()
local stepCount = XRpgMakerGameConfigs.GetRpgMakerGameStarConditionStepCount(starConditionId)
local monsterCount = XRpgMakerGameConfigs.GetRpgMakerGameStarConditionMonsterCount(starConditionId)
local monsterBossCount = XRpgMakerGameConfigs.GetRpgMakerGameStarConditionMonsterBossCount(starConditionId)
local monsterTotalCount = monsterCount + monsterBossCount
if currentCount <= stepCount then
if isWin ~= nil then
return isWin
end
return true
end
if XTool.IsNumberValid(monsterCount) and XTool.IsNumberValid(monsterBossCount) then
return monsterTotalCount <= totalDeathCount
end
if XTool.IsNumberValid(monsterCount) then
return monsterCount <= normalMonsterDeathCount
end
if XTool.IsNumberValid(monsterBossCount) then
return monsterBossCount <= bossDeathCount
end
return false
end
function XRpgMakerGameManager.SetClickObjectCallback(cb)
ClickObjectCallback = cb
end
function XRpgMakerGameManager.FireClickObjectCallback(modelKey, modelName)
if ClickObjectCallback then
ClickObjectCallback(modelKey, modelName)
end
end
function XRpgMakerGameManager.SetPointerDownObjectCallback(cb)
PointerDownObjectCallback = cb
end
function XRpgMakerGameManager.FirePointerDownObjectCallback()
if PointerDownObjectCallback then
PointerDownObjectCallback()
end
end
function XRpgMakerGameManager.SetPointerUpObjectCallback(cb)
PointerUpObjectCallback = cb
end
function XRpgMakerGameManager.FirePointerUpObjectCallback()
if PointerUpObjectCallback then
PointerUpObjectCallback()
end
end
--是否能在当前坐标中设置模型或特效
function XRpgMakerGameManager.IsCurPositionSet(posX, posY, direction)
local isCurSet = true --是否能在当前的坐标中设置
local isNextSet = true --是否能继续在下一个坐标中判断能否设置
local currentScene = XRpgMakerGameManager.GetCurrentScene()
local blockObj = currentScene:GetBlockObj(posY, posX)
if blockObj then
isCurSet, isNextSet = false, false
return isCurSet, isNextSet
end
for _, obj in pairs(TriggerObjDic or {}) do
if obj:IsSamePoint(posX, posY) and obj:IsBlock() then
isCurSet, isNextSet = false, false
return isCurSet, isNextSet
end
end
for _, obj in pairs(ShadowObjDic or {}) do
if obj:IsSamePoint(posX, posY) then
isCurSet, isNextSet = false, false
return isCurSet, isNextSet
end
end
for _, obj in pairs(GameMonsterObjDic or {}) do
if obj:IsSamePoint(posX, posY) and not obj:IsDeath() then
isCurSet, isNextSet = false, false
return isCurSet, isNextSet
end
end
isNextSet = XRpgMakerGameManager.IsCurGapSet(posX, posY, direction)
return isCurSet, isNextSet
end
--是否能在缝隙或电墙所在的下一个坐标中设置模型或特效
function XRpgMakerGameManager.IsCurGapSet(posX, posY, direction)
local currentScene = XRpgMakerGameManager.GetCurrentScene()
local getGapObjs = currentScene:GetGapObjs()
local nextPosX = (direction == XRpgMakerGameConfigs.RpgMakerGameMoveDirection.MoveLeft and posX - 1) or (direction == XRpgMakerGameConfigs.RpgMakerGameMoveDirection.MoveRight and posX + 1) or posX
local nextPosY = (direction == XRpgMakerGameConfigs.RpgMakerGameMoveDirection.MoveUp and posY + 1) or (direction == XRpgMakerGameConfigs.RpgMakerGameMoveDirection.MoveDown and posY - 1) or posY
local isBlock
for _, obj in pairs(getGapObjs or {}) do
isBlock = obj:IsGapInMiddle(posX, posY, direction, nextPosX, nextPosY)
if isBlock then
return false
end
end
for _, obj in pairs(ElectricFenceObjDic or {}) do
isBlock = obj:IsElectricFenceInMiddle(posX, posY, direction, nextPosX, nextPosY)
if isBlock then
return false
end
end
return true
end
function XRpgMakerGameManager.GetTransferPointObj(transferPointId)
return TransferPointObjDic[transferPointId]
end
function XRpgMakerGameManager.GetEntityObj(entityId)
local obj = GrassObjDic[entityId]
if obj then
return obj
end
obj = SteelObjDic[entityId]
if obj then
return obj
end
obj = WaterObjDic[entityId]
if obj then
return obj
end
end
function XRpgMakerGameManager.GetWaterObjDic()
return WaterObjDic
end
--是否会被草埔遮挡
function XRpgMakerGameManager.IsGrassShelter(x, y)
local currentScene = XRpgMakerGameManager.GetCurrentScene()
local mapId = currentScene:GetMapId()
local entityIdList = XRpgMakerGameConfigs.GetEntityIdListByDic(mapId, x, y)
local obj
for _, entityId in ipairs(entityIdList) do
if XRpgMakerGameConfigs.GetEntityType(entityId) == XRpgMakerGameConfigs.XRpgMakerGameEntityType.Grass then
obj = XRpgMakerGameManager.GetEntityObj(entityId)
if obj and obj:IsActive() then
return true
end
end
end
obj = currentScene:GetGrass(x, y)
return obj and obj:IsActive() or false
end
-----------------关卡内 end--------------------
-----------------角色相关 begin----------------
function XRpgMakerGameManager.GetOnceUnLockRoleId()
local roleIdList = XRpgMakerGameConfigs.GetRpgMakerGameRoleIdList()
for _, roleId in ipairs(roleIdList) do
if XRpgMakerGameManager.IsUnlockRole(roleId) then
return roleId
end
end
return roleIdList[1]
end
function XRpgMakerGameManager.IsUnlockRole(roleId)
if not XTool.IsNumberValid(roleId) then
return false
end
local unlockRoleIdList = XRpgMakerGameManager.GetUnlockRoleIdList()
for _, unlockRoleId in ipairs(unlockRoleIdList) do
if unlockRoleId == roleId then
return true
end
end
return false, XRpgMakerGameConfigs.GetRpgMakerGameRoleLockTipsDesc(roleId)
end
function XRpgMakerGameManager.GetUnlockRoleIdList()
return RpgMakerGameActivityDb:GetUnlockRoleIdList()
end
-----------------角色相关 end------------------
-----------------协议相关 begin----------------
--进入活动请求
function XRpgMakerGameManager.RequestRpgMakerGameEnter()
if not XDataCenter.RpgMakerGameManager.CheckActivityCondition() then
return
end
XNetwork.Call("RpgMakerGameEnterRequest", {}, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
RpgMakerGameActivityDb:UpdateData(res.ActivityDb or res.ActivityData) --中途改了名字,防止出错
if not XLuaUiManager.IsUiLoad("UiRpgMakerGameMain") then
XLuaUiManager.Open("UiRpgMakerGameMain")
end
end)
end
--进入一个TileMap
function XRpgMakerGameManager.RequestRpgMakerGameEnterStage(stageId, selectRoleId, cb)
local req = { StageId = stageId, SelectRoleId = selectRoleId }
XNetwork.Call("RpgMakerGameEnterStageRequest", req, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
CurrentScene:RemoveScene()
XRpgMakerGameManager.ResetActions()
RpgMakerGameEnterStageDb:UpdateData(res)
for _, action in ipairs(res.Actions or {}) do
InsertAction(action)
end
XRpgMakerGameManager.InitStageMap(res.MapId, res.SelectRoleId)
XLuaUiManager.Open("UiFubenRpgMakerGameMovie", stageId)
CurrentScene:LoadScene(res.MapId, function()
local delay = CS.XGame.ClientConfig:GetInt("RpgMakerGameLoadingDelayClose") --延迟Loading界面关闭的时间
XScheduleManager.ScheduleOnce(function()
XLuaUiManager.Close("UiFubenRpgMakerGameMovie")
CurrentScene:SetSceneActive(false) --处理光照异常
CurrentScene:SetSceneActive(true)
if cb then
cb()
end
end, delay)
end)
end)
end
--玩家移动
function XRpgMakerGameManager.RequestRpgMakerGameMapMove(mapId, direction, cb)
if IsLockReqMove() then return end
local req = { MapId = mapId, Direction = direction }
LockReqMove()
XNetwork.Call("RpgMakerGameMapMoveRequest", req, function(res)
if res.Code ~= XCode.Success then
UnLockReqMove()
XUiManager.TipCode(res.Code)
return
end
for _, action in ipairs(res.Actions) do
InsertAction(action)
end
CheckSetPlayElectricStatusSwitchSound(res.Actions)
UnLockReqMove()
if cb then
cb()
end
end)
end
--重置游戏
function XRpgMakerGameManager.RequestRpgMakerGameMapResetGame(mapId, cb)
if IsLockReqReset() then
return
end
LockReqReset()
local req = { MapId = mapId }
XNetwork.Call("RpgMakerGameMapResetGameRequest", req, function(res)
if res.Code ~= XCode.Success then
UnLockReqReset()
XUiManager.TipCode(res.Code)
return
end
XRpgMakerGameManager.ResetStageMap()
for _, action in ipairs(res.Actions or {}) do
InsertAction(action)
end
if cb then
cb()
end
UnLockReqReset()
end)
end
--后退
function XRpgMakerGameManager.RequestRpgMakerGameMapBackUp(mapId, cb)
local currCount = XRpgMakerGameManager.GetCurrentCount()
if currCount == 0 then
return
end
local req = { MapId = mapId }
XNetwork.Call("RpgMakerGameMapBackUpRequest", req, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XRpgMakerGameManager.UpdateMapStatusDb(res.GameMapStatusDb)
for _, action in ipairs(res.Actions or {}) do
InsertAction(action)
end
local currentRound = res.GameMapStatusDb.CurrentRound
if cb then
cb(currentRound)
end
end)
end
--解锁提示
function XRpgMakerGameManager.RequestRpgMakerGameMapUnlockHint(stageId, type, cb)
local req = {
StageId = stageId,
Type = type, --1提示2答案
}
XNetwork.Call("RpgMakerGameMapUnlockHintRequest", req, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
local stageDb = XRpgMakerGameManager.GetRpgMakerActivityStageDb(stageId)
if stageDb then
if type == XRpgMakerGameConfigs.XRpgMakerGameRoleAnswerType.Hint then
stageDb:SetHint(1)
else
stageDb:SetAnswer(1)
end
end
if cb then
cb()
end
end)
end
-----------------协议相关 end----------------
return XRpgMakerGameManager
end