15 Nov, 2010, Ssolvarain wrote in the 1st comment:
Votes: 0
You know I really love how much support a builder can get on EoT. Diablos is really on the spot with requests and features, when he gets down to it.

It's really nice to be able to do almost anything with mprogs, and in a very clean way. The workarounds and hacks involved in doing a good many of things with the stock OLC are really ugly sometimes, and always bugged me.

Like, the use of variables. I can do sooooo many things with that. Counters everywhereeeeee!

At this point I'd really rather not build on a mud without these features. My own project aside. So it's sort of kept me loyal to the game because of the ease of building.

Out of curiosity, how much have you developed your own mprogs? (Provided your mud uses them. LP is evil!)

if people >= 2
mob remember $r
mob echoat $q The head crab centers on you, crouching low. It springs at you, scrabbling up, despite your best efforts, to sit atop your head and fastens itself tight atop your head.
mob echoaround $q A headcrab centers itself on $q, launching itself into the air and scrabbling up to sit atop $q's head.
mob voload 3307 $q wear
mob forget $q
mob goto 8

-object- (with a trigger of "tugoff headcrab")
obj echoat $n You succeed in prying loose the little sucker, and toss him back t
o the ground.
obj echoaround $n $n removes the headcrab on $s head, and tosses it to the groun
obj echo A headcrab looks sort of sad…
obj mload 3325
obj goto 8

I have functional, debeaked headcrabs. I could prolly put the zombie effect on the headcrab hat, making them… not debeaked. :3
16 Nov, 2010, Scandum wrote in the 2nd comment:
Votes: 0
$r should remain the same throughout the execution of a program, so there's no real need to remember there.

Lola mprogs look like this:

