Skip to main content

Clan Lord

Maps #

These are maps made or modified by Drablak. They are old and have not been updated in a long while (except for the EP map). Use with discernment.

Ethereal Plane #

  • Map of EP — updated with the latest information I have (2023-08).

Puddleby Island #

Ash Island #

Metz Island #

Umbrion’s Island #

Macros #

Clan Lord uses a very rich macro system that let you program various things to help you play the game. I have a lot of these macros (so many in fact that I often don’t remember how to use them so I built a help-system, with macros of course!). Here are a few that may help others.

Orga Outback Directions #

A very long time ago, on one of our adventures into the Orga Outback (OOB), we lost one person along the way. They exited the snell on the wrong side, and we exited on the correct path towards the Dread Passage Tree. There is very rarely the option of just retracing your steps in OOB, so now came the question of how to go fetch that person (who fell almost immediately). Looking at the map you can find a path, but it may take some time, so I decided to build a macro to help with that.

As a kind of challenge I decided to make a macro that would find the path with an algorithm, instead of the easier method which would be to have a table of all the origins and all the destination and simply call the correct path (what’s called a lookup table). The linked macro is the result of that exercise.

OOB Macro by Drablak

Here is the map of the Orga Outback (by Lorikeet & Rakshasa) used for this macro.

OOB Map

I tried to include as much explanation as I could in the macro (for future me). Here is a part of these comments from the macro.

OOB is actually made of two regions, which I call lower and upper OOB, that are connected by two unique paths. There is only one way to go from lower OOB to upper OOB, and only one way to go from upper to lower OOB (I call these the connecting paths in the following explanation). Because of this, the following algorithm will check if the origin and destination are in the same region first (upper or lower) and if they are not the algorithm will try to find two paths: the first from the origin to the entrance to the connecting path, and the second from the exit of the connecting path to the destination. If both origin and destination are in the same region, the algorithm proceeds normally.

As there are a number of snells in OOB that have a unique entry point, i.e. there is only one snell that leads into those snells, I have an array of these snells and their corresponding entry snell. This is mainly to save processing time and focus the algorithm on looking for a route.

General concepts for the algorithm:

  • OOB choke points (snells 15 and 35): OOB is divided into a lower part and an upper part, or think of it as two regions linked through a valley. There is no other way from one region to the other than through this valley. The way to cross that valley depends on if you are in the upper part or the lower part.

  • Going from upper OOB to lower OOB:
    If destination < 17 and origin > 16 then the path must pass through 35: 35 is the only >16 snell that leads to <17 (to snell 6). There is a unique path that leads to snell 35 and it starts at snell 25.
    The connecting path from upper OOB: 25-26-29-30-34-28-35 -> 6.
    So in this case the first thing is to test if ‘origin’ is in this path.
    If not then try to get a path to 25 and use above connecting path to get to 35 (and then find a path from 6 to destination).

  • Going from lower OOB to upper OOB:
    If destination >16 and origin <17 then the path must pass through 15.
    Snell 15 is the only <17 snell that leads to >16 (to snell 17).
    The connecting path from lower OOB: 8-9-11-12-14-15 -> 17
    So in this case the first thing is to test if ‘origin’ is in this path.
    If not then try to get a path to 8 and use above path to 17 (and then find a path from 17 to destination).

  • Many snells (14 out of 35 snells) have a unique entry points.
    That means that there is only one snell that leads to them.
    I have an array with the list of these unique-entry snells and the destination is to be checked against it: if it’s a unique-entry snell then starting from the destination backward from this unique entry point is required for part of the path.

  • I found that the best approach is to start two paths, one forward and one backward, meaning that one array lists snells backward from the destination and a second array lists snells forward from the origin and then we find a way so that the two paths meet somewhere in the middle.

  • The first thing to check is if destination is accessible from origin (trivial solution).
    If not then a check should be made to see if the exits from origin don’t match an entry point to the destination.

  • This previous algorithm is the key one that will match the forward and backward arrays, and is the core engine, so I’ll illustrate the intent with an example:

