Core/GameEngine/Model/MapNpcConfigConfig.cs
File was deleted Core/GameEngine/Model/MapNpcConfigConfig.cs.meta
File was deleted Core/GameEngine/Model/tagRoleEquipStarsConfig.cs
File was deleted Core/GameEngine/Model/tagRoleEquipStarsConfig.cs.meta
File was deleted System/Achievement/AchievementGotoPart1.cs
@@ -314,7 +314,8 @@ public static void GotoSpSkillLevelUp(int _achievementId) { var config = Config.Instance.Get<SuccessConfig>(_achievementId); var skillId = config.Condition[0]; var index = PlayerDatas.Instance.baseData.Job - 1; var skillId = index < config.Condition.Length ? config.Condition[index] : config.Condition[0]; var treasureId = 0; var humanTreasures = treasureModel.GetTreasureCategory(TreasureCategory.Human); @@ -330,13 +331,27 @@ } } var skillConfig = Config.Instance.Get<SkillConfig>(skillId); var treasureConfig = Config.Instance.Get<TreasureConfig>(treasureId); if (treasureId != 0) { treasureModel.currentCategory = TreasureCategory.Human; treasureModel.selectedTreasure = treasureId; treasureModel.selectedPotential = skillId; if (!FuncOpen.Instance.IsFuncOpen(82)) { FuncOpen.Instance.ProcessorFuncErrorTip(82); return; } guideAchievementId = _achievementId; Treasure treasure; if (treasureModel.TryGetTreasure(treasureId, out treasure)) { if (!treasure.IsHighestStage) { SysNotifyMgr.Instance.ShowTip("TreasureSkillUnGet", skillConfig.SkillName, treasureConfig.Name); return; } guideAchievementId = _achievementId; } } } System/Achievement/AchievementModel.cs
@@ -428,6 +428,48 @@ case 116: getItemPathModel.SetChinItemModel(config.Condition[0]); break; case 91: var index = PlayerDatas.Instance.baseData.Job - 1; var potentialId = index < config.Condition.Length ? config.Condition[index] : config.Condition[0]; var treasureModel = ModelCenter.Instance.GetModel<TreasureModel>(); var treasureId = 0; var treasures = treasureModel.GetTreasureCategory(TreasureCategory.Human); foreach (var id in treasures) { Treasure treasure; treasureModel.TryGetTreasure(id, out treasure); if (treasure.GetPotential(potentialId) != null) { treasureId = treasure.id; break; } } var skillConfig = Config.Instance.Get<SkillConfig>(potentialId); var treasureConfig = Config.Instance.Get<TreasureConfig>(treasureId); if (treasureId != 0) { if (!FuncOpen.Instance.IsFuncOpen(82)) { return; } Treasure treasure; if (treasureModel.TryGetTreasure(treasureId, out treasure)) { if (!treasure.IsHighestStage) { return; } treasureModel.currentCategory = TreasureCategory.Human; treasureModel.selectedTreasure = treasureId; if (!WindowCenter.Instance.CheckOpen<TreasureLevelUpWin>()) { WindowJumpMgr.Instance.WindowJumpTo(JumpUIType.TreasureCollectSoul); } } } break; default: WindowCenter.Instance.Close<TreasureLevelUpWin>(); System/BlastFurnace/LingDanTips.cs
@@ -85,6 +85,7 @@ { get { return _playerPack ?? (_playerPack = ModelCenter.Instance.GetModel<PlayerPackModel>()); } } PrayForDurgModel prayModel { get { return ModelCenter.Instance.GetModel<PrayForDurgModel>(); } } private int noEnoughMatID = 0; private bool isEnoughSpecMat = true; @@ -96,10 +97,7 @@ _danDrugCtrl.lockType = EnhanceLockType.KeepVertical; _toggleGroup = _danDrugCtrl.GetComponent<ToggleGroup>(); _makeDanBtn.onClick.AddListener(OnClickMakeDan); prayDurgBtn.AddListener(()=> { WindowCenter.Instance.Open<PrayforDrugWin>(); }); prayDurgBtn.AddListener(ClickPrayDrugBtn); FurnaceModel.RefreshStoveModelEvent += RefreshStoveModel; FurnaceModel.RefreshAddSpecMatEvent += SetSpecMatItemCell; _randomLineCtrl.OnRefreshCell += RefreshRandomLineCell; @@ -107,6 +105,22 @@ } private void ClickPrayDrugBtn() { if(FurnaceModel.StoveLV < prayModel.prayPushLv) { SysNotifyMgr.Instance.ShowTip("PrayforDrug102",prayModel.prayPushLv); } else if(prayModel.GetPrayDruglist().Count < 1) { SysNotifyMgr.Instance.ShowTip("PrayforDrug101"); } else { WindowCenter.Instance.Open<PrayforDrugWin>(); } } private void OnEnable() { isJumpToId = 0; System/BlastFurnace/PrayForDurgModel.cs
@@ -25,8 +25,9 @@ public void OnBeforePlayerDataInitialize() { PlayerDatas.Instance.PlayerDataRefreshInfoEvent -= RefreshPlayeLv; FuncOpen.Instance.OnFuncStateChangeEvent -= UpdateFuncState; blastModel.RefreshStoveModelEvent -= UpdateBlastLv; playerPack.RefreshItemSumUseCntAct -= RefreshItemUsce; } public void OnAfterPlayerDataInitialize() @@ -36,21 +37,32 @@ public void OnPlayerLoginOk() { PlayerDatas.Instance.PlayerDataRefreshInfoEvent += RefreshPlayeLv; FuncOpen.Instance.OnFuncStateChangeEvent += UpdateFuncState; blastModel.RefreshStoveModelEvent += UpdateBlastLv; playerPack.RefreshItemSumUseCntAct += RefreshItemUsce; UpdatePrayDanRedpoint(); } private void RefreshItemUsce(int id) { if (!playerPack.CheckIsDrugById(id)) return; AttrFruitConfig fruitConfig = Config.Instance.Get<AttrFruitConfig>(id); if (!playerPack.IsReachMaxUseDrug(fruitConfig)) return; UpdatePrayDanRedpoint(); } private void UpdateBlastLv() { if (!blastModel.StoveIsUpGrade) return; UpdatePrayDanRedpoint(); } private void UpdateFuncState(int funcId) { if (funcId != (int)FuncOpenEnum.BlastFurnace) return; UpdatePrayDanRedpoint(); } private void RefreshPlayeLv(PlayerDataRefresh type) { if (type != PlayerDataRefresh.LV) return; UpdatePrayDanRedpoint(); } @@ -164,9 +176,9 @@ private Redpoint prayRedpoint = new Redpoint(BlastFurnaceModel.LINGDANREDPOINT_KEY, PRAYDRUGREDPOINT_KEY); public void UpdatePrayDanRedpoint() { if (PlayerDatas.Instance.baseData.LV < prayPushLv || !FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.BlastFurnace) || alreadyPrayNum >= everyDayNum) if (blastModel.StoveLV < prayPushLv || alreadyPrayNum >= everyDayNum || GetPrayDruglist().Count < 1) { prayRedpoint.state = RedPointState.None; return; System/BlastFurnace/PrayforDrugWin.cs
@@ -107,6 +107,7 @@ { ctrl.m_Scorller.RefreshActiveCellViews(); } ctrl.JumpIndex(0); } private void RefreshPrayDrug(ScrollerDataType type, CellView cell) System/Compose/New/ComposeWin.cs
@@ -43,6 +43,8 @@ get { return _composeModel ?? (_composeModel = ModelCenter.Instance.GetModel<ComposeWinModel>()); } } SelectEquipModel selectModel { get { return ModelCenter.Instance.GetModel<SelectEquipModel>(); } } #region Built-in protected override void BindController() { @@ -121,6 +123,7 @@ protected override void OnPreClose() { selectModel.ClearSelectModel(); } protected override void OnAfterClose() System/Compose/New/ComposeWinModel.cs
@@ -201,6 +201,7 @@ /// </summary> private byte[] fixedIndexArray = null; private byte[] addonsReduceArray = null; private byte[] unfixedIndexArray = null; Dictionary<int, Dictionary<int, int>> fixedMatIsBindDict = new Dictionary<int, Dictionary<int, int>>(); //id , isBind, count Dictionary<int, Dictionary<int, int>> unfixedMatIsBindDict = new Dictionary<int, Dictionary<int, int>>(); @@ -273,7 +274,15 @@ } } byte[] unfixedIndexArray = DictToArray(selectModel.GetHaveUnfixedSelectItem()); if(compoundModel.unfixedItemCount > 0) { DictToArray(selectModel.GetHaveUnfixedSelectItem()); } else { unfixedIndexArray = null; } if (unfixedIndexArray != null) { for (i = 0; i < unfixedIndexArray.Length; i++) @@ -592,6 +601,8 @@ private void SetMatIsBindDict(ItemModel itemModel,Dictionary<int, Dictionary<int, int>> matDict) { if (itemModel == null) return; if (!matDict.ContainsKey(itemModel.itemId)) { Dictionary<int, int> bindDict = new Dictionary<int, int>(); System/DailyQuest/DailyQuestModel.cs
@@ -738,7 +738,7 @@ var beforeOpenTime1 = openTime1.TryGetTodayNearestOpenTime(out hourMinute1); HourMinute hourMinute2; var beforeOpenTime2 = openTime1.TryGetTodayNearestOpenTime(out hourMinute2); var beforeOpenTime2 = openTime2.TryGetTodayNearestOpenTime(out hourMinute2); if (beforeOpenTime1 && !beforeOpenTime2) { System/MainInterfacePanel/FeatureNoticeModel.cs
@@ -221,7 +221,7 @@ { return; } string strKey = "FeatureNotice" + functionForecastConfig.FrameLevel; string strKey = "FeatureNotice" + functionForecastConfig.FrameLevel+PlayerDatas.Instance.baseData.PlayerID; int type = LocalSave.GetInt(strKey); bool IsOpenMain = WindowCenter.Instance.CheckOpen<MainInterfaceWin>(); if (PlayerDatas.Instance.baseData.LV >= functionForecastConfig.FrameLevel && type == 0) System/MainInterfacePanel/FeatureNoticeWin.cs
@@ -12,6 +12,14 @@ namespace Snxxz.UI { //功能预告面板 public enum FeatureNoticeEnum { Pet=6,//灵宠 Horse=8,//坐骑 Wing=97,//翅膀 GossipFurnace=87,//八卦炉 } public class FeatureNoticeWin : Window { [SerializeField] Text m_TextAdvanceName;//功能名 @@ -26,6 +34,11 @@ [SerializeField] Text m_TextUnopened;//未开启 [SerializeField] Text m_Textschedule;//进度 [SerializeField] Button m_ButtonGoto; [SerializeField] RawImage m_RawImage1; [SerializeField] RawImage m_RawImage2; [SerializeField] RawImage m_RawImage3; [SerializeField] RawImage m_RawImage4; [SerializeField] Text m_keyName; TreasureModel treasureModel { get { return ModelCenter.Instance.GetModel<TreasureModel>(); } } FeatureNoticeModel featureNoticeModel { get { return ModelCenter.Instance.GetModel<FeatureNoticeModel>(); } } #region Built-in @@ -41,7 +54,10 @@ protected override void OnPreOpen() { DefaultSelection();//获取默认选择 if (!WindowJumpMgr.Instance.IsJumpState)//是否经历跳转打开 { DefaultSelection();//获取默认选择 } m_ScrollerController.OnRefreshCell += OnRefreshGridCell; OnCreateGridLineCell(m_ScrollerController); ContentDisplay(); @@ -57,6 +73,13 @@ } protected override void OnPreClose() { UI3DModelExhibition.Instance.StopShowNPC(); UI3DModelExhibition.Instance.StopShowHourse(); UI3DModelExhibition.Instance.StopShowWing(); UI3DTreasureExhibition.Instance.StopShow(); } protected override void OnAfterClose() { PlayerDatas.Instance.PlayerDataRefreshInfoEvent -= OnPlayersUpLV; FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent; m_ScrollerController.OnRefreshCell -= OnRefreshGridCell; @@ -65,9 +88,9 @@ if (featureNoticeModel.redPointStre1.state == RedPointState.Simple) { featureNoticeModel.redPointStre1.state = RedPointState.None; } } } private void treasureStageUpEvent(int obj) { ContentDisplay(); @@ -158,9 +181,7 @@ } } protected override void OnAfterClose() { } #endregion private void DefaultSelection()//获取默认选择 { @@ -198,7 +219,7 @@ return; } m_TextAdvanceName.text = functionForecastConfig.FuncName; m_FeaturesImage.SetSprite(functionForecastConfig.Icon); DisplayIcon(ClickFuncID); string[] StrList = ConfigParse.GetMultipleStr(functionForecastConfig.Content); if (StrList.Length > 0) { @@ -218,9 +239,68 @@ { TrailerClassification(ClickFuncID); } } private void DisplayIcon(int funcID)//显示图标或者模型 { m_RawImage1.gameObject.SetActive(false); m_RawImage2.gameObject.SetActive(false); m_RawImage3.gameObject.SetActive(false); m_RawImage4.gameObject.SetActive(false); m_FeaturesImage.gameObject.SetActive(false); var functionForecastConfig = Config.Instance.Get<FunctionForecastConfig>(ClickFuncID); switch (funcID) { case (int)FeatureNoticeEnum.Pet: UI3DModelExhibition.Instance.StopShowHourse(); UI3DModelExhibition.Instance.StopShowWing(); UI3DTreasureExhibition.Instance.StopShow(); m_RawImage1.gameObject.SetActive(true); var npcConfig = Config.Instance.Get<NPCConfig>(50106001); UI3DModelExhibition.Instance.BeginShowNPC(50106001, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, m_RawImage1); break; case (int)FeatureNoticeEnum.Horse: UI3DModelExhibition.Instance.StopShowNPC(); UI3DModelExhibition.Instance.StopShowWing(); UI3DTreasureExhibition.Instance.StopShow(); m_RawImage2.gameObject.SetActive(true); HorseConfig _model = Config.Instance.Get<HorseConfig>(100); UI3DModelExhibition.Instance.BeginShowHourse(_model.Model, m_RawImage2); break; case (int)FeatureNoticeEnum.Wing: UI3DModelExhibition.Instance.StopShowNPC(); UI3DModelExhibition.Instance.StopShowHourse(); UI3DTreasureExhibition.Instance.StopShow(); m_RawImage3.gameObject.SetActive(true); var vec3 = new Vector3(0,90,-90); int job = PlayerDatas.Instance.baseData.Job; if (job == 1) { var config = Config.Instance.Get<WingRefineExpConfig>(3711); int _modelID = config.Model; UI3DModelExhibition.Instance.BeginShowWing(_modelID, vec3, m_RawImage3); } else if (job == 2) { var config = Config.Instance.Get<WingRefineExpConfig>(3721); int _modelID = config.Model; UI3DModelExhibition.Instance.BeginShowWing(_modelID, vec3, m_RawImage3); } break; case (int)FeatureNoticeEnum.GossipFurnace: UI3DModelExhibition.Instance.StopShowNPC(); UI3DModelExhibition.Instance.StopShowHourse(); UI3DModelExhibition.Instance.StopShowWing(); m_RawImage4.gameObject.SetActive(true); UI3DTreasureExhibition.Instance.BeginShowTreasure(301, m_RawImage4); break; default: m_FeaturesImage.gameObject.SetActive(true); m_FeaturesImage.SetSprite(functionForecastConfig.Icon); break; } } void TrailerClassification(int funcID)//预告分类 { m_TextTurnedOn.gameObject.SetActive(false); @@ -239,20 +319,29 @@ else if (funcoPenConfig.LimitMissionID != 0)//任务 { m_TextUnopened.gameObject.SetActive(true); m_TextUnopened.text= string.Format(Language.Get("TaskFuncOpen"), funcoPenConfig.LimitLV); if (PlayerDatas.Instance.baseData.LV >= funcoPenConfig.LimitLV) { m_TextUnopened.text = string.Format(Language.Get("YGTaskDone"), funcoPenConfig.LimitLV, PlayerDatas.Instance.baseData.LV, funcoPenConfig.LimitLV); } else { m_TextUnopened.text = string.Format(Language.Get("YGTask"), funcoPenConfig.LimitLV, PlayerDatas.Instance.baseData.LV, funcoPenConfig.LimitLV); } return; } } else//等级 { m_TextUnopened.gameObject.SetActive(true); m_TextUnopened.text= string.Format(Language.Get("FuncLevelOpen"), funcoPenConfig.LimitLV); m_TextUnopened.text= string.Format(Language.Get("YGFuncLevel"), funcoPenConfig.LimitLV,PlayerDatas.Instance.baseData.LV, funcoPenConfig.LimitLV); return; } } private void MagicWeapon(int fabaoID) { m_Textschedule.gameObject.SetActive(true); m_ButtonGoto.gameObject.SetActive(true); Treasure treasure; TreasureConfig _treasure = Config.Instance.Get<TreasureConfig>(fabaoID); @@ -266,7 +355,7 @@ if (treasureModel.TryGetTreasure(fabaoID, out treasure) && treasure.state == TreasureState.Collected) { m_Textschedule.gameObject.SetActive(true); m_keyName.text = Language.Get("YGQWJX"); var list = treasure.treasureStages; var funcStage = 0; for (int i = 0; i < list.Count; i++) @@ -284,24 +373,24 @@ { if (treasure.exp >= treasure.treasureStages[funcStage].exp) { m_Textschedule.text = "100%"; m_Textschedule.text = string.Format(Language.Get("YGYouFBDone"), "100%"); } else { m_Textschedule.text = (float)treasure.exp / treasure.treasureStages[funcStage].exp + "%"; } string str = ((float)treasure.exp / treasure.treasureStages[funcStage].exp) * 100 + "%"; m_Textschedule.text = string.Format(Language.Get("YGYouFB"), str); } } else { m_Textschedule.text = 0+" %"; m_Textschedule.text = string.Format(Language.Get("YGYouFB"), "0%"); } } } else { m_TextUnopened.gameObject.SetActive(true); m_TextUnopened.text = string.Format(Language.Get("FuncFBOpen"), _treasure.Name); m_keyName.text = Language.Get("YGHQFB"); m_Textschedule.text = string.Format(Language.Get("YGNoFB"), _treasure.Name); } } } System/MainInterfacePanel/FeaturesType1.cs
@@ -15,10 +15,11 @@ [SerializeField] Text m_FunctionalLevel;//功能等级 [SerializeField] Text m_FunctionName;//功能名 [SerializeField] Image m_FeaturesTypeIcon;//功能图标 [SerializeField] ImageEx m_FeaturesTypeIcon;//功能图标 [SerializeField] GameObject m_ImageSelected; [SerializeField] Button m_Button; [SerializeField] GameObject m_Img_Done; [SerializeField] ImageEx m_DisplayIcon; public GameObject ImageSelected { get { return m_ImageSelected; } @@ -38,8 +39,30 @@ return; } m_FunctionName.text = functionForecastConfig.FuncName; m_FunctionalLevel.text = functionForecastConfig.DisplayLevel.ToString(); m_FunctionalLevel.text = functionForecastConfig.DisplayLevel.ToString()+ Language.Get("Z1041"); m_FeaturesTypeIcon.SetSprite(functionForecastConfig.FuncIconKey); if (PlayerDatas.Instance.baseData.LV >= functionForecastConfig.DisplayLevel) { m_FunctionalLevel.color = new Color32(141,220,17,255); } else { m_FunctionalLevel.color = new Color32(255, 244, 205,255); } if (FuncOpen.Instance.IsFuncOpen(funcId)) { m_Img_Done.SetActive(true); m_FeaturesTypeIcon.gray = false; m_DisplayIcon.gray = false; m_FunctionName.color = new Color(255,244,205); } else { m_Img_Done.SetActive(false); m_FeaturesTypeIcon.gray = true; m_DisplayIcon.gray = true; m_FunctionName.color = new Color(220, 220, 220); } } } System/MainInterfacePanel/FeaturesType2.cs
@@ -12,11 +12,13 @@ public class FeaturesType2:MonoBehaviour { [SerializeField] Text m_FunctionalLevel;//功能等级 [SerializeField] Text m_FunctionName;//功能名 [SerializeField] Image m_FeaturesTypeIcon;//功能图标 [SerializeField] ImageEx m_FeaturesTypeIcon;//功能图标 [SerializeField] GameObject m_ImageSelected; [SerializeField] Button m_Button; [SerializeField] GameObject m_DefaultBar; [SerializeField] GameObject m_SelectedBar; [SerializeField] GameObject m_Img_Done; [SerializeField] ImageEx m_NameBottom; public GameObject ImageSelected { get { return m_ImageSelected; } @@ -36,15 +38,31 @@ return; } m_FunctionName.text = functionForecastConfig.FuncName; m_FunctionalLevel.text = functionForecastConfig.DisplayLevel.ToString(); m_FunctionalLevel.text = functionForecastConfig.DisplayLevel.ToString()+Language.Get("Z1041"); m_FeaturesTypeIcon.SetSprite(functionForecastConfig.FuncIconKey); if (PlayerDatas.Instance.baseData.LV >= functionForecastConfig.DisplayLevel) { m_FunctionalLevel.color = new Color32(141, 220, 17,255); } else { m_FunctionalLevel.color = new Color32(255, 244, 205,255); } if (FuncOpen.Instance.IsFuncOpen(funcId)) { m_SelectedBar.SetActive(true); m_Img_Done.SetActive(true); m_FeaturesTypeIcon.gray = false; m_NameBottom.gray = false; m_FunctionName.color = new Color(255, 244, 205); } else { m_SelectedBar.SetActive(false); m_Img_Done.SetActive(false); m_FeaturesTypeIcon.gray = true; m_NameBottom.gray = true; m_FunctionName.color = new Color(255, 244, 205); } } System/MainInterfacePanel/FunctionForecastTip.cs
@@ -69,7 +69,7 @@ foreach (var config in configs) { if (!FuncOpen.Instance.IsFuncOpen(config.FuncId) && PlayerDatas.Instance.baseData.LV >= config.OpenLevel) && PlayerDatas.Instance.baseData.LV >= config.OpenLevel && config.Display==1) { OpenTag = config.FuncId; if (FunctionOpenTagEvent != null) System/Treasure/TreasurePotentialBriefInfo.cs
@@ -112,7 +112,7 @@ if (config.LearnSkillReq > 0 && config.LearnSkillLV > 0) { var preskillConfig = Config.Instance.Get<SkillConfig>(config.LearnSkillReq); requirement = Language.Get("Hallows_NeedSkillLVStart", preskillConfig.SkillName, config.LearnSkillLV); requirement = Language.Get("Hallows_NeedSkillLVStart", preskillConfig.SkillName, config.LearnSkillLV, config.SkillName); m_PotentialName.text = requirement; m_PotentialName.color = UIHelper.GetUIColor(TextColType.Red); } System/Treasure/TreasurePotentialPanel.cs
@@ -299,6 +299,7 @@ { selectedPotential = m_Treasure.potentials[_index].id; m_TreasureAnimation.DisplayPotentialLine(_index); HandleAchievement(); } private void OnPotentialLineAnimComplete(int _index) @@ -321,6 +322,10 @@ m_TreasureAnimation.UnlockTreasurePotential(0); model.SetPotentialUnlockShow(model.selectedTreasure); } else { HandleAchievement(); } DisplayLines(); break; case TreasureAnimation.TreasureShowStep.FirstPotential: @@ -331,10 +336,45 @@ m_TreasureAnimation.UnlockTreasurePotential(0); model.SetPotentialUnlockShow(model.selectedTreasure); } else { HandleAchievement(); } break; } } void HandleAchievement() { if (AchievementGoto.guideAchievementId != 0 && m_Treasure != null) { var config = Config.Instance.Get<SuccessConfig>(AchievementGoto.guideAchievementId); if (config != null && config.Type == 91) { var index = PlayerDatas.Instance.baseData.Job - 1; var skillId = index < config.Condition.Length ? config.Condition[index] : config.Condition[0]; var potential = m_Treasure.GetPotential(skillId); if (potential != null) { if (model.IsPotentialUnlock(m_Treasure.id, potential.id)) { selectedPotential = potential.id; } else { var skillConfig = Config.Instance.Get<SkillConfig>(potential.id); if (skillConfig.LearnSkillReq > 0 && skillConfig.LearnSkillLV > 0) { var preskillConfig = Config.Instance.Get<SkillConfig>(skillConfig.LearnSkillReq); SysNotifyMgr.Instance.ShowTip("TreasurePotentialSelectError", preskillConfig.SkillName, skillConfig.LearnSkillLV, skillConfig.SkillName); } } } AchievementGoto.guideAchievementId = 0; } } } void DisplayLines() { if (m_Treasure == null)