[ 1000] a hermit
>delay_prog 10~
say An adventurer once told me he had found the tomb, but that it was locked.
say The key must be in these marshes somewhere! Perhaps one of the creatures in this marsh has found it …
say Good luck $X!
>delay_prog 9~
say It is said that only by removing the corpse's skull from the tomb and intoning the ritual phrase "By my power I release thee" can it be freed.
say I wouldn't advise it though. The Manitou is a fearsome beast.
wink $X
mpdelay self 5 10 $X
>delay_prog 8~
say The Manitou is a foul beast that lives in this marsh.
say I've heard that there is an underground tomb around here somewhere.
say It was trapped inside a corpse by a mighty warlock millennia ago.
mpdelay self 5 9 $X
>speech_prog manitou~
if delayed ($i)
if quest (8,4,$n) == 1
say Eh? The Manitou? You've heard about that I see …
emote mutters to himself for a few seconds.
mpmset $n quest 8 4 2
mpdelay self 5 8 $n
>greet_prog 100~
if quest (4,4,$n) == 11
say Ah, good to see you again $n!
>delay_prog 7~
mpecho The hermit spoons out a bowl of stew and wolfs it down!
say Ahhh! That was fantastic!
hug $X
mpmset $X quest 4 4 11
say Thank you very much $X! I haven't enjoyed a meal so much in years!
say Hmm, I found these on a corpse in the marsh years ago.
say Why don't you take them as a reward.
mpoload 1045
give i1045 $X
>delay_prog 6~
mpecho The hermit gives the stew a final stir.
mpdelay self 5 7 $X
>give_prog i1032~
if quest (4,4,$n) == 9
say Fantastic! Sorrel gives rabbit stew the BEST flavour!
emote tears up the sorrel leaves and sprinkles them into the stew.
mpjunk i1032
mpmset $n quest 4 4 10
mpdelay self 5 6 $n
say What are you give me that for?
give i1032 $n
>delay_prog 5~
say There should be some sorrel growing in the marsh, I've found some before.
say It usually grows in the shallower parts of the marsh …
say Bring me some please.
smile $X
>give_prog i1031~
if quest (4,4,$n) == 7
say Aha! Now we're cookin'!
emote dumps the vegetables into the cook pot.
say All I need now are some herbs.
mpjunk i1031
mpdelay self 3 5 $n
mpmset $n quest 4 4 8
say What are you giving me that for?
give i1031 $n
>speech_prog pull~
if quest (4,4,$n) == 7
say Yes, go and PULL some vegetables out of my patch.
>speech_prog ok okay yes yep yeah~
if quest (4,4,$n) == 6
say Great!
say I'm going to make some rabbit stew. But I'll need some vegetables!
say Go and PULL some for me!
mpmset $n quest 4 4 7
>delay_prog 4~
emote heaves the cook pot onto the fire and give it a stir.
say Now that you've ridded my fields of that darn rabbit, perhaps you could help me again?
>delay_prog 3~
emote snaps the rabbit's neck and rapidly skins it.
emote quarters the rabbit and tosses the pieces into a cook pot of water.
mpdelay self 3 4 $X
>give_prog i1024~
if quest (4,4,$n) == 4
mpquiet on
open i1024
get i1025 i1024
get i1028 i1024
get i1029 i1024
mpquiet off
emote peers into the cage.
if hasobjnum ($i) == 1025
or hasobjnum ($i) == 1028
or hasobjnum ($i) == 1029
mpjunk i1025
mpjunk i1028
mpjunk i1029
mpjunk i1024
say Great! You've caught the little bugger.
say I haven't had rabbit for years!
mpmset $n quest 4 4 6
mpdelay self 3 3 $n
say There's no rabbit in here …
grumble $n
give i1024 $n
say What are you giving me that for?
give i1024 $n
>time_prog 4~
mpat 1026 mppurge m1009
mpquiet on
mpat 1026 get i1029 i1026
mpjunk i1029
>time_prog 20~
mpat 1026 mpmload 1009
>speech_prog ok okay yes yep yeah~
if quest (4,4,$n) == 3
say Great!
say You'll need a cage!
mpoload 1024
give i1024 $n
say Remember, the rabbit only seems to appear at night!
mpmset $n quest 4 4 4
if time () >= 20
or time () <= 3
mpat 1026 mpmload 1009
>delay_prog 2~
say It looks like a rabbit has somehow made its way onto my island.
say Will you catch it for me? It'll help me out, and rabbit is … well …
emote licks his lips.
>delay_prog 1~
say Hmm, I wonder if you are able to help me.
say I'm having a little trouble with pests eating my veggies.
say But it always happens at night, and I'm a deep sleeper.
mpdelay self 3 2 $X
>speech_prog ~
if delayed ($i)
if quest (4,4,$n) == 1
say Good to meet you, $1.
mpmset $n quest 4 4 3
mpdelay self 3 1 $n
>greet_prog 100~
if quest (4,4,$n) == 0
say Ahh, greetings stranger. It's not often I meet newcomers around here.
say And what might your name be?
mpmset $n quest 4 4 1
>repop_prog 100~
mpmset self dam 1d2+0
>fight_prog 100~
cast 'cause serious'
if rand (70)
cast 'magic missile'
if rand (18)
cast 'faerie fire'
if rand (9)
cast 'weaken'
>give_prog rabbit~
mpecho The rabbit twists and turns before leaping out of $I's hand!
mpecho The rabbit falls down to the ground where it quickly hops away and disappears into the undergrowth.
say I thought I clearly instructed you to put the rabbit into the cage..
spank $n
mpjunk all.rabbit
16 Nov, 2010, quixadhal wrote in the 3rd comment:
Votes: 0
Ssolvarain said:
Out of curiosity, how much have you developed your own mprogs? (Provided your mud uses them. LP is evil!)

