Files
Main/Assets/GameAssets/Resources/Lua/Logic/Marriage/MarriageSystem.lua
2025-01-25 04:38:09 +08:00

1031 lines
38 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.

------------------------------------------------
--作者: 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