|
kjaerhus Magician
Joined: 18 Dec 2006 Posts: 317 Location: Denmark
|
Posted: Sat Apr 19, 2008 2:07 pm
Simutronics support |
I have written a lot on this forum about my troubles writing a blocking command and yet it's still a big problem for me. I have made solutions that seem to work most of the time but I find that they all seem to trigger the less robust places in CMUD at some point making it blow up with a nullpointer, index out of bounds or something like that.
Now instead I'd like to suggest implementation of commands that all "Simutronics enabled" clients support and most other mud clients for that matter.
What I need is commands that:
* Wait for the prompt to continue
* Wait for certain feedback from the mud
* Wait for a roundtime (this is a kind of combi command that first waits for feedback on the command and then waits the amount of time that the feedback states. It will say something like: "You swing your mallet at the goblin. Roundtime: 10.")
Commands can be seen on the URL below:
http://www.play.net/playdotnet/play/stormfront_scripting.asp |
|
|
|
MattLofton GURU
Joined: 23 Dec 2000 Posts: 4834 Location: USA
|
Posted: Sat Apr 19, 2008 4:53 pm |
Quote: |
* Wait for the prompt to continue
|
Prompt trigger, plus a command buffer
Quote: |
* Wait for certain feedback from the mud
|
#trigger
Quote: |
* Wait for a roundtime (this is a kind of combi command that first waits for feedback on the command and then waits the amount of time that the feedback states. It will say something like: "You swing your mallet at the goblin. Roundtime: 10.")
|
#trigger (pattern type), plus #condition (wait type). |
|
_________________ EDIT: I didn't like my old signature |
|
|
|
kjaerhus Magician
Joined: 18 Dec 2006 Posts: 317 Location: Denmark
|
Posted: Sat Apr 19, 2008 4:57 pm |
It's not that easy, Matt. I've posted about this several times and it always ends up being a rather complex solution. Yours is too - if you don't believe me try and make just a small script using this technique. It gets ugly. A built-in solution would be nice.
|
|
|
|
Fang Xianfu GURU
Joined: 26 Jan 2004 Posts: 5155 Location: United Kingdom
|
Posted: Sat Apr 19, 2008 8:13 pm |
You can already do things the way Matt's suggested, or with the various #wait commands. What do you mean by "built-in"? What do you think could be done to make it easier?
|
|
|
|
kjaerhus Magician
Joined: 18 Dec 2006 Posts: 317 Location: Denmark
|
Posted: Sat Apr 19, 2008 8:39 pm |
Fang Xianfu wrote: |
You can already do things the way Matt's suggested, or with the various #wait commands. What do you mean by "built-in"? What do you think could be done to make it easier? |
Today I have to make my own blocking command and it's not that easy in CMUD. Well, I have a sort of working solution, but I have lots of trouble with it. If they were built-in it would make my life so much easier. I have asked for solutions to my problem before but it always ends up with people suggesting a fifo or something which I think is a solution for a problem I don't have. I just need a blocking command. As it seems impossible for people to make a decent one of those I suggest that Zugg build it in. There must be other Dragonrealms/Gemstone players than me that would find this useful. And probably other people too. |
|
|
|
saet Apprentice
Joined: 12 Jun 2006 Posts: 106
|
Posted: Sun Apr 20, 2008 3:59 am |
CMUD will never have the support you want for simutronics games. Everything can be done with it, but it's more work. I <3 zMUD and wish I didn't have to use something else for my combat scripts, but it's too much of a pain.
Quote: |
There must be other Dragonrealms/Gemstone players than me that would find this useful. |
Like three, maybe four. The basics that are needed for simutronics muds were never put in and I doubt they ever will be after all this time. It's not worth it for Zugg to add this stuff.
Quote: |
And probably other people too. |
Not really. Have you played other muds? |
|
|
|
Fang Xianfu GURU
Joined: 26 Jan 2004 Posts: 5155 Location: United Kingdom
|
Posted: Sun Apr 20, 2008 12:14 pm |
kjaehus: You still haven't actually made any suggestions. What exactly would you want the blocking command you're talking about do? What would you like its syntax be? How would it let you solve the problem you're having?
saet wrote: |
CMUD will never have the support you want for simutronics games... The basics that are needed for simutronics muds were never put in and I doubt they ever will be after all this time. It's not worth it for Zugg to add this stuff. |
Possibly, but I haven't seen any threads suggesting additional support for these things. It's possible that some of the things you think CMUD needs to better support simutronics will be useful in other areas, and they might get added. So be specific about what those basics are (preferably in a new thread), and you might get lucky :) |
|
|
|
kjaerhus Magician
Joined: 18 Dec 2006 Posts: 317 Location: Denmark
|
Posted: Sun Apr 20, 2008 7:50 pm |
Fang Xianfu wrote: |
kjaehus: You still haven't actually made any suggestions. What exactly would you want the blocking command you're talking about do? What would you like its syntax be? How would it let you solve the problem you're having? |
The problem today:
A simple example: I want to write a script that does two things sequentially - first A then B. I don't want to do B before A is completed. To determine whether A is completed is a task of itself - I have three categories: 1) the prompt is received, 2) a certain text is received and 3) a round time caused by doing A is over. Now, the writer of the script knows which case to expect so basically he just needs three different commands (or one that can be parameterized to either category).
Today as I see it I have to write my own command that sets up triggers to react to output from the mud, then send the command and go into some sort of wait loop to prevent the execution of B before triggers indicating that A is complete fires. This can be implemented but it tends to make your scripts more complicated and thereby prone to errors. I have had a lot of problems with this so it's not pure speculation.
A possible solution:
Add three commands to handle the different situations or perhaps one parameterized who can do all three situations. Examples of these commands could be as follows:
Syntax: #promptCommand command
Usage example: #promptCommand "get sword from my harness"
Behavior: Will send command to mud and pause script execution until prompt is received.
Syntax: #feedbackCommand command feedback
Usage example: #feedbackCommand "get sword from my harness" "you get a sword|you don't have a sword in your harness"
Behavior: Will send command to mud and pause script execution until feedback matching the given pattern is received from the mud.
Syntax: #roundtimeCommand command
Usage example: #roundtimeCommand "get sword from my harness"
Behavior: Will send command to mud and wait for a prompt. If no round time is received from the mud script will continue like if a promptCommand was used. Otherwise the script will pause for the amount of seconds specified by the round time. This command is probably very Simutronics specific. |
|
|
|
Vijilante SubAdmin
Joined: 18 Nov 2001 Posts: 5182
|
Posted: Sun Apr 20, 2008 9:31 pm |
Code: |
#CLASS Blocking
#VAR prompt ""
#ALIAS promptCommand {#SEND {%-1};#WAITFOR {@prompt}}
#ALIAS feedbackCommand {#SEND {%1};#WAITFOR {%2}}
#ALIAS roundtimeCommand {feedbackCommand {%-1} {%concat("{Roundtime: %d|",@prompt,"}")};$rt=0;#IF (%regex(%line,"Roundtime: (\d+),$rt) {#WAIT $rt}}
#CLASS 0 |
That should do it for your request. You simply need to fill in the prompt variable with a pattern that matches your prompt.
The usage is:
promptCommand get sword from my harness
feedbackCommand "get sword from my harness" "you get a sword|you don't have a sword in your harness"
feedbackCommand {get sword from my harness} {you get a sword|you don't have a sword in your harness}
roundtimeCommand get sword from my harness |
|
_________________ The only good questions are the ones we have never answered before.
Search the Forums |
|
|
|
Fang Xianfu GURU
Joined: 26 Jan 2004 Posts: 5155 Location: United Kingdom
|
Posted: Sun Apr 20, 2008 9:45 pm |
EDIT: Ninja'd by Viji - trust me to spend ages looking things up to make sure I'm not missing something :( This post is addressed to kjaerhus.
Thankyou very much, by the way, for taking my post in the spirit it was intended. I agonised for a while about changing the tone somehow, because I thought it sounded a bit accusatory - thanks for not interpreting it that way and coming back with good suggestions.
So, here're my thoughts on each of your proposals.
1) CMUD needs to understand when something's a prompt. It can't just assume that every line not ending in CRLF is a prompt, because sometimes the MUD will provide lines that're prompts, but that aren't the prompt (like in-game text editors). So the way you would do this is, as I said before, with one of the wait commands - in this case, #waitsignal. Use #signal within your prompt trigger, and have any scripts you want to wait until then use #waitsignal to wait for it. Job jobbed.
2) There's already a command that does exactly this. #waitfor.
3) I'm not quite sure what you're wanting here. It seems like #waitsignal with a timeout would perhaps do what you want, but I'm not sure what you mean. Reading the beginning of your post where you detail your issue, it sounds like a simple #wait might also be what you want.
The trouble with all these commands, of course, is that they use threads. The reason we suggested a FIFO is because it avoids threading issues, but threads are the only way to pause script execution like you want. If you're waiting and not using threads, what happens if the trigger fires again in the meantime?
With a FIFO, you have a couple of options - you can either have your script pretend the command was added to the queue when the previous command is sent, and start waiting then, or your can start waiting immediately and run both commands when their wait conditions are satisfied. You can do either of these with threads as well, it's just harder to do the first well and you have the added annoyance of dealing with threads. And if you wanted execution to pause without using threads, we'd be back to the days of not really knowing when it was going to execute and what was going on, which can't be a good thing. |
|
|
|
Vijilante SubAdmin
Joined: 18 Nov 2001 Posts: 5182
|
Posted: Sun Apr 20, 2008 9:55 pm |
And Fang provided to real explanation why no one was too keen on writing up a script like I just provided. It also is not robust enough to handle more things as your needs grow, and that is part of why it should be avoided.
As you can see meeting your minimum requirements is very easy. CMud has the commands to do it already. I could even simplify that roundtimeCommand more, but I will leave that as an exercise for you. |
|
_________________ The only good questions are the ones we have never answered before.
Search the Forums |
|
|
|
kjaerhus Magician
Joined: 18 Dec 2006 Posts: 317 Location: Denmark
|
Posted: Sun Apr 20, 2008 10:02 pm |
Thanks for your nice and compact solution, Vijilante. I am sure this works and I have something I've made myself that works most of the time too. I based my own solution on short waits though so I can cancel the wait if I find that the pattern I wait for will never match anything. To my knowledge you cannot stop the #waitfor unless you set a timeout which in some cases would have to be pretty long to take things as lag for instance into consideration.
I do have problems like sometimes a roundtime is ignored or an exception for something internal is thrown and I do find this disheartening. That's why I suggest built in commands so the complexity is out of my hands as a user. It's functionality that you can find in many other scripting engines I believe (Simutronics' own Wizard and Stormfront, Genie3, YASSE, Warlock2), so I think it's not a completely unreasonable request.
EDIT: This was a reply to Vijilante's first response. You guys are quick... |
|
|
|
Vijilante SubAdmin
Joined: 18 Nov 2001 Posts: 5182
|
Posted: Sun Apr 20, 2008 10:19 pm |
Quote: |
I based my own solution on short waits though so I can cancel the wait if I find that the pattern I wait for will never match anything. |
Ahhh. Immediately the problem of robustness appears in the simple solution. They are yet more failings that such a simple solution will demonstrate. In many ways having the control to use a more complex solution is better because it allows us to chose what should be done under every circumstance, instead having Zugg make a set of general rules.
Quote: |
To my knowledge you cannot stop the #waitfor unless you set a timeout which in some cases would have to be pretty long to take things as lag for instance into consideration. |
They can be cancelled with #STOP thread number, but you would first have to check #THREAD to find out which ones they are. |
|
_________________ The only good questions are the ones we have never answered before.
Search the Forums |
|
|
|
kjaerhus Magician
Joined: 18 Dec 2006 Posts: 317 Location: Denmark
|
Posted: Sun Apr 20, 2008 10:44 pm |
Thanks to you both (Fang and Vijilante) for your quick answers. I'll summarize a little here on the situation from my view.
I've always been very happy about zMUD but after the change to CMUD I have used more time with the scripting engine than playing - a lot more in fact. A lot of this is caused by changes to CMUD (like #wait) and probably quite a few bugs in CMUD too. A lot of bugs have been in my scripts too I am sure but I think it's not easy to see what is wrong when CMUD suddenly explodes so I've often felt quite lost when this happened. It still does - a lot. I've tried many solutions but it's like I've always hit my head against something new.
I think if I had something to say I'd make an effort to make CMUD clean and robust instead of adding complexity. Complexity belongs under the hood in my opinion. Why add multithreading features to CMUD and then discourage the use of it? Wouldn't it be better to handle the complexity of multithreading in the engine and simplify the scripting instead? Of course this would demand more work from a CMUD development point as adding such functionality would demand more than merely exposing underlying features to the user. As a standard user when would you ever want to care about threads? If I need to wait I need to wait. I don't want to know that a new thread is created so that my triggers will still run - I expect them to and I expect my window with all the buttons and so on to be responsive. Couldn't this expected behavior be used to actually implement multithreading without bugging the poor users who I think in most cases are mostly interested in playing a mud and then enhancing the experience with some nice scripts which really can't be written fast and easily enough so that the main focus is on playing.
Another thing is why does CMUD have to explode all the time? I feel like when I do something wrong it doesn't catch the exception in the engine and try to give me an explanation of what went wrong with the script. I just get a hard exception and I have no idea what went wrong really. It might happen in a script that have run nicely for ten minutes. Suddenly BANG!!! - something went wrong. Many times this causes CMUD to be unstable and a restart is needed. Maybe I am asking for too much I don't know, but I feel something could and should be done to improve this.
EDIT: Well, I might have forgotten the point that connects this post with the topic. My point is that the more powerful commands CMUD offers out of the box the less complexity I have in my scripts therefore my scripts would be simpler and cleaner. |
|
|
|
Fang Xianfu GURU
Joined: 26 Jan 2004 Posts: 5155 Location: United Kingdom
|
Posted: Sun Apr 20, 2008 11:53 pm |
CMUD doesn't discourage the use of threads - in many places, they're very useful. We, the gurus, tend to discourage the use of threads, mostly because the kind of person who has to ask questions about threads is the kind of person who's going to make a total arsecake out of it and then ask for help. We're volunteers and it's a lot of hassle. Nobody likes debugging threading code, let alone someone else's threading code.
Your major point, one about complexity in the scripting language, is a very knotty problem and one I don't really feel qualified to talk about. I think it hinges on the idea of providing as much power as possible to the user, to make them able to do as many things as possible. That's most likely the reason that threads are exposed to the user, and it's also presumably the reason why so many other things are. And I can't see that being a bad thing - the more functions the user can manipulate, the better their scripts will be. Some MUDs are completely different to others, so one solution won't suit everyone. You need to be able to make your own.
But of course that's all assumption and speculation, mostly based on what I remember of discussions around the time that threads were added. You could try looking up some of those old topics and read the discussions there, but I suspect the only concrete answers will come from Zugg himself. |
|
|
|
kjaerhus Magician
Joined: 18 Dec 2006 Posts: 317 Location: Denmark
|
Posted: Mon Apr 21, 2008 12:16 am |
Fang Xianfu wrote: |
Thankyou very much, by the way, for taking my post in the spirit it was intended. I agonised for a while about changing the tone somehow, because I thought it sounded a bit accusatory - thanks for not interpreting it that way and coming back with good suggestions. |
I think it's me who have to thank you for being patient with me. I feel like I'm getting nowhere with CMUD and it really affects my mood. I thought I had something with version 1.34 but then came 2.x and since then my scripts have been in ruins... |
|
|
|
kjaerhus Magician
Joined: 18 Dec 2006 Posts: 317 Location: Denmark
|
Posted: Mon Apr 21, 2008 12:51 am |
Fang Xianfu wrote: |
Your major point, one about complexity in the scripting language, is a very knotty problem and one I don't really feel qualified to talk about. I think it hinges on the idea of providing as much power as possible to the user, to make them able to do as many things as possible. That's most likely the reason that threads are exposed to the user, and it's also presumably the reason why so many other things are. And I can't see that being a bad thing - the more functions the user can manipulate, the better their scripts will be. |
I think one "bad thing" is that you are quickly forced into actually using the multithreaded features. Both in my own solution and in your suggestions those commands are used and I do think they are hard to get around if you want to pause the execution of a script as we have to do in order to make a blocking command. I think CMUD has a lot of powerful features and for that it should be praised but adding features such as these "you-are-on-your-own-if-you-use-us" multithreaded commands adds too much to complexity of usage. What I think you should really try to achieve is powerful features wrapped in a simple and intuitive way. |
|
|
|
Vijilante SubAdmin
Joined: 18 Nov 2001 Posts: 5182
|
Posted: Mon Apr 21, 2008 1:46 am |
There actually has been major focus first by Zugg and followed through by all the beta testers to try and make sure threading doesn't get in the way of users that are oblivious to it.
Lets use my simple script from above as an example. It doesn't say anything about threading and it will work very easily to start. I think a new user would readily find the required commands in the help. Of course all the wonderfully helpful people around here would point out some of the other fancy commands and flourishes that are in my example, and the new user could go on there merry way.
They generally wouldn't notice that threads are laying around as they perfect the feedback text, and they really wouldn't have to. The only way they would ever find a problem is if they decided to try the #THREAD command, or they used a single load of that session with the failing script for a long enough time. You already know that the problem is too many threads laying about.
-----
Let's move to the next thing that a new user would want to do, a trigger. Again working with my above script a new user creates a simple trigger
Code: |
#TRIGGER {^Joe tickles you mercilessly.$} {roundtimeCommand stab joe} |
Do you see the problem yet?
The first problem I see is when this text is received
Quote: |
Joe tickles you mercilessly.
prompt |
The blocking is immediately broken, because the block doesn't take into account that a prompt is still due to arrive. A single simple command also would have no way of knowing this. We again coach the new user with a few solutions. The likely best one for working with that same script would be to add a state to the trigger that matches the prompt and put the command there.
-----
Continuing with the 'best' solution to the first problem our user now finds another problem. The addition of a second trigger trying to do a command.
Code: |
#TRIGGER {^Joe stuffs you in a pipe and smokes you.$} {}
#COND {prompt} {roundtimeCommand laugh Joe} |
Once again it is a matter of timing. That sneaky Joe guy does his emotes in small bursts and the received text is now
Quote: |
Joe tickles you mercilessly.
Joe stuffs you in a pipe and smokes you.
prompt |
Now we get both commands sent at the same time. Not quite what was wanted here.
If I understand Simtronics muds right then a roundtime command is cancelled when a new command is issued. The thought of having a command eaten is unacceptable. This is why a more powerful queue is suggested by anyone that has experience such a failure in scripting. In my latest example Joe gets away with tickling, only causing the user to laugh; a proper queue would make sure the evil Joe gets stabbed. |
|
_________________ The only good questions are the ones we have never answered before.
Search the Forums |
|
|
|
kjaerhus Magician
Joined: 18 Dec 2006 Posts: 317 Location: Denmark
|
Posted: Mon Apr 21, 2008 9:26 am |
Vijilante wrote: |
There actually has been major focus first by Zugg and followed through by all the beta testers to try and make sure threading doesn't get in the way of users that are oblivious to it. |
Question I think is to debate is whether multithreading should have "surfaced" at all.
Vijilante wrote: |
If I understand Simtronics muds right then a roundtime command is cancelled when a new command is issued. |
Actually what happens is that most commands sent to the mud during the roundtime is ignored and a message like "Please wait 3 seconds..." is sent back to the client. You can't even quit the game while you are in roundtime.
Vijilante wrote: |
The thought of having a command eaten is unacceptable. This is why a more powerful queue is suggested by anyone that has experience such a failure in scripting. |
Your examples clearly show that there are many pitfalls in CMUD today which is exactly my point. Implementing these methods myself is not a simple solution and if they came out-of-the-box a lot of these tricky details could be hidden from the user making his or her scripts less complex. You suggest that people implement their scripts using a queue - is it a far-fetched thought that the methods I suggest make use of a queue internally thus eliminating the problem with not getting to kill that wicked Joe fellow? |
|
|
|
Tech GURU
Joined: 18 Oct 2000 Posts: 2733 Location: Atlanta, USA
|
Posted: Mon Apr 21, 2008 7:40 pm |
I may be completely off base, because I don't play the Simutronics MUDs but the whole concept of roundTime is fairly intuitive in understanding but complex in implementation. I would argue that attempting to script it, in any form would require a fair amount of coding effort. I imagine 'hiding the details' for the type of implementation you describe would either 1) limit the functionality and efficacy provided by multiple threads or 2) create a two tiered threading system that would be very error and bug prone.
With that said, I don't think it's unreasonable to expect someone who want to code the roundTime to tackle the compexity that also comes with coding in a multi-threaded environment.
My $0.02 |
|
_________________ Asati di tempari! |
|
|
|
kjaerhus Magician
Joined: 18 Dec 2006 Posts: 317 Location: Denmark
|
Posted: Mon Apr 21, 2008 9:28 pm |
Tech wrote: |
I may be completely off base, because I don't play the Simutronics MUDs but the whole concept of roundTime is fairly intuitive in understanding but complex in implementation. I would argue that attempting to script it, in any form would require a fair amount of coding effort. I imagine 'hiding the details' for the type of implementation you describe would either 1) limit the functionality and efficacy provided by multiple threads or 2) create a two tiered threading system that would be very error and bug prone. |
Well, I never said it was easy to make a solid script that does the job. That's why I suggest that it's implemented in CMUD so that all users don't have to all solve the problem or find a way around it. I admit that the roundtime thing is very Simutronics specific, but the other two I believe can be used by everyone. Zugg have implemented Simutronics specific features already so perhaps he would like to add some more - it would be appreciated. The clients I mentioned earlier all have this functionality today.
Tech wrote: |
With that said, I don't think it's unreasonable to expect someone who want to code the roundTime to tackle the compexity that also comes with coding in a multi-threaded environment. |
CMUD is a mud client with rich scripting functionality. When did it turn into a programming environment? I think introducing multithreading in scripts was a questionable decision and my point is that introducing possibilities on behalf of simplicity is a thing that should be done with caution. There is a good phrase a developer should always have in his thoughts: "Keep it simple stupid" (KISS). What this means is of course that you shouldn't introduce a lot of garbage you don't need. Instead focus on what's needed. |
|
|
|
MattLofton GURU
Joined: 23 Dec 2000 Posts: 4834 Location: USA
|
Posted: Tue Apr 22, 2008 12:45 am |
Quote: |
I admit that the roundtime thing is very Simutronics specific
|
It's certainly a rarer thing to do it the way Simutronics does, but this is definitely not at all Simutronics-specific. It's not the only game company using a parseable client-communication protocol to send hidden information you don't see on-screen.
Simutronics -- GSL, and XML for Stormfront
Mythic Entertainment (when they had a text game) -- 64-digit hex string, with specific chunks of it representing specific things (one of them being the RT)
Ironrealms -- ATCP or whatever it's called
various MXP-enabled MUDs -- MXP
Beyond that, everything else can be easily handled by simple and not-so-simple triggers. This can be done globally (ie, a command queue) or it can be done specifically for an individual task or situation (alarms, wait-state triggers, message-cascading triggers, etc) |
|
_________________ EDIT: I didn't like my old signature |
|
|
|
Zugg MASTER
Joined: 25 Sep 2000 Posts: 23379 Location: Colorado, USA
|
Posted: Wed Apr 23, 2008 8:12 pm |
Quote: |
I think introducing multithreading in scripts was a questionable decision |
Just don't use it then! Seriously, #WAIT was horribly broken in zMUD. See the article here: http://www.zuggsoft.com/page.php?file=zmud/timers.htm
In the opinion of most CMUD users who participated in the beta testing of CMUD 2.x, the previous problems with #WAIT in zMUD were far worse the the complexity from threads. In CMUD 2.x, threads are mostly hidden. They are used when needed, and not used when not needed. For most users who are doing simple things, commands like #WAIT and #WAITFOR are great features.
The problem is that what you are doing is *not* simple, as Fang, Vijilante, and others have pointed out.
zMUD has *always* been a "programming environment". CMUD adds additional programming features because that is what users are requesting. Most all of the features added to CMUD are requested by players. zMUD/CMUD does things in a more general way so it can work on any MUD. MUD-specific clients such as StormFront or Wizard can be a bit simpler because they only need to support their specific game.
I do not add MUD-specific features to CMUD. CMUD supports certain standard *protocols*, such as GSL (for Simutronics), ATCP (for IRE games), MXP, etc. CMUD supports those at a low level, but does not attempt to decode higher-level MUD data. For example, CMUD doesn't care what GSL is used for. It doesn't care what data is sent in an ATCP packet from an IRE game. That's because supporting changes to this would be a nightmare for me. I could spent a *lot* of effort trying to implement a roundtime system for Simutronics, and then they could just change it in the game and totally screw up CMUD.
The only reason zMUD/CMUD has some other specific Simutronic features (such as Hp gauges, etc), is because I had a contract with Simutronics at one time where they would advertise zMUD in exchange for better Simutronics support in zMUD. But that contract expired, and there was a change of personnel at Simutronics. The current people in charge don't seem to be as interested in zMUD/CMUD support, and I have plenty of other stuff to spend my limited time on that will benefit more users.
Also, there isn't anything stopping someone from coming up with a some scripts to support Simutronics better and then posting them to the shared Package Library. That's what the Library is for. True, it isn't as easy to find stuff as it could be and that will continue to improve. But the idea is that I don't need to build everything into CMUD...players can create their own MUD-specific "mods" (packages) and then share them. That's a far better solution than to continue bloating CMUD with MUD-specific features. |
|
|
|
kjaerhus Magician
Joined: 18 Dec 2006 Posts: 317 Location: Denmark
|
Posted: Wed Apr 23, 2008 9:45 pm |
Zugg wrote: |
Just don't use it then! |
Problem is that you cannot really make a blocking command without some sort of wait mechanism. You COULD in my opinion have made this functionality available without introducing multithreading issues to the user. These things could have been dealt with in the "engine room".
Zugg wrote: |
The problem is that what you are doing is *not* simple, as Fang, Vijilante, and others have pointed out. |
In CMUD it is not simple - in the mentioned clients it's the simplest thing. That's why I suggest it be implemented in your client too.
Zugg wrote: |
zMUD has *always* been a "programming environment". CMUD adds additional programming features because that is what users are requesting. Most all of the features added to CMUD are requested by players. |
Perhaps the people suggestion these changes does not represent your average users - or what COULD have been your average users if you focused more on making CMUD attractive for non-experts instead of constantly adding complexity. You have by far the most advanced client of those I have seen but it's also much more difficult than the alternatives. I don't know anyone in Dragonrealms who uses CMUD and I really cannot endorse your otherwise fine product simply because it lacks simple solutions for something like this. Many Simutronics players pay a higher monthly subscription fee than a CMUD lifetime license costs so they would probably be glad to buy your product if you supported their muds a little better. Again, the ordinary blocking command that waits for either a pattern or a prompt could be used by anyone. If you implemented these it would still be a great improvement.
In the end CMUD - call it a programming environment or not - is made for playing muds. As the maker of CMUD you do your customers the biggest favor by allowing them to use most of their available time playing their favorite mud instead of hacking around with scripts. I realize that some people enjoy this - especially those who often frequent this forum - but you should be careful not to focus only on the wishes of a select elite.
Zugg wrote: |
zMUD/CMUD does things in a more general way so it can work on any MUD. MUD-specific clients such as StormFront or Wizard can be a bit simpler because they only need to support their specific game.
I do not add MUD-specific features to CMUD. |
I agree with you that making mud-specific features should be done after careful consideration and these should probably be isolated in the documentation so that they will not confuse users of other muds. That said I think it up to individual consideration whether to do it (depends on if there is a business case or not really).
Zugg wrote: |
That's a far better solution than to continue bloating CMUD with MUD-specific features. |
No offense but I think you've done a nice job of bloating CMUD already. I kinda hoped that CMUD would be a fresh start considering you wrote it from scratch but I think it's pretty much a monster already and because of the rapid development there have been plenty of bugs too. If you ever start all over again I'd suggest you made a much cleaner interface and focused more on usability and robustness than adding as many features as possible. Please consider this more of a friendly suggestion than harsh criticism - I don't dislike CMUD I just hoped for something slightly different... |
|
|
|
Zugg MASTER
Joined: 25 Sep 2000 Posts: 23379 Location: Colorado, USA
|
Posted: Wed Apr 23, 2008 10:37 pm |
Quote: |
These things could have been dealt with in the "engine room". |
They are! It's called Threads. Threads is the correct way to handle Waits. Do you want #WAIT to cause your entire Windows system to pause? No. You obviously want your other processing to continue...you want your mouse to continue to work etc. The only way to make that happen is with threads or nested message loops. What is happening is that the other clients are just hiding the threads in the background. Or, they are implementing it using timers and message loops like zMUD did, and in that case you can end up spawning dozens of message loops, causing the same problems that zMUD had with it's #WAIT command. My guess is that you just can't do really complex stuff in those other clients that would illustrate those problems. But the #WAIT issue in zMUD using the message loop solution was one of the biggest complaints that I got in email.
The *proper* way to handle any sort of WAIT is with a thread. Most of the time threads work fine with no additional complexity. If the Gurus hadn't told you anything about "threads", then you might not have ever needed to worry about it. But any scripting system that allows threads also opens up possibilities of complexity with data sharing. CMUD is nice because it gives you ways to deal with data sharing, using #SECTION, etc. If the other clients are using threads and are not giving you access to critical sections, then it's just restricting the type of complex scripts you can write. Sure, that makes them "simpler". It also means that you can't do a lot of things that you can with CMUD.
Quote: |
In CMUD it is not simple - in the mentioned clients it's the simplest thing. |
Since I don't play any Simutronics games, perhaps you can give me a link to a specific page that describes exactly what these "simplest thing" features are in the other clients.
Quote: |
I don't know anyone in Dragonrealms who uses CMUD |
That's actually plain wrong. There are several DR players in this very forum. Don't go making assumptions just because you are personally having trouble with this.
Quote: |
I kinda hoped that CMUD would be a fresh start |
Yeah, and would you want me to send you all of the emails from people complaining that it wasn't zMUD compatible then? Seriously, CMUD wouldn't have a chance in hell of being used if it wasn't zMUD compatible, and zMUD is itself a very complex program. It already has a "cleaner interface" in my opinion, and in the opinion of many users.
But I'm going to stop now because I'm just getting pissed and that wasn't the point of this thread. The others in this thread have already given solutions to the original problem. |
|
|
|
|
|