LP, evil? I think not! It's just misunderstood.
You guys should try it, we have cookies (and no annoying char *'s).

However, in my DikuMUD, I don't use mprogs because mine predates such things. I have spec_procs wherever I need custom behaviors.
16 Nov, 2010, Scandum wrote in the 4th comment:
Votes: 0
LPC has the same fundamental flaws as fun specs. On typical LPC games every builder creates game logic from scratch, and you'll end up with a mess that lacks consistency and re-usability.

Lola for example gives mobs the option and tools to create mazes, track a path to a room or player, inflict custom damage, create a pseudo-random seed, rescale a mob's strength, manipulate doors, and create custom items. It's still a short list, but it's slow progress when there are no other games to steal ideas from.

Writing scripts from scratch in low level languages is a waste of time and effort as far as I'm concerned. WoW has some interesting quest concepts, though I found WoW's quest system a little too generic. So in my opinion it's all about creating powerful tools for quest building. Standardization and categorization of quest rewards is also something worth looking into. One way Lola aids in this is by automagically determining the real worth of items, and forcing builders to keep things within limits, in addition this saved me a lot of time as well as I didn't have to deal with too much sanity checking.
16 Nov, 2010, quixadhal wrote in the 5th comment:
Votes: 0
Scandum said:
LPC has the same fundamental flaws as fun specs. On typical LPC games every builder creates game logic from scratch, and you'll end up with a mess that lacks consistency and re-usability.

This actually says more than I suspect you intended. It's a difference in paradigms. If you consider allowing a builder to create anything they want a flaw, it means you don't work as a team. While it's true I could code a ray gun in the hobbit village, one presumes you have somebody approving content before it goes live and is accessible to the player base, no? If not, you have a problem with how you run things, not a problem with the tools or environment.
16 Nov, 2010, Scandum wrote in the 6th comment:
Votes: 0
What I mean is that a builder could spend 300 lines of script coding a simple raygun, or customize a nicely coded gun prototype, that would benefit from future enhancements. The first situation will sooner or later result in an inconsistent mess (not necessarily thematically), the second situation will have centralized documented re-usable code.

Of course a builder doesn't have much of an option if the programmer doesn't provide any tools, as difference in vision and motivation tends to be the main cause of builders doing whatever.
16 Nov, 2010, Ssolvarain wrote in the 7th comment:
Votes: 0
How would it result in an inconsistent mess?
16 Nov, 2010, Scandum wrote in the 8th comment:
Votes: 0
Imagine an LPC mud with no door support, so each builder codes their own lockable doors. As the code isn't centralized it's impossible to create a lock picking skill, door bashing ability, and each door would likely have its own quirks, making for an ambiguous user interface.
16 Nov, 2010, Ssolvarain wrote in the 9th comment:
Votes: 0
And if every "standard" feature is already hardcoded? The above example sounds like the result of someone's stupidity, not an issue with mprogs.
17 Nov, 2010, quixadhal wrote in the 10th comment:
Votes: 0
Exactly. Most LP mudlibs do have support for the most common features built-in, but if you think of something new you want to do, you can just do it without having to hunt down the (typically) one guy with access to the C source and beg him to do it.

mprogs are a nice step up from just plugging values into the template, but they're very clumsy when trying to do anything complex, and any events or objects not already coded into the mprog engine simply can't be touched.

In Scandum's door example, true… if everyone had to code their own doors, you'd end up with a nightmare of weird constructs that all had different verbs to open, lock, close, etc. But…. in practice that doesn't happen. Usually, someone who's building/coding (same thing in LPC) asks his teammates (the other builders/coders on the game, remember them?) if there are doors coded. If there aren't any, he can go write his own. If other people start wanting to use doors, one of the admins can check over the door code and if it's deemed stable and solid, move it into a public area as an inheritable (IE: /lib/door.c). At that point, anyone who wants to have a door can just "inherit /lib/door".

Now, things that make this interesting. If you coded your door nicely enough, without making assumptions about the enviornment around it, there's nothing stopping you from having an NPC that inherits door. So, your giant treant may well inherit exits, doors, and rooms, and thus have a door in its chest. You could then open the giant druid and work your way towards its heart chamber, killing it by stealth rather than brute force. All this, while the NPC is (slowly) wandering around and attacking things. Try that with mprogs.
17 Nov, 2010, Tyche wrote in the 11th comment:
Votes: 0
quixadhal said:
mprogs are a nice step up from just plugging values into the template, but they're very clumsy when trying to do anything complex…

yeah…like adding 1 + 1
17 Nov, 2010, Ssolvarain wrote in the 12th comment:
Votes: 0
quixadhal said:
Try that with mprogs.

I can make a treant mob that doubles as a door, yarr. Or a mobile building with a door atop. And then just put a death-triggered prog on the "heart" to transfer then to a now-dying treant inside, or wherever. I could potentially also make this block exits, if the corpse was large enough to merit it. I could make a set of legs in different rooms that will squish you if you don't read that echo as it "moves" about on some preset path.

This would probably require heavy use of the alias trigger we have. I can make whatever commands I choose, and I'm pretty sure they take priority over actual commands.

The only thing I think that might throw me off is a lack of a functioning timer. I could probably use the delay command or mob delay, though.