Files
Main/Assets/GameAssets/Resources/Lua/Logic/Marriage/MarriageSystem.lua

1031 lines
38 KiB
Lua
Raw Normal View History

2025-01-25 04:38:09 +08:00
------------------------------------------------
--作者: dhq
--日期: 2019-05-5
--文件: MarriageSystem.lua
--模块: MarriageSystem
--描述: 婚姻系统
------------------------------------------------
local L_TimeUtils = CS.Thousandto.Core.Base.TimeUtils;
local L_SpouseData = require("Logic.Marriage.SpouseData")
local L_MarriageEnum = require("Logic.Marriage.MarriageEnum")
local RedPointItemCondition = CS.Thousandto.Code.Logic.RedPointItemCondition
--//模块定义
local MarriageSystem =
{
--伴侣的数据
SpouseData = nil,
--婚宴预约的数据
WeddingDataList = nil,
--预约的状态
BanquetTimeDict = nil,
--已结婚了的婚宴类型
BanquetTypeList = nil,
--邀请了的宾客成员列表
InviteMembersDict = nil,
--索要请帖的成员列表
DemandMembersDict = nil,
--结婚的天数
MarryDay = 0,
--亲密度
Intimacy = 0,
--婚宴次数
WeddingNum = 0,
--已购买的邀请次数
InvitedBuyNum = 0,
--申诉离婚人的ID [申述人ID Id为0可以申述 Id为自己已经申述 id不等于自己就是确认协商离婚]
AppealPlayerID = 0,
--当前选择的婚宴类型
CurMarriageType = L_MarriageEnum.MarryTypeEnum.Normal,
--秒
MapCopyTime = 900,
--婚姻副本ID
MarryCopyID = 3001,
--情缘副本的Id
MarryQingYuanCopyID = 110001,
--心锁等级
HeartLockLv = 0,
--心锁经验
HeartLockExp = 0,
--仙匣数据
MarryBoxDataDict = nil,
--仙娃的数据
MarryChildDataDict = nil,
--情缘试炼界面需要的数据
QingYuanCloneData = nil,
--仙娃激活或者升级的物品ID
ChildActiveOrUpgradeID = nil,
ItemChangeEvent = nil,
--玩法介绍界面状态数据 [ID,States]
MarryTaskStatesDict = nil,
IsShowMarryTaskForm = false,
--缓存的世界祝福列表
CacheWorldZhuFuList = nil,
--当前婚宴状态,0没有婚宴1等待开启2已经开启
CurHunYanState = 0,
CurHunYanRemainTime = 0,
CurHunYanData = nil,
}
--//成员函数定义
--初始化
function MarriageSystem:Initialize()
self.WeddingDataList = List:New()
self.BanquetTimeDict = Dictionary:New()
self.InviteMembersDict = Dictionary:New()
self.DemandMembersDict = Dictionary:New()
self.SpouseData = L_SpouseData:New()
self.MarryBoxDataDict = Dictionary:New()
self.MarryChildDataDict = Dictionary:New()
self.ChildActiveOrUpgradeID = List:New()
self.MarryTaskStatesDict = Dictionary:New()
self.MapCopyTime = tonumber(DataConfig.DataCloneMap[self.MarryCopyID].ExistTime) / 1000
self:InitChildData()
self.ItemChangeEvent = Utils.Handler(self.OnItemUpdate, self)
GameCenter.RegFixEventHandle(LogicEventDefine.EVENT_ITEM_CHANGE_UPDATE, self.ItemChangeEvent)
end
--反初始化
function MarriageSystem:UnInitialize()
self.WeddingDataList:Clear()
self.BanquetTimeDict:Clear()
self.MarryBoxDataDict:Clear()
self.InviteMembersDict:Clear()
self.DemandMembersDict:Clear()
self.MarryChildDataDict:Clear()
self.ChildActiveOrUpgradeID:Clear()
self.MarryTaskStatesDict:Clear()
GameCenter.UnRegFixEventHandle(LogicEventDefine.EVENT_ITEM_CHANGE_UPDATE, self.ItemChangeEvent)
end
function MarriageSystem:OnItemUpdate(itemID,sender)
if self.ChildActiveOrUpgradeID:Contains(itemID) then
self:SetChildRedPoint()
end
end
--初始化仙娃的数据
function MarriageSystem:InitChildData()
DataConfig.DataMarryChild:Foreach(
function(_curChildId, _cfg)
local _attrLevelDict = Dictionary:New()
DataConfig.DataMarryChildAtt:ForeachCanBreak(
function(_id, _attrCfg)
--根据主表取属性表的数据
if _curChildId == _attrCfg.ChildId then
_attrLevelDict:Add(_attrCfg.Level, _attrCfg)
end
end
)
local _childData = {
SData = nil,
CfgData = _cfg,
AttrDict = _attrLevelDict
}
if not self.MarryChildDataDict:ContainsKey(_curChildId) then
self.MarryChildDataDict:Add(_curChildId, _childData)
end
end
)
--初始化玩法介绍的状态数据
DataConfig.DataMarryShow:Foreach(
function(_key, _cfg)
if not self.MarryTaskStatesDict:ContainsKey(_key) then
self.MarryTaskStatesDict:Add(_key, RewardState.None)
else
self.MarryTaskStatesDict[_key] = RewardState.None
end
end
)
end
--更新心跳
function MarriageSystem:Update(dt)
self:SetBanquetTime()
if self.CacheWorldZhuFuList ~= nil then
if self.WorldZhuFuUIId == nil then
self.WorldZhuFuUIId = GameCenter.FormStateSystem:EventIDToFormID(UILuaEventDefine.UIMarryWorldZhuFuForm_OPEN)
end
if not GameCenter.FormStateSystem:FormIsOpen(self.WorldZhuFuUIId) then
local _msg = self.CacheWorldZhuFuList[1]
self.CacheWorldZhuFuList:RemoveAt(1)
if #self.CacheWorldZhuFuList <= 0 then
self.CacheWorldZhuFuList = nil
end
GameCenter.PushFixEvent(UILuaEventDefine.UIMarryWorldZhuFuForm_OPEN, _msg)
end
end
end
--刷新主界面婚宴按钮的时间显示
function MarriageSystem:SetBanquetTime()
if #self.WeddingDataList > 0 then
local _firstWed = self.WeddingDataList[1]
local _startTime = _firstWed.timeStart * 60
local _endTime = _startTime + self.MapCopyTime
local _serverTime = GameCenter.HeartSystem.ServerTime
if _serverTime < _startTime and (_startTime - _serverTime) > 1800 then
--超过30分钟不做显示
self.CurHunYanState = 0
self.CurHunYanData = nil
elseif _serverTime < _startTime then
--等待开启
self.CurHunYanState = 1
self.CurHunYanRemainTime = _startTime - _serverTime
self.CurHunYanData = _firstWed
elseif _serverTime >= _startTime and _serverTime < _endTime then
--已经开启
self.CurHunYanState = 2
self.CurHunYanRemainTime = _endTime - _serverTime
self.CurHunYanData = _firstWed
else
--已经结束,直接移除
self.WeddingDataList:RemoveAt(1)
self.CurHunYanState = 0
self.CurHunYanData = nil
end
else
--没有婚宴
self.CurHunYanState = 0
self.CurHunYanData = nil
end
end
--上线返回需要的数据
function MarriageSystem:ResMarryOnline(msg)
self.WeddingDataList:Clear()
--预约的数据
local _weddingDataList = msg.weddingDataList
if _weddingDataList ~= nil then
for i = 1, #_weddingDataList do
local _curData = _weddingDataList[i]
self.WeddingDataList:Add(_curData)
end
if #self.WeddingDataList > 0 then
--根据时间排个序
self.WeddingDataList:Sort(
function(a, b)
return a.timeStart < b.timeStart
end
)
end
end
--索要请帖的列表
local _weddingMembersList = msg.weddingMembersList
if _weddingMembersList ~= nil then
for i = 1, #_weddingMembersList do
local _curMember = _weddingMembersList[i]
if not self.DemandMembersDict:ContainsKey(_curMember.roleId) then
self.DemandMembersDict:Add(_curMember.roleId, _curMember.name)
else
self.DemandMembersDict[_curMember.roleId] = _curMember.name
end
end
end
--设置心锁的红点
self:SetHeartLockRedPoint()
--设置仙娃的红点
self:SetChildRedPoint()
--请求婚姻数据,获取对方的信息
local _msg = ReqMsg.MSG_Marriage.ReqMarryData:New()
_msg:Send()
end
--婚姻开启通知
function MarriageSystem:ResWeddingStart(msg)
--打开副本进入界面
GameCenter.MainFunctionSystem:DoFunctionCallBack(FunctionStartIdCode.MarryBanquet)
end
function MarriageSystem:GetBanquetTimeDict()
--已预约的数据
local _dict = Dictionary:New()
local _offsetTime = GameCenter.HeartSystem.ServerZoneOffset
for i = 1, #self.WeddingDataList do
local _banquetTime = self.WeddingDataList[i].timeStart * 60 + _offsetTime
_dict:Add(_banquetTime, self.WeddingDataList[i])
end
--当前服务器带时区的时间
local _serverTime = math.floor(GameCenter.HeartSystem.ServerZoneTime)
--计算当前时间的时分秒
local _hour, _min, _sec = L_TimeUtils.GetStampTimeHHMMSSNotZone(_serverTime)
--今天开始的时间
local _todayStartTime = _serverTime - _hour * 3600 - _min * 60 - _sec
DataConfig.DataMarryOrder:Foreach(
function(k, v)
--1已过期 2:已预约 3可预约
local _states = 0
--每个的开启时间
local _cfgStartTime = math.floor(_todayStartTime + v.Time * 60)
--看是否预约过
if _dict:ContainsKey(_cfgStartTime) then
_states = 2
else
--过期了
if _serverTime > _cfgStartTime then
_states = 1
else
_states = 3
end
end
if not self.BanquetTimeDict:ContainsKey(k) then
self.BanquetTimeDict:Add(k, _states)
else
self.BanquetTimeDict[k] = _states
end
end
)
return self.BanquetTimeDict
end
--返回求婚信息
function MarriageSystem:ResMarryPropose(msg)
--求婚者角色名
local _name = msg.name
--求婚者职业
local _career = msg.career
--求婚类型
local _type = msg.type
--求婚者id
local _marrayId = msg.marrayId
--打开同意界面
GameCenter.PushFixEvent(UILuaEventDefine.UIMarryPromiseForm_OPEN, {marrayId = _marrayId, name = _name})
end
--返回求婚结果信息
function MarriageSystem:ResDealMarryPropose(msg)
--这里需要再请求下婚姻的数据,主要是拿预约的次数
local _msg = ReqMsg.MSG_Marriage.ReqMarryData:New()
_msg:Send()
--更新配偶信息
local _lp = GameCenter.GameSceneSystem:GetLocalPlayer()
--先和自己名字对比下,看是否是自己求婚
if _lp.Name ~= msg.marrayName then
self.SpouseData.Name = msg.marrayName
self.SpouseData.Career = msg.marraycareer
else
self.SpouseData.Name = msg.bemarrayName
self.SpouseData.Career = msg.bemarraycareer
end
_lp:SetSpouseName(self.SpouseData.Name)
self:CheckMarryCopyRedPoint()
--打开缔结姻缘的界面(准备跳转到预约界面)
GameCenter.MainFunctionSystem:DoFunctionCallBack(FunctionStartIdCode.MarryEngagement, 2)
end
--返回预约结果
function MarriageSystem:ResSelectWedding(msg)
--0成功 1:已经预约 2: 被别人预约了 3: 时间过期(1, 2 , 3失败)
local _code = msg.res
--预约成功
if _code == 0 then
if self.WeddingNum > 0 then
self.WeddingNum = self.WeddingNum - 1
end
Utils.ShowPromptByEnum("C_MARRY_YUYUE_SUCC")
local _cfg = DataConfig.DataMarryOrder[msg.weddingId]
local _sHour = _cfg.Time // 60
local _sMin = _cfg.Time % 60
local _eHour = _cfg.EndTime // 60
local _eMin = _cfg.EndTime % 60
local _timeText = string.format("%0.2d:%0.2d - %0.2d:%0.2d", _sHour, _sMin, _eHour, _eMin)
local _askText = UIUtils.CSFormat(DataConfig.DataMessageString.Get("C_MARRY_AUTO_YAOQING_ASK"), self.SpouseData.Name, _timeText)
GameCenter.MsgPromptSystem:ShowMsgBox(_askText,
DataConfig.DataMessageString.Get("C_MSGBOX_CANCEL"),
DataConfig.DataMessageString.Get("C_MSGBOX_OK"),
function (code)
--同意
if (code == MsgBoxResultCode.Button2) then
local _msg = ReqMsg.MSG_Marriage.ReqInvit:New()
_msg.roleId = 0
_msg.type = 0
_msg:Send()
Utils.ShowPromptByEnum("C_MARRY_AUTO_YUYUE_RESULT")
end
end,
false,
false, 15, 4, 1, nil, nil, 0, true)
--已经预约
elseif _code == 1 then
Utils.ShowPromptByEnum("C_MARRY_YUYUE_ALREADY")
--被别人预约了
elseif _code == 2 then
Utils.ShowPromptByEnum("C_MARRY_YUYUE_OTHERALREADY")
--时间过期(1, 2 , 3失败)
elseif _code == 3 then
Utils.ShowPromptByEnum("C_MARRY_YUYUE_TIMEOUT")
end
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_MARRY_WEDDING_DATA_REFRESH)
end
--返回婚姻信息
function MarriageSystem:ResMarryData(msg)
--结婚天数
self.MarryDay = msg.marryDay
--婚宴次数
if msg.weddingNum > 0 then
self.WeddingNum = msg.weddingNum
end
--已结婚了的婚宴类型
self.BanquetTypeList = List:New(msg.tList)
if self.BanquetTypeList ~= nil and #self.BanquetTypeList > 0 then
--排个序,获取最大的那个类型
self.BanquetTypeList:Sort(
function(a, b)
return a > b
end
)
self.CurMarriageType = self.BanquetTypeList[1]
end
--申述人ID Id为0可以申述 Id为自己已经申述 id不等于自己就是确认协商离婚
self.AppealPlayerID = msg.divorceId
--配偶的数据信息
self.SpouseData:RefeshData(msg)
local _lp = GameCenter.GameSceneSystem:GetLocalPlayer()
if _lp ~= nil then
_lp:SetSpouseName(self.SpouseData.Name)
end
self.SpouseData.PlayerID = msg.playerId
--亲密度
if msg.intimacy ~= nil and msg.intimacy > 0 then
self.Intimacy = msg.intimacy
else
if msg.playerId ~= nil and msg.playerId > 0 then
local _friendData = GameCenter.FriendSystem:GetFriendInfo(FriendType.Friend, msg.playerId)
if _friendData ~= nil then
self.Intimacy = _friendData.intimacy
end
end
end
--已购买的邀请次数
if msg.purNum ~= nil and msg.purNum > 0 then
self.InvitedBuyNum = msg.purNum
end
--邀请了的好友列表
self.InviteMembersDict:Clear()
local _weddingMembersList = msg.weddingMembersList
if _weddingMembersList ~= nil then
for i = 1, #_weddingMembersList do
local _curMember = _weddingMembersList[i]
if not self.InviteMembersDict:ContainsKey(_curMember.roleId) then
self.InviteMembersDict:Add(_curMember.roleId, _curMember.name)
else
self.InviteMembersDict[_curMember.roleId] = _curMember.name
end
end
end
self:CheckMarryCopyRedPoint()
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_MARRY_INFO_REFRESH)
--刷新婚宴的信息
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_MARRY_WEDDING_DATA_REFRESH)
--刷新邀请的人数
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_MARRY_INVITED_FRIEND_UPDATE)
--刷新称号
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_TITLE_REFRESH_MARRIAGE_USE)
end
--更新婚宴的数据
function MarriageSystem:ResUpdateWedding(msg)
local _count = #self.WeddingDataList
local _index = 0
if _count > 0 and msg.weddingData ~= nil then
local _hasSameData = false
for i = 1, _count do
if msg.weddingData.timeStart == self.WeddingDataList[i].timeStart then
self.WeddingDataList[i] = msg.weddingData
_hasSameData = true
_index = i
break
end
end
if not _hasSameData then
self.WeddingDataList:Add(msg.weddingData)
else
self.WeddingDataList[_index] = msg.weddingData
end
else
self.WeddingDataList:Add(msg.weddingData)
end
self.WeddingDataList:Sort(
function(a, b)
return a.timeStart < b.timeStart
end
)
end
--离婚成功
function MarriageSystem:ResDivorce(msg)
local _lp = GameCenter.GameSceneSystem:GetLocalPlayer()
Utils.ShowPromptByEnum("Divorce_Success_Mail", _lp.Name, self.SpouseData.Name)
self.SpouseData:ClearData()
self.Intimacy = 0
self.MarryDay = 0
self.MarryBoxData = nil
self:CheckMarryCopyRedPoint()
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_MARRY_INFO_REFRESH)
end
--申述成功
function MarriageSystem:ResDivorceID(msg)
--申诉离婚人的ID
local _lpID = GameCenter.GameSceneSystem:GetLocalPlayerID()
--Id为自己已经申述 id不等于自己就是确认协商离婚
if msg.roleId ~= _lpID then
--给个倒计时倒计时结束关掉MsgBox
GameCenter.MsgPromptSystem:ShowMsgBox( DataConfig.DataMessageString.Get("C_MARRY_Divorce_Shensu_TIPS"),
DataConfig.DataMessageString.Get("TEAM_REFUSE"),
DataConfig.DataMessageString.Get("C_MSGBOX_OK"),
function (code)
--同意离婚
if (code == MsgBoxResultCode.Button2) then
local _msg = ReqMsg.MSG_Marriage.ReqAffirmDivorce:New()
--0 拒绝 1 同意
_msg.opt = 1
_msg:Send()
--拒绝离婚
else
local _msg = ReqMsg.MSG_Marriage.ReqAffirmDivorce:New()
--0 拒绝 1 同意
_msg.opt = 0
_msg:Send()
end
end,
false,
true,
tonumber(DataConfig.DataGlobal[1891].Params)
)
else
--是申诉离婚的情况,弹提示说申诉成功
Utils.ShowPromptByEnum("Marry_Divorce_Appl_Success")
end
self.AppealPlayerID = msg.roleId
end
--删除索要列表
function MarriageSystem:ResDeleteDemandInvit(msg)
local _playerId = msg.roleId
if self.InviteMembersDict:ContainsKey(_playerId) then
self.InviteMembersDict:Remove(_playerId)
end
end
--更新邀请列表
function MarriageSystem:ResUpdateInvit(msg)
if msg.memberList == nil then
return
end
for i = 1, #msg.memberList do
local _mem = msg.memberList[i]
if _mem ~= nil then
self.InviteMembersDict[_mem.roleId] = _mem.name
end
end
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_MARRY_INVITED_FRIEND_UPDATE)
end
--返回索要结果
function MarriageSystem:ResDemandInvit(msg)
--0成功 1婚宴不存在 2已经在索要列表中 3已经在邀请列表中 4邀请上限
local _code = msg.res
if _code == 0 then
Utils.ShowPromptByEnum("Marry_Ask_Invitation_Card")
elseif _code == 1 then
--"婚宴已不存在"
Utils.ShowPromptByEnum("Marry_DemandInvit_Dinner_NotFound")
elseif _code == 2 then
--"已在请帖索要列表中"
Utils.ShowPromptByEnum("Marry_Ask_Invitation_Card")
elseif _code == 3 then
--已经在邀请列表中
Utils.ShowPromptByEnum("Marry_DemandInvit_InVited")
elseif _code == 4 then
--已达到宾客的邀请上限
Utils.ShowPromptByEnum("Marry_DemandInvit_NumMax")
elseif _code == 5 then
--不能要自己索要请帖
Utils.ShowPromptByEnum("Marry_DemandInvit_CannotBySelf")
end
end
--如果新婚人在线通知索要人名单
function MarriageSystem:ResUpdateDemandInvit(msg)
local _mem = msg.member
--这里需要做红点
if _mem ~= nil then
if not self.DemandMembersDict:ContainsKey(_mem.roleId) then
self.DemandMembersDict:Add(_mem.roleId, _mem.name)
else
self.DemandMembersDict[_mem.roleId] = _mem.name
end
--主界面显示宾客按钮
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_MAIN_SHOW_BINGKE)
end
end
--购买邀请人数成功
function MarriageSystem:ResPurInvitNum(msg)
self.InvitedBuyNum = self.InvitedBuyNum + 1
--刷新界面的数据
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_MARRY_ADD_INVITE_NUM_SUCCESS)
end
--心锁升级
function MarriageSystem:ResUpgradeMarryLockInfo(msg)
if msg.level ~= nil and msg.level > 0 then
self.HeartLockLv = msg.level
end
if msg.exp ~= nil and msg.exp >= 0 then
self.HeartLockExp = msg.exp
end
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_REFRESH_MARRY_HEARTLOCK_FORM)
self:SetHeartLockRedPoint()
self:SetChildRedPoint()
end
--伴侣购买了仙匣
function MarriageSystem:ResMarryBox(msg)
if msg ~= nil and msg.box ~= nil then
local _boxList = msg.box
local _lpID = GameCenter.GameSceneSystem:GetLocalPlayerID()
for i = 1, #_boxList do
local _boxData = _boxList[i]
local _roleId = _boxData.role
if not self.MarryBoxDataDict:ContainsKey(_roleId) then
self.MarryBoxDataDict:Add(_roleId, _boxData)
else
self.MarryBoxDataDict[_roleId] = _boxData
end
if _lpID == _roleId then
local _isReceiveToday = _boxData.reward == 1
local _isBuyForPartner = _boxData.onceReward == 1
local _showRedPoint = (not _isBuyForPartner and _boxData.remainTime > 0) or (not _isReceiveToday and _boxData.remainTime > 0)
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.MarryBox, _showRedPoint)
end
end
--刷新仙匣界面的数据
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_MARRY_BOX_REFRESH)
end
end
--伴侣求购仙匣
function MarriageSystem:ResCallBuyMarryBox(msg)
local _costCfg = Utils.SplitStr(DataConfig.DataGlobal[1522].Params, '_');
local _costText = UIUtils.CSFormat("{0}{1}", tonumber(_costCfg[2]), DataConfig.DataItem[tonumber(_costCfg[1])].Name)
Utils.ShowMsgBox(function (code)
if (code == MsgBoxResultCode.Button2) then
--购买
local _msg = ReqMsg.MSG_Marriage.ReqBuyMarryBox:New()
_msg:Send()
else
--拒绝
local _msg = ReqMsg.MSG_Marriage.ReqRefuseBuyMarryBox:New()
_msg:Send()
end
end, "MARRY_BOX_BUY_DES", _costText, self.SpouseData.Name)
end
--同步仙娃信息
function MarriageSystem:ResMarryChildInfo(msg)
if msg.childs ~= nil then
local _childsList = msg.childs
local _childCount = self.MarryChildDataDict:Count()
--是否是仙娃升级的消息
local _isChildLevelUp = 0
for i = 1, #_childsList do
local _childSData = _childsList[i]
local _childID = _childSData.id
if self.MarryChildDataDict:ContainsKey(_childID) then
if self.MarryChildDataDict[_childID].SData ~= nil then
_isChildLevelUp = 1
end
self.MarryChildDataDict[_childID].SData = _childSData
local _cfg = self.MarryChildDataDict[_childID].CfgData
--激活需要模型展示界面
if _childSData.isActive then
GameCenter.ModelViewSystem:ShowModel(ShowModelType.Pet, _cfg.Model, _cfg.UiScale, _cfg.UiModelHeight / _cfg.UiScale, _cfg.ChildName)
end
else
Debug.LogError(UIUtils.CSFormat("MarryChild!!! Can not fild child id {0} in MarryChild.xlsx", _childID))
end
end
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_MARRY_CHILD_REFRESH, _isChildLevelUp)
--设置仙娃红点
self:SetChildRedPoint()
end
end
--伴侣请求购买
function MarriageSystem:ResCallMarryCloneBuy(msg)
local _cloneMapCfg = DataConfig.DataCloneMap[self.MarryQingYuanCopyID]
local _needNum = tonumber(_cloneMapCfg.BuyNeedGold)
local _itemName = DataConfig.DataItem[ItemTypeCode.Gold].Name
local _costText = UIUtils.CSFormat("{0}{1}", _needNum,_itemName)
Utils.ShowMsgBox(function (code)
if (code == MsgBoxResultCode.Button2) then
--购买
local _msg = ReqMsg.MSG_Marriage.ReqMarryCloneBuy:New()
_msg:Send()
else
--拒绝
local _msg = ReqMsg.MSG_Marriage.ReqRefuseMarryCloneBuy:New()
_msg:Send()
end
end, "C_MARRY_COPYBUY_ASK", _costText, self.SpouseData.Name)
end
--购买副本次数返回
function MarriageSystem:ResMarryClone(msg)
if msg ~= nil and msg.clone ~= nil then
self.QingYuanCloneData = msg.clone
self:CheckMarryCopyRedPoint()
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_MARRY_BLESS_DATA_REFRESH)
end
end
--检查婚姻副本红点
function MarriageSystem:CheckMarryCopyRedPoint()
local _showRedPoint = false
if self:HasPartner() and self.QingYuanCloneData ~= nil then
--剩余挑战次数和可购买次数
_showRedPoint = self.QingYuanCloneData.remainTimes > 0
end
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.MarryBless, _showRedPoint)
end
--仙缘任务
function MarriageSystem:ResMarryTask(msg)
--已完成任务ID列表
local _taskIdList = msg.taskId
--已领取ID列表
local _overIdList = msg.overId
local _states = RewardState.None
if _taskIdList ~= nil then
for i = 1, #_taskIdList do
local _finsishedId = _taskIdList[i]
if self.MarryTaskStatesDict:ContainsKey(_finsishedId) then
--已完成可领取状态
self.MarryTaskStatesDict[_finsishedId] = RewardState.CanReceive
end
end
end
if _overIdList ~= nil then
for i = 1, #_overIdList do
local _receivedId = _overIdList[i]
if self.MarryTaskStatesDict:ContainsKey(_receivedId) then
--已领取状态
self.MarryTaskStatesDict[_receivedId] = RewardState.Received
end
end
end
local _showRedPoint = false
self.MarryTaskStatesDict:ForeachCanBreak(
function(_key, _states)
--可领取
if _states == RewardState.CanReceive then
_showRedPoint = true
return true
end
end
)
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_MARRY_TASK_REFRESH, _showRedPoint)
local _isShowingRedPoint = GameCenter.MainFunctionSystem:GetAlertFlag(FunctionStartIdCode.MarryInfo)
local _funcInfo = GameCenter.MainFunctionSystem:GetFunctionInfo(FunctionStartIdCode.MarryInfo)
if _funcInfo ~= nil then
if _showRedPoint and not _isShowingRedPoint and _funcInfo.SelfIsVisible and _funcInfo.IsEnable then
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.MarryInfo, _showRedPoint)
if not self.IsShowMarryTaskForm and GameCenter.MainFunctionSystem:FunctionIsVisible(FunctionStartIdCode.MarryTask) then
GameCenter.PushFixEvent(UILuaEventDefine.UIMarryTaskForm_OPEN)
self.IsShowMarryTaskForm = true
end
else
if not _showRedPoint and _isShowingRedPoint then
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.MarryInfo, false)
end
end
end
end
--是否有伴侣了
function MarriageSystem:HasPartner()
if self.SpouseData ~= nil then
if self.SpouseData.Name == nil then
return false
end
if self.SpouseData.Name ~= nil then
return true
end
end
return false
end
--是否预约了婚礼
function MarriageSystem:IsApponitedWedding()
local _isApponited = false
local _lp = GameCenter.GameSceneSystem:GetLocalPlayer()
for i = 1, #self.WeddingDataList do
local _selfName = self.WeddingDataList[i].marrayName
local _beMarrayName = self.WeddingDataList[i].beMarrayName
if _lp.Name ~= nil and _lp.Name == _selfName or _lp.Name == _beMarrayName then
_isApponited = true
break
end
end
return _isApponited
end
--预约的婚宴是否过期了
function MarriageSystem:IsApponitedExpired()
local _hasExpired = false
local _heartTime = GameCenter.HeartSystem.ServerTime
local _lp = GameCenter.GameSceneSystem:GetLocalPlayer()
for i = 1, #self.WeddingDataList do
local _selfName = self.WeddingDataList[i].marrayName
--预约的婚宴时间
if _lp.Name ~= nil and _lp.Name == _selfName then
local _timeStart = self.WeddingDataList[i].timeStart * 60
if _heartTime > _timeStart then
_hasExpired = true
break
end
end
end
return _hasExpired
end
function MarriageSystem:CauUnObtainMarryTitle()
local _dict = Dictionary:New()
--亲密度的进度
if self.SpouseData ~= nil and self.Intimacy < self.SpouseData:GetIntimacy() then
self.Intimacy = self.SpouseData:GetIntimacy()
end
local _showRedPoint = false
DataConfig.DataMarryTitle:Foreach(
function(_level, _cfg)
--1是要显示的 0 不显示出来
if _cfg.IsShow == 1 then
local _intimacyPro = self.Intimacy / _cfg.NeedValue
--心锁目标解锁配置表
local _targetLocKCfg = nil
local _lockLv = tonumber(_cfg.Lock)
if DataConfig.DataMarryLock:IsContainKey(_lockLv) then
_targetLocKCfg = DataConfig.DataMarryLock[_lockLv]
end
--心锁当前配置表
local _lockPro = 0
local _activeStage = 0
local _activeGrade = 0
if DataConfig.DataMarryLock:IsContainKey(self.HeartLockLv) then
local _activeHeartLocKCfg = DataConfig.DataMarryLock[self.HeartLockLv]
_activeStage = _activeHeartLocKCfg.Stage
_activeGrade = _activeHeartLocKCfg.Grade
end
if self.HeartLockLv <= 0 then
--没激活的情况
_lockPro = 0
else
--阶数都超了肯定是达标了
if _activeStage > _targetLocKCfg.Stage then
_lockPro = 1.0
else
--大于0, 还没达到解锁条件, 阶数 * 10(每阶10级) + 等级
local _need = _targetLocKCfg.Stage * 10 + _targetLocKCfg.Grade
local _cur = _activeStage * 10 + _activeGrade
_lockPro = _cur / _need
end
end
if _lockPro > 1.0 then
_lockPro = 1.0
end
if _intimacyPro > 1.0 then _intimacyPro = 1.0 end
--称号当前的进度
local _curPro = (_lockPro + _intimacyPro) / 2
--防止被四舍五入了
if _curPro >= 0.99 and _curPro < 1.0 then
_curPro = 0.991
end
--是否获得了当前称号
local _isGet = GameCenter.RoleTitleSystem.CurrHaveTitleList:Contains(_cfg.TitleId)
--保留小数点后两位
_curPro = tonumber(string.format("%.2f", _curPro))
--最大值只能100%
if _curPro >= 1.0 and not _isGet then
_curPro = 1.0
--设置红点
_showRedPoint = true
end
local _titleData =
{
CurPro = _curPro,
HasGet = _isGet,
Cfg = _cfg,
}
if not _dict:ContainsKey(_cfg.Level) then
_dict:Add(_cfg.Level, _titleData)
else
_dict[_cfg.Level] = _titleData
end
end
end
)
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.MarryInfo, _showRedPoint)
local _hasGetAll = false
_dict:ForeachCanBreak(
function(_, _titleData)
if _titleData.HasGet then
_hasGetAll = true
else
_hasGetAll = false
return true
end
end
)
--都领完了红点设置成false
if _hasGetAll then
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.MarryInfo, not _hasGetAll)
end
return _dict
end
--设置心锁的红点
function MarriageSystem:SetHeartLockRedPoint()
--设置红点
local _lockCfg = DataConfig.DataMarryLock:GetByIndex(1)
if DataConfig.DataMarryLock:IsContainKey(self.HeartLockLv) then
_lockCfg = DataConfig.DataMarryLock[self.HeartLockLv]
end
local _cons = {}
local _items = Utils.SplitNumber(_lockCfg.CostItem, '_')
local _itemCount = #_items
for i = 1, _itemCount do
_cons[i] = RedPointItemCondition(_items[1], 1)
end
GameCenter.RedPointSystem:CleraFuncCondition(FunctionStartIdCode.MarryHeartLock)
GameCenter.RedPointSystem:LuaAddFuncCondition(FunctionStartIdCode.MarryHeartLock, 1, _cons)
--最大等级了
if _lockCfg.NextLv == 0 then
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.MarryHeartLock, false)
end
end
--设置仙娃的红点
function MarriageSystem:SetChildRedPoint()
local _showRedPoint = false
-- 0 激活 1 升级
local _isLvUp = 0
self.MarryChildDataDict:ForeachCanBreak(
function(_childId, _data)
if _showRedPoint then
return true
end
if _data.SData ~= nil then
--激活了的仙娃
local _childLv = _data.SData.level
local _upLvItems = Utils.SplitStrByTableS(_data.AttrDict[_childLv].Consume, {';','_'})
local _itemCount = #_upLvItems
local _attrCfg = _data.AttrDict[_childLv]
local _isMaxLv = tonumber(_attrCfg.BlessingValue) <= 0
if not _isMaxLv then
for i = 1, _itemCount do
local _itemId = tonumber(_upLvItems[i][1])
if not self.ChildActiveOrUpgradeID:Contains(_itemId) then
self.ChildActiveOrUpgradeID:Add(_itemId)
end
local _haveCount = GameCenter.ItemContianerSystem:GetItemCountFromCfgId(_itemId)
if _haveCount >= 1 then
_showRedPoint = true
_isLvUp = 1
break
end
end
end
else
--没激活的仙娃
local _cfgData = _data.CfgData
local _conds = Utils.SplitNumber(_cfgData.ItemCondition, '_')
local _haveCount = GameCenter.ItemContianerSystem:GetItemCountFromCfgId(_conds[1])
local _needNum = _conds[2]
--对比心锁等级是否满足条件
local _lvCond = self.HeartLockLv >= tonumber(_cfgData.Condition)
--1或 2且
if tonumber(_cfgData.Activation) == 1 then
_showRedPoint = _lvCond or _haveCount >= _needNum
GameCenter.RedPointSystem:CleraFuncCondition(FunctionStartIdCode.MarryChild)
GameCenter.RedPointSystem:AddFuncCondition(FunctionStartIdCode.MarryChild, 1, RedPointItemCondition(_conds[1], _needNum))
if not self.ChildActiveOrUpgradeID:Contains(_conds[1]) then
self.ChildActiveOrUpgradeID:Add(_conds[1])
end
else
_showRedPoint = _lvCond and _haveCount >= _needNum
end
_isLvUp = 1
end
end
)
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.MarryChild, _showRedPoint)
--有红点的话刷新下数据
if _showRedPoint then
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_MARRY_CHILD_REFRESH, _isLvUp)
end
end
--请求结婚
function MarriageSystem:ReqGetMarried(beMarrayId, isBroadcast, notice)
self.SpouseData.PlayerID = beMarrayId
local _msg = ReqMsg.MSG_Marriage.ReqGetMarried:New()
--求婚的类型
_msg.type = tonumber(self.CurMarriageType)
--被求婚者的ID
_msg.beMarrayId = beMarrayId
_msg.isNotice = isBroadcast
_msg.notice = notice
_msg:Send()
end
--展示自动预约
function MarriageSystem:ShowAutoYuYue()
if self.WeddingNum <= 0 then
return
end
local _askText = UIUtils.CSFormat(DataConfig.DataMessageString.Get("C_MARRY_AUTO_YUYUE_ASK"), self.SpouseData.Name)
GameCenter.MsgPromptSystem:ShowMsgBox(_askText,
DataConfig.DataMessageString.Get("C_MSGBOX_CANCEL"),
DataConfig.DataMessageString.Get("C_MSGBOX_OK"),
function (code)
--同意
if (code == MsgBoxResultCode.Button2) then
local _msg = ReqMsg.MSG_Marriage.ReqSelectWedding:New()
_msg.timeStart = 0 --参数设置为0需要服务器给客户端自动预约一个时间最近的婚礼
_msg:Send()
end
GameCenter.PushFixEvent(UIEventDefine.UIMarryEngagementForm_CLOSE)
end,
false,
false, 15, 4, 1, nil, nil, 0, true)
end
--收到世界祝福消息
function MarriageSystem:ResMarryPosterShow(msg)
if self.WorldZhuFuUIId == nil then
self.WorldZhuFuUIId = GameCenter.FormStateSystem:EventIDToFormID(UILuaEventDefine.UIMarryWorldZhuFuForm_OPEN)
end
if GameCenter.FormStateSystem:FormIsOpen(self.WorldZhuFuUIId) then
--界面已经打开,缓存消息
if self.CacheWorldZhuFuList == nil then
self.CacheWorldZhuFuList = List:New()
end
self.CacheWorldZhuFuList:Add(msg)
else
--界面没有打开,直接打开界面
GameCenter.PushFixEvent(UILuaEventDefine.UIMarryWorldZhuFuForm_OPEN, msg)
end
end
return MarriageSystem