ro-table/Asstes/Resources/Script/FrameWork/Proxy/PetWorkSpaceProxy.txt
2025-06-04 05:02:57 +08:00

445 lines
14 KiB
Plaintext

autoImport("PetWorkSpaceItemData")
PetWorkSpaceProxy = class('PetWorkSpaceProxy', pm.Proxy)
PetWorkSpaceProxy.Instance = nil;
PetWorkSpaceProxy.NAME = "PetWorkSpaceProxy"
PetWorkSpaceProxy.ItemID = 5542;
PetWorkSpaceProxy.ESpaceStatus =
{
EWORKSTATE_UNUSED = ScenePet_pb.EWORKSTATE_UNUSED,
EWORKSTATE_WORKING = ScenePet_pb.EWORKSTATE_WORKING,
EWORKSTATE_REST = ScenePet_pb.EWORKSTATE_REST,
}
PetWorkSpaceProxy.EPetStatus =
{
EPETWORK_IDLE = 1, --可出站
EPETWORK_FIGHT = 2, --派遣
EPETWORK_REJECT = 3, --場所拒絕
EPETWORK_SPACE_LIMITED = 4, --轉換場所被限
EPETWORK_Scene = 5, --出戰
}
function PetWorkSpaceProxy:ctor(proxyName, data)
self.proxyName = proxyName or PetWorkSpaceProxy.NAME
if (PetWorkSpaceProxy.Instance == nil) then
PetWorkSpaceProxy.Instance = self
end
if data ~= nil then
self:setData(data)
end
self:Init()
end
function PetWorkSpaceProxy:Init()
self.petWorkSpaceData = {}
self.petExchangeMap = {}
self:InitStaticData()
end
local function _sortSpace(a, b)
local aActID = a.staticData.ActID
local bActID = b.staticData.ActID
if aActID and bActID then
return a.id < b.id
end
if aActID or bActID then
return nil ~= aActID
end
if not aActID and not bActID then
return a.id < b.id
end
return a.id < b.id
end
function PetWorkSpaceProxy:InitStaticData()
for _, v in pairs(Table_Pet_WorkSpace) do
local spaceData = PetWorkSpaceItemData.new(v.id)
if nil == spaceData.staticData.ActID then
self.petWorkSpaceData[spaceData.id] = spaceData
end
end
end
function PetWorkSpaceProxy:GetSpaceViewData()
local viewData = {}
for k, v in pairs(self.petWorkSpaceData) do
if not v.activeForbiddenFlag then
viewData[#viewData + 1] = v
end
end
table.sort(viewData, function(a, b)
return _sortSpace(a, b)
end)
return viewData
end
function PetWorkSpaceProxy:SetPetWorkData(datas)
for i = 1, #datas do
local spaceData = PetWorkSpaceItemData.new(datas[i].id)
spaceData:SetServiceData(datas[i])
self.petWorkSpaceData[spaceData.id] = spaceData
end
end
function PetWorkSpaceProxy:SetExtra(data)
self.monthCard_expiretime = data.card_expiretime
self.maxSpace = data.max_space
local extras = data.extras
self:SetExchangeMap(extras, true)
end
function PetWorkSpaceProxy:GetSpaceIDByActID(id)
for _, v in pairs(self.petWorkSpaceData) do
if v.staticData.ActID == id then
return v
end
end
return nil
end
function PetWorkSpaceProxy:HandleStopAct(id)
local spaceData = self:GetSpaceIDByActID(id)
if spaceData then
spaceData:SetActiveForbiddenFlag(true)
end
end
function PetWorkSpaceProxy:SetExchangeMap(extras, init)
if init then
TableUtility.TableClear(self.petExchangeMap)
end
for i = 1, #extras do
local extraMap = {}
local petGuid = extras[i].guid
if (petGuid) then
extraMap.count = extras[i].count
extraMap.lastSpaceid = extras[i].lastspaceid
self.petExchangeMap[petGuid] = extraMap
end
end
end
function PetWorkSpaceProxy:GetCardExpireTime()
return self.monthCard_expiretime
end
function PetWorkSpaceProxy:ClearSpaceData()
TableUtility.TableClear(self.petWorkSpaceData)
self:InitStaticData()
end
function PetWorkSpaceProxy:GetMaxSpace()
return self.maxSpace
end
local DAY_SEC = 86400
-- 寵物打工當天獲得的獎勵數量
local floor = math.floor
function PetWorkSpaceProxy.calcPetWorkCurDayRewardCount(starttime, endtime, frequency, maxreward, lastcount)
local totalReward = PetFun.calcPetWorkRewardCount(starttime, endtime, frequency, maxreward, lastcount) -- 先算總獎勵
local interval = 0 -- 隔的天數
local refreshTime = PetWorkSpaceProxy.GetRefreshTime(starttime)
if (endtime > refreshTime) then -- 跨天了
if ((endtime - refreshTime) / DAY_SEC > 1) then
interval = (endtime - refreshTime) / DAY_SEC
-- helplog("interval: ",interval,"endtime: ",endtime)
end
endtime = refreshTime + interval * DAY_SEC
-- helplog("starttime: ",starttime,"endtime: ",endtime)
local beforeReward = PetFun.calcPetWorkRewardCount(starttime, endtime, frequency, maxreward, lastcount)
-- helplog("總共的獎勵: ",totalReward,"之前天數的獎勵: ",beforeReward)
return floor(totalReward) - floor(beforeReward), false
else
-- helplog("不跨天: ",totalReward)
return floor(totalReward), true
end
end
function PetWorkSpaceProxy.GetRefreshTime(start_time)
local refreshTime = os.date('*t', start_time)
refreshTime = os.time({ year = refreshTime.year, month = refreshTime.month, day = refreshTime.day, hour = 5 })
if (start_time > refreshTime) then
refreshTime = DAY_SEC + refreshTime
end
return refreshTime
end
function PetWorkSpaceProxy:CheckNeedCountDown()
for _, v in pairs(self.petWorkSpaceData) do
if (v:IsWorking()) then
return true
end
end
return false
end
function PetWorkSpaceProxy:IsPetExchangeCountLimited(guid, spaceID)
if (self.petExchangeMap[guid]) then
if (spaceID == self.petExchangeMap[guid].lastSpaceid) then
return false
end
-- if Table_Pet_WorkSpace[spaceID] and nil~=Table_Pet_WorkSpace[spaceID].ActID then
-- return false
-- end
return self.petExchangeMap[guid].count >= GameConfig.PetWorkSpace.pet_work_max_exchange
end
return false
end
function PetWorkSpaceProxy:SortPet(left, right)
local spaceid = self.chooseSpaceID
local lFre = PetFun.calcPetWorkFrequency(left.petid, left.lv, left.friendlv, spaceid, left.petWorkSkillID)
local rFre = PetFun.calcPetWorkFrequency(right.petid, right.lv, right.friendlv, spaceid, right.petWorkSkillID)
local lIdle = left.state == PetWorkSpaceProxy.EPetStatus.EPETWORK_IDLE
local rIdle = right.state == PetWorkSpaceProxy.EPetStatus.EPETWORK_IDLE
if (lIdle and rIdle) then
if (lFre == rFre) then
if (left.friendlv == right.friendlv) then
if (left.lv == right.lv) then
return left.petid > right.petid
else
return left.lv > right.lv
end
else
return left.friendlv > right.friendlv
end
else
return lFre > rFre
end
end
if (lIdle or rIdle) then
return lIdle == true
end
if (lIdle == false and rIdle == false) then
return left.state < right.state
end
return false
end
-- 出戰中的寵物
function PetWorkSpaceProxy:GetBattlePet(petData)
self.battlePet = {}
for i = 1, #petData do
local itemInfo = petData[i].base
local item = ItemData.new(itemInfo.guid, itemInfo.id)
local PetInfo = PetEggInfo.new(item.staticData)
PetInfo:Server_SetData(petData[i].egg)
PetInfo.guid = itemInfo.guid
PetInfo.state = PetWorkSpaceProxy.EPetStatus.EPETWORK_Scene
self.battlePet[#self.battlePet + 1] = PetInfo
end
end
function PetWorkSpaceProxy:_getUnlockSpace()
local result = {}
for _, v in pairs(self.petWorkSpaceData) do
if (v.unlock and v.unlock == true) then
result[#result + 1] = v
end
end
return result;
end
local function _basePetUnLimited(spaceID, pet)
local limitedLvl = Table_Pet_WorkSpace[spaceID].Level
local limitedFriendLvl = GameConfig.PetWorkSpace.pet_work_manual_unlock.friendlv
if (pet.lv >= limitedLvl and pet.friendlv >= limitedFriendLvl) then
return true
end
return false
end
function PetWorkSpaceProxy:_getWorkingPets()
local result = {}
for _, v in pairs(self.petWorkSpaceData) do
local petEggs = v.petEggs
if (petEggs) then
if (v:IsWorking() or v:IsResting()) then
for i = 1, #petEggs do
petEggs[i].state = PetWorkSpaceProxy.EPetStatus.EPETWORK_FIGHT
result[#result + 1] = petEggs[i]
end
end
end
end
return result
end
function PetWorkSpaceProxy:GetTotalPetsData(spaceID)
local allPets = {}
if (self.battlePet) then
for i = 1, #self.battlePet do
local pet = self.battlePet[i]
if (_basePetUnLimited(spaceID, pet)) then
allPets[#allPets + 1] = self.battlePet[i]
end
end
end
local bagPet = BagProxy.Instance:GetMyPetEggs()
if (bagPet) then
for i = 1, #bagPet do
local pet = bagPet[i].petEggInfo
if (_basePetUnLimited(spaceID, pet)) then
pet.guid = bagPet[i].id
local spaceData = self:GetWorkSpaceDataById(spaceID)
if (self:IsPetExchangeCountLimited(pet.guid, spaceID)) then
pet.state = PetWorkSpaceProxy.EPetStatus.EPETWORK_SPACE_LIMITED
else
if (spaceData:IsSpacePetRejected(pet.petid)) then
pet.state = PetWorkSpaceProxy.EPetStatus.EPETWORK_REJECT
else
pet.state = PetWorkSpaceProxy.EPetStatus.EPETWORK_IDLE
end
end
allPets[#allPets + 1] = pet
end
end
end
local workingPets = self:_getWorkingPets()
for i = 1, #workingPets do
allPets[#allPets + 1] = workingPets[i]
end
table.sort(allPets, function(l, r)
return self:SortPet(l, r)
end)
return allPets
end
function PetWorkSpaceProxy:GetWorkSpaceData()
return self.petWorkSpaceData
end
function PetWorkSpaceProxy:GetWorkSpaceDataById(id)
return self.petWorkSpaceData[id]
end
function PetWorkSpaceProxy:GetWorkingSpace(ignoreActive)
local result = {}
for _, v in pairs(self.petWorkSpaceData) do
if (v:IsWorking()) then
if ignoreActive then
if (nil == v.staticData.ActID) then
result[#result + 1] = v
end
else
result[#result + 1] = v
end
end
end
return result
end
function PetWorkSpaceProxy:GetRestSpace(ignoreActive)
local result = {}
for k, v in pairs(self.petWorkSpaceData) do
if (v.state == PetWorkSpaceProxy.ESpaceStatus.EWORKSTATE_REST) then
if ignoreActive then
if (nil == v.staticData.ActID) then
result[#result + 1] = v
end
else
result[#result + 1] = v
end
end
end
return result
end
function PetWorkSpaceProxy:SetPetSpaceFuncUnlock(manual)
self.FuncUnlock = manual.unlock
end
function PetWorkSpaceProxy:IsFuncUnlock()
return self.FuncUnlock and self.FuncUnlock == true
end
function PetWorkSpaceProxy:GetlockSpace()
local result = {}
for _, v in pairs(self.petWorkSpaceData) do
if (v.unlock == false) then
result[#result + 1] = v
end
end
return result;
end
local MONTH_CARD = 1902
local introduceData = {}
function PetWorkSpaceProxy:GetIntroduceDescData()
TableUtility.ArrayClear(introduceData)
local descData = {}
descData.type = "single";
descData.desc = ZhString.PetWorkSpace_Introduce
TableUtility.ArrayPushBack(introduceData, descData)
-- unlockDesc
local unlockDescData = {} -- 解鎖的資訊
local unlockData = self:_getUnlockSpace()
for _, v in pairs(unlockData) do
local tabSingle = {}
local name = v.staticData.Name
local fre = v.staticData.Frequency
tabSingle.desc = string.format(ZhString.PetWorkSpace_UnlockDesc, name, fre)
local rewardArray = v:GetRewardArray()
if (rewardArray and #rewardArray > 0) then
tabSingle.rewards = rewardArray
end
table.insert(unlockDescData, tabSingle)
end
unlockDescData.type = "table";
TableUtility.ArrayPushBack(introduceData, unlockDescData)
local lockDescData = {}
local lockData = self:GetlockSpace()
for _,v in pairs(lockData) do
local menuID = v:GetMenuID()
local name = v.staticData.Name
if(menuID)then
local menCsv = Table_Menu[menuID]
if(menCsv)then
local tabSingle = {}
local param,content
local Condition = menCsv.Condition
local value = Condition.manualunlock
if(value)then
local type = value[1][1]
param = AdventureDataProxy.Instance:getUnlockNumByType(type)
content = string.format(menCsv.text,param)
tabSingle.desc = string.format(ZhString.PetWorkSpace_LockDesc,name,content)
elseif (Condition.title)then
-- param = MyselfProxy.Instance:GetCurManualAppellation()
-- param = param and param.staticData.Name or ZhString.PetWorkSpace_DefaultAppellation
-- content = string.format(menCsv.text,param)
tabSingle.desc = string.format(ZhString.PetWorkSpace_LockDesc,name,menCsv.text)
elseif(Condition.cooklv)then
local userData = Game.Myself.data.userdata
if(userData)then
param = userData:Get(UDEnum.COOKER_LV) or 1
content = string.format(menCsv.text,param)
tabSingle.desc = string.format(ZhString.PetWorkSpace_LockDesc,name,content)
end
elseif(menuID==MONTH_CARD)then
tabSingle.desc = string.format(ZhString.PetWorkSpace_LockDesc,name,menCsv.text)
else
content = menCsv.text
tabSingle.desc = string.format(ZhString.PetWorkSpace_LockDesc,name,content)
end
table.insert(lockDescData,tabSingle)
end
end
end
lockDescData.type="table";
TableUtility.ArrayPushBack(introduceData,lockDescData)
return introduceData
end