« June 2005 | Main | August 2005 »

Miscellaneous

July 29, 2005

Sensibilities

If I'm watching television, it's a safe bet it's either science, surgery, natural history or crime.

So, I sit here, flipping idly and chance on Dr 90210, during surgery.

Where they have a middle to older aged lady having some work done. She's been opened up below the belly button for a tummy tuck. Very opened. I can see the stomach muscles, exposed for the world to see. They lift up the skin between there and the breasts with a giant spatula. I can now see the flayed skin lift away, and she is essentially skinned from groin to armpits as they insert the silicone boobs. They even, thoughtfully, provide an arthroscope for a better interior view.

And they fuzz out the nipples. This is something I never quite understood. I have nipples. Barring some horrible trauma, I bet you do too. I do not find them inherently offensive. I'm certainly not going to find them arousing at this point.

Why the fuzz?

Nipples are evil and they must be scoured from viewing? I just don't get it.

Any enlightenment is welcomed.

Or is it just that Australia got the criminals and the US got the puritans?


And later, in the selfsame show, they do a 'lollypop' boob reduction. Unsurprisingly, it's not sucking on them until they reduce - it's where they cut around the nipple, removing it from the flesh, leaving it attached by some nerves, then cut out a large triangular wedge of flesh below the breast, cut a new hole further up for the nipple, poke it through and stitch it in there and join the edges where the triangle was. A smaller, perkier breast, with the nipple in a new but apparently more aesthetically pleasing location. And they fuzz out that one too, even though it's the central focus of this surgery.

I must be missing something.

Scrawled illegibly by Meathe at 09:34 PM

Code

Java Client Testing.

Testing a java telnet client for the weenend blogathon. Fingers crossed, it should be good... Maybe

Well, no colour. But otherwise it works. Trying another client.












Scrawled illegibly by Meathe at 12:58 PM

Code

July 28, 2005

The Months

This is the first stab at the new month names and hours of daylight.

(The following is a mock-up)


_________________________________________
/ /\
| ************************************** | |
| 11 OClock AM |_/
| The Month of Kali |
| The 28th, the Day of the Moon |
| ************************************** |
| System Time: Thu Jul 28 14:12:28 2005 |_
| ToD Compiled: Jul 26 15:11:44 2005 | \
| ToD Started: Wed Jul 27 23:47:35 2005 | |
\________________________________________\/

Numerical Season Month of Dawn Dusk Hours of Daylight
1 WINTER Kali 9 5 8
2 WINTER the Grand Struggle 8 6 10
3 SPRING Meathe 7 7 12
4 SPRING Navarre 7 7 12
5 SPRING Ackmon 6 8 14
6 SUMMER Morakai 6 8 14
7 SUMMER Dulthail 5 9 16
8 SUMMER the Heat 6 8 14
9 AUTUMN Ahriman 6 8 14
10 AUTUMN Oaklore 7 7 12
11 AUTUMN Coyote 7 7 12
12 WINTER Darkstar 8 6 10
13 WINTER Long Shadows 9 6 9

So, during the first month of the year, dawn would be at 9am, Dusk at 5pm, giving 8 hours of daylight.

Scrawled illegibly by Meathe at 02:16 PM

Quizzes!

Probably even true.


My computer geek score is greater than 99% of all people in the world! How do you compare? Click here to find out!

Scrawled illegibly by Meathe at 12:12 PM

The Whiskey Tango Foxtrot Files

Notting Hill Gate Station

This one popped up at the station. I suspect it's a passenger with a sense of humour and whiteboard marker, as the staff would be flayed alive for that second last line.

NottingHillGateStation.jpg

Scrawled illegibly by Meathe at 09:48 AM

Observations on the news

July 27, 2005

What could be done?

ANGERS, France (AP) -- A French court on Wednesday sentenced key figures in a mass pedophilia trial to up to 28 years in jail.

In the harrowing case, prosecutors said 45 children between the ages of 6 months and 14 years were raped and abused by their parents, grandparents or acquaintances in a working-class neighborhood of Angers from 1999 to 2002 -- at times in exchange for small amounts of money, food, alcohol or cigarettes.

Franck V. was accused of allowing much of the abuse to occur at his apartment in the western city of Angers. In total, 65 people have been charged with molesting, raping and prostituting infants and children.

CNN

Sometimes, the only productive things people can become is fertilzer.

Scrawled illegibly by Meathe at 10:37 PM

Observations on the news

Ernie on the trains

Alert level is holding at Ernie for Mass Transit.
Terror Alert Level

July 26, 2005 — Five Egyptian men with maps of the New York City subway system and video of New York landmarks have been arrested by the Joint Terrorism Task Force in Newark, N.J., ABC News has learned.

FBI and law enforcement officials told ABC News the five men — four illegal immigrants and one law enforcement fugitive — were arrested Sunday night following a tip to the Newark Police Department. In addition to the subway maps and video, the men had train schedules and $8,000 in $20 and $50 bills.

The men were identified as: Karim Ahmed Abdel Latif Ahmed, 21; his brother Mahoud Ahmed Abdel Latif Ahmed, 19; Ahmed Mohamed Atta, 30; Mohamed Ibrahim Gaber, 34, and Mohamed Palat Anwar Jozain.

ABC News

They all claimed to be unemployed civil or chemical engineers (at 19 and 21?)

The posession of maps and videos of tourist landmarks doesn't bother me so much, as anyone touristing in NYC tends to have those.

That they're all here as illegal aliens - one a fugative - all are chemical and civil engineers, have subway maps, video of prime targets, schedules, an unexplained sum of cash in 50s and 20s and an inability to give a reasonable explanation why they're in the US bothers me somewhat. I may just be paranoid.

They're being deported. I wonder if the destination is Egypt or a 'friendly' country where they can be asked questions?

Scrawled illegibly by Meathe at 10:01 AM

Quizzes!

July 26, 2005

Dragons

Found by the WebKittyn.

I am a A Sun Dragon!

Hey, I took the http://dragonhame.com online Inner Dragon quiz and found out I am a Sun Dragon on the inside.

In the war between good and evil, Sun Dragons take the side of the noble and good....
When it comes to the powers of Chaos vs. those of Law and Order, your inner dragon walks a fine line between Law and Chaos....
As far as magical tendancies, Your inner dragon has the ability to conquer the world of magic, but it will not be easy....
During combat situations, whether by spells or by claw, your inner dragon will do whatever it takes to get the job done....
From a distance, the Sun Dragon appears as though it is made of pure flames. In truth, it is not made of flame at all but it does maintain a constant should of flames around it's body. This allows for both very effective armor and a stunning appearance.'
During its adolescent stages, a Sun Dragon's body begins to excrete an oily substance through it's skin which burns slowly over time, like napalm. When it reaches this age, the Dragon is ignited by it's elders. Sun Dragons are totally immune to fire.'
After it is ignited, the Sun Dragon's flames will continue to blaze for the whole of the dragon's natural life span. Sun Dragons are extremely fierce in combat. The Sun Dragon is among the noblest breed of dragonkind. They are revered both for their ferocity in combat and their great wisdom.
'
This Dragons favorite elements are: Tiger's Eye and Nobility of Spirit

http://Dragonhame.Com

So why aren't I enjoying all this heat?

Scrawled illegibly by Meathe at 04:38 PM

Quizzes!

July 25, 2005

No surprises there

You Belong in Australia


Ace!

Sunny, upbeat, and cute

You make the perfect surf bum

Now stop hogging the vegemite!

What English Speaking Country Do You Belong In?


Your Dominant Intelligence is Logical-Mathematical Intelligence
You are great at finding patterns and relationships between things. Always curious about how things work, you love to set up experiments. You need for the world to make sense - and are good at making sense of it. You have a head for numbers and math ... and you can solve almost any logic puzzle.

You would make a great scientist, engineer, computer programmer, researcher, accountant, or mathematician.

What Kind of Intelligence Do You Have?

Scrawled illegibly by Meathe at 02:55 PM

mprogs

July 22, 2005

MPROG Tutorial

I get into the meanest, nastiest frame of mind I can manage, and I write the nastiest (testing) code I can think of. Then I turn around and embed that in even nastier constructions that are nearly obscene.

Donald Knuth

The tutorials on MPROGs are more or less complete. Code testing resulting from this has squished a good many obfuscated bugs.

It is important to remember that mobs, objects and rooms see the world from slightly different perspectives, so the $ codes may vary in their output slightly when run by different entities. Please test your programs with the object/room/mob that will be running it.


1. An introduction to *progs: The basics

2. Creating a simple mprog
3. Triggers: Setting the prog loose on the world
4. Mob commands
5. Control logic waltz - IF then ELSE then ENDIF


An important note on the order of prog execution

Mprogs are always fired in this order:
Room
Mob
Object

So if you have a speech trigger on all three, the room will react first, then the mob, then the object.

I have added some validation code so that if an item/mob is purged/removed from play whilst it's running (by itself or another prog), it's code will no longer be executed, avoiding unfortunate crashes and hangups.

Scrawled illegibly by Meathe at 04:08 PM

Code

Prog debuggery

