Esempio n. 1
0
        // 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);
        }
Esempio n. 2
0
        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();
        }
Esempio n. 3
0
 /// <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);
 }
Esempio n. 4
0
 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)
                 {
                 }
             }
         }
     }
 }
Esempio n. 5
0
    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;
                            }
                        }
                    }
                }
            }
        }
    }
Esempio n. 6
0
 /// <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);
 }
Esempio n. 7
0
    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);
    }
Esempio n. 8
0
    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);
        }
    }
Esempio n. 9
0
 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();
                 }
             }
         }
     }
 }
Esempio n. 10
0
    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);
        }
    }
Esempio n. 11
0
 public KillObjectiveInstance(KillObjective objective, MLQuestInstance instance)
     : base(instance, objective)
 {
     Objective = objective;
     Slain     = 0;
 }
Esempio n. 12
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);
    }
Esempio n. 13
0
    /// <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);
    }
Esempio n. 14
0
 /// <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);
 }