In the beginning was IdleRPG. If you're not familiar with that, then stop reading now, and go familiarise yourself with it. It's a great game, very popular, but development ceased in 2004.
Since then, some guys in Germany have forked it, kinda-fixing some bugs, and adding some interesting features too. Apart from the dropped items patch, they didn't really change the feeling of the game at all. That's not to underestimate their input, adding item drops was a significant feature, one that I wrote a stub for many years ago, just one I never got round to fully implementing.
That version was used as the starting point for the currently active and popular (i.e. seems to have many dozens of active players in 2014) MultiRPG. They've added an enormous number of features, ones that seem to significantly alter the feel of the game. There seems to be a lot more going on. Your characters don't just wander around and occasionally find things and fight, there's all kinds of other interactions and things to collect. The unique items have exploded in variation too. However, I don't play there, I have no idea if it has the simple charm of the original. They also haven't opened their source, as far as I can tell.
Firstly, the game is just so corny in it's D&D-like RPG aspects. And every instance, of which there were once well over a thousand, is basically identical. It's swords and cloaks and shields. Why not have a Star Trek themed one? A computer-nerd themed one? A beer-drinking themed one? A Game of Thrones themed one? (OK, that's basically the same as the default with some names changed!) A music/band themed ones? A My Little Pony themed one? A whatever-you-freaking-want themed one? Get the idea. However, it's super-crazy to expect people who want to put together a themed game to have to go in and hack perl. Powerful language it may be, but it's not very forgiving of mistakes, and that's why you don't want people who aren't confident with the language having to tweak it. So I pulled out (almost) all of the data into config files, which are easy to edit without ever touching the perl code. These have grown and grown in functionality, and more is expected.
Secondly, I was a bit annoyed by the messages that used the same pronoun for things that happened to both me and my girlfriend whilst we were idling. So I added genders. Of course this added complexity to the templated (themed) messages, they now need to use special syntax to tell the game to select the appropriate gender.
Thirdly, I wanted dropped items to not disappear, but stay on the map. (And as you read above, I wasn't alone in this one.) Of course, this should be optional, at the sysadmin's discretion.
Forthly, in order to make debugging easier, I added a whole bunch of extra commands that would let the game admin bring about all kinds of events, so that every feature of the game can be tested. I also wanted to give more power to the player, there's no point in not giving him access to game state.
And of course, there was a bunch of bug-fixing.
Plenty - but from which perspective? From the player's, game admin's, sysadmin's, or themer's perspective?
All the same commands as in the original. Plus:
All the same commands as in the original. Plus:
AFAICR, it's mostly the same as the original. However, the save files (irpg.db) are incompatible. My version will read in an old file, and write it out in new format, but there's no going back in the other direction. So keep a backup if you're just experimenting. If you're competent enough to admin this, then you should be able to work out how to undo the changes, but if it becomes an issue I guess I could write a helper script.
Note: Now that there are several themes, each in its own subdirectory, you must run the perl script from within that directory, so that it picks up the right .irpg.conf, events.txt, items.txt configuration, and the save files.
Create a new subdirectory, create a new items.txt and events.txt file with your themed messages/items. The lines are as follows (you fill in the [blanks]):
The order of the uniques is important - if deciding to hand out a unique they will be tried for relevance in the order they are listed. The s=[letter] field must be a unique letter, that's the unique identifier used to identify that object.
There are different special sauces in the different contexts, and they can
behave slightly differently, but all of them are sustitutions (sometimes called
"macros" in other language). All macros are enclosed in %
symbols.
Programattic macros start %{
and end }%
The syntax %{[start]#[delta]#[end]}%
will expand in turn to
start
, start+delta
, start+2*delta
, …
until it finally reaches end
. If [end]
is absent,
then the sequence continues indefinitiely. [delta]
can be
of the form +[number]
or -[number]
in order to
increment or decrement from start
. If [delta]
is
completely absent, then +1
is assumed. Additionally, if
[delta]
is of the form *[number]
, then the macro
in subsequent levels will expand to start*delta
,
start*delta2
, ….
So for example:
item4: n="monitor" g=" degaussed %his% monitor, and recalibrated it!" levels4: %{8#+1#14}%" amber, %{10#+1#16}%" b/w, %{12#+1#24}%" CRT, %{14#+.5}%" TFT
expands as follows:
level | description |
---|---|
0 | an 8" amber monitor |
1 | a 9" amber monitor |
... | … |
6 | a 14" amber monitor |
7 | a 10" b/w monitor |
... | … |
13 | a 16" b/w monitor |
14 | a 12" CRT monitor |
... | … |
26 | a 24" CRT monitor |
27 | a 14" TFT monitor |
28 | a 14.5" TFT monitor |
29 | a 15" TFT monitor |
... | … |
Note that by default, the desciption is prefixed by "a" (or "an"), and ends
with the name of the type as given in n="[type]"
. Both of these
can be overridden, as shown in the next example.
As in the previous example, but [delta]
can be an operator
followed by a colon-separated list of values which will be cycled through
in turn. As a trivial example %{1#+1:9#}%
will expand to
1
, 2
, 11
, 12
, ….
So for example, the following:
item7: n="RAM" c=" got hit with static, badly affecting %his% RAM!" g=" reseated %his% RAM chips!" levels7: !a %{32#*2#1024}% words of magnetic core memory%notype%, !a %{2#*1.5:1.333333333#1536}% KiB, !a %{2#*1.5:1.333333333#1536}% MiB, !a %{2#*1.5:1.333333333#1536}% GiB %type%, !a %{2#*1.5:1.333333333}% TiB of %type%
expands to:
32 words of magnetic core memory
,64 words of magnetic core memory
, …,1024 words of magnetic core memory
,2 KiB RAM
,3 KiB RAM
,4 KiB RAM
,6 KiB RAM
, …,1024 KiB RAM
,1536 KiB RAM
,2 MiB RAM
, …
See example 2 - !a
at the start of an item description will
suppress the "a/an" in the description of the item. Usually used before numbers,
as shown above.
See example 2 - %notype%
in the level description will
suppress the type name being included at the end of the description. %type%
in the
description will be replaced by the item type no matter where it occurs.
See the calamaties and godsends in example 2 - the
%his%
will be replaced by the gender-appropriate pronoun for the
player posessing this object - e.g. his/her/its/their.
macro(s) | expansion | notes |
---|---|---|
%he% , %she% , %they% |
he/she/they/it/… | Whichever is appropriate for the player. |
%his% , %her% , %their% |
his/her/their/its/… | Ditto. Note the ambiguity of "her". |
%him% , %them% |
him/her/them/it/… | Ditto. Don't use %her% for this. |
Sometimes you need a verb to agree with the pronoun substituted as per
example 5. In these cases you may use
%is%
, %are%
, %was%
, %were%
,
%has%
, and %have%
, and the appropriate conjugation will
be selected.
%player%
will be replaced by the relevant player's name
In events which involve more than one player, such as "goodness", the two players are
denoted %player0%
and %player1%
. For example:
L Dan Bernstein rants and raves about how %player% is in %{60#-4#36}%-bit la-la land, so retarded %him%
These use exactly the same syntax as item level descriptions' programmatic
counters from example 1 except that delta
must not be *[number]
, and that [end]
must be given.
For example, the code sample in example 7 will have
%{60#-4#36}%
replaced by one of 60, 56, 52, …, 40, 36.
%{[choice1]|[choice 2]|[a third choice]|…}%
will expand to
one of the choices between the |
separators.
C %{was arrested|was apprehended|had %his% computers confiscated}% by %{the NSA|Interpol|the Serious Crime Squad|U.N.I.T.}%
In the above, there are 12 possible replacements - three from the first list, and four from the second list, in any combination. Note also that pronoun replacement will be performed if had %his% computers confiscated
is selected.
You may include random values inside list selections.
C 's webserver got hit by a %{XSS flaw|SQL injection|%{1#+1#1000}%TB DDoS}%
If the list selection selects %{1#+1#1000}%TB DDoS
, then that will be expanded using random value expansion.
If the first part of the C or G message is the magic carbunkle
%![+/-][m/f/n]%
, then that event will only be performed
if the event recipient is of that gender (with the "+
" prefix
or not of that gender (with the "-
" prefix). Players
who have selected pc
gender may suffer any event, as may those
whose gender is unknown. Note that as there are only 3 differentiable genders,
+mf
is identical to -n
.
Note that "C %!+f% foo
" can be abbreviated to "Cf foo
",
for better readability, ditto with m and n genders too.
So for example, the following:
Cm Lwaxana Troi flirts with %player% and makes suggestive insinuations about %him%
is equivalent to:
C %!+m% Lwaxana Troi flirts with %player% and makes suggestive insinuations about %him%
and will only be returned as an event if the player undergoing the event is male. Note: It is sometimes possible that an inappropriate event will be returned, if an appropriate one can't be found after several (20) retries.
You can clone the source:
git clone http://fatphil.org/git/idlerpg.git
You may also peruse its git log.
Some people have reported issues with cloning, so I'll occasionally update a tarball of the whole repo
here - prod me if this seems out of date.
Patches and bug-reports to the obvious e-mail address are welcome.
To the original authors, obviously, and the German guys for some ideas; to the idle beernerds who humoured me years ago and to Anna for really helping with testing; and finally to the SoylentNews crowd for encouraging me to resurrect this project with its IT-nerd theme.