It's been a hectic few days. In testing the new code for item and room progs, I find I need to completely disect the interpretter again and learn how to write mprogs. The tutorials in mprogs, (listed in reverse order, which is somewhat unfortunate), were as much me needing to discover how they worked to test the code. In doing so, Oaklore's (and Coyote's) mprog guide was indespensible, and was enthusiatically pillaged to create these tutorials. I wanted to be sure all the examples were correct, and in some cases (using wearing instead of wears) led to the discovery of new and unusual bugs that would lock up the interpretter. And here I was thinking all those were fixed.

There are also some additional features of the interpretter of which I was not aware. While they're not essential, they may prove handy. These will comprise the next tutorial, though all the bugs in the current sample code will be eliminated first (while you can write mprog code in a blog, it's hard to test it there).

Other oddities: "IF class" was not coded at all. "IF has" and "IF uses" were very buggy, sometimes working, sometimes firing if the character had an item of any type. Determining the monetary worth of a character was bugged beyond recognition.

The testing phase of all of this is proving vast in scope, as many progs need to be specifically written for objects and rooms in order to test the functionality. The current count of mprogs I've written in the last two days is well into the mid hundreds, fully a third of these as examples in the IF-THEN-ELSE tutorial. Due to the inherent number of permutations, I am sure I will miss something. However, tests thus far have been encouraging.

Back to the code pool for me.

Kali, you were absolutely right. This is a big, big project. I suspect weather and corrosion might even prove simpler, but I'll surely need the month you thought this would occupy.

Scrawled illegibly by Meathe at 09:37 AM

mprogs

July 20, 2005

Control logic waltz - IF then ELSE then ENDIF

Logic, like whiskey, loses its beneficial effect when taken in too large quantities.

Lord Dunsany

The mprog interpretter is a fussy little beast, and if the code isn't precisely how it expects it, your mprog will not run how you expect it to.

IF statements often throw people, as the syntax is not entirely consistant. Every IF needs to be partnered up with its ENDIF, or the mud will complain. If you do use an ELSE, ensure it's between the IF and the ENDIF and not outside. You do need to keep track of how many you've used, in particular when you nest IF statements (stack one inside another).

The basic flow logic of the if command is (though this is not the syntax):
IF (the condition) is true
then do this code
ELSE
do this code
ENDIF

Rot being rot, things are not quite so simple, and in this case the (condition) varies quite a bit depending on what you wish to test.

Before introducing all of the options and things you can do these truth tests on, to begin with, lets take some very simple cases. We want our greeting goblin from before to only greet people under level 15, so we need a way to compare the character's level to a certain value. Happily, IF level compares the level of a character to a number. Operators determine what kind of comparison will be performed (equal to, less than, etc).

Here is the complete list of operators, with a few examples.


OpMeaningCode exampleExplanation
== is equal to, matches IF level $n == 15 (If the character is level 15)
!= Not Equal toIF level $n != 101 (If the character is not hero level)
> Greater thanIF level $n > 101 (If the character is a higher level than 101)
< Less thanIF level $n < 102 (If the character is below level 102)
>= Greater than or equal toIF level $n >= 102 (If the character is level 102 or greater)
<= Less than or equal toIF level $n <= 101 (If the character is level 101 or below)

So we can finally add some smarts to the greeting goblin, and he can now determine for himself who he wants to talk to, with the code looking like this:


IF level $n <= 15
say Hello, little man thing.
ENDIF

If, however, you want it to laugh at everyone over level 15 as well, you need the else statement. The else statement is still part of the IF, it needs to be nestled between the IF and ENDIF


IF level $n <= 15
say Hello there, newbie.
ELSE
snicker $n
ENDIF

This also means the goblin will laugh at immortals, which does not bode well for its survival.

To extend the program above further, to laugh at everyone over level 15 but not immortals, you have to nest one if statements inside the other. This can be hard to follow, as an aid, the if statements are colour coded. You will see that the first endif closed the most recent if statement.


IF level $n <= 15
say Hello there, newbie.
ELSE
IF level $n >= 102
say Deus ex machina!
ELSE
snicker $n
ENDIF

say Perhaps you should reroll if you want me to talk to you?
ENDIF

There are three other ways to control the execution of mprogs, and they are BREAK, OR and AND. BREAK very simply stops the current mprog running in its tracks. It bails out. This can be useful if you just want a program to exclude certain people.


IF level $n <= 15
BREAK
ENDIF
....

The code above will bail out if the target is under level 16, or continue if they are 16 or over.

OR and AND are used in very similar ways and are extended parts of the IF statement. Their syntax is the same as an IF statement, and they must immediately follows the line with the IF.


IF (condition 1)
AND (condition 2)
[some code]
ENDIF

Both conditions must be true for the code to run.

If you wanted to test if an object had a vnum between 100 and 200 (from the Feline village), you'd have to nest two if statements like this:


IF vnum $o >= 100
IF vnum $o < 200
SAY Yes, it's from the Feline Village, all right.
ENDIF
ENDIF

Which works perfectly well, but looks a little messy. Using the AND statement, you can eliminate one of the IF/ENDIF pairs.

IF vnum $o >= 100
AND vnum $o < 200
SAY Yes, it's from the Feline Village, all right.
ENDIF

The OR statement is very much the same, though more useful. At least one condition must be true for the code to execute. Without an OR statement, the code can be repetitive, and quickly becomes nightmarish if you want to add an ELSE.

IF objtype $o wand
SAY Yessir, staves and wands, that's what I buy.
ELSE
IF objtype $o staff
SAY Yessir, staves and wands, that's what I buy.
ELSE
SAY Nosir, I don't buy those.
ENDIF
ENDIF

However, with the OR statement, it's quite simple to add an ELSE statement.

IF objtype $o wand
OR objtype $o staff
SAY Yessir, staves and wands, that's what I buy.
ELSE
SAY Nosir, I don't buy those.
ENDIF

The table below contains all the conditions that can be tested, with a short definition and example for each one.

IF … Argument Definition/Code
Rand 0 to 99 [example] Percentage chance of being true.

[definition]
IF rand 50
SAY Heads!
ELSE
SAY Tails!
ENDIF

Objhere <name/vnum> [example] Is the object (by vnum or name) in the room? Note: The object needs to be on the floor. It will not detect objects that are carried or in pits/containers. If you use a name and not a vnum, use one word only , do not use ' marks

[definition]
IF objhere 21298
SAY That is one powerful weapon there!
GET ultimate
WEAR ultimate
CACKLE
ENDIF

Mobexists <name> [example] Does a mob or PC with this name exist anywhere? Note: One word only , do not use ' marks'

[definition]
IF mobexists whitewhale
SAY So ye seek the white whale. This be luck, lad. Call me Ishmael.
ELSE
SAY Corsets and soap, lad. Corsets and soap.
ENDIF

Mobhere <name/vnum> [example] Is the mob (by vnum or name) or PC (by name) in the room. Note: If you use a name and not a vnum, use one word only , do not use ' marks

[definition]
IF mobhere whitewhale
SAY Thar she blows!
ELSE
SAY Back to the crows nest, lad.
ENDIF

Objexists <name> [example] Does the object with this name exist anywhere? Note: One word only , do not use ' marks'

[definition]
IF objexists 21298
SAY Yes, there is an ultimate weapon. Somewhere.
ENDIF

People Op. <num> [example] Compares the number to the count of visible NPCs/PCs in the room (always excludes the mob running the prog)

[definition]
IF people == 4
SAY Four people, for I never count myself.
ENDIF

Players Op. <num> [example] Compares the number to the count of visible PCs in the room

[definition]
IF players > 1
SAY You know what they say, two's company.
ENDIF

Mobs Op. <num> [example] Compares the number to the count of visible NPCs in the room (always excludes the mob running the prog)

[definition]
IF mobs == 4
SAY We could form a quintet!
ENDIF

Clones Op. <num> [example] Compares the number to the count of visible NPCs with the same vnum as the mob running the program (always excludes the mob running the prog)

[definition]
IF clones == 2
SAY We are now three.
ENDIF

Order Op. [example]

Researching

[definition]

Hour Op. <num> [example] Compares the number to the current hour (0=midnight to 23=11pm)

[definition]
IF hour == 0
SAY It's midnight and all's well that ends well. Go to bed already you slackers.
ENDIF
IF hour == 1
SAY It's 1 A.M. on the streets of Kjeldoran and the rats are out, grab yer slingshots and stones.
ENDIF
IF hour == 2
SAY It's 2 A.M. and the thieves are culling the unwary, step lively, do not tary.
ENDIF
IF hour == 23
SAY It's 11 P.M. and the cats are serenading each other from the fences, throw a shoe.
ENDIF

Ispc $_ [example] Is $_ a player?

[definition]
IF ispc $n
SAY You're not like the other mobs.
ENDIF

Isnpc $_ [example] Is $_ a mob?

[definition]
IF isnpc $n
SAY You're just like all the other mobs.
ENDIF

Isgood $_ [example] Is $_ good? (alignment 350 or over)

[definition]
IF isgood $n
SAY It is not enough to have a good mind; the main thing is to use it well.
ENDIF

Isevil $_ [example] Is $_ evil? (alignment -350 or less)

[definition]
IF isevil $n
SAY Work is a necessary evil to be avoided.
ENDIF

Isneutral $_ [example] Is $_ neutral? (alignment between 350 and -350)

