FlowCanvas Forums › Support › Feedback after a year of usage (for Graveyard Keeper)
Hey there!
We’re using flowCanvas for visual scripting cutscenes/dialogs for our game, Graveyard Keeper for a year.
So, I want to leave some feedback after some time of using.
1. First of all, I find your tool amazing and very pleasant to work with. I hope you’ll be continuing to develop it and it will not be dropped.
2. The placing values (especially string ones) on the left of the block is very bad sometimes. If you have a long string values, you’re forced to spread blocks very wide. My solution was to re-write the GUI so the string values are positioned inside the block:
3. I’m struggling hard without a search function. Search through all scripts could be worked around by “search through files”, but searching a block with some particular string value used is impossable. Just consider trying to visually find a block with a particular text string in a script x10 larger than this image:
4. The concept of “if null then Self” feels strange and gave us pretty heavy-debuggable bugs a couple of times.
5. Still not sure if it is possible to store the current flow execution position, serialize it and restore after the game re-load. Had to workaround using events and ensure that game wouldn’t be saved if any script is in the middle of execution.
6. Had to write a pretty ugly code to be able to swap inputs/outputs places to move options up/down and maintain all connections in this type of a block:
If would be great to have a “SwapPort” method.
7. Had to make some weird decisions to workaround the absence of per-execution variables. Imagine, you have a function inside your flowscript that has an input parameter with a “Wait” block that is called in a for-each loop:
The problem is that the parameter is kinda linked to the loop iterator and after waiting, all “Log” calls will receive the the last of the loop and this will work not as you expect. My solution was to make a “Wait obj” block that remembers the input object before the waiting and sends it further after.
The similar problem you can encounter if you’d like to call one script multiple times. There’s no possibility to create some “local namespace” variables. I understand, that looks like an edge case and probably there’s no way to implement such functionality an easy and beautiful way. I’m just pointing some weird problem and I’m totally OK to build workarounds for that by myself 😉
8. The bug in my version of the flowCanvas (didn’t update for a while because didn’t want to merge my modifications) – if you copy and paste a group of linked blocks, they will paste broken links (that will appear on a canvas, will not have a connection dots and will disappear after the script reload).
That’s all I could remember so far. And the only critical issue for me is the absence of the search. Probably would implement it by myself. 🙂
Anyway, this is a great tool! Keep doing your wonderful job!
Developer at Lazy Bear Games
http://www.lazybeargames.com
Hello again!
Thanks a lot for your positive feedback! I really appreciate it and I am glad to hear that you’ve continue using FlowCanvas in your game 🙂
Please let me address your points!
1) Thank you! 😛
2) I like what you’ve done here, but I am still not sure if this is a solution I would like to implement officially. My reasoning is because (only slightly) breaks consistency since all other types are displayed on the left side. I can see though, that for a dialogue system like the one you’ve done here, it can be a good solution.
One thing I have just done though, is to cap the length of the value display characters to max 20 and I think it works pretty nice 🙂
3) A search function is coming in the next version! This was one of the highest priority features to implement!
4) Hmm. Are you referring specifically to the Event Nodes, or to the input value ports? Do you suggest a check box to explicitly tell to “Use Self”?
5) Since a flow execution all takes place in one frame, except for the cases where “latent” nodes are used, I am still not sure what could be stored and restored. Are you indeed referring to those cases where latent nodes like wait are used?
6) A “SwapPort” method is a nice suggestion indeed. I will go ahead and add such a method in BinderConnection type.
7) There is actually a way to set/get local per-execution flow variables. This is done so by the use of the “Write Flow Parameter” and “Read Flow Parameter” nodes. What these do, is to set/get respectively a temporary variable (by name) which is local to the current execution Flow 🙂
This is how it works!
Let me know if that was indeed what you were after. It is a bit of an “obscured” feature, but definitely worth it in some situations 🙂
8) Yep. This bug has been fixed in a later version.
—
Thanks again for all your feedback as well as your kind words on FlowCanvas.
I am also looking forward to play Graveyard Keeper, being a big fun of Punch Club!
Join us on Discord: https://discord.gg/97q2Rjh
2) I’ve noticed that Unreal blueprints shows the variables this way and decided to give it a try. I’m not pushing. Just showing you my solution 😉 Because in our case any string longer then ~5 symbols will make scripts very large.
4) Input ports. An example from my experience when I spent about a day trying to figure out what’s happening. I had a script that was attached to the NPC. And there was a block “find other NPC by ID” which was transferring its value to the “Destroy” block. The problem was when a the block “find other NPC” couldn’t find anything and returned null. The “destroy” block got a null on its input and treated it as “Self”. So, the whole base NPC was destroyed 😉
5) We got make our game so it will work fine even if the script is stopped in the middle. However, we’re heavily use constructions like “wait” or “goto -> say -> wait -> goto” in our scripts. And all of them a async. Don’t need to serialize/restore flow-scripts right now, but that could be a usefull option 😉
7) And you mean that every “foreach” iteration will have its own “temp” parameter value even if all of them are ran in a single thread?
Developer at Lazy Bear Games
http://www.lazybeargames.com
Hey,
Thanks for the follow up.
4) I see. Hmm… I will try to think of something to make such possible confusion be avoided somehow 🙂
5) Storing the state right in the middle of an async operation like wait, would be totally difficult to achieve and in some sense could also be an overkill (code wise to implement) I think. Have you thought of an alternative workaround of maybe storing blackboard variables and replicating the “state” you want (bring flow to a particular node) by doing variable checks (could be enum checks as well of course) in the OnEnable of the graph event?
I am not sure if that is practical for your game of course.
7) Yes, every “For Each” iteration will have it’s own “temp” parameter :). In the above example posted, the console will log 1, 2, 3, 4 etc. which is the current index of the iteration stored as the “temp” parameter.
Join us on Discord: https://discord.gg/97q2Rjh