Search Unity

[RELEASED] Dialogue System for Unity - easy conversations, quests, and more!

Discussion in 'Assets and Asset Store' started by TonyLi, Oct 12, 2013.

  1. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    2 Days Left in Return To 3D Sale - Dialogue System 50% Off

    Reminder - There are 2 days left in the Asset Store's Return To 3D Sale.

    The Dialogue System for Unity is 50% off. I previously highlighted a few of the many great 3D games that have been released with the Dialogue System. Just a few of the many exciting Dialogue System-powered 3D games that are in development are:











    Note: Love/Hate is also 50% off. They make a good pair if you're managing a lot of interaction between characters.
     
  2. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Reminder - Updates & Bonuses on Extras Page

    The Dialogue System Extras page has bonus content -- such as project frameworks and examples of UIs replicating various game styles -- and updated integration packages for third party assets.

    Current updated integration packages for version 2.2.18 include packages for Ink, i2 Localization, SALSA, Timeline, TopDown Engine, and Opsive character controllers. Updated packages will also be included in the next regular release of the Dialogue System.
     
  3. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
  4. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Getting excellent voice acting into your indie game - Erik Hermansen Article Series

    Erik Hermansen has published an excellent series of articles on Gamasutra that covers voice acting for indie games, covering everything from estimating costs, to finding the right voice actors, to coordinating activities over discord. Highly recommended if you're thinking about putting voice acting in your Dialogue System-powered game as many games such as Disco Elysium, Lake, and Jenny LeClue - Detectivu do (among many others). The Dialogue System can export Voiceover Scripts and Screenplay Format for use in recording voice acting.

    Getting excellent voice acting into your indie game
     
  5. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Fantasy Games - Dialogue System 50% Off

    The Dialogue System is 50% off right now in the Asset Store's Fantasy Quest Sale, so it's a great time to highlight some of the beautiful fantasy games talented devs are making with the Dialogue System. Just a few of the many diverse fantasy games are:

    Black Book
    Slavic myth-inspired dark fantasy deck-building RPG


    Dwerve
    Tower defense dungeon crawler RPG.


    Elmarion: Dragon Time
    Play a fire-breathing dragon defending the land from undead.


    The Way of Wrath
    Open world tactical RPG set in a shamanistic world.


    Legends of Ethernal
    2D action-adventure fantasy puzzler.


    Some of these games, such as The Way of Wrath, also use Love/Hate, which is currently 50% off, too!
     
  6. nichjaim

    nichjaim

    Joined:
    Apr 23, 2020
    Posts:
    46
    Sorry, looked through the docs but I'm having trouble finding answer to a certain problem. Is there a way to have portions of a dialogue be retrieved at runtime from some function I make? Like, in the dialogue text it might be something like: “Together, John and (GetCurrentCompanionName()) did many things, such as (GetPreviousActionsDone())”
     
  7. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Hi @nichjaim - This is usually done in one of three ways:

    1. Set a Dialogue System variable (e.g., using DialogueLua.SetVariable()) and include [var=variable] markup tags in the Dialogue Text:
    Code (csharp):
    1. DialogueLua.SetVariable("CurrentCompanion", "Adam");
    • Dialogue Text: "Together, John and [var=CurrentCompanion] did many things"

    2. Or register your methods with Lua and use [lua(code)] tags:
    • Dialogue Text: "Together, John and [lua(GetCurrentCompanionName())] did many things"

    3. Or add an OnConversationLine method to the Dialogue Manager or one of the conversation participants, and replace strings in your text:
    Code (csharp):
    1. void OnConversationLine(Subtitle subtitle)
    2. {
    3.     subtitle.formattedText.text = subtitle.formattedText.text.Replace("{COMPANION}", GetCurrentCompanionName());
    4. }
    • Dialogue Text: "Together, John and {COMPANION} did many things"

    #2 is closest to what you're asking, but all 3 are possible solutions.
     
    nichjaim likes this.
  8. Stickeyd

    Stickeyd

    Joined:
    Mar 26, 2017
    Posts:
    174
    Hey. I'm using DS to I2 localization exporter.

    I'm having en localization field in each of my nodes. (Apologies for the brightness)

    But when I export it to I2, the text written in the en field doesn't automatically convert into "English" text in the terms. Only original(Russian) gets exported. Do you know why it can be happening?
     
  9. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Hi @Stickeyd - The Dialogue System Extras page's "Updated for 2.2.18" foldout has an updated i2 Localization integration package with several features that you may not have if you're using an older version. This includes the option to copy all translations from DS to i2. (Normally translations only one way, from i2 to DS, but this option lets you got the other way, too.) The integration works with any relatively recent version of the Dialogue System. It doesn't require version 2.2.18.
     
  10. Stickeyd

    Stickeyd

    Joined:
    Mar 26, 2017
    Posts:
    174
    Hey! Thanks. This works

    Another question: I need to be able to change entries IDs in the conversation.

    The problem happens when I'm editing old dialogues and want to add some new entries that are connected to the old ones(insert them in the middle of the conversation). I can just create new ones, but their IDs will be the last ones in the conversation, so when I then export them to i2 Localization and then to spreadsheets, the sorting is incorrect.
     
  11. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Hi - Since you're using i2 Localization, try these steps:
    1. In the DS To i2 window, click From i2.
    2. Add your new entries.
    3. Select Menu > Sort > Reorder IDs > This Conversation.
    4. In the DS To i2 window, click Clear i2, then To i2.
     
  12. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Final Day of Fantasy Quest Sale - Dialogue System 50% Off



    Today is the last day of the Asset Store's Fantasy Quest Sale. If you have sale items in your cart, remember to check out before the end of the day.

    The Dialogue System for Unity and Love/Hate are both 50% off.

    In addition to the games mentioned above, you can see the Dialogue System in lots of other fantasy games, including:
    • Plot of the Druid (nearing the end of its Kickstarter right now!)
    • Tale of Toast MMO
    • Tortured Hearts (a massive RPG with over 500,000 words of dialogue!)
    • Arcadia: The Crystal Wars
    • Divinheim
    • Heart Is Muscle
    • and many more.
     
  13. yangkairong

    yangkairong

    Joined:
    Aug 20, 2015
    Posts:
    16
    Hello, I found that the template is not set for a single database. It is a global environment. This is not what I want. Is there any way to solve it?
     
  14. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    On the Dialogue Editor window's Templates tab, select Menu > Reset Template.

    The template is unique to each database. However, if you create a new database, it will use the same template from the last database that you edited. This way, if you're using multiple databases, you don't have to enter the same template information in every one. If you don't want the new database to inherit the same template, just select Menu > Reset Template to reset it to the default values, or manually add/remove fields from the new database's template.
     
  15. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Dialogue System 50% Off in Sci-Fi Strikes Back Sale

    upload_2021-7-20_7-57-44.png

    The Dialogue System for Unity and Love/Hate are both 50% off in the Sci-Fi Strikes Back Sale!

    You can see the Dialogue System in action in sci-fi games such as:

    Brytenwalda Studios' Beyond Mankind


    FourAttic's Crossing Souls


    Artur Mandas's OS Omega


    and many more sci-fi games!
     

    Attached Files:

  16. Stickeyd

    Stickeyd

    Joined:
    Mar 26, 2017
    Posts:
    174
    So this works good fine in most scenarios, but in some very specific scenarios it's troublesome. For example:

    upload_2021-7-23_14-50-13.png

    In this example, a dialogue entry that I pointed with number 1 has ID of 24. But dialogue entry with the number 2 has an ID of 60.... making it basically the biggest ID in the conversation, which makes it appear at the end of the conversation in spreadsheet. As I understand, this happens because when your dialogue system sorts the IDs, it goes through each of the branches subsequently, and here it interpreted the entry with number 3 as continuation of specifically first branch of the dialogue, even though it's continuation of both branches. This looks very weird in spreadsheet and basically requires me to edit each of the spreadsheets manually before showing it to editors/localizers.

    Ideally, I would rather prefer the 1 and 2 entries be of subsequent ids, and only then count each of the branches subsequently. So it will be :

    1 - 24
    2 - 25

    Then under 1 - 26, 27, 28, 29 etc
     

    Attached Files:

    Last edited: Jul 23, 2021
  17. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Hi @Stickeyd - That's difficult to handle programmatically because a different writer might want entry 2 to be lower in the list. For example, you could move the same nodes to look like this:

    upload_2021-7-23_8-50-57.png

    In this case, visually the logic would suggest that 2 should be lower down in the list.

    What do you propose? I could add an option to allow you to manually change the ID number of a node.
     
  18. Stickeyd

    Stickeyd

    Joined:
    Mar 26, 2017
    Posts:
    174
    Even if the id of the entry 2 should be lower than id of all the entries of the branch 1, it shouldn't be the last id of the conversation (even after all the nodes under entry 3). That would be acceptable enough for me. Because what happens now is that the entry 2 is almost THE LAST entry in the WHOLE conversation. Which means that the writer will see the second option of the dialogue even lower than the dialogue entries that go after it, which I imagine no writer would ever want to.
     
  19. Stickeyd

    Stickeyd

    Joined:
    Mar 26, 2017
    Posts:
    174
    Look here. Do you think the writer wants to the 40-41-42 entries first, and only then see the 60 choice, which will eventually lead to the 40 entry? That doesn't make any sense for the writer. Безымянный.png
     
  20. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Got it. I'll check that. Entry 2 should be followed by 2.1 and 2.2 in the image below:

    upload_2021-7-23_9-14-57.png
     
    Stickeyd likes this.
  21. Stickeyd

    Stickeyd

    Joined:
    Mar 26, 2017
    Posts:
    174
    Yes exactly.

    What do I do for now though? Do I just change each of the ids manually? I think it's possible to do via Debug tab?
     
  22. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    That's risky because you must also update all Outgoing Links, including in any other conversations that link to the entry. I'll try to provide a patch by the end of tomorrow.

    If you want to try to change the IDs manually, first back up your database. Then close the Dialogue Editor window. Inspect the database, and tick Show Default Inspector:

    upload_2021-7-23_9-23-59.png

    In the example below, I change an entry's ID from 2 to 5.

    Find the element with ID 2. Change it to 5. Also inspect all Outgoing Links, and change the Origin Dialogue ID to 5:

    upload_2021-7-23_9-33-13.png

    Then find all elements that link to this entry. Update their Destination Dialogue IDs:

    upload_2021-7-23_9-34-16.png
     
  23. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Interviews with Fellow Dialogue System Users

    In case you missed them, here are some interesting interviews with devs using the Dialogue System:

    Suzerain: Personal Politics, the Global Community, and Empathy in Games
    Paste Magazine's interview with the lead developer of the multi-award-winning game.


    Lake trades stress for tranquility by offering you a new role as a mail carrier
    Games Radar's interview with the lead writer.
    upload_2021-7-23_14-26-40.png

    Gestalt: Steam and Cinder - Exclusive Developer Walkthrough
    Gamespot's developer walkthrough exclusive.
    upload_2021-7-23_14-30-12.png


    Reminder: The Dialogue System for Unity is 50% off in the Asset Store's Smash Hit Summer Sale.
    (Love/Hate is 50% off, too!)
     
    Last edited: Jul 23, 2021
  24. zfh2773

    zfh2773

    Joined:
    Nov 16, 2019
    Posts:
    27
    How to destroy an object with DialogueSystem?
     
  25. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    You can deactivate it with the SetActive() sequencer command. If you need to destroy it, you can write a custom sequencer command. If you're using the Dialogue System's save system and you want saved games to save the fact that it was deactivated/destroyed, add a DestructibleSaver component to the GameObject.
     
  26. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
  27. SOSolacex

    SOSolacex

    Joined:
    Jan 10, 2018
    Posts:
    121
    Hey Tony, I am having an issue with which I was hoping you could help me out..
    After loading a game using the pixelcrushers save/load system, my worldstreaming for loading terrains for Gaia doesn't do anything to the point where the terrains don't spawn, causing the player to fall endlessly.

    Would you know anything about this?
     
  28. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Hi @SOSolacex - I'll need some more details to help. Make a note of which Gaia GameObjects are present before loading. Then check which Gaia GameObjects are present after loading. Are any missing? If so, it might help to mark them Don't Destroy On Load. (You can try adding a DontDestroyOnLoad component to them.) Are there any errors or warnings in the Console window?
     
  29. SOSolacex

    SOSolacex

    Joined:
    Jan 10, 2018
    Posts:
    121
    Hey Tony,

    Well the weird thing is; it works completely fine in the editor playtime; everything related to gaia is still there, but it doesn't work in an actual development build.

    However, in the actual build it does not. I don't see any error that could cause it either in console.
     
  30. Alic

    Alic

    Joined:
    Aug 6, 2013
    Posts:
    137
    Hey Tony, I'm wondering about different ways of ending conversations. DialogueManager.StopConversation works in most cases, but I'm trying to do a more complex setup with a traditional dialogue system (with a standard dialogue UI) PLUS a bark system that allows conversations to happen between NPCs around the player, and also allows the player to forward through those conversations with a different button.

    Here's a link to an old conversation between us with a little more info:


    I've got this setup mostly working, but my problem is sometimes I want to interrupt/end one of the bark conversations from a script, and this gets really messy, because I can only call DialogueManager.StopConversation, which I think just ends whichever conversation was most recently started, or something like that. So, my question is, what is the cleanest method for, from a script, ending a specific conversation I've started before, but which may have been started earlier than several other conversations?

    Thanks a ton for your time Tony.
     
  31. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Are you sure it's related to the Dialogue System in that case? One difference in builds: Since the first Dialogue Manager GameObject to exist during play will survive scene changes and replace subsequent Dialogue Managers, builds will always use the first Dialogue Manager present in your project's build settings order -- whereas, if you're playing a scene directly in the editor, it will use that scene's Dialogue Manager. Make sure the Dialogue Manager in your first build scene is configured the way you want.

    Other than that, make sure Gaia is configured to continue working properly when scenes are reloaded.

    Also try making a Development Build to catch any issues in your build during play.
     
  32. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Hi @Alic - Each active conversation gets its own record in DialogueManager.instance.activeConversations. You can find a conversation by checking each record's conversationController.currentState.subtitle.dialogueEntry.conversationID. Then call conversationController.Close() to stop the conversation.
     
    Alic likes this.
  33. Alic

    Alic

    Joined:
    Aug 6, 2013
    Posts:
    137
    Brilliant, looking through the code I was thinking that was the right path. Just wanted to make sure I wasn't about to go at it the wrong way. Thanks Tony.
     
    TonyLi likes this.
  34. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Last Chance - Dialogue System 50% Off

    upload_2021-7-27_8-3-3.jpeg

    This is the final leg of the Smash Hit Summer Sale and your last chance to get the Dialogue System for Unity and Love/Hate at half price in the sale.

    Tip: If you get a license for the Dialogue System, at any time afterward you can get Quest Machine at 50% off as an "upgrade" as a thank-you for Pixel Crushers customers.

     
  35. fbmd

    fbmd

    Joined:
    Dec 4, 2016
    Posts:
    16
    Hi,
    I'm planning to use Dialogue System, Quest Machine, and Love/Hate in connection with a high-level visual scripting system (like FlowReactor, Game Creator, or own solution based on NodeGraphProcessor, etc.). All such systems come with their own variable systems, where designers can store state of world, NPCs etc.
    In how far can the Pixelcrushers system share variables across systems (so e.g. Dialogue system can access a quest value from Quest Machine or Love/Hate) and furthermore, in how far is it possible to integrate it with the visual-scripting-systems variable (and event!) system?
     
  36. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Hi @fbmd - The Dialogue System, Quest Machine, and Love/Hate are all designed for easy integration. They ship with integrations for PlayMaker, Bolt, etc., already, so it should be no problem to integrate it with your own solution.
     
  37. fbmd

    fbmd

    Joined:
    Dec 4, 2016
    Posts:
    16
    Hey, thanks for the prompt answer. Could you elaborate a bit on the details?
    So you are saying that DS, QM, and L/H all use one and the same variable system when installing the integration packages? This would mean that each system could access variables/properties used in one of the others.
    When integrating those systems with another high-level visual scripting system like FlowReactor, it would mean I'd need to be able to treat DS variables like blackboard variables to use them in node fields. Also vice versa, I would need DS to access blackboard variables. How is that done, e.g., in Playmaker?
     
  38. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Hi @fbmd - No, they don't use the same variable system. But the API for each one is designed to provide easy access to the asset's data and methods. Love/Hate, for example, doesn't have a need for variables per se, but it does have relationship values, for example, that you can access with FactionManager.GetAffinity(). Similarly, Quest Machine doesn't have variables, but it does have quest states and counter values that you can access with methods such as QuestMachine.GetQuestState(). The Dialogue System's variables, which are stored in a Lua virtual machine, can be accessed with DialogueLua.GetVariable().

    This is what the integrations do. For example Quest Machine has a condition type that can check a Dialogue System variable. That condition calls DialogueLua.GetVariable(). Quest Machine's procedural quest generator can also check Love/Hate relationships when generating new quests at runtime. The integrations for visual scripting tools such as PlayMaker similarly just call these methods.

    All three assets also have plenty of public events that you can hook into for notifications (e.g., when a quest state changes, when a conversation starts, when a Love/Hate character changes its opinion of the player, etc.).

    Please feel free to try out the evaluation versions. They're all available for download on the Pixel Crushers site.
     
  39. fbmd

    fbmd

    Joined:
    Dec 4, 2016
    Posts:
    16
    Thanks a lot. That explains which way to go with such integrations. I've already bought all 3 systems from the asset store, as they are just too convincing.
    When integrating the 3 Pixelcrushers systems with each other it seems a bit intransparent which integration packages have to be installed with which system. E.g. the QM extension for DS or vice versa... or both sides?
    Could you maybe create an integration table that makes it clear in which direction the integrations go and which packages have to be installed for all possible combos?
     
  40. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Hi @fbmd - Thanks! Import all of the integrations (Dialogue System integration for Quest Machine, Love/Hate integration for Quest Machine, and Dialogue System integration for Love/Hate). Some of the integrations have two packages: one in Common / Third Party Support and a second in Asset Name / Third Party Support. There's no overlap except the Common packages, so you'll want to get them all.

    I recommend familiarizing yourself with each asset individually first. Then check out the integrations. If you have any questions at any point, please feel free to post here, or on the discord server, or the Pixel Crushers forum, or email me at tony (at) pixelcrushers.com.
     
  41. SOSolacex

    SOSolacex

    Joined:
    Jan 10, 2018
    Posts:
    121
    Hey,

    Having a small issue where bark on idle doesn't seem to work even though I am sure it worked before.
    The character has "Bark on Idle" component, that leads to a conversation with different barks in a random sequence.
    The character has an audiosource, Textless bark UI and the "last check" says true.
    The barks have a sequence command that does not have spelling errors and lead to the correct path.

    I don't remember actually changing the character, so I feel like an update/patch (maybe an integration?) might have messed something up. It's definitely been around for a little while now, I only just started addressing it now haha
     
  42. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Temporarily set the Dialogue Manager's Other Settings > Debug Level to Info. Then reproduce the issue. There will probably be one of two outcomes:

    1. The Console window will log that it can't find a valid line to bark. This usually happens if the nodes have Conditions on them, and all of the Conditions currently evaluate false. If this happens, double check the Conditions.

    2. Or the Console window will log that it's barking a line, such as:

    Dialogue System: Bark (speaker=Enemy (UnityEngine.Transform), listener=null): 'He's mine!'

    This will be preceded by 'Add Link' logs for every node whose Conditions evaluate true.

    If it logs that it's barking a line, review the Console logs for the sequencer commands. Maybe it can't find the audio clip, etc.
     
  43. SOSolacex

    SOSolacex

    Joined:
    Jan 10, 2018
    Posts:
    121
    Hey, the console says that it's barking a line but aside from that there's nothing.
    I'm also sure it should be able to find the audioclip as I dragged it into the sequence, creating the path automatically (I also double checked)
     
  44. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Do you see any Sequencer lines in the Console? For example, if I take DemoScene2 and clear out the Enemy Barks conversation's Dialogue Text, then when an enemy barks it logs:

    Dialogue System: Bark (speaker=Enemy (UnityEngine.Transform), listener=null): ''
    Dialogue System: Sequencer.Play( Audio(Enemy_6_2)@0 )
    Dialogue System: Sequencer: Audio(Enemy_6_2, Enemy (UnityEngine.Transform))


    How is your textless bark UI configured?
     
  45. SOSolacex

    SOSolacex

    Joined:
    Jan 10, 2018
    Posts:
    121
    The textless bark UI is on the same object as the bark on Idle, I didn't change anything in terms of scripting.
    The sequencer.play/audio does not show up in the console, which is weird because I am 100% sure the path is correct.
     
  46. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Even if the path were wrong, it should still show a line in the Console.

    Is your Dialogue Manager perhaps pointing to an old dialogue database that doesn't have the sequencer command in the node's Sequence field?

    As a test, try removing the textless bark UI and adding the Basic Standard Bark UI prefab as a child of the barker. Then play the scene. Does it show the bark text?
     
  47. SOSolacex

    SOSolacex

    Joined:
    Jan 10, 2018
    Posts:
    121
    No to both questions unfortunately.
    I'll try to reimport some of the files, maybe something somehow messed up along the way.

    EDIT: Now I think about it, perhaps it started to stop working when I started using the assembly stuff so I could script some UIS + Dialogue system? I don't remember actually editing bark on idle or anything related to it, but maybe it's because of the assemblies?

    Barking using the dialogue system trigger does work, so it seems to be just the bark on idle script as far as I know.
     
    Last edited: Jul 31, 2021
  48. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Do you mean assembly definition files? If so, that shouldn't cause any issue.

    Does the Dialogue System Trigger's bark play audio? If so, please try configuring it to play the same conversation as your Bark On Idle component. Let me know if that works and plays audio.

    If you're not on the latest version of the Dialogue System, can you back up your project and then update?
     
  49. SOSolacex

    SOSolacex

    Joined:
    Jan 10, 2018
    Posts:
    121
    Yes, the Trigger's bark does play audio, and it uses the same conversation. I am currently using the latest version
     
  50. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    In DemoScene2, do the enemies' barks play audio correctly? They also use Bark On Idle.

    At any time, feel free to send a reproduction project to tony (at) pixelcrushers.com if you'd like me to take a direct look.