[definition]
IF isneutral $n
SAY In truth, the world is neither with us or against us; it is but raw material in our hands, and can be heaven or hell according to what we are.
ENDIF

Isimmort $_ [example] Is $_ an immortal? (Level 102 or above)

[definition]
IF isimmort $n
SAY Before me things create were none, save things
SAY Eternal, and eternal I shall endure.
ENDIF

Ischarm $_ [example] Is $_ charmed?

[definition]
IF ischarm $n
SAY All charming people have something to conceal.
ENDIF

Isfollow $_ [example] Is $_ following anyone?

[definition]
IF isfollow $n
SAY All Now far ahead the Road has gone. And you must follow.
ENDIF

Isactive $_ [example] Is $_ in a position other than sleeping (awake, sitting, resting, standing, stunned)

[definition]
IF isactive $n
SAY You can trouble me for a warm glass of shut-the-hell-up. Now, you will go to sleep or I will put you to sleep. Check out the name tag. You're in my world now.
MOB FORCE $n sleep
ENDIF

Isdelay $_ [example] Does $_ have a delayed mprog pending? (see MOB DELAY and addmprog)

[definition]
IF isdelay $i
SAY You know, I don't think I'll do that anymore.
MOB CANCEL
ENDIF

Isvisible $_ [example] Is $_ visible to the mob?

[definition]
IF isvisible $n
SAY I can see you!
ELSE
SAY Damnit, I know you're here somewhere.
ENDIF

Hastarget $_ [example] Does $_ remember someone? (used with MOB REMEMBER)

[definition]
IF hastarget $i
SAY Yes, I remember $q.
ENDIF

Istarget $_ $_ [example] Is $_ the mob's target? (IF istarget $n would reveal if the mob remembers the one who triggers the mprog)

[definition]
IF istarget $n
SAY $Q! Of course I remember you.
ELSE
SAY Yes, of course. We met…
COUGH
ENDIF

Exists $_ [example]

Not working

This command is redundant, as there is IF objexists and IF mobexists.

[definition]

Affected $_ <spell> [example] Is $_ affected by the spell specified?

[definition]
IF affected $n bless
SAY You are truly blest.
ENDIF

Imm $_ <imm> [example] Is $_ immune to <imm>? (Only one immunity may be checked at a time)

[definition]
IF imm $n fire
SAY I hate you hot weather people.
ELSE
SAY Flame on!
MOB CAST flamestrike $n
ENDIF

Act $_ <flag> [example] Does $_ have the act flag specified? Act flags can be seen in medit with ? Act

[definition]
IF act $n aggressive
SAY Fiesty little one, aren't we.
ENDIF

Off $_ <flag> [example] Does $_ have the offensive flag specified? Off flags can be seen in medit with ? off

[definition]
IF off $n area_attack
SAY I bet you could flatten the whole room.
ENDIF

Carries $_ <name/vnum> [example] Is $_ carrying the object referred to by name or vnum?

[definition]
IF carries $n 59
SAY My pocket watch! The time! I must go. Tea party.
ENDIF

Wears $_ <name/vnum> [example] Is $_ wearing the object referred to by name or vnum?

[definition]
IF wears $n ultimate
SAY Mind you keep the sharp end of that away from me.
ENDIF

Has $_ <type> [example] Does $_ have an item of that type?

[definition]
IF has $n drinkcontainer
SAY Ye wouldn't have any rum in that there bottle for an old sea dog, would ye?
ENDIF

Uses $_ <type> [example] Is $_ wearing an item of that type? (armor/sword/etc) Note: IF wears is for specific items (by vnum/name)

[definition]
IF uses $n armor
SAY I see you have some armour already. But none so fine as my wares!
ENDIF

Name $_ <name> [example] Do $_ and the name match? Note: The name must be typed in - you cannot use a second $_ value.

[definition]
IF name $n Meathe
SAY Trust not my reading nor my observations,
SAY Which with experimental seal doth warrant
PONDER
SAY Much ado about nothing, I think.
ENDIF

Pos $_ <pos> [example] Is $_ in the position of <pos>? (standing, sleeping, resting, etc)

[definition]
IF hastarget $i
MOB FORGET $q
ENDIF
MOB REMEMBER $r
IF pos $q sleeping
SAY Ah, the children of the night. What beautiful music they make.
MOB ECHOAROUND $q $i plunges $l fangs into the bare neck of $q.
MOB ECHOAT $q You feel a sudden warmness, followed quickly by a chill you cannot explain.
MOB DAMAGE $q 1000 3000 lethal
ENDIF

Clan $_ <clan> [example] Is $_ in this clan?

