Thanks, glad to hear you like my tool. First you have to realize that there is no "or". eWPDA IS the PDA.yaml file. I work very hard and tirelessly to make sure eWPDA is always up to date. About your question: No, the Dialogue has no option to deactivate a Chapter. However since deactivating a Chapter can also be achieved with just "completing" it or switching to a different Chapter, it might work. Depends on the usecase.
I didn't know that. Sorry if it sounded that way. It's a must-have tool. I tried that, but next time the player will activate the same chapter or task by dialogue it's already completed. There's no option to uncheck a task, right? So I made the chapter complete but now I'm trying to figure out how to reset the chapter so the player can go though it again. Thanks a lot!
Sure. I'm designing a Mission Board for Empyrion that is activatable from the GIN. There are 5 slots for missions and they are randomized every 30 minutes. So I have right now 6 missions that could to slot 1 and there is a dialogue option to list all available missions. I made a function to randomize the missions and it's working fine. Once the player accepts a mission in a given slot, that slot will be locked and the mission will be there until the player either completes it or cancels it. So when he visits that slot again, he'll now have the "complete mission" or "cancel mission" options. If he chooses to complete it, there will be a check there to see if he has what it takes. If that's the case, then player will be payed and the slot will be empty until the next 30 minutes. If he chooses to cancel the mission then he'll lose some reputation with the faction that hired him but the slot will be unlocked now and will get a random mission after 30 minutes. The thing is: with no PDA integration the player could have all slot missions accepted at once and the "engine" is already working to the point that the only thing I need to do now is write more missions. The disadvantage of not using the PDA is that the player must take notes on the missions on his own. If I use the PDA, it's great that we now have visual orientation but the limitation is only one activated mission at a time and no option to control the PDA from dialogue. So I'm think whether I should use the PDA at all. It's gonna be a mess without it but a lot more functional, I guess.
Yeah doing random missions with the PDA is a bit iffy at the moment. If it was just having 1 mission active at a time you could do it, but there's no way to have multiple pda missions active at once. What you could do is create a dummy pda mission players could activate to check what missions they are currently on by having the dummy mission open a dialog window. Would be a bit tedious to set up, but could be done, and that would let players check their current missions by just activating that dummy mission. Maybe someone else can think of a better work around
No problem mate. Not that you think there is something missing. Be it eWPDA or eWCCT. Nope. Making it repeatable? Which kinda makes sense, cause a player can't do 2 missions at the same time. But for tracking purpose your suggested workaround sounds legit. Or work with the Empyriopedia and rewarding Chapters. And for the rest ChapterActivation helps too. In the end workarounds left and right
I understand. In fact they are all "optional missions" if they can be "cancelled" which is equivalent to "failure" because they have been originally "accepted" and the player does not fulfill "success" conditions. Like Rexxus wrote there are possible workarounds, and of course Eleon could implement some kind of "meta-master-mission" to manage all sub-branches in one big module, which would solve the problem and allow to have chapters, tasks and actions to be also "optional". Right now only thing I can think of would be to design all missions (main and side missions) inside one chapter, to be able to reward completed tasks and have their visibility set to "OnlyWhenRewarded" and still keep all other missions active. Inside the "master Chapter" that holds everything, the starter task would simply be "visit the missions board" and when completed the 5 tasks appear as rewards. Edit : the first problem that comes to mind regarding the possibility to "cancel" a mission is obvious : it does not require to only reset the PDA displayed messages, it implies that actions in the game have to be "undone" in some cases, which would surely be very complex to achieve for Eleon : respawn items (keycards) in their original location, resurrect dead "targets" already killed, etc.
Indeed. I'm thinking about the least complex workaround since every mission will need to work inside that kind of engine. Seems doable like you said but it's like cheating the system. Thank you for the input. Very interesting. I'm trying that as well but wasn't touching the "OnlyWhenRewarded" option because I want the task to be available in the UI as long as it's activated. But only one at a time is killing me. Haha. If a PDA task could accept a variable for a string I could try changing it to something like: Code: Chapter: "Mission Board" Task: "Activated Missions: [001][006][008]. Please consult the Empyriopedia for more information." It would be a placeholder chapter and task just to inform the player after he left the GIN. Then I could have a static Empyriopedia entry with all the mission numbers and descriptions. It's gonna be a lot of work but maybe this could work? Thanks a lot for the suggestions. I'll probably try every workaround possible. [EDIT 1] Unfortunately I can't have variables to work with the PDA.csv like I can with Dialogue.csv. So I guess this won't work.
Not sure I follow you here. "OnlyWhenRewarded" is a flag for the rewarded task, and it can be set for as many tasks as you want, but you only refer to tasks by their names, and you can have the "master task" to trigger another "visit the Missions Board" as rewarded task for as long as you have "actions" ( side missions) available. Do you want this to loop an infinite number of times ? (please don't answer "Yesss!" )... You could grab signals from the results of actions or tasks to decide what to do next in the dialogs.
I see. Think I got the "OnlyWhenRewarded" functionality all wrong. I don't intend the missions to loop but I'd like them to be re-playable because that's the purpose of the Mission Board. Your method seems exciting. I'll try that and post results in a new forum post to not make this one too off-topic. Thanks a lot for the tips. I'll post my discoveries with your method soon.
I think that by using signals and task visibility on reward completes the loop you need, and sends more control back to dialogs, where you can have variables and switch statements. Can't wait to see what you're going to cook for us...
Much appreciated, @Kassonnade. I have no idea how to work with signals. I tried once but couldn't make it work. I thought a blueprint would need to have those assigned prior to programming them but I'm using an existing entity which is the GIN. I have no idea how to create a signal for it. Right now, I have missions working but not fully integrated to the PDA. Let's see what happens.
Signals need to exist in the POI such as assigned to a hidden dummy switch. Unless there's a way to do it using the dialog coding (I haven't gotten into that myself) then your POIs will need a physical lever or other signal generating device (not sure if control panel signals work for this).
That's exactly why I stopped using them, @ravien_ff In my situation they wouldn't apply. Thanks for confirming my suspicion. I didn't dig a lot into the documentation yet.
@RexXxuS Hello! I'm trying to use the action "IsOrdered" option but I'm getting the error below. Do you know what could be the cause of it? Thanks a lot! Code: 16-18:42:31.008 15_42 -ERR- YamlDotNet: Exception when trying to deserialize from 'C:\Program Files (x86)\Steam\steamapps\common\Empyrion - Galactic Survival\Client/../Saves/Games/byoEden_v14/PDA/PDA.yaml' 16-18:42:31.010 15_42 -EXC- YamlDotNet.Core.YamlException: (Line: 15113, Col: 13, Idx: 438636) - (Line: 15113, Col: 13, Idx: 438636): Exception during deserialization ---> System.Runtime.Serialization.SerializationException: Property 'IsOrdered' not found on type 'Eleon.Pda.ActionData'. at YamlDotNet.Serialization.TypeInspectors.TypeInspectorSkeleton.GetProperty (System.Type type, System.Object container, System.String name, System.Boolean ignoreUnmatched) [0x0005c] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.NodeDeserializers.ObjectNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize (YamlDotNet.Core.IParser parser, System.Type expectedType, System.Func`3[T1,T2,TResult] nestedObjectDeserializer, System.Object& value) [0x0003e] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue (YamlDotNet.Core.IParser parser, System.Type expectedType, YamlDotNet.Serialization.Utilities.SerializerState state, YamlDotNet.Serialization.IValueDeserializer nestedObjectDeserializer) [0x00039] in <fa51ecd1ba384d0198cba0ef839ea408>:0 --- End of inner exception stack trace --- at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue (YamlDotNet.Core.IParser parser, System.Type expectedType, YamlDotNet.Serialization.Utilities.SerializerState state, YamlDotNet.Serialization.IValueDeserializer nestedObjectDeserializer) [0x0009e] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.AliasValueDeserializer.DeserializeValue (YamlDotNet.Core.IParser parser, System.Type expectedType, YamlDotNet.Serialization.Utilities.SerializerState state, YamlDotNet.Serialization.IValueDeserializer nestedObjectDeserializer) [0x0006e] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer+<>c__DisplayClass3_0.<DeserializeValue>b__0 (YamlDotNet.Core.IParser r, System.Type t) [0x00000] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.NodeDeserializers.CollectionNodeDeserializer.DeserializeHelper (System.Type tItem, YamlDotNet.Core.IParser parser, System.Func`3[T1,T2,TResult] nestedObjectDeserializer, System.Collections.IList result, System.Boolean canUpdate) [0x00027] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.NodeDeserializers.CollectionNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize (YamlDotNet.Core.IParser parser, System.Type expectedType, System.Func`3[T1,T2,TResult] nestedObjectDeserializer, System.Object& value) [0x000a6] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue (YamlDotNet.Core.IParser parser, System.Type expectedType, YamlDotNet.Serialization.Utilities.SerializerState state, YamlDotNet.Serialization.IValueDeserializer nestedObjectDeserializer) [0x00082] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.AliasValueDeserializer.DeserializeValue (YamlDotNet.Core.IParser parser, System.Type expectedType, YamlDotNet.Serialization.Utilities.SerializerState state, YamlDotNet.Serialization.IValueDeserializer nestedObjectDeserializer) [0x0006e] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer+<>c__DisplayClass3_0.<DeserializeValue>b__0 (YamlDotNet.Core.IParser r, System.Type t) [0x00000] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.NodeDeserializers.ObjectNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize (YamlDotNet.Core.IParser parser, System.Type expectedType, System.Func`3[T1,T2,TResult] nestedObjectDeserializer, System.Object& value) [0x0006b] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue (YamlDotNet.Core.IParser parser, System.Type expectedType, YamlDotNet.Serialization.Utilities.SerializerState state, YamlDotNet.Serialization.IValueDeserializer nestedObjectDeserializer) [0x00082] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.AliasValueDeserializer.DeserializeValue (YamlDotNet.Core.IParser parser, System.Type expectedType, YamlDotNet.Serialization.Utilities.SerializerState state, YamlDotNet.Serialization.IValueDeserializer nestedObjectDeserializer) [0x0006e] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer+<>c__DisplayClass3_0.<DeserializeValue>b__0 (YamlDotNet.Core.IParser r, System.Type t) [0x00000] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.NodeDeserializers.CollectionNodeDeserializer.DeserializeHelper (System.Type tItem, YamlDotNet.Core.IParser parser, System.Func`3[T1,T2,TResult] nestedObjectDeserializer, System.Collections.IList result, System.Boolean canUpdate) [0x00027] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.NodeDeserializers.CollectionNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize (YamlDotNet.Core.IParser parser, System.Type expectedType, System.Func`3[T1,T2,TResult] nestedObjectDeserializer, System.Object& value) [0x000a6] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue (YamlDotNet.Core.IParser parser, System.Type expectedType, YamlDotNet.Serialization.Utilities.SerializerState state, YamlDotNet.Serialization.IValueDeserializer nestedObjectDeserializer) [0x00082] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.AliasValueDeserializer.DeserializeValue (YamlDotNet.Core.IParser parser, System.Type expectedType, YamlDotNet.Serialization.Utilities.SerializerState state, YamlDotNet.Serialization.IValueDeserializer nestedObjectDeserializer) [0x0006e] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer+<>c__DisplayClass3_0.<DeserializeValue>b__0 (YamlDotNet.Core.IParser r, System.Type t) [0x00000] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.NodeDeserializers.ObjectNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize (YamlDotNet.Core.IParser parser, System.Type expectedType, System.Func`3[T1,T2,TResult] nestedObjectDeserializer, System.Object& value) [0x0006b] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue (YamlDotNet.Core.IParser parser, System.Type expectedType, YamlDotNet.Serialization.Utilities.SerializerState state, YamlDotNet.Serialization.IValueDeserializer nestedObjectDeserializer) [0x00082] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.AliasValueDeserializer.DeserializeValue (YamlDotNet.Core.IParser parser, System.Type expectedType, YamlDotNet.Serialization.Utilities.SerializerState state, YamlDotNet.Serialization.IValueDeserializer nestedObjectDeserializer) [0x0006e] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer+<>c__DisplayClass3_0.<DeserializeValue>b__0 (YamlDotNet.Core.IParser r, System.Type t) [0x00000] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.NodeDeserializers.CollectionNodeDeserializer.DeserializeHelper (System.Type tItem, YamlDotNet.Core.IParser parser, System.Func`3[T1,T2,TResult] nestedObjectDeserializer, System.Collections.IList result, System.Boolean canUpdate) [0x00027] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.NodeDeserializers.CollectionNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize (YamlDotNet.Core.IParser parser, System.Type expectedType, System.Func`3[T1,T2,TResult] nestedObjectDeserializer, System.Object& value) [0x000a6] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue (YamlDotNet.Core.IParser parser, System.Type expectedType, YamlDotNet.Serialization.Utilities.SerializerState state, YamlDotNet.Serialization.IValueDeserializer nestedObjectDeserializer) [0x00082] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.AliasValueDeserializer.DeserializeValue (YamlDotNet.Core.IParser parser, System.Type expectedType, YamlDotNet.Serialization.Utilities.SerializerState state, YamlDotNet.Serialization.IValueDeserializer nestedObjectDeserializer) [0x0006e] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer+<>c__DisplayClass3_0.<DeserializeValue>b__0 (YamlDotNet.Core.IParser r, System.Type t) [0x00000] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.NodeDeserializers.ObjectNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize (YamlDotNet.Core.IParser parser, System.Type expectedType, System.Func`3[T1,T2,TResult] nestedObjectDeserializer, System.Object& value) [0x0006b] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue (YamlDotNet.Core.IParser parser, System.Type expectedType, YamlDotNet.Serialization.Utilities.SerializerState state, YamlDotNet.Serialization.IValueDeserializer nestedObjectDeserializer) [0x00082] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.ValueDeserializers.AliasValueDeserializer.DeserializeValue (YamlDotNet.Core.IParser parser, System.Type expectedType, YamlDotNet.Serialization.Utilities.SerializerState state, YamlDotNet.Serialization.IValueDeserializer nestedObjectDeserializer) [0x0006e] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.Deserializer.Deserialize (YamlDotNet.Core.IParser parser, System.Type type) [0x0004e] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.Deserializer.Deserialize (System.IO.TextReader input, System.Type type) [0x00007] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at YamlDotNet.Serialization.Deserializer.Deserialize[T] (System.IO.TextReader input) [0x00000] in <fa51ecd1ba384d0198cba0ef839ea408>:0 at Assembly-CSharp.PcitureDesignerImageResolver.DeleteNode[A] (System.String , System.Boolean& , System.Boolean ) [0x00019] in <0f4a5d378ed44f0a81065d1afad7f056>:0 16-18:42:31.012 15_42 -ERR- No or incomplete PDA data More especifically here: If remove the "IsOrdered" clause then everything is fine.
Hello @byo13 yes! Sorry, I'm preparing a new version and totally forgot about that. Similar like this: https://empyriononline.com/threads/tool-ewpda-empyrion-web-pda.82979/page-5#post-390218 I added upcoming EXP properties ( so Hummel can use it already) and forgot to announce it here. For now, please don't use IsOrdered, IsOptional, OnlyVisibleWhenRewarded. I try to release those fully and much more soon: https://empyriononline.com/threads/version-1-5-experimental-and-public-release.97647/ Edit: the tools were also down recently since I updated my webserver
My bad. Since days I'm working on a new big version for eWPDA and eWCCT and missed the version conflict here. To be honest I didn't know if beside ravien and Hummel, someone else is using my tool in the first place, so I got careless and demotivated. I reverted the changes now and will come up with a better plan next time.
@RexXxuS Your tool is excellent. Let's motivate you in the right direction now. Actually I'm creating the PDA by hand but using your tool to study or generate options I didn't know existed. Seeing the changes @Hummel-o-War is doing, great things await. Many users will benefit from its existence. I just hope we have more control of the PDA using dialogues in the future and vice versa. It's a must have feature to mission creation, better NPC interactions, to make the Universe more vivid and life like. Right now we only have a read only "IsPdaChapterActive" function accessible from dialogues but I see it as not enough. Everything should be controllable from dialogue. We see this in every RPG Maker, for instance or official content creation tools like Bioware's Aurora Toolset. Everything revolves around dialogue. Yes, PDA is important, of course, but I see it more as a way to show progress than all else. It should not be the center of interactivity in my opinion. Anyways, I just rambled on too much here. Keep up the great work, guys. And let's hope and dream for a better future.
Oh I understand that perfectly well. Just so you know, I use your tool as my main reference because it's like a mini-tutorial in itself just looking at the tooltips and help pop ups. Lots of stuff in there. I even made a small scenario with it and it was a breeze. As for dialogs, the text file provided with the game gives me nausea just looking at it, and without your eWCCT I would not even start caring about dialogs at all until information is presented in a less messy fashion. And that's too bad, really, because I'm not one to give up easily, and I know that probably lots of players have a much lower limit than me and are simply rebuked by the difficulty to read dense, unformatted text just to try to get basic understanding of a feature. We're not in a rush, don't feel bad for taking a break because you have done enough already.
Hi Creators, after a lot of work a big patch is live, together with the EXP 1.5. Make sure to read the changelog below. Highlights: Latest EXP additions Blocks & EClassConfig.ecf import updated Fixing major, breaking, frustrating bugs like the drag & drop state move rearrangement. Design Facelift Convenient additions Design Facelift 19.05.2021 | v2.0.0 Added first visit (localsession) popup for big releases or important announcements. Added new Property to reward Chapters and Tasks within Tasks. Combined with new property OnlyVisibleWhenRewarded. Added new Property to mark Actions as Optional. That way Tasks can be completed even without them. Added new Property to mark Actions as ordered. That way Actions must be completed from top to bottom (like Tasks). Added new Property to power a structure On or Off via PlayfieldOps. See documentation. Added docu to new stuff. Added hint in eWPDA setting that you can hover over your left sidebar chapters to see the chapter ID. Useful for ingame clearing chapters. Added finally complete Blocks and ItemsConfig.ecf import - inclusive the new Blocks that only have names and no IDs. Added also possibility to import EClassConfig.ecf for entities. BUT you have to clear your EClassConfig.ecf from BAD tabs instead of spaces!! And Block comments!!. Added force refresh background feature that refreshes the page after 24hours usage automatically. For hardcore lazy people. Added color fetch support from locazitation.csv for item (suggestion) fields. Added a lot better select state detection. Your duplicated state is now automatically selected. Changed Font Family to a more crisp and readable one. Changed Property orders to more logical order. Changed style to some buttons and logic and other goodies. Changed sidebar width to 700px. Fixed FINALLY order of moved states in the sidebar. If you moved Tasks/Actions before somewhere down, it was always position +1. Fixed Design flaws here and there. Fixed TypesMeta > Meta was a string input field instead of number. Fixed style issues with Microsoft Edge Browser. Fixed Drag Copy error for tasks. Fixed style issues for upcoming new Chrome render engine. Fixed NamesRequired export logic if only 1 Names is used. Fixed first TypesMeta Values entry becomes invisible on dropdown selection. Fixed that the custom Localization.csv did not get imported with Scenario import. Fixed sidebar de/collapse on doubleclick on Add Chapter / Add Task / Add Action. You have to open the web tool in a new tab every time a patch comes out to apply the changes.