Don’t forget we moved!
https://brandmu.day/
What is a MUSH?
-
I think with Ares, I’d compare the engine to hardcode and the plugins to softcode. But even then, I’ve never found much use for personal commands with Ares or Evennia.
If you want to do your own alias for a command and you can’t convince an admin to add it for you, you can use your client. If you want to charge what commands you run on login, there is already a command for that. Outfits and multi descers are also already there.
-
@Faraday Fair enough, I might have been reading this incorrectly or inferring, but I was under the assumption that the ‘code in descs’ conversation was about multidescing on Evennia, and he was trying to figure out a way to build it. Not too sure what other code would need to be added to address a pc description, I suppose.
-
@Tributary said in What is a MUSH?:
I think with Ares, I’d compare the engine to hardcode and the plugins to softcode.
You can make a very loose analogy, but plugins are lacking nearly all of the core traits that usually define “softcode”:
- The LISP-based MUSH Code scripting language itself
- The ability to create commands / systems live from the MU client command line
- The ability to for players to create their own personal code
- The distinction between “WHO” as the hardcoded command and “+who” as the softcoded version that exists in parallel
Same with Evennia’s Python code.
-
Unsurprisingly, I agree with @Faraday concerning softcode
At least concerning Evennia, the
FuncParser
is indeed the closest we have moved to something similar to softcode, but it’s intentionally stopping at being a way to create advanced formatting solutions rather than offering the pieces needed to be turing-complete. As I also write in the documentation to it, one could in principle make some sort of LISP-like language usingFuncParser
(lots of parentheses, all functional programming), but it’s not something I plan to add to core Evennia at least.As for a multidescer - yes Evennia has an optional multidescer contrib. I created one once people from another MUSH-heavy forum told me that this was one of the more common things MUSHers use softcode for. You can read about the Evennia implementation here: https://www.evennia.com/docs/latest/Contribs/Contrib-Multidescer.html
-
Sorry for double-post, catching up on some stuff in the thread.
As it stands, the multidescer contrib mentioned above will probably be easier for use as a multidescer (see link above). To be honest, it was created before the
FuncParser
(what is called ‘code in descs’ above) existed so it’s quite likely one could implement a multuidescer using theFuncParser
too, haven’t tried.The
FuncParser
is overall considerably more than just ‘code in descs’ though. It is a full, safe parser, for dynamically modifying strings based on situation or who sees them. You embed strings like$foo(arg, arg)
and the return of these (Python functions you implement under the hood) will replace that position in the string. Descriptions are just one use case; another one is to implement ‘actor-stance emoting’, so that you can have your game systems send strings like"$You() $conj(smile) to $you(otherperson)"
and everyone will see their appropriate strings (You vs your name etc). It’s used for prototypes and other places too. -
@Griatch Thanks so much for the information on the multidescer and clarification on
FuncParser
! I’ve largely not looked at the contribs folder/documentation, so I’m going to dig into that a bit. -
@Griatch said in What is a MUSH?:
Descriptions are just one use case; another one is to implement ‘actor-stance emoting’, so that you can have your game systems send strings like “$You() $conj(smile) to $you(otherperson)” and everyone will see their appropriate strings (You vs your name etc). It’s used for prototypes and other places too.
I’m actually curious what use cases you’ve found for descriptions. I contemplated adding some substitutions like that to Ares and came up blank as to when anyone would ever need them. All I ended up doing was some simple center/right/left formatting.
I realize Evennia spans more of a gauntlet of game types, so maybe it’s more common in the RPI/MUD end of things.
Game systems (on the back-end) sending customized text in Ares is just done with locale strings - there are no special codes. But it doesn’t come up as much, since most system messages are OOC not IC.
desired output:
Faraday has changed her stance to cover.
locale string:
"%{name} has changed %{poss} stance to %{stance}."
code:
t('fs3combat.stance_changed', :name => name, :poss => combatant.poss_pronoun, :stance => self.stance)
-
@Faraday said in What is a MUSH?:
I’m actually curious what use cases you’ve found for descriptions.
The only thing that comes to mind is some sort of reality layering when a character has some kind of stat or attribute that lets them see additional/different information.
Like how in oWoD there’d be regular descs and Changeling Descs that only other Changelings (and those who could see Dreaming Shit) would get.
-
Sure. It probably comes down to game styles, yes. For example a multi-descer is completely unheard of in most other genres of MU*. In other styles, dynamic descriptions is a big deal.
Here are some examples. The Evennia
FuncParser
inlines actually support nested calls (so they will be executed from the inside out like a regular python call), but for brevity, assume we have made some custom functions for one’s particular game and is using the rpsystem contrib:$You() have pock-marked skin and is in his $approxage(10). He wears $clothes(). He looks $health(). $ifguild(thieves, He has the secret thief's guild mark on his hand.) $ifskill_gt(detectmagic, 10, He has a faint aura of magic around him.)
Here, someone who’s can’t detect magic, doesn’t know me and is not in the thieve’s guild will see
The tall man has pock-marked skin and is in his thirties. He wears a black hoodie. He looks a bit sick.
Wheras if you are know me (has recognized me previously), is in the thieve’s guild and has enough in the detectmagic skill, you will see
Griatch has pock-marked skin and is in his thirties. He wears a black hoodie of the type that has a lot of hidden pockets. He looks a bit sick. He has the secret thief's guild mark on his hand. He has a faint aura of magic around him.
This works because when the
FuncParser
parses the description it is fully aware of who this description is targeted at. So we can have the$clothes()
inline give some extra info (it probably checks for the looker’s thief’s guild membership inside its code), and so on.As for the stance example, here’s how it could look for Evennia:
Director stance:
msg = f"{char.key} changes $gender(poss) stance to $stance()."
Actor stance:
msg = "$You() $conj(change) $gender(poss) stance to $stance()."
(note: The
$gender()
inline is not in default Evennia since core objects don’t have genders; it’s something deemed game specific. But maybe we should add it to make this structure easier to make in actor stance).This is called in code as
room.msg_contents(msg, from_obj=char)
And would come out as
Faraday changes her stance to cover. # director stance You change your stance to cover. # actor stance, your view Faraday changes her stance to cover. # actor stance, everyone else's view.
-
@Griatch Cool, thanks for the explanation. Yeah, I haven’t really come across any need for that in the kinds of games Ares is geared towards (more freeform, less immersive), but I can see where that could come in handy in other game types. Even in Ares, you could do it with some custom code in the desc plugin to dynamically adjust descs based on dynamic criteria, it’s just not built in.