Say you are in snell 12 and you want to get to snell 5:
- from snell 12, exits lead to 2, 6, 4, and 14;
- snells leading to 5 are: 1, 6, 7, 8, 11, 14, and 15.

First we see that there is no direct path from 12 to 5, so we look to see if an exit from 12 leads to an entry to 5. We actually find two paths that meet that criteria: to get to 5 from 12 you can go to 6 then 5 or 14 then 5. That way you tie the loose ends of the paths from the origin and destination.

Drablak

Snaggy Directions #

Once I’d made the OOB Macro (see above), it was trivial to make one for Snaggy, so I did.

Snaggy Macro

And the corresponding map (by Aki, Bones, Kojiro, and Lorikeet. And probably Tonoto?)

Snaggy Map

Relaying directions #

I made this macro to relay instructions from a leader to the rest of the group. It’s sometimes useful that the instructions of the leader be relayed to everyone in the party when some are out of hearing (or yelling) range. As a mystic I have a greater sunstone group and so I can relay the information to those who aren’t in the leader’s group (or if they don’t have a sunstone group and can only sunstone to one person). Also sometimes there are people in the front and people in the back (/action waves), and so it might also be useful to verbally relay instructions or information from the forward group.

There are are two options, the first is true by default and it just means that you says outloud what the leader sunstonned to you, preceded by the leader’s name, like Drablak says: <instructions>. You can toggle this behavior with /spoken. I recommand leaving it on as this is a useful backup when your sunstone cooldown prevents a message to be relayed (at least those around you will get the message).

The other option is to relay instructions to your sunstone group and this is disabled by default. You can toggle it with /grouprelay. When it’s set to true the same message is sent to the sunstone group, i.e., /thinkgroup Drablak says: <instructions>.

It works like this:

  • set the leader you wish to relay the instructions using /setrelay <name>, for example /setrelay Drablak.
  • opt-out of the verbal component if you wish: /spoken.
  • opt-in of the think group component if you wish: /grouprelay.
  • turn it on or off with /relay (it’s off by default).
  • the leader sends you a message, either the direct /thinkto or a /thinkgroup message that begins with relay: , and that’s it.

Here are two macros that the leader may use to relay messages (not required if they can type ‘relay: ’ quickly enough!). One in which they send the instruction to their own think group (which must include you!), and one in which they only send the message to you. They need to change the line highlighted (line 17) by replacing Drablak with your name (obviously).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
"tgd"
{
    if @text != ""
        set @msg "relay: "
        set @msg + @text
        "/thinkgroup " @msg "\r"
    else
        message "No message to relay, use 'tgd <message>'"
    end if
}

"td"
{
    if @text != ""
        set @msg "relay: "
        set @msg + @text
        "/think Drablak " @msg "\r"
    else
        message "No message to relay, use 'td <message>'"
    end if
}

Relay Macro

Ranks “counter” #

I used to count ranks by hand in a notebook. That got old pretty fast and it wasn’t very practical as you get ranks when you’re fighting and you don’t have time to stop and write in a notebook. I came up with this system which is still a bit of work but is really not so bad, in my opinion. It’s not as good as a rank tracker that scans your log files for rank messages, but at least you’re not dependant on anyone else if you use this system. But, it’s not for everyone, as you have to set things in a certain way and not forget to update your macro file after each time you play Clan Lord.