[definition]
IF clan $n tabernacle
SAY Welcome to the narthex, friend.
ELSE
MOB ZECHO $I's screams echo through the halls. '{rAlarums! Divers alarums!{x'
MOB KILL $n
ENDIF

Race $_ <race> [example] Is $_ of this race?

[definition]
IF race $n seal
SAY Now you just slipped that one in. There isn't a seal race.
ELSE
SAY I knew there wasn't a race of seals.
ENDIF

Class $_ <class> [example] Is $_ of this class?

[definition]
IF class $n demon
SAY Exorcizo te, omnis spiritus immunde, in nomine Dei
MOB TRANSFER $n 1
ENDIF

Objtype $_ <type> [example] Is $_ an object of the type?

[definition]
IF objtype $o staff
SAY Yes, it is here...This means six kadams high.
SAY And take back one kadam to honor the Hebrew God whose Ark this is.
MOB FORCE $n say You said their headpiece only had markings on one side. Are you absolutely sure?
NOD
MOB FORCE $n SAY They're digging in the wrong place!
MOB FORCE $n laugh
ENDIF

Ismaster $_ [example] Is $_ the master/owner of the mob/object running the prog?

[definition]
IF ismaster $n
SAY What is thy bidding, my master?
ENDIF

Ispk $_ [example] Is $_ PK?

[definition]
IF ispk $n
SAY Welcome to the lounge, $n.
ELSE
SAY Killers and freaks only.
MOB BLOCK $n
ENDIF

Isnpk $_ [example] Is $_ NPK?

[definition]
IF isnpk $n
SAY Killers and freaks only.
MOB BLOCK $n
ELSE
SAY Welcome to the lounge, $n.
ENDIF

Age $_ Op. <age> [example] Is $_ (older/younger/equal) to the age specified?

[definition]
IF age $n < 100
SAY This is the Legends bar. You may not enter.
MOB BLOCK $n
ENDIF

Vnum $_ Op. <vnum> [example] Is $_ (higher/lower/this) vnum?

[definition]
IF vnum $o >= 100
IF vnum $o < 200
SAY Yes, it's from the Feline Village, all right.
ENDIF
ENDIF

[Using the AND logic]

IF vnum $o >= 100
AND vnum $o < 200
SAY Yes, it's from the Feline Village, all right.
ENDIF

Hpcnt $_ Op. <%> [example] Are $_'s HP at more than %?

[definition]
IF hpcnt $n <= 10
SAY You have fought well, Knight.
MOB FLEE
ENDIF

Room $_ Op. <vnum> [example] Is $_ in a room with a vnum (equal/less/greater) than <vnum>?

[definition]
IF room $n <= 100
SAY You are in the realms of limbo. No life. No death.
ENDIF

Sex $_ Op. <sex> [example] Is $_ (equal/less/more) than sex? (0=neuter, 1=male, 2=female, -1=?)

[definition]
IF sex $n < 2
SAY I knew you were lesser.
ENDIF

Level $_ Op. <level> [example] Is $_ (equal/higher/lower) than level?

[definition]
IF level $n < 101
SAY Heros only.
MOB BLOCK $n
ENDIF

Align $_ Op. <align> [example] Is $_ (more/less/equal) to this alignment?

[definition]
IF align $n > 900
SAY You've been very, very good.
ELSE
IF isgood $N
SAY You've been good this year.
ELSE
SAY Coal in your stocking, $n
ENDIF
ENDIF

Money $_ Op. <amount> [example] Does $_ have (more/less/this) platinum amount? Amount calculated to be: platinum + (gold/100) + (silver /100000)

[definition]
IF money $n <= 10
SAY You sad assed bastard.
ENDIF

Objval0 $_ Op. <num> [example] Is the item $_'s value0 (greater/equal/less than)this amount?

[definition]
IF objtype $o wand
AND objval0 $o < 101
SAY Yes, it's a wand, but it's hardly hero material, is it?
ENDIF

Objval1 $_ Op. <num> [example] Is the item $_'s value1 (greater/equal/less than)this amount?

[definition]
IF objtype $o wand
AND objval1 $o < 5
SAY Yes, it's a wand, but There's no life left in it. I'm afraid it's valueless.
ENDIF

Objval2 $_ Op. <num> [example] Is the item $_'s value2 (greater/equal/less than)this amount?

[definition]
IF objtype $o container
AND objval2 $o == 0
SAY It's a nice $O, but it's harldly secure. There's no lock.
ENDIF

Objval3 $_ Op. <num> [example] Is the item $_'s value3 (greater/equal/less than)this amount?

[definition]
IF objtype $o portal
AND objval3 $o == 22598
SAY Surely, that will take you straight to failure.
ENDIF

Objval4 $_ Op. <num> [example] Is the item $_'s value4 (greater/equal/less than)this amount?

[definition]
IF objtype $o container
AND objval4 $o <= 50
SAY Must make things seem half their weight.
ENDIF

Grpsize $_ Op. <num> [example] Is $n's group (greater/less than/equal to) num?

[definition]
IF grpsize $n < 5
SAY You're going to need a bigger boat
mob block $n
ENDIF

Scrawled illegibly by Meathe at 04:33 PM

mprogs

Mob commands

Mob commands allow the programs to run commands that regular characters do not have access to. Many of these are similar to immortal commands, like transfer, zecho, oload (load obj) and purge, and some are unique to the mobs. The commands are entered into the code in the same way that normal commands like 'say Hello!', however, they are always prefixed with 'mob '.

The following table was stolen from the ToD Mob guide. A note about the syntax - $_ means any of the 'dollar sign codes' listed in Creating a simple mprog.

Command Definition
Mob Asound <string> This creates an echo to the rooms directly around the room the prog is triggered in
Mob Gecho <string> Displays the string to all players logged in (as the immortal command gecho)
Mob Zecho <string> Displays the string to all players in the same area the prog was triggered in (as the immortal command zecho)
Mob Echo <string> Displays the string to all players in the room the prog was triggered in (as the immortal command echo)
Mob echoat $_ <string> Displays the string to the target player only (as the immortal command pecho)
Mob Echoaround $_ <string> Displays the string to all others in the room the prog was triggered in except $_
Mob Kill $_ The mob will attack $_ (not effective for objects or rooms)
Mob Assist $_ The mob will attack any who attack $_ (not effective for objects or rooms)
Mob Junk <name/all> The item(s) in the mobs inventory are destroyed (not effective for objects or rooms)
Mob Mload <vnum> The prog loads the mob with the vnum stated (as the immortal command load mob <vnum>)
Mob Oload <Vnum> <R/W> The prog loads the object with the vnum stated, (as the immortal command load mob <vnum>). Using r will load the object to the room, w loads it to the mobs wear location. Objects and Rooms should always load object with 'R', or the object will be destroyed.
Mob Purge <name> The prog purges the object or mob with the ‘Name’ if left blank the mob will purge the entire room.
Mob Goto <Name/Vnum/$_> The mob will go to the location by name, room vnum or target $_.
Mob At <Name/Vnum/$_> <command> The command will be carried out at the desired location.
Mob Transfer $_ <name/vnum> The prog will transfer $_ to the name or vnum
Mob Gtransfer $_ <name/vnum> The prog will transfer $_ and its group to the name or Vnum
Mob Otransfer <name/vnum> <Name/Vnum/$_> The prog transfers the object (by name or vnum) to the location name, vnum or $_
Mob Force $_ <command> Forces $_ to do the listed command
Mob Gforce $_ <command> Force all in $_’s group to do the listed command
Mob Vforce <vnum><command> Forces all mobs with the ‘Vnum’ to do the listed command
Mob Cast <spell> $_ The prog casts the spell listed on $_
Mob Damage $_ [min] [max] <lethal> The prog damages $_ in the rangegiven (mob damage $n 20 200: This would damage $n between 20 and 200 damage). Using the "lethal" option means the damage can kill $_, otherwise it will not damage them below 1 hit point
Mob Remember $_ This will store $_’s name as for later use, the stored name can be called using the variables $q or $Q
Mob Forget <$q/$Q> The mob forgets the stored name
Mob Delay <Number> The mob begins to count down (15 pulses = 1 tick). When the counter hits 0, any mprog attached with a delay trigger will be fired. (not effective for objects or rooms)
Mob Cancel The ‘Delayed’ prog (As above) is canceled (not effective for objects or rooms)
Mob Call <vnum> The prog calls another prog, the vnum, inside the first prog. A maximum of 5 may be called from inside each other.
Mob Flee The mob will flee
Mob Remove $_ <vnum> The mob removes the item vnum from $_ and junks it (destroys)

Examples

Lets return to our crash test goblin. We want to make him a little mercenary, so that he will aid in combat anyone who gives him 400 (or more) platinum. He'll then make a little remark, send a message to the room (but not the briber) and force the bribing character to thank him. The mprog will be tied on to the goblin with a bribe trigger.


mpedit create 125
code
mob assist $n
mob remember $n
say You seem a worthy mark.
mob echoaround $n $i decides that $n is worthwhile. For now.
mob force $n thank $i
@
done
medit 120
addmprog 125 bribe 400
done
asave changed

Of course, goblins are notorious for their lack of ethics, morals and the vast willingness to kick someone when they're down...


mpedit create 126
code
say You know, you never did pay me enough.
mob echoat $q $i plunges $l little knife into your ribs.
mob damage $q 50 100 lethal
mob echoaround $q $i plunges $l little knife into $q's ribs.
@
done
medit 120
addmprog 126 attacked 10
done
asave changed

This code doesn't work as well as it should, however, as prog 126 will be triggered 1 in 10 (roughly) rounds of combat the goblin is involved in, regardless of whether the person who bribed him is there or not (or even still logged on).

There needs to be some form of test built in that can determine if the person who bribed him is there to be stabbed. Which leads to the next section... Control Statements.

Scrawled illegibly by Meathe at 03:29 PM

mprogs

Triggers: Setting the prog loose on the world

Progs can be triggered in many different ways. Triggers are chosen when you are attaching a program to a mob (or object or room). Multiple programs can be attached to a mob, and the same program may be attached with multiple triggers.

The syntax for attaching these are (depending on whether it's a mob, object or room):

addmprog <vnum> <trigger> <argument>
addoprog <vnum> <trigger> <argument>
addrprog <vnum> <trigger> <argument>

The argument depends on the trigger type. It can be a percentage (x% chance of being fired), a keyword or an amount (as for bribes).

% chance: When triggered, this is the chance of the prog being run
Direction: This is the direction the trigger is for. These directions used to be purely numeric, however, now you may use the number or word/letter equivilants, as shown here.

0northn
1easte
2souths
3westw
4upu
5downd

The table below shows what triggers are available (and whether they're available for Objects, Mobs or Rooms), what kind of argument it takes and some remarks on usage.

Available Trigger Argument Notes
OM act keyword When an action (or speech) with the keyword is performed
M attacked % chance On being damaged in combat
M bribe amount (platinum) When the mob is bribed with more than the amount
OMR cast Spell name When the spell is cast (by anyone in the room)
O R close Object: % chance
Room: Direction
Object: When the Object is closed
Room: When the exit in the direction specified is closed
M death % chance On the death of the mob
M delay % chance Triggered by the mob command, mob delay <time>, fires after the delay specified in the mprog.
OMR entry % chance Mobs: On entry to a new room
Objects: Only valid on portal objects.
Rooms: Entry from any direction
MR exall Direction Mobs: When a character leaves in that direction
Rooms: When a character leaves in that direction.
OMR exit Mobs: Direction
Object: % chance
Room: direction
Objects: Only valid on portal objects.
Mobs: When a visible character leaves in that direction
Rooms: When a character leaves in that direction.
OMR fight % chance Occurs every round of combat
O get % chance When the Object is picked up
OM give Mobs: <objname/vnum>
Objects: % chance
Mobs: On receipt of an object
Objects: On being given
OMR grall % chance On entry to a room, greets whether visible or not.
OMR greet % chance On entry to a room, only greets visible characters
For objects and rooms, this is equivilant to grall
M hpcnt % mob hit points When current hit points are below the % of original hp
OMR kill % chance Mob: When the mob makes a kill
Object: If the Object is a weapon and wielded when the character makes a kill
Room: When a kill occurs inside the room
O R lock Object: % chance
Room: Direction
Object: When the lock on an Object is locked
Room: When the lock on the direction specified is locked
O R open Object: % chance
Room: Direction
Object: When the Object is opened
Room: When the exit in the direction specified is opened
O R pick Object: % chance
Room: Direction
Object: When the lock on an Object is picked
Room: When the lock on the direction specified is picked
O put % chance On being put
M random % chance Tested 15 times per tick, percentage should be quite low.
OMR speech Keyword Whenever the keyword is spoken
M surr % chance A character surrenders in combat with the surrender command
O R unlock Object: % chance
Room: Direction
Object: When the lock on an Object is unlocked
Room: When the lock on the direction specified is unlocked
O use % chance Only works with Objects that may be used in an action: potions, food, stakes, thrown Objects, wands, etc.
O wear % chance On being worn

Some examples:

Added withWhat it does
addrprog 125 exit north Fires when someone leaves the room north
addoprog 135 exit 50 50/50 chance to fire every time someone exits (emerges) from the portal
addmprog 121 cast blessWhen a bless spell is cast in the same room as the mob
addoprog 122 give 100Every time the item is given to someone
addoprog 123 give 201 in 5 chance every time the item is given to someone
addmprog 145 bribe 300When the mob is bribed with 300 or more platinum
addmprog 121 speech whereWhen someone in the rooms says "where"
addmprog 122 exit southWhen someone leaves south

Removing Progs

Now they're attached. But mistakes happen, and changes sometimes need to be made. delmprog, delrprog and deloprog are the commands we need, however they don't use vnums, unlike the add version of the command, it uses an index number. Thankfully, it's easier to use than it sounds.

Lets return to the goblin (vnum 120, with programs 120, 121 and 122 attached).


medit 120
[enter]
Mass goblin stats, skipped
MOBPrograms for [ 120]:
Number Vnum Trigger Phrase
------ ---- ------- ------
[    0] 120   GRALL  100
[    1] 121   SPEECH where
[    2] 122   EXIT   south
delmprog 0
[enter]
Mass of goblin stats, skipped
MOBPrograms for [ 120]:
Number Vnum Trigger Phrase
------ ---- ------- ------
[    0] 121   SPEECH where
[    2] 122   EXIT   south

The GRALL trigger we added first (number 0), has been removed.

Scrawled illegibly by Meathe at 12:55 PM

mprogs

Creating a simple mprog

Here, we'll create a simple program, that reacts to a character, greeting them by name.

In the following examples, we'll use a goblin, with a vnum of 120. We know the vnums 120 onwards are free for mprog creation. Commands entered will be shown in this colour. In the mprog editor, the lines are always preceded by the angle bracket >. Do not type this in, it is the mprog edit prompt.


mpedit create 120
MobProgram Code Created.
code
-=======- Entering APPEND Mode -========-
Type .h on a new line for help
Terminate with a ~ or @ on a blank line.
-=======================================-
> say What would you be searching for, down in the depths, man thing?
> @
done

This is a very simple prog, and doesn't know anything about names. When it it triggered, it will simply say the line it has been given.

However, the program is not attached to anything, and so at this stage, will never actually run. Now it must be attached to the goblin (staples are preferred, crazy glue is ok), and the conditions that will trigger it set. There are a wide array of triggers and trigger types, however these will be covered in depth later. For now, we shall use one of the simplest, grall (greet all). Grall will trigger the mprog when anyone enters the room, visible or not to the goblin. Grall also takes a percentage to determine if it should fire every time, or more randomly.

Here we enter the mobile editor for the goblin and add the mobile prog (addmprog), also vnum 120 in this particular case, using a grall trigger, with 100% chance of triggering when anyone enters. In order to test this out, the mob is then loaded, and I leave and renter the room, triggering the program.

medit 120
addmprog 120 grall 100

Mprog Added.

done
load mob 120

Ok.
south
north

In common, a repulsive goblin says 'What would you be searching for, down in the depths, man thing?'

But we wanted this program to greet people by name. In order to do that, we need to look at the variables you can use in mprogs.

Variables

There is quite a selection of variables you can use in mprogs, and you should be able to find one that suits your purpose. The following table is large, but don't panic - you are not expected to memorise it. It's here for reference.

$i The name(s) of the mob/object/room
$I The short description of the mob/object/room
$n The name of who activated the trigger (Or Opponent)
$N The name and title of who activated the trigger
$t The name of the secondary character (Meathe points at Navarre, Meathe = $n, Navarre = $t)
$T The short description (NPC) or name and title of secondary character (PC)
$r The name or a random PC in the room
$R The short description (NPC) or name and title of the random PC
$q The name of the prog target (See MOB REMEMBER)
$Q The short description (NPC) or name and title of the prog target
$u The name of the wielder/wearer of the object (Oprog)
$U The short description (NPC) or name and title of the wielder/wearer of the object (Oprog)
$j He/She/It based on the sex of $i
$e He/She/It based on the sex of $n
$E He/She/It based on the sex of $t
$J He/She/It based on the sex of $r
$X He/She/It based on the sex of $q
$k Him/Her/It based on the sex of $i
$m Him/Her/It based on the sex of $n
$M Him/Her/It based on the sex of $t
$K Him/Her/It based on the sex of $r
$Y Him/Her/It based on the sex of $q
$l His/Hers/Its based on the sex of $i
$s His/Hers/Its based on the sex of $n
$S His/Hers/Its based on the sex of $t
$L His/Hers/Its based on the sex of $r
$Z His/Hers/Its based on the sex of $
$o The name(s) of the primary object (Meathe drops the staff, the staff = $o)
$O The short description of the primary object
$p The name of the secondary object (Meathe puts the staff in the chest, the chest = $p)
$P The short description of the secondary object.

WARNING

It is important to remember that mobs, objects and rooms see the world from slightly different perspectives, so the $ codes may vary in their output slightly when run by different entities. Please test your programs with the object/room/mob that will be running it.

An example is the following program, attached to both a room and an object with a kill trigger:

say Fataility! $n has killed $t!

The output on killing a goblin in the arena (for me) is:

ROOM:In common, the Arena says 'Fataility Meathe has killed a goblin!'
OBJECT:In common, -+-UlTiMaTe WeAPoN-+- says 'Fataility a goblin has killed someone!'

It's not an ideal situation, however, altering the logic of this would disrupt many current progs. Your milage may vary, simply remember to test.

From the table, either $n (name of person setting off the trigger) or $N (name and title) are what we'd like to use for the goblin. In this example, we'll replace the code 'man thing' with $N, add one line to make the goblin peer at the character and finally trigger the program again.


mpedit 120
code
-=======- Entering APPEND Mode -========-
Type .h on a new line for help
Terminate with a ~ or @ on a blank line.
-=======================================-
1. say And what would you be wanting in a place like this, man thing?
> .r 'man thing' '$N'
'man thing' replaced with '$N'.
> peer $n
> @
[enter]
Vnum: [120]
Code:
say And what would you be wanting in a place like this, $N?
peer $n
done
south
north

In common, a repulsive goblin says 'What would you be searching for, down in the depths, Meathe - devourer of fishes?'
A repulsive goblin peers at you.

You can see that the variables can be used in a mix and match style with standard player commands, like look, steal, emotes and the rest.

They are also used in mob commands and the control statements, so you will need to be familiar with how they work.

To enhance this program further, lines such as these could be added:

say I am but a poor, simple $I. I cannot be expected to know.
innocent $n
mutter
say $e's on to usss, my precioussss. $e knows of things. Kills $k we must.
scream $n
murder $n

Scrawled illegibly by Meathe at 11:34 AM

mprogs

An introduction to *progs: The basics

Credits: This guide is based on the Time of Darkness *prog guilde, written by Oaklore with a great deal of collaboration from Coyote. Robbie Roberts, Aaron Buhr, are the original creators of Mobprogram code, modified for ToD by Coyote and myself. All errors in this document are entirely mine. Please let me know of them so they may be corrected. This document will be revised on an ongoing basis, and any feedback or further questions are most welcomed.



2006-01-30: It seems most people are getting here from google searches. Welcome aboard. These pages refer to a prog system that is not-quite stock Rot, however should be broadly applicable. If you find errors, omissions, have a question or find it useful, please leave a comment.

Mob programs are one of the more complicated parts of on line creation. They needn't be, and this guide will be a walkthrough of some of the basics, with examples building on each other to eventually create some complex programs.

*Progs are used to control the action of a mob, object or even a room. All progs, no matter what they are attached to, use the same code and function in the same way, with some small exceptions, which will be noted where applicable. A program written for a mob will work equally well on a room, and vice versa.

Anatomy of a prog

Progs are written in a mix of english and gibberish (more on that later), though they do have a simple structure, which consists of three types of things:

  • Player commands - These are things like say, get, wear, drop. In the code, you write them as you would use them yourself. These are also restricted by level, so if the mob is level 15, don't expect it to have immortal commands.
  • Mob commands - These are additional commands that are specific to mob progs, to allow programs to do things impossible with player commands. In the prog, these are always prefixed with "mob ", even if it's a program intended for a room or object.
  • Control statements - IF/ELSE/ENDIF These control the flow of the program, based on the conditions you specify.
  • Of course, to get to writing them, it helps to know a few commands that will help you view, create, edit and otherwise display the progs.

    Mud Commands

    These commands are not part of OLC, but are very useful to

    mpstat/opstat/rpstat <name/vnum for rooms> - This command lists the vnum, name and target of the subject and any *progs attached.

    mpdump/opdump/rpdump <prog vnum> - The will display the program code, an easy way to look inside a current program without editing it. As rprogs/oprogs/mprogs are identical, any of these commands will dump any mprog, regardless of whether it's intended (or attached to) a room, mob or object.

    proglist <area> - This will list the vnums of progs in either the current area or the area specified.

    OLC Commands

    These commands are much like other OLC building commands, so should be straight forward:

    mpedit create <vnum> or mpedit <vnum> - This will create a blank mprog or edit an existing mprog.

    Once you have created (or entered editing mode), the following commands are used:

    code - This employs the OLC description editor (as used to describe rooms) to edit and manipulate code.

    When the prog is complete, you will want to attach it to the room/item/object. This is done by entering the appropriate editor (oedit, redit, medit).

    add(m/o/r)prog <prog vnum> <trigger> <phrase/percentage/direction>
    del(m/o/r)prog <prog sequence number>

    Attaching and removing progs and triggers will be covered in greater depth after we have created some progs to attach, it is listed so there will be a ready reference page later with all the commands you may wish to use.

    Scrawled illegibly by Meathe at 11:01 AM

    Code

    July 18, 2005

    Tightening the screws

    Every program starts off with bugs. Many programs end up with bugs as well. There are two corollaries to this: first, you must test all your programs straight away. And second, there's no point in losing your temper every time they don't work.

    Z80 Users Manual

    A continuation of previous messages.

    Nearing the final round of testing of new code before it is ready to go live.

    The mob program interpretter has been oiled, tightened and generally improved. Several crash bugs in it have been isolated and removed. Notably, a mob may now purge itself, or may call another mob to purge it without crashing the mud. Once a mob is purged, the remainder of it's mprog will not be executed.

    A small bug was discovered in the clan stone code. This has been fixed.

    Items and rooms will now work with mob remember/forget commands.

    Delay does not work on rooms or items.

    greet/grall/entry are functionally equivilant for rooms and items. Grall!

    The exlist command is complete, more or less as described in the previous entry, showing immortals how, where and in what direction the area links with others. Aparently, it also underwent a name change, as it was exarea originally.

    In mprogs, there is a new function available: block $_, allowing you to block characters travel. This is used in conjunction with exit triggers.

    [ 0] 160 exit 0
    mpdump 160
    if carries $n 62
    say Go in peace.
    else
    mob block $n
    endif

    All mprog triggers are implemented and working. Further detail is available on the bugtracker, however, a more exhaustive write up will be made available for immortals.

    Scrawled illegibly by Meathe at 03:17 PM

    Observations on the news

    Unnatural selection

    After decades of poaching, scientists are noticing a rise in tuskless Asian Elephants. Always a small part of the population (2-5%), the numbers have increased to 5-10%, solely due to ivory predation.

    Scrawled illegibly by Meathe at 02:56 PM

    Movable Type

    July 15, 2005

    Background images

    Someone asked if they could see all the images I have for backgrounds. So I cobbled together a php script to display them all. It scans in the files from the directory, and is self updating.

    Large page, many seals.


    Warning: main(): php_network_getaddresses: getaddrinfo failed: Name or service not known in /home/moreblog/public_html/Meathe/archives/2005/07/index.php on line 1235

    Warning: main(http://www.layil.org/images/MTBackgrounds/imagelister.php): failed to open stream: No such file or directory in /home/moreblog/public_html/Meathe/archives/2005/07/index.php on line 1235

    Warning: main(): Failed opening 'http://www.layil.org/images/MTBackgrounds/imagelister.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/moreblog/public_html/Meathe/archives/2005/07/index.php on line 1235

    Scrawled illegibly by Meathe at 01:11 PM

    Science and Technology

    Lifegem. When you want your lost loved ones to shine.

    Here you will find everything you need to know about this wonderful memorial. The LifeGem is a certified, high quality diamond created from the carbon of your loved one as a memorial to their unique and wonderful life.

    And they're not joking. They do pets, too.

    And of course, as the LifeGem is a one-of-a-kind diamond, it will be a treasured heirloom in your family for generations to come.

    "So in this ring is Aunt Mabel, she's the orange-red one, offset with Grandma, Pa, Cousin George and Uncle Fred, they're all blue. And the little yellow ones are Rex, Fluffy, Mugsy and Spot. I'm leaving this to you when I go. You might have to have it enlarged so I'll fit. Why are you running away?"

    Amazing what you can do with carbon.

    Scrawled illegibly by Meathe at 11:55 AM

    Observations on the news

    Mr Baldy. Evil. On parole.

    Reading a backlog of news from down under, I discover Mr. Baldy (Brian Kenneth Jones, nee Brendon John Megson) is out on parole.

    Who is he? He was first jailed in 1981 for abducting and sexually abusing six young children whose heads he shaved. Only days after his release in 1989, he carried out sex attacks on two boys and was jailed for a further 14 years.

    I remember the years from 78-81 quite well. It was abundantly clear to everyone that a serial predator was operating all over Melbourne. One child was abducted in a town a twenty minute drive from where I lived.

    He also kept himself occupied in jail.

    Rather than fighting his depraved urges, the man known as Mr Baldy embraced them, scheming to arrange more victims. Within three weeks of being freed, he sexually assaulted a young boy. He did eight years, but even this did not force a rethink. While behind bars, he sent a tape to the parents of two young children asking him to prepare his "lover boy". The tape revealed his fantasy of having a world where he could take stolen children and "make love to the cute ones and treat the others as slaves".

    Herald Sun (15-7-2005)
    Mark Buttler/ Paul Anderson

    But he's out on (monitored) parole now. For fear of his safety, the corrections department would not issue a photograph, nor advise people where he was placed. There is no equivilant of Megan's Law. The Herald Sun newspaper tracked him down and has published a photo of him.

    badhome.jpg So where do they decide to house him? In a Melbourne suburb, Ascot Vale. 157 Kent St. (He has since been moved to another undisclosed location).

    That's the house, and he was home when the photograph was taken.

    Within a kilometre radius there are no less than 11 sites for young children -- primary schools, kindergartens, pools and playgrounds. At the end of Kent Street and across Mount Alexander Road to the east - within 500m or a five-minute stroll - is Flemington Primary School. Next to the school is the Flemington Street Children's Centre and a swim centre, which advertises training for junior squads and lessons for preschool and school age kids.

    Not to mention the Melbourne Showgrounds - a bustling place in September when tens of thousands of children who go there for the Royal Melbourne Show - a 10-minute walk away. The Premier of Victoria has defended the decision to put him there in the first place, and further, said that he would not object to the child molester moving into his own neighborhood. Whiskey Tango Foxtrot.

    His parole ends next month. Sex crimes legislation allows the Justice department to apply to extend the monitoring period. He can fight any application.

    The tourism slogan for the state is "Victoria. The place to be."

    I'm glad I'm not there.



    Update

    Wouldn't want to infringe his liberties, either, by making him take those nasty drugs.

    Authorities conceded yesterday they had no power to force the convicted sex predator to continue taking medication to dull his sex urges. And police, whose job it was to investigate crime in the area incorporating Melbourne Showgrounds, said they'd been kept in the dark about Mr Baldy being placed in Ascot Vale after his release on parole.

    Editorial, Herald Sun (16-7-2005)

    Sod the chemical castration. How about a garlic press?

    Scrawled illegibly by Meathe at 10:08 AM

    Advances

    July 14, 2005

    Ethics, ethics, ethics.

    Cunning and simplicity may belong together in an ape. A monkey who could recognise both would be on the long road towards humanity.

    Monkey, Episode 17, "Vampire Master", BBC Release.

    More debate on the cutting edge of medical research. Whilst I was not perturbed by the zombie dogs, this one is a little... odd.

    The insertion of human stem cells into monkey brains runs a "real risk" of altering the animals' abilities in ways that might make them more like us, scientists said today.
    A panel of 22 experts -- including primatologists, stem cell researchers, lawyers and philosophers -- debated the possible consequences of the technique for more than a year.

    They don't know, can't reach a consensus and will, of course, push on, in the name of stem cell research. Progress, progress, progress.

    Stem cell research is, of course very important. But I'm not convinced you need to stick them in monkey heads.

    Scrawled illegibly by Meathe at 05:00 PM

    Quizzes!

    Distraction

    You Are a Martini

    You're not a total lush, but you do like your drinks strong For you, drinking is an art. An experience to be relished. That doesn't mean you don't get really really drunk. A few strong martini's, and you're dancing on the bar!

    Scrawled illegibly by Meathe at 04:33 PM

    Annus horribilis

    Just another day in an extended June

    This is not an email you want to receive.

    -------- Original Message --------
    Subject: I'm having a six square inch piece of my skull removed

    Of course it will be put back. But, with titanium clips. And, only after a walnut sized tumor is scraped out from between my cranium and cerebellum.

    Scrawled illegibly by Meathe at 04:23 PM

    Code

    Mud programming

    All parts should go together without forcing. You must remember that the parts you are reassembling were disassembled by you. Therefore, if you can't get them together again, there must be a reason. By all means, do not use a hammer.

    IBM Maintenence Manual, 1925

    For the last two weeks, I've been working on extending the mobile programs to also work for objects and rooms. By and large, Coyote had already completed the hard yards in Chuck, creating a brilliant system that allows them to run mobprogs without alteration by some very clever sleight of hand. Kudos!

    Some repairs have been made to non-functioning mob triggers (exit, exall). Triggers have been extended and will restrict you to putting appropriate triggers on mobs/items/rooms (you can't put a 'use' trigger on a mob, or a bribe trigger on a room).

    New commands have been added for immortals, all pertaining to programs:

    alist Ported from Chuck, coded by Coyote
    opstat
    rpstat
    Function like mpstat for mobs.
    opdump
    rpdump
    Aliases to mpdump, and are completely interchangeable. Added for the sake of completeness.
    proglist <area> At Navarre's request, this command functions much like "list" in mpedit, listing all the progs in the current area. If you do not specify an area, it defaults to the one you're standing in.
    exarea <area>Lists the exits and entrances to and from an area (not within it) - showing how it is attached to the world. This is in early stages of coding at the moment. It's something I found myself wanting as I was debugging code, and builders will hopefully find it of value.

    A small example would be something like this (these are bogus numbers and links)

    exarea limbo
    Area   Dir   Type    Vnum  Dir  Area 
    1      (N)   both    103   (S)  Feline Village
    5      (-)   from    32234 (D)  Isle of Misfit Toys
    14     (E)    to     32240 (-)  Isle of Misfit Toys

    This is still being plotted out, and is subject to change.

    There are also a few bug fixes coming up:
    Mprogs should no longer lock up and stop working. The problem was traced to a counter that was meant to measure the recursion depth and stop when it hit five. However, if it did hit five, it didn't decrement correctly. This will hopefully prevent a few frustration inspired feather plucking incidents.

    Switch was responsible for a good many crashes. The code has been extended a little to stave these off.

    Remaining: Item programs require another round of testing, as does the mob exit/exall trigger. Also extend out progs to allow them to block movement. Room programs are complete for OLC and nearing completion for play and thorough testing. Then it shall be time to enjoy the weather...

    Scrawled illegibly by Meathe at 11:58 AM

    Quizzes!

    July 13, 2005

    Science!

    Take the MIT Weblog Survey

    Scrawled illegibly by Meathe at 04:24 PM

    Quizzes!

    July 12, 2005

    Johnny Depp?

    You Are Ichabod Crane From "Sleepy Hollow."

    You're a deep thinker - most times logically. You're a bit of a neat freak and a wuss (hey, you do faint a lot!) but you do have the ability to overcome your fears and come out stronger in the end. And you never lose your head over things. (Gufaw gufaw!)
    Take The Johnny Depp Quiz!

    Scrawled illegibly by Meathe at 02:41 PM

    Code

    How to: Transparencies in webpages

    This wiser effort would have been, to diffuse thought and imagination through the opaque substance of to-day, and thus make it a bright transparency...

    Nathaniel Hawthorne, The Scarlet Letter

    As some have noted, I like transparencies in web pages. Quite possibly too much, as all my pages appear to have them, from Layil to the Time of Darkness Bugtracker and this blog.

    This is not purely for Movable Type, it can easily be added to any page that uses stylesheets. If you're not comfortable editing stylesheets, this is not a complex project. Honest.

    Inside the stylesheet, usually right at the top, there is a body tag, which will look somewhat like this:


    body {
    margin: 0px 0px 20px 0px;
    background-color: #8FABBE;
    text-align: center;
    }

    This is a simple body tag, taken from the default Gettysburg CSS, offered by SixApart. Yours may be more complex.

    To this is added a background image (so you actaully see the opacity setting work), and the opacity settings themselves.


    background-image: url(http://www.layil.org/images/MTBackgrounds/rotator.php);
    background-repeat: no-repeat ;
    background-position: bottom left ;
    background-attachment: fixed;
    filter: Alpha(Opacity=75);
    -moz-opacity: .75;

    The background image and it's position are set (fixed on the lower left so it won't scroll, does not reapeat the image to fill up the screen) and, more importantly, where the (two) opacity filters are configured. These two values are the more or less the same thing, they simply target different browsers so that it should work with IE and Firefox/Mozilla. Safari does not work with these. May I suggest using Firefox or Camino instead?

    Increasing the number will make it less transparent, lowering it will make it more so. I find 75 (and .75) pleasant, your mileage may vary.

    Combining them, the result is:


    body {
    margin: 0px 0px 20px 0px;
    background-color: #8FABBE;
    text-align: center;
    background-image: url(http://www.layil.org/images/MTBackgrounds/rotator.php);
    background-repeat: no-repeat ;
    background-position: bottom left ;
    background-attachment: fixed;
    filter: Alpha(Opacity=75);
    -moz-opacity: .75;
    }

    After saving and rebuilding the stylesheet, you now have a page that you can see through.

    Scrawled illegibly by Meathe at 12:41 PM

    Movable Type

    Random images

    I've been asked a few times about how I get the picture in the background to change. The simple truth is that I let someone else do all the work.

    Automatic Labs have a wonderful PHP script that does just that, without the need for mySQL or any configurations.

    Create a new folder to contain your images and the PHP script. By far the easiest way is to use MT's Upload File menu option to create the directory and transfer the files. I actually uploaded mine to my webpage account, before I discovered the Upload File option hiding in plain sight.

    It's now installed, configured and ready to run. You can type the address of the php script in your browser to check it out. Mine is over on layil, with three images.

    Finally, to add it to your pages, use the php script as an image source, either in html, like this:
    <img src="http://www.layil.org/images/MTBackgrounds/rotator.php"> or in the CSS (here's a little chunk of mine):


    body {
    margin: 0px 0px 20px 0px;
    background-color: #788e9c ;
    background-image: url(http://www.layil.org/images/MTBackgrounds/rotator.php);
    background-repeat: no-repeat ;
    background-position: bottom left ;
    background-attachment: fixed;
    margin : 0 0 0 0;
    padding : 0 0 0 0;
    width : auto;
    }


    For the diabolical, you could even combine this with the category images, by creating and uploading images and script to an images/category_name folder.


    <img class="floatright" src="<$MTBlogURL$>images/<$MTEntryCategory dirify="1"$>/rotator.php" alt="<$MTEntryCategory remove_html="1"$>"/>

    This would also work around the "all images must be either jpg or gif" issue with category images. The rotator will pic a random image from the category directory (as there's only one image in each directory, it'll be that picture for that category), and display whatever is there.

    Scrawled illegibly by Meathe at 11:22 AM

    Movable Type

    Category images (and wrapping text around them)

    For some time, I'd noticed images for each category on Webkittyn Warbles, and been quite impressed by it. I also had absolutely no idea on how to do it.

    The Warbler was very helpful, giving me the code snippet to insert, and several examples. The code, as it often is, was amazingly simple. And after the snippit is in, just upload an image to the server with the same name as the category. Thank you!

    The image for "Observations on the news!" is observations_on_the_news.jpg

    It also placed the images on the left, which I didn't want, and didn't wrap text around them, which I did. It also requires that all images are of the same type (either .jpg or .gif).

    Editing the CSS and creating a new image class called floatright resolved the first two issues.

    Image code for index.php (added inside <MTEntries>)


    <img class="floatright" src="<$MTBlogURL$>images/<$MTEntryCategory dirify="1"$>.jpg" alt="<$MTEntryCategory remove_html="1"$>"/>

    CSS Code, added after body{...}

    img.floatright {
    float: right;
    clear: right;
    margin : 0 0 0 0;
    padding : 0 0 0 0;
    width : auto;
    }

    The clear: right; ensures that images 'stack up' down the right hand side of the page. It's a matter of preference. Without it, you get a staggered effect if the images would overlap, with the top image being rightmost, and the next being shunted to the left.

    I also have transparency settings in mine, but that's a different kettle of seal food.

    Scrawled illegibly by Meathe at 10:40 AM

    Science and Technology

    July 11, 2005

    Todays nifty toy

    "It suddenly struck me that that tiny pea, pretty and blue, was the Earth. I put up my thumb and shut one eye, and my thumb blotted out the planet Earth. I didn't feel like a giant. I felt very, very small."

    Neil Armstrong

    For the moment, I seek distraction. The engine of today's distraction is earth.google.com

    A broadband, 3D application that lets you zoom in to an address. using satellite imagery. Which is not so interesting, except that it can also provide you the location of every bar in the area, or if you feel like a night out and away, driving directions can be superimposed.

    I don't think I'd use it for that so much, as the images are a little grainy and roads mostly unmarked. However, if a large storm happens to brew, I now know where I can track the progress.

    Scrawled illegibly by Meathe at 04:30 PM

    Annus horribilis

    July 07, 2005

    London, some time ago.

    From late 1940 to mid 1941, my grandmother was living in a mansion, safely out in the english countryside, with a good many other souls. The owners, whom I cannot recall, had offered accomodation to some of those who had their houses during the Blitz.

    There were many near misses, and when the sirens went, you sought cover, to the extent that she even hid behind a large crate full of potatos (most of which were destroyed as she crouched).

    Or running into a public air-raid shelter and emerging to fires, rubble and very little in the way of recogniseable buildings.

    The house where she had lived with her mother had been damaged in the Blitz bombings. The cemetary next door had also suffered a direct hit, and the houses were strewn with things better left underground. Cremation is a good thing. The Anderson shelter was in the back yard, the car headlights hooded, the windows painted black. These were inspected often to ensure no light escaped, as that made aiming much easier for the german pilots.

    Buildings burnt, houses and churches were targetted. People banded together and did what they could to help others.

    Shortly after the house was repaired, she returned to London to pick up where she left off.

    And began working as a secretary, copying documents and laying them out for meetings. Under armed guard, she transported documents from one parliament, outside, down some steps and into another room for some people to peruse. This we did not know until I asked four years ago, as no one else in the family had. And so she told us, because whatever Official Secrets Act she signed (1911) had expired.

    1944, from 21st of January through April 8, there was a reprisal of the blitz, dubbed the 'Little Blitz'. 1000 people were killed in the seven (or eight) raids in January alone.

    In June 1944, the Doodlebugs arrived. Buzz bombs, V1s. They were named such becuase as the rockets in them worked, they emitted a very distinct hum. And you were safe - so long as you heard the hum, for when it stopped, the engine had cut out, and they descended. And all hell broke loose. The germans launched about 100 a day, fighter planes downed about a third of these as they zipped past, anti-aircraft guns a further 10th. Around half of these fell short. Daily, somewhere beween twenty and forty hit.

    It was hard to tell the difference, sometimes, between a car, a motorbike and a doodlebug. And all you could do when the engine stopped was take cover and hope you were not beneath it. By this time, London seemed empty, for many had left.

    One landed between the two rows of houses where my grandmother lived and was at the time. Again, luckily, as occasionally happened, this one failed to explode, giving her and her sister just enough time to run like hell and make it out the front and a little way down the street before it did detonate.

    All in all, around seven thousand were launched, about two thousand five hundred hit London, causing over five thousand deaths and injuring three times more.

    September brought the V2 rockets, which were larger (14 tons?) and supersonic. The roar of the engines could not be heard until after the explosion. There was no warning. There was an explosion, a roaring noise and another explosion, with white flashes in the sky before the noise. Officials told everyone they were gas mains explosions. This was not widely believed by anyone, less so by someone who daily read the cabinet briefs. Nan actually found them less harrowing than the doodlebugs, for if you heard them, you were safe. If you didn't hear them, then it was either safe, or too late. Fatalistic, with a wry twist.

    These are the small fragments I can recall. There are many more stories and much greater detail, and I shall always wish I'd written this down earlier.

    More, I think, to come much later, if I can somehow get a recording device to her.

    Scrawled illegibly by Meathe at 01:17 PM

    Observations on the news

    London

    "To build may have to be the slow and laborious task of years. To destroy can be the thoughtless act of a single day."

    Sir Winston Churchill

    London was today attacked in an organised fashion. I think they are the Circle, District and Picadilly lines. The note claiming responsibility is appalling, from start to end. I will not even start on the no-tag-back "He who warns is excused" line. But they claim:

    Britain is now burning with fear, terror and panic in its northern, southern, eastern, and western quarters.

    According to people who are there, England's response is typically stoic, greeting these events with resolve.

    Still more majestic shalt thou rise,
    More dreadful from each foreign stroke;
    More dreadful, dreadful from each foreign stroke.
    As the loud blast, the blast that tears the skies
    Serves but to root the native oak.

    Rule Britannia

    My thoughts and sympathies are with you all.

    Scrawled illegibly by Meathe at 09:28 AM

    Movable Type

    July 05, 2005

    Flippery flyin' fishes!

    "On the road to Mandalay Where the flyin' fishes play, An' the dawn comes up like thunder outer China 'crost the bay."

    Rudyard Kipling, Mandalay

    Irony of ironies, I'm a flippery fish in the Truth Laid Bear ecosystem. The bold evolutionary leap (from crunchy crustacean) is largely due to Webkittyn and the Blogs of Roleplay Grand Grimoire, which has also awarded Musing, Meandering with the July 2005 Blog of the Month. This is due in part to my tinkering with the protection module and in part to the antics of the little seal in the banner. Thank you!

    Many, many thanks also to Venice for actually having the courage to try it out and help in finding all the shortfalls.

    The MTBlogroll, for whatever unfathomable reason, appears to have started working today, as several blogs have the NEW tag next to them now.

    Today also marks the return to mud code, and I have quite a list.

    Scrawled illegibly by Meathe at 11:20 AM

    Movable Type

    July 03, 2005

    MT Links

    It is a mistake to try to look too far ahead. The chain of destiny can only be grasped one link at a time. Sir Winston Churchill (1874 - 1965)

    Purely here for my own referecnce.
    Documents
    Plugin tutorial
    API Index


    Scrawled illegibly by Meathe at 03:37 PM

    Code

    Get thee to a ... monestary

    It's official, I'm joining a monestary.

    Perl has been refered to as a 'write only' language, in as much as it can be completely impenatrable. But then so can C. The regular expressions have a lot of appeal. Thus far, it seems readable, though I rather suspect this is because the programmers I've been reading have stuck to a convention. Perl will let you get away with all sorts of things that would make a maintenance programmer weep (yes, so does C).

    I don't think Perl will displace C (and offshoots) as my favourite language. You must run horses for courses, and there are some things that it is perfect for. I find it impossible not to warm to a programming language where the following is valid and runs:


    #!/usr/bin/perl
    APPEAL:
    listen (please, please);
    open yourself, wide;
    join (you, me),
    connect (us,together),
    tell me.
    do something if distressed;
    @dawn, dance;
    @evening, sing;
    read (books,$poems,stories) until peaceful;
    study if able;
    write me if-you-please;
    sort your feelings, reset goals, seek (friends, family, anyone);
    do*not*die (like this)
    if sin abounds;
    keys (hidden), open (locks, doors), tell secrets;
    do not, I-beg-you, close them, yet.
    accept (yourself, changes),
    bind (grief, despair);
    require truth, goodness if-you-will, each moment;
    select (always), length(of-days)


    # listen (a perl poem)
    # Sharon Hopkins
    # rev. June 19, 1995

    Scrawled illegibly by Meathe at 12:08 AM

    Movable Type

    July 01, 2005

    Entry protection (again)

    I've hit two major issues with the protection code. One has been raised with the developer. The second I've developed a work-around for.

    If you set up typekey protection, you must enter at least one TypeKey user in the list who can access it. It does not automatically give the author access to the post, and failing to enter at least one name in the list will break your pages, resulting in a white screen and a nasty little PHP error message.

    The other visual problem I've encountered is that I like the little horizontal lines as entry delimiters. Wrapping the entire entry up in <MTEntryProtect> or <MTProtected> hides all of this and the posts tend to run together - especially where there is one protected entry following another, resulting in this kind of thing:


    Where there are actually three protected entries, very much jumbled together. The first (This Post is password protected) has a login box. The second (Hello Meathe. You do not...) is TypeKey protected, though I do not have rights to read it, and the third (Thanks for signing in) is TypeKey protected, and I do have rights to read it.

    It's hard to sort out visually, especially if, like me, you like the horizontal line and post date to delimit the end of each entry.

    It involves fiddling your templates, though it is more or less a paste in fix (for index.php, anyway). You have been warned.

    The original template will have code like this in it:

    <MTEntries>
    <MTProtected>
    <$MTEntryTrackbackData$>
    <MTDateHeader>
    <h2><$MTEntryDate format="%x"$></h2>
    </MTDateHeader>
    <h3 id="a<$MTEntryID pad="1"$>"><$MTEntryTitle$></h3>
    <$MTEntryBody$>
    <MTEntryIfExtended>
    <p class="extended"><a href="<$MTEntryPermalink$>#more">Continue reading "<$MTEntryTitle$>"</a></p>
    </MTEntryIfExtended>
    <p class="posted">Posted by <$MTEntryAuthor$> at <a href="<$MTEntryPermalink valid_html="1"$>"><$MTEntryDate format="%X"$></a>
    <MTEntryIfAllowComments>
    | <a href="<$MTEntryPermalink archive_type="Individual"$>#comments">Comments (<$MTEntryCommentCount$>)</a>
    </MTEntryIfAllowComments>
    <MTEntryIfAllowPings>
    | <a href="<$MTEntryPermalink archive_type="Individual"$>#trackbacks">TrackBack (<$MTEntryTrackbackCount$>)</a>
    </MTEntryIfAllowPings>
    </p>
    </MTProtected>
    </MTEntries>

    Which will hide the title and body of the post if someone is not authorised, with unfortunate effect that it also hides the post date and that nifty horizontal divider.

    So here is the drop-in replacement (added code underlined):


    <MTEntries>
    <$MTEntryTrackbackData$>
    <?PHP $ThisEntryProtected=0; ?>
    <MTIfProtected>
    <?PHP $ThisEntryProtected = 1; ?>
    </MTIfProtected>

    <MTEntryProtect>
    <?PHP $ThisEntryProtected = 0; ?>
    <MTDateHeader>
    <h2><$MTEntryDate format="%x"$></h2>
    </MTDateHeader>
    <h3 id="a<$MTEntryID pad="1"$>"><$MTEntryTitle$></h3>
    <MTEntryBody>
    <MTEntryIfExtended>
    <p class="extended"><a href="<$MTEntryPermalink$>">Continue reading "<$MTEntryTitle$>"</a></p>
    </MTEntryIfExtended>
    </MTEntryProtect>
    <p class="posted">Posted by <$MTEntryAuthor$> to <$MTEntryCategory$> at <a href="<$MTEntryPermalink valid_html="1"$>"><$MTEntryDate format="%X"$></a>
    <?PHP if($ThisEntryProtected==0) { ?>
    <MTEntryIfAllowPings>
    | <a href="<$MTEntryPermalink archive_type="Individual"$>#trackbacks">TrackBack (<$MTEntryTrackbackCount$>)</a>
    </MTEntryIfAllowPings>
    <MTEntryIfAllowComments>
    | <a href="<$MTEntryPermalink archive_type="Individual"$>#comments">Comments (<$MTEntryCommentCount$>)</a>
    </MTEntryIfAllowComments>
    <?PHP } ?>
    </p>
    </MTEntries>

    This is very similar to the way I have it set up on my main page (though I have titles of the entries outside the MTEntryProtect, visible to anyone).

    It works by employing the tag <MTIfProtected>. The MTIfProtected will run the PHP code to set $ThisEntryProtected to 1 if the entry is protected (it doesn't care if you have access or not, just if the entry is protected or not).

    If the entry is protected and you have access to it, the PHP code inside the <MTEntryProtect> sets $ThisEntryProtected back to 0.

    The entry is then unprotected past the entr