Search Unity

[SALE 50% OFF] Quest Machine: Hand-Written and Procedurally-Generated Quests

Discussion in 'Assets and Asset Store' started by TonyLi, Sep 20, 2017.

  1. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Hi @Gregorik - Yes, I plan to target the best-in-class frameworks on the store for the major genres -- ORK for RPGs, uMMORPG for MMOs, Adventure Creator for adventure games, etc.

    Hi @fancyferret - If you have any questions or feature requests, just let me know! :)
     
    fancyferret likes this.
  2. fancyferret

    fancyferret

    Joined:
    Feb 4, 2017
    Posts:
    31
    Hi @TonyLi

    I installed this tonight but I'm having some problems and I think it's related to the order of how I am installing the third party support modules.

    I have Dialogue System, Love/Hate and Quest Machine in my game. Both DS and L/H were already integrated.

    On adding QM and then adding the module from QM's Third Party Support folder I gott these errors:


    Assets/Pixel Crushers/Quest Machine/Third Party Support/ORK Framework Support/Scripts/ORK Steps/Quest Control/GetQuestStateStep.cs(14,18): error CS0101: The namespace `ORKFramework.Events.Steps' already contains a definition for `GetQuestStateStep'

    Assets/Pixel Crushers/Quest Machine/Third Party Support/ORK Framework Support/Scripts/ORK Steps/Quest Control/SetQuestStateStep.cs(13,18): error CS0101: The namespace `ORKFramework.Events.Steps' already contains a definition for `SetQuestStateStep'

    Assets/Pixel Crushers/Quest Machine/Third Party Support/ORK Framework Support/Scripts/ORK Steps/UI/ShowAlertStep.cs(13,18): error CS0101: The namespace `ORKFramework.Events.Steps' already contains a definition for `ShowAlertStep'


    In order to track down the problem I deleted QM, DS and L/H and started with a fresh install of QM. I then added the ORK support module from QM's Third Party folder. It worked so far so good.

    I added Dialogue System and then added support for DS to QM. So far so good.

    I added ORK support to DS and immediately got those errors again. Removing ORK support in DS entirely clears it.

    Am I adding things in the wrong order or adding from the wrong folders?
     
  3. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Hi @fancyferret - I'm sorry, there was a conflict between a couple script names in the Dialogue System's ORK support and Quest Machine's ORK support packages. It's fixed in Quest Machine 1.0.4.1, which should hopefully be on the Asset Store today. The evaluation package was also updated today to 1.0.4.1, and you can directly download the updated ORK Support package here:

    QM_ORK_Support_2018-03-23.unitypackage
     
    hopeful and fancyferret like this.
  4. fancyferret

    fancyferret

    Joined:
    Feb 4, 2017
    Posts:
    31
    Thanks so much! You're the best!
     
  5. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Version 1.0.4.1 on Asset Store

    Version 1.0.4.1 is now available on the Unity Asset Store. This small update to 1.0.4 updates the ORK Support package for compability with the Dialogue System for Unity's ORK Support package. If you're not using ORK Support, you don't need to update to this version.
     
    fancyferret and AGregori like this.
  6. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    fancyferret, AGregori and hopeful like this.
  7. jGate99

    jGate99

    Joined:
    Oct 22, 2013
    Posts:
    1,945
    @TonyLi
    I'm a new user of Quest Machine and want to use it for procedural quests in an RPG im developing. Please advise how can i achieve following use case:

    User taps on a quest board which shows a list of Procedural Quests like this

    ====QUEST_BOARD=====
    1- Fight Monster X
    Level 12

    2- Fight Monster B
    Level 5

    3- So On
    ===================

    and so on. ill b showing max 10 such procedural quests at any given time.

    When user tap on any item, it will jump directly to fight screen where actual fight will happen and either monster or hero will win, hero will get XP both reward (more) and less in case losing the battle.

    Thats it.

    Thanks
     
  8. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Hi @AmRafay1 - Thanks for using Quest Machine! I'll post back in a bit with a small example scene that will show how to do that. I'll explain how it works, too.
     
  9. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Hi @AmRafay1 - I attached an example scene to this reply.

    To set it up, I used the Quest Generator window (Tools > Pixel Crushers > Quest Machine > Quest Generator) to create some entity types named "Monster A", "Monster B", etc. Their parent type is "Monster":



    The Monster type contains all the settings that the real monster types inherit so I wouldn't have to enter them individually for each monster.
    • Faction: Used to determine what's a "threat" that the quest board should generate a quest about.
    • Urgency Function: Used with Faction to know whether this is a threat.
    • Actions: Things the player can do to the monster.
    I also created a Player entity type. I defined two factions -- Monsters and Player -- with negative affinity to each other. The default urgency (Threat) means that it's urgent for the Player to generate quests about anything that it has negative affinity for.

    The Fight action defines in abstract terms what it will accomplish:



    The effect of fighting is that it will remove the monster, thereby ending its threat. The action will listen for the message "Fight Ended" to know that it's done. (I'll describe messages below.)

    Since the settings are in the parent Monster type, each monster entity is simple. I just set the specifics -- Display Name, Image, and Level -- and set its parent to Monster:



    Finally, I created a Domain named "Monster Domain". This is how the quest board will keep track of what monsters it can generate quests about.

    To set up the scene, I added the Quest Machine and Input Device Manager prefabs. You don't really need the Input Device Manager prefab on touch since its purpose is to detect between mouse and gamepad.

    I added a trigger area named MONSTER DOMAIN with a Quest Domain component, and for each monster a child GameObject with a Quest Entity component:



    The monsters also have colliders to the domain can add them to a list of known entities. This is just a convenient way of handling the list of known entities. If you don't want to use colliders, you can manually assign entities to the domain by assigning them in the inspector, using the AddEntity method, or assign a method to QuestGeneratorEntity.updateWorldModel and manually set the quest generator's world model (the entities it knows about).

    Finally, I added a Quest Board GameObject:



    It has these components:
    • Quest Giver: Holds the list of quests to offer, and handles the dialogue UI.
    • Quest Generator Entity: Generates quests about entities in MONSTER DOMAIN.
    • XP Reward System: This is a starter script that sends the message "Add XP" (+ some amount) to the player when the quest is done. In this example scene, it adds the "# XP Reward" text to the quest for you.
    • Quest Board: A short script (included in the example scene) that just opens a battle screen with a Win/Lose button. You'll want to replace this with your actual battle stuff. The Win/Lose buttons use a utility component named Quest Control to send the message "Fight Ended" to Quest Machine. Recall that we configured the Fight action to listen for this message. The buttons also close the battle screen.


    The QuestBoard.cs script (also included below) fills out the quest list and shows the dialogue UI, and it also opens the battle screen when the player accepts a quest. I pasted it in below in case you don't want to download the example scene.

    Code (csharp):
    1. using UnityEngine;
    2. using System.Collections;
    3. using PixelCrushers;
    4. using PixelCrushers.QuestMachine;
    5.  
    6. [RequireComponent(typeof(QuestGiver))]
    7. [RequireComponent(typeof(QuestGeneratorEntity))]
    8. public class QuestBoard : MonoBehaviour, IMessageHandler
    9. {
    10.  
    11.     // Variables just for this example:
    12.     public GameObject battleScreen;
    13.     public UnityEngine.UI.Text battleTitle;
    14.  
    15.     private QuestGiver questGiver;
    16.     private QuestGeneratorEntity questGenerator;
    17.     private bool isGeneratingQuest;
    18.  
    19.     private void Awake()
    20.     {
    21.         // Get references to our Quest Machine components:
    22.         questGiver = GetComponent<QuestGiver>();
    23.         questGenerator = GetComponent<QuestGeneratorEntity>();
    24.         questGenerator.generatedQuest += OnGeneratedQuest;
    25.     }
    26.  
    27.     public void OpenQuestBoard() // Call this to open the quest board window.
    28.     {
    29.         StartCoroutine(FillQuestBoardAndOfferPlayer());
    30.     }
    31.  
    32.     private IEnumerator FillQuestBoardAndOfferPlayer()
    33.     {
    34.         // Make sure we've generated enough quests:
    35.         isGeneratingQuest = false;
    36.         var timeUp = Time.time + 1;
    37.         while (questGiver.questList.Count < questGenerator.maxQuestsToGenerate && Time.time < timeUp)
    38.         {
    39.             if (!isGeneratingQuest)
    40.             {
    41.                 isGeneratingQuest = true;
    42.                 questGenerator.GenerateQuest();
    43.             }
    44.             yield return null;
    45.         }
    46.  
    47.         questGiver.StartDialogueWithPlayer();
    48.     }
    49.  
    50.     private void OnGeneratedQuest(Quest quest)
    51.     {
    52.         isGeneratingQuest = false;
    53.     }
    54.  
    55.     private void OnEnable()
    56.     {
    57.         // We want to know when we accept a quest and when the fight is over:
    58.         MessageSystem.AddListener(this, QuestMachineMessages.QuestStateChangedMessage, string.Empty);
    59.     }
    60.  
    61.     private void OnDisable()
    62.     {
    63.         MessageSystem.RemoveListener(this);
    64.     }
    65.  
    66.     // Called when a quest state changes. If quest became active, open battle screen:
    67.     public void OnMessage(MessageArgs messageArgs)
    68.     {
    69.         if (messageArgs.values[0] == null && // Value 0 is the node ID, or null for the main quest.
    70.             (QuestState)messageArgs.values[1] == QuestState.Active) // Value 1 is state.
    71.         {
    72.             // Quest became active, so start battle by opening battle screen.
    73.             // The monster name is in the title. You can use it to set up the battle:
    74.             var quest = QuestMachine.GetQuestInstance(messageArgs.parameter);
    75.             var monsterName = quest.title.value.Substring("Fight ".Length);
    76.             battleTitle.text = monsterName;
    77.             battleScreen.SetActive(true);
    78.         }
    79.     }
    80. }
     

    Attached Files:

    Weblox, hopeful and jGate99 like this.
  10. jGate99

    jGate99

    Joined:
    Oct 22, 2013
    Posts:
    1,945
    @TonyLi, thank you very much for such a great support :) will implement and let you know in case any issues
     
  11. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Happy to help! :)
     
  12. wood333

    wood333

    Joined:
    May 9, 2015
    Posts:
    851
    I am not an owner of Quest Machine, but I am considering it. What I need is the integration with Inventory Pro mentioned a while back in this thread, but not mentioned recently. Specifically I need the ability to give an inventory pro item as a Quest Machine reward, and to restrict offering/accepting a Quest Machine quest based on Inventory Pro stats.

    What is the status of the Inventory Pro integration? Is there Trello for Quest Machine?
     
  13. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Hi @wood333 - I assume you'll also need the ability to progress quests when the player acquires or loses items, too, right?

    Inventory Pro integration is still on the roadmap but Rucksack bumped ahead in the queue. (You can see the queue order on the Trello board under Third Party/Localization.)
     
  14. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Requesting Feedback on articy:draft and CSV Import/Export Needs

    Several Quest Machine users have been in email discussions with me about what they want from articy:draft and/or CSV import/export. I thought it might be useful to open up the discussion here.


    CSV (e.g., Excel / Google Sheets)
    Quest Machine can already import and export the text of quests in CSV format, which is useful to send spreadsheets to proofreaders and translators. CSV is not ideal, however, for representing the complex node structure of quests. If you only need a text-based format for some automated processing, CSV will do. But it would be unwieldy to manipulate the node structure by hand in CSV.

    What are your needs/desires for CSV import and export?


    articy:draft
    articy:draft is node-based. Tentatively, each quest will be defined in a Flow node, with individual quest nodes in Flow Fragment nodes, as below:

    articyquest.png

    Flow nodes and Flow Fragment nodes will have special required properties corresponding to the data that Quest Machine will need.

    What are your needs/desires for articy:draft import? Any issues with the proposed approach above?
     
  15. wood333

    wood333

    Joined:
    May 9, 2015
    Posts:
    851
    Rucksack does not include character stats, so from the start, switching to Rucksack would require additional work. Also, Inventory Pro is a mature asset which is essentially bug free. Our project is single player, so we don't need the multiplayer that Rucksack provides, it's most talked about feature. My point is that Inventory Pro is ready for game release, now, whereas Rucksack is new and the expansion packs they plan to offer do not exist, yet.

    Also, all the other assets we use in our project support Easy Save 2. Is this in Quest Machine's future?

    By the way, thank you for your very prompt response. Excellent!
     
  16. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Good point. I expect the next release to support both.

    Already done. :)
     
    wood333 likes this.
  17. jGate99

    jGate99

    Joined:
    Oct 22, 2013
    Posts:
    1,945
    @TonyLi
    Btw, im also b buying Inventory Pro as well as your dialog system very soon for my RPG. In my assumption, almost every person who develop custom RPG engine'd use the plugins. I'll also b using I2 Localization for Localization. It'd b great if you add support for Inventory Pro
     
  18. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Hi @AmRafay1 - Great! The Dialogue System also has integration with Inventory Pro and i2 Localization. Quest Machine will soon.
     
    jGate99 likes this.
  19. jGate99

    jGate99

    Joined:
    Oct 22, 2013
    Posts:
    1,945
    great, vl b waiting 4 quest machine then
     
  20. wood333

    wood333

    Joined:
    May 9, 2015
    Posts:
    851
    Purchased on sale, a fantastic bargain!
     
    hopeful and TonyLi like this.
  21. wood333

    wood333

    Joined:
    May 9, 2015
    Posts:
    851
    Upon import I found these console errors. I am uncertain how to resolve them. Could you advise me?

    Quest Machine Errors 5-2018.JPG
     
  22. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Hi @wood333 - This is a known issue in Unity, and not specific to Quest Machine. To resolve it, please try this:

    1. Make sure you haven't created a build inside your Assets folder. If you have, delete that build folder.

    2. Otherwise, quit Unity and restart.

    3. If that doesn't fix it, quit Unity, delete the Library folder, and restart. This will do a fresh reimport.
     
    hopeful likes this.
  23. wood333

    wood333

    Joined:
    May 9, 2015
    Posts:
    851
    That fixed it. Thanks!
     
  24. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Happy to help!
     
  25. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    May Madness Sale Ends Tomorrow

    Tomorrow is your last day to get Quest Machine for 30% off in the May Madness Sale. uMMORPG support is in the upcoming version.
     
  26. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Reminder: The May Madness Sale ends tonight! Quest Machine is 30% off until the sale ends. If you have items in your cart, remember to get them while you can still pick them up on sale.
     
  27. jGate99

    jGate99

    Joined:
    Oct 22, 2013
    Posts:
    1,945
    @TonyLi

    I finally sat down and created 2 entities (player and monster), their factions with negative affinities with eachother, threat and fight action.
    However instead of manually adding Monster A, B, C, and hard coded skill i'd like to add them on runtime with names and skill level based on player within a range so whenever i go to board as a player there are always both low level and greater level than me monsters to fight with.

    Please advise


    PS: I yesterday bought the Dialog System too, but ill ask its intigration question later once im comfertably done with Quest Machine
     
  28. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Hi @AmRafay1 - I attached an updated example to this reply. In the subfolder Example2, there's a new scene. It uses a script (also included below) that generates 3 monsters: one below the player's level, one equal to the player's level, and one above.

    Monsters.cs
    Code (csharp):
    1. using UnityEngine;
    2. using System.Collections.Generic;
    3. using PixelCrushers.QuestMachine;
    4.  
    5. public class Monsters : MonoBehaviour
    6. {
    7.  
    8.     // Player's current level:
    9.     [Range(2, 9)]
    10.     public int playerLevel = 3;
    11.  
    12.     // Monsters are based on this entity type:
    13.     public EntityType monsterEntityType;
    14.  
    15.     // Current list of instantiated monsters:
    16.     private List<QuestEntity> monsters = new List<QuestEntity>();
    17.  
    18.     public void GenerateMonsters()
    19.     {
    20.         DestroyCurrentMonsters();
    21.  
    22.         // Generate a monster below player's level:
    23.         GenerateMonster(Random.Range(1, playerLevel));
    24.  
    25.         // Generate a monster at the player's level:
    26.         GenerateMonster(playerLevel);
    27.  
    28.         // Generate a monster above the player's level:
    29.         GenerateMonster(Random.Range(playerLevel + 1, 11));
    30.     }
    31.  
    32.     public void GenerateMonster(int level)
    33.     {
    34.         var monsterName = "Monster L." + level;
    35.  
    36.         // Create an entity type:
    37.         var myEntityType = Instantiate<EntityType>(monsterEntityType);
    38.         myEntityType.name = monsterName;
    39.         myEntityType.level = level;
    40.  
    41.         // Create a GameObject:
    42.         var go = new GameObject(monsterName);
    43.         go.transform.SetParent(this.transform);
    44.         go.AddComponent<BoxCollider2D>();
    45.         var rb2d = go.AddComponent<Rigidbody2D>();
    46.         rb2d.gravityScale = 0; // Don't fall down screen.
    47.         var monster = go.AddComponent<QuestEntity>();
    48.         monster.entityType = myEntityType;
    49.         monsters.Add(monster);
    50.     }
    51.  
    52.     public void DestroyCurrentMonsters()
    53.     {
    54.         foreach (var monster in monsters)
    55.         {
    56.             Destroy(monster.entityType);
    57.             Destroy(monster.gameObject);
    58.         }
    59.     }
    60.  
    61.     private void OnDestroy()
    62.     {
    63.         DestroyCurrentMonsters();
    64.     }
    65. }

    Thanks!
     

    Attached Files:

    jGate99 likes this.
  29. jGate99

    jGate99

    Joined:
    Oct 22, 2013
    Posts:
    1,945
    Sorry for delay, im now again back to quest machine.
    My question is when we add new monsters on runtime, why do we have to add BoxCollider, Rigid Body and a gameobject seperately? I want to understand the reason in detail so i can start understanding it better.

    For example, in my case all i want to have meta information, as there will be only 1 fixed monster view/gameobject where ill b replacing the meta information like monster image, its level etc.
     
  30. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Hi @AmRafay1 - It's not required. You can specify the entities in code instead.

    Here's an explanation: To generate a quest, the quest generator needs to know what entities are in the world. The list of entities that it knows about is called a world model.

    Quest generators can watch areas of the game world called domains. A domain is a big trigger collider. If an entity has a collider and is inside the domain, the domain will know about it, and that means the quest generator will automatically add the entity to its world model. This is what the example scene does.

    However, you can also manually add entities to the generator's world model. To do this, hook into the QuestGeneratorEntity's updateWorldModel event. Here's an example:

    Code (csharp):
    1. void Awake() {
    2.     GetComponent<QuestGeneratorEntity>().updateWorldModel += AddEntities;
    3. }
    4.  
    5. void AddEntities(WorldModel worldModel) {
    6.     // Add entities of a specified domainType and entityType to the model.
    7.     // The variables domainType and entityType should point to assets.
    8.     worldModel.AddEntityType(domainType, entityType, entityCount);
    9. }
     
  31. Ryan-Hayle

    Ryan-Hayle

    Joined:
    Feb 16, 2014
    Posts:
    142
    When I started looking into your asset I was for using a csv format, as I had taken this approach in the past. However after spending some time using articy:draft I can see that this approach has more going for it. At the moment I am trying to take the ideas that have been produced in a word document and lay them out within articy:draft. The perfect solution for myself would be to have an articy:draft example based on your demo example (so that I can follow your approach) and then being able to see the exported file auto generate the quests within the editor (or even during run-time). Also a dialogue system example would be much needed.
     
  32. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Hi @Ryan-Hayle - I just emailed you an example articy project. Please keep in mind that the format may change. I don't expect it to change significantly, but there will probably be small tweaks.

    Each quest will be a Flow Fragment with child Flow Fragments for each quest node:

    questFlow.png

    The screenshot above shows a condition (Kill3Orcs.orcsKilled >= 3). The quest will not progress from the Kill 3 Orcs node to the Talk to NPC until until this condition is true.

    Quests have a template that looks like this:

    questProperties.png

    And quest nodes have a template that looks like this (at least for now; subject to change):

    questNodeProperties.png
     
  33. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    The Dialogue System for Unity includes a template articy project. You can read about the Dialogue System and articy here. The format and import process is virtually the same in the upcoming version 2.0, but the documentation has been improved.
     
  34. Ramulos

    Ramulos

    Joined:
    Feb 19, 2017
    Posts:
    57
    hello,

    I have all three of your assets and right now I'm trying to use QuestMachine with MegaBook. In the QuestMachineCanvas I changed the render mode to world space cause I want it to be fixed to a page on a book. I attach it to the book but the UI's keep on rotating on their own to face the player camera. How can I disable this rotation for a gui in world space?
     
  35. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Hi @Ramulos - Thanks for using Pixel Crushers assets!

    Does your canvas, or any child GameObjects on it, have an Always Face Camera component? If so, please remove it. I can't think of another reason why the UI would rotate unless MegaBook is rotating it. If you get stuck, please feel free to send a reproduction project to tony (at) pixelcrushers.com. I'll be happy to take a look.
     
  36. serberusno1

    serberusno1

    Joined:
    Jan 28, 2017
    Posts:
    84
    Hey just installed and tried the tutorial on youtube (or at least adapted it to what I needed) but the video leaves a hell of a lot of unanswered questions for me. I'll explain roughly what I want to achieve and hopefully you can offer me some advice or tell me if it's even possible with this asset.

    My game is 3D, I want to set up a simple quest where the player has to go around and collect a bunch of boxes for someone. The mission brief would be displayed as a body of text when the player stops in a box for a long enough period of time. This mission brief also gives the player the option to accept or decline the mission. If they accept they must then go around and collect the boxes (simply colliding with them). Once all of the boxes are collected, another UI element pops up with some congratulations text etc and the mission is completed.

    Your video doesn't explain how you are supposed to trigger quests or even how to get the quest text etc to show up as UI. I also can't figure out how to assign some boxes as quest items or establish how the player is meant to interact with all of these items for instance how to simply establish that colliding with them means they are being collected. I'm assuming I will have to dig through the documentation but this would be really nice info to have in a quick start video.

    Thanks in advance.
     
  37. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Hi @serberusno1 - Thanks for checking out Quest Machine! Yes, that's all possible. There's only so much that can fit into a single quick start before it's no longer so quick. I plan to release other videos that break down each part in more detail. In the meantime, here's how to do what you're asking:

    You can start the mission brief in a script or using utility components provided with Quest Machine. Here's an example scene:

    QuestMachine_3DDialogueTriggerInBoxExample_2018-06-03.unitypackage

    It uses Unity's Standard Assets FirstPersonController. The scene contains a box with a trigger collider, Trigger Event, Timed Event, and Quest Giver.
    • When the player enters the box, the Trigger Event tells the Timed Event to start a timer.
    • After 3 seconds, the Timed Event tells the Quest Giver to start dialogue with the player by calling its QuestGiver.StartDialogueWithPlayer method.
    • The dialogue has Accept and Decline buttons.
    • If the player accepts, the quest is added to the player's journal. Then the player can collect carrots (simply by colliding with them). The quest HUD shows the current count. By default, the quest HUD is in the upper right.
    • Once all the carrots are collected, the quest shows an alert message, by default in the lower left, and requires the player to return to the box. You could just set the quest successful at this point instead of requiring the player to return. I just happened to re-use the carrots quest from the demo, which adds that extra requirement.
    The text for the dialogues, HUD, and alert messages are all in the quest. They're displayed through the UIs on the Quest Machine GameObject's Quest Machine Canvas. You can customize the look of those UIs, but I recommend doing that kind of superficial stuff later in development rather than right away.

    Each carrot has a Trigger Event that deactivates the carrot and sends a Quest Machine message "Get" + "Carrot". The quest's counter listens for this message. Quest Machine uses a message system to avoid direct references to GameObjects. This makes it easy for quests to span multiple scenes.
     
    TeagansDad likes this.
  38. serberusno1

    serberusno1

    Joined:
    Jan 28, 2017
    Posts:
    84
    Cool, thank you so much I'll give all of that a try this week :)
     
  39. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    @serberusno1 - Sounds good! If any questions come up, please feel free to post here or email tony (at) pixelcrushers.com.
     
  40. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    I was just pointed to a nice mention on DVNC's article, Top 5 Unity Asset Store Assets, which includes Quest Machine. They write: "Any game that intends to have quests (especially if you want procedural quests) should use Quest Machine...."

    uMMORPG support (coming in 1.0.5) is getting a workout thanks to the dev of the upcoming MMO Trulion Online.

    I'm just finishing up articy:draft support and Inventory Pro support, and then 1.0.5 will be ready to ship!
     
    Tashkin, hopeful and TeagansDad like this.
  41. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Quest Machine 1.0.5 Released!

    Version 1.0.5 is now available on the Asset Store. Highlights of this release are support for articy:draft, uMMORPG and Inventory Pro!

    Version 1.0.5 Release Notes
    • Improved: Now tracks times accepted on quester, not quest giver, to better support multiplayer.
    • Added: QuestGiver & QuestListContainer.ResetToOriginalState() methods.
    • Fixed: QuestStateSerializer now gracefully handles bad tag lists.
    • articy:draft: Added support.
    • Dialogue System for Unity: Updated for Dialogue System for Unity 2.x.
    • Inventory Pro: Added support.
    • uMMORPG: Added support.
     
    hopeful likes this.
  42. wood333

    wood333

    Joined:
    May 9, 2015
    Posts:
    851
    Can version 1.0.5 be imported on top of the prior version?

    Thank you for inventory pro support. :)
     
  43. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Hi! Yes, just import on top. If there's ever an update that requires anything more than simply importing on top, it will be very clear in the Version Changes text on the Asset Store. I'll also include it in the release notes post here.
     
    wood333 likes this.
  44. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
  45. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Quest Machine 1.0.6 Released!

    Version 1.0.6 is now available on the Asset Store. Highlights of this release are save system improvements, ability to mix and match Quest Machine dialogue and Dialogue System conversations, and more custom conditions and actions for uMMORPG. Version 1.0.6 also includes a package of optional Assembly Definition files that you can use to further reduce recompile times.


    Version 1.0.6 Release Notes
    • Fixed: Quest generators now comply with max quest limit even if multiple GenerateQuest() processes start simultaneously.
    • Fixed: QuestMachine.instance wasn't being assigned properly.
    • Fixed: MessageArgsEvent is now serializable in inspector.
    • Save System: Added Binary Data Serializer.
    • Save System: Added saveStarted, saveEnded, loadStarted, loadEnded events that your scripts can hook into.
    • Added SaveSystemEvents component to hook into events using inspector.
    • Save System: Fixed index error in DiskSavedGameDataStorer.
    • Dialogue System: Now allows mix-and-match quests that use Dialogue System conversations and quests that don't.
    • uMMORPG: Added conditions & actions.
    • Added unitypackage containing optional Assembly Definition files.
     
    hopeful likes this.
  46. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Quest Machine 50% Off for Dialogue System Customers

    If you've already bought the Dialogue System for Unity, you can get Quest Machine for 50% off as an "upgrade" purchase. This is my first use of the Asset Store's upgrade system. If you don't see the upgrade price, please let me know.
     
  47. Tashkin

    Tashkin

    Joined:
    Feb 5, 2017
    Posts:
    3
    This is a must have asset for sure. We are using it in the mmorpg mentioned by Tony. Support is top notch and yes ummorpg is definitely getting some love now. Trulion Online, which is being developed by my company Exuberant Games, is using this asset. The amount of time it has saved us and the amount of features included is amazing. Tony keep up the amazing work we truly appreciate both the Dialogue System and Quest Machine. Being able to integrate both of those with ummorpg was important and you got it set up. Thanks again.
     
    TonyLi and hopeful like this.
  48. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Thanks for the kind words! And for your valuable feedback, too, as we got the uMMORPG integrations working together. I'm glad to see the Trulion Online site is open for business. I just signed up to request to be an alpha tester! :)
     
    Tashkin likes this.
  49. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,702
    Updated ORK Framework Support Package Available

    If you're using ORK Framework with Quest Machine 1.0.6 or earlier, you may be interested this updated support package:

    QM_ORKSupport_2018-08-03.unitypackage

    You can now set up quest counters to stay synchronized with the player's inventory.

    In the demo, Green Pants has a second quest to find a Cap for him to wear. To set it up, I added a counter named "Cap" (which has to exactly match the ORK item name) and set its update mode to Data Sync.

    This update will also be in Quest Machine 1.0.7.
     
  50. fancyferret

    fancyferret

    Joined:
    Feb 4, 2017
    Posts:
    31
    Hi Tony,

    I have Quest Machine, Love/Hate & Dialogue System and will be using all of them in ORK. So far, I've tested just QM and QM bridged with DS.

    I've had a test quest giver offer quests which were QM only (using Start Dialogue ORK events) and DS quests (Using Start Conversation ORK events) as well as a combo. I'm using your Harvest Carrots quest as a test and Pesky Rabbits also.

    It can all get a little confusing so is there a workflow I should follow if NPCs have both Dialogue System conversations and Quest Machine quests? Should everything be through DS conversations instead?