« June 2005 | Main | August 2005 »
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
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
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
Probably even true.
Scrawled illegibly by Meathe at 12:12 PM
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.

Scrawled illegibly by Meathe at 09:48 AM
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.
Sometimes, the only productive things people can become is fertilzer.
Scrawled illegibly by Meathe at 10:37 PM
Ernie on the trains
Alert level is holding at Ernie for Mass Transit.
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.
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
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 Spirithttp://Dragonhame.Com
So why aren't I enjoying all this heat?
Scrawled illegibly by Meathe at 04:38 PM
July 25, 2005
No surprises there
| You Belong in Australia |
Sunny, upbeat, and cute You make the perfect surf bum Now stop hogging the vegemite! |
| Your Dominant Intelligence is Logical-Mathematical Intelligence |
You would make a great scientist, engineer, computer programmer, researcher, accountant, or mathematician. |
Scrawled illegibly by Meathe at 02:55 PM
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
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
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.
| Op | Meaning | Code example | Explanation |
|---|---|---|---|
| == | is equal to, matches | IF level $n == 15 | (If the character is level 15) |
| != | Not Equal to | IF level $n != 101 | (If the character is not hero level) |
| > | Greater than | IF level $n > 101 | (If the character is a higher level than 101) |
| < | Less than | IF level $n < 102 | (If the character is below level 102) |
| >= | Greater than or equal to | IF level $n >= 102 | (If the character is level 102 or greater) |
| <= | Less than or equal to | IF 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 |
|
| Objhere | <name/vnum> |
|
| Mobexists | <name> |
|
| Mobhere | <name/vnum> |
|
| Objexists | <name> |
|
| People | Op. <num> |
|
| Players | Op. <num> |
|
| Mobs | Op. <num> |
|
| Clones | Op. <num> |
|
| Order | Op. | Researching |
| Hour | Op. <num> |
|
| Ispc | $_ |
|
| Isnpc | $_ |
|
| Isgood | $_ |
|
| Isevil | $_ |
|
| Isneutral | $_ |
|
| Isimmort | $_ |
|
| Ischarm | $_ |
|
| Isfollow | $_ |
|
| Isactive | $_ |
|
| Isdelay | $_ |
|
| Isvisible | $_ |
|
| Hastarget | $_ |
|
| Istarget | $_ $_ |
|
| Exists | $_ | Not workingThis command is redundant, as there is IF objexists and IF mobexists. |
| Affected | $_ <spell> |
|
| Imm | $_ <imm> |
|
| Act | $_ <flag> | ? Act
|
| Off | $_ <flag> | ? off
|
| Carries | $_ <name/vnum> |
|
| Wears | $_ <name/vnum> |
|
| Has | $_ <type> |
|
| Uses | $_ <type> |
|
| Name | $_ <name> |
|
| Pos | $_ <pos> |
|
| Clan | $_ <clan> |
|
| Race | $_ <race> |
|
| Class | $_ <class> |
|
| Objtype | $_ <type> |
|
| Ismaster | $_ |
|
| Ispk | $_ |
|
| Isnpk | $_ |
|
| Age | $_ Op. <age> |
|
| Vnum | $_ Op. <vnum> |
|
| Hpcnt | $_ Op. <%> |
|
| Room | $_ Op. <vnum> |
|
| Sex | $_ Op. <sex> |
|
| Level | $_ Op. <level> |
|
| Align | $_ Op. <align> |
|
| Money | $_ Op. <amount> |
|
| Objval0 | $_ Op. <num> |
|
| Objval1 | $_ Op. <num> |
|
| Objval2 | $_ Op. <num> |
|
| Objval3 | $_ Op. <num> |
|
| Objval4 | $_ Op. <num> |
|
| Grpsize | $_ Op. <num> |
|
Scrawled illegibly by Meathe at 04:33 PM
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
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.
| 0 | north | n |
| 1 | east | e |
| 2 | south | s |
| 3 | west | w |
| 4 | up | u |
| 5 | down | d |
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 with | What 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 bless | When a bless spell is cast in the same room as the mob |
addoprog 122 give 100 | Every time the item is given to someone |
addoprog 123 give 20 | 1 in 5 chance every time the item is given to someone |
addmprog 145 bribe 300 | When the mob is bribed with 300 or more platinum |
addmprog 121 speech where | When someone in the rooms says "where" |
addmprog 122 exit south | When 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
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
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/ENDIFThese 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
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
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
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
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
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.
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
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
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
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 removedOf 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
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 |
opstatrpstat | Function like mpstat for mobs. |
opdumprpdump | 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
July 13, 2005
Science!
Scrawled illegibly by Meathe at 04:24 PM
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
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
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
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
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
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
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
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
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
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
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

