-
Notifications
You must be signed in to change notification settings - Fork 177
Lich Triggers
The concept of triggers is that Lich will respond automatically to certain game output without the need to run a separate script. Historically, the ability to set triggers is a function of the Front End being used. Lich-based triggers are front-end agnostic and built within Lich itself. Thus, they can be used across and between front ends. Simple triggers have a fairly low barrier to entry for users, and more advanced uses can allow some complex handling without writing a dedicated script. Further, triggers can supplement the use of curated or custom Lich scripts. At some point, though, the complexity of an action calls for writing a dedicated script.
Lich's triggers are defined by the user in a yaml file along with the desired trigger responses. Triggers are then monitored for and acted upon with a persistent companion script called trigger-watcher
. Fundamentally, Lich's triggers use class Flags
which is defined in the events
script and at a basic level monitor for user-defined game output. In order for Lich triggers to work, triggers must be defined properly in the yaml, and both the events
and trigger-watcher
script must stay running.
The structure of each trigger is as follows:
- The top level heading of
lich_triggers
(required) - Beneath that and indented, the name of this specific trigger. This is arbitrary -- name it what you want.
- Beneath that and indented, a section called
triggers:
. This represents the game output you want the trigger to look for and then take action. - Beneath that and indented, a section called
responses:
. When Lich sees the output you defined in thetriggers
section, it will process these trigger responses.
Let's look at an extremely simple trigger.
# LICH TRIGGERS
# Yaml for Lich-based triggers
lich_triggers:
wave_hello:
triggers:
- Bobafett just arrived
responses:
- wave Bobafett
This trigger recognizes when a character named Bobafett enters the room, and it waves to them. What's happening behind the scenes is that Lich is watching all game output lines for Bobafett just arrived
. When it sees that, it takes the action you've defined in responses
and it will send wave Bobafett
as a game input command.
Only two things are necessary to be up and running with triggers:
- Define your triggers in a
lich_triggers:
section in yourCharname-setup.yaml
or set them up in a separate file namedCharname-triggers.yaml
. Both ways are supported. - Run the
trigger-watcher
script. It's recommended to add this to your autostarts.
Within a single trigger name, you can specify multiple triggers and multiple responses. Here are some simple examples:
# LICH TRIGGERS
# Yaml for Lich-based triggers
lich_triggers:
wave_hello:
triggers:
- Bobafett just arrived
- Hansolo just arrived
responses:
- wave
Here we've specified two different triggers, and modified our response slightly. If Lich sees game output of either Bobafett just arrived
OR Hansolo just arrived
, it will trigger a response of game input wave
.
# LICH TRIGGERS
# Yaml for Lich-based triggers
lich_triggers:
wave_hello:
triggers:
- Bobafett just arrived
responses:
- wave Bobafett
- kick Bobafett
Here we've specified a single trigger but two responses. If Lich sees Bobafett enter the room, it will send the two responses as game commands one right after the other: wave Bobafett
and kick Bobafett
.
A set of trigger commands is provided for use by the user. These commands tell Lich treat trigger responses in various ways. Commands are always preceded by the =
sign, which tells Lich to run it as a trigger command. Trigger response lines must begin with these commands to be properly parsed.
Trigger Command | Description | Example | Notes |
---|---|---|---|
=exec |
Execute a script. | =exec <script> [arguments] |
|
=execw |
Execute a script and wait to complete the script before moving on. | =execw <script> [arguments] |
|
=eval |
Evaluate as Lich/Ruby code. | =eval DRC.message("hello") |
|
=uvar |
Set or delete a Lich User Variable. |
=uvar set MyUserVariable 22 =uvar delete MyUserVariable
|
You can reference a stored user variable in your triggers via $UserVarName . |
=logf |
Log to a file. | =logf <filename> <text to log> |
Creates the file if it doesn't exist. Appends the data if it does. Includes a timestamp. |
=logw |
Log to a window. | =logw <windowname> <text to log> |
Creates the window if it doesn't exist. Includes a timestamp. |
=pause |
Pause a specified amount of seconds. | =pause 10 |
|
=if =elsif =else
|
Allow if, elsif, else functionality. | =if {3 > 2} {DRC.message("true")} =else {DRC.message("else")} |
Can have multiple actions for each if/elsif/else . Can have multiple elsif 's. Nesting of these commands not currently supported, but valid Ruby works within them. Note the use of curly brackets, which are required. |
Triggers support regex and trigger responses support regex substitutions and Lich UserVar substitutions.
To use regex substitutions, use capture groups in your trigger and reference them via $1
through $9
. You are limited to 9 regex substitutions. Named capture groups are not currently supported.
lich_triggers:
regex_sub_test:
triggers:
- You are (.*) years old
responses:
- say I am $1
>age
You are one hundred twenty-seven years old.
Among Elves, you are considered an adult.
To the other races, you appear to be young.
You are aging at a normal rate for an Elf.
[Type AGE HELP for more options.]
>
[trigger-watcher]>say I am one hundred twenty-seven
You say, "I am one hundred twenty-seven."
To use UserVar substitutions, use the same $
character and reference the UserVar by its name. The first character in a UserVar cannot be a number. Otherwise, no limitations on the name.
NOTE: If you're using regex substitution, use only a single trigger line.