The system works like this:

  • You set up a file for each character with the trainers and your current ranks in them, let’s call this file ranksJoe for Joe’s character as an example (you must have a different ranksName file for each of your characters). This file includes which trainer you’re currently working on and a training goal for that trainer. You can also set a message telling you what you plan to train after this one has reached its current goal. For each trainer, you need to set the message you receive when you get a rank. For example for Higgrus this would be ‘You seem to be able to take more damage now’. These messages can be found on the CLUMP.
  • In addition you have the ranks file which includes some useful macros related to ranks like listing all your trainers with ranks, adding a rank to your pet, or manually adding a trained rank, etc. This file is the same for all characters, i.e., there is only one and you don’t have to change anything in it.
  • You need to add both include ranksJoe and include ranks in you Joe macro file.
  • And you need to start the rank tracking in your @login macro (shown below).
  • When you log off you call display_gained_ranks (also shown below) and it gives you a message of your new total ranks for the trainer, which you need to manually update in the ranksJoe file.

This last part is the only thing that you need to do after you play, unless you’re changing trainer. In my case it’s very easy as I usually have a text editor open in any case (I recommend BBEdit for macros).

Here is an example: ranksJoe
And the other file: ranks

Example of the @login macro that you can simply put in the Joe’s’ file.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
@login
{
    message "* Executing @login macros"
    message "Training : " trainer[current_trainer_digit] "."
    message "Current ranks : " ranks[current_trainer_digit] "."
    message
    message "Training goal: " training_message "."
    set to_training_goal current_rank_goal
    set to_training_goal - ranks[current_trainer_digit]
    message "Ranks to training goal (" current_rank_goal "): " to_training_goal "."
    message
    message "Pet name(s): " pet_name "."
    message
    message "* == login macro completed == *"

    message "Starting money is set at " starting_money "c."
    pause 10
    call my_background_tasks
}

my_background_tasks
{
    message "* background_tasks activated"
    if g_check_for_ranks == true
        message "* Monitoring for rank messages"
        if rankMessage[current_trainer_digit] == "bogus rank message"
            message "-----------------------"
            message "Rank message is not set, please update it in your RanksName file!"
            message "Trainer is " trainer[current_trainer_digit] " ."
            message "-----------------------"
        else
            message "Rank message is set. All good."
            message "------------------------------"
        end if
    end if

    set @env.key_interrupts false
    set @env.click_interrupts false
    
    label my_check_text_log
    
    set my_log @env.textLog
    
    // check for ranks ---------------------------------
    if g_check_for_ranks == true
        if my_log >= rankMessage[current_trainer_digit]
            message "* got a rank message"
            call add_rank
            goto my_check_text_log
        end if
    end if // check for ranks
}

And you can just put call display_gained_ranks in a macro you call when you log off, I put it in like this:

1
2
3
4
5
6
"sl"
{
    call display_gained_ranks

    "/sleep\r"
}

Utilities #

Here are some general macros that may be useful.

Ethereal Portal Stone #

Normal version:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
"/eps"
{
    set saveItem @my.right_item
    "/equip ethereal portal stone\r"
    pause 2
    "/use ethereal portal stone\r"
    pause 2
    if saveItem != "Nothing"
        "\equip " saveItem "\r"
    else
        "/unequip right\r"
    end if
}

Version for mystics 1:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
"/eps"
{
    "/equip ethereal portal stone\r"
    "\options icon unarmed\r"
    pause 2
    "/use ethereal portal stone\r"
    call report_portal_destination
    if feed_back != ""
        "The portal leads to " feed_back "\r"
    else
        message "Could not get portal destination, try again with '/portal'"
    end if
}

Kuzdu #

Here is the macro I use for kudzu. You simply use kk to plant zu as you move around.

kudzu macro

Archives #

Drablak’s Hideaway #

My old in-character website (called scrolls in-character), as it was. Many of the outgoing links are now broken (most notably the links to other journals that aren’t online anymore) and some of the internal ones may also be broken. Mostly here for archiving purpose. Last updated in 2014: Drablak’s Hideaway


  1. If you’re a mystic and want to have the report_portal_destination macro, as a prize for finding this site 😉, just contact Drablak on the mystics’ Discord and I’ll send you a copy. ↩︎

Denis Ricard
Author
Denis Ricard
Loving husband, proud father, retired physicist, forever coder, and avid gamer.