// private GameObject item; public GatherWitchBrooms() { // QuestObjective = new CollectionObjective("Collect 10 Witch brooms", // "You need to go to the witch houses, and gather their brooms.", 10, item); QuestObjective = new KillObjective("Kill 10 Witch and gather brooms, to get a key", 1, "You need to go to the witch houses, and gather their brooms to get a key.", 10); }
public override void Die() { if (m_enemyAi) { m_enemyAi.enabled = false; } // if this is the first time the enemy dies: if (!IsDead) { if (ScoreValue > 0) { CreateFloatingScore(ScoreValue); GameComponents.ScoreManager.AddScore(ScoreValue, true); GameComponents.PlayerHealth.AddHealth(); // TODO: BAD design, subscribe to the OnDeath Action from the RoomBuilder instead, this is temperary. Remove later! KillObjective killObjective = GameComponents.RoomBuilder.CurrentObjective as KillObjective; if (killObjective != null) { killObjective.OnEnemyKill(); } } // Add force up to give a nice effect if (Walker.Rb && m_jumpAndPhaseThroughWhenDead) { gameObject.layer = LayerMask.NameToLayer("EnemyIgnore"); Walker.Rb.AddForce(Vector2.up * 6 * Walker.Rb.mass, ForceMode2D.Impulse); } else { gameObject.layer = LayerMask.NameToLayer("EnemyIgnoreButNotFloor"); } } // spawn pickups (explode a random amount) if (m_healthPickup != null) { int numberOfPickupsToSpawn = UnityEngine.Random.Range(1, 5); while (numberOfPickupsToSpawn-- > 0) { GameObject pickupInstance = Instantiate(m_healthPickup, transform.position, Quaternion.identity); Rigidbody2D pickupRb = pickupInstance.GetComponent <Rigidbody2D>(); // set trajectory Vector2 randomVector2 = UnityEngine.Random.insideUnitCircle; randomVector2.y = Mathf.Abs(randomVector2.y); // add force and set gravity pickupRb.AddForce(randomVector2, ForceMode2D.Impulse); pickupRb.gravityScale = 0.5f; } } // disable colliders (so it would go through the floor and fall out of the map) base.Die(); }
/// <summary> /// 完成任务 /// </summary> public bool CompleteTask(Task task) { if (!task) { return(false); } task = ResMgr.Instance.Load <Task>(task.TaskID); if (OnGoingTask != null && task.IsComplete) { cmpleteTask = task; task.IsOngoing = false; OnGoingTask = null; DoneTaskList.Add(task); GameDataMgr.Instance.CompleteTask(task); //如果该任务在中转站中,需要消除 if (TaskGiverMgr.Instance.GiverTransferStation.ContainsKey(task.CmpltNpcID)) { TaskGiverMgr.Instance.GiverTransferStation.Remove(task.CmpltNpcID); } foreach (Objective o in task.Objectives) { o.OnFinishThisEvent -= UpdateCollectObjectives; if (o is CollectObjective) { CollectObjective co = o as CollectObjective; GameDataMgr.Instance.RemoveTaskCoItem(co.ItemID, co.Amount); GameDataMgr.Instance.playerInfo.OnGetItemEvent -= co.UpdateCollectAmountUp; } if (o is KillObjective) { KillObjective ko = o as KillObjective; LevelManager.Instance.OnDeathEvent -= ko.UpdateKillAmount; } if (o is TalkObjective) { TalkObjective to = o as TalkObjective; if (TaskGiverMgr.Instance.CmpDbTransferStation.ContainsKey(to.TalkerID)) { TaskGiverMgr.Instance.CmpDbTransferStation.Remove(to.TalkerID); } TaskGiverMgr.Instance.OnTalkFinishEvent -= to.UpdateTalkStatus; } } //奖励 if (task.OnCmpltDialog != null) { DialogMgr.Instance.rewardEvent += Reward; } else { Reward(); } return(true); } return(false); }
public void TraceQuest(Quest quest) { if (!quest || !quest.IsValid) { return; } if (quest.IsComplete) { //在目标建筑显示提醒 } else if (quest.ObjectiveInstances.Count > 0) { using (var objectiveEnum = quest.ObjectiveInstances.GetEnumerator()) { Objective currentObj = null; List <Objective> concurrentObj = new List <Objective>(); while (objectiveEnum.MoveNext()) { currentObj = objectiveEnum.Current; if (!currentObj.IsComplete) { if (currentObj.Concurrent && currentObj.AllPrevObjCmplt) { if (!(currentObj is CollectObjective)) { concurrentObj.Add(currentObj); } } else { break; } } } if (concurrentObj.Count > 0) { int index = Random.Range(0, concurrentObj.Count); //如果目标并发则UI则选一个 currentObj = concurrentObj[index]; } if (currentObj is TalkObjective) { TalkObjective to = currentObj as TalkObjective; } else if (currentObj is KillObjective) { KillObjective ko = currentObj as KillObjective; if (ko.Enemy != null) { } } } } }
void EnemyKilled(Enemy enemy) { foreach (CurrentQuest currentQuest in player.Quests) { Quest q = currentQuest.Quest; for (int i = 0; i < q.QuestObjectives.Count; i++) { if (currentQuest.Objectives[i].Completed) { continue; //Dont need to do any checking if the quest is completed. } QuestObjective qo = q.QuestObjectives[i]; //?!?!???! if (qo as KillObjective) { KillObjective ko = (qo as KillObjective); if (ko != null && (ko.AnyTarget || ko.Target == enemy)) { currentQuest.Objectives[i].Progress++; //new Debug.Log(ko.ObjectiveString(currentQuest.Objectives[i].Progress)); if (currentQuest.Objectives[i].Progress >= ko.Amount) { currentQuest.Objectives[i].Completed = true; if (currentQuest.QuestComplete) { QuestCompleted(currentQuest); } } } } else if (qo as DropsObjective) { DropsObjective dro = qo as DropsObjective; if (dro != null && dro.Target == enemy) { float rnd = Random.Range(0, 100); Debug.Log(q.QuestName + ": Drop [" + dro.ItemName + "] rolls a " + rnd + " (" + dro.ChanceAtDrop + ")"); if (rnd >= 100 - dro.ChanceAtDrop) { currentQuest.Objectives[i].Progress++; Debug.Log(dro.ObjectiveString(currentQuest.Objectives[i].Progress)); if (currentQuest.Objectives[i].Progress >= dro.Amount) { currentQuest.Objectives[i].Completed = true; } } } } } } }
/// <summary> /// 放弃任务 /// </summary> /// <param name="quest">放弃的任务</param> /// <param name="loadMode">是否为读档模式</param> /// <returns></returns> public bool AbandonQuest(Quest quest, bool loadMode = false) { if (HasOngoingQuest(quest) && quest && quest.Abandonable) { quest.IsOngoing = false; QuestsOngoing.Remove(quest); foreach (Objective o in quest.ObjectiveInstances) { if (o is CollectObjective) { CollectObjective co = o as CollectObjective; TriggerManager.Instance.OnGetItemEvent += co.UpdateCollectAmount; TriggerManager.Instance.OnLoseItemEvent += co.UpdateCollectAmountDown; } if (o is KillObjective) { KillObjective ko = o as KillObjective; ko.CurrentAmount = 0; TriggerManager.Instance.OnUnitDeathEvent -= ko.UpdateKillAmount; } if (o is TalkObjective) { } if (o is SubmitObjective) { } if (o is CustomObjective) { CustomObjective cuo = o as CustomObjective; cuo.CurrentAmount = 0; TriggerManager.Instance.OnTriggerSetEvent -= cuo.UpdateTriggerState; } } if (!quest.SbmtOnOriginalNPC) { } if (QuestsOngoing.Count < 1) { } return(true); } else if (!quest.Abandonable) { PopoutController.CreatePopoutAlert("", "该任务无法放弃" , 50, true, PopoutController.PopoutWIndowAlertType.ConfirmMessage , null); } return(false); }
private KillObjective GenerateKillObjective(ObjectiveDifficultyLevel difficulty, GameObject source) { string[] range = null; switch (difficulty) { case ObjectiveDifficultyLevel.EASY: range = EasyKillEnemiesParser.Get("SPIDER").Split('|'); break; } KillObjective objective = new KillObjective(Random.Range(int.Parse(range[0]), int.Parse(range[1]) + 1), "Spider"); return(objective); }
protected Objective createObjective(bool modify = false) { switch (options[selected]) { case "GetItem": GetItemObjective getItem = new GetItemObjective(); getItem.setItem(item); getItem.setObjectiveType(options[selected]); getItem.setObjectiveName(objectiveName); if (!modify) { quest.addObjective(getItem); } return(getItem); case "Kill": KillObjective kill = new KillObjective(); kill.setHowMany(howMany); kill.setObjectiveType(options[selected]); kill.setTarget(target); kill.setObjectiveName(objectiveName); if (!modify) { quest.addObjective(kill); } return(kill); case "TalkTo": TalkToObjective talk = new TalkToObjective(); talk.setObjectiveType(options[selected]); talk.setTarget(target); talk.setObjectiveName(objectiveName); if (!modify) { quest.addObjective(talk); } return(talk); default: return(null); } }
void Update() { if (Input.GetKeyDown(KeyCode.F)) { foreach (Quest quest in questManager.currentQuests) { foreach (Objective objective in quest.objectives) { if (!objective is KillObjective) { continue; } KillObjective killObjective = (KillObjective)objective; if (killObjective.mobType == MobType.BEAR) { killObjective.UpdateObjective(); } } } } }
protected Objective castObjective(Objective obj) { switch (obj.getObjectiveType()) { case "GetItem": GetItemObjective itemObj = (GetItemObjective)obj; item = itemObj.getItem(); return(itemObj); case "Kill": KillObjective objKill = (KillObjective)obj; howMany = objKill.getHowMany(); target = objKill.getTarget(); return(obj); case "TalkTo": TalkToObjective talkObj = (TalkToObjective)obj; target = talkObj.getTarget(); return(obj); default: return(null); } }
public KillObjectiveInstance(KillObjective objective, MLQuestInstance instance) : base(instance, objective) { Objective = objective; Slain = 0; }
/// <summary> /// 接取任务 /// </summary> /// <param name="quest">要接取的任务</param> /// <param name="loadMode">是否读档模式</param> /// <returns></returns> public bool AcceptQuest(Quest quest, bool loadMode = false) { if (!quest || !quest.IsValid) { //PopoutController.CreatePopoutMessage("无效任务", 25); Debug.Log("无效任务"); return(false); } if (HasOngoingQuest(quest)) { //PopoutController.CreatePopoutMessage("任务正在执行", 25); Debug.Log("任务正在执行"); return(false); } if (quest.Group) { } foreach (Objective o in quest.ObjectiveInstances) { if (o is CollectObjective) { CollectObjective co = o as CollectObjective; TriggerManager.Instance.OnGetItemEvent += co.UpdateCollectAmount; TriggerManager.Instance.OnLoseItemEvent += co.UpdateCollectAmountDown; } if (o is KillObjective) { KillObjective ko = o as KillObjective; TriggerManager.Instance.OnUnitDeathEvent += ko.UpdateKillAmount; } if (o is TalkObjective) { } if (o is SubmitObjective) { } if (o is CustomObjective) { CustomObjective cuo = o as CustomObjective; TriggerManager.Instance.OnTriggerSetEvent += cuo.UpdateTriggerState; if (cuo.CheckStateAtAcpt) { TriggerManager.Instance.SetTrigger(cuo.TriggerName , TriggerManager.Instance.GetTriggerState(cuo.TriggerName)); } } o.OnStateChangeEvent += OnObjectiveStateChange; } quest.IsOngoing = true; QuestsOngoing.Add(quest); if (!quest.SbmtOnOriginalNPC) { } if (!loadMode) { PopoutController.CreatePopoutMessage("接取任务[" + quest.TITLE + "]", 50); } if (quest.ObjectiveInstances.Count > 0) { Objective firstObj = quest.ObjectiveInstances[0]; // } return(true); }
/// <summary> /// 完成任务 /// </summary> /// <param name="quest">完成的任务</param> /// <param name="loadMode">是否为读档模式</param> /// <returns></returns> public bool CompleteQuest(Quest quest, bool loadMode = false) { if (!quest) { return(false); } if (HasOngoingQuest(quest) && quest.IsComplete) { if (!loadMode) { foreach (ItemInfo rwi in quest.QuestItemReward.RewardItems) { //if() } foreach (QuestItemReward.DictItemInfo dwi in quest.QuestItemReward.DictRewardItems) { //if() } List <Quest> questsReqThisQuestItem = new List <Quest>(); foreach (Objective o in quest.ObjectiveInstances) { if (o is CollectObjective) { CollectObjective co = o as CollectObjective; questsReqThisQuestItem = QuestRequiredItem(co.Item , SDDataManager.Instance.GetItemAmount(co.Item.ID) - o.Amount) .ToList(); } if (questsReqThisQuestItem.Contains(quest) && questsReqThisQuestItem.Count > 1) //需要道具的任务群包含该任务且数量多于一个,说明其他任务对该任务提交的道具存在依赖 { PopoutController.CreatePopoutMessage ("提交失败,其他任务对该任务提交物品有需求", 50); return(false); } } } quest.IsOngoing = false; QuestsOngoing.Remove(quest); RemoveQuestAgentByQuest(quest); //quest.current QuestsComplete.Add(quest); // foreach (Objective o in quest.ObjectiveInstances) { o.OnStateChangeEvent -= OnObjectiveStateChange; if (o is CollectObjective) { CollectObjective co = o as CollectObjective; TriggerManager.Instance.OnGetItemEvent += co.UpdateCollectAmount; TriggerManager.Instance.OnLoseItemEvent += co.UpdateCollectAmountDown; if (!loadMode && co.LoseItemAtSbmt) { SDDataManager.Instance.LoseItem(co.Item.ID, o.Amount); } } if (o is KillObjective) { KillObjective ko = o as KillObjective; TriggerManager.Instance.OnUnitDeathEvent -= ko.UpdateKillAmount; } if (o is TalkObjective) { } if (o is SubmitObjective) { } if (o is CustomObjective) { CustomObjective cuo = o as CustomObjective; TriggerManager.Instance.OnTriggerSetEvent -= cuo.UpdateTriggerState; } } if (!loadMode) { SDDataManager.Instance.AddCoin(quest.RewardCoin); SDDataManager.Instance.AddDamond(quest.RewardDamond); SDDataManager.Instance.AddJiancai(quest.RewardJianCai); float R = UnityEngine.Random.Range(0, 1); if (R <= quest.QuestItemReward.GetPossible) { foreach (ItemInfo info in quest.QuestItemReward.RewardItems) { SDDataManager.Instance.AddItem(info.ItemID, info.Amount); } foreach (QuestItemReward.DictItemInfo INFO in quest.QuestItemReward.DictRewardItems) { float _R = UnityEngine.Random.Range(0, 1); if (_R <= INFO.Possibility) { SDDataManager.Instance.AddItem(INFO.ID, INFO.amount); } } } PopoutController.CreatePopoutMessage ("完成任务 [" + quest.TITLE + "]", 50); } return(true); } return(false); }
/// <summary> /// 接受任务 /// </summary> public bool AcceptTask(Task task) { if (!task) { return(false); } if (OnGoingTask != null) { return(false); } foreach (Objective o in task.Objectives) { if (o is CollectObjective) { CollectObjective co = o as CollectObjective; co.CurrentAmount = 0; GameDataMgr.Instance.playerInfo.OnGetItemEvent += co.UpdateCollectAmountUp; //获取时是否检查一遍背包以检测任务是否已可完成 if (co.CheckBagAtAccept) { int currentNum = GameDataMgr.Instance.playerInfo.hideList.Any(x => x.id == co.ItemID) ? GameDataMgr.Instance.playerInfo.hideList.Find(x => x.id == co.ItemID).num : 0; co.UpdateCollectAmountUp(co.ItemID, currentNum); } } else if (o is KillObjective) { KillObjective ko = o as KillObjective; ko.CurrentAmount = 0; //检验是否为目的enermy的任务交给关卡管理器(它管理怪物生成和记录死亡的) LevelManager.Instance.OnDeathEvent += ko.UpdateKillAmount; } else if (o is TalkObjective) { TalkObjective to = o as TalkObjective; to.CurrentAmount = 0; if (TaskGiverMgr.Instance.AllTaskGiverInCurrentScene.ContainsKey(to.TalkerID)) { TaskGiverMgr.Instance.AllTaskGiverInCurrentScene[to.TalkerID].GetComponent <DialogListenTrigger>().SetDialogSp(to.TalkDb, true); } else if (!TaskGiverMgr.Instance.CmpDbTransferStation.ContainsKey(to.TalkerID)) { TaskGiverMgr.Instance.CmpDbTransferStation.Add(to.TalkerID, to.TalkDb); } //检验是否为目的NPC的任务交给NPC管理器(它管理NPC的读取) TaskGiverMgr.Instance.OnTalkFinishEvent += to.UpdateTalkStatus; } o.OnFinishThisEvent += UpdateCollectObjectives; } task.IsOngoing = true; OnGoingTask = task; GameDataMgr.Instance.AcceptTask(task); //如果这个任务不是在原NPC处交任务的话 if (!task.CmpltOnOriginalNpc) { //储存到中转站 if (!TaskGiverMgr.Instance.GiverTransferStation.ContainsKey(task.CmpltNpcID)) { TaskGiverMgr.Instance.GiverTransferStation.Add(task.CmpltNpcID, task); } //如果现在场景中就有这个NPC,把这个人物转交给那个NPC if (TaskGiverMgr.Instance.AllTaskGiverInCurrentScene.ContainsKey(task.CmpltNpcID)) { TaskGiverMgr.Instance.AllTaskGiverInCurrentScene[task.CmpltNpcID].TransferTaskToThis(task); } } return(true); }
// Use this for initialization void Start() { killObj = (KillObjective)GameObject.FindGameObjectWithTag("GameLogic").GetComponent<GameLogic>().Objectives[parentID]; killObj.killObjList.Add(this); }