//---------------------------------------------------------------------------- /*! * @brief サーバー時間設定 */ //---------------------------------------------------------------------------- public void SetupServerTime(ulong unServerTime) { #if BUILD_TYPE_DEBUG if (m_FlgUserSetTime) { return; } #endif //------------------------- // サーバー時間を基準時間として設定 //------------------------- DateTime cServerTime = TimeUtil.ConvertServerTimeToLocalTime(unServerTime); //------------------------- // サーバー時間を設定。 // 基準時間が更新されることで、経過時間情報も初期化される //------------------------- m_TimeAppStart = cServerTime; m_TimePrev = DateTime.Now; m_TimeSpan = new TimeSpan(); m_TimeNow = m_TimeAppStart; #if UNITY_EDITOR #endif }
// レコードの追加 public void AddRecord(int category, ServerDataDefine.PacketStructPresent data) { var contex = new PresentRecordListItemContex(); // 共通 contex.FixId = data.serial_id; contex.CaptionText00 = MainMenuUtil.GetPresentCount(data).ToString(); contex.CaptionText01 = data.message; contex.NoticeText = ""; contex.NoticeEnable = false; if ((MasterDataDefineLabel.PresentType)data.present_type == MasterDataDefineLabel.PresentType.NOTICE) { string[] notice = data.message.Split(new String[] { message_split_text }, StringSplitOptions.None); if (notice.Length >= 2) { contex.CaptionText00 = "1"; contex.CaptionText01 = notice[0]; contex.NoticeText = notice[1]; contex.NoticeEnable = true; } } contex.Category = category; // 画像はカテゴリ別に差し替え可能にする image(data, sprite => { contex.IconImage = sprite; }); // ボタンフィードバック contex.DidSelectItem += OnClickedRecordButton; // 枠色変更 contex.IconColor = IconColor[contex.Category]; contex.FrameColor = FrameColor[contex.Category]; // レコードの追加先を指定 switch ((Category)contex.Category) { case Category.Present: // アイテム受領期間までの残り時間 if (data.delete_timing == 1) { // 無期限 //contex.CaptionText02 = "ENDLESS"; } else { DateTime date = TimeUtil.ConvertServerTimeToLocalTime((ulong)data.delete_timing); contex.CaptionText02 = contex.TimeLeftText(date); } contex.Caption01_H = 110; Records0.Add(contex); break; case Category.PresentLog: contex.CaptionText02 = ""; contex.Caption01_H = 80; Records1.Add(contex); break; } }
//---------------------------------------------------------------------------- /*! * @brief ログイン時間のソート順補正 */ //---------------------------------------------------------------------------- static public long GetSortNumLoginTime(ulong unLoginTime) { TimeSpan cTimeSpan = TimeManager.Instance.m_TimeNow - TimeUtil.ConvertServerTimeToLocalTime(unLoginTime); long nMinutes = (long)cTimeSpan.TotalMinutes; return(nMinutes); }
//---------------------------------------------------------------------------- /*! * @brief ユニット取得時間のソート順補正 */ //---------------------------------------------------------------------------- static public uint GetSortNumUnitGetTime(ulong unUnitGetTime) { TimeSpan cTimeSpan = TimeManager.Instance.m_TimeNow - TimeUtil.ConvertServerTimeToLocalTime(unUnitGetTime); uint nMinutes = (uint)cTimeSpan.TotalMinutes; if (nMinutes > (0xffffffff)) { return(0xffffffff); } return((uint)nMinutes); }
//---------------------------------------------------------------------------- /*! * @brief ステータス変化時間のソート順補正 */ //---------------------------------------------------------------------------- static public ushort GetSortNumFriendStateUpdate(ulong unStateUpdateTime) { TimeSpan cTimeSpan = TimeManager.Instance.m_TimeNow - TimeUtil.ConvertServerTimeToLocalTime(unStateUpdateTime); int nMinutes = (int)cTimeSpan.TotalMinutes; if (nMinutes > (0xffff)) { return(0xffff); } return((ushort)nMinutes); }
/// <summary> /// スタミナ回復時間更新 /// </summary> private void updateStaminaTime() { PacketStructPlayer _player = UserDataAdmin.Instance.m_StructPlayer; int leftStamina = (int)_player.stamina_max - (int)_player.stamina_now; if (leftStamina > 0) { DateTime cTimeStaminaRecovery = TimeUtil.ConvertServerTimeToLocalTime(UserDataAdmin.Instance.m_StructPlayer.stamina_recover); DateTime cTimeStaminaRecoveryNext = cTimeStaminaRecovery.AddSeconds(GlobalDefine.STAMINA_RECOVERY_SEC * leftStamina); DateTime cTimeNow = TimeManager.Instance.m_TimeNow; TimeSpan RecoverySpan = cTimeStaminaRecoveryNext - cTimeNow; int leftHour = RecoverySpan.Hours + 24 * RecoverySpan.Days; string leftTime = string.Format("{0:00}:{1:00}:{2:00}", leftHour, RecoverySpan.Minutes, RecoverySpan.Seconds); StaminaTimeValue = string.Format(GameTextUtil.GetText("head_subtext2"), leftTime); } else { StaminaTimeValue = ""; } StaminaValue = string.Format(GameTextUtil.GetText("head_subtext1"), _player.stamina_now, _player.stamina_max); }
public void setup(int _index, FriendDataSetting _friend, ParamType _type, bool bCheckLock) { Index = _index; friendDataSetting = _friend; m_SpriteName = string.Empty; // アイコン UnitIconImageProvider.Instance.Get( MasterData.fix_id, ref m_SpriteName, sprite => { if (MainMenuUtil.IsWriteIcon(ref m_SpriteName, sprite)) { IconImage = sprite; } }); RaceLabel = GameTextUtil.GetText("unit_status2"); AttributeLabel = GameTextUtil.GetText("unit_status3"); Name = FriendData.user_name; // ユーザーネーム string rankFormat = GameTextUtil.GetText("questfriend_text1"); Rank = string.Format(rankFormat, FriendData.user_rank);// ランク //お気に入りチェック IsActiveLock = false; if (bCheckLock) { IsActiveLock = MainMenuUtil.ChkFavoridFriend(FriendData.user_id); } StatusValue = (FriendData.unit.level >= MasterData.level_max) ? GameTextUtil.GetText("uniticon_flag1") : string.Format(GameTextUtil.GetText("uniticon_flag2"), FriendData.unit.level); // レベル uint plusPoint = FriendData.unit.add_hp + FriendData.unit.add_pow; // プラス値の計算 if (plusPoint != 0) { StatusValue += string.Format(GameTextUtil.GetText("uniticon_flag3"), plusPoint); } //属性 ElementImage = MainMenuUtil.GetElementCircleSprite(MasterData.element); IsActiveLink = (FriendData.unit_link.id == 0) ? false : true; if (IsActiveLink) { LinkImage = MainMenuUtil.GetLinkMark(FriendData.unit, FriendData.unit_link); } Rarity = (uint)MasterData.rare + 1; RaceImage = MainMenuUtil.GetTextKindSprite(MasterData.kind, false); if (MasterData.sub_kind != MasterDataDefineLabel.KindType.NONE) { SubRaceImage = MainMenuUtil.GetTextKindSprite(MasterData.sub_kind, false); } else { SubRaceImage = null; } AttributeImage = MainMenuUtil.GetTextElementSprite(MasterData.element); AttributeImageColor = ColorUtil.GetElementLabelColor(MasterData.element); CharaName = MasterData.name; changeInfo(_type); //-------------------------------- // ユーザーのログイン時間を設定 //-------------------------------- { DateTime cTimeLastPlay = TimeUtil.ConvertServerTimeToLocalTime(FriendData.last_play); DateTime cTimeNow = TimeManager.Instance.m_TimeNow; TimeSpan cTimeSpan = cTimeNow - cTimeLastPlay; string strTimeValue = ""; if ((int)cTimeSpan.TotalDays > 0) { strTimeValue = string.Format(GameTextUtil.GetText("questfriend_text3"), (int)cTimeSpan.TotalDays); } else if ((int)cTimeSpan.TotalHours > 0) { strTimeValue = string.Format(GameTextUtil.GetText("questfriend_text2"), (int)cTimeSpan.TotalHours); } //else if ((int)cTimeSpan.TotalMinutes > 0) { strTimeValue = string.Format(GetText("LAST_PLAY_MINUTE"), (int)cTimeSpan.TotalMinutes); } else { strTimeValue = string.Format(GameTextUtil.GetText("questfriend_text2"), 0); } Time = strTimeValue; } setFlag(friendDataSetting.m_Flag); IsEnableButton = friendDataSetting.IsEnableButton; //--------------------------------------- // フレンドポイントの設定 //--------------------------------------- IsViewFriendPoint = friendDataSetting.IsViewFriendPoint; if (friendDataSetting.IsViewFriendPoint) { switch (friendDataSetting.m_Flag) { case FlagType.FRIEND: FriendPointText = "20"; break; case FlagType.HELPER: FriendPointText = "5"; break; } //--------------------------------------- // フレンドポイント増加の設定 //--------------------------------------- switch (MainMenuParam.m_QuestEventFP) { case GlobalDefine.FP_EVENT_ID_x0150: FriendPointText += "×1.5"; break; // フレンドポイント増加イベントID:1.5倍 case GlobalDefine.FP_EVENT_ID_x0200: FriendPointText += "×2"; break; // フレンドポイント増加イベントID:2.0倍 case GlobalDefine.FP_EVENT_ID_x0250: FriendPointText += "×2.5"; break; // フレンドポイント増加イベントID:2.5倍 case GlobalDefine.FP_EVENT_ID_x0300: FriendPointText += "×3"; break; // フレンドポイント増加イベントID:3.0倍 case GlobalDefine.FP_EVENT_ID_x0400: FriendPointText += "×4"; break; // フレンドポイント増加イベントID:4.0倍 case GlobalDefine.FP_EVENT_ID_x0500: FriendPointText += "×5"; break; // フレンドポイント増加イベントID:5.0倍 case GlobalDefine.FP_EVENT_ID_x1000: FriendPointText += "×10"; break; // フレンドポイント増加イベントID:10.0倍 } } //--------------------------------------- // CHARMの設定 //--------------------------------------- CharmLabel = GameTextUtil.GetText("unit_status9"); if (friendDataSetting.CharaOnce != null) { CharmValue = string.Format(GameTextUtil.GetText("kyouka_text1"), friendDataSetting.CharaOnce.m_CharaCharm.ToString("F1")); CharmValue = string.Format(GameTextUtil.GetText("value_colorset"), CharmValue); } }
//---------------------------------------------------------------------------- /*! @brief ソート処理:フレンド:ユニットID順 */ //---------------------------------------------------------------------------- private List<FriendDataSetting> FriendListThinning(List<FriendDataSetting> cFriendList) { List<FriendDataSetting> cRetFriendList = new List<FriendDataSetting>(); List<FriendDataSetting> cWorkFriendList = new List<FriendDataSetting>(); LocalSaveManager.Instance.LoadFuncUseFriend(); //---------------------------------------- // 手順1。ログイン時間が一定期間内のフレンドで最近使ってない子を選定 //---------------------------------------- { for (int i = 0; i < cFriendList.Count; i++) { //---------------------------------------- // フレンド成立済な子のみ判定 //---------------------------------------- if (cFriendList[i] == null || cFriendList[i].FriendData.friend_state != (int)FRIEND_STATE.FRIEND_STATE_SUCCESS ) { continue; } //---------------------------------------- // 指定フレンドが最近使った子かチェック //---------------------------------------- LocalSaveFriendUse sFriendUseParam = LocalSaveManager.Instance.GetLocalSaveUseFriend(cFriendList[i].FriendData.user_id); if (sFriendUseParam != null) { continue; } //---------------------------------------- // 優先度 = ( 14時間 - ログインからの経過時間 ) //---------------------------------------- TimeSpan cTimeSpan = TimeManager.Instance.m_TimeNow - TimeUtil.ConvertServerTimeToLocalTime(cFriendList[i].FriendData.last_play); float fPriority = (GlobalDefine.FRIEND_CYCLE_HOURS - (float)cTimeSpan.TotalHours); if (fPriority < 0) { continue; } //---------------------------------------- // 出てきても良いフレンドとして選定 // 後でソートするのでログインタイミングによる優先度をソートキーとして設定 //---------------------------------------- cWorkFriendList.Add(cFriendList[i]); } //---------------------------------------- // 優先度から見て先着順でリストに登録 //---------------------------------------- for (int i = 0; i < cWorkFriendList.Count; i++) { //if( cRetFriendList.m_BufferSize >= GlobalDefine.FRIEND_DRAW_MAX_FRIEND ) // break; cRetFriendList.Add(cWorkFriendList[i]); } //---------------------------------------- // 次の要素を追加で積むので作業用リストは破棄 //---------------------------------------- cWorkFriendList.Clear(); } //---------------------------------------- // 手順2。ログイン時間が一定期間内のフレンドで使用済な子を選定 //---------------------------------------- { for (int i = 0; i < cFriendList.Count; i++) { //---------------------------------------- // フレンド成立済な子のみ判定 //---------------------------------------- if (cFriendList[i] == null || cFriendList[i].FriendData.friend_state != (int)FRIEND_STATE.FRIEND_STATE_SUCCESS ) { continue; } //---------------------------------------- // 指定フレンドが最近使った子かチェック // こちらでは使用済の子のみ扱う //---------------------------------------- LocalSaveFriendUse sFriendUseParam = LocalSaveManager.Instance.GetLocalSaveUseFriend(cFriendList[i].FriendData.user_id); if (sFriendUseParam == null) { continue; } #if true// このコードをコメントアウトするとフレンドが無限につかえるようになる。 { //---------------------------------------- // 連続で使用できないように1時間以内に使用した子は拒否 //---------------------------------------- DateTime cFriendUseTime = TimeUtil.ConvertServerTimeToLocalTime(sFriendUseParam.m_FriendUseTime); TimeSpan cFriendUseSpan = TimeManager.Instance.m_TimeNow - cFriendUseTime; if (cFriendUseSpan.TotalHours <= 1.0f) { continue; } } #endif //---------------------------------------- // 優先度 = ( 14時間 - ログインからの経過時間 ) //---------------------------------------- TimeSpan cTimeSpan = TimeManager.Instance.m_TimeNow - TimeUtil.ConvertServerTimeToLocalTime(cFriendList[i].FriendData.last_play); float fPriority = (GlobalDefine.FRIEND_CYCLE_HOURS - (float)cTimeSpan.TotalHours); if (fPriority < 0) { continue; } //---------------------------------------- // 出てきても良いフレンドとして選定 // 後でソートするのでログインタイミングによる優先度をソートキーとして設定 //---------------------------------------- cWorkFriendList.Add(cFriendList[i]); } //---------------------------------------- // 優先度から見て先着順でリストに登録 //---------------------------------------- for (int i = 0; i < cWorkFriendList.Count; i++) { //if( cRetFriendList.m_BufferSize >= GlobalDefine.FRIEND_DRAW_MAX_FRIEND + GlobalDefine.FRIEND_DRAW_MAX_FRIEND_USE ) // break; cRetFriendList.Add(cWorkFriendList[i]); } //---------------------------------------- // 次の要素を追加で積むので作業用リストは破棄 //---------------------------------------- cWorkFriendList.Clear(); } //---------------------------------------- // 手順3。助っ人をテキトーに選定 //---------------------------------------- { for (int i = 0; i < cFriendList.Count; i++) { //---------------------------------------- // 無関係な子のみ判定 //---------------------------------------- if (cFriendList[i] == null || cFriendList[i].FriendData.friend_state != (int)FRIEND_STATE.FRIEND_STATE_UNRELATED ) { continue; } #if true// このコードをコメントアウトすると助っ人が無限につかえるようになる。 //---------------------------------------- // 指定フレンドが最近使った子かチェック //---------------------------------------- LocalSaveFriendUse sFriendUseParam = LocalSaveManager.Instance.GetLocalSaveUseFriend(cFriendList[i].FriendData.user_id); if (sFriendUseParam != null) { //---------------------------------------- // 連続で使用できないように1時間以内に使用した子は拒否 //---------------------------------------- DateTime cFriendUseTime = TimeUtil.ConvertServerTimeToLocalTime(sFriendUseParam.m_FriendUseTime); TimeSpan cFriendUseSpan = TimeManager.Instance.m_TimeNow - cFriendUseTime; if (cFriendUseSpan.TotalHours <= 1.0f) { continue; } } #endif //---------------------------------------- // サーバー側でフレンドリストに含まれる子を助っ人リストに入れてしまうことがあるらしい // フレンドに同じユーザーIDの子がいるならスルー //---------------------------------------- bool bSameAssign = false; for (int j = 0; j < cFriendList.Count; j++) { if (i == j) continue; if (cFriendList[j] == null || cFriendList[j].FriendData.user_id != cFriendList[i].FriendData.user_id ) { continue; } bSameAssign = true; break; } if (bSameAssign == true) { continue; } //---------------------------------------- // テキトーな優先度でランダムに選定 //---------------------------------------- cWorkFriendList.Add(cFriendList[i]); } //---------------------------------------- // 優先度から見て先着順でリストに登録 //---------------------------------------- for (int i = 0; i < cWorkFriendList.Count; i++) { //if( cRetFriendList.m_BufferSize >= GlobalDefine.FRIEND_DRAW_MAX ) // break; cRetFriendList.Add(cWorkFriendList[i]); } //---------------------------------------- // 次の要素を追加で積むので作業用リストは破棄 //---------------------------------------- cWorkFriendList.Clear(); } return cRetFriendList; }
//---------------------------------------------------------------------------- // @brief ローカル通知登録 //---------------------------------------------------------------------------- private static void RegisterNotification() { //------------------------------------------------------------------------ // ローカル通知の有効無効 //------------------------------------------------------------------------ bool enable_notification = false; if (LocalSaveManager.Instance == null) { return; } LocalSaveOption cOption = LocalSaveManager.Instance.LoadFuncOption(); enable_notification = (cOption.m_OptionNotification == (int)LocalSaveDefine.OptionNotification.ON); if (enable_notification == false) { return; } if (TimeManager.Instance == null) { return; } //------------------------------------------------------------------------ // ローカル通知の登録 //------------------------------------------------------------------------ int delay = 0; bool bSeisekiden = false; MasterDataNotification[] notification_param_array = null; if (MasterDataUtil.IsMasterDataNotification()) { notification_param_array = MasterDataUtil.GetMasterDataNotification(); } MasterDataNotification notification_param; if (notification_param_array.IsNullOrEmpty() == false) { // パッチテキスト(通知表示しない期間)取得 v360 string sCancelS = Patcher.Instance.GetLocalNotificationCancelStart(); string sCancelE = Patcher.Instance.GetLocalNotificationCancelEnd(); // 通知文言があるやつ for (uint i = 0; i < notification_param_array.Length; i++) { notification_param = notification_param_array[i]; if (notification_param == null) { continue; } string d = notification_param.timing_start.ToString() + @"00"; // string f = "yyyyMMddHHmm"; string f = "yyyyMMddHHmm"; DateTime dt = DateTime.ParseExact(d, f, null); TimeSpan ts = dt.Subtract(TimeManager.Instance.m_TimeNow); if (ts.TotalSeconds < 0) { // 期限を過ぎたデータは消す MasterDataEvent.fix_idと同じ LocalSaveManager.Instance.RemoveFuncNotificationRequest(notification_param.fix_id); continue; } //プッシュ通知のタイプが設定でOFFになっているなら弾く if ((notification_param.notification_type == MasterDataDefineLabel.NotificationType.EVENT || notification_param.notification_type == MasterDataDefineLabel.NotificationType.CASINO || notification_param.notification_type == MasterDataDefineLabel.NotificationType.SEISEKIDEN) && cOption.m_NotificationEvent == (int)LocalSaveDefine.OptionNotificationEvent.OFF) { continue; } if (notification_param.notification_type == MasterDataDefineLabel.NotificationType.SEISEKIDEN) { //すでに聖石殿の通知をしていたらその後の聖石殿の通知は弾く if (bSeisekiden == true) { continue; } } if (sCancelS.IsNOTNullOrEmpty() && sCancelE.IsNOTNullOrEmpty()) { //イベント開始タイミングがプッシュ通知を表示しない期間内ならはじくv360 if (sCancelS.Length == f.Length && sCancelE.Length == f.Length) { //パッチ登録テキストはYYYYMMDDhhmm形式のためそのままdatetimeに変換 DateTime dtCancelS = DateTime.ParseExact(sCancelS, f, null); DateTime dtCancelE = DateTime.ParseExact(sCancelE, f, null); if ((dtCancelS != null && dtCancelS <= dt) && (dtCancelE != null && dtCancelE > dt)) { // はじく continue; } } } delay = (int)ts.TotalSeconds; string notification_title = notification_param.notification_title; string notification_body = notification_param.notification_body; if (notification_param.type != (int)ServerDataDefine.NOTIFICATION_TYPE.GACHA) { // イベント通知フラグをチェックする LocalSaveEventNotification cNotification = LocalSaveManager.Instance.CheckFuncNotificationRequest(notification_param.fix_id); if (cNotification != null) { // データが登録されている場合 if (cNotification.m_Push == false) { // 通知しないならそのまま戻る continue; } else { // 通知する場合で、テキストデータが無い場合。 // 初期値を入れる if (notification_body == null || notification_body.Length <= 0) { MasterDataEvent cEventData = MasterDataUtil.GetMasterDataEventFromFixID(cNotification.m_FixID); if (cEventData != null) { MasterDataArea cAreaData = MasterDataUtil.GetAreaParamFromEventID(cEventData.event_id); if (cAreaData != null) { // 紐づいているエリアを見る notification_title = GameTextUtil.GetText("LOCAL_NOTIFICATION_REQUEST_TITLE"); notification_body = string.Format(GameTextUtil.GetText("LOCAL_NOTIFICATION_REQUEST_MESSAGE"), cAreaData.area_name); } // 情報が無ければ飛ばさない } } } } } // テキストデータが存在するものだけ通知に出す if (notification_body != null && notification_body.Length > 0) { PQDMLocalNotification.SendNotification(notification_title, notification_body, delay); if (notification_param.notification_type == MasterDataDefineLabel.NotificationType.SEISEKIDEN) { bSeisekiden = true; } } } // 通知情報を保存する LocalSaveManager.Instance.SaveFuncNotificationRequest(); } #region ==== スタミナMAX ==== PacketStructPlayer cPlayer = UserDataAdmin.Instance.m_StructPlayer; // スタミナが減少チェック // 通知設定チェック if (cPlayer != null && m_StaminaNow < cPlayer.stamina_max && cOption.m_NotificationStaminaMax == (int)LocalSaveDefine.OptionNotificationStaminaMax.ON) { //---------------------------------------- // スタミナ回復シミュレート // 回復に関連する時間系データを算出 //---------------------------------------- DateTime cRecoveryTime = TimeUtil.ConvertServerTimeToLocalTime(cPlayer.stamina_recover); // 開始時刻取得 uint unRecoveryValue = cPlayer.stamina_max - m_StaminaNow; // スタミナ回復量取得 // 終了時刻算出 cRecoveryTime = cRecoveryTime.AddSeconds(GlobalDefine.STAMINA_RECOVERY_SEC * unRecoveryValue); //---------------------------------------- // ローカル通知設定 //---------------------------------------- TimeSpan ts = cRecoveryTime.Subtract(TimeManager.Instance.m_TimeNow); if (ts.TotalSeconds >= 0) { delay = (int)ts.TotalSeconds; PQDMLocalNotification.SendNotification(UnityUtil.GetText("LOCAL_NOTIFICATION_STAMINA_TITLE"), UnityUtil.GetText("LOCAL_NOTIFICATION_STAMINA_MESSAGE"), delay); } } #endregion }